diff --git a/.gitignore b/.gitignore
index acccf9f..ce17836 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,5 @@
 
 /services/self-service/src/main/resources/webapp/ts-node-*
 /web_app
-/integration-tests/examples/keys
-/integration-tests/test-output
-/integration-tests/output.log
+/integration-tests
+/integration-tests-cucumber
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 06d3258..9d45ed7 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -17,16 +17,16 @@
 * __doc__ : Have you seen a project that doesn't need to improve its documentation?!
 * __website__ : We are using GH pages to build and manage the site's content. 
 If you're interested in making it better, check-out `gh-pages` branch and dig in.
-If you are not familiar with the [Github Pages](pages.github.io) - check it out,
+If you are not familiar with the [Github Pages](https://datalab.incubator.apache.org/) - check it out,
 it's pretty simple yet powerful!
-* __giving feedback__ : Tell us how you use DLab, what was great and what was not 
+* __giving feedback__ : Tell us how you use DataLab, what was great and what was not 
 so much. Also, what are you expecting from it and what would you like to see in 
-the future? Opening [an issue](https://github.com/epam/DLab/issues) will grab our
+the future? Opening [an issue](https://github.com/apache/incubator-datalab/issues) will grab our
 attention. Seriously, this is the great way to contribute!
 
 #### Roles
 Much like projects in [ASF](https://www.apache.org/foundation/how-it-works.html#roles), 
-DLab recognizes a few roles. Unlike ASF's projects, our structure is a way simpler.
+DataLab recognizes a few roles. Unlike ASF's projects, our structure is a way simpler.
 There are only two types:
   * __A Contributor__ is a user who contributes to a project in the form of code 
   	or documentation. Developers take extra steps to participate in a project,
@@ -45,7 +45,7 @@
 
 #### RTC model
 
-DLab supports Review-Then-Commit model of development. The following rules are 
+DataLab supports Review-Then-Commit model of development. The following rules are 
 used in the RTC process:
   * a developer should seek peer-review and/or feedback from other developers
   	through the PR mechanism (aka code review).
diff --git a/DISCLAIMER b/DISCLAIMER
index 90bc650..7c123f7 100644
--- a/DISCLAIMER
+++ b/DISCLAIMER
@@ -1,4 +1,4 @@
-Apache DLab is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by The Apache Incubator.
+Apache DataLab is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by The Apache Incubator.
 Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications,
 and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status
 is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 93c6330..f2fec96 100644
--- a/LICENSE
+++ b/LICENSE
@@ -203,9 +203,9 @@
 
 
 
-Dlab Subcomponents:
+DataLab Subcomponents:
 
-Dlab project contains subcomponents with separate copyright
+DataLab project contains subcomponents with separate copyright
 notices and license terms. Your use of the source code for the these
 subcomponents is subject to the terms and conditions of the following
 licenses.
diff --git a/NOTICE b/NOTICE
index 8458c9f..26ff06d 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
-Apache DLab (incubating)
-Copyright 2018-2019 The Apache Software Foundation
+Apache DataLab (incubating)
+Copyright 2018-2021 The Apache Software Foundation
 
 This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.md b/README.md
index 0d9202b..7c24a2e 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,11 @@
-DLAB Overview
+DataLab Overview
 =============
 
 -------
 CONTENTS
 -------
 
-[What is DLAB?](#What_is_DLAB)
+[What is DataLab?](#What_is_DataLab)
 
 &nbsp; &nbsp; [How to Contribute](CONTRIBUTING.md)
 
@@ -13,13 +13,13 @@
 
 [Physical architecture](#Physical_architecture)
 
-[DLab Deployment](#DLab_Deployment)
+[DataLab Deployment](#DataLab_Deployment)
 
-&nbsp; &nbsp; &nbsp; &nbsp; [Structure of main DLab directory](#DLab_directory)
+&nbsp; &nbsp; &nbsp; &nbsp; [Structure of main DataLab directory](#DataLab_directory)
 
 &nbsp; &nbsp; &nbsp; &nbsp; [Structure of log directory](#log_directory)
 
-&nbsp; &nbsp; &nbsp; &nbsp; [Preparing environment for DLab deployment](#Env_for_DLab)
+&nbsp; &nbsp; &nbsp; &nbsp; [Preparing environment for DataLab deployment](#Env_for_DataLab)
 
 &nbsp; &nbsp; &nbsp; &nbsp; [Keycloak server](#Keycloak_server)
 
@@ -66,13 +66,13 @@
 &nbsp; &nbsp; &nbsp; &nbsp; [Azure OAuth2 Authentication](#Azure_OAuth2_Authentication)
 
 ---------------
-# What is DLAB? <a name="What_is_DLAB"></a>
+# What is DataLab? <a name="What_is_DataLab"></a>
 
-DLab is an essential toolset for analytics. It is a self-service Web Console, used to create and manage exploratory 
+DataLab is an essential toolset for analytics. It is a self-service Web Console, used to create and manage exploratory 
 environments. It allows teams to spin up analytical environments with best of breed open-source tools just with a 
 single click of the mouse. Once established, environment can be managed by an analytical team itself, leveraging simple 
 and easy-to-use Web Interface.
-<p>See more at <a href="https://dlab.apache.org/" rel="nofollow">dlab.apache.org</a>.</p>
+<p>See more at <a href="https://datalab.incubator.apache.org/" rel="nofollow">datalab.incubator.apache.org</a>.</p>
 
 ----------------------------
 # Logical architecture <a name="Logical_architecture"></a>
@@ -81,7 +81,7 @@
 
 ![Logical architecture](doc/logical_architecture.png)
 
-The diagram shows main components of DLab, which is a self-service for the infrastructure deployment and interaction 
+The diagram shows main components of DataLab, which is a self-service for the infrastructure deployment and interaction 
 with it. The purpose of each component is described below.
 
 ## Self-Service
@@ -119,19 +119,19 @@
 -----------------------------
 # Physical architecture <a name="Physical_architecture"></a>
 
-The following diagrams demonstrate high-level physical architecture of DLab in AWS, GCP and Azure.
+The following diagrams demonstrate high-level physical architecture of DataLab in AWS, GCP and Azure.
 
-Diagram of Dlab physical architecture on AWS:
+### DataLab high level Architecture on AWS: 
 
-![Physical architecture](doc/dlab_aws.png)
+![Physical architecture](doc/datalab_aws.png)
 
-Diagram of Dlab physical architecture on GCP:
+### DataLab high level Architecture on GCP:
 
-![Physical architecture](doc/dlab_gcp.png)
+![Physical architecture](doc/datalab_gcp.png)
 
-Diagram of Dlab physical architecture on Azure:
+### DataLab high level Architecture on Azure:
 
-![Physical architecture](doc/dlab_azure.png)
+![Physical architecture](doc/datalab_azure.png)
 
 ## Main components
 
@@ -144,20 +144,20 @@
 
 ## Self-service node (SSN)
 
-Creation of self-service node – is the first step for deploying DLab. SSN is a main server with following pre-installed services:
+Creation of self-service node – is the first step for deploying DataLab. SSN is a main server with following pre-installed services:
 
--   DLab Web UI – is Web user interface for managing/deploying all components of DLab. It is accessible by the 
+-   DataLab Web UI – is Web user interface for managing/deploying all components of DataLab. It is accessible by the 
     following URL: http[s]://SSN\_Public\_IP\_or\_Public\_DNS
--   MongoDB – is a database, which contains part of DLab’s configuration, user’s exploratory environments description 
+-   MongoDB – is a database, which contains part of DataLab’s configuration, user’s exploratory environments description 
     as well as user’s preferences.
--   Docker – used for building DLab Docker containers, which will be used for provisioning other components.
+-   Docker – used for building DataLab Docker containers, which will be used for provisioning other components.
 
 Elastic(Static) IP address is assigned to an SSN Node, so you are free to stop|start it and and SSN node's IP address 
 won’t change.
 
 ## Endpoint
 
-This is a node which serves as a provisioning endpoint for Dlab resources. Endpoint machine is deployed separately from Dlab
+This is a node which serves as a provisioning endpoint for DataLab resources. Endpoint machine is deployed separately from DataLab
 installation and can be even deployed on a different cloud.
 
 ## Edge node
@@ -169,7 +169,7 @@
 
 The next step is setting up a Notebook node (or a Notebook server). It is a server with pre-installed applications and 
 libraries for data processing, data cleaning and transformations, numerical simulations, statistical modeling, machine 
-learning, etc. Following analytical tools are currently supported in DLab and can be installed on a Notebook node:
+learning, etc. Following analytical tools are currently supported in DataLab and can be installed on a Notebook node:
 
 -   Jupyter
 -   Jupyterlab
@@ -193,14 +193,14 @@
 of data. Adding cluster is not mandatory and is only needed in case additional computational resources are required for 
 job execution.
 ----------------------
-# DLab Deployment <a name="DLab_Deployment"></a>
+# DataLab Deployment <a name="DataLab_Deployment"></a>
 
-### Structure of main DLab directory <a name="DLab_directory"></a>
+### Structure of main DataLab directory <a name="DataLab_directory"></a>
 
-DLab’s SSN node main directory structure is as follows:
+DataLab’s SSN node main directory structure is as follows:
 
     /opt  
-     └───dlab  
+     └───datalab  
          ├───conf  
          ├───sources  
          ├───template  
@@ -208,12 +208,12 @@
          │   └───result  
          └───webapp  
 
--   conf – contains configuration for DLab Web UI and back-end services;
+-   conf – contains configuration for DataLab Web UI and back-end services;
 -   sources – contains all Docker/Python scripts, templates and files for provisioning;
 -   template – docker’s templates;
--   tmp –temporary directory of DLab;
+-   tmp –temporary directory of DataLab;
 -   tmp/result – temporary directory for Docker’s response files;
--   webapp – contains all .jar files for DLab Web UI and back-end
+-   webapp – contains all .jar files for DataLab Web UI and back-end
     services.
 
 ### Structure of log directory <a name="log_directory"></a>
@@ -222,7 +222,7 @@
 
     /var
      └───opt
-         └───dlab
+         └───datalab
              └───log
                  ├───dataengine
                  ├───dateengine-service
@@ -231,7 +231,7 @@
                  ├───project
                  └───ssn
 
-These directories contain the log files for each template and for DLab back-end services.
+These directories contain the log files for each template and for DataLab back-end services.
 -   ssn – contains logs of back-end services;
 -   provisioning.log – Provisioning Service log file;
 -   security.log – Security Service log file;
@@ -241,8 +241,8 @@
 ## Keycloak server <a name="Keycloak_server"></a>
 
 **Keycloak** is used to manage user authentication instead of the aplication. To use existing server following 
-  parameters must be specified either when running *Dlab* deployment script or in 
-*/opt/dlab/conf/self-service.yml* and */opt/dlab/conf/provisioning.yml* files on SSN node.
+  parameters must be specified either when running *DataLab* deployment script or in 
+*/opt/datalab/conf/self-service.yml* and */opt/datalab/conf/provisioning.yml* files on SSN node.
 
 | Parameter                | Description/Value             |
 |--------------------------|-------------------------------|
@@ -253,7 +253,7 @@
 | keycloak_user            |Keycloak user                  |
 | keycloak_user_password   |Keycloak user password         |
 
-### Preparing environment for Keycloak deployment <a name="Env_for_DLab"></a>
+### Preparing environment for Keycloak deployment <a name="Env_for_DataLab"></a>
 Keycloak can be deployed with Nginx proxy on instance using *deploy_keycloak.py* script. Currently it only works with HTTP.
 
 Preparation steps for deployment:
@@ -263,7 +263,7 @@
     - Boot disk OS Image - Ubuntu 18.04
 - Put private key that is used to connect to instance where Keycloak will be deployed somewhere on the instance where 
   deployment script will be executed.
-- Install Git and clone DLab repository</details>
+- Install Git and clone DataLab repository</details>
 ### Executing deployment script
 To build Keycloak node, following steps should be executed:
 - Connect to the instance via SSH and run the following commands:
@@ -273,7 +273,7 @@
 apt-get install -y python-pip
 pip install fabric==1.14.0
 ```
-- Go to *dlab* directory
+- Go to *datalab* directory
 - Run *infrastructure-provisioning/scripts/deploy_keycloak/deploy_keycloak.py* deployment script:
 
 ```
@@ -294,9 +294,9 @@
 
 ## Self-Service Node <a name="Self_Service_Node"></a>
 
-### Preparing environment for DLab deployment <a name="Env_for_DLab"></a>
+### Preparing environment for DataLab deployment <a name="Env_for_DataLab"></a>
 
-Deployment of DLab starts from creating Self-Service(SSN) node. DLab can be deployed in AWS, Azure and Google cloud.
+Deployment of DataLab starts from creating Self-Service(SSN) node. DataLab can be deployed in AWS, Azure and Google cloud.
 
 For each cloud provider, prerequisites are different.
 
@@ -304,32 +304,32 @@
 
 Prerequisites:
 
-DLab can be deployed using the following two methods:
- - IAM user: DLab deployment script is executed on local machine and uses IAM user permissions to create resources in AWS.
- - EC2 instance: DLab deployment script is executed on EC2 instance prepared in advance and with attached IAM role. 
+DataLab can be deployed using the following two methods:
+ - IAM user: DataLab deployment script is executed on local machine and uses IAM user permissions to create resources in AWS.
+ - EC2 instance: DataLab deployment script is executed on EC2 instance prepared in advance and with attached IAM role. 
    Deployment script uses the attached IAM role to create resources in AWS.
 
 **'IAM user' method prerequisites:**  
  
  - IAM user with created AWS access key ID and secret access key. These keys are provided as arguments for the 
    deployment script and are used to create resources in AWS.
- - Amazon EC2 Key Pair. This key is system and is used for configuring DLab instances.
- - The following IAM [policy](#AWS_SSN_policy) should be attached to the IAM user in order to deploy DLab.
+ - Amazon EC2 Key Pair. This key is system and is used for configuring DataLab instances.
+ - The following IAM [policy](#AWS_SSN_policy) should be attached to the IAM user in order to deploy DataLab.
  
  **'EC2 instance' method prerequisites:**
  
- - Amazon EC2 Key Pair. This key is system and is used for configuring DLab instances.
- - EC2 instance where DLab deployment script is executed. 
+ - Amazon EC2 Key Pair. This key is system and is used for configuring DataLab instances.
+ - EC2 instance where DataLab deployment script is executed. 
  - IAM role with the following IAM [policy](#AWS_SSN_policy) should be attached to the EC2 instance. 
  
  **Optional prerequisites for both methods:**
   
-  - VPC ID. If VPC where DLab should be deployed is already in place, then "VPC ID" should be provided for deployment 
-    script. DLab instances are deployed in this VPC.
-  - Subnet ID. If Subnet where DLab should be deployed is already in place, then "Subnet ID" should be provided for 
-    deployment script. DLab SSN node and users' Edge nodes are deployed in this Subnet. 
+  - VPC ID. If VPC where DataLab should be deployed is already in place, then "VPC ID" should be provided for deployment 
+    script. DataLab instances are deployed in this VPC.
+  - Subnet ID. If Subnet where DataLab should be deployed is already in place, then "Subnet ID" should be provided for 
+    deployment script. DataLab SSN node and users' Edge nodes are deployed in this Subnet. 
  
- DLab IAM Policy
+ DataLab IAM Policy
  <a name="AWS_SSN_policy"></a>
 ```
 {
@@ -416,7 +416,7 @@
                 "s3:DeleteObject",
                 "s3:GetObject",
                 "s3:ListBucket",
-                "s3:PutEncryptionConfiguration"
+                "s3:PutEncryptionConfiguration",
                 "s3:ListAllMyBuckets",
                 "s3:CreateBucket",
                 "s3:PutBucketTagging",
@@ -433,11 +433,11 @@
 
 - Create an EC2 instance with the following settings:
     - The instance should have access to Internet in order to install required prerequisites
-    - The instance should have access to further DLab installation
+    - The instance should have access to further DataLab installation
     - AMI - Ubuntu 16.04
     - IAM role with [policy](#AWS_SSN_policy) should be assigned to the instance
 - Put SSH key file created through Amazon Console on the instance with the same name
-- Install Git and clone DLab repository</details>
+- Install Git and clone DataLab repository</details>
 
 <details><summary>In Azure cloud <i>(click to expand)</i></summary>
 
@@ -450,7 +450,8 @@
 
 - Windows Azure Active Directory
 - Microsoft Graph
-- Windows Azure Service Management API</details>
+- Windows Azure Service Management API
+- Storage Blob Data Contributor Role</details>
 
 
 **Preparation steps for deployment:**
@@ -477,7 +478,7 @@
     - Boot disk OS Image - Ubuntu 16.04
 - Generate SSH key pair and rename private key with .pem extension
 - Put JSON auth file created through Google cloud console to users home directory
-- Install Git and clone DLab repository</details>
+- Install Git and clone DataLab repository</details>
 
 ### Executing deployment script
 
@@ -489,7 +490,7 @@
 sudo su
 apt-get update
 apt-get install git
-git clone https://github.com/apache/incubator-dlab.git
+git clone https://github.com/apache/incubator-datalab.git -b develop
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
 add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
 apt-get update
@@ -498,18 +499,18 @@
 usermod -a -G docker *username*
 apt-get install -y python-pip
 pip install fabric==1.14.0
-cd incubator-dlab
+cd incubator-datalab
 ```
-- Go to *dlab* directory
-- Run *infrastructure-provisioning/scripts/deploy_dlab.py* deployment script:
+- Go to *datalab* directory
+- Run *infrastructure-provisioning/scripts/deploy_datalab.py* deployment script:
 
-This python script will build front-end and back-end part of DLab, create SSN docker image and run Docker container 
+This python script will build front-end and back-end part of DataLab, create SSN docker image and run Docker container 
 for creating SSN node.
 
 <details><summary>In Amazon cloud <i>(click to expand)</i></summary>
 
 ```
-/usr/bin/python infrastructure-provisioning/scripts/deploy_dlab.py --conf_service_base_name dlab-test --aws_access_key XXXXXXX --aws_secret_access_key XXXXXXXXXX --aws_region xx-xxxxx-x --conf_os_family debian --conf_cloud_provider aws --aws_vpc_id vpc-xxxxx --aws_subnet_id subnet-xxxxx --aws_security_groups_ids sg-xxxxx,sg-xxxx --key_path /path/to/key/ --conf_key_name key_name --conf_tag_resource_id dlab --aws_account_id xxxxxxxx --aws_billing_bucket billing_bucket --aws_report_path /billing/directory/ --action create
+/usr/bin/python infrastructure-provisioning/scripts/deploy_datalab.py --conf_service_base_name datalab-test --aws_access_key XXXXXXX --aws_secret_access_key XXXXXXXXXX --aws_region xx-xxxxx-x --conf_os_family debian --conf_cloud_provider aws --aws_vpc_id vpc-xxxxx --aws_subnet_id subnet-xxxxx --aws_security_groups_ids sg-xxxxx,sg-xxxx --key_path /path/to/key/ --conf_key_name key_name --conf_tag_resource_id datalab --aws_account_id xxxxxxxx --aws_billing_bucket billing_bucket --aws_report_path /billing/directory/ --action create
 ```
 
 List of parameters for SSN node deployment:
@@ -520,9 +521,9 @@
 | aws\_access\_key          | AWS user access key                                                                     |
 | aws\_secret\_access\_key  | AWS user secret access key                                                              |
 | aws\_region               | AWS region                                                                              |
-| conf\_os\_family          | Name of the Linux distributive family, which is supported by DLab (Debian/RedHat)       |
-| conf\_cloud\_provider     | Name of the cloud provider, which is supported by DLab (AWS)
-| conf\_duo\_vpc\_enable    | "true" - for installing DLab into two Virtual Private Clouds (VPCs) or "false" - for installing DLab into one VPC. Also this parameter isn't required when deploy DLab in one VPC|
+| conf\_os\_family          | Name of the Linux distributive family, which is supported by DataLab (Debian/RedHat)       |
+| conf\_cloud\_provider     | Name of the cloud provider, which is supported by DataLab (AWS)
+| conf\_duo\_vpc\_enable    | "true" - for installing DataLab into two Virtual Private Clouds (VPCs) or "false" - for installing DataLab into one VPC. Also this parameter isn't required when deploy DataLab in one VPC|
 | aws\_vpc\_id              | ID of the VPC (optional)                                                    |
 | aws\_subnet\_id           | ID of the public subnet (optional)                                                                  |
 | aws\_security\_groups\_ids| One or more ID\`s of AWS Security Groups, which will be assigned to SSN node (optional)             |
@@ -533,7 +534,7 @@
 | aws\_billing\_bucket      | The name of S3 bucket where billing reports will be placed                              |
 | aws\_report\_path         | The path to billing reports directory in S3 bucket. This parameter isn't required when billing reports are placed in the root of S3 bucket. |
 | action                    | In case of SSN node creation, this parameter should be set to “create”|
-| workspace\_path           | Path to DLab sources root
+| workspace\_path           | Path to DataLab sources root
 | conf\_image\_enabled      | Enable or Disable creating image at first time |
 
 **Note:** If the following parameters are not specified, they will be created automatically:
@@ -554,12 +555,12 @@
 -   Security Group for SSN node (if it was specified, script will attach the provided one)
 -   VPC, Subnet (if they have not been specified) for SSN and EDGE nodes
    S3 bucket – its name will be \<service\_base\_name\>-ssn-bucket. This bucket will contain necessary dependencies and configuration files for Notebook nodes (such as .jar files, YARN configuration, etc.)
--   S3 bucket for for collaboration between Dlab users. Its name will be \<service\_base\_name\>-\<endpoint\_name\>-shared-bucket</details>
+-   S3 bucket for for collaboration between DataLab users. Its name will be \<service\_base\_name\>-\<endpoint\_name\>-shared-bucket</details>
 
 <details><summary>In Azure cloud <i>(click to expand)</i></summary>
 
 ```
-/usr/bin/python infrastructure-provisioning/scripts/deploy_dlab.py --conf_service_base_name dlab_test --azure_region westus2 --conf_os_family debian --conf_cloud_provider azure --azure_vpc_name vpc-test --azure_subnet_name subnet-test --azure_security_group_name sg-test1,sg-test2 --key_path /root/ --conf_key_name Test --azure_auth_path /dir/file.json  --action create
+/usr/bin/python infrastructure-provisioning/scripts/deploy_datalab.py --conf_service_base_name datalab_test --azure_region westus2 --conf_os_family debian --conf_cloud_provider azure --azure_vpc_name vpc-test --azure_subnet_name subnet-test --azure_security_group_name sg-test1,sg-test2 --key_path /root/ --conf_key_name Test --azure_auth_path /dir/file.json  --action create
 ```
 
 List of parameters for SSN node deployment:
@@ -569,8 +570,8 @@
 | conf\_service\_base\_name         | Any infrastructure value (should be unique if multiple SSN’s have been deployed before) |
 | azure\_resource\_group\_name      | Resource group name (can be the same as service base name                             |
 | azure\_region                     | Azure region                                                                            |
-| conf\_os\_family                  | Name of the Linux distributive family, which is supported by DLab (Debian/RedHat)       |
-| conf\_cloud\_provider             | Name of the cloud provider, which is supported by DLab (Azure)                          |
+| conf\_os\_family                  | Name of the Linux distributive family, which is supported by DataLab (Debian/RedHat)       |
+| conf\_cloud\_provider             | Name of the cloud provider, which is supported by DataLab (Azure)                          |
 | azure\_vpc\_name                  | Name of the Virtual Network (VN) (optional)                                                         |
 | azure\_subnet\_name               | Name of the Azure subnet (optional)                                                                 |
 | azure\_security\_groups\_name     | One or more Name\`s of Azure Security Groups, which will be assigned to SSN node (optional)         |
@@ -584,8 +585,8 @@
 | azure\_region\_info               | Region info that is used for billing information(e.g. US)                               |
 | azure\_datalake\_enable           | Support of Azure Data Lake (true/false)                                                 |
 | azure\_oauth2\_enabled            | Defines if Azure OAuth2 authentication mechanisms is enabled(true/false)                |
-| azure\_validate\_permission\_scope| Defines if DLab verifies user's permission to the configured resource(scope) during login with OAuth2 (true/false). If Data Lake is enabled default scope is Data Lake Store Account, else Resource Group, where DLab is deployed, is default scope. If user does not have any role in scope he/she is forbidden to log in
-| azure\_application\_id            | Azure application ID that is used to log in users in DLab                                                     |
+| azure\_validate\_permission\_scope| Defines if DataLab verifies user's permission to the configured resource(scope) during login with OAuth2 (true/false). If Data Lake is enabled default scope is Data Lake Store Account, else Resource Group, where DataLab is deployed, is default scope. If user does not have any role in scope he/she is forbidden to log in
+| azure\_application\_id            | Azure application ID that is used to log in users in DataLab                                                     |
 | azure\_ad\_group\_id              | ID of group in Active directory whose members have full access to shared folder in Azure Data Lake Store                                                                          |
 | action                            | In case of SSN node creation, this parameter should be set to “create”                  |
 | conf\_image\_enabled      | Enable or Disable creating image at first time |
@@ -604,7 +605,7 @@
 ![Azure offer number](doc/azure_offer_number.png)
 
 Please see [RateCard API](https://msdn.microsoft.com/en-us/library/mt219004.aspx) to get more details about 
-azure\_offer\_number, azure\_currency, azure\_locale, azure\_region_info. These DLab deploy properties correspond to 
+azure\_offer\_number, azure\_currency, azure\_locale, azure\_region_info. These DataLab deploy properties correspond to 
 RateCard API request parameters.
 
 To have working billing functionality please review Billing configuration note and use proper parameters for SSN node 
@@ -627,26 +628,26 @@
 - Get *Application ID* from application properties  it will be used as azure_application_id for deploy_dlap.py script
 2. Usage of Data Lake resource predicts shared folder where all users can write or read any data. To manage access to 
    this folder please create ot use existing group in Active Directory. All users from this group will have RW access to 
-   the shared folder. Put ID(in Active Directory) of the group as *azure_ad_group_id* parameter to deploy_dlab.py script
-3. After execution of deploy_dlab.py script go to the application created in step 1 and change *Redirect URIs* value to 
+   the shared folder. Put ID(in Active Directory) of the group as *azure_ad_group_id* parameter to deploy_datalab.py script
+3. After execution of deploy_datalab.py script go to the application created in step 1 and change *Redirect URIs* value to 
    the https://SSN_HOSTNAME/ where SSN_HOSTNAME - SSN node hostname
 
 After SSN node deployment following Azure resources will be created:
 
--   Resource group where all DLAb resources will be provisioned
+-   Resource group where all DataLab resources will be provisioned
 -   SSN Virtual machine
 -   Static public IP address dor SSN virtual machine
 -   Network interface for SSN node
 -   Security Group for SSN node (if it was specified, script will attach the provided one)
 -   Virtual network and Subnet (if they have not been specified) for SSN and EDGE nodes
 -   Storage account and blob container for necessary further dependencies and configuration files for Notebook nodes (such as .jar files, YARN configuration, etc.)
--   Storage account and blob container for collaboration between Dlab users
+-   Storage account and blob container for collaboration between DataLab users
 -   If support of Data Lake is enabled: Data Lake and shared directory will be created</details>
 
 <details><summary>In Google cloud (GCP) <i>(click to expand)</i></summary>
 
 ```
-/usr/bin/python infrastructure-provisioning/scripts/deploy_dlab.py --conf_service_base_name dlab-test --gcp_region xx-xxxxx --gcp_zone xxx-xxxxx-x --conf_os_family debian --conf_cloud_provider gcp --key_path /path/to/key/ --conf_key_name key_name --gcp_ssn_instance_size n1-standard-1 --gcp_project_id project_id --gcp_service_account_path /path/to/auth/file.json --action create
+/usr/bin/python infrastructure-provisioning/scripts/deploy_datalab.py --conf_service_base_name datalab-test --gcp_region xx-xxxxx --gcp_zone xxx-xxxxx-x --conf_os_family debian --conf_cloud_provider gcp --key_path /path/to/key/ --conf_key_name key_name --gcp_ssn_instance_size n1-standard-1 --gcp_project_id project_id --gcp_service_account_path /path/to/auth/file.json --action create
 ```
 
 List of parameters for SSN node deployment:
@@ -656,8 +657,8 @@
 | conf\_service\_base\_name    | Any infrastructure value (should be unique if multiple SSN’s have been deployed before)|
 | gcp\_region                  | GCP region                                                                            |
 | gcp\_zone                    | GCP zone                                                                              |
-| conf\_os\_family             | Name of the Linux distributive family, which is supported by DLab (Debian/RedHat)     |
-| conf\_cloud\_provider        | Name of the cloud provider, which is supported by DLab (GCP)                          |
+| conf\_os\_family             | Name of the Linux distributive family, which is supported by DataLab (Debian/RedHat)     |
+| conf\_cloud\_provider        | Name of the cloud provider, which is supported by DataLab (GCP)                          |
 | gcp\_vpc\_name               | Name of the Virtual Network (VN) (optional)                                           |
 | gcp\_subnet\_name            | Name of the GCP subnet (optional)                                                     |
 | gcp\_firewall\_name          | One or more Name\`s of GCP Security Groups, which will be assigned to SSN node (optional)|
@@ -680,19 +681,19 @@
 -   IAM role and Service account for SSN
 -   Security Groups for SSN node (if it was specified, script will attach the provided one)
 -   VPC, Subnet (if they have not been specified) for SSN and EDGE nodes
--   Bucket for for collaboration between Dlab users. Its name will be 
+-   Bucket for for collaboration between DataLab users. Its name will be 
     \<service\_base\_name\>-\<endpoint\_name\>-shared-bucket</details>
 
 ### Terminating Self-Service Node
 
 Terminating SSN node will also remove all nodes and components related to it. Basically, terminating Self-service node 
-will terminate all DLab’s infrastructure.
-Example of command for terminating DLab environment:
+will terminate all DataLab’s infrastructure.
+Example of command for terminating DataLab environment:
 
 <details><summary>In Amazon <i>(click to expand)</i></summary>
 
 ```
-/usr/bin/python infrastructure-provisioning/scripts/deploy_dlab.py --conf_service_base_name dlab-test --aws_access_key XXXXXXX --aws_secret_access_key XXXXXXXX --aws_region xx-xxxxx-x --key_path /path/to/key/ --conf_key_name key_name --conf_os_family debian --conf_cloud_provider aws --action terminate
+/usr/bin/python infrastructure-provisioning/scripts/deploy_datalab.py --conf_service_base_name datalab-test --aws_access_key XXXXXXX --aws_secret_access_key XXXXXXXX --aws_region xx-xxxxx-x --key_path /path/to/key/ --conf_key_name key_name --conf_os_family debian --conf_cloud_provider aws --action terminate
 ```
 List of parameters for SSN node termination:
 
@@ -704,15 +705,15 @@
 | aws\_region                | AWS region                                                                         |
 | key\_path                  | Path to admin key (without key name)                                               |
 | conf\_key\_name            | Name of the uploaded SSH key file (without “.pem” extension)                       |
-| conf\_os\_family           | Name of the Linux distributive family, which is supported by DLab (Debian/RedHat)  |
-| conf\_cloud\_provider      | Name of the cloud provider, which is supported by DLab (AWS)                       |
+| conf\_os\_family           | Name of the Linux distributive family, which is supported by DataLab (Debian/RedHat)  |
+| conf\_cloud\_provider      | Name of the cloud provider, which is supported by DataLab (AWS)                       |
 | action                     | terminate                                                                          |
 </details>
 
 <details><summary>In Azure <i>(click to expand)</i></summary>
 
 ```
-/usr/bin/python infrastructure-provisioning/scripts/deploy_dlab.py --conf_service_base_name dlab-test --azure_vpc_name vpc-test --azure_resource_group_name resource-group-test --azure_region westus2 --key_path /root/ --conf_key_name Test --conf_os_family debian --conf_cloud_provider azure --azure_auth_path /dir/file.json --action terminate
+/usr/bin/python infrastructure-provisioning/scripts/deploy_datalab.py --conf_service_base_name datalab-test --azure_vpc_name vpc-test --azure_resource_group_name resource-group-test --azure_region westus2 --key_path /root/ --conf_key_name Test --conf_os_family debian --conf_cloud_provider azure --azure_auth_path /dir/file.json --action terminate
 ```
 List of parameters for SSN node termination:
 
@@ -720,8 +721,8 @@
 |----------------------------|------------------------------------------------------------------------------------|
 | conf\_service\_base\_name  | Unique infrastructure value                                                        |
 | azure\_region              | Azure region                                                                       |
-| conf\_os\_family           | Name of the Linux distributive family, which is supported by DLab (Debian/RedHat)  |
-| conf\_cloud\_provider      | Name of the cloud provider, which is supported by DLab (Azure)                     |
+| conf\_os\_family           | Name of the Linux distributive family, which is supported by DataLab (Debian/RedHat)  |
+| conf\_cloud\_provider      | Name of the cloud provider, which is supported by DataLab (Azure)                     |
 | azure\_vpc\_name           | Name of the Virtual Network (VN)                                                   |
 | key\_path                  | Path to admin key (without key name)                                               |
 | conf\_key\_name            | Name of the uploaded SSH key file (without “.pem” extension)                       |
@@ -732,7 +733,7 @@
 <details><summary>In Google cloud <i>(click to expand)</i></summary>
 
 ```
-/usr/bin/python infrastructure-provisioning/scripts/deploy_dlab.py --gcp_project_id project_id --conf_service_base_name dlab-test --gcp_region xx-xxxxx --gcp_zone xx-xxxxx-x --key_path /path/to/key/ --conf_key_name key_name --conf_os_family debian --conf_cloud_provider gcp --gcp_service_account_path /path/to/auth/file.json --action terminate
+/usr/bin/python infrastructure-provisioning/scripts/deploy_datalab.py --gcp_project_id project_id --conf_service_base_name datalab-test --gcp_region xx-xxxxx --gcp_zone xx-xxxxx-x --key_path /path/to/key/ --conf_key_name key_name --conf_os_family debian --conf_cloud_provider gcp --gcp_service_account_path /path/to/auth/file.json --action terminate
 ```
 List of parameters for SSN node termination:
 
@@ -741,8 +742,8 @@
 | conf\_service\_base\_name    | Any infrastructure value (should be unique if multiple SSN’s have been deployed before)|
 | gcp\_region                  | GCP region                                                                            |
 | gcp\_zone                    | GCP zone                                                                              |
-| conf\_os\_family             | Name of the Linux distributive family, which is supported by DLab (Debian/RedHat)     |
-| conf\_cloud\_provider        | Name of the cloud provider, which is supported by DLab (GCP)                          |
+| conf\_os\_family             | Name of the Linux distributive family, which is supported by DataLab (Debian/RedHat)     |
+| conf\_cloud\_provider        | Name of the cloud provider, which is supported by DataLab (GCP)                          |
 | gcp\_vpc\_name               | Name of the Virtual Network (VN) (optional)                                           |
 | gcp\_subnet\_name            | Name of the GCP subnet (optional)                                                     |
 | key\_path                    | Path to admin key (without key name)                                                  |
@@ -759,13 +760,13 @@
 
 Gateway node (or an Edge node) is an instance(virtual machine) provisioned in a public subnet. It serves as an entry 
 point for accessing user’s personal analytical environment. It is created by an end-user, whose public key will be 
-uploaded there. Only via Edge node, DLab user can access such application resources as notebook servers and dataengine 
+uploaded there. Only via Edge node, DataLab user can access such application resources as notebook servers and dataengine 
 clusters. Also, Edge Node is used to setup SOCKS proxy to access notebook servers via Web UI and SSH. Elastic(Static) 
 IP address is assigned to an Edge Node. 
 
 ### Create
 
-In order to create Edge node using DLab Web UI – login and, click on the button “Upload” (Depending on authorization 
+In order to create Edge node using DataLab Web UI – login and, click on the button “Upload” (Depending on authorization 
 provider that was chosen on deployment stage, user may be taken from [LDAP](#LDAP_Authentication) or from 
 [Azure AD (Oauth2)](#Azure_OAuth2_Authentication)). Choose user’s SSH public key and after that click on the button 
 “Create”. Edge node will be deployed and corresponding instance (virtual machine) will be started.
@@ -789,7 +790,7 @@
 | Parameter                  | Description/Value                                                                     |
 |--------------------------------|-----------------------------------------------------------------------------------|
 | conf\_resource                 | edge                                                                              |
-| conf\_os\_family               | Name of the Linux distributive family, which is supported by DLAB (debian/redhat) |
+| conf\_os\_family               | Name of the Linux distributive family, which is supported by DataLab (debian/redhat) |
 | conf\_service\_base\_name      | Unique infrastructure value, specified during SSN deployment                      |
 | conf\_key\_name                | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name               | Name of the user                                                                  |
@@ -821,11 +822,11 @@
 | Parameter                  | Description/Value                                                                     |
 |--------------------------------|-----------------------------------------------------------------------------------|
 | conf\_resource                 | edge                                                                              |
-| conf\_os\_family               | Name of the Linux distributive family, which is supported by DLAB (debian/redhat) |
+| conf\_os\_family               | Name of the Linux distributive family, which is supported by DataLab (debian/redhat) |
 | conf\_service\_base\_name      | Unique infrastructure value, specified during SSN deployment                      |
 | conf\_key\_name                | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name               | Name of the user                                                                  |
-| azure\_resource\_group\_name   | Name of the resource group where all DLAb resources are being provisioned         |
+| azure\_resource\_group\_name   | Name of the resource group where all DataLab resources are being provisioned         |
 | azure\_region                  | Azure region where infrastructure was deployed                                    |
 | azure\_vpc\_name               | Name of Azure Virtual network where all infrastructure is being deployed          |
 | azure\_subnet\_name            | Name of the Azure public subnet where Edge will be deployed                       |
@@ -850,7 +851,7 @@
 | Parameter                  | Description/Value                                                                     |
 |--------------------------------|-----------------------------------------------------------------------------------|
 | conf\_resource                 | edge                                                                              |
-| conf\_os\_family               | Name of the Linux distributive family, which is supported by DLAB (debian/redhat) |
+| conf\_os\_family               | Name of the Linux distributive family, which is supported by DataLab (debian/redhat) |
 | conf\_service\_base\_name      | Unique infrastructure value, specified during SSN deployment                      |
 | conf\_key\_name                | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name               | Name of the user                                                                  |
@@ -889,7 +890,7 @@
 | conf\_resource               | edge                                                                      |
 | conf\_service\_base\_name    | Unique infrastructure value, specified during SSN deployment              |
 | edge\_user\_name             | Name of the user                                                          |
-| azure\_resource\_group\_name | Name of the resource group where all DLAb resources are being provisioned |
+| azure\_resource\_group\_name | Name of the resource group where all DataLab resources are being provisioned |
 | azure\_region                | Azure region where infrastructure was deployed                            |
 | action                       | start                                                                     |
 
@@ -900,7 +901,7 @@
 | conf\_resource               | edge                                                                      |
 | conf\_service\_base\_name    | Unique infrastructure value, specified during SSN deployment              |
 | edge\_user\_name             | Name of the user                                                          |
-| azure\_resource\_group\_name | Name of the resource group where all DLAb resources are being provisioned |
+| azure\_resource\_group\_name | Name of the resource group where all DataLab resources are being provisioned |
 | action                       | stop                                                                      |
 </details>
 
@@ -940,7 +941,7 @@
 | Parameter                     | Description/Value                                                                 |
 |-------------------------------|-----------------------------------------------------------------------------------|
 | conf\_resource                | notebook                                                                          |
-| conf\_os\_family              | Name of the Linux distributive family, which is supported by DLAB (debian/redhat) |
+| conf\_os\_family              | Name of the Linux distributive family, which is supported by DataLab (debian/redhat) |
 | conf\_service\_base\_name     | Unique infrastructure value, specified during SSN deployment                      |
 | conf\_key\_name               | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name              | Value that previously was used when Edge being provisioned                        |
@@ -960,14 +961,14 @@
 | Parameter                       | Description/Value                                                                 |
 |---------------------------------|-----------------------------------------------------------------------------------|
 | conf\_resource                  | notebook                                                                          |
-| conf\_os\_family                | Name of the Linux distributive family, which is supported by DLAB (debian/redhat) |
+| conf\_os\_family                | Name of the Linux distributive family, which is supported by DataLab (debian/redhat) |
 | conf\_service\_base\_name       | Unique infrastructure value, specified during SSN deployment                      |
 | conf\_key\_name                 | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name                | Value that previously was used when Edge being provisioned                        |
 | azure\_notebook\_instance\_size | Value of the Notebook virtual machine shape                                       |
 | azure\_region                   | Azure region where infrastructure was deployed                                    |
 | azure\_vpc\_name                | NAme of Azure Virtual network where all infrastructure is being deployed          |
-| azure\_resource\_group\_name    | Name of the resource group where all DLAb resources are being provisioned         |
+| azure\_resource\_group\_name    | Name of the resource group where all DataLab resources are being provisioned         |
 | application                     | Type of the notebook template (jupyter/rstudio/zeppelin/tensor/deeplearning)      |
 | git\_creds                      | User git credentials in JSON format                                               |
 | action                          | Create                                                                            |
@@ -978,7 +979,7 @@
 | Parameter                     | Description/Value                                                                 |
 |-------------------------------|-----------------------------------------------------------------------------------|
 | conf\_resource                | notebook                                                                          |
-| conf\_os\_family              | Name of the Linux distributive family, which is supported by DLAB (debian/redhat) |
+| conf\_os\_family              | Name of the Linux distributive family, which is supported by DataLab (debian/redhat) |
 | conf\_service\_base\_name     | Unique infrastructure value, specified during SSN deployment                      |
 | conf\_key\_name               | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name              | Value that previously was used when Edge being provisioned                        |
@@ -1021,7 +1022,7 @@
 | conf\_key\_name                 | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name                | Value that previously was used when Edge being provisioned                        |
 | notebook\_instance\_name        | Name of the Notebook instance to terminate                                        |
-| azure\_resource\_group\_name    | Name of the resource group where all DLAb resources are being provisioned         |
+| azure\_resource\_group\_name    | Name of the resource group where all DataLab resources are being provisioned         |
 | action                          | Stop                                                                              |
 </details>
 
@@ -1072,7 +1073,7 @@
 | conf\_key\_name                 | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name                | Value that previously was used when Edge being provisioned                        |
 | notebook\_instance\_name        | Name of the Notebook instance to terminate                                        |
-| azure\_resource\_group\_name    | Name of the resource group where all DLAb resources are being provisioned         |
+| azure\_resource\_group\_name    | Name of the resource group where all DataLab resources are being provisioned         |
 | azure\_region                   | Azure region where infrastructure was deployed                                    |
 | git\_creds                      | User git credentials in JSON format                                               |
 | action                          | start                                                                             |
@@ -1124,7 +1125,7 @@
 | conf\_service\_base\_name       | Unique infrastructure value, specified during SSN deployment                      |
 | edge\_user\_name                | Value that previously was used when Edge being provisioned                        |
 | notebook\_instance\_name        | Name of the Notebook instance to terminate                                        |
-| azure\_resource\_group\_name    | Name of the resource group where all DLAb resources are being provisioned         |
+| azure\_resource\_group\_name    | Name of the resource group where all DataLab resources are being provisioned         |
 | action                          | terminate                                                                         |
 </details>
 
@@ -1170,7 +1171,6 @@
 ```
 {
   "os_pkg": {"htop": "2.0.1-1ubuntu1", "python-mysqldb": "1.3.7-1build2"},
-  "pip2": {"requests": "N/A", "configparser": "N/A"},
   "pip3": {"configparser": "N/A"},
   "r_pkg": {"rmarkdown": "1.5"},
   "others": {"Keras": "N/A"}
@@ -1189,7 +1189,7 @@
 | notebook\_instance\_name      | Name of the Notebook instance to terminate                                           |
 | aws\_region                   | AWS region where infrastructure was deployed                                         |
 | application                   | Type of the notebook template (jupyter/rstudio/zeppelin/tensor/deeplearning)         |
-| libs                          | List of additional libraries in JSON format with type (os_pkg/pip2/pip3/r_pkg/others)|
+| libs                          | List of additional libraries in JSON format with type (os_pkg/pip3/r_pkg/others)|
 | action                        | lib_install                                                                          |
 
 **Example** of additional_libs parameter:
@@ -1200,7 +1200,6 @@
   "libs": [
     {"group": "os_pkg", "name": "nmap"},
     {"group": "os_pkg", "name": "htop"},
-    {"group": "pip2", "name": "requests"},
     {"group": "pip3", "name": "configparser"},
     {"group": "r_pkg", "name": "rmarkdown"},
     {"group": "others", "name": "Keras"}
@@ -1221,7 +1220,7 @@
 | conf\_key\_name               | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name              | Value that previously was used when Edge being provisioned                        |
 | notebook\_instance\_name      | Name of the Notebook instance to terminate                                        |
-| azure\_resource\_group\_name  | Name of the resource group where all DLAb resources are being provisioned         |
+| azure\_resource\_group\_name  | Name of the resource group where all DataLab resources are being provisioned         |
 | application                   | Type of the notebook template (jupyter/rstudio/zeppelin/tensor/deeplearning)      |
 | action                        | lib_list                                                                          |
 
@@ -1234,9 +1233,9 @@
 | conf\_key\_name               | Name of the uploaded SSH key file (without ".pem")                                   |
 | edge\_user\_name              | Value that previously was used when Edge being provisioned                           |
 | notebook\_instance\_name      | Name of the Notebook instance to terminate                                           |
-| azure\_resource\_group\_name  | Name of the resource group where all DLAb resources are being provisioned            |
+| azure\_resource\_group\_name  | Name of the resource group where all DataLab resources are being provisioned            |
 | application                   | Type of the notebook template (jupyter/rstudio/zeppelin/tensor/deeplearning)         |
-| libs                          | List of additional libraries in JSON format with type (os_pkg/pip2/pip3/r_pkg/others)|
+| libs                          | List of additional libraries in JSON format with type (os_pkg/pip3/r_pkg/others)|
 | action                        | lib_install                                                                          |
 </details>
 
@@ -1268,7 +1267,7 @@
 | gcp\_project\_id              | ID of GCP project                                                                    |
 | gcp\_zone                     | GCP zone name                                                                        |
 | application                   | Type of the notebook template (jupyter/rstudio/zeppelin/tensor/deeplearning)         |
-| libs                          | List of additional libraries in JSON format with type (os_pkg/pip2/pip3/r_pkg/others)|
+| libs                          | List of additional libraries in JSON format with type (os_pkg/pip3/r_pkg/others)|
 | action                        | lib_install                                                                          |
 </details>
 
@@ -1320,7 +1319,7 @@
 | conf\_key\_name               | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name              | Value that previously was used when Edge being provisioned                        |
 | notebook\_instance\_name      | Name of the Notebook instance to terminate                                        |
-| azure\_resource\_group\_name  | Name of the resource group where all DLAb resources are being provisioned         |
+| azure\_resource\_group\_name  | Name of the resource group where all DataLab resources are being provisioned         |
 | git\_creds                    | User git credentials in JSON format                                               |
 | action                        | git\_creds                                                                        |
 </details>
@@ -1461,7 +1460,6 @@
 ```
 {
   "os_pkg": {"htop": "2.0.1-1ubuntu1", "python-mysqldb": "1.3.7-1build2"},
-  "pip2": {"requests": "N/A", "configparser": "N/A"},
   "pip3": {"configparser": "N/A"},
   "r_pkg": {"rmarkdown": "1.5"},
   "others": {"Keras": "N/A"}
@@ -1479,7 +1477,7 @@
 | computational\_id             | Name of Dataengine-service                                                           |
 | aws\_region                   | AWS region where infrastructure was deployed                                         |
 | application                   | Type of the notebook template (jupyter/rstudio/zeppelin/tensor/deeplearning)         |
-| libs                          | List of additional libraries in JSON format with type (os_pkg/pip2/pip3/r_pkg/others)|
+| libs                          | List of additional libraries in JSON format with type (os_pkg/pip3/r_pkg/others)|
 | action                        | lib_install                                                                          |
 
 **Example** of additional_libs parameter:
@@ -1490,7 +1488,6 @@
   "libs": [
     {"group": "os_pkg", "name": "nmap"},
     {"group": "os_pkg", "name": "htop"},
-    {"group": "pip2", "name": "requests"},
     {"group": "pip3", "name": "configparser"},
     {"group": "r_pkg", "name": "rmarkdown"},
     {"group": "others", "name": "Keras"}
@@ -1549,7 +1546,7 @@
 | conf\_resource                 | dataengine                                                                        |
 | conf\_service\_base\_name      | Unique infrastructure value, specified during SSN deployment                      |
 | conf\_key\_name                | Name of the uploaded SSH key file (without ".pem")                                |
-| conf\_os\_family               | Name of the Linux distributive family, which is supported by DLab (Debian/RedHat) |
+| conf\_os\_family               | Name of the Linux distributive family, which is supported by DataLab (Debian/RedHat) |
 | notebook\_instance\_name       | Name of the Notebook dataengine will be linked to                                 |
 | dataengine\_instance\_count    | Number of nodes in cluster                                                        |
 | edge\_user\_name               | Value that previously was used when Edge being provisioned                        |
@@ -1566,7 +1563,7 @@
 | conf\_resource                 | dataengine                                                                        |
 | conf\_service\_base\_name      | Unique infrastructure value, specified during SSN deployment                      |
 | conf\_key\_name                | Name of the uploaded SSH key file (without ".pem")                                |
-| conf\_os\_family               | Name of the Linux distributive family, which is supported by DLab (Debian/RedHat) |
+| conf\_os\_family               | Name of the Linux distributive family, which is supported by DataLab (Debian/RedHat) |
 | notebook\_instance\_name       | Name of the Notebook dataengine will be linked to                                 |
 | dataengine\_instance\_count    | Number of nodes in cluster                                                        |
 | edge\_user\_name               | Value that previously was used when Edge being provisioned                        |
@@ -1574,7 +1571,7 @@
 | azure\_region                  | Azure region where all infrastructure was deployed                                |
 | azure\_dataengine\_master\_size| Size of master node                                                               |
 | azure\_dataengine\_slave\_size | Size of slave node                                                                |
-| azure\_resource\_group\_name   | Name of the resource group where all DLAb resources are being provisioned         |
+| azure\_resource\_group\_name   | Name of the resource group where all DataLab resources are being provisioned         |
 | azure\_subnet\_name            | Name of the Azure public subnet where Edge was deployed                           |
 | action                         | create                                                                            |
 </details>
@@ -1586,7 +1583,7 @@
 | conf\_resource               | dataengine                                                                        |
 | conf\_service\_base\_name    | Unique infrastructure value, specified during SSN deployment                      |
 | conf\_key\_name              | Name of the uploaded SSH key file (without ".pem")                                |
-| conf\_os\_family             | Name of the Linux distributive family, which is supported by DLab (Debian/RedHat) |
+| conf\_os\_family             | Name of the Linux distributive family, which is supported by DataLab (Debian/RedHat) |
 | notebook\_instance\_name     | Name of the Notebook dataengine will be linked to                                 |
 | gcp\_vpc\_name               | GCP VPC name                                                                      |
 | gcp\_subnet\_name            | GCP subnet name                                                                   |
@@ -1631,7 +1628,7 @@
 | computational\_name          | Name of cluster                                                          |
 | notebook\_instance\_name     | Name of the Notebook instance which dataengine is linked to              |
 | azure\_region                | Azure region where infrastructure was deployed                           |
-| azure\_resource\_group\_name | Name of the resource group where all DLAb resources are being provisioned|
+| azure\_resource\_group\_name | Name of the resource group where all DataLab resources are being provisioned|
 | action                       | Terminate                                                                |
 </details>
 
@@ -1677,7 +1674,6 @@
 ```
 {
   "os_pkg": {"htop": "2.0.1-1ubuntu1", "python-mysqldb": "1.3.7-1build2"},
-  "pip2": {"requests": "N/A", "configparser": "N/A"},
   "pip3": {"configparser": "N/A"},
   "r_pkg": {"rmarkdown": "1.5"},
   "others": {"Keras": "N/A"}
@@ -1705,7 +1701,6 @@
   "libs": [
     {"group": "os_pkg", "name": "nmap"},
     {"group": "os_pkg", "name": "htop"},
-    {"group": "pip2", "name": "requests"},
     {"group": "pip3", "name": "configparser"},
     {"group": "r_pkg", "name": "rmarkdown"},
     {"group": "others", "name": "Keras"}
@@ -1725,7 +1720,7 @@
 | conf\_service\_base\_name     | Unique infrastructure value, specified during SSN deployment                      |
 | conf\_key\_name               | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name              | Value that previously was used when Edge being provisioned                        |
-| azure\_resource\_group\_name  | Name of the resource group where all DLAb resources are being provisioned         |
+| azure\_resource\_group\_name  | Name of the resource group where all DataLab resources are being provisioned         |
 | computational\_id             | Name of cluster                                                                   |
 | application                   | Type of the notebook template (jupyter/rstudio/zeppelin/tensor/deeplearning)      |
 | action                        | lib_list                                                                          |
@@ -1738,7 +1733,7 @@
 | conf\_service\_base\_name     | Unique infrastructure value, specified during SSN deployment                      |
 | conf\_key\_name               | Name of the uploaded SSH key file (without ".pem")                                |
 | edge\_user\_name              | Value that previously was used when Edge being provisioned                        |
-| azure\_resource\_group\_name  | Name of the resource group where all DLAb resources are being provisioned         |
+| azure\_resource\_group\_name  | Name of the resource group where all DataLab resources are being provisioned         |
 | computational\_id             | Name of cluster                                                                   |
 | application                   | Type of the notebook template (jupyter/rstudio/zeppelin/tensor/deeplearning)      |
 | action                        | lib_install                                                                       |
@@ -1777,15 +1772,15 @@
 
 ## Configuration files <a name="Configuration_files"></a>
 
-DLab configuration files are located on SSN node by following path:
--   /opt/dlab/conf ssn.yml – basic configuration for all java services;
+DataLab configuration files are located on SSN node by following path:
+-   /opt/datalab/conf ssn.yml – basic configuration for all java services;
 -   provisioning.yml – Provisioning Service configuration file;for
 -   security.yml – Security Service configuration file;
 -   self-service.yml – Self-Service configuration file.
 
 ## Starting/Stopping services <a name="Starting_Stopping_services"></a>
 
-All DLab services running as OS services and have next syntax for
+All DataLab services running as OS services and have next syntax for
 starting and stopping:
 ```
 sudo supervisorctl {start | stop | status} [all | provserv | secserv | ui]
@@ -1798,16 +1793,16 @@
 -   secserv – execute command for Security Service;
 -   ui – execute command for Self-Service.
 
-## DLab Web UI <a name="DLab Web UI"></a>
+## DataLab Web UI <a name="DataLab_Web_UI"></a>
 
-DLab self service is listening to the secure 8443 port. This port is used for secure local communication with 
+DataLab self service is listening to the secure 8443 port. This port is used for secure local communication with 
 provisioning service.
 
 There is also Nginx proxy server running on Self-Service node, which proxies remote connection to local 8443 port.
 Nginx server is listening to both 80 and 443 ports by default. It means that you could access self-service Web UI using 
 non-secure connections (80 port) or secure (443 port).
 
-Establishing connection using 443 port you should take into account that DLab uses self-signed certificate from the box, 
+Establishing connection using 443 port you should take into account that DataLab uses self-signed certificate from the box, 
 however you are free to switch Nginx to use your own domain-verified certificate.
 
 To disable non-secure connection please do the following:
@@ -1847,13 +1842,13 @@
 ```
 If you want to load report manually, or use external scheduler use following command:
 ```
-java -jar /opt/dlab/webapp/lib/billing/billing-aws.x.y.jar --conf /opt/dlab/conf/billing.yml
+java -jar /opt/datalab/webapp/lib/billing/billing-aws.x.y.jar --conf /opt/datalab/conf/billing.yml
 or
-java -cp /opt/dlab/webapp/lib/billing/billing-aws.x.y.jar com.epam.dlab.BillingTool --conf /opt/dlab/conf/billing.yml
+java -cp /opt/datalab/webapp/lib/billing/billing-aws.x.y.jar com.epam.datalab.BillingTool --conf /opt/datalab/conf/billing.yml
 ```
 If you want billing to work as a separate process from the Self-Service use following command:
 ```
-java -cp /opt/dlab/webapp/lib/billing/billing-aws.x.y.jar com.epam.dlab.BillingScheduler --conf /opt/dlab/conf/billing.yml
+java -cp /opt/datalab/webapp/lib/billing/billing-aws.x.y.jar com.epam.datalab.BillingScheduler --conf /opt/datalab/conf/billing.yml
 ```
 </details>
 
@@ -1866,24 +1861,24 @@
 
 If you want to start billing module as a separate process use the following command:
 ```
-java -jar /opt/dlab/webapp/lib/billing/billing-azure.x.y.jar /opt/dlab/conf/billing.yml
+java -jar /opt/datalab/webapp/lib/billing/billing-azure.x.y.jar /opt/datalab/conf/billing.yml
 ```
 </details>
 
 ## Backup and Restore <a name="Backup_and_Restore"></a>
 
-All DLab configuration files, keys, certificates, jars, database and logs can be saved to backup file.
+All DataLab configuration files, keys, certificates, jars, database and logs can be saved to backup file.
 
-Scripts for backup and restore is located in ```dlab_path/tmp/```. Default: ```/opt/dlab/tmp/```
+Scripts for backup and restore is located in ```datalab_path/tmp/```. Default: ```/opt/datalab/tmp/```
 
 List of parameters for run backup:
 
 | Parameter      | Description/Value                                                                                                       |
 |----------------|-------------------------------------------------------------------------------------------------------------------------|
-| --dlab\_path   | Path to DLab. Default: /opt/dlab/                                                                                       |
+| --datalab\_path   | Path to DataLab. Default: /opt/datalab/                                                                                       |
 | --configs      | Comma separated names of config files, like "security.yml", etc. Default: all                                           |
 | --keys         | Comma separated names of keys, like "user_name.pub". Default: all                                                       |
-| --certs        | Comma separated names of SSL certificates and keys, like "dlab.crt", etc. Also available: skip. Default: all |
+| --certs        | Comma separated names of SSL certificates and keys, like "atalab.crt", etc. Also available: skip. Default: all |
 | --jars         | Comma separated names of jar application, like "self-service" (without .jar), etc. Also available: all. Default: skip   |
 | --db           | Mongo DB. Key without arguments. Default: disable                                                                       |
 | --logs         | All logs (include docker). Key without arguments. Default: disable                                                      |
@@ -1892,10 +1887,10 @@
 
 | Parameter      | Description/Value                                                                                                       |
 |----------------|-------------------------------------------------------------------------------------------------------------------------|
-| --dlab\_path   | Path to DLab. Default: /opt/dlab/                                                                                       |
+| --datalab\_path   | Path to DataLab. Default: /opt/datalab/                                                                                       |
 | --configs      | Comma separated names of config files, like "security.yml", etc. Default: all                                           |
 | --keys         | Comma separated names of keys, like "user_name.pub". Default: all                                                       |
-| --certs        | Comma separated names of SSL certificates and keys, like "dlab.crt", etc. Also available: skip. Default: all |
+| --certs        | Comma separated names of SSL certificates and keys, like "datalab.crt", etc. Also available: skip. Default: all |
 | --jars         | Comma separated names of jar application, like "self-service" (without .jar), etc. Also available: all. Default: skip   |
 | --db           | Mongo DB. Key without arguments. Default: disable                                                                       |
 | --file         | Full or relative path to backup file or folder. Required field                                                          |
@@ -1909,13 +1904,13 @@
 
 Own GitLab server can be deployed from SSN node with script, which located in:
 
-```dlab_path/tmp/gitlab```. Default: ```/opt/dlab/tmp/gitlab```
+```datalab_path/tmp/gitlab```. Default: ```/opt/datalab/tmp/gitlab```
 
 All initial configuration parameters located in ```gitlab.ini``` file.
 
 Some of parameters are already setuped from SSN provisioning.
 
-GitLab uses the same LDAP server as DLab.
+GitLab uses the same LDAP server as DataLab.
 
 To deploy Gitlab server, set all needed parameters in ```gitlab.ini``` and run script:
 
@@ -1927,18 +1922,18 @@
 
 ## Troubleshooting <a name="Troubleshooting"></a>
 
-If the parameter dlab\_path of configuration file dlab.ini wasn’t changed, the path to DLab service would default to:
+If the parameter datalab\_path of configuration file datalab.ini wasn’t changed, the path to DataLab service would default to:
 
--   /opt/dlab/ - main directory of DLab service
--   /var/opt/dlab/log/ or /var/log/dlab/ - path to log files
+-   /opt/datalab/ - main directory of DataLab service
+-   /var/opt/datalab/log/ or /var/log/datalab/ - path to log files
 
 To check logs of Docker containers run the following commands:
 ```
 docker ps -a – to get list of containers which were executed.
 ...
-a85d0d3c27aa docker.dlab-dataengine:latest "/root/entrypoint...." 2 hours ago Exited (0) 2 hours ago infallible_gallileo
-6bc2afeb888e docker.dlab-jupyter:latest "/root/entrypoint...." 2 hours ago Exited (0) 2 hours ago practical_cori
-51b71c5d4aa3 docker.dlab-zeppelin:latest "/root/entrypoint...." 2 hours ago Exited (0) 2 hours ago determined_knuth
+a85d0d3c27aa docker.datalab-dataengine:latest "/root/entrypoint...." 2 hours ago Exited (0) 2 hours ago infallible_gallileo
+6bc2afeb888e docker.datalab-jupyter:latest "/root/entrypoint...." 2 hours ago Exited (0) 2 hours ago practical_cori
+51b71c5d4aa3 docker.datalab-zeppelin:latest "/root/entrypoint...." 2 hours ago Exited (0) 2 hours ago determined_knuth
 ...
 docker logs <container_id> – to get log for particular Docker container.
 ```
@@ -1955,32 +1950,32 @@
 You can also rebuild images manually by executing the following steps:
 
 1.  SSH to SSN instance
-2.  go to */opt/dlab/sources/*
+2.  go to */opt/datalab/sources/*
 3.  Modify needed files
 [4]. [ONLY FOR AZURE] Copy service principal json file with credentials to base/azure_auth.json
 5.  Rebuild proper Docker images, using one or several commands (depending on what files you’ve changed):
 ```
-docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/base_Dockerfile -t docker.dlab-base .
-docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/edge_Dockerfile -t docker.dlab-edge .
-docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/jupyter_Dockerfile -t docker.dlab-jupyter .
-docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/jupyterlab_Dockerfile -t docker.dlab-jupyterlab .
-docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/rstudio_Dockerfile -t docker.dlab-rstudio .
-docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/zeppelin_Dockerfile -t docker.dlab-zeppelin .
-docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/tensor_Dockerfile -t docker.dlab-tensor .
-docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/tensor-rstudio_Dockerfile -t docker.dlab-tensor-rstudio .
-docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/deeplearning_Dockerfile -t docker.dlab-deeplearning .
-docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/dataengine_Dockerfile -t docker.dlab-dataengine .
+docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/base_Dockerfile -t docker.datalab-base .
+docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/edge_Dockerfile -t docker.datalab-edge .
+docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/jupyter_Dockerfile -t docker.datalab-jupyter .
+docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/jupyterlab_Dockerfile -t docker.datalab-jupyterlab .
+docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/rstudio_Dockerfile -t docker.datalab-rstudio .
+docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/zeppelin_Dockerfile -t docker.datalab-zeppelin .
+docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/tensor_Dockerfile -t docker.datalab-tensor .
+docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/tensor-rstudio_Dockerfile -t docker.datalab-tensor-rstudio .
+docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/deeplearning_Dockerfile -t docker.datalab-deeplearning .
+docker build --build-arg OS=<os_family> --file general/files/<cloud_provider>/dataengine_Dockerfile -t docker.datalab-dataengine .
 ```
 
 ----------------
 # Development <a name="Development"></a>
 
-DLab services could be ran in development mode. This mode emulates real work an does not create any resources on cloud 
+DataLab services could be ran in development mode. This mode emulates real work an does not create any resources on cloud 
 provider environment.
 
 ## Folder structure <a name="Folder_structure"></a>
 
-    dlab
+    datalab
     ├───infrastructure-provisioning
     └───services
         ├───billing
@@ -2001,7 +1996,7 @@
 
 ## Pre-requisites <a name="Pre-requisites"></a>
 
-In order to start development of Front-end Web UI part of DLab - Git repository should be cloned and the following 
+In order to start development of Front-end Web UI part of DataLab - Git repository should be cloned and the following 
 packages should be installed:
 
 -   Git 1.7 or higher
@@ -2057,7 +2052,7 @@
 | EdgeResource              | Create<br>Start<br>Stop                 | Provides Docker actions for EDGE node management.                            |
 | ExploratoryResource       | Create<br>Start<br>Stop<br>Terminate    | Provides Docker actions for working with exploratory environment management. |
 | GitExploratoryResource    | Update git greds                        | Docker actions to provision git credentials to running notebooks             |
-| InfrastructureResource    | Status                                  | Docker action for obtaining status of DLab infrastructure instances.         |
+| InfrastructureResource    | Status                                  | Docker action for obtaining status of DataLab infrastructure instances.         |
 | LibExploratoryResource    | Lib list<br>Install lib                 | Docker actions to install libraries on netobboks                             |
 
 Some class names may have endings like Aws or Azure(e.g. ComputationalResourceAws, ComputationalResourceAzure, etc...). 
@@ -2071,13 +2066,13 @@
 If you use AWS cloud provider LDAP + AWS authentication could be useful as it allows to combine LDAP authentication and 
 verification if user has any role in AWS account
 
-DLab provides OAuth2(client credentials and authorization code flow) security authorization mechanism for Azure users. 
+DataLab provides OAuth2(client credentials and authorization code flow) security authorization mechanism for Azure users. 
 This kind of authentication is required when you are going to use Data Lake. If Data Lake is not enabled you have two 
 options LDAP or OAuth2
 If OAuth2 is in use security-service validates user's permissions to configured permission scope(resource in Azure).
-If Data Lake is enabled default permission scope(can be configured manually after deploy DLab) is Data Lake Store 
+If Data Lake is enabled default permission scope(can be configured manually after deploy DataLab) is Data Lake Store 
 account so only if user has any role in scope of Data Lake Store Account resource he/she will be allowed to log in
-If Data Lake is disabled but Azure OAuth2 is in use default permission scope will be Resource Group where DLab is 
+If Data Lake is disabled but Azure OAuth2 is in use default permission scope will be Resource Group where DataLab is 
 created and only users who have any roles in the resource group will be allowed to log in.
 
 
@@ -2087,7 +2082,7 @@
 
 Web UI sources are part of Self-Service.
 
-Sources are located in dlab/services/self-service/src/main/resources/webapp
+Sources are located in datalab/services/self-service/src/main/resources/webapp
 
 | Main pages                    | Components and Services |
 |-------------------------------|-------------------------|
@@ -2130,22 +2125,24 @@
 )
 ```
 
-  * Load collections form file dlab/services/settings/(aws|azure)/mongo_settings.json
+  * Load collections form file datalab/services/settings/(aws|azure)/mongo_settings.json
 
 ```
 mongoimport -u admin -p <password> -d <database_name> -c settings mongo_settings.json
 ```
 
-  * Load collections form file dlab/infrastructure-provisioning/src/ssn/files/mongo_roles.json
+  * Load collections form file datalab/infrastructure-provisioning/src/ssn/files/mongo_roles.json
 
 ```
 mongoimport -u admin -p <password> -d <database_name> --jsonArray -c roles mongo_roles.json
 ```
 
+If this command doesn't work for you, try to check [https://docs.mongodb.com/v4.2/reference/program/mongoimport/](https://docs.mongodb.com/v4.2/reference/program/mongoimport/)
+Or, use some UI client (f.e: [MongoDB Compass](https://www.mongodb.com/try/download/compass) )
 ### Setting up environment options
 
   * Set option CLOUD_TYPE to aws/azure, DEV\_MODE to **true**, mongo database name and password in configuration file 
-  dlab/infrastructure-provisioning/src/ssn/templates/ssn.yml
+  datalab/infrastructure-provisioning/src/ssn/templates/ssn.yml
 
 ```
 <#assign CLOUD_TYPE="aws">
@@ -2157,7 +2154,7 @@
   password: <password>
 ```
 
-  * Add system environment variable DLAB\_CONF\_DIR=&lt;dlab\_root\_folder&gt;/dlab/infrastructure-provisioning/src/ssn/templates/ssn.yml or create two symlinks in dlab/services/provisioning-service and dlab/services/self-service folders for file dlab/infrastructure-provisioning/src/ssn/templates/ssn.yml.
+  * Add system environment variable DATALAB\_CONF\_DIR=&lt;datalab\_root\_folder&gt;/datalab/infrastructure-provisioning/src/ssn/templates or create two symlinks in datalab/services/provisioning-service and datalab/services/self-service folders for file datalab/infrastructure-provisioning/src/ssn/templates/ssn.yml.
 
 *Unix*
 
@@ -2174,8 +2171,8 @@
   * For Unix system create two folders and grant permission for writing:
 
 ```
-/var/opt/dlab/log/ssn
-/opt/dlab/tmp/result
+/var/opt/datalab/log/ssn
+/opt/datalab/tmp/result
 ```
 
 ### Install Node.js
@@ -2191,12 +2188,12 @@
 
 ### Build Web UI components
 
-  * Change folder to dlab/services/self-service/src/main/resources/webapp and install the dependencies from a package.json manifest
+  * Change folder to datalab/services/self-service/src/main/resources/webapp and install the dependencies from a package.json manifest
 
 ```
 npm install
 ```
-  * Replace CLOUD_PROVIDER options with aws|azure in dictionary file<br> dlab/services/self-service/src/main/resources/webapp/src/dictionary/global.dictionary.ts
+  * Replace CLOUD_PROVIDER options with aws|azure in dictionary file<br> datalab/services/self-service/src/main/resources/webapp/src/dictionary/global.dictionary.ts
 
 ```
 import { NAMING_CONVENTION } from './(aws|azure).dictionary';
@@ -2229,33 +2226,68 @@
 
 Pay attention that the last command has to be executed with administrative permissions.
 ```
-keytool -genkeypair -alias dlab -keyalg RSA -storepass KEYSTORE_PASSWORD -keypass KEYSTORE_PASSWORD -keystore ~/keys/dlab.keystore.jks -keysize 2048 -dname "CN=localhost"
-keytool -exportcert -alias dlab -storepass KEYSTORE_PASSWORD -file ~/keys/dlab.crt -keystore ~/keys/dlab.keystore.jks
-sudo keytool -importcert -trustcacerts -alias dlab -file ~/keys/dlab.crt -noprompt -storepass changeit -keystore ${JRE_HOME}/lib/security/cacerts
+keytool -genkeypair -alias ssn -keyalg RSA -storepass KEYSTORE_PASSWORD -keypass KEYSTORE_PASSWORD -keystore ~/keys/ssn.keystore.jks -keysize 2048 -dname "CN=localhost"
+keytool -exportcert -alias ssn -storepass KEYSTORE_PASSWORD -file ~/keys/ssn.crt -keystore ~/keys/ssn.keystore.jks
+sudo keytool -importcert -trustcacerts -alias ssn -file ~/keys/ssn.crt -noprompt -storepass changeit -keystore ${JRE_HOME}/lib/security/cacerts
 ```
 #### Create Windows server certificate
 
 Pay attention that the last command has to be executed with administrative permissions.
 To achieve this the command line (cmd) should be ran with administrative permissions.  
 ```
-"%JRE_HOME%\bin\keytool" -genkeypair -alias dlab -keyalg RSA -storepass KEYSTORE_PASSWORD -keypass KEYSTORE_PASSWORD -keystore <DRIVE_LETTER>:\home\%USERNAME%\keys\dlab.keystore.jks -keysize 2048 -dname "CN=localhost"
-"%JRE_HOME%\bin\keytool" -exportcert -alias dlab -storepass KEYSTORE_PASSWORD -file <DRIVE_LETTER>:\home\%USERNAME%\keys\dlab.crt -keystore <DRIVE_LETTER>:\home\%USERNAME%\keys\dlab.keystore.jks
-"%JRE_HOME%\bin\keytool" -importcert -trustcacerts -alias dlab -file <DRIVE_LETTER>:\home\%USERNAME%\keys\dlab.crt -noprompt -storepass changeit -keystore "%JRE_HOME%\lib\security\cacerts"
+"%JRE_HOME%\bin\keytool" -genkeypair -alias ssn -keyalg RSA -storepass KEYSTORE_PASSWORD -keypass KEYSTORE_PASSWORD -keystore <DRIVE_LETTER>:\home\%USERNAME%\keys\ssn.keystore.jks -keysize 2048 -dname "CN=localhost"
+"%JRE_HOME%\bin\keytool" -exportcert -alias ssn -storepass KEYSTORE_PASSWORD -file <DRIVE_LETTER>:\home\%USERNAME%\keys\ssn.crt -keystore <DRIVE_LETTER>:\home\%USERNAME%\keys\ssn.keystore.jks
+"%JRE_HOME%\bin\keytool" -importcert -trustcacerts -alias ssn -file <DRIVE_LETTER>:\home\%USERNAME%\keys\ssn.crt -noprompt -storepass changeit -keystore "%JRE_HOME%\lib\security\cacerts"
 
 Useful command
-"%JRE_HOME%\bin\keytool" -list -alias dlab -storepass changeit -keystore "%JRE_HOME%\lib\security\cacerts"
-"%JRE_HOME%\bin\keytool" -delete -alias dlab -storepass changeit -keystore "%JRE_HOME%\lib\security\cacerts"
+"%JRE_HOME%\bin\keytool" -list -alias ssn -storepass changeit -keystore "%JRE_HOME%\lib\security\cacerts"
+"%JRE_HOME%\bin\keytool" -delete -alias ssn -storepass changeit -keystore "%JRE_HOME%\lib\security\cacerts"
 ```
-Where the ```<DRIVE_LETTER>``` must be the drive letter where you run the DLab.
+Where the ```<DRIVE_LETTER>``` must be the drive letter where you run the DataLab.
 
+### Set up config files
 
+#### ssn.yml
+ Open infrastructure-provisioning/src/ssn/templates/ssn.yml 
+ 
+ * (23) KEYS_DIR -> path to keys dir with backslash
+ * (30) CLOUD_TYPE -> CLOUD_PROVIDER to gcp
+ * (34) DEV_MODE -> false to true
+ * (40-42) change user, pass, db to created in prev step
+ 
+ #### self-service.yml
+  Open services/self-service/self-service.yml
+  
+   * (170) keycloakConfiguration
+       * (171) redirectUri -> https://localhost:8443/
+       * (172) realm -> DLAB_bhliva
+       * (174) auth-server-url -> http://52.11.45.11:8080/auth
+       * (178) resource -> sss
+       * credentials
+           * (180) secret -> [ASK_YOUR_ONBOARDING_ENGINEER]
+         
+ #### provisioning.yml
+  Open services/provisioning-service/provisioning.yml
+ 
+   * (93) keycloakConfiguration
+        * (94) realm -> DLAB_bhliva
+        * (96) auth-server-url -> http://52.11.45.11:8080/auth
+        * (100) resource -> sss
+        * credentials
+            * (102) secret -> [ASK_YOUR_ONBOARDING_ENGINEER]
+     
+   * (104) cloudProperties
+        * (125) imageEnabled -> true     
+        * (133) stepCerts
+          * (134) enabled -> true
+           
 ## How to run locally <a name="run_locally"></a>
 
 There is a possibility to run Self-Service and Provisioning Service locally. All requests from Provisioning Service to 
 Docker are mocked and instance creation status will be persisted to Mongo (only without real impact on Docker and AWS). 
 Security Service can\`t be running on local machine because of local LDAP mocking complexity.
 
-Both services, Self-Service and Provisioning Service are dependent on dlab/provisioning-infrastructure/ssn/templates/ssn.yml
+Both services, Self-Service and Provisioning Service are dependent on datalab/provisioning-infrastructure/ssn/templates/ssn.yml
 configuration file. Both services have main functions as entry point, SelfServiceApplication for Self-Service and ProvisioningServiceApplication for Provisioning Service. Services could be started by running main methods of these classes. Both main functions require two arguments:
 
   * Run mode (“server”)
@@ -2268,8 +2300,27 @@
 
 Run application flow is following:
 
-  * Run provisioning-service passing 2 arguments: server, provisioning.yml
-  * Run self-service passing 2 arguments: server, self-service.yml
+ 
+  * Create and run provisioning-service configuration:
+    * Create Application with name provisining-service-application
+        * Main class: 
+        ``` com.epam.datalab.backendapi.ProvisioningServiceApplication```
+        * VM options:  ```-Ddocker.dir=[PATH_TO_PROJECT_DIR]\infrastructure-provisioning\src\general\files\gcp```
+        * Program arguments : ```server
+                              [PATH_TO_PROJECT_DIR]\services\provisioning-service\provisioning.yml```
+        * Working directory:```[PATH_TO_PROJECT_DIR]```
+        * Use classpath of module: ```provisioning-servise```
+        * PAY ATTENTION: JRE should be the same jre where created server certificate
+        
+    * Create and run self-service configuration:
+      * Create Application with name self-service-application
+          * Main class: 
+          ``` com.epam.datalab.backendapi.SelfServiceApplication```
+          * Program arguments : ```server
+                                [PATH_TO_PROJECT_DIR]/services/self-service/self-service.yml```
+          * Working directory:```[PATH_TO_PROJECT_DIR]```
+          * Use classpath of module: ```self-service```
+          * PAY ATTENTION: JRE should be the same jre where created server certificate
   * Try to access self-service Web UI by https://localhost:8443
 
 ```
@@ -2281,11 +2332,11 @@
 
 ### DevOps components overview
 
-The following list shows common structure of scripts for deploying DLab
+The following list shows common structure of scripts for deploying DataLab
 
 #### Folder structure
 
-    dlab
+    datalab
     └───infrastructure-provisioning
         └───src
             ├───base
@@ -2320,7 +2371,7 @@
 
     general
     ├───api – all available API
-    ├───conf – DLab configuration
+    ├───conf – DataLab configuration
     ├───files – OS/Cloud dependent files
     ├───lib – OS/Cloud dependent functions
     ├───scripts – OS/Cloud dependent Python scripts
@@ -2362,20 +2413,20 @@
 
 ##### Docker and python execution workflow on example of SSN node
 
--   Docker command for building images *docker.dlab-base* and *docker.dlab-ssn*:
+-   Docker command for building images *docker.datalab-base* and *docker.datalab-ssn*:
 ```
-sudo docker build --build-arg OS=debian  --file general/files/aws/base_Dockerfile -t docker.dlab-base . ;
-sudo docker build --build-arg OS=debian  --file general/files/aws/ssn_Dockerfile -t docker.dlab-ssn . ;
+sudo docker build --build-arg OS=debian  --file general/files/aws/base_Dockerfile -t docker.datalab-base . ;
+sudo docker build --build-arg OS=debian  --file general/files/aws/ssn_Dockerfile -t docker.datalab-ssn . ;
 ```
 Example of SSN Docker file:
 ```
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY ssn/ /root/
 COPY general/scripts/aws/ssn_* /root/scripts/
-COPY general/lib/os/${OS}/ssn_lib.py /usr/lib/python2.7/dlab/ssn_lib.py
+COPY general/lib/os/${OS}/ssn_lib.py /usr/lib/python3.8/datalab/ssn_lib.py
 COPY general/files/aws/ssn_policy.json /root/files/
 COPY general/templates/aws/jenkins_jobs /root/templates/jenkins_jobs
 
@@ -2389,7 +2440,7 @@
 
 -   Docker command for building SSN:
 ```
-docker run -i -v /root/KEYNAME.pem:/root/keys/KEYNAME.pem –v /web_app:/root/web_app -e "conf_os_family=debian" -e "conf_cloud_provider=aws" -e "conf_resource=ssn" -e "aws_ssn_instance_size=t2.medium" -e "aws_region=us-west-2" -e "aws_vpc_id=vpc-111111" -e "aws_subnet_id=subnet-111111" -e "aws_security_groups_ids=sg-11111,sg-22222,sg-33333" -e "conf_key_name=KEYNAME" -e "conf_service_base_name=dlab_test" -e "aws_access_key=Access_Key_ID" -e "aws_secret_access_key=Secret_Access_Key" -e "conf_tag_resource_id=dlab" docker.dlab-ssn --action create ;
+docker run -i -v /root/KEYNAME.pem:/root/keys/KEYNAME.pem –v /web_app:/root/web_app -e "conf_os_family=debian" -e "conf_cloud_provider=aws" -e "conf_resource=ssn" -e "aws_ssn_instance_size=t2.medium" -e "aws_region=us-west-2" -e "aws_vpc_id=vpc-111111" -e "aws_subnet_id=subnet-111111" -e "aws_security_groups_ids=sg-11111,sg-22222,sg-33333" -e "conf_key_name=KEYNAME" -e "conf_service_base_name=datalab_test" -e "aws_access_key=Access_Key_ID" -e "aws_secret_access_key=Secret_Access_Key" -e "conf_tag_resource_id=datalab" docker.datalab-ssn --action create ;
 ```
 
 -   Docker executes *entrypoint.py* script with action *create*. *Entrypoint.py* will set environment variables, 
@@ -2430,7 +2481,7 @@
     1. Installing prerequisites
     2. Installing required packages
     3. Configuring Docker
-    4. Configuring DLab Web UI
+    4. Configuring DataLab Web UI
 
 -   If all scripts/function are executed successfully, Docker container will stop and SSN node will be created.
 
@@ -2439,13 +2490,13 @@
 SSN:
 
 ```
-docker run -i -v <key_path><key_name>.pem:/root/keys/<key_name>.pem -e "region=<region>" -e "conf_service_base_name=<Infrastructure_Tag>" -e  “conf_resource=ssn" -e "aws_access_key=<Access_Key_ID>" -e "aws_secret_access_key=<Secret_Access_Key>" docker.dlab-ssn --action <action>
+docker run -i -v <key_path><key_name>.pem:/root/keys/<key_name>.pem -e "region=<region>" -e "conf_service_base_name=<Infrastructure_Tag>" -e  “conf_resource=ssn" -e "aws_access_key=<Access_Key_ID>" -e "aws_secret_access_key=<Secret_Access_Key>" docker.datalab-ssn --action <action>
 ```
 All parameters are listed in section "Self-ServiceNode" chapter.
 
 Other images:
 ```
-docker run -i -v /home/<user>/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/<image>:/logs/<image>  -e <variable1> –e <variable2> docker.dlab-<image> --action <action>
+docker run -i -v /home/<user>/keys:/root/keys  -v /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/<image>:/logs/<image>  -e <variable1> –e <variable2> docker.datalab-<image> --action <action>
 ```
 
 #### How to add a new template
@@ -2527,8 +2578,8 @@
 
     print("Configuring notebook server.")
     try:
-        if not exists('/home/' + args.os_user + '/.ensure_dir'):
-            sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
+        if not exists(conn,'/home/' + args.os_user + '/.ensure_dir'):
+            conn.sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
     except:
         sys.exit(1)
 
@@ -2558,7 +2609,7 @@
 
 -   *infrastructure-provisioning/src/general/files/<cloud_provider>/my-tool_Dockerfile* – used for building template 
     Docker image and describes which files, scripts, templates are required and will be copied to template Docker image.
--   *infrastructure-provisioning/src/general/files/<cloud_provider>/my-tool_descriptsion.json* – JSON file for DLab Web 
+-   *infrastructure-provisioning/src/general/files/<cloud_provider>/my-tool_descriptsion.json* – JSON file for DataLab Web 
     UI. In this file you can specify:
   * exploratory\_environment\_shapes – list of EC2 shapes
   * exploratory\_environment\_versions – description of template
@@ -2741,9 +2792,9 @@
 dc=alexion,dc=cloud'**, where CN is attribute retrieved by  **“userLookUp”** script.
 
 ## Azure OAuth2 Authentication <a name="Azure_OAuth2_Authentication"></a>
-DLab supports OAuth2 authentication that is configured automatically in Security Service and Self Service after DLab deployment.
+DataLab supports OAuth2 authentication that is configured automatically in Security Service and Self Service after DataLab deployment.
 Please see explanation details about configuration parameters for Self Service and Security Service below.
-DLab supports client credentials(username + password) and authorization code flow for authentication.
+DataLab supports client credentials(username + password) and authorization code flow for authentication.
 
 
 ### Azure OAuth2 Self Service configuration
@@ -2753,11 +2804,11 @@
         tenant: xxxx-xxxx-xxxx-xxxx
         authority: https://login.microsoftonline.com/
         clientId: xxxx-xxxx-xxxx-xxxx
-        redirectUrl: https://dlab.azure.cloudapp.azure.com/
+        redirectUrl: https://datalab.azure.cloudapp.azure.com/
         responseMode: query
         prompt: consent
         silent: true
-        loginPage: https://dlab.azure.cloudapp.azure.com/
+        loginPage: https://datalab.azure.cloudapp.azure.com/
         maxSessionDurabilityMilliseconds: 288000000
 
 where:
@@ -2766,12 +2817,12 @@
 - **tenant** - tenant id of your company
 - **authority** - Microsoft login endpoint
 - **clientId** - id of the application that users log in through
-- **redirectUrl** - redirect URL to DLab application after try to login to Azure using OAuth2
-- **responseMode** - defines how Azure sends authorization code or error information to DLab during log in procedure
+- **redirectUrl** - redirect URL to DataLab application after try to login to Azure using OAuth2
+- **responseMode** - defines how Azure sends authorization code or error information to DataLab during log in procedure
 - **prompt** - defines kind of prompt during Oauth2 login
-- **silent** - defines if DLab tries to log in user without interaction(true/false), if false DLab tries to login user 
+- **silent** - defines if DataLab tries to log in user without interaction(true/false), if false DataLab tries to login user 
   with configured prompt
-- **loginPage** - start page of DLab application
+- **loginPage** - start page of DataLab application
 - **maxSessionDurabilityMilliseconds** - max user session durability. user will be asked to login after this period 
   of time and when he/she creates ot starts notebook/cluster. This operation is needed to update refresh_token that is used by notebooks to access Data Lake Store
 
@@ -2786,10 +2837,10 @@
         tenant: xxxx-xxxx-xxxx-xxxx
         authority: https://login.microsoftonline.com/
         clientId: xxxx-xxxx-xxxx-xxxx
-        redirectUrl: https://dlab.azure.cloudapp.azure.com/
+        redirectUrl: https://datalab.azure.cloudapp.azure.com/
         validatePermissionScope: true
         permissionScope: subscriptions/xxxx-xxxx-xxxx-xxxx/resourceGroups/xxxx-xxxx/providers/Microsoft.DataLakeStore/accounts/xxxx/providers/Microsoft.Authorization/
-        managementApiAuthFile: /dlab/keys/azure_authentication.json
+        managementApiAuthFile: /datalab/keys/azure_authentication.json
 
 where:
 - **useLdap** - defines if LDAP authentication is enabled(true/false). If false Azure OAuth2 takes place with 
@@ -2797,7 +2848,7 @@
 - **tenant** - tenant id of your company
 - **authority** - Microsoft login endpoint
 - **clientId** - id of the application that users log in through
-- **redirectUrl** - redirect URL to DLab application after try to login to Azure using OAuth2
+- **redirectUrl** - redirect URL to DataLab application after try to login to Azure using OAuth2
 - **validatePermissionScope** - defines(true/false) if user's permissions should be validated to resource that is 
   provided in permissionScope parameter. User will be logged in onlu in case he/she has any role in resource IAM 
   described with permissionScope parameter
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index 2b43591..ebda811 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -1,69 +1,62 @@
-#
 # DLab is Self-service, Fail-safe Exploratory Environment for Collaborative Data Science Workflow
 
-## New features in v2.3
-
+## New features in v2.4.0
 **All Cloud platforms:**
-- Added support for multi-Cloud orchestration for AWS, Azure and GCP. Now, a single DLab instance can connect to the above Clouds, by means of respective set of API&#39;s, deployed on cloud endpoints;
-- Added JupyterLab v.0.35.6 template
+- Implemented bucket browser. Now user is able to manage Cloud data source by means of accessing Cloud Blob Storage from DLab Web UI;
+- Added support of audit. Now DLab administrators can view history of all actions;
 - Updated versions of installed software:
-  - Jupyter notebook v.6.0.2;
-  - Apache Zeppelin v.0.8.2;
-  - RStudio v.1.2.5033;
-  - Apache Spark v.2.4.4 for standalone cluster;
+  * Ubuntu v.18.04;
+  * TensorFlow notebook v.2.1.0;
+  * MongoDB v.4.2.
 
 **AWS:**
-- Added support of new version of Data Engine Service (EMR) v.5.28.0;
+- Added support of new version of Data Engine Service (EMR) v.5.30.0 and v.6.0.0.
+
+## Improvements in v2.4.0
+**All Cloud platforms:**
+- Added support of connection via Livy and SparkMagic for Jupyter and RStudio notebooks;
+- Added ability to select multiple resources on &#39;Environment management&#39; to make user experience easier and more intuitive;
+- Added support to install libraries of particular version from DLab Web UI. Also, now user is able to update/downgrade library via Web UI;
+- Extended billing functionality introducing new entity - monthly project quota(s);
+- Added notifications for cases when project quota is exceeded;
+- Conveyed analytical environment URL&#39;s to DLab administration page.
 
 **GCP:**
-- Added support of new version of Data Engine Service (Dataproc) v.1.4;
-- Added new template Superset v.0.35.1;
+- Added possibility to create custom image for notebook.
 
-## Improvements in v2.3
+## Bug fixes in v2.4.0
 **All Cloud platforms:**
-- Grouped project management actions in single Edit project menu for ease of use;
-- Introduced new &quot;project admin&quot; role;
-- SSO now also works for Notebooks;
-- Implemented ability to filter installed libraries;
-- Added possibility to sort by project/user/charges in &#39;Billing report&#39; page;
-- Added test option for remote endpoint;
+- Fixed a bug when administrative permissions disappeared after endpoint connectivity issues;
+- Fixed a bug when all resources disappeared in &#39;List of resources&#39; page after endpoint connectivity issues;
+- Fixed a bug when administrative role could not be edited for already existing group;
+- Fixed a bug when billing report was not populated in Safari;
+- Fixed a bug with discrepancies in detailed billing and in-grid billing report.
 
-## Bug fixes in v2.3
-**All Cloud platforms:**
-- Fixed a bug when Notebook name should be unique per project for different users, since it was impossible to operate Notebook with the same name after the first instance creation;
-- Fixed a bug when administrator could not stop/terminate Notebook/computational resources created by another user;
-- Fixed a bug when shell interpreter was not showing up for Apache Zeppelin;
-- Fixed a bug when scheduler by start time was not triggered for Data Engine;
-- Fixed a bug when it was possible to start Notebook if project quota was exceeded;
-- Fixed a bug when scheduler for stopping was not triggered after total quota depletion;
-
-**AWS:**
-- Fixed a bug when Notebook image/snapshot were still available after SSN termination;
+**GCP:**
+- Fixed a bug when billing was not correctly updated for period overlapping two calendar years;
 
 **Microsoft Azure:**
-- Fixed a bug when custom image creation from Notebook failed and deleted the existing Notebook of another user;
-- Fixed a bug when detailed billing was not available;
-- Fixed a bug when spark reconfiguration failed on Data Engine;
-- Fixed a bug when billing data was not available after calendar filter usage;
+- Fixed a rare bug when notebooks or SSN were not always created successfully from the first attempt.
 
-## Known issues in v2.3
+## Known issues in v2.4.0
 **GCP:**
-- SSO is not available for Superset;
+- SSO is not available for Superset.
 
 **Microsoft Azure:**
 - Notebook creation fails on RedHat;
-- Web terminal is not working for Notebooks only for remote endpoint;
+- Web terminal is not working for Notebooks only for remote endpoint.
 
-Refer to the following link in order to view the other major/minor issues in v2.3:
+*Refer to the following link in order to view the other major/minor issues in v2.4.0:*
 
-[Apache DLab: known issues](https://issues.apache.org/jira/issues/?filter=12348876#](https://issues.apache.org/jira/issues/?filter=12348876 "Apache DLab: known issues")
+[Apache DLab: Known issues](https://issues.apache.org/jira/issues/?filter=12349399 "Apache DLab: Known issues")
 
-## Known issues caused by cloud provider limitations in v2.3
+## Known issues caused by cloud provider limitations in v2.4.0
+
 **Microsoft Azure:**
 - Resource name length should not exceed 80 chars;
 - TensorFlow templates are not supported for RedHat Enterprise Linux;
-- Low priority Virtual Machines are not supported yet;
+- Low priority Virtual Machines are not supported yet.
 
 **GCP:**
 - Resource name length should not exceed 64 chars;
-- NOTE: DLab has not been tested on GCP for RedHat Enterprise Linux;
+- NOTE: DLab has not been tested on GCP for RedHat Enterprise Linux.
diff --git a/USER_GUIDE.md b/USER_GUIDE.md
index 78876fc..20b212b 100644
--- a/USER_GUIDE.md
+++ b/USER_GUIDE.md
@@ -1,8 +1,8 @@
-What is DLAB?
+What is DataLab?
 =============
 
-DLab is an essential toolset for analytics. It is a self-service Web Console, used to create and manage exploratory environments. It allows teams to spin up analytical environments with best of breed open-source tools just with a single click of the mouse. Once established, environment can be managed by an analytical team itself, leveraging simple and easy-to-use Web Interface.
-<p>See more at <a href="http://dlab.opensource.epam.com/" rel="nofollow">dlab.opensource.epam.com</a>.</p>
+DataLab is an essential toolset for analytics. It is a self-service Web Console, used to create and manage exploratory environments. It allows teams to spin up analytical environments with best of breed open-source tools just with a single click of the mouse. Once established, environment can be managed by an analytical team itself, leveraging simple and easy-to-use Web Interface.
+<p>See more at <a href="https://datalab.incubator.apache.org/" rel="nofollow">https://datalab.incubator.apache.org/</a>.</p>
 
 ------------
 ## CONTENTS
@@ -38,6 +38,8 @@
 
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Git UI tool (ungit)](#git_ui)
 
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Bucket browser](#bucket)
+
 [Administration](#administration)
 
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Manage roles](#manage_roles)
@@ -48,9 +50,13 @@
 
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Multiple Cloud endpoints](#multiple_cloud_endpoints)
 
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Manage DLab quotas](#manage_dlab_quotas)
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Manage DataLab quotas](#manage_datalab_quotas)
 
-[DLab billing report](#billing_page)
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [Configuration](#configuration)
+
+[DataLab billing report](#billing_page)
+
+[DataLab audit report](#audit_page)
 
 [Web UI filters](#filter)
 
@@ -58,9 +64,9 @@
 ---------
 # Login <a name="login"></a>
 
-As soon as DLab is deployed by an infrastructure provisioning team and you received DLab URL, your username and password – open DLab login page, fill in your credentials and hit Login.
+As soon as DataLab is deployed by an infrastructure provisioning team and you received DataLab URL, your username and password – open DataLab login page, fill in your credentials and hit Login.
 
-DLab Web Application authenticates users against:
+DataLab Web Application authenticates users against:
 
 -   OpenLdap;
 -   Cloud Identity and Access Management service user validation;
@@ -76,7 +82,7 @@
 
 \* Please refer to official documentation from Amazon to figure out how to manage Access Keys for your AWS Account: http://docs.aws.amazon.com/general/latest/gr/managing-aws-access-keys.html
 
-To stop working with DLab - click on Log Out link at the top right corner of DLab.
+To stop working with DataLab - click on Log Out link at the top right corner of DataLab.
 
 After login user sees warning in case of exceeding quota or close to this limit.
 
@@ -91,19 +97,17 @@
 ----------------------------------
 # Create project <a name="setup_edge_node"></a>
 
-When you log into DLab Web interface, the first thing you need to do is to create a new project.
+When you log into DataLab Web interface, the first thing you need to do is to create a new project.
 
-To do this click on “Upload” button on “Projects” page, select your personal public key (or click on "Generate" button), endpoint, group, 'Use shared image' select enable or disable and hit “Create” button. Do not forget to save your private key.
+To do this click on “Upload” button on “Projects” page, select your personal public key (or click on "Generate" button), endpoint, group and hit “Create” button. Do not forget to save your private key.
 
 <p align="center" class="facebox-popup"> 
     <img src="doc/upload_or_generate_user_key.png" alt="Upload or generate user key" width="100%">
 </p>
 
-Please note, that you need to have a key pair combination (public and private key) to work with DLab. To figure out how to create public and private key, please click on “Where can I get public key?” on “Projects” page. DLab build-in wiki page guides Windows, MasOS and Linux on how to generate SSH key pairs quickly.
+Please note, that you need to have a key pair combination (public and private key) to work with DataLab. To figure out how to create public and private key, please click on “Where can I get public key?” on “Projects” page. DataLab build-in wiki page guides Windows, MasOS and Linux on how to generate SSH key pairs quickly.
 
-Creation of Project starts after hitting "Create" button. This process is a one-time operation for each Data Scientist and it might take up-to 10 minutes for DLab to setup initial infrastructure for you. During this process project is in status "Creating".
-
-'Use shared image' enabled means, that an image of particular notebook type is created while first notebook of same type is created in DLab. This image will be availble for all DLab users. This image is used for provisioning of further notebooks of same type within DLab. 'Use share image' disabled means, that image of particular notebook type is created while first notebook of same type is created in DLab. This AMI is available for all users withing same project.
+Creation of Project starts after hitting "Create" button. This process is a one-time operation for each Data Scientist and it might take up-to 10 minutes for DataLab to setup initial infrastructure for you. During this process project is in status "Creating".
 
 As soon as Project is created, Data Scientist can create  notebook server on “List of Resources” page. The message “To start working, please create new environment” is appeared on “List of Resources” page:
 
@@ -118,14 +122,14 @@
 To create new analytical environment from “List of Resources” page click on "Create new" button.
 
 The "Create analytical tool" popup shows up. Data Scientist can choose the preferred project, endpoint and analytical tool. Adding new analytical toolset is supported by architecture, so you can expect new templates to show up in upcoming releases.
-Currently by means of DLab, Data Scientists can select between any of the following templates:
+Currently by means of DataLab, Data Scientists can select between any of the following templates:
 
 -   Jupyter
 -   Apache Zeppelin
 -   RStudio
--   RStudio with TensorFlow
+-   RStudio with TensorFlow (implemented on AWS)
 -   Jupyter with TensorFlow
--   Deep Learning (Jupyter + MXNet, Caffe, Caffe2, TensorFlow, CNTK, Theano, Torch and Keras)
+-   Deep Learning (Jupyter + MXNet, Caffe2, TensorFlow, CNTK, Theano, PyTorch and Keras)
 -   JupyterLab
 -   Superset (implemented on GCP)
 
@@ -145,14 +149,20 @@
 
 These groups have T-Shirt based shapes (configurable), that can help Data Scientist to either save money\* and leverage not very powerful shapes (for working with relatively small datasets), or that could boost the performance of analytics by selecting more powerful instance shape.
 
-\* Please refer to official documentation from Amazon that helps you to understand what [instance shapes](https://aws.amazon.com/ec2/instance-types/) are the most preferable in your particular DLAB setup. Also, you can use [AWS calculator](https://calculator.s3.amazonaws.com/index.html) to roughly estimate the cost of your environment.
+\* Please refer to official documentation from Amazon that helps you to understand what [instance shapes](https://aws.amazon.com/ec2/instance-types/) are the most preferable in your particular DataLab setup. Also, you can use [AWS calculator](https://calculator.s3.amazonaws.com/index.html) to roughly estimate the cost of your environment.
 
-\* Please refer to official documentation from GCP that helps you to understand what [instance shapes](https://cloud.google.com/compute/docs/machine-types) are the most preferable in your particular DLAB setup. Also, you can use [GCP calculator](https://cloud.google.com/products/calculator) to roughly estimate the cost of your environment.
+\* Please refer to official documentation from GCP that helps you to understand what [instance shapes](https://cloud.google.com/compute/docs/machine-types) are the most preferable in your particular DataLab setup. Also, you can use [GCP calculator](https://cloud.google.com/products/calculator) to roughly estimate the cost of your environment.
 
-\* Please refer to official documentation from Microsoft Azure that helps you to understand what [virtual machine shapes](https://azure.microsoft.com/en-us/pricing/details/virtual-machines/series/) are the most preferable in your particular DLAB setup. Also, you can use [Microsoft Azure calculator](https://azure.microsoft.com/en-us/pricing/calculator/?&ef_id=EAIaIQobChMItPmK5uj-6AIVj-iaCh0BFgVYEAAYASAAEgJ4KfD_BwE:G:s&OCID=AID2000606_SEM_UOMYUjFz&MarinID=UOMYUjFz_364338000380_microsoft%20azure%20calculator_e_c__76882726955_kwd-300666827690&lnkd=Google_Azure_Brand&dclid=CLC65Ojo_ugCFUWEsgodm18GNA) to roughly estimate the cost of your environment.
+\* Please refer to official documentation from Microsoft Azure that helps you to understand what [virtual machine shapes](https://azure.microsoft.com/en-us/pricing/details/virtual-machines/series/) are the most preferable in your particular DataLab setup. Also, you can use [Microsoft Azure calculator](https://azure.microsoft.com/en-us/pricing/calculator/?&ef_id=EAIaIQobChMItPmK5uj-6AIVj-iaCh0BFgVYEAAYASAAEgJ4KfD_BwE:G:s&OCID=AID2000606_SEM_UOMYUjFz&MarinID=UOMYUjFz_364338000380_microsoft%20azure%20calculator_e_c__76882726955_kwd-300666827690&lnkd=Google_Azure_Brand&dclid=CLC65Ojo_ugCFUWEsgodm18GNA) to roughly estimate the cost of your environment.
 
 You can override the default configurations of local spark. The configuration object is referenced as a JSON file. To tune spark configuration check off "Spark configurations" check box and insert JSON format in the text box.
 
+Also there is a posibility to add GPU on GCP for Jupyter, Deeplearning notebook or Jupyter with TensorFlow. For Jupyter adding GPU is not mandatory. You can mark a check box and select GPU type from the list:
+
+<p align="center"> 
+    <img src="doc/notebook_create_gpu.png" alt="Select gpu" width="574">
+</p>
+
 After you Select the template, fill in the Name and specify desired instance shape - you need to click on "Create" button for your analytical toolset to be created. Corresponding record shows up in your dashboard:
 
 ![Dashboard](doc/main_page2.png)
@@ -174,8 +184,8 @@
 -   Up time
 -   Analytical tool URL
 -   Git UI tool (ungit)
--   Shared bucket for all users
 -   Project bucket for project members
+-   Bucket browser  
 
 To access analytical tool Web UI you use direct URL's (your access is established via reverse proxy, so you don't need to have Edge node tunnel up and running).
 
@@ -187,23 +197,22 @@
     <img src="doc/notebook_menu_manage_libraries.png" alt="Notebook manage_libraries" width="150">
 </p>
 
-After clicking you see the window with 3 fields:
+After clicking you see the window with 4 fields:
 -   Field for selecting an active resource to install libraries
 -   Field for selecting group of packages (apt/yum, Python 2, Python 3, R, Java, Others)
--   Field for search available packages with autocomplete function except for Java. java library you should enter using the next format: "groupID:artifactID:versionID"
+-   Field for search available packages with autocomplete feature (if it's gained) except Java dependencies. For Java library you should enter using the next format: "groupID:artifactID:versionID"
+-   Field for library version. It's an optional field.
 
 ![Install libraries dialog](doc/install_libs_form.png)
 
-You need to wait for a while after resource choosing till list of all available libraries is received.
+You need to wait for a while after resource and group choosing till list of all available libraries is received for a particular group. If available libraries list is not gained due to some reasons you are able to proceed to work without autocomplete feature.
 
 ![Libraries list loading](doc/notebook_list_libs.png)
 
-**Note:** Apt or yum packages depends on your DLab OS family.
+**Note:** Apt or Yum packages depend on your DataLab OS family.
 
 **Note:** In group Others you can find other Python (2/3) packages, which haven't classifiers of version.
 
-![Resource select_lib](doc/notebook_select_lib.png)
-
 After selecting library, you can see it in the midle of the window and can delete it from this list before installation.
 
 ![Resource selected_lib](doc/notebook_selected_libs.png)
@@ -212,7 +221,7 @@
 
 ![Resources libs_status](doc/notebook_libs_status.png)
 
-**Note:** If package can't be installed you see "Failed" in status column and button to retry installation.
+**Note:** If package can't be installed you see "instalation error" in status column and button to retry installation or 'invalid name' or 'invalid version'.
 
 ### Create image <a name="create_image"></a>
 
@@ -240,9 +249,7 @@
     <img src="doc/create_notebook_from_ami.png" alt="Create notebook from AMI" width="560">
 </p>
 
-Before clicking "Create" button you should choose the image from "Select AMI" and fill in the "Name" and "Instance shape".
-
-**NOTE:** This functionality is implemented for AWS and Azure.
+Before clicking "Create" button you should choose the image from "Select AMI" and fill in the "Name" and "Instance shape". For Deeplearning notebook on GCP there is also a list of predefined images.
 
 --------------------------
 ## Stop Notebook server <a name="notebook_stop"></a>
@@ -260,6 +267,10 @@
 **NOTE:** Connected Data Engine Service becomes Terminated while connected (if any) Data Engine (Standalone Apache Spark cluster) becomes Stopped.
 
 <p align="center"> 
+    <img src="doc/notebook_terminate_confirm.png" alt="Notebook terminate confirm" width="400">
+</p>
+
+<p align="center"> 
     <img src="doc/notebook_stop_confirm.png" alt="Notebook stop confirm" width="400">
 </p>
 
@@ -268,13 +279,13 @@
 --------------------------------
 ## Terminate Notebook server <a name="notebook_terminate"></a>
 
-Once you have finished working with an analytical tool and you need don't neeed cloud resources anymore, for the sake of the costs, we recommend to terminate the notebook. You are not able to start the notebook which has been terminated. Instead, you have to create new Notebook if you need to proceed with your analytical activities.
+Once you have finished working with an analytical tool and you don't neeed cloud resources anymore, for the sake of the costs, we recommend to terminate the notebook. You are not able to start the notebook which has been terminated. Instead, you have to create new Notebook if you need to proceed with your analytical activities.
 
 **NOTE:** Make sure you back-up your data (if exists on Notebook) and playbooks before termination.
 
 To terminate the Notebook click on a gear icon <img src="doc/gear_icon.png" alt="gear" width="20"> in the "Actions" column for a needed Notebook and hit "Terminate":
 
-**NOTE:** If any Computational resources have been linked to your notebook server – they are automatically terminated if you terminate the notebook.
+**NOTE:** If any Computational resource has been linked to your notebook server – it's automatically terminated if you terminate the notebook.
 
 Confirm termination of the notebook and afterwards notebook status changes to "Terminating":
 
@@ -294,44 +305,52 @@
 -   Total number of instances (min 2 and max 14, configurable);
 -   Master and Slave instance shapes (list is configurable and supports all available cloud instance shapes, supported in your cloud region);
 
-Also, if you want to save some costs for your Computational resource you can create it based on [spot instances](https://aws.amazon.com/ec2/spot/)(this functionality is for AWS cloud) or [preemptible instances](https://cloud.google.com/compute/docs/instances/preemptible) (this functionality is for GCP), which are often available at a discount price:
+Also, if you want to save some costs for your Data Engine Service you can create it based on [spot instances](https://aws.amazon.com/ec2/spot/) (this functionality is for AWS cloud) or [preemptible instances](https://cloud.google.com/compute/docs/instances/preemptible) (this functionality is for GCP), which are often available at a discount price:
 
 -   Select Spot Instance checkbox;
 -   Specify preferable bid for your spot instance in % (between 20 and 90, configurable).
 
 **NOTE:** When the current Spot price rises above your bid price, the Spot instance is reclaimed by cloud so that it can be given to another customer. Please make sure to backup your data on periodic basis.
 
-This picture shows menu for creating Computational resource for AWS:
+This picture shows menu for creating EMR (Data Engine Service) for AWS:
 <p align="center"> 
     <img src="doc/emr_create.png" alt="Create Computational resource on AWS" width="760">
 </p>
 
-You can override the default configurations for applications by supplying a configuration object for applications when you create a cluster (this functionality is only available for Amazon EMR cluster). The configuration object is referenced as a JSON file.
+You can override the default configurations for applications for Data Engine Service by supplying a configuration object for applications when you create a cluster (this functionality is available for Amazon EMR cluster). The configuration object is referenced as a JSON file.
 To tune computational resource configuration check off "Cluster configurations" check box and insert JSON format in text box:
 
 <p align="center"> 
     <img src="doc/emr_create_configuration.png" alt="Create Custom Computational resource on AWS" width="760">
 </p>
 
-This picture shows menu for creating Computational resource for GCP:
+You can specify Master and Slave GPU type and GPU count for Dataproc (Data Engine Service) or Standalone Apache Spark cluster on GCP.
+
+This picture shows menu for creating Dataproc (Data Engine Service) and Standalone Apache Spark cluster for GCP:
 <p align="center"> 
     <img src="doc/dataproc_create.png" alt="Create Computational resource on GCP" width="760">
 </p>
 
-To create Data Engine Service (Dataproc) with preemptible instances check off 'preemptible node count'. You can add from 1 to 11 preemptible instances.
-
-This picture shows menu for creating Computational resource for Azure:
 <p align="center"> 
-    <img src="doc/dataengine_creating_menu.png" alt="Create Computational resource on Azure" width="760">
+    <img src="doc/spark_create_gcp.png" alt="Create Computational resource on GCP" width="760">
 </p>
 
-If you click on "Create" button Computational resource creation kicks off. You see corresponding record on DLab Web UI in status "Creating":
+To create Data Engine Service (Dataproc) with preemptible instances check off 'preemptible node count'. You can add from 1 to 11 preemptible instances.
+
+This picture shows menu for creating Standalone Apache Spark cluster for Azure and AWS:
+<p align="center"> 
+    <img src="doc/spark_creating_menu.png" alt="Create Computational resource on Azure" width="760">
+</p>
+
+On top of that you can override the default spark configurations for Standalone Apache Spark cluster by supplying a configuration object for applications when you create a cluster or have already created. The configuration object is referenced as a JSON file. To tune spark configuration check off "Cluster configurations" check box and insert JSON format in text box.
+
+If you click on "Create" button Computational resource creation kicks off. You see corresponding record on DataLab Web UI in status "Creating":
 
 ![Creating Computational resource](doc/emr_creating.png)
 
 Once Computational resources are provisioned, their status changes to "Running".
 
-After clicking on Computational resource name in DLab dashboard you see Computational resource details popup:
+After clicking on Computational resource name in DataLab dashboard you see Computational resource details popup:
 
 <p align="center"> 
     <img src="doc/emr_info.png" alt="Computational resource info" width="480">
@@ -343,9 +362,9 @@
 
 To do that open any of the analytical tools and select proper kernel/interpreter:
 
-**Jupyter** – go to Kernel and choose preferable interpreter between local and Computational resource ones. Currently we have added support of Python 2/3, Spark, Scala, R in Jupyter.
+**Jupyter** – go to Kernel and choose preferable interpreter between local and Computational resource ones. Currently we have added support of Python 2 (only for local kernel)/3, Spark, Scala, R in Jupyter.
 
-![Jupiter](doc/jupiter.png)
+![Jupiter](doc/jupyter_kernel.png)
 
 **Zeppelin** – go to Interpreter Biding menu and switch between local and Computational resource there. Once needed interpreter is selected click on "Save".
 
@@ -360,12 +379,12 @@
 
 **RStudio –** open R.environ and comment out /opt/spark/ to switch to Computational resource and vise versa to switch to local kernel:
 
-![RStudio](doc/rstudio.png)
+![RStudio](doc/rstudio_kernel.png)
 
 ---------------
 ## Stop Standalone Apache Spark cluster <a name="spark_stop"></a>
 
-Once you have stopped working with Standalone Apache Spark cluster (Data Engine) and you need to release cloud resources for the sake of the costs, you might want to stop Standalone Apache Spark cluster. You are able to start Standalone Apache Spark cluster again after a while and proceed with your analytics.
+Once you have stopped working with Standalone Apache Spark cluster and you need to release cloud resources for the sake of the costs, you might want to stop Standalone Apache Spark cluster. You are able to start Standalone Apache Spark cluster again after a while and proceed with your analytics.
 
 To stop Standalone Apache Spark cluster click on <img src="doc/stop_icon.png" alt="stop" width="20"> button close to Standalone Apache Spark cluster alias.
 
@@ -392,7 +411,7 @@
 ## Scheduler <a name="scheduler"></a>
 
 Scheduler component allows to automatically schedule Start and Stop triggers for a Notebook/Computational, while 
-for Data Engine or Data Engine Service it can only trigger Stop or Terminate action correspondigly. There are 2 types of a scheduler:
+for Data Engine or Data Engine Service (Standalone Apache Spark cluster) it can only trigger Stop or Terminate action correspondigly. There are 2 types of a scheduler:
 - Scheduler by time;
 - Scheduler by inactivity.
 
@@ -437,7 +456,7 @@
 </p>
 
 Notebook/Standalone Apache Spark cluster is started/stopped automatically after scheduler setting.
-Please also note that if notebook is configured to be stopped, all running data engines assosiated with is stopped (for Standalone Apache Spark cluster) or terminated (for data engine serice) with notebook.
+Please also note that if notebook is configured to be stopped, running computational resource assosiated with is stopped (for Standalone Apache Spark cluster) or terminated (for data engine serice) with notebook.
 
 After login user is notified  that corresponding resources are about to be stopped/terminated in some time.
 
@@ -450,7 +469,7 @@
 
 ### Manage Git credentials <a name="git_creds"></a>
 
-To work with Git (pull, push) via UI tool (ungit) you could add multiple credentials in DLab UI, which are set on all running instances with analytical tools.
+To work with Git (pull, push) via UI tool (ungit) you could add multiple credentials in DataLab UI, which are set on all running instances with analytical tools.
 
 When you click on the button "Git credentials" – following popup shows up:
 
@@ -459,7 +478,7 @@
 </p>
 
 In this window you need to add:
--   Your Git server hostname, without **http** or **https**, for example: gitlab.com, github.com, bitbucket.com, or your internal Git server.
+-   Your Git server hostname, without **http** or **https**, for example: gitlab.com, github.com, bitbucket.com.
 -   Your Username and Email - used to display author of commit in git.
 -   Your Login and Password - for authorization into git server.
 
@@ -483,9 +502,7 @@
 
 Before start working with Git repositories, you need to change working directory on the top of window to:
 
-**/home/dlab-user/** or **/opt/zeppelin/notebook** for Zeppelin analytical tool and press Enter.
-
-**Note:** Zeppelin already uses git for local versioning of files, you can add upstream for all notebooks.
+**/home/datalab-user/** and press Enter.
 
 After changing working directory you can create repository or better way - clone existing:
 
@@ -512,6 +529,32 @@
 Also clicking on "Circle" button you can uncommit or revert changes.
 
 --------------------------------
+
+### Bucket browser <a name="bucket"></a>
+
+You are able to access to cloud buckets via DataLab Web UI.
+There are two ways to open bucket browser:
+- clicking on Notebook name on the "List of resources" page, where there is an "Open bucket browser" link;
+- clicking on "Bucket browser" bucket on the "List of resources" page.
+
+![Bucket_browser_button](doc/bucket_button.png)
+
+When you click on the "Bucket browser" button or "Open bucket browser" link – following popup shows up:
+
+![Select_bucket](doc/select_bucket.png)
+
+In the left side of the grid you see buckets for which you have access. You can switch between buckets by choosing appropriate one. In the right side of the grid you see folders and files which are already created or uploaded.
+
+In the bucket browser you are supposed to:
+- upload file;
+- create folder;
+- delete folder and file;
+- download file;
+- copy path to folder or to file.
+
+![Bucket_browser](doc/bucket_browser.png)
+
+--------------------------------
 # Administration <a name="administration"></a>
 
 ## Manage roles <a name="manage_roles"></a>
@@ -524,8 +567,9 @@
 </p>
 
 Roles consist of:
-- Administration - allow to execute administrative operation for the whole DLab or administrative operation only per project;
+- Administration - allow to execute administrative operation for the whole DataLab or administrative operation only per project;
 - Billing - allow to view billing only the own resources or all users;
+- Bucket browser actions - allow to set permissions for cloud buckets if user only accesses via bucket browser
 - Compute - list of Compute types which are supposed for creation;
 - Compute shapes - list of Compute shapes which are supposed for creation;
 - Notebook - list of Notebook templates which are supposed for creation;
@@ -535,7 +579,7 @@
     <img src="doc/roles.png" alt="Roles" width="450">
 </p>
 
-To add group enter group name, choose certain action which should be allowed for group and also you can add discrete user(s) (not mandatory) and then click "Create" button.
+To add group enter group name, choose certain action which should be allowed for group and furthermore you can add discrete user(s) (not mandatory) and then click "Create" button.
 After addidng the group it appears on "Manage roles" popup.
 
 Administrator can remove group or user. For that you should only click on bin icon <img src="doc/bin_icon.png" alt="bin" width="15">for certain group or for icon <img src="doc/delete_btn.png" alt="delete" width="13"> for particular user. After that hit "Yes" in confirmation popup.
@@ -560,18 +604,17 @@
 
 Administrator can edit already existing project:
 - Add or remove group;
-- Add new endpoint;
-- Switch off/on 'Use shared image' option.
+- Add new endpoint.
 
 To edit the project hit "Edit project" and choose option which you want to add, remove or change. For applying changes click on "Update" button.
 
-To stop Edge node hit "Stop edge node". After that confirm "OK" in confirmation popup. All related instances change its status from 'Running' to "Stopping" and soon become "Stopped". You are able to start Edge node again after a while and proceed with your work. Do not forget to start notebook again if you want to continue with your analytics. Because start Edge node does not start related instances.
+To stop Edge node hit "Stop edge node". After that confirm "OK" in confirmation popup. All related instances change its status from 'Running' to "Stopping" (except for Data Engine Service, its status is "Terminated") and soon become "Stopped" ("Terminated" for Data Engine Service). You are able to start Edge node again after a while and proceed with your work. Do not forget to start notebook again if you want to continue with your analytics. Because start Edge node does not start related instances.
 
 To terminate Edge node hit "Terminate edge node". After that confirm "OK" in confirmation popup. All related instances change its status to "Terminating" and soon become "Terminated".
 
 ## Environment management <a name="environment_management"></a>
 
-DLab Environment Management page is an administration page allowing adminstrator to see the list of all users environments and to stop/terminate all of them.
+DataLab Environment Management page is an administration page allowing adminstrator to see the list of all users environments and to stop/terminate all of them.
 
 To access Environment management page either navigate to it via main menu:
 
@@ -584,7 +627,7 @@
     <img src="doc/manage_env_actions.png" alt="Manage environment actions" width="160">
 </p>
 
-**NOTE:** Connected Data Engine Server is terminated and related Data Engine is stopped during Notebook stopping. During Notebook termination related Computational resources  are automatically terminated. 
+**NOTE:** Connected Data Engine Server is terminated and related Standalone Apache Spark cluster is stopped during Notebook stopping. During Notebook termination related Computational resource is automatically terminated. 
 
 To stop or release specific cluster click an appropriate button close to cluster alias.
 
@@ -598,7 +641,7 @@
     <img src="doc/manage_env_confirm.png" alt="Manage environment action confirm" width="400">
 </p>
 
-**NOTE:** Terminate action is available only for notebooks and computational resources, not for Edge Nodes.
+**NOTE:** Terminate action is available only for notebook and computational resource, not for Edge Node.
 
 ### Multiple Cloud Endpoints <a name="multiple_cloud_endpoints"></a>
 
@@ -616,26 +659,57 @@
 
 Administrator can deactivate whole analytical environment via bin icon <img src="doc/bin_icon.png" alt="bin" width="15">. And all related instances change its satuses to "Terminating" and soon become "Terminated".
 
-### Manage DLab quotas <a name="manage_dlab_quotas"></a>
+### Manage DataLab quotas <a name="manage_datalab_quotas"></a>
 
-Administrator can set quotas per project and for the whole DLab. To do it click on "Manage DLab quotas" button. "Manage DLab quotas" popup shows up. Administrator can see all active project:
+Administrator can set quotas per project (monthly or total period) and for the whole DataLab. To do it click on "Manage DataLab quotas" button. "Manage DataLab quotas" popup shows up. Administrator can see all active project:
 
 <p align="center"> 
     <img src="doc/manage_environment.png" alt="Manage environment" width="520">
 </p>
 
-After filling fields and clicking on "Apply" button, new quotas are used for project and DLab.
-If project and DLab quotas are exceeded the warning shows up during login.
+After filling fields and clicking on "Apply" button, new quotas are used for project and DataLab.
+If project and DataLab quotas are exceeded the warning shows up during login.
 
 <p align="center" class="facebox-popup"> 
-    <img src="doc/exceeded quota.png" alt="Exceeded quota" width="400">
+    <img src="doc/project_quota.png" alt="Exceeded project quota" width="400">
 </p>
 
 In such case user cannot create new instance and already "Running" instance changes its status to "Stopping", except for Data Engine Service (its status changes "Terminating") and soon becomes "Stopped" or "Terminated" appropriately.
 
+## Configuration <a name="configuration"></a>
+
+DataLab Configuration page is an administrative page allowing administrator to restart services and/or edit configuration files for self-service, provisioning and billing services.
+
+To access Configuration page, navigate to it through the main menu:
+
+<p align="center"> 
+    <img src="doc/configuration_page.png" alt="Configuration">
+</p>
+
+Navigate between tabs to edit services configuration files:
+
+<p align="center"> 
+    <img src="doc/configuration_page1.png" alt="Configuration">
+</p>
+
+To restart the service, select the appropriate endpoint from the list, and then select one or several services you want to restart and click on 'Restart' button. A confirmation dialog shows up, allowing you to confirm or reject the action:
+
+**NOTE:** Restarting services will make DataLab unavailable for some time.
+
+<p align="center"> 
+    <img src="doc/configuration_page_restart.png" alt="Configurationt">
+</p>
+
+**NOTE:** You will not be able to restart provisioning service if one of resources 
+is in processing stage (creating, configuring, reconfiguring, creating image, stopping, starting, terminating):
+
+<p align="center"> 
+    <img src="doc/configuration_page_prov.png" alt="Configuration">
+</p>
+
 --------------------------------
 
-# DLab Billing report <a name="billing_page"></a>
+# DataLab Billing report <a name="billing_page"></a>
 
 On this page you can see all billing information, including all costs assosiated with service base name of SSN.
 
@@ -658,6 +732,29 @@
 
 In the footer of billing report, you can see "Total" cost for all environments.
 
+
+--------------------------------
+
+# DataLab Audit report <a name="audit_page"></a>
+
+On this page you can see change history, which have been done by any user.
+
+You are able to view:
+- when the action was done
+- who did the action
+- what the action was done
+
+Furthermore on the center of header you can choose period of report in datepicker.
+
+![Audit page](doc/audit_page.png)
+
+If you click information icon <img src="doc/icon_info.png" alt="bin" width="15"> you see more detail information.
+
+<p align="center"> 
+    <img src="doc/audit_info.png" alt="Notebook stop confirm" width="400">
+</p>
+
+
 --------------------------------
 
 # Web UI filters <a name="filter"></a>
@@ -669,7 +766,7 @@
 -   environment name (input field);
 -   status (multiple choice);
 -   shape (multiple choice);
--   computational resources (multiple choice);
+-   compute (multiple choice);
 
 ![Main page filter](doc/main_page_filter.png)
 
diff --git a/build.properties b/build.properties
index d765398..622c600 100644
--- a/build.properties
+++ b/build.properties
@@ -16,4 +16,4 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-dlab.version=2.3
\ No newline at end of file
+datalab.version=2.5
\ No newline at end of file
diff --git a/doc/audit_info.png b/doc/audit_info.png
new file mode 100644
index 0000000..c15cae6
--- /dev/null
+++ b/doc/audit_info.png
Binary files differ
diff --git a/doc/audit_page.png b/doc/audit_page.png
new file mode 100644
index 0000000..7f26780
--- /dev/null
+++ b/doc/audit_page.png
Binary files differ
diff --git a/doc/azure_dlab_arch.png b/doc/azure_dlab_arch.png
index 60e19f6..588a880 100644
--- a/doc/azure_dlab_arch.png
+++ b/doc/azure_dlab_arch.png
Binary files differ
diff --git a/doc/billing_datepicker.png b/doc/billing_datepicker.png
index 8810423..c13898d 100644
--- a/doc/billing_datepicker.png
+++ b/doc/billing_datepicker.png
Binary files differ
diff --git a/doc/billing_filter.png b/doc/billing_filter.png
index e1dbd78..4076697 100644
--- a/doc/billing_filter.png
+++ b/doc/billing_filter.png
Binary files differ
diff --git a/doc/billing_page.png b/doc/billing_page.png
index 33bd674..cf3d554 100644
--- a/doc/billing_page.png
+++ b/doc/billing_page.png
Binary files differ
diff --git a/doc/bin_icon.png b/doc/bin_icon.png
index d289b5f..95210a2 100644
--- a/doc/bin_icon.png
+++ b/doc/bin_icon.png
Binary files differ
diff --git a/doc/bucket_action.png b/doc/bucket_action.png
new file mode 100644
index 0000000..70c217e
--- /dev/null
+++ b/doc/bucket_action.png
Binary files differ
diff --git a/doc/bucket_browser.png b/doc/bucket_browser.png
new file mode 100644
index 0000000..7392586
--- /dev/null
+++ b/doc/bucket_browser.png
Binary files differ
diff --git a/doc/bucket_button.png b/doc/bucket_button.png
new file mode 100644
index 0000000..0a0c9fb
--- /dev/null
+++ b/doc/bucket_button.png
Binary files differ
diff --git a/doc/bucket_upload.png b/doc/bucket_upload.png
new file mode 100644
index 0000000..e8782dc
--- /dev/null
+++ b/doc/bucket_upload.png
Binary files differ
diff --git a/doc/close to limit.png b/doc/close to limit.png
index ad6fd0a..19ba5a6 100644
--- a/doc/close to limit.png
+++ b/doc/close to limit.png
Binary files differ
diff --git a/doc/configuration_page.png b/doc/configuration_page.png
new file mode 100644
index 0000000..b1d055e
--- /dev/null
+++ b/doc/configuration_page.png
Binary files differ
diff --git a/doc/configuration_page1.png b/doc/configuration_page1.png
new file mode 100644
index 0000000..58ac0de
--- /dev/null
+++ b/doc/configuration_page1.png
Binary files differ
diff --git a/doc/configuration_page_prov.png b/doc/configuration_page_prov.png
new file mode 100644
index 0000000..0dd8d53
--- /dev/null
+++ b/doc/configuration_page_prov.png
Binary files differ
diff --git a/doc/configuration_page_restart.png b/doc/configuration_page_restart.png
new file mode 100644
index 0000000..1aedc6a
--- /dev/null
+++ b/doc/configuration_page_restart.png
Binary files differ
diff --git a/doc/dataengine_creating_menu.png b/doc/dataengine_creating_menu.png
deleted file mode 100644
index e5294f0..0000000
--- a/doc/dataengine_creating_menu.png
+++ /dev/null
Binary files differ
diff --git a/doc/datalab_aws.png b/doc/datalab_aws.png
new file mode 100644
index 0000000..76cc920
--- /dev/null
+++ b/doc/datalab_aws.png
Binary files differ
diff --git a/doc/datalab_azure.png b/doc/datalab_azure.png
new file mode 100644
index 0000000..a20b067
--- /dev/null
+++ b/doc/datalab_azure.png
Binary files differ
diff --git a/doc/datalab_gcp.png b/doc/datalab_gcp.png
new file mode 100644
index 0000000..57ebbd0
--- /dev/null
+++ b/doc/datalab_gcp.png
Binary files differ
diff --git a/doc/dataproc_create.png b/doc/dataproc_create.png
index cbab3f4..1eb8ca7 100644
--- a/doc/dataproc_create.png
+++ b/doc/dataproc_create.png
Binary files differ
diff --git a/doc/delete_group.png b/doc/delete_group.png
index 9b7c878..6506730 100644
--- a/doc/delete_group.png
+++ b/doc/delete_group.png
Binary files differ
diff --git a/doc/dlab_aws.png b/doc/dlab_aws.png
deleted file mode 100644
index e320dfe..0000000
--- a/doc/dlab_aws.png
+++ /dev/null
Binary files differ
diff --git a/doc/dlab_azure.png b/doc/dlab_azure.png
deleted file mode 100644
index ccdf3d9..0000000
--- a/doc/dlab_azure.png
+++ /dev/null
Binary files differ
diff --git a/doc/dlab_gcp.png b/doc/dlab_gcp.png
deleted file mode 100644
index f16be82..0000000
--- a/doc/dlab_gcp.png
+++ /dev/null
Binary files differ
diff --git a/doc/emr_creating.png b/doc/emr_creating.png
index 1e20418..35bece8 100644
--- a/doc/emr_creating.png
+++ b/doc/emr_creating.png
Binary files differ
diff --git a/doc/environment_management.png b/doc/environment_management.png
index ba0399c..462201b 100644
--- a/doc/environment_management.png
+++ b/doc/environment_management.png
Binary files differ
diff --git a/doc/exceeded quota.png b/doc/exceeded quota.png
index 4ba7a18..a6ba932 100644
--- a/doc/exceeded quota.png
+++ b/doc/exceeded quota.png
Binary files differ
diff --git a/doc/filter_icon.png b/doc/filter_icon.png
index e0c2a3e..325877f 100644
--- a/doc/filter_icon.png
+++ b/doc/filter_icon.png
Binary files differ
diff --git a/doc/icon_info.png b/doc/icon_info.png
new file mode 100644
index 0000000..ddee322
--- /dev/null
+++ b/doc/icon_info.png
Binary files differ
diff --git a/doc/install_libs_form.png b/doc/install_libs_form.png
index 2cf09f6..b3eaa55 100644
--- a/doc/install_libs_form.png
+++ b/doc/install_libs_form.png
Binary files differ
diff --git a/doc/jupiter.png b/doc/jupiter.png
deleted file mode 100644
index 2db0289..0000000
--- a/doc/jupiter.png
+++ /dev/null
Binary files differ
diff --git a/doc/jupyter_kernel.png b/doc/jupyter_kernel.png
new file mode 100644
index 0000000..d718824
--- /dev/null
+++ b/doc/jupyter_kernel.png
Binary files differ
diff --git a/doc/main_menu.png b/doc/main_menu.png
index dd891ba..b41d0ea 100644
--- a/doc/main_menu.png
+++ b/doc/main_menu.png
Binary files differ
diff --git a/doc/main_menu_env.png b/doc/main_menu_env.png
index 41690d3..2e33087 100644
--- a/doc/main_menu_env.png
+++ b/doc/main_menu_env.png
Binary files differ
diff --git a/doc/main_page.png b/doc/main_page.png
index b6f1e17..e0230b8 100644
--- a/doc/main_page.png
+++ b/doc/main_page.png
Binary files differ
diff --git a/doc/main_page2.png b/doc/main_page2.png
index 3d3af40..b931895 100644
--- a/doc/main_page2.png
+++ b/doc/main_page2.png
Binary files differ
diff --git a/doc/main_page3.png b/doc/main_page3.png
index 1812925..a94038b 100644
--- a/doc/main_page3.png
+++ b/doc/main_page3.png
Binary files differ
diff --git a/doc/main_page_filter.png b/doc/main_page_filter.png
index cd764ec..96c5fdc 100644
--- a/doc/main_page_filter.png
+++ b/doc/main_page_filter.png
Binary files differ
diff --git a/doc/manage_environment.png b/doc/manage_environment.png
index 73060ff..d44a931 100644
--- a/doc/manage_environment.png
+++ b/doc/manage_environment.png
Binary files differ
diff --git a/doc/managemanage_resource_actions.png b/doc/managemanage_resource_actions.png
index bd1394c..afd5f73 100644
--- a/doc/managemanage_resource_actions.png
+++ b/doc/managemanage_resource_actions.png
Binary files differ
diff --git a/doc/notebook_create.png b/doc/notebook_create.png
index 9ca407e..b0dd89a 100644
--- a/doc/notebook_create.png
+++ b/doc/notebook_create.png
Binary files differ
diff --git a/doc/notebook_create_gpu.png b/doc/notebook_create_gpu.png
new file mode 100644
index 0000000..3dc00a0
--- /dev/null
+++ b/doc/notebook_create_gpu.png
Binary files differ
diff --git a/doc/notebook_info.png b/doc/notebook_info.png
index 83e8e22..8640115 100644
--- a/doc/notebook_info.png
+++ b/doc/notebook_info.png
Binary files differ
diff --git a/doc/notebook_libs_status.png b/doc/notebook_libs_status.png
index 8aa861d..66a0fc9 100644
--- a/doc/notebook_libs_status.png
+++ b/doc/notebook_libs_status.png
Binary files differ
diff --git a/doc/notebook_list_libs.png b/doc/notebook_list_libs.png
index fea4d47..3b3f704 100644
--- a/doc/notebook_list_libs.png
+++ b/doc/notebook_list_libs.png
Binary files differ
diff --git a/doc/notebook_select_lib.png b/doc/notebook_select_lib.png
deleted file mode 100644
index 610524f..0000000
--- a/doc/notebook_select_lib.png
+++ /dev/null
Binary files differ
diff --git a/doc/notebook_selected_libs.png b/doc/notebook_selected_libs.png
index f38afeb..7e769ad 100644
--- a/doc/notebook_selected_libs.png
+++ b/doc/notebook_selected_libs.png
Binary files differ
diff --git a/doc/notebook_stop_confirm.png b/doc/notebook_stop_confirm.png
index 49adc3c..a777e99 100644
--- a/doc/notebook_stop_confirm.png
+++ b/doc/notebook_stop_confirm.png
Binary files differ
diff --git a/doc/notebook_terminate_confirm.png b/doc/notebook_terminate_confirm.png
new file mode 100644
index 0000000..eafe662
--- /dev/null
+++ b/doc/notebook_terminate_confirm.png
Binary files differ
diff --git a/doc/notebook_terminated.png b/doc/notebook_terminated.png
index 408e5ee..19f22a8 100644
--- a/doc/notebook_terminated.png
+++ b/doc/notebook_terminated.png
Binary files differ
diff --git a/doc/notebook_terminating.png b/doc/notebook_terminating.png
index b62a492..2cd63e5 100644
--- a/doc/notebook_terminating.png
+++ b/doc/notebook_terminating.png
Binary files differ
diff --git a/doc/physical_architecture.png b/doc/physical_architecture.png
index 879e6cf..3d13769 100644
--- a/doc/physical_architecture.png
+++ b/doc/physical_architecture.png
Binary files differ
diff --git a/doc/project_quota.png b/doc/project_quota.png
new file mode 100644
index 0000000..58f3a17
--- /dev/null
+++ b/doc/project_quota.png
Binary files differ
diff --git a/doc/roles.png b/doc/roles.png
index f7468a6..4dfe6c1 100644
--- a/doc/roles.png
+++ b/doc/roles.png
Binary files differ
diff --git a/doc/rstudio.png b/doc/rstudio.png
deleted file mode 100644
index 6f98092..0000000
--- a/doc/rstudio.png
+++ /dev/null
Binary files differ
diff --git a/doc/rstudio_kernel.png b/doc/rstudio_kernel.png
new file mode 100644
index 0000000..2f549b8
--- /dev/null
+++ b/doc/rstudio_kernel.png
Binary files differ
diff --git a/doc/scheduler reminder.png b/doc/scheduler reminder.png
index d62bebc..c9cfe10 100644
--- a/doc/scheduler reminder.png
+++ b/doc/scheduler reminder.png
Binary files differ
diff --git a/doc/select_bucket.png b/doc/select_bucket.png
new file mode 100644
index 0000000..1014966
--- /dev/null
+++ b/doc/select_bucket.png
Binary files differ
diff --git a/doc/sort_icon.png b/doc/sort_icon.png
index 95cb5d8..403784c 100644
--- a/doc/sort_icon.png
+++ b/doc/sort_icon.png
Binary files differ
diff --git a/doc/spark_create_gcp.png b/doc/spark_create_gcp.png
new file mode 100644
index 0000000..a16c720
--- /dev/null
+++ b/doc/spark_create_gcp.png
Binary files differ
diff --git a/doc/spark_creating_menu.png b/doc/spark_creating_menu.png
new file mode 100644
index 0000000..80d2f74
--- /dev/null
+++ b/doc/spark_creating_menu.png
Binary files differ
diff --git a/doc/ungit_push.png b/doc/ungit_push.png
index aa7fa9f..04c6302 100644
--- a/doc/ungit_push.png
+++ b/doc/ungit_push.png
Binary files differ
diff --git a/doc/ungit_window.png b/doc/ungit_window.png
index 13b886f..1d97f61 100644
--- a/doc/ungit_window.png
+++ b/doc/ungit_window.png
Binary files differ
diff --git a/doc/ungit_work.png b/doc/ungit_work.png
index b11340d..c447e20 100644
--- a/doc/ungit_work.png
+++ b/doc/ungit_work.png
Binary files differ
diff --git a/doc/upload_or_generate_user_key.png b/doc/upload_or_generate_user_key.png
index 6d6e6e1..95b624f 100644
--- a/doc/upload_or_generate_user_key.png
+++ b/doc/upload_or_generate_user_key.png
Binary files differ
diff --git a/doc/zeppelin.png b/doc/zeppelin.png
index 6f4052f..6852f34 100644
--- a/doc/zeppelin.png
+++ b/doc/zeppelin.png
Binary files differ
diff --git a/infrastructure-provisioning/scripts/POST_DEPLOYMENT.md b/infrastructure-provisioning/scripts/POST_DEPLOYMENT.md
index aee28b7..68c0339 100644
--- a/infrastructure-provisioning/scripts/POST_DEPLOYMENT.md
+++ b/infrastructure-provisioning/scripts/POST_DEPLOYMENT.md
@@ -1,4 +1,4 @@
-### Prerequisites for DLab post-deployment
+### Prerequisites for DataLab post-deployment
 
 - Service account with following roles:
 ```
@@ -14,7 +14,7 @@
 BigQuery Job User
 ```
 - Google Cloud Storage JSON API should be enabled
-- Keycloak server with specific client for Dlab UI (could be dpeloyed with Kecylaok deployment script)
+- Keycloak server with specific client for DataLab UI (could be dpeloyed with Kecylaok deployment script)
 
 Service account should be created manually and attached to the instance with post-deployment script.
 
@@ -24,7 +24,7 @@
 
 - Connect to the instance via SSH and run the following commands:
 ```
-/usr/bin/python /opt/dlab/sources/infrastructure-provisioning/scripts/post-deployment_configuration.py
+/usr/bin/python /opt/datalab/sources/infrastructure-provisioning/scripts/post-deployment_configuration.py
     --keycloak_realm_name <value>
     --keycloak_auth_server_url <value>
     --keycloak_client_name <value>
@@ -38,7 +38,7 @@
 |-------------------------------|-------------------------------------------------------------------------------------|
 | keycloak\_realm\_name         | Keycloak realm name                                                                 |
 | keycloak\_auth\_server\_url   | Url of Keycloak auth server                                                         |
-| keycloak\_client\_name        | Name of client for Dlab UI                                                          |
-| keycloak\_client\_secret      | Secret of client for Dlab UI                                                        |
+| keycloak\_client\_name        | Name of client for DataLab UI                                                          |
+| keycloak\_client\_secret      | Secret of client for DataLab UI                                                        |
 | kkeycloak\_user               | Keycloak user with administrator permissions                                        |
 | keycloak\_admin\_password     | Password for Keycloak user with administrator permissions                           |
\ No newline at end of file
diff --git a/infrastructure-provisioning/scripts/deploy_datalab.py b/infrastructure-provisioning/scripts/deploy_datalab.py
new file mode 100644
index 0000000..e3bdd4c
--- /dev/null
+++ b/infrastructure-provisioning/scripts/deploy_datalab.py
@@ -0,0 +1,242 @@
+#!/usr/bin/python3
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+
+import argparse
+import os
+import subprocess
+from fabric import *
+from invoke import task
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--conf_service_base_name', type=str, help='unique name for DataLab environment')
+parser.add_argument('--conf_network_type', type=str, default='',
+                    help='Define in which network DataLab will be deployed. '
+                         'Possible options: public|private')
+parser.add_argument('--conf_vpc_cidr', type=str, default='', help='CIDR of VPC')
+parser.add_argument('--conf_vpc2_cidr', type=str, default='', help='CIDR of secondary VPC')
+parser.add_argument('--conf_allowed_ip_cidr', type=str, default='', help='Comma-separated CIDR of IPs which will have '
+                                                                         'access to SSN')
+parser.add_argument('--conf_user_subnets_range', type=str, default='', help='Range of subnets which will be using for '
+                                                                            'users environments. For example: '
+                                                                            '10.10.0.0/24 - 10.10.10.0/24')
+parser.add_argument('--conf_private_subnet_prefix', type=str, default='24', help='Private subnet prefix')
+parser.add_argument('--conf_additional_tags', type=str, default='', help='Additional tags in format '
+                                                                         '"Key1:Value1;Key2:Value2"')
+parser.add_argument('--conf_image_enabled', type=str, default='', help='Enable or Disable creating image at first time')
+parser.add_argument('--aws_user_predefined_s3_policies', type=str, default='', help='Predefined policies for users '
+                                                                                    'instances')
+parser.add_argument('--aws_access_key', type=str, default='', help='AWS Access Key ID')
+parser.add_argument('--aws_secret_access_key', type=str, default='', help='AWS Secret Access Key')
+parser.add_argument('--aws_region', type=str, default='', help='AWS region')
+parser.add_argument('--aws_zone', type=str, default='', help='AWS zone')
+parser.add_argument('--azure_region', type=str, default='', help='Azure region')
+parser.add_argument('--gcp_region', type=str, default='', help='GCP region')
+parser.add_argument('--gcp_zone', type=str, default='', help='GCP zone')
+parser.add_argument('--conf_os_family', type=str, default='',
+                    help='Operating system type. Available options: debian, redhat')
+parser.add_argument('--conf_cloud_provider', type=str, default='',
+                    help='Where DataLab should be deployed. Available options: aws, azure, gcp')
+parser.add_argument('--ssn_hosted_zone_name', type=str, default='', help='Name of hosted zone')
+parser.add_argument('--ssn_hosted_zone_id', type=str, default='', help='ID of hosted zone')
+parser.add_argument('--ssn_subdomain', type=str, default='', help='Subdomain name')
+parser.add_argument('--ssn_assume_role_arn', type=str, default='', help='Role ARN for creating Route53 record in '
+                                                                        'different AWS account')
+parser.add_argument('--ssl_cert_path', type=str, default='', help='Full path to SSL certificate')
+parser.add_argument('--ssl_key_path', type=str, default='', help='Full path to key for SSL certificate')
+parser.add_argument('--aws_vpc_id', type=str, default='', help='AWS VPC ID')
+parser.add_argument('--conf_duo_vpc_enable', type=str, default='false', help='Duo VPC scheme enable(true|false)')
+parser.add_argument('--aws_vpc2_id', type=str, default='', help='Secondary AWS VPC ID')
+parser.add_argument('--aws_peering_id', type=str, default='', help='Amazon peering connection id')
+parser.add_argument('--azure_vpc_name', type=str, default='', help='Azure VPC Name')
+parser.add_argument('--gcp_vpc_name', type=str, default='', help='GCP VPC Name')
+parser.add_argument('--aws_subnet_id', type=str, default='', help='AWS Subnet ID')
+parser.add_argument('--azure_subnet_name', type=str, default='', help='Azure Subnet Name')
+parser.add_argument('--gcp_subnet_name', type=str, default='', help='GCP Subnet Name')
+parser.add_argument('--aws_security_groups_ids', type=str, default='', help='One of more comma-separated Security '
+                                                                            'groups IDs for SSN')
+parser.add_argument('--azure_security_group_name', type=str, default='', help='One Security'
+                                                                              'group name for SSN')
+parser.add_argument('--azure_edge_security_group_name', type=str, default='', help='One Security '
+                                                                              'group name for Edge node')
+parser.add_argument('--gcp_firewall_name', type=str, default='', help='One of more comma-separated GCP Firewall rules '
+                                                                      'for SSN')
+parser.add_argument('--key_path', type=str, default='', help='Path to admin key (WITHOUT KEY NAME)')
+parser.add_argument('--conf_key_name', type=str, default='', help='Admin key name (WITHOUT ".pem")')
+parser.add_argument('--workspace_path', type=str, default='', help='Admin key name (WITHOUT ".pem")')
+parser.add_argument('--conf_tag_resource_id', type=str, default='datalab', help='The name of user tag')
+parser.add_argument('--conf_billing_tag', type=str, default='datalab', help='Billing tag')
+parser.add_argument('--aws_ssn_instance_size', type=str, default='t2.large', help='The SSN instance shape')
+parser.add_argument('--azure_ssn_instance_size', type=str, default='Standard_DS2_v2', help='The SSN instance shape')
+parser.add_argument('--gcp_ssn_instance_size', type=str, default='n1-standard-2', help='The SSN instance shape')
+parser.add_argument('--aws_account_id', type=str, default='', help='The ID of Amazon account')
+parser.add_argument('--aws_billing_bucket', type=str, default='', help='The name of S3 bucket where billing reports '
+                                                                       'will be placed.')
+parser.add_argument('--aws_job_enabled', type=str, default='false', help='Billing format. Available options: '
+                                                                         'true (aws), false(epam)')
+parser.add_argument('--aws_report_path', type=str, default='', help='The path to billing reports directory in S3 '
+                                                                    'bucket')
+parser.add_argument('--azure_resource_group_name', type=str, default='', help='Name of Resource group in Azure')
+parser.add_argument('--azure_auth_path', type=str, default='', help='Full path to Azure credentials JSON file')
+parser.add_argument('--azure_datalake_enable', type=str, default='', help='Provision DataLake storage account')
+parser.add_argument('--azure_ad_group_id', type=str, default='', help='ID of Azure AD group')
+parser.add_argument('--azure_offer_number', type=str, default='', help='Azure offer number')
+parser.add_argument('--azure_currency', type=str, default='', help='Azure currency code')
+parser.add_argument('--azure_locale', type=str, default='', help='Azure locale')
+parser.add_argument('--azure_application_id', type=str, default='', help='Azure login application ID')
+parser.add_argument('--azure_validate_permission_scope', type=str, default='true', help='Azure permission scope '
+                                                                                        'validation(true|false).')
+parser.add_argument('--azure_oauth2_enabled', type=str, default='false', help='Using OAuth2 for logging in DataLab')
+parser.add_argument('--azure_region_info', type=str, default='', help='Azure region info')
+parser.add_argument('--azure_source_vpc_name', type=str, default='', help='Azure VPC source Name')
+parser.add_argument('--azure_source_resource_group_name', type=str, default='', help='Azure source resource group')
+parser.add_argument('--gcp_project_id', type=str, default='', help='The project ID in Google Cloud Platform')
+parser.add_argument('--gcp_service_account_path', type=str, default='', help='The project ID in Google Cloud Platform')
+parser.add_argument('--datalab_id', type=str, default="'resource_tags_user_user_tag'",
+                    help='Column name in report file that contains '
+                         'datalab id tag')
+parser.add_argument('--usage_date', type=str, default='line_item_usage_start_date',
+                    help='Column name in report file that contains '
+                         'usage date tag')
+parser.add_argument('--product', type=str, default='product_product_name',
+                    help='Column name in report file that contains '
+                         'product name tag')
+parser.add_argument('--usage_type', type=str, default='line_item_usage_type',
+                    help='Column name in report file that contains '
+                         'usage type tag')
+parser.add_argument('--usage', type=str, default='line_item_usage_amount',
+                    help='Column name in report file that contains '
+                         'usage tag')
+parser.add_argument('--cost', type=str, default='line_item_blended_cost',
+                    help='Column name in report file that contains cost tag')
+parser.add_argument('--resource_id', type=str, default='line_item_resource_id',
+                    help='Column name in report file that contains '
+                         'datalab resource id tag')
+parser.add_argument('--ldap_hostname', type=str, default='localhost', help='Ldap instance hostname')
+parser.add_argument('--ldap_dn', type=str, default='dc=example,dc=com',
+                    help='Ldap distinguished name')
+parser.add_argument('--ldap_ou', type=str, default='ou=People', help='Ldap organisation unit')
+parser.add_argument('--ldap_service_username', type=str, default='cn=service-user', help='Ldap service user name')
+parser.add_argument('--ldap_service_password', type=str, default='service-user-password',
+                    help='Ldap password for admin user')
+parser.add_argument('--keycloak_realm_name', type=str, default='datalab', help='Keycloak Realm name')
+parser.add_argument('--keycloak_auth_server_url', type=str, default='datalab', help='Keycloak auth server URL')
+parser.add_argument('--keycloak_client_name', type=str, default='datalab', help='Keycloak client name')
+parser.add_argument('--keycloak_client_secret', type=str, default='datalab', help='Keycloak client secret')
+parser.add_argument('--keycloak_user', type=str, default='datalab', help='Keycloak user')
+parser.add_argument('--keycloak_user_password', type=str, default='keycloak-user-password',
+                    help='Keycloak user password')
+parser.add_argument('--tags', type=str, default='line_item_operation,line_item_line_item_description',
+                    help='Column name in report file that '
+                         'contains tags')
+parser.add_argument('--billing_dataset_name', type=str, default='', help='Name of GCP dataset (BigQuery service)'
+                                                                         ' for billing')
+parser.add_argument('--default_endpoint_name', type=str, default='local', help='Name of localhost provisioning service,'
+                                                                               'that created by default')
+parser.add_argument('--conf_stepcerts_enabled', type=str, default='false', help='Enable or disable step certificates')
+parser.add_argument('--conf_stepcerts_root_ca', type=str, default='', help='Step root CA')
+parser.add_argument('--conf_stepcerts_kid', type=str, default='', help='Step KID')
+parser.add_argument('--conf_stepcerts_kid_password', type=str, default='', help='Step KID password')
+parser.add_argument('--conf_stepcerts_ca_url', type=str, default='', help='Step CA URL')
+parser.add_argument('--conf_letsencrypt_enabled', type=str, default='false',
+                    help='Enable or disable Let`s Encrypt certificates')
+parser.add_argument('--conf_repository_user', type=str, default='',
+                    help='user to access repository (used for jars download)')
+parser.add_argument('--conf_release_tag', type=str, default='2.5',
+                    help='tag used for jars download')
+parser.add_argument('--conf_repository_pass', type=str, default='',
+                    help='password to access repository (used for jars download)')
+parser.add_argument('--conf_repository_address', type=str, default='',
+                    help='address to access repository (used for jars download)')
+parser.add_argument('--conf_letsencrypt_domain_name', type=str, default='', help='Domain names to apply. '
+                                                                                 'For multiple domains enter a comma separated list of domains as a parameter'
+                                                                                 'ssn.domain_name will be used for ssn_node, DNS A record have to exist during deployment')
+parser.add_argument('--conf_letsencrypt_email', type=str, default='', help='Email that will be entered during '
+                                                                           'certificate obtaining and can be user for urgent renewal and security notices. '
+                                                                           'Use comma to register multiple emails, e.g. u1@example.com,u2@example.com.')
+parser.add_argument('--action', required=True, type=str, default='', choices=['build', 'deploy', 'create', 'terminate'],
+                    help='Available options: build, deploy, create, terminate')
+args = parser.parse_args()
+
+
+def generate_docker_command():
+    docker_command = ''
+    command = []
+    if args.action == 'terminate':
+        command.append('sudo docker run -i ')
+    else:
+        command.append('sudo docker run -i -v {0}{1}.pem:/root/keys/{1}.pem -v {2}/web_app:/root/web_app '.
+                       format(args.key_path, args.conf_key_name, args.workspace_path))
+    if args.conf_cloud_provider == 'azure':
+        command.append('-v {}:/root/azure_auth.json '.format(args.azure_auth_path))
+    elif args.conf_cloud_provider == 'gcp':
+        command.append('-v {}:/root/service_account.json '.format(args.gcp_service_account_path))
+    if args.ssl_cert_path != '' and args.ssl_key_path != '':
+        command.append('-v {}:/root/certs/datalab.crt -v {}:/root/certs/datalab.key '.format(args.ssl_cert_path,
+                                                                                             args.ssl_key_path))
+    attrs = vars(args)
+    skipped_parameters = ['action', 'key_path', 'workspace_path', 'gcp_service_account_path', 'ssl_cert_path',
+                          'ssl_key_path']
+    for i in attrs:
+        if attrs[i] and i not in skipped_parameters:
+            command.append("-e '{}={}' ".format(i, attrs[i]))
+    command.append('-e "conf_resource=ssn" ')
+    command.append('docker.datalab-ssn ')
+    command.append('--action {} '.format(args.action))
+    return docker_command.join(command)
+
+
+def build_docker_images(args):
+    # Building base and ssn docker images
+    subprocess.run('cd {2}; sudo docker build --build-arg OS={0} --build-arg SRC_PATH="infrastructure-provisioning/src/" --file '
+              'infrastructure-provisioning/src/general/files/{1}/'
+              'base_Dockerfile -t docker.datalab-base .'.format(args.conf_os_family, args.conf_cloud_provider, args.workspace_path), shell=True, check=True)
+    subprocess.run('cd {2}; sudo docker build --build-arg OS={0} --file infrastructure-provisioning/src/general/files/{1}/'
+              'ssn_Dockerfile -t docker.datalab-ssn .'.format(args.conf_os_family, args.conf_cloud_provider, args.workspace_path), shell=True, check=True)
+
+
+def deploy_datalab(args):
+    # Creating SSN node
+    docker_command = generate_docker_command()
+    subprocess.run(docker_command, shell=True, check=True)
+
+
+def terminate_datalab(args):
+    # Dropping datalab environment with selected infrastructure tag
+    docker_command = generate_docker_command()
+    subprocess.run(docker_command, shell=True, check=True)
+
+
+if __name__ == "__main__":
+    if not args.workspace_path:
+        print("Workspace path isn't set, using current directory: {}".format(os.environ['PWD']))
+        args.workspace_path = os.environ['PWD']
+    if args.action == 'build':
+        build_docker_images(args)
+    elif args.action == 'deploy':
+        deploy_datalab(args)
+    elif args.action == 'create':
+        build_docker_images(args)
+        deploy_datalab(args)
+    elif args.action == 'terminate':
+        build_docker_images(args)
+        terminate_datalab(args)
diff --git a/infrastructure-provisioning/scripts/deploy_dlab.py b/infrastructure-provisioning/scripts/deploy_dlab.py
deleted file mode 100644
index 40b1485..0000000
--- a/infrastructure-provisioning/scripts/deploy_dlab.py
+++ /dev/null
@@ -1,213 +0,0 @@
-#!/usr/bin/python
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-
-
-from fabric.api import *
-import argparse
-import os
-
-parser = argparse.ArgumentParser()
-parser.add_argument('--conf_service_base_name', type=str, help='unique name for DLab environment')
-parser.add_argument('--conf_network_type', type=str, default='', help='Define in which network DLab will be deployed. '
-                                                                      'Possible options: public|private')
-parser.add_argument('--conf_vpc_cidr', type=str, default='', help='CIDR of VPC')
-parser.add_argument('--conf_vpc2_cidr', type=str, default='', help='CIDR of secondary VPC')
-parser.add_argument('--conf_allowed_ip_cidr', type=str, default='', help='Comma-separated CIDR of IPs which will have '
-                                                                         'access to SSN')
-parser.add_argument('--conf_user_subnets_range', type=str, default='', help='Range of subnets which will be using for '
-                                                                            'users environments. For example: '
-                                                                            '10.10.0.0/24 - 10.10.10.0/24')
-parser.add_argument('--conf_private_subnet_prefix', type=str, default='24', help='Private subnet prefix')
-parser.add_argument('--conf_additional_tags', type=str, default='', help='Additional tags in format '
-                                                                         '"Key1:Value1;Key2:Value2"')
-parser.add_argument('--conf_image_enabled', type=str, default='', help='Enable or Disable creating image at first time')
-parser.add_argument('--aws_user_predefined_s3_policies', type=str, default='', help='Predefined policies for users '
-                                                                                    'instances')
-parser.add_argument('--aws_access_key', type=str, default='', help='AWS Access Key ID')
-parser.add_argument('--aws_secret_access_key', type=str, default='', help='AWS Secret Access Key')
-parser.add_argument('--aws_region', type=str, default='', help='AWS region')
-parser.add_argument('--aws_zone', type=str, default='', help='AWS zone')
-parser.add_argument('--azure_region', type=str, default='', help='Azure region')
-parser.add_argument('--gcp_region', type=str, default='', help='GCP region')
-parser.add_argument('--gcp_zone', type=str, default='', help='GCP zone')
-parser.add_argument('--conf_os_family', type=str, default='',
-                    help='Operating system type. Available options: debian, redhat')
-parser.add_argument('--conf_cloud_provider', type=str, default='',
-                    help='Where DLab should be deployed. Available options: aws, azure, gcp')
-parser.add_argument('--ssn_hosted_zone_name', type=str, default='', help='Name of hosted zone')
-parser.add_argument('--ssn_hosted_zone_id', type=str, default='', help='ID of hosted zone')
-parser.add_argument('--ssn_subdomain', type=str, default='', help='Subdomain name')
-parser.add_argument('--ssn_assume_role_arn', type=str, default='', help='Role ARN for creating Route53 record in '
-                                                                        'different AWS account')
-parser.add_argument('--ssl_cert_path', type=str, default='', help='Full path to SSL certificate')
-parser.add_argument('--ssl_key_path', type=str, default='', help='Full path to key for SSL certificate')
-parser.add_argument('--aws_vpc_id', type=str, default='', help='AWS VPC ID')
-parser.add_argument('--conf_duo_vpc_enable', type=str, default='false', help='Duo VPC scheme enable(true|false)')
-parser.add_argument('--aws_vpc2_id', type=str, default='', help='Secondary AWS VPC ID')
-parser.add_argument('--aws_peering_id', type=str, default='', help='Amazon peering connection id')
-parser.add_argument('--azure_vpc_name', type=str, default='', help='Azure VPC Name')
-parser.add_argument('--gcp_vpc_name', type=str, default='', help='GCP VPC Name')
-parser.add_argument('--aws_subnet_id', type=str, default='', help='AWS Subnet ID')
-parser.add_argument('--azure_subnet_name', type=str, default='', help='Azure Subnet Name')
-parser.add_argument('--gcp_subnet_name', type=str, default='', help='GCP Subnet Name')
-parser.add_argument('--aws_security_groups_ids', type=str, default='', help='One of more comma-separated Security '
-                                                                            'groups IDs for SSN')
-parser.add_argument('--azure_security_group_name', type=str, default='', help='One of more comma-separated Security '
-                                                                              'groups names for SSN')
-parser.add_argument('--gcp_firewall_name', type=str, default='', help='One of more comma-separated GCP Firewall rules '
-                                                                      'for SSN')
-parser.add_argument('--key_path', type=str, default='', help='Path to admin key (WITHOUT KEY NAME)')
-parser.add_argument('--conf_key_name', type=str, default='', help='Admin key name (WITHOUT ".pem")')
-parser.add_argument('--workspace_path', type=str, default='', help='Admin key name (WITHOUT ".pem")')
-parser.add_argument('--conf_tag_resource_id', type=str, default='dlab', help='The name of user tag')
-parser.add_argument('--conf_billing_tag', type=str, default='dlab', help='Billing tag')
-parser.add_argument('--aws_ssn_instance_size', type=str, default='t2.large', help='The SSN instance shape')
-parser.add_argument('--azure_ssn_instance_size', type=str, default='Standard_DS2_v2', help='The SSN instance shape')
-parser.add_argument('--gcp_ssn_instance_size', type=str, default='n1-standard-2', help='The SSN instance shape')
-parser.add_argument('--aws_account_id', type=str, default='', help='The ID of Amazon account')
-parser.add_argument('--aws_billing_bucket', type=str, default='', help='The name of S3 bucket where billing reports '
-                                                                       'will be placed.')
-parser.add_argument('--aws_job_enabled', type=str, default='false', help='Billing format. Available options: '
-                                                                         'true (aws), false(epam)')
-parser.add_argument('--aws_report_path', type=str, default='', help='The path to billing reports directory in S3 '
-                                                                    'bucket')
-parser.add_argument('--azure_resource_group_name', type=str, default='', help='Name of Resource group in Azure')
-parser.add_argument('--azure_auth_path', type=str, default='', help='Full path to Azure credentials JSON file')
-parser.add_argument('--azure_datalake_enable', type=str, default='', help='Provision DataLake storage account')
-parser.add_argument('--azure_ad_group_id', type=str, default='', help='ID of Azure AD group')
-parser.add_argument('--azure_offer_number', type=str, default='', help='Azure offer number')
-parser.add_argument('--azure_currency', type=str, default='', help='Azure currency code')
-parser.add_argument('--azure_locale', type=str, default='', help='Azure locale')
-parser.add_argument('--azure_application_id', type=str, default='', help='Azure login application ID')
-parser.add_argument('--azure_validate_permission_scope', type=str, default='true', help='Azure permission scope '
-                                                                                        'validation(true|false).')
-parser.add_argument('--azure_oauth2_enabled', type=str, default='false', help='Using OAuth2 for logging in DLab')
-parser.add_argument('--azure_region_info', type=str, default='', help='Azure region info')
-parser.add_argument('--azure_source_vpc_name', type=str, default='', help='Azure VPC source Name')
-parser.add_argument('--azure_source_resource_group_name', type=str, default='', help='Azure source resource group')
-parser.add_argument('--gcp_project_id', type=str, default='', help='The project ID in Google Cloud Platform')
-parser.add_argument('--gcp_service_account_path', type=str, default='', help='The project ID in Google Cloud Platform')
-parser.add_argument('--dlab_id', type=str, default="'resource_tags_user_user_tag'", help='Column name in report file that contains '
-                                                                           'dlab id tag')
-parser.add_argument('--usage_date', type=str, default='line_item_usage_start_date', help='Column name in report file that contains '
-                                                                             'usage date tag')
-parser.add_argument('--product', type=str, default='product_product_name', help='Column name in report file that contains '
-                                                                       'product name tag')
-parser.add_argument('--usage_type', type=str, default='line_item_usage_type', help='Column name in report file that contains '
-                                                                        'usage type tag')
-parser.add_argument('--usage', type=str, default='line_item_usage_amount', help='Column name in report file that contains '
-                                                                       'usage tag')
-parser.add_argument('--cost', type=str, default='line_item_blended_cost', help='Column name in report file that contains cost tag')
-parser.add_argument('--resource_id', type=str, default='line_item_resource_id', help='Column name in report file that contains '
-                                                                          'dlab resource id tag')
-parser.add_argument('--ldap_hostname', type=str, default='localhost', help='Ldap instance hostname')
-parser.add_argument('--ldap_dn', type=str, default='dc=example,dc=com',
-                    help='Ldap distinguished name')
-parser.add_argument('--ldap_ou', type=str, default='ou=People', help='Ldap organisation unit')
-parser.add_argument('--ldap_service_username', type=str, default='cn=service-user', help='Ldap service user name')
-parser.add_argument('--ldap_service_password', type=str, default='service-user-password',
-                    help='Ldap password for admin user')
-parser.add_argument('--keycloak_realm_name', type=str, default='dlab', help='Keycloak Realm name')
-parser.add_argument('--keycloak_auth_server_url', type=str, default='dlab', help='Keycloak auth server URL')
-parser.add_argument('--keycloak_client_name', type=str, default='dlab', help='Keycloak client name')
-parser.add_argument('--keycloak_client_secret', type=str, default='dlab', help='Keycloak client secret')
-parser.add_argument('--keycloak_user', type=str, default='dlab', help='Keycloak user')
-parser.add_argument('--keycloak_user_password', type=str, default='keycloak-user-password', help='Keycloak user password')
-parser.add_argument('--tags', type=str, default='line_item_operation,line_item_line_item_description', help='Column name in report file that '
-                                                                                  'contains tags')
-parser.add_argument('--billing_dataset_name', type=str, default='', help='Name of GCP dataset (BigQuery service)'
-                                                                         ' for billing')
-parser.add_argument('--default_endpoint_name', type=str, default='local', help='Name of localhost provisioning service,'
-                                                                               'that created by default')
-parser.add_argument('--conf_stepcerts_enabled', type=str, default='false', help='Enable or disable step certificates')
-parser.add_argument('--conf_stepcerts_root_ca', type=str, default='', help='Step root CA')
-parser.add_argument('--conf_stepcerts_kid', type=str, default='', help='Step KID')
-parser.add_argument('--conf_stepcerts_kid_password', type=str, default='', help='Step KID password')
-parser.add_argument('--conf_stepcerts_ca_url', type=str, default='', help='Step CA URL')
-parser.add_argument('--action', required=True, type=str, default='', choices=['build', 'deploy', 'create', 'terminate'],
-                    help='Available options: build, deploy, create, terminate')
-args = parser.parse_args()
-
-
-def generate_docker_command():
-    docker_command = ''
-    command = []
-    if args.action == 'terminate':
-        command.append('sudo docker run -i ')
-    else:
-        command.append('sudo docker run -i -v {0}{1}.pem:/root/keys/{1}.pem -v {2}/web_app:/root/web_app '.
-                       format(args.key_path, args.conf_key_name, args.workspace_path))
-    if args.conf_cloud_provider == 'azure':
-        command.append('-v {}:/root/azure_auth.json '.format(args.azure_auth_path))
-    elif args.conf_cloud_provider == 'gcp':
-        command.append('-v {}:/root/service_account.json '.format(args.gcp_service_account_path))
-    if args.ssl_cert_path != '' and args.ssl_key_path != '':
-        command.append('-v {}:/root/certs/dlab.crt -v {}:/root/certs/dlab.key '.format(args.ssl_cert_path,
-                                                                                       args.ssl_key_path))
-    attrs = vars(args)
-    skipped_parameters = ['action', 'key_path', 'workspace_path', 'gcp_service_account_path', 'ssl_cert_path',
-                          'ssl_key_path']
-    for i in attrs:
-        if attrs[i] and i not in skipped_parameters:
-            command.append("-e '{}={}' ".format(i, attrs[i]))
-    command.append('-e "conf_resource=ssn" ')
-    command.append('docker.dlab-ssn ')
-    command.append('--action {} '.format(args.action))
-    return docker_command.join(command)
-
-
-def build_docker_images(args):
-    # Building base and ssn docker images
-    with lcd(args.workspace_path):
-        local('sudo docker build --build-arg OS={0} --build-arg SRC_PATH="infrastructure-provisioning/src/" --file '
-              'infrastructure-provisioning/src/general/files/{1}/'
-              'base_Dockerfile -t docker.dlab-base .'.format(args.conf_os_family, args.conf_cloud_provider))
-        local('sudo docker build --build-arg OS={0} --file infrastructure-provisioning/src/general/files/{1}/'
-              'ssn_Dockerfile -t docker.dlab-ssn .'.format(args.conf_os_family, args.conf_cloud_provider))
-
-
-def deploy_dlab(args):
-    # Creating SSN node
-    docker_command = generate_docker_command()
-    local(docker_command)
-
-
-def terminate_dlab(args):
-    # Dropping Dlab environment with selected infrastructure tag
-    docker_command = generate_docker_command()
-    local(docker_command)
-
-
-if __name__ == "__main__":
-    if not args.workspace_path:
-        print("Workspace path isn't set, using current directory: {}".format(os.environ['PWD']))
-        args.workspace_path = os.environ['PWD']
-    if args.action == 'build':
-        build_docker_images(args)
-    elif args.action == 'deploy':
-        deploy_dlab(args)
-    elif args.action == 'create':
-        build_docker_images(args)
-        deploy_dlab(args)
-    elif args.action == 'terminate':
-        build_docker_images(args)
-        terminate_dlab(args)
diff --git a/infrastructure-provisioning/scripts/deploy_keycloak/deploy_keycloak.py b/infrastructure-provisioning/scripts/deploy_keycloak/deploy_keycloak.py
index dce8a86..7547985 100644
--- a/infrastructure-provisioning/scripts/deploy_keycloak/deploy_keycloak.py
+++ b/infrastructure-provisioning/scripts/deploy_keycloak/deploy_keycloak.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,11 +22,13 @@
 # ******************************************************************************
 
 import logging
-from fabric.api import *
+from fabric import *
 import argparse
 import sys
 import os
-from fabric.contrib.files import exists
+import subprocess
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--os_user', type=str, default='')
@@ -44,48 +46,48 @@
 private_ip_address = "127.0.0.1"
 
 def ensure_jre_jdk(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/jre_jdk_ensured'):
+    if not exists(conn,'/home/' + os_user + '/.ensure_dir/jre_jdk_ensured'):
         try:
-            sudo('mkdir -p /home/' + os_user + '/.ensure_dir')
-            sudo('apt-get update')
-            sudo('apt-get install -y default-jre')
-            sudo('apt-get install -y default-jdk')
-            sudo('touch /home/' + os_user + '/.ensure_dir/jre_jdk_ensured')
+            conn.sudo('mkdir -p /home/' + os_user + '/.ensure_dir')
+            conn.sudo('apt-get update')
+            conn.sudo('apt-get install -y default-jre')
+            conn.sudo('apt-get install -y default-jdk')
+            conn.sudo('touch /home/' + os_user + '/.ensure_dir/jre_jdk_ensured')
         except:
             sys.exit(1)
 
 def configure_keycloak():
-    sudo('wget https://downloads.jboss.org/keycloak/' + keycloak_version + '/keycloak-' + keycloak_version + '.tar.gz -O /tmp/keycloak-' + keycloak_version + '.tar.gz')
-    sudo('tar -zxvf /tmp/keycloak-' + keycloak_version + '.tar.gz -C /opt/')
-    sudo('ln -s /opt/keycloak-' + keycloak_version + ' /opt/keycloak')
-    sudo('chown ' + args.os_user + ':' + args.os_user + ' -R /opt/keycloak-' + keycloak_version)
-    sudo('/opt/keycloak/bin/add-user-keycloak.sh -r master -u ' + args.keycloak_user + ' -p ' + args.keycloak_user_password) #create initial admin user in master realm
-    put(templates_dir + 'realm.json', '/tmp/' + args.keycloak_realm_name + '-realm.json')
-    put(templates_dir + 'keycloak.service', '/tmp/keycloak.service')
-    sudo("cp /tmp/keycloak.service /etc/systemd/system/keycloak.service")
-    sudo("sed -i 's|realm-name|" + args.keycloak_realm_name + "|' /tmp/" + args.keycloak_realm_name + "-realm.json")
-    sudo("sed -i 's|OS_USER|" + args.os_user + "|' /etc/systemd/system/keycloak.service")
-    sudo("sed -i 's|private_ip_address|" + private_ip_address + "|' /etc/systemd/system/keycloak.service")
-    sudo("sed -i 's|keycloak_realm_name|" + args.keycloak_realm_name + "|' /etc/systemd/system/keycloak.service")
-    sudo("systemctl daemon-reload")
-    sudo("systemctl enable keycloak")
-    sudo("systemctl start keycloak")
+    conn.sudo('wget https://downloads.jboss.org/keycloak/' + keycloak_version + '/keycloak-' + keycloak_version + '.tar.gz -O /tmp/keycloak-' + keycloak_version + '.tar.gz')
+    conn.sudo('tar -zxvf /tmp/keycloak-' + keycloak_version + '.tar.gz -C /opt/')
+    conn.sudo('ln -s /opt/keycloak-' + keycloak_version + ' /opt/keycloak')
+    conn.sudo('chown ' + args.os_user + ':' + args.os_user + ' -R /opt/keycloak-' + keycloak_version)
+    conn.sudo('/opt/keycloak/bin/add-user-keycloak.sh -r master -u ' + args.keycloak_user + ' -p ' + args.keycloak_user_password) #create initial admin user in master realm
+    conn.put(templates_dir + 'realm.json', '/tmp/' + args.keycloak_realm_name + '-realm.json')
+    conn.put(templates_dir + 'keycloak.service', '/tmp/keycloak.service')
+    conn.sudo("cp /tmp/keycloak.service /etc/systemd/system/keycloak.service")
+    conn.sudo("sed -i 's|realm-name|" + args.keycloak_realm_name + "|' /tmp/" + args.keycloak_realm_name + "-realm.json")
+    conn.sudo("sed -i 's|OS_USER|" + args.os_user + "|' /etc/systemd/system/keycloak.service")
+    conn.sudo("sed -i 's|private_ip_address|" + private_ip_address + "|' /etc/systemd/system/keycloak.service")
+    conn.sudo("sed -i 's|keycloak_realm_name|" + args.keycloak_realm_name + "|' /etc/systemd/system/keycloak.service")
+    conn.sudo("systemctl daemon-reload")
+    conn.sudo("systemctl enable keycloak")
+    conn.sudo("systemctl start keycloak")
 
 def configure_nginx():
-    sudo('apt install -y nginx')
-    put(templates_dir + 'nginx.conf', '/tmp/nginx.conf')
-    sudo("cp /tmp/nginx.conf /etc/nginx/conf.d/nginx.conf")
-    sudo("sed -i 's|80|81|' /etc/nginx/sites-enabled/default")
-    sudo("sed -i 's|external_port|" + external_port + "|' /etc/nginx/conf.d/nginx.conf")
-    sudo("sed -i 's|internal_port|" + internal_port + "|' /etc/nginx/conf.d/nginx.conf")
-    sudo("sed -i 's|private_ip_address|" + private_ip_address + "|' /etc/nginx/conf.d/nginx.conf")
-    sudo("systemctl daemon-reload")
-    sudo("systemctl enable nginx")
-    sudo("systemctl restart nginx")
+    conn.sudo('apt install -y nginx')
+    conn.put(templates_dir + 'nginx.conf', '/tmp/nginx.conf')
+    conn.sudo("cp /tmp/nginx.conf /etc/nginx/conf.d/nginx.conf")
+    conn.sudo("sed -i 's|80|81|' /etc/nginx/sites-enabled/default")
+    conn.sudo("sed -i 's|external_port|" + external_port + "|' /etc/nginx/conf.d/nginx.conf")
+    conn.sudo("sed -i 's|internal_port|" + internal_port + "|' /etc/nginx/conf.d/nginx.conf")
+    conn.sudo("sed -i 's|private_ip_address|" + private_ip_address + "|' /etc/nginx/conf.d/nginx.conf")
+    conn.sudo("systemctl daemon-reload")
+    conn.sudo("systemctl enable nginx")
+    conn.sudo("systemctl restart nginx")
 
 if __name__ == "__main__":
-    local("sudo mkdir /logs/keycloak -p")
-    local('sudo chown ' + args.os_user + ':' + args.os_user + ' -R /logs/keycloak')
+    subprocess.run("sudo mkdir /logs/keycloak -p", shell=True, check=True)
+    subprocess.run('sudo chown ' + args.os_user + ':' + args.os_user + ' -R /logs/keycloak', shell=True, check=True)
     local_log_filename = "keycloak_deployment_script.log"
     local_log_filepath = "/logs/keycloak/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
diff --git a/infrastructure-provisioning/scripts/deploy_repository/deploy_repository.py b/infrastructure-provisioning/scripts/deploy_repository/deploy_repository.py
index 3864229..c98e67a 100644
--- a/infrastructure-provisioning/scripts/deploy_repository/deploy_repository.py
+++ b/infrastructure-provisioning/scripts/deploy_repository/deploy_repository.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -20,17 +20,18 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
 import argparse
 import boto3
-import traceback
-import sys
 import json
-import time
-import string
 import random
-from ConfigParser import SafeConfigParser
+import string
+import sys
+import time
+import traceback
+from ConfigParser import ConfigParser
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--service_base_name', required=True, type=str, default='',
@@ -42,9 +43,9 @@
 parser.add_argument('--subnet_id', type=str, default='', help='AWS Subnet ID')
 parser.add_argument('--subnet_cidr', type=str, default='172.31.0.0/24', help='Cidr of subnet')
 parser.add_argument('--sg_id', type=str, default='', help='AWS VPC ID')
-parser.add_argument('--billing_tag', type=str, default='product:dlab', help='Tag in format: "Key1:Value1"')
+parser.add_argument('--billing_tag', type=str, default='product:datalab', help='Tag in format: "Key1:Value1"')
 parser.add_argument('--additional_tags', type=str, default='', help='Tags in format: "Key1:Value1;Key2:Value2"')
-parser.add_argument('--tag_resource_id', type=str, default='dlab', help='The name of user tag')
+parser.add_argument('--tag_resource_id', type=str, default='datalab', help='The name of user tag')
 parser.add_argument('--allowed_ip_cidr', type=str, default='', help='Comma-separated CIDR of IPs which will have '
                                                                     'access to the instance')
 parser.add_argument('--key_name', type=str, default='', help='Key name (WITHOUT ".pem")')
@@ -60,9 +61,9 @@
 parser.add_argument('--efs_id', type=str, default='', help="ID of AWS EFS")
 parser.add_argument('--primary_disk_size', type=str, default='30', help="Disk size of primary volume")
 parser.add_argument('--additional_disk_size', type=str, default='50', help="Disk size of additional volume")
-parser.add_argument('--dlab_conf_file_path', type=str, default='', help="Full path to DLab conf file")
+parser.add_argument('--datalab_conf_file_path', type=str, default='', help="Full path to DataLab conf file")
 parser.add_argument('--nexus_admin_password', type=str, default='', help="Password for Nexus admin user")
-parser.add_argument('--nexus_service_user_name', type=str, default='dlab-nexus', help="Nexus service user name")
+parser.add_argument('--nexus_service_user_name', type=str, default='datalab-nexus', help="Nexus service user name")
 parser.add_argument('--nexus_service_user_password', type=str, default='', help="Nexus service user password")
 parser.add_argument('--action', required=True, type=str, default='', help='Action: create or terminate')
 args = parser.parse_args()
@@ -780,30 +781,30 @@
 
 def ensure_ssh_user(initial_user):
     try:
-        if not exists('/home/{}/.ssh_user_ensured'.format(initial_user)):
-            sudo('useradd -m -G sudo -s /bin/bash {0}'.format(configuration['conf_os_user']))
-            sudo('echo "{} ALL = NOPASSWD:ALL" >> /etc/sudoers'.format(configuration['conf_os_user']))
-            sudo('mkdir /home/{}/.ssh'.format(configuration['conf_os_user']))
-            sudo('chown -R {0}:{0} /home/{1}/.ssh/'.format(initial_user, configuration['conf_os_user']))
-            sudo('cat /home/{0}/.ssh/authorized_keys > /home/{1}/.ssh/authorized_keys'.format(
+        if not exists(conn,'/home/{}/.ssh_user_ensured'.format(initial_user)):
+            conn.sudo('useradd -m -G sudo -s /bin/bash {0}'.format(configuration['conf_os_user']))
+            conn.sudo('echo "{} ALL = NOPASSWD:ALL" >> /etc/sudoers'.format(configuration['conf_os_user']))
+            conn.sudo('mkdir /home/{}/.ssh'.format(configuration['conf_os_user']))
+            conn.sudo('chown -R {0}:{0} /home/{1}/.ssh/'.format(initial_user, configuration['conf_os_user']))
+            conn.sudo('cat /home/{0}/.ssh/authorized_keys > /home/{1}/.ssh/authorized_keys'.format(
                 initial_user, configuration['conf_os_user']))
-            sudo('chown -R {0}:{0} /home/{0}/.ssh/'.format(configuration['conf_os_user']))
-            sudo('chmod 700 /home/{0}/.ssh'.format(configuration['conf_os_user']))
-            sudo('chmod 600 /home/{0}/.ssh/authorized_keys'.format(configuration['conf_os_user']))
-            sudo('mkdir /home/{}/.ensure_dir'.format(configuration['conf_os_user']))
-            sudo('touch /home/{}/.ssh_user_ensured'.format(initial_user))
+            conn.sudo('chown -R {0}:{0} /home/{0}/.ssh/'.format(configuration['conf_os_user']))
+            conn.sudo('chmod 700 /home/{0}/.ssh'.format(configuration['conf_os_user']))
+            conn.sudo('chmod 600 /home/{0}/.ssh/authorized_keys'.format(configuration['conf_os_user']))
+            conn.sudo('mkdir /home/{}/.ensure_dir'.format(configuration['conf_os_user']))
+            conn.sudo('touch /home/{}/.ssh_user_ensured'.format(initial_user))
     except Exception as err:
         traceback.print_exc(file=sys.stdout)
-        print('Error with creating dlab-user: {}'.format(str(err)))
+        print('Error with creating datalab-user: {}'.format(str(err)))
         raise Exception
 
 
 def install_java():
     try:
-        if not exists('/home/{}/.ensure_dir/java_ensured'.format(configuration['conf_os_user'])):
-            sudo('apt-get update')
-            sudo('apt-get install -y default-jdk ')
-            sudo('touch /home/{}/.ensure_dir/java_ensured'.format(configuration['conf_os_user']))
+        if not exists(conn,'/home/{}/.ensure_dir/java_ensured'.format(configuration['conf_os_user'])):
+            conn.sudo('apt-get update')
+            conn.sudo('apt-get install -y default-jdk ')
+            conn.sudo('touch /home/{}/.ensure_dir/java_ensured'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc(file=sys.stdout)
         print('Error with installing Java: {}'.format(str(err)))
@@ -812,16 +813,16 @@
 
 def install_groovy():
     try:
-        if not exists('/home/{}/.ensure_dir/groovy_ensured'.format(configuration['conf_os_user'])):
-            sudo('apt-get install -y unzip')
-            sudo('mkdir /usr/local/groovy')
-            sudo('wget https://bintray.com/artifact/download/groovy/maven/apache-groovy-binary-{0}.zip -O \
+        if not exists(conn,'/home/{}/.ensure_dir/groovy_ensured'.format(configuration['conf_os_user'])):
+            conn.sudo('apt-get install -y unzip')
+            conn.sudo('mkdir /usr/local/groovy')
+            conn.sudo('wget https://bintray.com/artifact/download/groovy/maven/apache-groovy-binary-{0}.zip -O \
                   /tmp/apache-groovy-binary-{0}.zip'.format(groovy_version))
-            sudo('unzip /tmp/apache-groovy-binary-{}.zip -d \
+            conn.sudo('unzip /tmp/apache-groovy-binary-{}.zip -d \
                   /usr/local/groovy'.format(groovy_version))
-            sudo('ln -s /usr/local/groovy/groovy-{} \
+            conn.sudo('ln -s /usr/local/groovy/groovy-{} \
                   /usr/local/groovy/latest'.format(groovy_version))
-            sudo('touch /home/{}/.ensure_dir/groovy_ensured'.format(configuration['conf_os_user']))
+            conn.sudo('touch /home/{}/.ensure_dir/groovy_ensured'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc(file=sys.stdout)
         print('Error with installing Groovy: {}'.format(str(err)))
@@ -835,7 +836,7 @@
         while not nexus_started and checks_count < 200:
             print('Waiting nexus to be started...')
             time.sleep(5)
-            result = sudo('nmap -p 8443 localhost | grep closed > /dev/null ; echo $?')
+            result = conn.sudo('nmap -p 8443 localhost | grep closed > /dev/null ; echo $?').stdout
             result = result[:1]
             if result == '1':
                 nexus_started = True
@@ -848,183 +849,183 @@
     
 def install_nexus():
     try:
-        if not exists('/home/{}/.ensure_dir/nexus_ensured'.format(configuration['conf_os_user'])):
+        if not exists(conn,'/home/{}/.ensure_dir/nexus_ensured'.format(configuration['conf_os_user'])):
             if args.efs_enabled == 'False':
                 mounting_disks()
             else:
                 mount_efs()
-            sudo('apt-get install -y maven nmap python-pip')
-            sudo('pip2 install -UI pip')
-            sudo('pip2 install -U fabric==1.14.0')
-            sudo('mkdir -p /opt/nexus')
-            sudo('wget https://sonatype-download.global.ssl.fastly.net/nexus/{0}/nexus-{1}-unix.tar.gz -O \
+            conn.sudo('apt-get install -y maven nmap python-pip')
+            conn.sudo('pip2 install -UI pip')
+            conn.sudo('pip2 install -U fabric==1.14.0')
+            conn.sudo('mkdir -p /opt/nexus')
+            conn.sudo('wget https://sonatype-download.global.ssl.fastly.net/nexus/{0}/nexus-{1}-unix.tar.gz -O \
                   /opt/nexus-{1}-unix.tar.gz'.format(
                   nexus_version.split('.')[0], nexus_version))
-            sudo('tar -zhxvf /opt/nexus-{}-unix.tar.gz -C /opt/'.format(
+            conn.sudo('tar -zhxvf /opt/nexus-{}-unix.tar.gz -C /opt/'.format(
                   nexus_version))
-            sudo('mv /opt/nexus-{}/* /opt/nexus/'.format(nexus_version))
-            sudo('mv /opt/nexus-{}/.[!.]* /opt/nexus/'.format(
+            conn.sudo('mv /opt/nexus-{}/* /opt/nexus/'.format(nexus_version))
+            conn.sudo('mv /opt/nexus-{}/.[!.]* /opt/nexus/'.format(
                   nexus_version))
-            sudo('rm -rf /opt/nexus-{}'.format(nexus_version))
-            sudo('useradd nexus')
-            sudo('echo \"run_as_user="nexus"\" > /opt/nexus/bin/nexus.rc')
+            conn.sudo('rm -rf /opt/nexus-{}'.format(nexus_version))
+            conn.sudo('useradd nexus')
+            conn.sudo('echo \"run_as_user="nexus"\" > /opt/nexus/bin/nexus.rc')
             create_keystore()
-            put('templates/jetty-https.xml', '/tmp/jetty-https.xml')
-            sudo('sed -i "s/KEYSTORE_PASSWORD/{}/g" /tmp/jetty-https.xml'.format(keystore_pass))
-            sudo('cp -f /tmp/jetty-https.xml /opt/nexus/etc/jetty/')
-            put('templates/nexus.service', '/tmp/nexus.service')
+            conn.put('templates/jetty-https.xml', '/tmp/jetty-https.xml')
+            conn.sudo('sed -i "s/KEYSTORE_PASSWORD/{}/g" /tmp/jetty-https.xml'.format(keystore_pass))
+            conn.sudo('cp -f /tmp/jetty-https.xml /opt/nexus/etc/jetty/')
+            conn.put('templates/nexus.service', '/tmp/nexus.service')
             if args.efs_enabled == 'False':
-                sudo('sed -i "s|EFS_SERVICE||g" /tmp/nexus.service')
+                conn.sudo('sed -i "s|EFS_SERVICE||g" /tmp/nexus.service')
             else:
-                sudo('sed -i "s|EFS_SERVICE|mount-efs-sequentially.service|g" /tmp/nexus.service')
-            sudo('cp /tmp/nexus.service /etc/systemd/system/')
-            put('files/nexus.properties', '/tmp/nexus.properties')
-            sudo('mkdir -p /opt/sonatype-work/nexus3/etc')
-            sudo('cp -f /tmp/nexus.properties /opt/sonatype-work/nexus3/etc/nexus.properties')
-            sudo('chown -R nexus:nexus /opt/nexus /opt/sonatype-work')
-            sudo('systemctl daemon-reload')
-            sudo('systemctl start nexus')
+                conn.sudo('sed -i "s|EFS_SERVICE|mount-efs-sequentially.service|g" /tmp/nexus.service')
+            conn.sudo('cp /tmp/nexus.service /etc/systemd/system/')
+            conn.put('files/nexus.properties', '/tmp/nexus.properties')
+            conn.sudo('mkdir -p /opt/sonatype-work/nexus3/etc')
+            conn.sudo('cp -f /tmp/nexus.properties /opt/sonatype-work/nexus3/etc/nexus.properties')
+            conn.sudo('chown -R nexus:nexus /opt/nexus /opt/sonatype-work')
+            conn.sudo('systemctl daemon-reload')
+            conn.sudo('systemctl start nexus')
             nexus_service_waiter()
-            sudo('systemctl enable nexus')
-            put('templates/configureNexus.groovy', '/tmp/configureNexus.groovy')
-            sudo('sed -i "s/REGION/{}/g" /tmp/configureNexus.groovy'.format(args.region))
-            sudo('sed -i "s/ADMIN_PASSWORD/{}/g" /tmp/configureNexus.groovy'.format(args.nexus_admin_password))
-            sudo('sed -i "s/SERVICE_USER_NAME/{}/g" /tmp/configureNexus.groovy'.format(args.nexus_service_user_name))
-            sudo('sed -i "s/SERVICE_USER_PASSWORD/{}/g" /tmp/configureNexus.groovy'.format(
+            conn.sudo('systemctl enable nexus')
+            conn.put('templates/configureNexus.groovy', '/tmp/configureNexus.groovy')
+            conn.sudo('sed -i "s/REGION/{}/g" /tmp/configureNexus.groovy'.format(args.region))
+            conn.sudo('sed -i "s/ADMIN_PASSWORD/{}/g" /tmp/configureNexus.groovy'.format(args.nexus_admin_password))
+            conn.sudo('sed -i "s/SERVICE_USER_NAME/{}/g" /tmp/configureNexus.groovy'.format(args.nexus_service_user_name))
+            conn.sudo('sed -i "s/SERVICE_USER_PASSWORD/{}/g" /tmp/configureNexus.groovy'.format(
                 args.nexus_service_user_password))
-            sudo('wget http://repo.{}.amazonaws.com/2017.09/main/mirror.list -O /tmp/main_mirror.list'.format(
+            conn.sudo('wget http://repo.{}.amazonaws.com/2017.09/main/mirror.list -O /tmp/main_mirror.list'.format(
                 args.region))
-            sudo('wget http://repo.{}.amazonaws.com/2017.09/updates/mirror.list -O /tmp/updates_mirror.list'.format(
+            conn.sudo('wget http://repo.{}.amazonaws.com/2017.09/updates/mirror.list -O /tmp/updates_mirror.list'.format(
                 args.region))
-            amazon_main_repo = sudo("cat /tmp/main_mirror.list  | grep {} | sed 's/$basearch//g'".format(args.region))
-            amazon_updates_repo = sudo("cat /tmp/updates_mirror.list  | grep {} | sed 's/$basearch//g'".format(
-                args.region))
-            sudo('sed -i "s|AMAZON_MAIN_URL|{}|g" /tmp/configureNexus.groovy'.format(amazon_main_repo))
-            sudo('sed -i "s|AMAZON_UPDATES_URL|{}|g" /tmp/configureNexus.groovy'.format(amazon_updates_repo))
-            sudo('rm -f /tmp/main_mirror.list')
-            sudo('rm -f /tmp/updates_mirror.list')
-            put('scripts/addUpdateScript.groovy', '/tmp/addUpdateScript.groovy')
+            amazon_main_repo = conn.sudo("cat /tmp/main_mirror.list  | grep {} | sed 's/$basearch//g'".format(args.region)).stdout
+            amazon_updates_repo = conn.sudo("cat /tmp/updates_mirror.list  | grep {} | sed 's/$basearch//g'".format(
+                args.region)).stdout
+            conn.sudo('sed -i "s|AMAZON_MAIN_URL|{}|g" /tmp/configureNexus.groovy'.format(amazon_main_repo))
+            conn.sudo('sed -i "s|AMAZON_UPDATES_URL|{}|g" /tmp/configureNexus.groovy'.format(amazon_updates_repo))
+            conn.sudo('rm -f /tmp/main_mirror.list')
+            conn.sudo('rm -f /tmp/updates_mirror.list')
+            conn.put('scripts/addUpdateScript.groovy', '/tmp/addUpdateScript.groovy')
             script_executed = False
             while not script_executed:
                 try:
-                    sudo('/usr/local/groovy/latest/bin/groovy /tmp/addUpdateScript.groovy -u "admin" -p "admin123" \
+                    conn.sudo('/usr/local/groovy/latest/bin/groovy /tmp/addUpdateScript.groovy -u "admin" -p "admin123" \
                           -n "configureNexus" -f "/tmp/configureNexus.groovy" -h "http://localhost:8081"')
                     script_executed = True
                 except:
                     time.sleep(10)
                     pass
-            sudo('curl -u admin:admin123 -X POST --header \'Content-Type: text/plain\' \
+            conn.sudo('curl -u admin:admin123 -X POST --header \'Content-Type: text/plain\' \
                    http://localhost:8081/service/rest/v1/script/configureNexus/run')
-            sudo('systemctl stop nexus')
-            sudo('git clone https://github.com/sonatype-nexus-community/nexus-repository-apt')
-            with cd('nexus-repository-apt'):
-                sudo('mvn')
-            apt_plugin_version = sudo('find nexus-repository-apt/ -name "nexus-repository-apt-*.jar" '
-                                      '-printf "%f\\n" | grep -v "sources"').replace('nexus-repository-apt-',
+            conn.sudo('systemctl stop nexus')
+            conn.sudo('git clone https://github.com/sonatype-nexus-community/nexus-repository-apt')
+            conn.sudo('''bash -c 'cd nexus-repository-apt && mvn' ''')
+            apt_plugin_version = conn.sudo('find nexus-repository-apt/ -name "nexus-repository-apt-*.jar" '
+                                      '-printf "%f\\n" | grep -v "sources"').stdout.replace('nexus-repository-apt-',
                                                                                      '').replace('.jar', '')
-            compress_plugin_version = sudo('find /opt/nexus/ -name "commons-compress-*.jar" '
-                                           '-printf "%f\\n" ').replace('commons-compress-', '').replace('.jar', '')
-            xz_plugin_version = sudo('find /opt/nexus/ -name "xz-*.jar" '
-                                     '-printf "%f\\n" ').replace('xz-', '').replace('.jar', '')
-            sudo('mkdir -p /opt/nexus/system/net/staticsnow/nexus-repository-apt/{0}/'.format(apt_plugin_version))
-            apt_plugin_jar_path = sudo('find nexus-repository-apt/ -name "nexus-repository-apt-{0}.jar"'.format(
-                apt_plugin_version))
-            sudo('cp -f {0} /opt/nexus/system/net/staticsnow/nexus-repository-apt/{1}/'.format(
+            compress_plugin_version = conn.sudo('find /opt/nexus/ -name "commons-compress-*.jar" '
+                                           '-printf "%f\\n" ').stdout.replace('commons-compress-', '').replace('.jar', '')
+            xz_plugin_version = conn.sudo('find /opt/nexus/ -name "xz-*.jar" '
+                                     '-printf "%f\\n" ').stdout.replace('xz-', '').replace('.jar', '')
+            conn.sudo('mkdir -p /opt/nexus/system/net/staticsnow/nexus-repository-apt/{0}/'.format(apt_plugin_version))
+            apt_plugin_jar_path = conn.sudo('find nexus-repository-apt/ -name "nexus-repository-apt-{0}.jar"'.format(
+                apt_plugin_version)).stdout
+            conn.sudo('cp -f {0} /opt/nexus/system/net/staticsnow/nexus-repository-apt/{1}/'.format(
                 apt_plugin_jar_path, apt_plugin_version
             ))
-            sudo('sed -i "$ d" /opt/nexus/system/org/sonatype/nexus/assemblies/nexus-core-feature/{0}/'
+            conn.sudo('sed -i "$ d" /opt/nexus/system/org/sonatype/nexus/assemblies/nexus-core-feature/{0}/'
                  'nexus-core-feature-{0}-features.xml'.format(nexus_version))
-            sudo('''echo '<feature name="nexus-repository-apt" description="net.staticsnow:nexus-repository-apt" '''
+            conn.sudo('''echo '<feature name="nexus-repository-apt" description="net.staticsnow:nexus-repository-apt" '''
                  '''version="{1}">' >> /opt/nexus/system/org/sonatype/nexus/assemblies/nexus-core-feature/{0}/'''
                  '''nexus-core-feature-{0}-features.xml'''.format(nexus_version, apt_plugin_version))
-            sudo('''echo '<details>net.staticsnow:nexus-repository-apt</details>' >> '''
+            conn.sudo('''echo '<details>net.staticsnow:nexus-repository-apt</details>' >> '''
                  '''/opt/nexus/system/org/sonatype/nexus/assemblies/nexus-core-feature/{0}/'''
                  '''nexus-core-feature-{0}-features.xml'''.format(nexus_version))
-            sudo('''echo '<bundle>mvn:net.staticsnow/nexus-repository-apt/{1}</bundle>' >> '''
+            conn.sudo('''echo '<bundle>mvn:net.staticsnow/nexus-repository-apt/{1}</bundle>' >> '''
                  '''/opt/nexus/system/org/sonatype/nexus/assemblies/nexus-core-feature/{0}/'''
                  '''nexus-core-feature-{0}-features.xml'''.format(nexus_version, apt_plugin_version))
-            sudo('''echo '<bundle>mvn:org.apache.commons/commons-compress/{1}</bundle>' >> '''
+            conn.sudo('''echo '<bundle>mvn:org.apache.commons/commons-compress/{1}</bundle>' >> '''
                  '''/opt/nexus/system/org/sonatype/nexus/assemblies/nexus-core-feature/{0}/'''
                  '''nexus-core-feature-{0}-features.xml'''.format(nexus_version, compress_plugin_version))
-            sudo('''echo '<bundle>mvn:org.tukaani/xz/{1}</bundle>' >> '''
+            conn.sudo('''echo '<bundle>mvn:org.tukaani/xz/{1}</bundle>' >> '''
                  '''/opt/nexus/system/org/sonatype/nexus/assemblies/nexus-core-feature/{0}/'''
                  '''nexus-core-feature-{0}-features.xml'''.format(nexus_version, xz_plugin_version))
-            sudo('''echo '</feature>' >> '''
+            conn.sudo('''echo '</feature>' >> '''
                  '''/opt/nexus/system/org/sonatype/nexus/assemblies/nexus-core-feature/{0}/'''
                  '''nexus-core-feature-{0}-features.xml'''.format(nexus_version))
-            sudo('''echo '</features>' >> '''
+            conn.sudo('''echo '</features>' >> '''
                  '''/opt/nexus/system/org/sonatype/nexus/assemblies/nexus-core-feature/{0}/'''
                  '''nexus-core-feature-{0}-features.xml'''.format(nexus_version))
-            sudo('''sed -i 's|<feature prerequisite=\"true\" dependency=\"false\">wrap</feature>|'''
+            conn.sudo('''sed -i 's|<feature prerequisite=\"true\" dependency=\"false\">wrap</feature>|'''
                  '''<feature prerequisite=\"true\" dependency=\"false\">wrap</feature>\\n'''
                  '''<feature prerequisite=\"false\" dependency=\"false\">nexus-repository-apt</feature>|g' '''
                  '''/opt/nexus/system/org/sonatype/nexus/assemblies/nexus-core-feature/{0}/nexus-core-feature-'''
                  '''{0}-features.xml'''.format(nexus_version))
-            sudo('git clone https://github.com/sonatype-nexus-community/nexus-repository-r.git')
-            with cd('nexus-repository-r'):
-                sudo('mvn clean install')
-            r_plugin_version = sudo('find nexus-repository-r/ -name "nexus-repository-r-*.jar" '
-                                    '-printf "%f\\n" | grep -v "sources"').replace('nexus-repository-r-', '').replace(
+            conn.sudo('git clone https://github.com/sonatype-nexus-community/nexus-repository-r.git')
+            conn.sudo('''bash -c 'cd nexus-repository-r && mvn clean install' ''')
+            r_plugin_version = conn.sudo('find nexus-repository-r/ -name "nexus-repository-r-*.jar" '
+                                    '-printf "%f\\n" | grep -v "sources"').stdout.replace('nexus-repository-r-', '').replace(
                 '.jar', '')
-            sudo('mkdir -p /opt/nexus/system/org/sonatype/nexus/plugins/nexus-repository-r/{}/'.format(
+            conn.sudo('mkdir -p /opt/nexus/system/org/sonatype/nexus/plugins/nexus-repository-r/{}/'.format(
                 r_plugin_version))
-            r_plugin_jar_path = sudo('find nexus-repository-r/ -name "nexus-repository-r-{0}.jar"'.format(
-                r_plugin_version))
-            sudo('cp -f {0} /opt/nexus/system/org/sonatype/nexus/plugins/nexus-repository-r/{1}/'.format(
+            r_plugin_jar_path = conn.sudo('find nexus-repository-r/ -name "nexus-repository-r-{0}.jar"'.format(
+                r_plugin_version)).stdout
+            conn.sudo('cp -f {0} /opt/nexus/system/org/sonatype/nexus/plugins/nexus-repository-r/{1}/'.format(
                 r_plugin_jar_path, r_plugin_version
             ))
-            sudo('sed -i "$ d" /opt/nexus/system/com/sonatype/nexus/assemblies/nexus-oss-feature/{0}/'
+            conn.sudo('sed -i "$ d" /opt/nexus/system/com/sonatype/nexus/assemblies/nexus-oss-feature/{0}/'
                  'nexus-oss-feature-{0}-features.xml'.format(nexus_version))
-            sudo('''echo '<feature name="nexus-repository-r" description="org.sonatype.nexus.plugins:'''
+            conn.sudo('''echo '<feature name="nexus-repository-r" description="org.sonatype.nexus.plugins:'''
                  '''nexus-repository-r" version="{1}">' >> /opt/nexus/system/com/sonatype/nexus/assemblies/'''
                  '''nexus-oss-feature/{0}/nexus-oss-feature-{0}-features.xml'''.format(nexus_version, r_plugin_version))
-            sudo('''echo '<details>org.sonatype.nexus.plugins:nexus-repository-r</details>' >> '''
+            conn.sudo('''echo '<details>org.sonatype.nexus.plugins:nexus-repository-r</details>' >> '''
                  '''/opt/nexus/system/com/sonatype/nexus/assemblies/nexus-oss-feature/{0}/'''
                  '''nexus-oss-feature-{0}-features.xml'''.format(nexus_version))
-            sudo('''echo '<bundle>mvn:org.sonatype.nexus.plugins/nexus-repository-r/{1}</bundle>' >> '''
+            conn.sudo('''echo '<bundle>mvn:org.sonatype.nexus.plugins/nexus-repository-r/{1}</bundle>' >> '''
                  '''/opt/nexus/system/com/sonatype/nexus/assemblies/nexus-oss-feature/{0}/'''
                  '''nexus-oss-feature-{0}-features.xml'''.format(nexus_version, r_plugin_version))
-            sudo('''echo '</feature>' >> '''
+            conn.sudo('''echo '</feature>' >> '''
                  '''/opt/nexus/system/com/sonatype/nexus/assemblies/nexus-oss-feature/{0}/'''
                  '''nexus-oss-feature-{0}-features.xml'''.format(nexus_version))
-            sudo('''echo '</features>' >> '''
+            conn.sudo('''echo '</features>' >> '''
                  '''/opt/nexus/system/com/sonatype/nexus/assemblies/nexus-oss-feature/{0}/'''
                  '''nexus-oss-feature-{0}-features.xml'''.format(nexus_version))
-            sudo('''sed -i 's|<feature prerequisite=\"true\" dependency=\"false\">wrap</feature>|'''
+            conn.sudo('''sed -i 's|<feature prerequisite=\"true\" dependency=\"false\">wrap</feature>|'''
                  '''<feature prerequisite=\"true\" dependency=\"false\">wrap</feature>\\n'''
                  '''<feature version=\"{1}\" prerequisite=\"false\" dependency=\"false\">'''
                  '''nexus-repository-r</feature>|g' '''
                  '''/opt/nexus/system/com/sonatype/nexus/assemblies/nexus-oss-feature/{0}/'''
                  '''nexus-oss-feature-{0}-features.xml'''.format(nexus_version, r_plugin_version))
-            sudo('chown -R nexus:nexus /opt/nexus')
-            sudo('systemctl start nexus')
+            conn.sudo('chown -R nexus:nexus /opt/nexus')
+            conn.sudo('systemctl start nexus')
             nexus_service_waiter()
-            put('templates/addCustomRepository.groovy', '/tmp/addCustomRepository.groovy')
-            sudo('sed -i "s|REGION|{0}|g" /tmp/addCustomRepository.groovy'.format(args.region))
+            conn.put('templates/addCustomRepository.groovy', '/tmp/addCustomRepository.groovy')
+            conn.sudo('sed -i "s|REGION|{0}|g" /tmp/addCustomRepository.groovy'.format(args.region))
             script_executed = False
             while not script_executed:
                 try:
-                    sudo('/usr/local/groovy/latest/bin/groovy /tmp/addUpdateScript.groovy -u "admin" -p "{}" '
+                    conn.sudo('/usr/local/groovy/latest/bin/groovy /tmp/addUpdateScript.groovy -u "admin" -p "{}" '
                          '-n "addCustomRepository" -f "/tmp/addCustomRepository.groovy" -h '
                          '"http://localhost:8081"'.format(args.nexus_admin_password))
                     script_executed = True
                 except:
                     time.sleep(10)
                     pass
-            sudo('curl -u admin:{} -X POST --header \'Content-Type: text/plain\' '
+            conn.sudo('curl -u admin:{} -X POST --header \'Content-Type: text/plain\' '
                  'http://localhost:8081/service/rest/v1/script/addCustomRepository/run'.format(
                   args.nexus_admin_password))
-            sudo('echo "admin:{}" > /opt/nexus/credentials'.format(args.nexus_admin_password))
-            sudo('echo "{0}:{1}" >> /opt/nexus/credentials'.format(args.nexus_service_user_name,
+            conn.sudo('echo "admin:{}" > /opt/nexus/credentials'.format(args.nexus_admin_password))
+            conn.sudo('echo "{0}:{1}" >> /opt/nexus/credentials'.format(args.nexus_service_user_name,
                                                                    args.nexus_service_user_password))
-            put('templates/updateRepositories.groovy', '/opt/nexus/updateRepositories.groovy', use_sudo=True)
-            put('scripts/update_amazon_repositories.py', '/opt/nexus/update_amazon_repositories.py', use_sudo=True)
-            sudo('sed -i "s|NEXUS_PASSWORD|{}|g" /opt/nexus/update_amazon_repositories.py'.format(
+            conn.put('templates/updateRepositories.groovy', '/tmp/updateRepositories.groovy')
+            conn.sudo('cp /tmp/updateRepositories.groovy /opt/nexus/updateRepositories.groovy')
+            conn.put('scripts/update_amazon_repositories.py', '/tmp/update_amazon_repositories.py')
+            conn.sudo('cp /tmp/update_amazon_repositories.py /opt/nexus/update_amazon_repositories.py')
+            conn.sudo('sed -i "s|NEXUS_PASSWORD|{}|g" /opt/nexus/update_amazon_repositories.py'.format(
                  args.nexus_admin_password))
-            sudo('touch /var/log/amazon_repo_update.log')
-            sudo('echo "0 0 * * * root /usr/bin/python /opt/nexus/update_amazon_repositories.py --region {} >> '
+            conn.sudo('touch /var/log/amazon_repo_update.log')
+            conn.sudo('echo "0 0 * * * root /usr/bin/python /opt/nexus/update_amazon_repositories.py --region {} >> '
                  '/var/log/amazon_repo_update.log" >> /etc/crontab'.format(args.region))
-            sudo('touch /home/{}/.ensure_dir/nexus_ensured'.format(configuration['conf_os_user']))
+            conn.sudo('touch /home/{}/.ensure_dir/nexus_ensured'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc(file=sys.stdout)
         print('Error with installing Nexus: {}'.format(str(err)))
@@ -1033,21 +1034,21 @@
 
 def install_nginx():
     try:
-        if not exists('/home/{}/.ensure_dir/nginx_ensured'.format(configuration['conf_os_user'])):
-            hostname = sudo('hostname')
-            sudo('apt-get install -y nginx')
-            sudo('rm -f /etc/nginx/conf.d/* /etc/nginx/sites-enabled/default')
-            put('templates/nexus.conf', '/tmp/nexus.conf')
+        if not exists(conn,'/home/{}/.ensure_dir/nginx_ensured'.format(configuration['conf_os_user'])):
+            hostname = conn.sudo('hostname').stdout
+            conn.sudo('apt-get install -y nginx')
+            conn.sudo('rm -f /etc/nginx/conf.d/* /etc/nginx/sites-enabled/default')
+            conn.put('templates/nexus.conf', '/tmp/nexus.conf')
             if args.hosted_zone_id and args.hosted_zone_name and args.subdomain:
-                sudo('sed -i "s|SUBDOMAIN|{}|g" /tmp/nexus.conf'.format(args.subdomain))
-                sudo('sed -i "s|HOSTZONE|{}|g" /tmp/nexus.conf'.format(args.hosted_zone_name))
+                conn.sudo('sed -i "s|SUBDOMAIN|{}|g" /tmp/nexus.conf'.format(args.subdomain))
+                conn.sudo('sed -i "s|HOSTZONE|{}|g" /tmp/nexus.conf'.format(args.hosted_zone_name))
             else:
-                sudo('sed -i "s|SUBDOMAIN.HOSTZONE|{}|g" /tmp/nexus.conf'.format(hostname))
-            sudo('sed -i "s|REGION|{}|g" /tmp/nexus.conf'.format(args.region))
-            sudo('cp /tmp/nexus.conf /etc/nginx/conf.d/nexus.conf'.format(args.subdomain, args.hosted_zone_name))
-            sudo('systemctl restart nginx')
-            sudo('systemctl enable nginx')
-            sudo('touch /home/{}/.ensure_dir/nginx_ensured'.format(configuration['conf_os_user']))
+                conn.sudo('sed -i "s|SUBDOMAIN.HOSTZONE|{}|g" /tmp/nexus.conf'.format(hostname))
+            conn.sudo('sed -i "s|REGION|{}|g" /tmp/nexus.conf'.format(args.region))
+            conn.sudo('cp /tmp/nexus.conf /etc/nginx/conf.d/nexus.conf'.format(args.subdomain, args.hosted_zone_name))
+            conn.sudo('systemctl restart nginx')
+            conn.sudo('systemctl enable nginx')
+            conn.sudo('touch /home/{}/.ensure_dir/nginx_ensured'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc(file=sys.stdout)
         print('Error with installing Nginx: {}'.format(str(err)))
@@ -1056,18 +1057,18 @@
 
 def mounting_disks():
     try:
-        if not exists('/home/{}/.ensure_dir/additional_disk_mounted'.format(configuration['conf_os_user'])):
-            sudo('mkdir -p /opt/sonatype-work')
-            disk_name = sudo("lsblk | grep disk | awk '{print $1}' | sort | tail -n 1 | tr '\\n' ',' | sed 's|.$||g'")
-            sudo('bash -c \'echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/{}\' '.format(disk_name))
-            sudo('sleep 10')
-            partition_name = sudo("lsblk -r | grep part | grep {} | awk {} | sort | tail -n 1 | "
-                                  "tr '\\n' ',' | sed 's|.$||g'".format(disk_name, "'{print $1}'"))
-            sudo('mkfs.ext4 -F -q /dev/{}'.format(partition_name))
-            sudo('mount /dev/{0} /opt/sonatype-work'.format(partition_name))
-            sudo('bash -c "echo \'/dev/{} /opt/sonatype-work ext4 errors=remount-ro 0 1\' >> /etc/fstab"'.format(
+        if not exists(conn,'/home/{}/.ensure_dir/additional_disk_mounted'.format(configuration['conf_os_user'])):
+            conn.sudo('mkdir -p /opt/sonatype-work')
+            disk_name = conn.sudo("lsblk | grep disk | awk '{print $1}' | sort | tail -n 1 | tr '\\n' ',' | sed 's|.$||g'").stdout
+            conn.sudo('bash -c \'echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/{}\' '.format(disk_name))
+            conn.sudo('sleep 10')
+            partition_name = conn.sudo("lsblk -r | grep part | grep {} | awk {} | sort | tail -n 1 | "
+                                  "tr '\\n' ',' | sed 's|.$||g'".format(disk_name, "'{print $1}'")).stdout
+            conn.sudo('mkfs.ext4 -F -q /dev/{}'.format(partition_name))
+            conn.sudo('mount /dev/{0} /opt/sonatype-work'.format(partition_name))
+            conn.sudo('bash -c "echo \'/dev/{} /opt/sonatype-work ext4 errors=remount-ro 0 1\' >> /etc/fstab"'.format(
                 partition_name))
-            sudo('touch /home/{}/.ensure_dir/additional_disk_mounted'.format(configuration['conf_os_user']))
+            conn.sudo('touch /home/{}/.ensure_dir/additional_disk_mounted'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc(file=sys.stdout)
         print('Failed to mount additional volume: {}'.format(str(err)))
@@ -1076,27 +1077,25 @@
 
 def mount_efs():
     try:
-        if not exists('/home/{}/.ensure_dir/efs_mounted'.format(configuration['conf_os_user'])):
-            sudo('mkdir -p /opt/sonatype-work')
-            sudo('apt-get -y install binutils')
-            with cd('/tmp/'):
-                sudo('git clone https://github.com/aws/efs-utils')
-            with cd('/tmp/efs-utils'):
-                sudo('./build-deb.sh')
-                sudo('apt-get -y install ./build/amazon-efs-utils*deb')
-            sudo('sed -i "s/stunnel_check_cert_hostname.*/stunnel_check_cert_hostname = false/g" '
+        if not exists(conn,'/home/{}/.ensure_dir/efs_mounted'.format(configuration['conf_os_user'])):
+            conn.sudo('mkdir -p /opt/sonatype-work')
+            conn.sudo('apt-get -y install binutils')
+            conn.sudo('''bash -c 'cd /tmp/ && git clone https://github.com/aws/efs-utils' ''')
+            conn.sudo('''bash -c 'cd /tmp/efs-utils && ./build-deb.sh' ''')
+            conn.sudo('''bash -c 'cd /tmp/efs-utils && apt-get -y install ./build/amazon-efs-utils*deb' ''')
+            conn.sudo('sed -i "s/stunnel_check_cert_hostname.*/stunnel_check_cert_hostname = false/g" '
                  '/etc/amazon/efs/efs-utils.conf')
-            sudo('sed -i "s/stunnel_check_cert_validity.*/stunnel_check_cert_validity = false/g" '
+            conn.sudo('sed -i "s/stunnel_check_cert_validity.*/stunnel_check_cert_validity = false/g" '
                  '/etc/amazon/efs/efs-utils.conf')
-            sudo('mount -t efs -o tls {}:/ /opt/sonatype-work'.format(
+            conn.sudo('mount -t efs -o tls {}:/ /opt/sonatype-work'.format(
                 args.efs_id))
-            sudo('bash -c "echo \'{}:/ /opt/sonatype-work efs tls,_netdev 0 0\' >> '
+            conn.sudo('bash -c "echo \'{}:/ /opt/sonatype-work efs tls,_netdev 0 0\' >> '
                  '/etc/fstab"'.format(args.efs_id))
-            put('files/mount-efs-sequentially.service', '/tmp/mount-efs-sequentially.service')
-            sudo('cp /tmp/mount-efs-sequentially.service /etc/systemd/system/')
-            sudo('systemctl daemon-reload')
-            sudo('systemctl enable mount-efs-sequentially.service')
-            sudo('touch /home/{}/.ensure_dir/efs_mounted'.format(configuration['conf_os_user']))
+            conn.put('files/mount-efs-sequentially.service', '/tmp/mount-efs-sequentially.service')
+            conn.sudo('cp /tmp/mount-efs-sequentially.service /etc/systemd/system/')
+            conn.sudo('systemctl daemon-reload')
+            conn.sudo('systemctl enable mount-efs-sequentially.service')
+            conn.sudo('touch /home/{}/.ensure_dir/efs_mounted'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to mount additional volume: ', str(err))
@@ -1105,21 +1104,21 @@
 
 def configure_ssl():
     try:
-        if not exists('/home/{}/.ensure_dir/ssl_ensured'.format(configuration['conf_os_user'])):
-            hostname = sudo('hostname')
-            private_ip = sudo('curl http://169.254.169.254/latest/meta-data/local-ipv4')
+        if not exists(conn,'/home/{}/.ensure_dir/ssl_ensured'.format(configuration['conf_os_user'])):
+            hostname = conn.sudo('hostname').stdout
+            private_ip = conn.sudo('curl http://169.254.169.254/latest/meta-data/local-ipv4').stdout
             subject_alt_name = 'subjectAltName = IP:{}'.format(private_ip)
             if args.network_type == 'public':
-                public_ip = sudo('curl http://169.254.169.254/latest/meta-data/public-ipv4')
+                public_ip = conn.sudo('curl http://169.254.169.254/latest/meta-data/public-ipv4').stdout
                 subject_alt_name += ',IP:{}'.format(public_ip)
-            sudo('cp /etc/ssl/openssl.cnf /tmp/openssl.cnf')
-            sudo('echo "[ subject_alt_name ]" >> /tmp/openssl.cnf')
-            sudo('echo "{}" >> /tmp/openssl.cnf'.format(subject_alt_name))
-            sudo('openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/repository.key '
-                 '-out /etc/ssl/certs/repository.crt -subj "/C=US/ST=US/L=US/O=dlab/CN={}" -config '
+            conn.sudo('cp /etc/ssl/openssl.cnf /tmp/openssl.cnf')
+            conn.sudo('echo "[ subject_alt_name ]" >> /tmp/openssl.cnf')
+            conn.sudo('echo "{}" >> /tmp/openssl.cnf'.format(subject_alt_name))
+            conn.sudo('openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/repository.key '
+                 '-out /etc/ssl/certs/repository.crt -subj "/C=US/ST=US/L=US/O=datalab/CN={}" -config '
                  '/tmp/openssl.cnf -extensions subject_alt_name'.format(hostname))
-            sudo('openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048')
-            sudo('touch /home/{}/.ensure_dir/ssl_ensured'.format(configuration['conf_os_user']))
+            conn.sudo('openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048')
+            conn.sudo('touch /home/{}/.ensure_dir/ssl_ensured'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to mount additional volume: ', str(err))
@@ -1128,16 +1127,16 @@
 
 def set_hostname():
     try:
-        if not exists('/home/{}/.ensure_dir/hostname_set'.format(configuration['conf_os_user'])):
+        if not exists(conn,'/home/{}/.ensure_dir/hostname_set'.format(configuration['conf_os_user'])):
             if args.hosted_zone_id and args.hosted_zone_name and args.subdomain:
                 hostname = '{0}.{1}'.format(args.subdomain, args.hosted_zone_name)
             else:
                 if args.network_type == 'public':
-                    hostname = sudo('curl http://169.254.169.254/latest/meta-data/public-hostname')
+                    hostname = conn.sudo('curl http://169.254.169.254/latest/meta-data/public-hostname').stdout
                 else:
-                    hostname = sudo('curl http://169.254.169.254/latest/meta-data/hostname')
-            sudo('hostnamectl set-hostname {0}'.format(hostname))
-            sudo('touch /home/{}/.ensure_dir/hostname_set'.format(configuration['conf_os_user']))
+                    hostname = conn.sudo('curl http://169.254.169.254/latest/meta-data/hostname').stdout
+            conn.sudo('hostnamectl set-hostname {0}'.format(hostname))
+            conn.sudo('touch /home/{}/.ensure_dir/hostname_set'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to mount additional volume: ', str(err))
@@ -1146,12 +1145,12 @@
 
 def create_keystore():
     try:
-        if not exists('/home/{}/.ensure_dir/keystore_created'.format(configuration['conf_os_user'])):
-            sudo('openssl pkcs12 -export -in /etc/ssl/certs/repository.crt -inkey /etc/ssl/certs/repository.key '
+        if not exists(conn,'/home/{}/.ensure_dir/keystore_created'.format(configuration['conf_os_user'])):
+            conn.sudo('openssl pkcs12 -export -in /etc/ssl/certs/repository.crt -inkey /etc/ssl/certs/repository.key '
                  '-out wildcard.p12 -passout pass:{}'.format(keystore_pass))
-            sudo('keytool -importkeystore  -deststorepass {0} -destkeypass {0} -srckeystore wildcard.p12 -srcstoretype '
+            conn.sudo('keytool -importkeystore  -deststorepass {0} -destkeypass {0} -srckeystore wildcard.p12 -srcstoretype '
                  'PKCS12 -srcstorepass {0} -destkeystore /opt/nexus/etc/ssl/keystore.jks'.format(keystore_pass))
-            sudo('touch /home/{}/.ensure_dir/keystore_created'.format(configuration['conf_os_user']))
+            conn.sudo('touch /home/{}/.ensure_dir/keystore_created'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to create keystore: ', str(err))
@@ -1160,7 +1159,7 @@
 
 def download_packages():
     try:
-        if not exists('/home/{}/.ensure_dir/packages_downloaded'.format(configuration['conf_os_user'])):
+        if not exists(conn,'/home/{}/.ensure_dir/packages_downloaded'.format(configuration['conf_os_user'])):
             packages_urls = [
                 'https://pkg.jenkins.io/debian/jenkins-ci.org.key',
                 'http://mirrors.sonic.net/apache/maven/maven-{0}/{1}/binaries/apache-maven-{1}-bin.zip'.format(
@@ -1168,7 +1167,7 @@
                 'https://nodejs.org/dist/v8.15.0/node-v8.15.0.tar.gz',
                 'https://github.com/sass/node-sass/releases/download/v4.11.0/linux-x64-57_binding.node',
                 'http://nginx.org/download/nginx-{}.tar.gz'.format(configuration['reverse_proxy_nginx_version']),
-                'http://www.scala-lang.org/files/archive/scala-{}.deb'.format(configuration['notebook_scala_version']),
+                'https://www.scala-lang.org/files/archive/scala-{}.deb'.format(configuration['notebook_scala_version']),
                 'https://archive.apache.org/dist/spark/spark-{0}/spark-{0}-bin-hadoop{1}.tgz'.format(
                     configuration['notebook_spark_version'], configuration['notebook_hadoop_version']),
                 'https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/{0}/hadoop-aws-{0}.jar'.format('2.7.4'),
@@ -1186,7 +1185,7 @@
                 'https://repo1.maven.org/maven2/org/jfree/jfreechart/{0}/jfreechart-{0}.jar'.format('1.0.19'),
                 'https://repo1.maven.org/maven2/org/jfree/jcommon/{0}/jcommon-{0}.jar'.format('1.0.24'),
                 '--no-check-certificate https://brunelvis.org/jar/spark-kernel-brunel-all-{0}.jar'.format('2.3'),
-                'http://archive.apache.org/dist/incubator/toree/0.2.0-incubating/toree-pip/toree-0.2.0.tar.gz',
+                'http://archive.apache.org/dist/incubator/toree/0.3.0-incubating/toree-pip/toree-0.3.0.tar.gz',
                 'https://download2.rstudio.org/server/trusty/amd64/rstudio-server-{}-amd64.deb'.format(
                     configuration['notebook_rstudio_version']),
                 'http://us.download.nvidia.com/XFree86/Linux-x86_64/{0}/NVIDIA-Linux-x86_64-{0}.run'.format(
@@ -1195,9 +1194,9 @@
                     cuda_version_deeplearning, cuda_deeplearingn_file_name),
                 'https://developer.nvidia.com/compute/cuda/{0}/prod/local_installers/{1}'.format(
                     configuration['notebook_cuda_version'], configuration['notebook_cuda_file_name']),
-                'http://developer.download.nvidia.com/compute/redist/cudnn/v{0}/{1}'.format(
+                'https://developer.download.nvidia.com/compute/redist/cudnn/v{0}/{1}'.format(
                     cudnn_version_deeplearning, cudnn_file_name_deeplearning),
-                'http://developer.download.nvidia.com/compute/redist/cudnn/v{0}/{1}'.format(
+                'https://developer.download.nvidia.com/compute/redist/cudnn/v{0}/{1}'.format(
                     configuration['notebook_cudnn_version'], configuration['notebook_cudnn_file_name']),
                 'https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-{}-cp27-none-'
                 'linux_x86_64.whl'.format(tensorflow_version_deeplearning),
@@ -1222,10 +1221,10 @@
                     configuration['notebook_livy_version']),
                 'https://dl.bintray.com/spark-packages/maven/tapanalyticstoolkit/spark-tensorflow-connector/'
                 '1.0.0-s_2.11/spark-tensorflow-connector-1.0.0-s_2.11.jar',
-                'https://archive.apache.org/dist/incubator/toree/0.2.0-incubating/toree/'
-                'toree-0.2.0-incubating-bin.tar.gz',
-                'https://repo1.maven.org/maven2/org/apache/toree/toree-assembly/0.2.0-incubating/'
-                'toree-assembly-0.2.0-incubating.jar',
+                'https://archive.apache.org/dist/incubator/toree/0.3.0-incubating/toree/'
+                'toree-0.3.0-incubating-bin.tar.gz',
+                'https://repo1.maven.org/maven2/org/apache/toree/toree-assembly/0.3.0-incubating/'
+                'toree-assembly-0.3.0-incubating.jar',
                 'https://cran.r-project.org/src/contrib/Archive/keras/keras_{}.tar.gz'.format(
                     configuration['notebook_keras_version'])
             ]
@@ -1233,16 +1232,15 @@
             for package in packages_urls:
                 package_name = package.split('/')[-1]
                 packages_list.append({'url': package, 'name': package_name})
-            run('mkdir packages')
-            with cd('packages'):
-                for package in packages_list:
-                    run('wget {0}'.format(package['url']))
-                    run('curl -v -u admin:{2} -F "raw.directory=/" -F '
+            conn.run('mkdir packages')
+            for package in packages_list:
+                conn.run('cd packages && wget {0}'.format(package['url']))
+                conn.run('curl -v -u admin:{2} -F "raw.directory=/" -F '
                         '"raw.asset1=@/home/{0}/packages/{1}" '
                         '-F "raw.asset1.filename={1}"  '
                         '"http://localhost:8081/service/rest/v1/components?repository=packages"'.format(
                          configuration['conf_os_user'], package['name'], args.nexus_admin_password))
-            sudo('touch /home/{}/.ensure_dir/packages_downloaded'.format(configuration['conf_os_user']))
+            conn.sudo('touch /home/{}/.ensure_dir/packages_downloaded'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to download packages: ', str(err))
@@ -1251,17 +1249,17 @@
 
 def install_docker():
     try:
-        if not exists('/home/{}/.ensure_dir/docker_installed'.format(configuration['conf_os_user'])):
-            sudo('curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -')
-            sudo('add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) '
+        if not exists(conn,'/home/{}/.ensure_dir/docker_installed'.format(configuration['conf_os_user'])):
+            conn.sudo('curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -')
+            conn.sudo('add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) '
                  'stable"')
-            sudo('apt-get update')
-            sudo('apt-cache policy docker-ce')
-            sudo('apt-get install -y docker-ce={}~ce-0~ubuntu'.format(configuration['ssn_docker_version']))
-            sudo('usermod -a -G docker ' + configuration['conf_os_user'])
-            sudo('update-rc.d docker defaults')
-            sudo('update-rc.d docker enable')
-            sudo('touch /home/{}/.ensure_dir/docker_installed'.format(configuration['conf_os_user']))
+            conn.sudo('apt-get update')
+            conn.sudo('apt-cache policy docker-ce')
+            conn.sudo('apt-get install -y docker-ce=5:{}~3-0~ubuntu-focal'.format(configuration['ssn_docker_version']))
+            conn.sudo('usermod -a -G docker ' + configuration['conf_os_user'])
+            conn.sudo('update-rc.d docker defaults')
+            conn.sudo('update-rc.d docker enable')
+            conn.sudo('touch /home/{}/.ensure_dir/docker_installed'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to install docker: ', str(err))
@@ -1270,15 +1268,14 @@
 
 def prepare_images():
     try:
-        if not exists('/home/{}/.ensure_dir/images_prepared'.format(configuration['conf_os_user'])):
-            put('files/Dockerfile', '/tmp/Dockerfile')
-            with cd('/tmp/'):
-                sudo('docker build --file Dockerfile -t pre-base .')
-            sudo('docker login -u {0} -p {1} localhost:8083'.format(args.nexus_service_user_name,
+        if not exists(conn,'/home/{}/.ensure_dir/images_prepared'.format(configuration['conf_os_user'])):
+            conn.put('files/Dockerfile', '/tmp/Dockerfile')
+            conn.sudo('''bash -c 'cd /tmp/ && docker build --file Dockerfile -t pre-base .' ''')
+            conn.sudo('docker login -u {0} -p {1} localhost:8083'.format(args.nexus_service_user_name,
                                                                     args.nexus_service_user_password))
-            sudo('docker tag pre-base localhost:8083/dlab-pre-base')
-            sudo('docker push localhost:8083/dlab-pre-base')
-            sudo('touch /home/{}/.ensure_dir/images_prepared'.format(configuration['conf_os_user']))
+            conn.sudo('docker tag pre-base localhost:8083/datalab-pre-base')
+            conn.sudo('docker push localhost:8083/datalab-pre-base')
+            conn.sudo('touch /home/{}/.ensure_dir/images_prepared'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to download packages: ', str(err))
@@ -1287,20 +1284,21 @@
 
 def install_squid():
     try:
-        if not exists('/home/{}/.ensure_dir/squid_installed'.format(configuration['conf_os_user'])):
-            sudo('apt-get -y install squid')
-            put('templates/squid.conf', '/etc/squid/', use_sudo=True)
+        if not exists(conn,'/home/{}/.ensure_dir/squid_installed'.format(configuration['conf_os_user'])):
+            conn.sudo('apt-get -y install squid')
+            conn.put('templates/squid.conf', '/tmp/')
+            conn.sudo('cp -f /tmp/squid.conf /etc/squid/')
             replace_string = ''
             for cidr in get_vpc_cidr_by_id(args.vpc_id):
                 replace_string += 'acl AWS_VPC_CIDR src {}\\n'.format(cidr)
-            sudo('sed -i "s|VPC_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
+            conn.sudo('sed -i "s|VPC_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
             replace_string = ''
             for cidr in args.allowed_ip_cidr.split(','):
                 replace_string += 'acl AllowedCIDRS src {}\\n'.format(cidr)
-            sudo('sed -i "s|ALLOWED_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
-            sudo('systemctl enable squid')
-            sudo('systemctl restart squid')
-            sudo('touch /home/{}/.ensure_dir/squid_installed'.format(configuration['conf_os_user']))
+            conn.sudo('sed -i "s|ALLOWED_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
+            conn.sudo('systemctl enable squid')
+            conn.sudo('systemctl restart squid')
+            conn.sudo('touch /home/{}/.ensure_dir/squid_installed'.format(configuration['conf_os_user']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to download packages: ', str(err))
@@ -1327,12 +1325,12 @@
     pre_defined_subnet = True
     pre_defined_sg = True
     pre_defined_efs = True
-    if args.action != 'terminate' and args.dlab_conf_file_path == '':
-        print('Please provide argument --dlab_conf_file_path ! Aborting... ')
+    if args.action != 'terminate' and args.datalab_conf_file_path == '':
+        print('Please provide argument --datalab_conf_file_path ! Aborting... ')
         sys.exit(1)
     configuration = dict()
-    config = SafeConfigParser()
-    config.read(args.dlab_conf_file_path)
+    config = ConfigParser()
+    config.read(args.datalab_conf_file_path)
     for section in config.sections():
         for option in config.options(section):
             varname = "{0}_{1}".format(section, option)
@@ -1690,12 +1688,11 @@
                 sys.exit(1)
 
         print("CONFIGURE CONNECTIONS")
-        env['connection_attempts'] = 100
-        env.key_filename = [args.key_path + args.key_name + '.pem']
-        env.host_string = 'ubuntu@' + ec2_ip_address
+        global conn
+        conn = datalab.fab.init_datalab_connection(ec2_ip_address, 'ubuntu', key_filename)
         print("CONFIGURE LOCAL REPOSITORY")
         try:
-            print('CREATING DLAB-USER')
+            print('CREATING DATALAB USER')
             ensure_ssh_user('ubuntu')
             env.host_string = configuration['conf_os_user'] + '@' + ec2_ip_address
 
@@ -1723,7 +1720,7 @@
             print('INSTALLING DOCKER')
             install_docker()
 
-            print('PREPARING DLAB DOCKER IMAGES')
+            print('PREPARING DATALAB DOCKER IMAGES')
             prepare_images()
 
             print('INSTALLING SQUID')
@@ -1784,6 +1781,6 @@
                 remove_route_tables()
                 remove_vpc(args.vpc_id)
             sys.exit(1)
-
+        conn.close()
     else:
         print('Invalid action: {}'.format(args.action))
diff --git a/infrastructure-provisioning/scripts/deploy_repository/files/Dockerfile b/infrastructure-provisioning/scripts/deploy_repository/files/Dockerfile
index af2c039..6f9f099 100644
--- a/infrastructure-provisioning/scripts/deploy_repository/files/Dockerfile
+++ b/infrastructure-provisioning/scripts/deploy_repository/files/Dockerfile
@@ -24,9 +24,9 @@
 # Install any .deb dependecies
 RUN	apt-get update && \
     apt-get -y upgrade && \
-    apt-get -y install python-pip python-dev groff vim less git wget nano libssl-dev libffi-dev libffi6 && \
+    apt-get -y install python3-pip python3-dev python3-virtualenv groff vim less git wget nano libssl-dev libffi-dev libffi6 && \
     apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
 
 # Install any python dependencies
 RUN pip install -UI pip==9.0.3
-RUN pip install boto3 backoff fabric==1.14.0 fabvenv awscli argparse ujson jupyter pycrypto
\ No newline at end of file
+RUN pip install boto3 backoff fabric==1.14.0 fabvenv awscli argparse ujson jupyter pycryptodome
\ No newline at end of file
diff --git a/infrastructure-provisioning/scripts/deploy_repository/scripts/update_amazon_repositories.py b/infrastructure-provisioning/scripts/deploy_repository/scripts/update_amazon_repositories.py
index df8e20f..aecd13b 100644
--- a/infrastructure-provisioning/scripts/deploy_repository/scripts/update_amazon_repositories.py
+++ b/infrastructure-provisioning/scripts/deploy_repository/scripts/update_amazon_repositories.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -21,9 +21,9 @@
 # ******************************************************************************
 
 
-from fabric.api import *
+from fabric import *
 import argparse
-
+import subprocess
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--region', required=True, type=str, default='', help='AWS region name')
@@ -32,22 +32,22 @@
 
 if __name__ == "__main__":
     nexus_password = 'NEXUS_PASSWORD'
-    local('wget http://repo.{}.amazonaws.com/2017.09/main/mirror.list -O /tmp/main_mirror.list'.format(args.region))
-    local('wget http://repo.{}.amazonaws.com/2017.09/updates/mirror.list -O /tmp/updates_mirror.list'.format(
-        args.region))
-    amazon_main_repo = local("cat /tmp/main_mirror.list  | grep {} | sed 's/$basearch//g'".format(args.region),
-                             capture=True)
-    amazon_updates_repo = local("cat /tmp/updates_mirror.list  | grep {} | sed 's/$basearch//g'".format(args.region),
-                                capture=True)
-    local('cp -f /opt/nexus/updateRepositories.groovy /tmp/updateRepositories.groovy')
-    local('sed -i "s|AMAZON_MAIN_URL|{}|g" /tmp/updateRepositories.groovy'.format(amazon_main_repo))
-    local('sed -i "s|AMAZON_UPDATES_URL|{}|g" /tmp/updateRepositories.groovy'.format(amazon_updates_repo))
-    local('/usr/local/groovy/latest/bin/groovy /tmp/addUpdateScript.groovy -u "admin" -p "{}" '
+    subprocess.run('wget http://repo.{}.amazonaws.com/2017.09/main/mirror.list -O /tmp/main_mirror.list'.format(args.region), shell=True, check=True)
+    subprocess.run('wget http://repo.{}.amazonaws.com/2017.09/updates/mirror.list -O /tmp/updates_mirror.list'.format(
+        args.region), shell=True, check=True)
+    amazon_main_repo = subprocess.run("cat /tmp/main_mirror.list  | grep {} | sed 's/$basearch//g'".format(args.region),
+                             capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+    amazon_updates_repo = subprocess.run("cat /tmp/updates_mirror.list  | grep {} | sed 's/$basearch//g'".format(args.region),
+                                capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+    subprocess.run('cp -f /opt/nexus/updateRepositories.groovy /tmp/updateRepositories.groovy', shell=True, check=True)
+    subprocess.run('sed -i "s|AMAZON_MAIN_URL|{}|g" /tmp/updateRepositories.groovy'.format(amazon_main_repo), shell=True, check=True)
+    subprocess.run('sed -i "s|AMAZON_UPDATES_URL|{}|g" /tmp/updateRepositories.groovy'.format(amazon_updates_repo), shell=True, check=True)
+    subprocess.run('/usr/local/groovy/latest/bin/groovy /tmp/addUpdateScript.groovy -u "admin" -p "{}" '
           '-n "updateRepositories" -f "/tmp/updateRepositories.groovy" -h "http://localhost:8081"'.format(
-           nexus_password))
-    local('curl -u admin:{} -X POST --header \'Content-Type: text/plain\' '
-          'http://localhost:8081/service/rest/v1/script/updateRepositories/run'.format(nexus_password))
-    local('rm -f /tmp/main_mirror.list')
-    local('rm -f /tmp/updates_mirror.list')
-    local('rm -f /tmp/updateRepositories.groovy')
+           nexus_password), shell=True, check=True)
+    subprocess.run('curl -u admin:{} -X POST --header \'Content-Type: text/plain\' '
+          'http://localhost:8081/service/rest/v1/script/updateRepositories/run'.format(nexus_password), shell=True, check=True)
+    subprocess.run('rm -f /tmp/main_mirror.list', shell=True, check=True)
+    subprocess.run('rm -f /tmp/updates_mirror.list', shell=True, check=True)
+    subprocess.run('rm -f /tmp/updateRepositories.groovy', shell=True, check=True)
     print('Amazon repositories have been successfully updated!')
diff --git a/infrastructure-provisioning/scripts/deploy_repository/templates/configureNexus.groovy b/infrastructure-provisioning/scripts/deploy_repository/templates/configureNexus.groovy
index 54608ac..12469b1 100644
--- a/infrastructure-provisioning/scripts/deploy_repository/templates/configureNexus.groovy
+++ b/infrastructure-provisioning/scripts/deploy_repository/templates/configureNexus.groovy
@@ -62,9 +62,9 @@
 
 // create a role for service user
 def role = new org.sonatype.nexus.security.role.Role(
-    roleId: "nx-dlab",
+    roleId: "nx-datalab",
     source: "Nexus",
-    name: "nx-dlab",
+    name: "nx-datalab",
     description: null,
     readOnly: false,
     privileges: [ 'nx-repository-view-*-*-*' ],
@@ -74,8 +74,8 @@
 
 // add a service user account
 security.addUser("SERVICE_USER_NAME",
-      "DLab", "Nexus",
-      "dlab-nexus@example.org", true,
+      "DataLab", "Nexus",
+      "datalab-nexus@example.org", true,
       "SERVICE_USER_PASSWORD", [ role.roleId ])
 
 security.securitySystem.changePassword('admin','ADMIN_PASSWORD')
diff --git a/infrastructure-provisioning/scripts/jenkins/sonar.py b/infrastructure-provisioning/scripts/jenkins/sonar.py
new file mode 100644
index 0000000..f5846cd
--- /dev/null
+++ b/infrastructure-provisioning/scripts/jenkins/sonar.py
@@ -0,0 +1,40 @@
+#!/usr/bin/python3
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+import requests
+import sys
+import time
+import urllib
+
+time.sleep(30)  # wait for new code to be analyzed by SonarQube
+
+PROJECT_KEY = urllib.quote(sys.argv[1])
+TOKEN = sys.argv[2]
+
+
+def get_sonarqube_status():
+    try:
+        response = requests.get('http://localhost:9000/sonar/api/qualitygates/project_status?projectKey=' + PROJECT_KEY,
+                                auth=(TOKEN, '')).json()
+        return response['projectStatus']['status']
+    except requests.exceptions.ConnectionError as e:
+        print('Cannot access SonarQube due to: ', e)
+        return 'FAILED'
+
+
+print(get_sonarqube_status())
diff --git a/infrastructure-provisioning/scripts/post-deployment_configuration.py b/infrastructure-provisioning/scripts/post-deployment_configuration.py
index 051258f..65aad0d 100644
--- a/infrastructure-provisioning/scripts/post-deployment_configuration.py
+++ b/infrastructure-provisioning/scripts/post-deployment_configuration.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,11 +21,12 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
 import argparse
 import requests
 import uuid
 from Crypto.PublicKey import RSA
+from fabric import *
+import subprocess
 
 if __name__ == "__main__":
 
@@ -43,105 +44,150 @@
     }
 
     print("Getting cloud and instance parameters")
-    server_external_ip = requests.get('http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip', headers=headers).text
-    dlab_sbn = requests.get('http://metadata/computeMetadata/v1/instance/name', headers=headers).text
-    dlab_ssn_static_ip_name = dlab_sbn + '-ip'
-    dlab_zone = requests.get('http://metadata/computeMetadata/v1/instance/zone', headers=headers).text.split('/')[-1]
-    dlab_region = '-'.join(dlab_zone.split('-', 2)[:2])
-    deployment_vpcId = local("sudo gcloud compute instances describe {0} --zone {1} --format 'value(networkInterfaces.network)' | sed 's|.*/||'".format(dlab_sbn, dlab_zone), capture=True)
-    deployment_subnetId = local("sudo gcloud compute instances describe {0} --zone {1} --format 'value(networkInterfaces.subnetwork)' | sed 's|.*/||'".format(dlab_sbn, dlab_zone), capture=True)
+    server_external_ip = requests.get(
+        'http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip',
+        headers=headers).text
+    datalab_sbn = requests.get('http://metadata/computeMetadata/v1/instance/name', headers=headers).text
+    datalab_ssn_static_ip_name = datalab_sbn + '-ip'
+    datalab_zone = requests.get('http://metadata/computeMetadata/v1/instance/zone', headers=headers).text.split('/')[-1]
+    datalab_region = '-'.join(datalab_zone.split('-', 2)[:2])
+    deployment_vpcId = subprocess.run(
+        "sudo gcloud compute instances describe {0} --zone {1} --format 'value(networkInterfaces.network)' | sed 's|.*/||'".format(
+            datalab_sbn, datalab_zone), capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+    deployment_subnetId = subprocess.run(
+        "sudo gcloud compute instances describe {0} --zone {1} --format 'value(networkInterfaces.subnetwork)' | sed 's|.*/||'".format(
+            datalab_sbn, datalab_zone), capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
     gcp_projectId = requests.get('http://metadata/computeMetadata/v1/project/project-id', headers=headers).text
     keycloak_redirectUri = 'http://{}'.format(server_external_ip)
 
-    print("Generationg SSH keyfile for dlab-user")
+    print("Generationg SSH keyfile for datalab-user")
     key = RSA.generate(2048)
-    local("sudo sh -c 'echo \"{}\" > /home/dlab-user/keys/KEY-FILE.pem'".format(key.exportKey('PEM')))
-    local("sudo chmod 600 /home/dlab-user/keys/KEY-FILE.pem")
+    subprocess.run("sudo sh -c 'echo \"{}\" > /home/datalab-user/keys/KEY-FILE.pem'".format(key.exportKey('PEM')), shell=True, check=True)
+    subprocess.run("sudo chmod 600 /home/datalab-user/keys/KEY-FILE.pem", shell=True, check=True)
     pubkey = key.publickey()
-    local("sudo sh -c 'echo \"{}\" > /home/dlab-user/.ssh/authorized_keys'".format(pubkey.exportKey('OpenSSH')))
+    subprocess.run("sudo sh -c 'echo \"{}\" > /home/datalab-user/.ssh/authorized_keys'".format(pubkey.exportKey('OpenSSH')), shell=True, check=True)
 
     print("Generationg MongoDB password")
     mongo_pwd = uuid.uuid4().hex
     try:
-        local("sudo echo -e 'db.changeUserPassword(\"admin\", \"{}\")' | mongo dlabdb --port 27017 -u admin -p MONGO_PASSWORD".format(mongo_pwd))
-        local('sudo sed -i "s|MONGO_PASSWORD|{}|g" /opt/dlab/conf/billing.yml'.format(mongo_pwd))
+        subprocess.run(
+            "sudo echo -e 'db.changeUserPassword(\"admin\", \"{}\")' | mongo datalabdb --port 27017 -u admin -p MONGO_PASSWORD".format(
+                mongo_pwd), shell=True, check=True)
+        subprocess.run('sudo sed -i "s|MONGO_PASSWORD|{}|g" /opt/datalab/conf/billing.yml'.format(mongo_pwd), shell=True, check=True)
 
-        local('sudo sed -i "s|MONGO_PASSWORD|{}|g" /opt/dlab/conf/ssn.yml'.format(mongo_pwd))
+        subprocess.run('sudo sed -i "s|MONGO_PASSWORD|{}|g" /opt/datalab/conf/ssn.yml'.format(mongo_pwd), shell=True, check=True)
     except:
         print('Mongo password was already changed')
 
     print('Reserving external IP')
-    static_address_exist = local(
-        "sudo gcloud compute addresses list --filter='address={}'".format(server_external_ip), capture=True)
+    static_address_exist = subprocess.run(
+        "sudo gcloud compute addresses list --filter='address={}'".format(server_external_ip), capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
     if static_address_exist:
         print('Address is already static')
     else:
-        local("sudo gcloud compute addresses create {0} --addresses {1} --region {2}".format(dlab_ssn_static_ip_name,
+        subprocess.run("sudo gcloud compute addresses create {0} --addresses {1} --region {2}".format(datalab_ssn_static_ip_name,
                                                                                              server_external_ip,
-                                                                                             dlab_region), capture=True)
+                                                                                             datalab_region),
+              capture_output=True, shell=True, check=True)
 
     print("Overwriting SSN parameters")
 
     if deployment_subnetId == 'default':
-        local('sudo sed -i "s|# user_subnets_range|user_subnets_range|g" /opt/dlab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini')
+        subprocess.run(
+            'sudo sed -i "s|# user_subnets_range|user_subnets_range|g" /opt/datalab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini', shell=True, check=True)
 
-    local('sudo sed -i "s|DLAB_SBN|{}|g" /opt/dlab/conf/self-service.yml'.format(dlab_sbn))
-    local('sudo sed -i "s|KEYCLOAK_REDIRECTURI|{}|g" /opt/dlab/conf/self-service.yml'.format(keycloak_redirectUri))
-    local('sudo sed -i "s|KEYCLOAK_REALM_NAME|{}|g" /opt/dlab/conf/self-service.yml'.format(args.keycloak_realm_name))
-    local('sudo sed -i "s|KEYCLOAK_AUTH_SERVER_URL|{}|g" /opt/dlab/conf/self-service.yml'.format(
-        args.keycloak_auth_server_url))
-    local('sudo sed -i "s|KEYCLOAK_CLIENT_NAME|{}|g" /opt/dlab/conf/self-service.yml'.format(args.keycloak_client_name))
-    local('sudo sed -i "s|KEYCLOAK_CLIENT_SECRET|{}|g" /opt/dlab/conf/self-service.yml'.format(
-        args.keycloak_client_secret))
+    subprocess.run('sudo sed -i "s|DATALAB_SBN|{}|g" /opt/datalab/conf/self-service.yml'.format(datalab_sbn), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|KEYCLOAK_REDIRECTURI|{}|g" /opt/datalab/conf/self-service.yml'.format(keycloak_redirectUri), shell=True, check=True)
+    subprocess.run(
+        'sudo sed -i "s|KEYCLOAK_REALM_NAME|{}|g" /opt/datalab/conf/self-service.yml'.format(args.keycloak_realm_name), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|KEYCLOAK_AUTH_SERVER_URL|{}|g" /opt/datalab/conf/self-service.yml'.format(
+        args.keycloak_auth_server_url), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|KEYCLOAK_CLIENT_NAME|{}|g" /opt/datalab/conf/self-service.yml'.format(
+        args.keycloak_client_name), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|KEYCLOAK_CLIENT_SECRET|{}|g" /opt/datalab/conf/self-service.yml'.format(
+        args.keycloak_client_secret), shell=True, check=True)
 
-    local('sudo sed -i "s|KEYCLOAK_REALM_NAME|{}|g" /opt/dlab/conf/provisioning.yml'.format(args.keycloak_realm_name))
-    local('sudo sed -i "s|KEYCLOAK_AUTH_SERVER_URL|{}|g" /opt/dlab/conf/provisioning.yml'.format(
-        args.keycloak_auth_server_url))
-    local('sudo sed -i "s|KEYCLOAK_CLIENT_NAME|{}|g" /opt/dlab/conf/provisioning.yml'.format(args.keycloak_client_name))
-    local('sudo sed -i "s|KEYCLOAK_CLIENT_SECRET|{}|g" /opt/dlab/conf/provisioning.yml'.format(
-        args.keycloak_client_secret))
-    local('sudo sed -i "s|DLAB_SBN|{}|g" /opt/dlab/conf/provisioning.yml'.format(dlab_sbn))
-    local('sudo sed -i "s|SUBNET_ID|{}|g" /opt/dlab/conf/provisioning.yml'.format(deployment_subnetId))
-    local('sudo sed -i "s|DLAB_REGION|{}|g" /opt/dlab/conf/provisioning.yml'.format(dlab_region))
-    local('sudo sed -i "s|DLAB_ZONE|{}|g" /opt/dlab/conf/provisioning.yml'.format(dlab_zone))
-    local('sudo sed -i "s|SSN_VPC_ID|{}|g" /opt/dlab/conf/provisioning.yml'.format(deployment_vpcId))
-    local('sudo sed -i "s|GCP_PROJECT_ID|{}|g" /opt/dlab/conf/provisioning.yml'.format(gcp_projectId))
-    local('sudo sed -i "s|KEYCLOAK_USER|{}|g" /opt/dlab/conf/provisioning.yml'.format(args.keycloak_user))
-    local('sudo sed -i "s|KEYCLOAK_ADMIN_PASSWORD|{}|g" /opt/dlab/conf/provisioning.yml'.format(
-        args.keycloak_admin_password))
+    subprocess.run(
+        'sudo sed -i "s|KEYCLOAK_REALM_NAME|{}|g" /opt/datalab/conf/provisioning.yml'.format(args.keycloak_realm_name), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|KEYCLOAK_AUTH_SERVER_URL|{}|g" /opt/datalab/conf/provisioning.yml'.format(
+        args.keycloak_auth_server_url), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|KEYCLOAK_CLIENT_NAME|{}|g" /opt/datalab/conf/provisioning.yml'.format(
+        args.keycloak_client_name), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|KEYCLOAK_CLIENT_SECRET|{}|g" /opt/datalab/conf/provisioning.yml'.format(
+        args.keycloak_client_secret), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|DATALAB_SBN|{}|g" /opt/datalab/conf/provisioning.yml'.format(datalab_sbn), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|SUBNET_ID|{}|g" /opt/datalab/conf/provisioning.yml'.format(deployment_subnetId), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|DATALAB_REGION|{}|g" /opt/datalab/conf/provisioning.yml'.format(datalab_region), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|DATALAB_ZONE|{}|g" /opt/datalab/conf/provisioning.yml'.format(datalab_zone), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|SSN_VPC_ID|{}|g" /opt/datalab/conf/provisioning.yml'.format(deployment_vpcId), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|GCP_PROJECT_ID|{}|g" /opt/datalab/conf/provisioning.yml'.format(gcp_projectId), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|KEYCLOAK_USER|{}|g" /opt/datalab/conf/provisioning.yml'.format(args.keycloak_user), shell=True, check=True)
+    subprocess.run('sudo sed -i "s|KEYCLOAK_ADMIN_PASSWORD|{}|g" /opt/datalab/conf/provisioning.yml'.format(
+        args.keycloak_admin_password), shell=True, check=True)
 
-    local('sudo sed -i "s|DLAB_SBN|{}|g" /opt/dlab/conf/billing.yml'.format(dlab_sbn))
+    subprocess.run('sudo sed -i "s|DATALAB_SBN|{}|g" /opt/datalab/conf/billing.yml'.format(datalab_sbn), shell=True, check=True)
 
-    local('sudo sed -i "s|DLAB_SBN|{}|g" /opt/dlab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(dlab_sbn))
-    local('sudo sed -i "s|GCP_PROJECT_ID|{}|g" /opt/dlab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(gcp_projectId))
-    local('sudo sed -i "s|DLAB_REGION|{}|g" /opt/dlab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(dlab_region))
-    local('sudo sed -i "s|DLAB_ZONE|{}|g" /opt/dlab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(dlab_zone))
-    local('sudo sed -i "s|KEYCLOAK_REALM_NAME|{}|g" /opt/dlab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(args.keycloak_realm_name))
-    local('sudo sed -i "s|KEYCLOAK_AUTH_SERVER_URL|{}|g" /opt/dlab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(args.keycloak_auth_server_url))
-    local('sudo sed -i "s|KEYCLOAK_CLIENT_NAME|{}|g" /opt/dlab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(args.keycloak_client_name))
-    local('sudo sed -i "s|KEYCLOAK_CLIENT_SECRET|{}|g" /opt/dlab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(args.keycloak_client_secret))
-    local('sudo sed -i "s|KEYCLOAK_USER|{}|g" /opt/dlab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(args.keycloak_user))
-    local('sudo sed -i "s|KEYCLOAK_ADMIN_PASSWORD|{}|g" /opt/dlab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(args.keycloak_admin_password))
+    subprocess.run(
+        'sudo sed -i "s|DATALAB_SBN|{}|g" /opt/datalab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(
+            datalab_sbn), shell=True, check=True)
+    subprocess.run(
+        'sudo sed -i "s|GCP_PROJECT_ID|{}|g" /opt/datalab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(
+            gcp_projectId), shell=True, check=True)
+    subprocess.run(
+        'sudo sed -i "s|DATALAB_REGION|{}|g" /opt/datalab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(
+            datalab_region), shell=True, check=True)
+    subprocess.run(
+        'sudo sed -i "s|DATALAB_ZONE|{}|g" /opt/datalab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(
+            datalab_zone), shell=True, check=True)
+    subprocess.run(
+        'sudo sed -i "s|KEYCLOAK_REALM_NAME|{}|g" /opt/datalab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(
+            args.keycloak_realm_name), shell=True, check=True)
+    subprocess.run(
+        'sudo sed -i "s|KEYCLOAK_AUTH_SERVER_URL|{}|g" /opt/datalab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(
+            args.keycloak_auth_server_url), shell=True, check=True)
+    subprocess.run(
+        'sudo sed -i "s|KEYCLOAK_CLIENT_NAME|{}|g" /opt/datalab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(
+            args.keycloak_client_name), shell=True, check=True)
+    subprocess.run(
+        'sudo sed -i "s|KEYCLOAK_CLIENT_SECRET|{}|g" /opt/datalab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(
+            args.keycloak_client_secret), shell=True, check=True)
+    subprocess.run(
+        'sudo sed -i "s|KEYCLOAK_USER|{}|g" /opt/datalab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(
+            args.keycloak_user), shell=True, check=True)
+    subprocess.run(
+        'sudo sed -i "s|KEYCLOAK_ADMIN_PASSWORD|{}|g" /opt/datalab/sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(
+            args.keycloak_admin_password), shell=True, check=True)
 
     print('SSL certificate generating')
     keystore_passwd = uuid.uuid4().hex
-    local('sudo rm /home/dlab-user/keys/ssn*')
-    local('sudo rm /etc/ssl/certs/dlab*')
-    local('sudo keytool -delete -noprompt -trustcacerts -alias ssn -storepass changeit -keystore /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts')
-    local('sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/dlab.key -out /etc/ssl/certs/dlab.crt -subj "/C=US/ST=US/L=US/O=dlab/CN=localhost/subjectAltName={0}"'.format(server_external_ip))
-    local('sudo openssl pkcs12 -export -in /etc/ssl/certs/dlab.crt -inkey /etc/ssl/certs/dlab.key -name ssn -out /home/dlab-user/keys/ssn.p12 -password pass:{0}'.format(keystore_passwd))
-    local('sudo keytool -importkeystore -srckeystore /home/dlab-user/keys/ssn.p12 -srcstoretype PKCS12 -alias ssn -destkeystore /home/dlab-user/keys/ssn.keystore.jks -deststorepass {0} -srcstorepass {0}'.format(keystore_passwd))
-    local('sudo keytool -importcert -trustcacerts -alias ssn -file /etc/ssl/certs/dlab.crt -noprompt -storepass changeit -keystore /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts')
-    local('sudo sed -i "s|KEYSTORE_PASSWORD|{}|g" /opt/dlab/conf/ssn.yml'.format(keystore_passwd))
+    subprocess.run('sudo rm /home/datalab-user/keys/ssn*', shell=True, check=True)
+    subprocess.run('sudo rm /etc/ssl/certs/datalab*', shell=True, check=True)
+    subprocess.run('sudo keytool -delete -noprompt -trustcacerts -alias ssn -storepass changeit -keystore '
+        '/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts', shell=True, check=True)
+    subprocess.run(
+        'sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/datalab.key -out '
+        '/etc/ssl/certs/datalab.crt -subj "/C=US/ST=US/L=US/O=datalab/CN=localhost/subjectAltName={0}"'.format(
+            server_external_ip), shell=True, check=True)
+    subprocess.run(
+        'sudo openssl pkcs12 -export -in /etc/ssl/certs/datalab.crt -inkey /etc/ssl/certs/datalab.key -name ssn -out '
+        '/home/datalab-user/keys/ssn.p12 -password pass:{0}'.format(keystore_passwd), shell=True, check=True)
+    subprocess.run(
+        'sudo keytool -importkeystore -srckeystore /home/datalab-user/keys/ssn.p12 -srcstoretype PKCS12 -alias '
+        'ssn -destkeystore /home/datalab-user/keys/ssn.keystore.jks -deststorepass {0} -srcstorepass {0}'.format(
+            keystore_passwd), shell=True, check=True)
+    subprocess.run(
+        'sudo keytool -importcert -trustcacerts -alias ssn -file /etc/ssl/certs/datalab.crt -noprompt -storepass '
+        'changeit -keystore /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts', shell=True, check=True)
+    subprocess.run('sudo sed -i "s|KEYSTORE_PASSWORD|{}|g" /opt/datalab/conf/ssn.yml'.format(keystore_passwd), shell=True, check=True)
 
     print('Nginx configuration updating')
-    local('sudo sed -i "s|SERVER_IP|{}|g" /etc/nginx/conf.d/nginx_proxy.conf'.format(server_external_ip))
-    local('sudo systemctl restart nginx')
-    local('sudo supervisorctl restart all')
+    subprocess.run('sudo sed -i "s|SERVER_IP|{}|g" /etc/nginx/conf.d/nginx_proxy.conf'.format(server_external_ip), shell=True, check=True)
+    subprocess.run('sudo systemctl restart nginx', shell=True, check=True)
+    subprocess.run('sudo supervisorctl restart all', shell=True, check=True)
 
     print('Rebuilding docker images')
-    local('cd /opt/dlab/sources/infrastructure-provisioning/src/ && sudo docker-build all')
+    subprocess.run('cd /opt/datalab/sources/infrastructure-provisioning/src/ && sudo docker-build all', shell=True, check=True)
 
     print('[SUMMARY]')
-    print('Mongo password stored in /opt/dlab/conf/ssn.yml')
-    print('SSH key for dlab-user stored in /home/dlab-user/keys/KEY-FILE.pem')
\ No newline at end of file
+    print('Mongo password stored in /opt/datalab/conf/ssn.yml')
+    print('SSH key for datalab-user stored in /home/datalab-user/keys/KEY-FILE.pem')
diff --git a/infrastructure-provisioning/src/base/entrypoint.py b/infrastructure-provisioning/src/base/entrypoint.py
index 4780acf..1095c7b 100644
--- a/infrastructure-provisioning/src/base/entrypoint.py
+++ b/infrastructure-provisioning/src/base/entrypoint.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,12 +22,13 @@
 # ******************************************************************************
 
 import os
-from ConfigParser import SafeConfigParser
+from configparser import ConfigParser
 import argparse
-from fabric.api import *
+import fabric
 import json
 import sys
 import select
+import subprocess
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--action', type=str, default='')
@@ -74,7 +75,7 @@
     # Get config (defaults) from files. Will not overwrite any env
     for filename in os.listdir('/root/conf'):
         if filename.endswith('.ini'):
-            config = SafeConfigParser()
+            config = ConfigParser()
             config.read(os.path.join('/root/conf', filename))
             for section in config.sections():
                 for option in config.options(section):
@@ -85,7 +86,7 @@
     # Overwrite config if overwrite.ini is provided
     for filename in os.listdir('/root/conf'):
         if filename.endswith('overwrite.ini'):
-            config = SafeConfigParser()
+            config = ConfigParser()
             config.read(os.path.join('/root/conf', filename))
             for section in config.sections():
                 for option in config.options(section):
@@ -106,9 +107,8 @@
     except:
         pass
 
-    with hide('running'):
-        if args.action != 'terminate':
-            local('chmod 600 /root/keys/*.pem')
+    if args.action != 'terminate':
+        subprocess.run('chmod 600 /root/keys/*.pem', shell=True, check=True)
 
     if dry_run:
         with open("/response/{}.json".format(request_id), 'w') as response_file:
@@ -117,12 +117,10 @@
 
     # Run execution routines
     elif args.action == 'create':
-        with hide('running'):
-            local("/bin/create.py")
+        subprocess.run("/bin/create.py", shell=True, check=True)
 
     elif args.action == 'status':
-        with hide('running'):
-            local("/bin/status.py")
+        subprocess.run("/bin/status.py", shell=True, check=True)
 
     elif args.action == 'describe':
         with open('/root/description.json') as json_file:
@@ -132,53 +130,40 @@
                 response_file.write(json.dumps(description))
 
     elif args.action == 'stop':
-        with hide('running'):
-            local("/bin/stop.py")
+        subprocess.run("/bin/stop.py", shell=True, check=True)
 
     elif args.action == 'start':
-        with hide('running'):
-            local("/bin/start.py")
+        subprocess.run("/bin/start.py", shell=True, check=True)
 
     elif args.action == 'terminate':
-        with hide('running'):
-            local("/bin/terminate.py")
+        subprocess.run("/bin/terminate.py", shell=True, check=True)
 
     elif args.action == 'configure':
-        with hide('running'):
-            local("/bin/configure.py")
+        subprocess.run("/bin/configure.py", shell=True, check=True)
 
     elif args.action == 'recreate':
-        with hide('running'):
-            local("/bin/recreate.py")
+        subprocess.run("/bin/recreate.py", shell=True, check=True)
 
     elif args.action == 'reupload_key':
-        with hide('running'):
-            local("/bin/reupload_key.py")
+        subprocess.run("/bin/reupload_key.py", shell=True, check=True)
 
     elif args.action == 'lib_install':
-        with hide('running'):
-            local("/bin/install_libs.py")
+        subprocess.run("/bin/install_libs.py", shell=True, check=True)
 
     elif args.action == 'lib_list':
-        with hide('running'):
-            local("/bin/list_libs.py")
+        subprocess.run("/bin/list_libs.py", shell=True, check=True)
 
     elif args.action == 'git_creds':
-        with hide('running'):
-            local("/bin/git_creds.py")
+        subprocess.run("/bin/git_creds.py", shell=True, check=True)
 
     elif args.action == 'create_image':
-        with hide('running'):
-            local("/bin/create_image.py")
+        subprocess.run("/bin/create_image.py", shell=True, check=True)
 
     elif args.action == 'terminate_image':
-        with hide('running'):
-            local("/bin/terminate_image.py")
+        subprocess.run("/bin/terminate_image.py", shell=True, check=True)
 
     elif args.action == 'reconfigure_spark':
-        with hide('running'):
-            local("/bin/reconfigure_spark.py")
+        subprocess.run("/bin/reconfigure_spark.py", shell=True, check=True)
 
     elif args.action == 'check_inactivity':
-        with hide('running'):
-            local("/bin/check_inactivity.py")
\ No newline at end of file
+        subprocess.run("/bin/check_inactivity.py", shell=True, check=True)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/base/scripts/create_ssh_user.py b/infrastructure-provisioning/src/base/scripts/create_ssh_user.py
index 482eb2c..183295c 100644
--- a/infrastructure-provisioning/src/base/scripts/create_ssh_user.py
+++ b/infrastructure-provisioning/src/base/scripts/create_ssh_user.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,10 +21,16 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
+from datalab.fab import *
 import argparse
 import sys
+import time
+import traceback
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -36,29 +42,26 @@
 
 
 def ensure_ssh_user(initial_user, os_user, sudo_group):
-    if not exists('/home/{}/.ssh_user_ensured'.format(initial_user)):
-        sudo('useradd -m -G {1} -s /bin/bash {0}'.format(os_user, sudo_group))
-        sudo('echo "{} ALL = NOPASSWD:ALL" >> /etc/sudoers'.format(os_user))
-        sudo('mkdir /home/{}/.ssh'.format(os_user))
-        sudo('chown -R {0}:{0} /home/{1}/.ssh/'.format(initial_user, os_user))
-        sudo('cat /home/{0}/.ssh/authorized_keys > /home/{1}/.ssh/authorized_keys'.format(initial_user, os_user))
-        sudo('chown -R {0}:{0} /home/{0}/.ssh/'.format(os_user))
-        sudo('chmod 700 /home/{0}/.ssh'.format(os_user))
-        sudo('chmod 600 /home/{0}/.ssh/authorized_keys'.format(os_user))
-        sudo('mkdir /home/{}/.ensure_dir'.format(os_user))
-        sudo('touch /home/{}/.ssh_user_ensured'.format(initial_user))
-
+    if not exists(conn, '/home/{}/.ssh_user_ensured'.format(initial_user)):
+        conn.sudo('useradd -m -G {1} -s /bin/bash {0}'.format(os_user, sudo_group))
+        conn.sudo('bash -c "echo \'{} ALL = NOPASSWD:ALL\' >> /etc/sudoers"'.format(os_user))
+        conn.sudo('mkdir /home/{}/.ssh'.format(os_user))
+        conn.sudo('chown -R {0}:{0} /home/{1}/.ssh/'.format(initial_user, os_user))
+        conn.sudo('''bash -c 'cat /home/{0}/.ssh/authorized_keys > /home/{1}/.ssh/authorized_keys' '''.format(initial_user, os_user))
+        conn.sudo('chown -R {0}:{0} /home/{0}/.ssh/'.format(os_user))
+        conn.sudo('chmod 700 /home/{0}/.ssh'.format(os_user))
+        conn.sudo('chmod 600 /home/{0}/.ssh/authorized_keys'.format(os_user))
+        conn.sudo('mkdir /home/{}/.ensure_dir'.format(os_user))
+        conn.sudo('touch /home/{}/.ssh_user_ensured'.format(initial_user))
 
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = '{}@{}'.format(args.initial_user, args.hostname)
-
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.initial_user, args.keyfile)
     print("Creating ssh user: {}".format(args.os_user))
     try:
         ensure_ssh_user(args.initial_user, args.os_user, args.sudo_group)
     except Exception as err:
         print('Failed to create ssh user', str(err))
         sys.exit(1)
-
+    conn.close()
diff --git a/infrastructure-provisioning/src/base/scripts/install_prerequisites.py b/infrastructure-provisioning/src/base/scripts/install_prerequisites.py
index e0c3c85..7b747b2 100644
--- a/infrastructure-provisioning/src/base/scripts/install_prerequisites.py
+++ b/infrastructure-provisioning/src/base/scripts/install_prerequisites.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,20 +21,21 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
 import argparse
 import json
-from dlab.fab import *
-from dlab.common_lib import *
-from fabric.contrib.files import exists
-import sys
 import os
-
+from datalab.common_lib import *
+from datalab.fab import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
+import traceback
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
 parser.add_argument('--keyfile', type=str, default='')
-parser.add_argument('--pip_packages', type=str, default='boto3 argparse fabric==1.14.0 awscli google-api-python-client google-auth-httplib2 google-cloud-storage pycrypto azure==2.0.0')
+parser.add_argument('--pip_packages', type=str,
+                    default='boto3 argparse fabric awscli google-api-python-client google-auth-httplib2 google-cloud-storage pycryptodome azure==2.0.0')
 parser.add_argument('--additional_config', type=str, default='{"empty":"string"}')
 parser.add_argument('--user', type=str, default='')
 parser.add_argument('--edge_private_ip', type=str, default='')
@@ -42,21 +43,19 @@
 args = parser.parse_args()
 
 
-def create_china_pip_conf_file():
-    if not exists('/home/{}/pip_china_ensured'.format(args.user)):
-        sudo('touch /etc/pip.conf')
-        sudo('echo "[global]" >> /etc/pip.conf')
-        sudo('echo "timeout = 600" >> /etc/pip.conf')
-        sudo('echo "index-url = https://{}/simple/" >> /etc/pip.conf'.format(os.environ['conf_pypi_mirror']))
-        sudo('echo "trusted-host = {}" >> /etc/pip.conf'.format(os.environ['conf_pypi_mirror']))
-        sudo('touch /home/{}/pip_china_ensured'.format(args.user))
-
+def create_china_pip_conf_file(conn):
+    if not exists(conn,'/home/{}/pip_china_ensured'.format(args.user)):
+        conn.sudo('touch /etc/pip.conf')
+        conn.sudo('echo "[global]" >> /etc/pip.conf')
+        conn.sudo('echo "timeout = 600" >> /etc/pip.conf')
+        conn.sudo('echo "index-url = https://{}/simple/" >> /etc/pip.conf'.format(os.environ['conf_pypi_mirror']))
+        conn.sudo('echo "trusted-host = {}" >> /etc/pip.conf'.format(os.environ['conf_pypi_mirror']))
+        conn.sudo('touch /home/{}/pip_china_ensured'.format(args.user))
 
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = '{}@{}'.format(args.user, args.hostname)
+    global conn
+    conn = init_datalab_connection(args.hostname, args.user, args.keyfile)
     deeper_config = json.loads(args.additional_config)
 
     if args.region == 'cn-north-1':
@@ -67,7 +66,11 @@
     update_hosts_file(args.user)
 
     print("Updating repositories and installing requested tools.")
-    ensure_pkg(args.user)
+    try:
+        ensure_pkg(args.user)
+    except:
+        traceback.print_exc()
+        sys.exit(1)
 
     print("Installing python packages: {}".format(args.pip_packages))
     ensure_pip(args.pip_packages)
@@ -75,4 +78,4 @@
     print("Installing NTPd")
     ensure_ntpd(args.user, args.edge_private_ip)
 
-
+    conn.close()
diff --git a/infrastructure-provisioning/src/base/scripts/install_user_key.py b/infrastructure-provisioning/src/base/scripts/install_user_key.py
index f079707..d7a5faf 100644
--- a/infrastructure-provisioning/src/base/scripts/install_user_key.py
+++ b/infrastructure-provisioning/src/base/scripts/install_user_key.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,13 +21,12 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
-from dlab.fab import *
 import argparse
 import json
 import sys
-import os
+import subprocess
+from datalab.fab import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -38,10 +37,10 @@
 
 
 def copy_key(config):
-    admin_key_pub = local('ssh-keygen -y -f {}'.format(args.keyfile),
-                          capture=True)
-    sudo('rm -f /home/{}/.ssh/authorized_keys'.format(args.user))
-    sudo('echo "{0}" >> /home/{1}/.ssh/authorized_keys'.format(admin_key_pub, args.user))
+    admin_key_pub = subprocess.run('ssh-keygen -y -f {}'.format(args.keyfile),
+                          capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+    conn.sudo('rm -f /home/{}/.ssh/authorized_keys'.format(args.user))
+    conn.sudo('echo "{0}" >> /home/{1}/.ssh/authorized_keys'.format(admin_key_pub, args.user))
     try:
         user_key = '{}{}.pub'.format(
             config.get('user_keydir'),
@@ -51,7 +50,7 @@
             key = open('{0}'.format(user_key)).read()
         else:
             key = config.get('user_key')
-        sudo('echo "{0}" >> /home/{1}/.ssh/authorized_keys'.format(key, args.user))
+        conn.sudo('echo "{0}" >> /home/{1}/.ssh/authorized_keys'.format(key, args.user))
     except:
         print('No user key')
 
@@ -61,20 +60,22 @@
 if __name__ == "__main__":
     print("Configure connections")
     try:
-        env['connection_attempts'] = 100
-        env.key_filename = [args.keyfile]
-        env.host_string = '{}@{}'.format(args.user, args.hostname)
+        global conn
+        conn = datalab.fab.init_datalab_connection(args.hostname, args.user, args.keyfile)
         deeper_config = json.loads(args.additional_config)
     except:
         print('Fail connection')
         sys.exit(2)
-
-    print("Ensuring safest ssh ciphers")
-    ensure_ciphers()
+    try:
+        print("Ensuring safest ssh ciphers")
+        ensure_ciphers()
+    except:
+        print('Faild to install safest ssh ciphers')
 
     print("Installing users key...")
     try:
         copy_key(deeper_config)
+        conn.close()
     except:
         print("Users keyfile {0} could not be found at {1}/{0}".format(args.keyfile, deeper_config['user_keydir']))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/dataengine-service/fabfile.py b/infrastructure-provisioning/src/dataengine-service/fabfile.py
index c21555b..74797b8 100644
--- a/infrastructure-provisioning/src/dataengine-service/fabfile.py
+++ b/infrastructure-provisioning/src/dataengine-service/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,35 +21,36 @@
 #
 # ******************************************************************************
 
-import json
-import time
-from fabric.api import *
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-import sys
-import os
-import uuid
 import logging
+import os
+import sys
+import uuid
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 
-def run():
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
-    local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
+@task
+def run(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
+    local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.INFO,
                         filename=local_log_filepath)
     dataengine_service_config = dict()
     dataengine_service_config['uuid'] = str(uuid.uuid4())[:5]
     try:
-        local("~/scripts/{}.py --uuid {}".format('dataengine-service_prepare', dataengine_service_config['uuid']))
+        subprocess.run("~/scripts/{}.py --uuid {}".format('dataengine-service_prepare', dataengine_service_config['uuid']), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing Data Engine service.", str(err))
         sys.exit(1)
 
     try:
-        local("~/scripts/{}.py --uuid {}".format('dataengine-service_configure', dataengine_service_config['uuid']))
+        subprocess.run("~/scripts/{}.py --uuid {}".format('dataengine-service_configure', dataengine_service_config['uuid']), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Data Engine service.", str(err))
@@ -57,7 +58,8 @@
 
 
 # Main function for installing additional libraries for Dataengine
-def install_libs():
+@task
+def install_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -66,7 +68,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('dataengine-service_install_libs'))
+        subprocess.run("~/scripts/{}.py".format('dataengine-service_install_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed installing additional libs for DataEngine service.", str(err))
@@ -74,7 +76,8 @@
 
 
 # Main function for get available libraries for Data Engine
-def list_libs():
+@task
+def list_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -83,14 +86,15 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('dataengine-service_list_libs'))
+        subprocess.run("~/scripts/{}.py".format('dataengine-service_list_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed get available libraries for Data Engine service.", str(err))
         sys.exit(1)
 
 
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -98,7 +102,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('dataengine-service_terminate'))
+        subprocess.run("~/scripts/{}.py".format('dataengine-service_terminate'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Notebook node.", str(err))
diff --git a/infrastructure-provisioning/src/dataengine/fabfile.py b/infrastructure-provisioning/src/dataengine/fabfile.py
index 319c6f1..23afa93 100644
--- a/infrastructure-provisioning/src/dataengine/fabfile.py
+++ b/infrastructure-provisioning/src/dataengine/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,40 +21,41 @@
 #
 # ******************************************************************************
 
-import json
-import time
-from fabric.api import *
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-import sys
-import os
-import uuid
 import logging
+import os
+import sys
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 
-def run():
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
-    local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
+@task
+def run(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
+    local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.INFO,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('dataengine_prepare'))
+        subprocess.run("~/scripts/{}.py".format('dataengine_prepare'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing Data Engine.", str(err))
         sys.exit(1)
 
     try:
-        local("~/scripts/{}.py".format('dataengine_configure'))
+        subprocess.run("~/scripts/{}.py".format('dataengine_configure'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Data Engine.", str(err))
         sys.exit(1)
 
 
-def start():
+@task
+def start(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -62,7 +63,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('dataengine_start'))
+        subprocess.run("~/scripts/{}.py".format('dataengine_start'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed starting Data Engine.", str(err))
@@ -70,7 +71,8 @@
 
 
 # Main function for installing additional libraries for Dataengine
-def install_libs():
+@task
+def install_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -79,7 +81,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('dataengine_install_libs'))
+        subprocess.run("~/scripts/{}.py".format('dataengine_install_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed installing additional libs for DataEngine.", str(err))
@@ -87,7 +89,8 @@
 
 
 # Main function for get available libraries for Data Engine
-def list_libs():
+@task
+def list_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -96,14 +99,15 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('dataengine_list_libs'))
+        subprocess.run("~/scripts/{}.py".format('dataengine_list_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed get available libraries for Data Engine.", str(err))
         sys.exit(1)
 
 
-def stop():
+@task
+def stop(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -111,14 +115,15 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('dataengine_stop'))
+        subprocess.run("~/scripts/{}.py".format('dataengine_stop'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed stopping Data Engine.", str(err))
         sys.exit(1)
 
 
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -126,7 +131,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('dataengine_terminate'))
+        subprocess.run("~/scripts/{}.py".format('dataengine_terminate'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed terminating Data Engine.", str(err))
@@ -134,7 +139,8 @@
 
 
 # Main function for reconfiguring Spark for Data Engine
-def reconfigure_spark():
+@task
+def reconfigure_spark(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -143,7 +149,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('dataengine_reconfigure_spark'))
+        subprocess.run("~/scripts/{}.py".format('dataengine_reconfigure_spark'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to reconfigure Spark for Data Engine.", str(err))
diff --git a/infrastructure-provisioning/src/dataengine/scripts/configure_dataengine.py b/infrastructure-provisioning/src/dataengine/scripts/configure_dataengine.py
index e5aacb8..7218cb9 100644
--- a/infrastructure-provisioning/src/dataengine/scripts/configure_dataengine.py
+++ b/infrastructure-provisioning/src/dataengine/scripts/configure_dataengine.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,13 +22,11 @@
 # ******************************************************************************
 
 import argparse
-import json
-import sys
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
 import os
-
+import sys
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -55,7 +53,9 @@
 cntk_version = os.environ['notebook_cntk_version']
 mxnet_version = os.environ['notebook_mxnet_version']
 python3_version = "3.4"
-scala_link = "http://www.scala-lang.org/files/archive/"
+python_venv_version = os.environ['notebook_python_venv_version']
+python_venv_path = '/opt/python/python{0}/bin/python{1}'.format(python_venv_version, python_venv_version[:3])
+scala_link = "https://www.scala-lang.org/files/archive/"
 if args.region == 'cn-north-1':
     spark_link = "http://mirrors.hust.edu.cn/apache/spark/spark-" + spark_version + "/spark-" + spark_version + \
                  "-bin-hadoop" + hadoop_version + ".tgz"
@@ -72,7 +72,7 @@
 files_dir = '/root/files/'
 local_spark_path = '/opt/spark/'
 jars_dir = '/opt/jars/'
-r_libs = ['R6', 'pbdZMQ', 'RCurl', 'devtools', 'reshape2', 'caTools', 'rJava', 'ggplot2']
+r_libs = ['R6', 'pbdZMQ={}'.format(os.environ['notebook_pbdzmq_version']), 'RCurl', 'reshape2', 'caTools={}'.format(os.environ['notebook_catools_version']), 'rJava', 'ggplot2']
 if os.environ['application'] == 'deeplearning':
     tensorflow_version = '1.4.0'
     cuda_version = '8.0'
@@ -82,35 +82,34 @@
 
 
 def start_spark(os_user, master_ip, node):
-    if not exists('/home/{0}/.ensure_dir/start_spark-{1}_ensured'.format(os_user, node)):
-        if not exists('/opt/spark/conf/spark-env.sh'):
-            sudo('mv /opt/spark/conf/spark-env.sh.template /opt/spark/conf/spark-env.sh')
-        sudo('''echo "SPARK_MASTER_HOST='{}'" >> /opt/spark/conf/spark-env.sh'''.format(master_ip))
+    if not exists(conn,'/home/{0}/.ensure_dir/start_spark-{1}_ensured'.format(os_user, node)):
+        if not exists(conn,'/opt/spark/conf/spark-env.sh'):
+            conn.sudo('mv /opt/spark/conf/spark-env.sh.template /opt/spark/conf/spark-env.sh')
+        conn.sudo('''echo "SPARK_MASTER_HOST='{}'" >> /opt/spark/conf/spark-env.sh'''.format(master_ip))
         if os.environ['application'] in ('tensor', 'tensor-rstudio'):
-            sudo('''echo "LD_LIBRARY_PATH=/opt/cudnn/lib64:/usr/local/cuda/lib64" >> /opt/spark/conf/spark-env.sh''')
+            conn.sudo('''echo "LD_LIBRARY_PATH=/opt/cudnn/lib64:/usr/local/cuda/lib64" >> /opt/spark/conf/spark-env.sh''')
         if os.environ['application'] == 'deeplearning':
-            sudo('''echo "LD_LIBRARY_PATH=/opt/cudnn/lib64:/usr/local/cuda/lib64:/usr/lib64/openmpi/lib" >> /opt/spark/conf/spark-env.sh''')
+            conn.sudo('''echo "LD_LIBRARY_PATH=/opt/cudnn/lib64:/usr/local/cuda/lib64:/usr/lib64/openmpi/lib" >> /opt/spark/conf/spark-env.sh''')
         if node == 'master':
-            with cd('/opt/spark/sbin/'):
-                sudo("sed -i '/start-slaves.sh/d' start-all.sh")
-                sudo('''echo '"${}/sbin"/start-slave.sh spark://{}:7077' >> start-all.sh'''.format('{SPARK_HOME}', master_ip))
-            put('~/templates/spark-master.service', '/tmp/spark-master.service')
-            sudo('mv /tmp/spark-master.service /etc/systemd/system/spark-master.service')
-            sudo('systemctl daemon-reload')
-            sudo('systemctl enable spark-master.service')
-            sudo('systemctl start spark-master.service')
+            conn.sudo("sed -i '/start-slaves.sh/d' /opt/spark/sbin/start-all.sh")
+            conn.sudo('''echo '"${}/sbin"/start-slave.sh spark://{}:7077' >> /opt/spark/sbin/start-all.sh'''.format('{SPARK_HOME}', master_ip))
+            conn.put('/root/templates/spark-master.service', '/tmp/spark-master.service')
+            conn.sudo('mv /tmp/spark-master.service /etc/systemd/system/spark-master.service')
+            conn.sudo('systemctl daemon-reload')
+            conn.sudo('systemctl enable spark-master.service')
+            conn.sudo('systemctl start spark-master.service')
         if node == 'slave':
             with open('/root/templates/spark-slave.service', 'r') as f:
                 text = f.read()
             text = text.replace('MASTER', 'spark://{}:7077'.format(master_ip))
             with open('/root/templates/spark-slave.service', 'w') as f:
                 f.write(text)
-            put('~/templates/spark-slave.service', '/tmp/spark-slave.service')
-            sudo('mv /tmp/spark-slave.service /etc/systemd/system/spark-slave.service')
-            sudo('systemctl daemon-reload')
-            sudo('systemctl enable spark-slave.service')
-            sudo('systemctl start spark-slave.service')
-        sudo('touch /home/{0}/.ensure_dir/start_spark-{1}_ensured'.format(os_user, node))
+            conn.put('/root/templates/spark-slave.service', '/tmp/spark-slave.service')
+            conn.sudo('mv /tmp/spark-slave.service /etc/systemd/system/spark-slave.service')
+            conn.sudo('systemctl daemon-reload')
+            conn.sudo('systemctl enable spark-slave.service')
+            conn.sudo('systemctl start spark-slave.service')
+        conn.sudo('touch /home/{0}/.ensure_dir/start_spark-{1}_ensured'.format(os_user, node))
 
 ##############
 # Run script #
@@ -119,15 +118,14 @@
 
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     # PREPARE DISK
     print("Prepare .ensure directory")
     try:
-        if not exists('/home/' + args.os_user + '/.ensure_dir'):
-            sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
+        if not exists(conn,'/home/' + args.os_user + '/.ensure_dir'):
+            conn.sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
     except:
         sys.exit(1)
 
@@ -142,14 +140,16 @@
             or os.environ['application'] in ('rstudio', 'tensor-rstudio'):
         print("Installing R")
         ensure_r(args.os_user, r_libs, args.region, args.r_mirror)
-    print("Install Python 2 modules")
-    ensure_python2_libraries(args.os_user)
     print("Install Python 3 modules")
     ensure_python3_libraries(args.os_user)
     if os.environ['application'] == 'zeppelin':
         print("Install python3 specific version")
         ensure_python3_specific_version(python3_version, args.os_user)
 
+    # INSTALL PYTHON IN VIRTUALENV
+    print("Configure Python Virtualenv")
+    ensure_python_venv(python_venv_version)
+
     # INSTALL SPARK AND CLOUD STORAGE JARS FOR SPARK
     print("Install Spark")
     ensure_local_spark(args.os_user, spark_link, spark_version, hadoop_version, local_spark_path)
@@ -173,8 +173,8 @@
     if os.environ['application'] == 'deeplearning':
         print("Installing Caffe2")
         install_caffe2(args.os_user, caffe2_version, cmake_version)
-        print("Installing Torch")
-        install_torch(args.os_user)
+        #print("Installing Torch")
+        #install_torch(args.os_user)
         print("Install CNTK Python library")
         install_cntk(args.os_user, cntk_version)
         print("Installing MXNET")
@@ -202,3 +202,27 @@
     if os.environ['application'] == 'zeppelin' and os.environ['notebook_r_enabled'] == 'true':
         print("Install additional R packages")
         install_r_packages(args.os_user)
+
+    # INSTALL LIVY
+    if not exists(conn, '/home/{0}/.ensure_dir/livy_ensured'.format(args.os_user)):
+        conn.sudo('wget -P /tmp/  --user={} --password={} '
+                  '{}/repository/packages/livy.tar.gz --no-check-certificate'
+                  .format(os.environ['conf_repository_user'],
+                          os.environ['conf_repository_pass'], os.environ['conf_repository_address']))
+        conn.sudo('tar -xzvf /tmp/livy.tar.gz -C /tmp/')
+        conn.sudo('mv /tmp/incubator-livy /opt/livy')
+        conn.sudo('mkdir /var/log/livy')
+        conn.put('/root/templates/livy-env.sh', '/tmp/livy-env.sh')
+        conn.sudo("sed -i 's|=python3|={}|' /tmp/livy-env.sh".format(python_venv_path))
+        conn.sudo('mv /tmp/livy-env.sh /opt/livy/conf/livy-env.sh')
+        conn.sudo('chown -R -L {0}:{0} /opt/livy/'.format(args.os_user))
+        conn.sudo('chown -R {0}:{0} /var/log/livy'.format(args.os_user))
+        conn.put('/root/templates/livy.service', '/tmp/livy.service')
+        conn.sudo("sed -i 's|OS_USER|{}|' /tmp/livy.service".format(args.os_user))
+        conn.sudo('mv /tmp/livy.service /etc/systemd/system/livy.service')
+        conn.sudo('systemctl daemon-reload')
+        conn.sudo('systemctl enable livy.service')
+        conn.sudo('systemctl start livy.service')
+        conn.sudo('touch /home/{0}/.ensure_dir/livy_ensured'.format(args.os_user))
+
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/deeplearning/fabfile.py b/infrastructure-provisioning/src/deeplearning/fabfile.py
index cd9fbb5..76be0fc 100644
--- a/infrastructure-provisioning/src/deeplearning/fabfile.py
+++ b/infrastructure-provisioning/src/deeplearning/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,18 +22,20 @@
 # ******************************************************************************
 
 import logging
-import json
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
 import os
+import sys
 import uuid
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 
 # Main function for provisioning notebook server
-def run():
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
+@task
+def run(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
@@ -44,7 +46,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('common_prepare_notebook', params))
+        subprocess.run("~/scripts/{}.py {}".format('common_prepare_notebook', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing Notebook node.", str(err))
@@ -52,7 +54,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('deeplearning_configure', params))
+        subprocess.run("~/scripts/{}.py {}".format('deeplearning_configure', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Notebook node.", str(err))
@@ -60,14 +62,15 @@
 
 
 # Main function for terminating exploratory environment
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed terminating Notebook node.", str(err))
@@ -75,14 +78,15 @@
 
 
 # Main function for stopping notebook server
-def stop():
+@task
+def stop(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_stop_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_stop_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed stopping Notebook node.", str(err))
@@ -90,7 +94,8 @@
 
 
 # Main function for starting notebook server
-def start():
+@task
+def start(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -98,7 +103,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_start_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_start_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed starting Notebook node.", str(err))
@@ -106,7 +111,8 @@
 
 
 # Main function for configuring notebook server after deploying DataEngine service
-def configure():
+@task
+def configure(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -116,7 +122,7 @@
 
     try:
         if os.environ['conf_resource'] == 'dataengine':
-            local("~/scripts/{}.py".format('common_notebook_configure_dataengine'))
+            subprocess.run("~/scripts/{}.py".format('common_notebook_configure_dataengine'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring dataengine on Notebook node.", str(err))
@@ -124,7 +130,8 @@
 
 
 # Main function for installing additional libraries for notebook
-def install_libs():
+@task
+def install_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -133,7 +140,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_install_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_install_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed installing additional libs for Notebook node.", str(err))
@@ -141,7 +148,8 @@
 
 
 # Main function for get available libraries for notebook
-def list_libs():
+@task
+def list_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -150,7 +158,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_list_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_list_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed get available libraries for notebook node.", str(err))
@@ -158,7 +166,8 @@
 
 
 # Main function for manage git credentials on notebook
-def git_creds():
+@task
+def git_creds(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -167,7 +176,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_git_creds'))
+        subprocess.run("~/scripts/{}.py".format('notebook_git_creds'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to manage git credentials for notebook node.", str(err))
@@ -175,7 +184,8 @@
 
 
 # Main function for creating image from notebook
-def create_image():
+@task
+def create_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -184,7 +194,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_create_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_create_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -192,7 +202,8 @@
 
 
 # Main function for deleting existing notebook image
-def terminate_image():
+@task
+def terminate_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -201,7 +212,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -209,7 +220,8 @@
 
 
 # Main function for reconfiguring Spark for notebook
-def reconfigure_spark():
+@task
+def reconfigure_spark(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -218,14 +230,15 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_reconfigure_spark'))
+        subprocess.run("~/scripts/{}.py".format('notebook_reconfigure_spark'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to reconfigure Spark for Notebook node.", str(err))
         sys.exit(1)
 
 # Main function for checking inactivity status
-def check_inactivity():
+@task
+def check_inactivity(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -234,7 +247,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_inactivity_check'))
+        subprocess.run("~/scripts/{}.py".format('notebook_inactivity_check'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to check inactivity status.", str(err))
diff --git a/infrastructure-provisioning/src/deeplearning/scripts/configure_deep_learning_node.py b/infrastructure-provisioning/src/deeplearning/scripts/configure_deep_learning_node.py
index 741ca18..54f8601 100644
--- a/infrastructure-provisioning/src/deeplearning/scripts/configure_deep_learning_node.py
+++ b/infrastructure-provisioning/src/deeplearning/scripts/configure_deep_learning_node.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,15 @@
 #
 # ******************************************************************************
 
-from dlab.actions_lib import *
-from dlab.common_lib import *
-from dlab.notebook_lib import *
-from dlab.fab import *
-from fabric.api import *
-from fabric.contrib.files import exists
 import argparse
 import os
-
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -57,13 +57,13 @@
 cmake_version = os.environ['notebook_cmake_version']
 cntk_version = os.environ['notebook_cntk_version']
 mxnet_version = os.environ['notebook_mxnet_version']
-keras_version = '2.0.8'
+keras_version = os.environ['notebook_keras_version']
 theano_version = os.environ['notebook_theano_version']
-tensorflow_version = '1.4.0'
-cuda_version = '8.0'
-cuda_file_name = 'cuda_8.0.44_linux-run'
-cudnn_version = '6.0'
-cudnn_file_name = 'cudnn-8.0-linux-x64-v6.0.tgz'
+tensorflow_version = os.environ['notebook_tensorflow_version']
+cuda_version = os.environ['notebook_cuda_version']
+cuda_file_name = os.environ['notebook_cuda_file_name']
+cudnn_version = os.environ['notebook_cudnn_version']
+cudnn_file_name = os.environ['notebook_cudnn_file_name']
 
 if args.region == 'cn-north-1':
     spark_link = "http://mirrors.hust.edu.cn/apache/spark/spark-" + spark_version + "/spark-" + spark_version + \
@@ -80,96 +80,130 @@
 
 
 def install_itorch(os_user):
-    if not exists('/home/{}/.ensure_dir/itorch_ensured'.format(os_user)):
-        run('git clone https://github.com/facebook/iTorch.git')
-        with cd('/home/{}/iTorch/'.format(os_user)):
-            run('luarocks make')
-        sudo('cp -rf /home/{0}/.ipython/kernels/itorch/ /home/{0}/.local/share/jupyter/kernels/'.format(os_user))
-        sudo('chown -R {0}:{0} /home/{0}/.local/share/jupyter/'.format(os_user))
-        sudo('touch /home/{}/.ensure_dir/itorch_ensured'.format(os_user))
+    if not exists(conn,'/home/{}/.ensure_dir/itorch_ensured'.format(os_user)):
+        conn.run('git clone https://github.com/facebook/iTorch.git')
+        conn.run('cd /home/{}/iTorch/ && luarocks install luacrypto'.format(os_user))
+        conn.run('cd /home/{}/iTorch/ && luarocks install uuid'.format(os_user))
+        conn.run('cd /home/{}/iTorch/ && luarocks install lzmq'.format(os_user))
+        conn.run('cd /home/{}/iTorch/ && luarocks make'.format(os_user))
+        conn.sudo('cp -rf /home/{0}/.ipython/kernels/itorch/ /home/{0}/.local/share/jupyter/kernels/'.format(os_user))
+        conn.sudo('chown -R {0}:{0} /home/{0}/.local/share/jupyter/'.format(os_user))
+        conn.sudo('touch /home/{}/.ensure_dir/itorch_ensured'.format(os_user))
+
+def configure_jupyterlab_at_gcp_image(os_user, exploratory_name):
+    if not exists(conn, '/home/{}/.ensure_dir/jupyterlab_ensured'.format(os_user)):
+        jupyter_conf_file = '/home/jupyter/.jupyter/jupyter_notebook_config.py'
+        conn.sudo('''bash -l -c 'sed -i "s|c.NotebookApp|#c.NotebookApp|g" {}' '''.format(jupyter_conf_file))
+        conn.sudo('''bash -l -c "echo 'c.NotebookApp.ip = \\"0.0.0.0\\" ' >> {}" '''.format(jupyter_conf_file))
+        conn.sudo('''bash -l -c "echo 'c.NotebookApp.port = 8888' >> {}" '''.format(jupyter_conf_file))
+        conn.sudo('''bash -l -c "echo 'c.NotebookApp.base_url = \\"/{0}/\\"' >> {1}" '''.format(exploratory_name,
+                                                                                                jupyter_conf_file))
+        conn.sudo('''bash -l -c "echo 'c.NotebookApp.open_browser = False' >> {}" '''.format(jupyter_conf_file))
+        conn.sudo('''bash -l -c "echo 'c.NotebookApp.allow_remote_access = True' >> {}" '''.format(jupyter_conf_file))
+        conn.sudo('''bash -l -c "echo 'c.NotebookApp.cookie_secret = b\\"{0}\\"' >> {1}" '''.format(id_generator(),
+                                                                                                    jupyter_conf_file))
+        conn.sudo('''bash -l -c "echo \\"c.NotebookApp.token = u''\\" >> {}" '''.format(jupyter_conf_file))
+        conn.sudo('systemctl restart jupyter')
+        conn.sudo('touch /home/{}/.ensure_dir/jupyterlab_ensured'.format(os_user))
 
 
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     # PREPARE DISK
     print("Prepare .ensure directory")
     try:
-        if not exists('/home/' + args.os_user + '/.ensure_dir'):
-            sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
-            sudo('touch /home/' + args.os_user + '/.ensure_dir/deep_learning')
+        if not exists(conn,'/home/' + args.os_user + '/.ensure_dir'):
+            conn.sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
+            conn.sudo('touch /home/' + args.os_user + '/.ensure_dir/deep_learning')
     except:
         sys.exit(1)
     print("Mount additional volume")
-    prepare_disk(args.os_user)
+    if os.environ['conf_cloud_provider'] == 'gcp' and os.environ['conf_deeplearning_cloud_ami'] == 'true':
+        print('Additional disk premounted by google image')
+        print('Installing nvidia drivers')
+        try:
+            conn.sudo('/opt/deeplearning/install-driver.sh')
+        except:
+            traceback.print_exc()
+            sys.exit(1)
+    else:
+        prepare_disk(args.os_user)
 
-    # INSTALL LANGUAGES
-    print("Install Java")
-    ensure_jre_jdk(args.os_user)
-    print("Install Python 2 modules")
-    ensure_python2_libraries(args.os_user)
-    print("Install Python 3 modules")
-    ensure_python3_libraries(args.os_user)
+    if os.environ['conf_deeplearning_cloud_ami'] == 'false':
+        # INSTALL LANGUAGES
+        print("Install Java")
+        ensure_jre_jdk(args.os_user)
+        print("Install Python 3 modules")
+        ensure_python3_libraries(args.os_user)
 
-    # INSTALL TENSORFLOW AND OTHER DEEP LEARNING LIBRARIES AND FRAMEWORKS
-    print("Install TensorFlow")
-    install_tensor(args.os_user, cuda_version, cuda_file_name,
-                   cudnn_version, cudnn_file_name, tensorflow_version,
-                   templates_dir, nvidia_version)
-    print("Install Theano")
-    install_theano(args.os_user, theano_version)
-    print("Installing Keras")
-    install_keras(args.os_user, keras_version)
-    print("Installing Caffe2")
-    install_caffe2(args.os_user, caffe2_version, cmake_version)
-    print("Installing Torch")
-    install_torch(args.os_user)
-    print("Install CNTK Python library")
-    install_cntk(args.os_user, cntk_version)
-    print("Installing MXNET")
-    install_mxnet(args.os_user, mxnet_version)
+        # INSTALL TENSORFLOW AND OTHER DEEP LEARNING LIBRARIES AND FRAMEWORKS
+        print("Install TensorFlow")
+        install_tensor(args.os_user, cuda_version, cuda_file_name,
+                       cudnn_version, cudnn_file_name, tensorflow_version,
+                       templates_dir, nvidia_version)
+        print("Install Theano")
+        install_theano(args.os_user, theano_version)
+        print("Installing Keras")
+        install_keras(args.os_user, keras_version)
+        print("Installing Caffe2")
+        install_caffe2(args.os_user, caffe2_version, cmake_version)
+        #print("Installing Torch")
+        #install_torch(args.os_user)
+        print("Install CNTK Python library")
+        install_cntk(args.os_user, cntk_version)
+        print("Installing MXNET")
+        install_mxnet(args.os_user, mxnet_version)
 
-    # INSTALL JUPYTER NOTEBOOK
-    print("Install Jupyter")
-    configure_jupyter(args.os_user, jupyter_conf_file, templates_dir, args.jupyter_version, args.exploratory_name)
+        # INSTALL JUPYTER NOTEBOOK
+        print("Install Jupyter")
+        configure_jupyter(args.os_user, jupyter_conf_file, templates_dir, args.jupyter_version, args.exploratory_name)
 
-    # INSTALL SPARK AND CLOUD STORAGE JARS FOR SPARK
-    print("Install local Spark")
-    ensure_local_spark(args.os_user, spark_link, spark_version, hadoop_version, local_spark_path)
-    print("Install storage jars")
-    ensure_local_jars(args.os_user, jars_dir)
-    print("Configure local Spark")
-    configure_local_spark(jars_dir, templates_dir)
+        # INSTALL SPARK AND CLOUD STORAGE JARS FOR SPARK
+        print("Install local Spark")
+        ensure_local_spark(args.os_user, spark_link, spark_version, hadoop_version, local_spark_path)
+        print("Install storage jars")
+        ensure_local_jars(args.os_user, jars_dir)
+        print("Configure local Spark")
+        configure_local_spark(jars_dir, templates_dir)
 
-    # INSTALL JUPYTER KERNELS
-    print("Install pyspark local kernel for Jupyter")
-    ensure_pyspark_local_kernel(args.os_user, pyspark_local_path_dir, templates_dir, spark_version)
-    print("Install py3spark local kernel for Jupyter")
-    ensure_py3spark_local_kernel(args.os_user, py3spark_local_path_dir, templates_dir, spark_version)
-    print("Installing ITorch kernel for Jupyter")
-    install_itorch(args.os_user)
+        # INSTALL JUPYTER KERNELS
+        print("Install pyspark local kernel for Jupyter")
+        ensure_pyspark_local_kernel(args.os_user, pyspark_local_path_dir, templates_dir, spark_version)
+        print("Install py3spark local kernel for Jupyter")
+        ensure_py3spark_local_kernel(args.os_user, py3spark_local_path_dir, templates_dir, spark_version)
+        #print("Installing ITorch kernel for Jupyter")
+        #install_itorch(args.os_user)
+
+        # INSTALL OPTIONAL PACKAGES
+        print("Installing additional Python packages")
+        ensure_additional_python_libs(args.os_user)
+        print("Install Matplotlib")
+        ensure_matplot(args.os_user)
+    elif os.environ['conf_deeplearning_cloud_ami'] == 'true' and os.environ['conf_cloud_provider'] != 'gcp':
+        # CONFIGURE JUPYTER NOTEBOOK
+        print("Configure Jupyter")
+        configure_jupyter(args.os_user, jupyter_conf_file, templates_dir, args.jupyter_version, args.exploratory_name)
+    else:
+        configure_jupyterlab_at_gcp_image(args.os_user, args.exploratory_name)
+
 
     # INSTALL UNGIT
     print("Install nodejs")
     install_nodejs(args.os_user)
     print("Install Ungit")
     install_ungit(args.os_user, args.exploratory_name, args.edge_ip)
-    if exists('/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
+    if exists(conn, '/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
         install_gitlab_cert(args.os_user, gitlab_certfile)
 
     # INSTALL INACTIVITY CHECKER
     print("Install inactivity checker")
     install_inactivity_checker(args.os_user, args.ip_address)
 
-    # INSTALL OPTIONAL PACKAGES
-    print("Installing additional Python packages")
-    ensure_additional_python_libs(args.os_user)
-    print("Install Matplotlib")
-    ensure_matplot(args.os_user)
-    
     #POST INSTALLATION PROCESS
     print("Updating pyOpenSSL library")
-    update_pyopenssl_lib(args.os_user)
\ No newline at end of file
+    update_pyopenssl_lib(args.os_user)
+
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/edge/fabfile.py b/infrastructure-provisioning/src/edge/fabfile.py
index 66a656b..b645989 100644
--- a/infrastructure-provisioning/src/edge/fabfile.py
+++ b/infrastructure-provisioning/src/edge/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,24 +21,25 @@
 #
 # ******************************************************************************
 
-import json
-from fabric.api import *
 import logging
-import sys
 import os
-from dlab.fab import *
+import sys
 import traceback
+import subprocess
+from datalab.fab import *
+from fabric import *
 
-
-def status():
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
+@task
+def status(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/edge/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('edge_status'))
+        subprocess.run("~/scripts/{}.py".format('edge_status'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed obtaining EDGE status.", str(err))
@@ -46,14 +47,15 @@
 
 
 # Main function for stopping EDGE node
-def stop():
+@task
+def stop(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'], os.environ['request_id'])
     local_log_filepath = "/logs/edge/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('edge_stop'))
+        subprocess.run("~/scripts/{}.py".format('edge_stop'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed stopping Edge node.", str(err))
@@ -61,14 +63,15 @@
 
 
 # Main function for starting stoped EDGE node
-def start():
+@task
+def start(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'], os.environ['request_id'])
     local_log_filepath = "/logs/edge/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('edge_start'))
+        subprocess.run("~/scripts/{}.py".format('edge_start'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed starting Edge node.", str(err))
diff --git a/infrastructure-provisioning/src/edge/scripts/configure_http_proxy.py b/infrastructure-provisioning/src/edge/scripts/configure_http_proxy.py
index bad50ad..3580b43 100644
--- a/infrastructure-provisioning/src/edge/scripts/configure_http_proxy.py
+++ b/infrastructure-provisioning/src/edge/scripts/configure_http_proxy.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,12 +21,12 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
-from dlab.edge_lib import configure_http_proxy_server
 import argparse
 import json
 import sys
+from datalab.edge_lib import configure_http_proxy_server
+from fabric import *
+from datalab.fab import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -41,12 +41,12 @@
 if __name__ == "__main__":
     print("Configure connections")
     try:
-        env['connection_attempts'] = 100
-        env.key_filename = [args.keyfile]
-        env.host_string = '{}@{}'.format(args.user, args.hostname)
+        global conn
+        conn = datalab.fab.init_datalab_connection(args.hostname, args.user, args.keyfile)
         deeper_config = json.loads(args.additional_config)
     except:
         sys.exit(2)
 
     print("Installing proxy for notebooks.")
     configure_http_proxy_server(deeper_config)
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/edge/scripts/configure_nginx_reverse_proxy.py b/infrastructure-provisioning/src/edge/scripts/configure_nginx_reverse_proxy.py
index b7123a3..6513db8 100644
--- a/infrastructure-provisioning/src/edge/scripts/configure_nginx_reverse_proxy.py
+++ b/infrastructure-provisioning/src/edge/scripts/configure_nginx_reverse_proxy.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,12 +21,13 @@
 #
 # ******************************************************************************
 
-import logging
-from fabric.api import *
 import argparse
-import sys
+import logging
 import os
-from dlab.edge_lib import install_nginx_ldap
+import sys
+from datalab.edge_lib import install_nginx_ldap
+from fabric import *
+from datalab.fab import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -45,9 +46,8 @@
 
     print("Configure connections")
     try:
-        env['connection_attempts'] = 100
-        env.key_filename = [args.keyfile]
-        env.host_string = '{}@{}'.format(args.user, args.hostname)
+        global conn
+        conn = datalab.fab.init_datalab_connection(args.hostname, args.user, args.keyfile)
     except Exception as err:
         print("Failed establish connection. Excpeption: " + str(err))
         sys.exit(1)
@@ -60,4 +60,4 @@
     except Exception as err:
         print("Failed install nginx reverse proxy: " + str(err))
         sys.exit(1)
-
+    conn.close()
diff --git a/infrastructure-provisioning/src/edge/scripts/reupload_ssh_key.py b/infrastructure-provisioning/src/edge/scripts/reupload_ssh_key.py
index b853af5..4f8483b 100644
--- a/infrastructure-provisioning/src/edge/scripts/reupload_ssh_key.py
+++ b/infrastructure-provisioning/src/edge/scripts/reupload_ssh_key.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,15 @@
 #
 # ******************************************************************************
 
+import logging
 import os
 import sys
-import logging
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
-import multiprocessing
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
@@ -58,7 +58,7 @@
                 os.environ['conf_resource'], reupload_config['resource_id'],
                 reupload_config['os_user'],  reupload_config['keyfile'],
                 json.dumps(reupload_config['additional_config']))
-            local("~/scripts/{}.py {}".format('common_reupload_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_reupload_key', params), shell=True, check=True)
         except Exception as err:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/edge/templates/squid.conf b/infrastructure-provisioning/src/edge/templates/squid.conf
index 0129e00..9d45c44 100644
--- a/infrastructure-provisioning/src/edge/templates/squid.conf
+++ b/infrastructure-provisioning/src/edge/templates/squid.conf
@@ -21,7 +21,7 @@
 
 auth_param basic program LDAP_AUTH_PATH -b "LDAP_DN" -D "LDAP_SERVICE_USERNAME,LDAP_DN" -w LDAP_SERVICE_PASSWORD -f uid=%s LDAP_HOST
 
-acl DLab_user_src_subnet src PROXY_SUBNET
+acl DataLab_user_src_subnet src PROXY_SUBNET
 VPC_CIDRS
 ALLOWED_CIDRS
 
@@ -45,7 +45,7 @@
 http_access deny !Safe_ports
 http_access allow localhost manager
 http_access deny manager
-http_access allow DLab_user_src_subnet
+http_access allow DataLab_user_src_subnet
 http_access allow AllowedCIDRS ldap-auth
 http_access allow localhost
 http_access deny all
diff --git a/infrastructure-provisioning/src/general/api/check_inactivity.py b/infrastructure-provisioning/src/general/api/check_inactivity.py
index 31d7bb3..bd3d6b9 100644
--- a/infrastructure-provisioning/src/general/api/check_inactivity.py
+++ b/infrastructure-provisioning/src/general/api/check_inactivity.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab check_inactivity')
+        subprocess.run('cd /root; fab check-inactivity', shell=True, check=True)
     except:
         success = False
 
@@ -49,16 +48,16 @@
     except:
         reply['response']['result'] = {"error": "Failed to open result.json"}
 
-    reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['project_name'],
-                                                                          os.environ['request_id'])
+    reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                             os.environ['project_name'],
+                                                                             os.environ['request_id'])
 
     with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id']), 'w') as response_file:
         response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/configure.py b/infrastructure-provisioning/src/general/api/configure.py
index 4d6cc5f..33d438c 100644
--- a/infrastructure-provisioning/src/general/api/configure.py
+++ b/infrastructure-provisioning/src/general/api/configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab configure')
+        subprocess.run('cd /root; fab configure', shell=True, check=True)
     except:
         success = False
 
@@ -48,16 +47,16 @@
             reply['response']['result'] = json.loads(f.read())
     except:
         reply['response']['result'] = {"error": "Failed to open result.json"}
-    reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['project_name'],
-                                                                          os.environ['request_id'])
+    reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                             os.environ['project_name'],
+                                                                             os.environ['request_id'])
 
     with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id']), 'w') as response_file:
         response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/create.py b/infrastructure-provisioning/src/general/api/create.py
index b2437b0..62d7f35 100644
--- a/infrastructure-provisioning/src/general/api/create.py
+++ b/infrastructure-provisioning/src/general/api/create.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab run')
+        subprocess.run('cd /root; fab run', shell=True, check=True)
     except:
         success = False
 
@@ -55,16 +54,16 @@
         with open("/response/{}.json".format(os.environ['request_id']), 'w') as response_file:
             response_file.write(json.dumps(reply))
     else:
-        reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                              os.environ['project_name'],
-                                                                              os.environ['request_id'])
+        reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                                 os.environ['project_name'],
+                                                                                 os.environ['request_id'])
 
         with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                    os.environ['request_id']), 'w') as response_file:
             response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/create_image.py b/infrastructure-provisioning/src/general/api/create_image.py
index 425cf26..5bb5fe5 100644
--- a/infrastructure-provisioning/src/general/api/create_image.py
+++ b/infrastructure-provisioning/src/general/api/create_image.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab create_image')
+        subprocess.run('cd /root; fab create-image', shell=True, check=True)
     except:
         success = False
 
@@ -49,16 +48,16 @@
     except:
         reply['response']['result'] = {"error": "Failed to open result.json"}
 
-    reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['project_name'],
-                                                                          os.environ['request_id'])
+    reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                             os.environ['project_name'],
+                                                                             os.environ['request_id'])
 
     with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id']), 'w') as response_file:
         response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/git_creds.py b/infrastructure-provisioning/src/general/api/git_creds.py
index 4edd370..6904523 100644
--- a/infrastructure-provisioning/src/general/api/git_creds.py
+++ b/infrastructure-provisioning/src/general/api/git_creds.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab git_creds')
+        subprocess.run('cd /root; fab git-creds', shell=True, check=True)
     except:
         success = False
 
@@ -49,16 +48,16 @@
     except:
         reply['response']['result'] = {"error": "Failed to open result.json"}
 
-    reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['project_name'],
-                                                                          os.environ['request_id'])
+    reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                             os.environ['project_name'],
+                                                                             os.environ['request_id'])
 
     with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id']), 'w') as response_file:
         response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/install_libs.py b/infrastructure-provisioning/src/general/api/install_libs.py
index 21489a9..8aaa6ef 100644
--- a/infrastructure-provisioning/src/general/api/install_libs.py
+++ b/infrastructure-provisioning/src/general/api/install_libs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab install_libs')
+        subprocess.run('cd /root; fab install-libs', shell=True, check=True)
     except:
         success = False
 
@@ -49,16 +48,16 @@
     except:
         reply['response']['result'] = {"error": "Failed to open result.json"}
 
-    reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['project_name'],
-                                                                          os.environ['request_id'])
+    reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                             os.environ['project_name'],
+                                                                             os.environ['request_id'])
 
     with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id']), 'w') as response_file:
         response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/list_libs.py b/infrastructure-provisioning/src/general/api/list_libs.py
index d7c97a9..fb24226 100644
--- a/infrastructure-provisioning/src/general/api/list_libs.py
+++ b/infrastructure-provisioning/src/general/api/list_libs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab list_libs')
+        subprocess.run('cd /root; fab list-libs', shell=True, check=True)
     except:
         success = False
 
@@ -49,13 +48,14 @@
     except:
         reply['response']['result'] = {"error": "Failed to open result.json"}
 
-    reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['project_name'],
-                                                                          os.environ['request_id'])
+    reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                             os.environ['project_name'],
+                                                                             os.environ['request_id'])
 
-    reply['response']['result']['file'] = "/opt/dlab/tmp/result/{0}_{1}_{2}_all_pkgs.json".format(os.environ['project_name'],
-                                                                                                  os.environ['application'],
-                                                                                                  os.environ['request_id'])
+    reply['response']['result']['file'] = "/opt/datalab/tmp/result/{0}_{1}_{2}_all_pkgs.json".format(
+        os.environ['project_name'],
+        os.environ['application'],
+        os.environ['request_id'])
 
     with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id']), 'w') as response_file:
@@ -72,7 +72,7 @@
         success = False
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/reconfigure_spark.py b/infrastructure-provisioning/src/general/api/reconfigure_spark.py
index 09139ca..60811a8 100644
--- a/infrastructure-provisioning/src/general/api/reconfigure_spark.py
+++ b/infrastructure-provisioning/src/general/api/reconfigure_spark.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab reconfigure_spark')
+        subprocess.run('cd /root; fab reconfigure-spark', shell=True, check=True)
     except:
         success = False
 
@@ -49,16 +48,16 @@
     except:
         reply['response']['result'] = {"error": "Failed to open result.json"}
 
-    reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['project_name'],
-                                                                          os.environ['request_id'])
+    reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                             os.environ['project_name'],
+                                                                             os.environ['request_id'])
 
     with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id']), 'w') as response_file:
         response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/recreate.py b/infrastructure-provisioning/src/general/api/recreate.py
index e91e579..8f881e2 100644
--- a/infrastructure-provisioning/src/general/api/recreate.py
+++ b/infrastructure-provisioning/src/general/api/recreate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab recreate')
+        subprocess.run('cd /root; fab recreate', shell=True, check=True)
     except:
         success = False
 
@@ -55,16 +54,16 @@
         with open("/response/{}.json".format(os.environ['request_id']), 'w') as response_file:
             response_file.write(json.dumps(reply))
     else:
-        reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                              os.environ['project_name'],
-                                                                              os.environ['request_id'])
+        reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                                 os.environ['project_name'],
+                                                                                 os.environ['request_id'])
 
         with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                    os.environ['request_id']), 'w') as response_file:
             response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/reupload_key.py b/infrastructure-provisioning/src/general/api/reupload_key.py
index d4af110..4a423ab 100644
--- a/infrastructure-provisioning/src/general/api/reupload_key.py
+++ b/infrastructure-provisioning/src/general/api/reupload_key.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab reupload_key')
+        subprocess.run('cd /root; fab reupload_key', shell=True, check=True)
     except:
         success = False
 
@@ -49,11 +48,9 @@
             result = {"error": "Failed to open result.json"}
             reply['error_message'] = 'Failed to open result.json'
 
-
-
-    log = "/var/log/dlab/edge/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['project_name'],
-                                                                          os.environ['request_id'])
+    log = "/var/log/datalab/edge/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                         os.environ['project_name'],
+                                                         os.environ['request_id'])
     try:
         with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                    os.environ['request_id']), 'w') as response_file:
@@ -62,7 +59,7 @@
     except:
         print('Can not write to responce')
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/start.py b/infrastructure-provisioning/src/general/api/start.py
index 469d5a6..8b2d97e 100644
--- a/infrastructure-provisioning/src/general/api/start.py
+++ b/infrastructure-provisioning/src/general/api/start.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab start')
+        subprocess.run('cd /root; fab start', shell=True, check=True)
     except:
         success = False
 
@@ -48,16 +47,16 @@
             reply['response']['result'] = json.loads(f.read())
     except:
         reply['response']['result'] = {"error": "Failed to open result.json"}
-    reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['project_name'],
-                                                                          os.environ['request_id'])
+    reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                             os.environ['project_name'],
+                                                                             os.environ['request_id'])
 
     with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id']), 'w') as response_file:
         response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/status.py b/infrastructure-provisioning/src/general/api/status.py
index 0b007b9..9805bab 100644
--- a/infrastructure-provisioning/src/general/api/status.py
+++ b/infrastructure-provisioning/src/general/api/status.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab status')
+        subprocess.run('cd /root; fab status', shell=True, check=True)
     except:
         success = False
 
@@ -48,16 +47,16 @@
             reply['response']['result'] = json.loads(f.read())
     except:
         reply['response']['result'] = {"error": "Failed to open result.json"}
-    reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['edge_user_name'],
-                                                                          os.environ['request_id'])
+    reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                             os.environ['edge_user_name'],
+                                                                             os.environ['request_id'])
 
     with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id']), 'w') as response_file:
         response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/stop.py b/infrastructure-provisioning/src/general/api/stop.py
index 8dc2a11..71f7dae 100644
--- a/infrastructure-provisioning/src/general/api/stop.py
+++ b/infrastructure-provisioning/src/general/api/stop.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab stop')
+        subprocess.run('cd /root; fab stop', shell=True, check=True)
     except:
         success = False
 
@@ -49,16 +48,16 @@
     except:
         reply['response']['result'] = {"error": "Failed to open result.json"}
 
-    reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['project_name'],
-                                                                          os.environ['request_id'])
+    reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                             os.environ['project_name'],
+                                                                             os.environ['request_id'])
 
     with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id']), 'w') as response_file:
         response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/terminate.py b/infrastructure-provisioning/src/general/api/terminate.py
index 933af27..12904f8 100644
--- a/infrastructure-provisioning/src/general/api/terminate.py
+++ b/infrastructure-provisioning/src/general/api/terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab terminate')
+        subprocess.run('cd /root; fab terminate', shell=True, check=True)
     except:
         success = False
 
@@ -55,16 +54,16 @@
         with open("/response/{}.json".format(os.environ['request_id']), 'w') as response_file:
             response_file.write(json.dumps(reply))
     else:
-        reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                              os.environ['project_name'],
-                                                                              os.environ['request_id'])
+        reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                                 os.environ['project_name'],
+                                                                                 os.environ['request_id'])
 
         with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                    os.environ['request_id']), 'w') as response_file:
             response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/api/terminate_image.py b/infrastructure-provisioning/src/general/api/terminate_image.py
index 0700686..fbee659 100644
--- a/infrastructure-provisioning/src/general/api/terminate_image.py
+++ b/infrastructure-provisioning/src/general/api/terminate_image.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
-import os
 import json
+import os
 import sys
-from fabric.api import local
-
+import subprocess
 
 if __name__ == "__main__":
     success = True
     try:
-        local('cd /root; fab terminate_image')
+        subprocess.run('cd /root; fab terminate-image', shell=True, check=True)
     except:
         success = False
 
@@ -49,16 +48,16 @@
     except:
         reply['response']['result'] = {"error": "Failed to open result.json"}
 
-    reply['response']['log'] = "/var/log/dlab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
-                                                                          os.environ['project_name'],
-                                                                          os.environ['request_id'])
+    reply['response']['log'] = "/var/log/datalab/{0}/{0}_{1}_{2}.log".format(os.environ['conf_resource'],
+                                                                             os.environ['project_name'],
+                                                                             os.environ['request_id'])
 
     with open("/response/{}_{}_{}.json".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id']), 'w') as response_file:
         response_file.write(json.dumps(reply))
 
     try:
-        local('chmod 666 /response/*')
+        subprocess.run('chmod 666 /response/*', shell=True, check=True)
     except:
         success = False
 
diff --git a/infrastructure-provisioning/src/general/conf/datalab.ini b/infrastructure-provisioning/src/general/conf/datalab.ini
new file mode 100644
index 0000000..f9d2d1b
--- /dev/null
+++ b/infrastructure-provisioning/src/general/conf/datalab.ini
@@ -0,0 +1,388 @@
+## *****************************************************************************
+##
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+##
+##   http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+## ******************************************************************************
+
+#---- List of all DataLab parameters (commented ones are passing from UI/Jenkins) ----#
+
+
+#--- [conf] section contains all common for all templates parameters ---#
+[conf]
+### Unique infrastructure name
+# service_base_name =
+### DataLab ssh user name ('datalab-user' by default)
+os_user = datalab-user
+### OS that supported by DataLab (debian/redhat)
+# os_family =
+### Cloud provider that supported by DataLab (aws/azure)
+# cloud_provider =
+### Admin ssh key name in cloud provider
+# key_name =
+### Directory in Docker where key is uploaded
+key_dir = /root/keys/
+### Type of the provisionong stage (should be change for 'prod')
+lifecycle_stage = dev
+### The name of user for tag, which will be set for all resources
+# tag_resource_id = user:tag
+### Pypi mirror for China
+pypi_mirror = pypi.doubanio.com
+### Name of own GitLab SSL certificate
+gitlab_certfile = datalab-gitlab.crt
+### Enable or Disable creating image at first time
+image_enabled = true
+###Enable or Disable shared images
+#shared_image_enabled = true
+### CIDR of VPC
+vpc_cidr = '172.31.0.0/16'
+### CIDR of second VPC
+vpc2_cidr = '172.32.0.0/16'
+### Enable or disable duo VPC mode(true|false)
+duo_vpc_enable = false
+### Range of subnets which will be used for user's environments
+# user_subnets_range = 172.31.0.0/24 - 172.31.50.0/24
+### Comma-separated CIDR of IPs which will have access to SSN and Edge nodes
+allowed_ip_cidr = '0.0.0.0/0'
+### Type of network. Define in which network DataLab will be deployed. Possible options: public|private
+network_type = public
+### Additional tags in format 'Key1:Value1;Key2:Value2'
+# additional_tags =
+pip_version = 21.0.1
+### Billing tag key
+billing_tag_key = product
+### Billing tag value
+billing_tag_value = datalab
+### Enable or disable Step certificates
+stepcerts_enabled = false
+### Step root certificate in base64 format
+# stepcerts_root_ca =
+### Step certificates kid
+# stepcerts_kid =
+### Step certificates kid password
+# stepcerts_kid_password =
+### Step certificates CA URL
+# stepcerts_ca_url =
+### Enable or disable Lets Encrypt certificates
+letsencrypt_enabled = false
+### Domain names to apply
+# letsencrypt_domain_name =
+### email address to use
+# letsencrypt_email =
+### Prefix of the private subnet
+private_subnet_prefix = 24
+### Repository user
+# repository_user =
+### Repository password
+# repository_pass =
+### Repository url
+# repository_address =
+### release tag
+# release_tag =
+### Deeplearning native cloud AMI enabled
+deeplearning_cloud_ami = true
+
+#--- [aws] section contains all common parameters related to Amazon ---#
+[aws]
+### Amazon iam user access_key
+# access_key =
+### Amazon iam user secret_access_key
+# secret_access_key =
+### Id of the security group for SSN instance
+# security_groups_ids =
+### Id of the subnet for SSN and EDGE provisioning
+# subnet_id =
+### Id of the subnet for notebooks and compute engines
+# subnet2_id =
+### Id of the vpc for whole DataLab provisioning
+# vpc_id =
+### Id of the secondary vpc for notebooks and compute engines
+# vpc2_id =
+### Amazon peering connection id
+# peering_id =
+### Amazon iam user name
+# iam_user =
+### EC2 instance type for notebook
+# notebook_instance_type =
+### EC2 instance type for SSN
+ssn_instance_size = t2.large
+### EC2 instance type for EDGE
+edge_instance_size = t2.medium
+### Amazon region name for whole DataLab provisioning
+region = us-west-2
+### Amazon zone letter for ssn, edge and notebook subnet provisioning
+# zone =
+### Amazon ami name based on debian conf_os_family for all DataLab instances
+debian_image_name = ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-20201026
+### Amazon ami name based on RedHat conf_os_family for all DataLab instances
+redhat_image_name = RHEL-7.4_HVM-20180103-x86_64-2-Hourly2-GP2
+### Amazon account ID
+# account_id =
+### Amazon billing bucket
+# billing_bucket =
+### Path to billing reports in S3 bucket
+# report_path =
+### Predefined policies for users instances
+# user_predefined_s3_policies =
+
+
+#--- [azure] section contains all common parameters related to Azure ---#
+[azure]
+### Region
+# region =
+### Resource Group name
+# resource_group_name =
+### VPC name
+# vpc_name =
+### Subnet name
+# subnet_name =
+### name Will create exploratory environment with edge node as access point as followingof the security group for edge instance
+# edge_security_group_name =
+### EC2 instance type for SSN
+ssn_instance_size = Standard_DS2_v2
+### Instance type for EDGE
+edge_instance_size = Standard_DS1_v2
+### Master node size for Data Engine
+# dataengine_master_size =
+### Slave node size for Data Engine
+# dataengine_slave_size =
+### Azure image name based on debian conf_os_family for all DataLab instances
+debian_image_name = Canonical:0001-com-ubuntu-server-focal:20_04-lts
+### Azure image name based on RedHat conf_os_family for all DataLab instances
+redhat_image_name = RedHat_RHEL_7.3
+### Azure AD user name
+# user_name =
+### Azure AD user refresh token
+# user_refresh_token =
+### Full path to Azure credentials JSON file
+#auth_path =
+### Azure offer number
+# offer_number =
+### Azure billin currency code
+# currency =
+### Azure language locale
+locale = en-US
+### Azure region code
+# region_info =
+### Azure datalake to create
+datalake_enable = false
+### Azure login application ID
+# application_id =
+
+[gcp]
+### GCP project ID
+# project_id =
+### Full path to service account JSON
+# service_account_path =
+### Name of the vpc for whole DataLab provisioning
+# vpc_name =
+### Name of the subnet for SSN and EDGE provisioning
+# subnet_name =
+### Names of the firewall rules for SSN
+# firewall_rules =
+### GCP region name for whole DataLab provisioning
+region = us-west1
+### GCP zone name for whole DataLab provisioning
+zone = us-west1-a
+### GCP ami name based on debian conf_os_family for all DataLab instances
+debian_image_name = /projects/ubuntu-os-cloud/global/images/ubuntu-2004-focal-v20210119a
+### GCP ami name based on RedHat conf_os_family for all DataLab instances
+redhat_image_name =
+### Prefix of the private subnet
+### Instance type for EDGE
+ssn_instance_size = n1-standard-2
+### Instance type for EDGE
+edge_instance_size = n1-standard-1
+### GPU type for Tensor/DeepLaerning notebooks
+gpu_accelerator_type = nvidia-tesla-k80
+
+#--- [ssn] section contains all parameters that are using for self-service node provisioning ---#
+[ssn]
+### System path on SSN instance where DataLab will be installed
+datalab_path = /opt/datalab/
+### Elastic IP which will be associated with SSN node
+# elastic_ip =
+### Version of Docker to be installed on SSN
+docker_version = 20.10.2
+### Name of hosted zone for Route53
+# hosted_zone_name =
+### ID of hosted zone
+# hosted_zone_id =
+### Subdomain name
+# subdomain =
+### Role ARN for creating Route53 record
+# assume_role_arn =
+
+#--- [edge] section contains all parameters that are using for edge node provisioning ---#
+[edge]
+### User name for exploratory environment being deployed
+# user_name =
+### Elastic IP which will be associated with Edge node
+# elastic_ip =
+### Edge node is NAT
+is_nat = true
+
+#--- [notebook] section contains all parameters that are using for all notebooks provisioning ---#
+[notebook]
+### Notebook EC2 instance name
+# instance_name =
+### Size of the additional volume for notebook instance
+disk_size = 30
+### Version of Apache Spark to be installed on notebook
+spark_version = 3.0.1
+### Version of Apache Hadoop to be installed on notebook
+hadoop_version = 2.7
+### Version of Jupyter to be installed on notebook
+jupyter_version = 6.1.6
+### Version of Python to be installed as virualenv on notebook
+python_venv_version = 3.7.9
+### Version of TensorFlow to be installed on notebook
+tensorflow_version = 2.5.0
+### Version of Zeppelin to be installed on notebook
+zeppelin_version = 0.9.0
+### Version of Rstudio to be installed on notebook
+rstudio_version = 1.4.1103
+### Version of Scala to be installed on notebook
+scala_version = 2.12.8
+### Version of Livy top be installed on notebook
+livy_version = 0.3.0
+### If it is true, Livy will be used on Zeppelin notebook
+multiple_clusters = false
+### R China mirror
+r_mirror = http://mirror.lzu.edu.cn/CRAN/
+### NVidia driver version for Tensor/DeepLearning notebooks
+nvidia_version = 418.126.02
+### Caffe library version for DeepLearning notebook
+caffe_version = 1.0
+### Caffe2 library version for DeepLearning notebook
+caffe2_version = 1.5
+### Pytorch branch used during caffe2 installation for DeepLearning notebook
+pytorch_branch = release/1.5
+### Cmake version for DeepLearning notebook
+cmake_version = 3.15.5
+### CNTK library version for DeepLearning notebook for python3
+cntk_version = 2.7
+### MXNet library version for DeepLearning notebook for python
+mxnet_version = 1.7.0
+### Keras library version for Tensor/DeepLearning notebook
+keras_version = 2.4.0
+### Theano library version for Tensor/DeepLearning notebook
+theano_version = 1.0.3
+### Version of CUDA
+cuda_version = 10.1
+### Name of CUDA file
+cuda_file_name = cuda_10.1.243_418.87.00_linux.run
+### Version of CUDNN
+cudnn_version = 7.6.5
+### Name of CUDNN file
+cudnn_file_name = cudnn-10.1-linux-x64-v7.6.5.32.tgz
+### R enabled on Jupyter/Zeppelin notebook
+r_enabled = true
+### Temporary fixed python libraries due to dependencies
+tornado_version = 6.1
+ipykernel_version = 5.5.0
+### Version of ungit if previous needed. Use latest as default.
+ungit_version = 1.5.15
+### Numpy version
+numpy_version = 1.18.3
+### caTools version for R 3.4.4
+catools_version = 1.17.1.4
+### pbdZMQ version for R 3.4.4
+pbdzmq_version = 0.3-3.1
+### Apache Ivy version
+ivy_version = 2.4.0
+### Matplotlib version
+matplotlib_version = 3.3.4
+### JupyterLab image
+jupyterlab_image = odahu\/base-notebook:1.1.0-rc8
+### Superset version
+superset_version = 0.35.1
+### GCS-connector version
+gcs_connector_version = 2.0.1
+### Setuptools version
+setuptools_version = 54.1.1
+
+#--- [emr] section contains all parameters that are using for emr provisioning ---#
+[emr]
+### EMR cluster namr
+# cluster_name =
+### Period of time while EMR being provisioned (default is 1500)
+# timeout =
+### Amount of ENR nodes
+# instance_count =
+### EC2 instance type for master node
+# master_instance_type =
+### EC2 instance type for all slaves nodes
+# slave_instance_type =
+### EMR version
+# version =
+### EMR instance role name
+ec2_role = EMR_EC2_DefaultRole
+### EMR role name
+service_role = EMR_DefaultRole
+###
+excluded_spark_properties = '"spark.master", "spark.eventLog.enabled", "spark.eventLog.dir", "spark.history.fs.logDirectory", "spark.sql.warehouse.dir", "spark.driver.memory", "spark.executor.extraLibraryPath", "spark.executor.extraClassPath"'
+### Enable/Disable EC2 Spot instances for EMR slaves
+slave_instance_spot = True
+### Percentage of the EC2 price
+slave_instance_spot_pct_price = 70
+
+#--- [dataengine] section contains all parameters that are using for dataengine provisioning ---#
+[dataengine]
+### Count of slave nodes for Data Engine
+# instance_count =
+### Type of notebooks for creating Data Engine from notebook images
+image_notebooks = jupyter,jupyterlab,rstudio,zeppelin,tensor,tensor-rstudio,deeplearning
+### Persent of RAM allocated for an operating system
+os_memory = 75
+### Explicit allocation RAM for an operating system
+os_expl_memory = 3500
+### Depending on RAM size on instance, this parameter determines size of RAM when explicit allocation RAM is used
+expl_instance_memory = 8000
+
+#--- [ldap] ldap parameters ---#
+[ldap]
+### Ldap hostname
+# hostname =
+### Ldap architecture params
+# dn =
+### Ldap organisation unit
+# ou =
+### Ldap admin password
+# service_password =
+### Ldap admin user name
+# service_username =
+
+#--- [keycloak] keycloak parameters ---#
+[keycloak]
+### Keycloak realm name
+# realm_name =
+### Keycloak auth server url
+# auth_server_url =
+### Keycloak client name
+# client_name =
+### Keycloak client secret
+# client_secret =
+### Keycloak user
+# user =
+### Keycloak user password
+# user_password =
+
+#--- [reverse_proxy] reverse proxy settings ---#
+[reverse_proxy]
+### Nginx version
+nginx_version = 1.15.1
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/conf/dlab.ini b/infrastructure-provisioning/src/general/conf/dlab.ini
deleted file mode 100644
index 8ab5f9e..0000000
--- a/infrastructure-provisioning/src/general/conf/dlab.ini
+++ /dev/null
@@ -1,361 +0,0 @@
-## *****************************************************************************
-##
-## Licensed to the Apache Software Foundation (ASF) under one
-## or more contributor license agreements.  See the NOTICE file
-## distributed with this work for additional information
-## regarding copyright ownership.  The ASF licenses this file
-## to you under the Apache License, Version 2.0 (the
-## "License"); you may not use this file except in compliance
-## with the License.  You may obtain a copy of the License at
-##
-##   http://www.apache.org/licenses/LICENSE-2.0
-##
-## Unless required by applicable law or agreed to in writing,
-## software distributed under the License is distributed on an
-## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-## KIND, either express or implied.  See the License for the
-## specific language governing permissions and limitations
-## under the License.
-##
-## ******************************************************************************
-
-#---- List of all dlab parameters (commented ones are passing from UI/Jenkins) ----#
-
-
-#--- [conf] section contains all common for all templates parameters ---#
-[conf]
-### Unique infrastructure name
-# service_base_name =
-### DLAB ssh user name ('dlab-user' by default)
-os_user = dlab-user
-### OS that supported by dlab (debian/redhat)
-# os_family =
-### Cloud provider that supported by dlab (aws/azure)
-# cloud_provider =
-### Admin ssh key name in cloud provider
-# key_name =
-### Directory in Docker where key is uploaded
-key_dir = /root/keys/
-### Type of the provisionong stage (should be change for 'prod')
-lifecycle_stage = dev
-### The name of user for tag, which will be set for all resources
-# tag_resource_id = user:tag
-### Pypi mirror for China
-pypi_mirror = pypi.doubanio.com
-### Name of own GitLab SSL certificate
-gitlab_certfile = dlab-gitlab.crt
-### Enable or Disable creating image at first time
-image_enabled = true
-###Enable or Disable shared images
-#shared_image_enabled = true
-### CIDR of VPC
-vpc_cidr = '172.31.0.0/16'
-### CIDR of second VPC
-vpc2_cidr = '172.32.0.0/16'
-### Enable or disable duo VPC mode(true|false)
-duo_vpc_enable = false
-### Range of subnets which will be using for user's environments
-# user_subnets_range =
-### Comma-separated CIDR of IPs which will have access to SSN and Edge nodes
-allowed_ip_cidr = '0.0.0.0/0'
-### Type of network. Define in which network DLab will be deployed. Possible options: public|private
-network_type = public
-### Additional tags in format 'Key1:Value1;Key2:Value2'
-# additional_tags =
-pip_version = 9.0.3
-### Billing tag key
-billing_tag_key = product
-### Billing tag value
-billing_tag_value = dlab
-### Enable or disable Step certificates
-stepcerts_enabled = false
-### Step root certificate in base64 format
-# stepcerts_root_ca =
-### Step certificates kid
-# stepcerts_kid =
-### Step certificates kid password
-# stepcerts_kid_password =
-### Step certificates CA URL
-# stepcerts_ca_url =
-### Prefix of the private subnet
-private_subnet_prefix = 24
-### Range of subnets defined by user
-# user_subnets_range = 172.31.0.0/24 - 172.31.50.0/24
-
-#--- [aws] section contains all common parameters related to Amazon ---#
-[aws]
-### Amazon iam user access_key
-# access_key =
-### Amazon iam user secret_access_key
-# secret_access_key =
-### Id of the security group for SSN instance
-# security_groups_ids =
-### Id of the subnet for SSN and EDGE provisioning
-# subnet_id =
-### Id of the subnet for notebooks and compute engines
-# subnet2_id =
-### Id of the vpc for whole dlab provisioning
-# vpc_id =
-### Id of the secondary vpc for notebooks and compute engines
-# vpc2_id =
-### Amazon peering connection id
-# peering_id =
-### Amazon iam user name
-# iam_user =
-### EC2 instance type for notebook
-# notebook_instance_type =
-### EC2 instance type for SSN
-ssn_instance_size = t2.large
-### EC2 instance type for EDGE
-edge_instance_size = t2.medium
-### Amazon region name for whole dlab provisioning
-region = us-west-2
-### Amazon zone letter for ssn, edge and notebook subnet provisioning
-# zone =
-### Amazon ami name based on debian conf_os_family for all dlab instances
-debian_image_name = ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20190212
-### Amazon ami name based on RedHat conf_os_family for all dlab instances
-redhat_image_name = RHEL-7.4_HVM-20180103-x86_64-2-Hourly2-GP2
-### Amazon account ID
-# account_id =
-### Amazon billing bucket
-# billing_bucket =
-### Path to billing reports in S3 bucket
-# report_path =
-### Predefined policies for users instances
-# user_predefined_s3_policies =
-
-
-#--- [azure] section contains all common parameters related to Azure ---#
-[azure]
-### Region
-# region =
-### Resource Group name
-# resource_group_name =
-### VPC name
-# vpc_name =
-### Subnet name
-# subnet_name =
-### EC2 instance type for SSN
-ssn_instance_size = Standard_DS2_v2
-### Instance type for EDGE
-edge_instance_size = Standard_DS1_v2
-### Master node size for Data Engine
-# dataengine_master_size =
-### Slave node size for Data Engine
-# dataengine_slave_size =
-### Azure image name based on debian conf_os_family for all dlab instances
-debian_image_name = Canonical_UbuntuServer_16.04-LTS
-### Azure image name based on RedHat conf_os_family for all dlab instances
-redhat_image_name = RedHat_RHEL_7.3
-### Azure AD user name
-# user_name =
-### Azure AD user refresh token
-# user_refresh_token =
-### Full path to Azure credentials JSON file
-#auth_path =
-### Azure offer number
-# offer_number =
-### Azure billin currency code
-# currency =
-### Azure language locale
-locale = en-US
-### Azure region code
-# region_info =
-### Azure datalake to create
-datalake_enable = false
-### Azure login application ID
-# application_id =
-
-[gcp]
-### GCP project ID
-# project_id =
-### Full path to service account JSON
-# service_account_path =
-### Name of the vpc for whole DLab provisioning
-# vpc_name =
-### Name of the subnet for SSN and EDGE provisioning
-# subnet_name =
-### Names of the firewall rules for SSN
-# firewall_rules =
-### GCP region name for whole dlab provisioning
-region = us-west1
-### GCP zone name for whole dlab provisioning
-zone = us-west1-a
-### GCP ami name based on debian conf_os_family for all dlab instances
-debian_image_name = /projects/ubuntu-os-cloud/global/images/ubuntu-1604-xenial-v20190807
-### GCP ami name based on RedHat conf_os_family for all dlab instances
-redhat_image_name =
-### Prefix of the private subnet
-### Instance type for EDGE
-ssn_instance_size = n1-standard-2
-### Instance type for EDGE
-edge_instance_size = n1-standard-1
-### GPU type for Tensor/DeepLaerning notebooks
-gpu_accelerator_type = nvidia-tesla-k80
-
-#--- [ssn] section contains all parameters that are using for self-service node provisioning ---#
-[ssn]
-### System path on SSN instance where dlab will be installed
-dlab_path = /opt/dlab/
-### Elastic IP which will be associated with SSN node
-# elastic_ip =
-### Version of Docker to be installed on SSN
-docker_version = 18.06.3
-### Name of hosted zone for Route53
-# hosted_zone_name =
-### ID of hosted zone
-# hosted_zone_id =
-### Subdomain name
-# subdomain =
-### Role ARN for creating Route53 record
-# assume_role_arn =
-
-#--- [edge] section contains all parameters that are using for edge node provisioning ---#
-[edge]
-### User name for exploratory environment being deployed
-# user_name =
-### Elastic IP which will be associated with Edge node
-# elastic_ip =
-
-#--- [notebook] section contains all parameters that are using for all notebooks provisioning ---#
-[notebook]
-### Notebook EC2 instance name
-# instance_name =
-### Size of the additional volume for notebook instance
-disk_size = 30
-### Version of Apache Spark to be installed on notebook
-spark_version = 2.4.4
-### Version of Apache Hadoop to be installed on notebook
-hadoop_version = 2.7
-### Version of Jupyter to be installed on notebook
-jupyter_version = 6.0.2
-### Version of TensorFlow to be installed on notebook
-tensorflow_version = 1.8.0
-### Version of Zeppelin to be installed on notebook
-zeppelin_version = 0.8.2
-### Version of Rstudio to be installed on notebook
-rstudio_version = 1.2.5033
-### Version of Scala to be installed on notebook
-scala_version = 2.12.8
-### Version of Livy top be installed on notebook
-livy_version = 0.3.0
-### If it is true, Livy will be used on Zeppelin notebook
-multiple_clusters = false
-### R China mirror
-r_mirror = http://mirror.lzu.edu.cn/CRAN/
-### NVidia driver version for Tensor/DeepLearning notebooks
-nvidia_version = 418.43
-### Caffe library version for DeepLearning notebook
-caffe_version = 1.0
-### Caffe2 library version for DeepLearning notebook
-caffe2_version = 0.4.0
-### Cmake version for DeepLearning notebook
-cmake_version = 3.11.3
-### CNTK library version for DeepLearning notebook
-### All releases 2.4+ officially only support Ubuntu 16.04.
-cntk_version = 2.3.1
-### MXNet library version for DeepLearning notebook
-mxnet_version = 1.3.1
-### Keras library version for Tensor/DeepLearning notebook
-keras_version = 2.1.6
-### Theano library version for Tensor/DeepLearning notebook
-theano_version = 1.0.3
-### Version of CUDA
-cuda_version = 9.0
-### Name of CUDA file
-cuda_file_name = cuda_9.0.176_384.81_linux-run
-### Version of CUDNN
-cudnn_version = 7.1.4
-### Name of CUDNN file
-cudnn_file_name = cudnn-9.0-linux-x64-v7.1.tgz
-### R enabled on Jupyter/Zeppelin notebook
-r_enabled = true
-### Temporary fixed python libraries due to dependencies
-tornado_version = 4.5.3
-ipykernel_version = 4.8.2
-### Version of ungit if previous needed. Use latest as default.
-ungit_version = 1.4.36
-### Numpy version
-numpy_version = 1.14.3
-### Apache Ivy version
-ivy_version = 2.4.0
-### Matplotlib version
-matplotlib_version = 2.0.2
-### JupyterLab image
-jupyterlab_image = odahu\\/base-notebook:1.1.0-rc8
-### Superset version
-superset_version = 0.35.1
-### GCS-connector version
-gcs_connector_version = 2.0.1
-
-#--- [emr] section contains all parameters that are using for emr provisioning ---#
-[emr]
-### EMR cluster namr
-# cluster_name =
-### Period of time while EMR being provisioned (default is 1500)
-# timeout =
-### Amount of ENR nodes
-# instance_count =
-### EC2 instance type for master node
-# master_instance_type =
-### EC2 instance type for all slaves nodes
-# slave_instance_type =
-### EMR version
-# version =
-### EMR instance role name
-ec2_role = EMR_EC2_DefaultRole
-### EMR role name
-service_role = EMR_DefaultRole
-###
-excluded_spark_properties = '"spark.master", "spark.eventLog.enabled", "spark.eventLog.dir", "spark.history.fs.logDirectory", "spark.sql.warehouse.dir", "spark.driver.memory", "spark.executor.extraLibraryPath", "spark.executor.extraClassPath"'
-### Enable/Disable EC2 Spot instances for EMR slaves
-slave_instance_spot = True
-### Percentage of the EC2 price
-slave_instance_spot_pct_price = 70
-
-#--- [dataengine] section contains all parameters that are using for dataengine provisioning ---#
-[dataengine]
-### Count of slave nodes for Data Engine
-# instance_count =
-### Type of notebooks for creating Data Engine from notebook images
-image_notebooks = jupyter,jupyterlab,rstudio,zeppelin,tensor,tensor-rstudio,deeplearning
-### Persent of RAM allocated for an operating system
-os_memory = 75
-### Explicit allocation RAM for an operating system
-os_expl_memory = 3500
-### Depending on RAM size on instance, this parameter determines size of RAM when explicit allocation RAM is used
-expl_instance_memory = 8000
-
-#--- [ldap] ldap parameters ---#
-[ldap]
-### Ldap hostname
-# hostname =
-### Ldap architecture params
-# dn =
-### Ldap organisation unit
-# ou =
-### Ldap admin password
-# service_password =
-### Ldap admin user name
-# service_username =
-
-#--- [keycloak] keycloak parameters ---#
-[keycloak]
-### Keycloak realm name
-# realm_name =
-### Keycloak auth server url
-# auth_server_url =
-### Keycloak client name
-# client_name =
-### Keycloak client secret
-# client_secret =
-### Keycloak user
-# user =
-### Keycloak user password
-# user_password =
-
-#--- [reverse_proxy] reverse proxy settings ---#
-[reverse_proxy]
-### Nginx version
-nginx_version = 1.15.1
diff --git a/infrastructure-provisioning/src/general/files/aws/base_Dockerfile b/infrastructure-provisioning/src/general/files/aws/base_Dockerfile
index 48f5e2d..9cad9c4 100644
--- a/infrastructure-provisioning/src/general/files/aws/base_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/base_Dockerfile
@@ -19,19 +19,30 @@
 #
 # ******************************************************************************
 
-FROM ubuntu:16.04
+FROM ubuntu:20.04
 ARG OS
 ARG SRC_PATH
 
 # Install any .deb dependecies
 RUN	apt-get update && \
     apt-get -y upgrade && \
-    apt-get -y install python-pip python-dev groff vim less git wget nano libssl-dev libffi-dev libffi6 && \
+    DEBIAN_FRONTEND=noninteractive apt-get -y install python3-pip python3-dev python3-virtualenv groff vim less git wget nano libssl-dev libffi-dev libffi7 && \
     apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
 
+# To cahnge POSIX locale to en_US.UTF-8
+RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y locales
+
+RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
+    dpkg-reconfigure --frontend=noninteractive locales && \
+    update-locale LANG=en_US.UTF-8
+
+ENV LANG en_US.UTF-8
+ENV LANGUAGE en_US:en
+ENV LC_ALL en_US.UTF-8
+
 # Install any python dependencies
-RUN pip install -UI pip==9.0.3 && \
-    pip install boto3 backoff fabric==1.14.0 fabvenv awscli argparse requests ujson jupyter pycrypto
+RUN python3 -m pip install -UI qtconsole==4.7.7 pip==21.0.1 && \
+    python3 -m pip install boto3 backoff patchwork fabric fabvenv awscli argparse requests ujson jupyter pycryptodome
 
 # Configuring ssh for user
 RUN mkdir -p /root/.ssh; echo "Host *" > /root/.ssh/config; \
@@ -58,16 +69,16 @@
     mkdir -p /root/scripts && \
     mkdir -p /root/templates && \
     mkdir -p /root/files && \
-    mkdir -p /usr/lib/python2.7/dlab && \
+    mkdir -p /usr/lib/python3.8/datalab && \
     mkdir -p /root/keys/.ssh
 
 COPY ${SRC_PATH}base/ /root
 COPY ${SRC_PATH}general/conf/* /root/conf/
 COPY ${SRC_PATH}general/api/*.py /bin/
 COPY ${SRC_PATH}general/scripts/aws/common_* /root/scripts/
-COPY ${SRC_PATH}general/lib/aws/* /usr/lib/python2.7/dlab/
-COPY ${SRC_PATH}general/lib/os/${OS}/common_lib.py /usr/lib/python2.7/dlab/common_lib.py
-COPY ${SRC_PATH}general/lib/os/fab.py /usr/lib/python2.7/dlab/fab.py
+COPY ${SRC_PATH}general/lib/aws/* /usr/lib/python3.8/datalab/
+COPY ${SRC_PATH}general/lib/os/${OS}/common_lib.py /usr/lib/python3.8/datalab/common_lib.py
+COPY ${SRC_PATH}general/lib/os/fab.py /usr/lib/python3.8/datalab/fab.py
 COPY ${SRC_PATH}general/files/os/${OS}/sources.list /root/files/
 COPY ${SRC_PATH}general/files/os/ivysettings.xml /root/templates/
 COPY ${SRC_PATH}general/files/os/local_endpoint.json /root/files/
diff --git a/infrastructure-provisioning/src/general/files/aws/base_description.json b/infrastructure-provisioning/src/general/files/aws/base_description.json
index 1f39be3..faddf8f 100644
--- a/infrastructure-provisioning/src/general/files/aws/base_description.json
+++ b/infrastructure-provisioning/src/general/files/aws/base_description.json
@@ -1,4 +1,4 @@
 {
-  "template_name": "DLab AWS Base",
+  "template_name": "DataLab AWS Base",
   "description": "Base image with aws tools"
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/aws/dataengine-service_Dockerfile b/infrastructure-provisioning/src/general/files/aws/dataengine-service_Dockerfile
index 6e0c7bc..5cbefa5 100644
--- a/infrastructure-provisioning/src/general/files/aws/dataengine-service_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/dataengine-service_Dockerfile
@@ -19,7 +19,7 @@
 #
 # ******************************************************************************
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
@@ -30,8 +30,8 @@
 COPY general/scripts/os/install_additional_libs.py /root/scripts/install_additional_libs.py
 COPY general/scripts/os/get_list_available_pkgs.py /root/scripts/get_list_available_pkgs.py
 COPY general/scripts/os/common_* /root/scripts/
-COPY general/lib/os/redhat/common_lib.py /usr/lib/python2.7/dlab/common_lib.py
-COPY general/lib/os/redhat/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/redhat/common_lib.py /usr/lib/python3.8/datalab/common_lib.py
+COPY general/lib/os/redhat/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/inactive.sh /root/templates/
 COPY general/templates/os/inactive.service /root/templates/
 COPY general/templates/os/inactive.timer /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/aws/dataengine-service_description.json b/infrastructure-provisioning/src/general/files/aws/dataengine-service_description.json
index b4e5ba2..f2ebd5c 100644
--- a/infrastructure-provisioning/src/general/files/aws/dataengine-service_description.json
+++ b/infrastructure-provisioning/src/general/files/aws/dataengine-service_description.json
@@ -24,7 +24,7 @@
     },
   "templates":
   [
-    {"version":"emr-5.19.0", "applications": [{"Name":"Hadoop", "Version": "2.8.5"}, {"Name":"Spark", "Version": "2.3.2"}, {"Name":"Hive", "Version": "2.3.3"}]},
-    {"version":"emr-5.28.0", "applications": [{"Name":"Hadoop", "Version": "2.8.5"}, {"Name":"Spark", "Version": "2.4.4"}, {"Name":"Hive", "Version": "2.3.6"}]}
+    {"version":"emr-5.30.0", "applications": [{"Name":"Hadoop", "Version": "2.8.5"}, {"Name":"Spark", "Version": "2.4.5"}, {"Name":"Hive", "Version": "2.3.6"}]},
+    {"version":"emr-6.2.0", "applications": [{"Name":"Hadoop", "Version": "3.2.1"}, {"Name":"Spark", "Version": "3.0.1"}, {"Name":"Hive", "Version": "3.1.2"}]}
   ]
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/aws/dataengine_Dockerfile b/infrastructure-provisioning/src/general/files/aws/dataengine_Dockerfile
index a0be3e1..5af2a5c 100644
--- a/infrastructure-provisioning/src/general/files/aws/dataengine_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/dataengine_Dockerfile
@@ -19,7 +19,7 @@
 #
 # ******************************************************************************
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
@@ -29,13 +29,15 @@
 COPY general/scripts/os/reconfigure_spark.py /root/scripts/
 COPY general/scripts/os/install_additional_libs.py /root/scripts/install_additional_libs.py
 COPY general/scripts/os/get_list_available_pkgs.py /root/scripts/get_list_available_pkgs.py
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/scripts/os/common_* /root/scripts/
 COPY general/scripts/aws/dataengine_* /root/scripts/
 COPY general/scripts/os/notebook_reconfigure_dataengine_spark.py /root/scripts/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
 COPY general/templates/os/tensorboard.service /root/templates/
 COPY general/templates/os/${OS}/spark-* /root/templates/
+COPY general/templates/os/${OS}/livy.service /root/templates/
+COPY general/templates/os/livy-env.sh /root/templates/
 
 RUN chmod a+x /root/fabfile.py; \
     chmod a+x /root/scripts/*
diff --git a/infrastructure-provisioning/src/general/files/aws/deeplearning_Dockerfile b/infrastructure-provisioning/src/general/files/aws/deeplearning_Dockerfile
index e460e39..286950d 100644
--- a/infrastructure-provisioning/src/general/files/aws/deeplearning_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/deeplearning_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY deeplearning/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/aws/deeplearning_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/jupyter-notebook.service /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
@@ -40,8 +40,9 @@
 COPY general/templates/os/inactive.sh /root/templates/
 COPY general/templates/os/inactive.service /root/templates/
 COPY general/templates/os/inactive.timer /root/templates/
-COPY general/files/os/toree-assembly-0.2.0.jar /root/files/
+COPY general/files/os/toree-assembly-0.5.0.jar /root/files/
 COPY general/files/os/toree_kernel.tar.gz /root/files/
+COPY general/templates/os/sparkmagic_config_template.json /root/templates/
 COPY general/templates/os/pyspark_dataengine-service_template.json /root/templates/
 COPY general/templates/os/r_dataengine-service_template.json /root/templates/
 COPY general/templates/os/toree_dataengine-service_* /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/aws/deeplearning_description.json b/infrastructure-provisioning/src/general/files/aws/deeplearning_description.json
index a2db5ae..06f671a 100644
--- a/infrastructure-provisioning/src/general/files/aws/deeplearning_description.json
+++ b/infrastructure-provisioning/src/general/files/aws/deeplearning_description.json
@@ -8,11 +8,13 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Deep Learning  2.3",
-      "description": "Base image with Deep Learning and Jupyter",
+      "template_name": "Deep Learning AMI Version 42.1",
+      "description": "MXNet-1.8.0 & 1.7.0, TensorFlow-2.4.1, 2.1.3 & 1.15.5, PyTorch-1.4.0 & 1.8.0, Neuron, & others. NVIDIA CUDA, cuDNN, NCCL, Intel MKL-DNN, Docker, NVIDIA-Docker & EFA support. Uses Anaconda virtual environments, configured to keep the different framework installations separate and easy to switch between frameworks as Jupyter kernels.",
       "environment_type": "exploratory",
-      "version": "deeplearning-2.3",
+      "version": "Deep Learning AMI (Ubuntu 18.04) Version 42.1",
       "vendor": "AWS"
     }
-  ]
+  ],
+  "exploratory_environment_images" :
+  []
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/aws/edge_Dockerfile b/infrastructure-provisioning/src/general/files/aws/edge_Dockerfile
index 143eee6..c31e48e 100644
--- a/infrastructure-provisioning/src/general/files/aws/edge_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/edge_Dockerfile
@@ -20,13 +20,13 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY edge/ /root/
 COPY general/scripts/aws/edge_* /root/scripts/
-COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python2.7/dlab/edge_lib.py
+COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python3.8/datalab/edge_lib.py
 COPY general/templates/aws/edge_s3_policy.json /root/templates/edge_s3_policy.json
 
 RUN chmod a+x /root/fabfile.py; \
diff --git a/infrastructure-provisioning/src/general/files/aws/jupyter_Dockerfile b/infrastructure-provisioning/src/general/files/aws/jupyter_Dockerfile
index 1f401fc..7637546 100644
--- a/infrastructure-provisioning/src/general/files/aws/jupyter_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/jupyter_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY jupyter/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/aws/jupyter_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/jupyter-notebook.service /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
@@ -35,13 +35,14 @@
 COPY general/templates/os/py3spark_local_template.json /root/templates/
 COPY general/templates/os/pyspark_dataengine-service_template.json /root/templates/
 COPY general/templates/os/r_dataengine-service_template.json /root/templates/
+COPY general/templates/os/sparkmagic_config_template.json /root/templates/
 COPY general/templates/os/r_template.json /root/templates/
 COPY general/templates/os/run_template.sh /root/templates/
 COPY general/templates/os/toree_dataengine-service_* /root/templates/
 COPY general/templates/os/inactive.sh /root/templates/
 COPY general/templates/os/inactive.service /root/templates/
 COPY general/templates/os/inactive.timer /root/templates/
-COPY general/files/os/toree-assembly-0.2.0.jar /root/files/
+COPY general/files/os/toree-assembly-0.5.0.jar /root/files/
 COPY general/files/os/toree_kernel.tar.gz /root/files/
 COPY general/templates/os/pyspark_dataengine_template.json /root/templates/
 COPY general/templates/os/r_dataengine_template.json /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/aws/jupyter_description.json b/infrastructure-provisioning/src/general/files/aws/jupyter_description.json
index 50dd357..accfd94 100644
--- a/infrastructure-provisioning/src/general/files/aws/jupyter_description.json
+++ b/infrastructure-provisioning/src/general/files/aws/jupyter_description.json
@@ -19,10 +19,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Jupyter notebook 6.0.2",
+      "template_name": "Jupyter notebook 6.1.6",
       "description": "Base image with Jupyter node creation routines",
       "environment_type": "exploratory",
-      "version": "jupyter_notebook-6.0.2",
+      "version": "jupyter_notebook-6.1.6",
       "vendor": "AWS"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/aws/jupyterlab_Dockerfile b/infrastructure-provisioning/src/general/files/aws/jupyterlab_Dockerfile
index 203809c..54ce62d 100644
--- a/infrastructure-provisioning/src/general/files/aws/jupyterlab_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/jupyterlab_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY jupyterlab/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/aws/jupyter* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
 COPY general/templates/os/pyspark_local_template.json /root/templates/
@@ -37,7 +37,7 @@
 COPY general/templates/os/r_template.json /root/templates/
 COPY general/templates/os/run_template.sh /root/templates/
 COPY general/templates/os/toree_dataengine-service_* /root/templates/
-COPY general/files/os/toree-assembly-0.2.0.jar /root/files/
+COPY general/files/os/toree-assembly-0.5.0.jar /root/files/
 COPY general/files/os/toree_kernel.tar.gz /root/files/
 COPY general/templates/os/pyspark_dataengine_template.json /root/templates/
 COPY general/templates/os/r_dataengine_template.json /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/aws/project_Dockerfile b/infrastructure-provisioning/src/general/files/aws/project_Dockerfile
index 0c23ae0..5390023 100644
--- a/infrastructure-provisioning/src/general/files/aws/project_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/project_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY project/ /root/
 COPY general/scripts/aws/project_* /root/scripts/
 COPY general/scripts/aws/edge_* /root/scripts/
-COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python2.7/dlab/edge_lib.py
+COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python3.8/datalab/edge_lib.py
 COPY general/templates/aws/edge_s3_policy.json /root/templates/edge_s3_policy.json
 COPY general/templates/os/manage_step_certs.sh /root/templates/
 COPY general/templates/os/step-cert-manager.service /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/aws/rstudio_Dockerfile b/infrastructure-provisioning/src/general/files/aws/rstudio_Dockerfile
index aafe294..93041d3 100644
--- a/infrastructure-provisioning/src/general/files/aws/rstudio_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/rstudio_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY rstudio/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/aws/rstudio_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
 COPY general/templates/os/inactive_rs.sh /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/aws/rstudio_description.json b/infrastructure-provisioning/src/general/files/aws/rstudio_description.json
index f517632..eae731a 100644
--- a/infrastructure-provisioning/src/general/files/aws/rstudio_description.json
+++ b/infrastructure-provisioning/src/general/files/aws/rstudio_description.json
@@ -19,10 +19,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "RStudio 1.2.5033",
+      "template_name": "RStudio 1.4.1103",
       "description": "Base image with RStudio node creation routines",
       "environment_type": "exploratory",
-      "version": "RStudio-1.2.5033",
+      "version": "RStudio-1.4.1103",
       "vendor": "AWS"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/aws/ssn_Dockerfile b/infrastructure-provisioning/src/general/files/aws/ssn_Dockerfile
index aeef12b..b9c1548 100644
--- a/infrastructure-provisioning/src/general/files/aws/ssn_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/ssn_Dockerfile
@@ -19,13 +19,13 @@
 #
 # ******************************************************************************
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY infrastructure-provisioning/src/ssn/ /root/
 COPY infrastructure-provisioning/src/general/scripts/aws/ssn_* /root/scripts/
-COPY infrastructure-provisioning/src/general/lib/os/${OS}/ssn_lib.py /usr/lib/python2.7/dlab/ssn_lib.py
+COPY infrastructure-provisioning/src/general/lib/os/${OS}/ssn_lib.py /usr/lib/python3.8/datalab/ssn_lib.py
 COPY infrastructure-provisioning/src/general/files/aws/ssn_policy.json /root/files/
 COPY infrastructure-provisioning/src/general/templates/aws/jenkins_jobs /root/templates/jenkins_jobs
 COPY infrastructure-provisioning/src/general/templates/os/manage_step_certs.sh /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/aws/ssn_description.json b/infrastructure-provisioning/src/general/files/aws/ssn_description.json
index 695e22f..f178385 100644
--- a/infrastructure-provisioning/src/general/files/aws/ssn_description.json
+++ b/infrastructure-provisioning/src/general/files/aws/ssn_description.json
@@ -1,4 +1,4 @@
 {
-  "template_name": "DLab AWS SelfService Node and infra",
+  "template_name": "DataLab AWS SelfService Node and infra",
   "description": "placeholder"
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/aws/tensor-rstudio_Dockerfile b/infrastructure-provisioning/src/general/files/aws/tensor-rstudio_Dockerfile
index 7efbb3c..5c7e95b 100644
--- a/infrastructure-provisioning/src/general/files/aws/tensor-rstudio_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/tensor-rstudio_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY tensor-rstudio/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/aws/tensor-rstudio_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/aws/tensor-rstudio_description.json b/infrastructure-provisioning/src/general/files/aws/tensor-rstudio_description.json
index b838f67..51fc3a4 100644
--- a/infrastructure-provisioning/src/general/files/aws/tensor-rstudio_description.json
+++ b/infrastructure-provisioning/src/general/files/aws/tensor-rstudio_description.json
@@ -8,10 +8,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "RStudio with TensorFlow 1.8.0",
+      "template_name": "RStudio with TensorFlow 2.5.0",
       "description": "Base image with TensorFlow and RStudio node creation routines",
       "environment_type": "exploratory",
-      "version": "tensorflow_gpu-1.8.0",
+      "version": "tensorflow_gpu-2.5.0",
       "vendor": "AWS"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/aws/tensor_Dockerfile b/infrastructure-provisioning/src/general/files/aws/tensor_Dockerfile
index 74b14f2..6bd820c 100644
--- a/infrastructure-provisioning/src/general/files/aws/tensor_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/tensor_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY tensor/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/aws/tensor_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/jupyter-notebook.service /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
@@ -37,6 +37,7 @@
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/tensorboard.service /root/templates/
 COPY general/templates/os/pyspark_dataengine-service_template.json /root/templates/
+COPY general/templates/os/sparkmagic_config_template.json /root/templates/
 COPY general/templates/os/inactive.sh /root/templates/
 COPY general/templates/os/inactive.service /root/templates/
 COPY general/templates/os/inactive.timer /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/aws/tensor_description.json b/infrastructure-provisioning/src/general/files/aws/tensor_description.json
index e78311d..20402e6 100644
--- a/infrastructure-provisioning/src/general/files/aws/tensor_description.json
+++ b/infrastructure-provisioning/src/general/files/aws/tensor_description.json
@@ -8,10 +8,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Jupyter with TensorFlow 1.8.0",
+      "template_name": "Jupyter with TensorFlow 2.5.0",
       "description": "Base image with TensorFlow and Jupyter node creation routines",
       "environment_type": "exploratory",
-      "version": "tensorflow_gpu-1.8.0",
+      "version": "tensorflow_gpu-2.5.0",
       "vendor": "AWS"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/aws/zeppelin_Dockerfile b/infrastructure-provisioning/src/general/files/aws/zeppelin_Dockerfile
index 6c0705f..abcb89e 100644
--- a/infrastructure-provisioning/src/general/files/aws/zeppelin_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/aws/zeppelin_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY zeppelin/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/aws/zeppelin_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/aws/interpreter_livy.json /root/templates/
 COPY general/templates/aws/interpreter_spark.json /root/templates/
 COPY general/templates/aws/dataengine-service_interpreter_* /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/aws/zeppelin_description.json b/infrastructure-provisioning/src/general/files/aws/zeppelin_description.json
index d2b4ae1..9db8593 100644
--- a/infrastructure-provisioning/src/general/files/aws/zeppelin_description.json
+++ b/infrastructure-provisioning/src/general/files/aws/zeppelin_description.json
@@ -19,10 +19,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Apache Zeppelin 0.8.2",
+      "template_name": "Apache Zeppelin 0.9.0",
       "description": "Base image with Apache Zeppelin node creation routines",
       "environment_type": "exploratory",
-      "version": "zeppelin-0.8.2",
+      "version": "zeppelin-0.9.0",
       "vendor": "AWS"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/azure/base_Dockerfile b/infrastructure-provisioning/src/general/files/azure/base_Dockerfile
index dcf939e..3d608de 100644
--- a/infrastructure-provisioning/src/general/files/azure/base_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/azure/base_Dockerfile
@@ -19,19 +19,19 @@
 #
 # ******************************************************************************
 
-FROM ubuntu:16.04
+FROM ubuntu:20.04
 ARG OS
 ARG SRC_PATH
 
 # Install any .deb dependecies
 RUN apt-get update && \
     apt-get -y upgrade && \
-    apt-get -y install python-pip python-dev groff vim less git wget nano libssl-dev libffi-dev libffi6 && \
+    DEBIAN_FRONTEND=noninteractive apt-get -y install python3-pip python3-dev python3-virtualenv groff vim less git wget nano libssl-dev libffi-dev libffi7 && \
     apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
 
 # Install any python dependencies
-RUN pip install -UI pip==9.0.3 && \
-    pip install backoff fabric==1.14.0 fabvenv argparse requests ujson jupyter pycrypto azure==2.0.0 azure-mgmt-authorization pyyaml
+RUN python3 -m pip install -UI qtconsole==4.7.7 pip==21.0.1 && \
+    python3 -m pip install backoff patchwork fabric fabvenv argparse requests ujson jupyter pycryptodome azure==2.0.0 azure-mgmt-authorization pyyaml
 
 # Configuring ssh for user
 RUN mkdir -p /root/.ssh; echo "Host *" > /root/.ssh/config; \
@@ -58,16 +58,16 @@
     mkdir -p /root/scripts && \
     mkdir -p /root/templates && \
     mkdir -p /root/files && \
-    mkdir -p /usr/lib/python2.7/dlab && \
+    mkdir -p /usr/lib/python3.8/datalab && \
     mkdir -p /root/keys/.ssh
 
 COPY ${SRC_PATH}base/ /root
 COPY ${SRC_PATH}general/conf/* /root/conf/
 COPY ${SRC_PATH}general/api/*.py /bin/
 COPY ${SRC_PATH}general/scripts/azure/common_* /root/scripts/
-COPY ${SRC_PATH}general/lib/azure/* /usr/lib/python2.7/dlab/
-COPY ${SRC_PATH}general/lib/os/${OS}/common_lib.py /usr/lib/python2.7/dlab/common_lib.py
-COPY ${SRC_PATH}general/lib/os/fab.py /usr/lib/python2.7/dlab/fab.py
+COPY ${SRC_PATH}general/lib/azure/* /usr/lib/python3.8/datalab/
+COPY ${SRC_PATH}general/lib/os/${OS}/common_lib.py /usr/lib/python3.8/datalab/common_lib.py
+COPY ${SRC_PATH}general/lib/os/fab.py /usr/lib/python3.8/datalab/fab.py
 COPY ${SRC_PATH}general/files/os/${OS}/sources.list /root/files/
 COPY ${SRC_PATH}general/files/os/ivysettings.xml /root/templates/
 COPY ${SRC_PATH}general/files/os/local_endpoint.json /root/files/
diff --git a/infrastructure-provisioning/src/general/files/azure/base_description.json b/infrastructure-provisioning/src/general/files/azure/base_description.json
index 63e884c..63f3475 100644
--- a/infrastructure-provisioning/src/general/files/azure/base_description.json
+++ b/infrastructure-provisioning/src/general/files/azure/base_description.json
@@ -1,4 +1,4 @@
 {
-  "template_name": "DLab Azure Base",
+  "template_name": "DataLab Azure Base",
   "description": "Base image with aws tools"
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/azure/dataengine_Dockerfile b/infrastructure-provisioning/src/general/files/azure/dataengine_Dockerfile
index 8e394cc..d1eec41 100644
--- a/infrastructure-provisioning/src/general/files/azure/dataengine_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/azure/dataengine_Dockerfile
@@ -19,12 +19,12 @@
 #
 # ******************************************************************************
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY dataengine/ /root/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/scripts/os/dataengine_* /root/scripts/
 COPY general/scripts/os/update_inactivity_on_start.py /root/scripts/
 COPY general/scripts/os/reconfigure_spark.py /root/scripts/
@@ -37,6 +37,8 @@
 COPY general/templates/os/tensorboard.service /root/templates/
 COPY general/templates/azure/core-site* /root/templates/
 COPY general/templates/os/${OS}/spark-* /root/templates/
+COPY general/templates/os/${OS}/livy.service /root/templates/
+COPY general/templates/os/livy-env.sh /root/templates/
 
 RUN chmod a+x /root/fabfile.py; \
     chmod a+x /root/scripts/*
diff --git a/infrastructure-provisioning/src/general/files/azure/deeplearning_Dockerfile b/infrastructure-provisioning/src/general/files/azure/deeplearning_Dockerfile
index 220086e..cf1c19e 100644
--- a/infrastructure-provisioning/src/general/files/azure/deeplearning_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/azure/deeplearning_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY deeplearning/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/azure/deeplearning_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/jupyter-notebook.service /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
@@ -35,12 +35,13 @@
 COPY general/templates/os/py3spark_local_template.json /root/templates/
 COPY general/templates/os/pyspark_dataengine_template.json /root/templates/
 COPY general/templates/os/r_template.json /root/templates/
+COPY general/templates/os/sparkmagic_config_template.json /root/templates/
 COPY general/templates/os/run_template.sh /root/templates/
 COPY general/templates/os/tensorboard.service /root/templates/
 COPY general/templates/os/inactive.sh /root/templates/
 COPY general/templates/os/inactive.service /root/templates/
 COPY general/templates/os/inactive.timer /root/templates/
-COPY general/files/os/toree-assembly-0.2.0.jar /root/files/
+COPY general/files/os/toree-assembly-0.5.0.jar /root/files/
 COPY general/files/os/toree_kernel.tar.gz /root/files/
 COPY general/templates/azure/core-site* /root/templates/
 
diff --git a/infrastructure-provisioning/src/general/files/azure/deeplearning_description.json b/infrastructure-provisioning/src/general/files/azure/deeplearning_description.json
index 55116fc..2e6d612 100644
--- a/infrastructure-provisioning/src/general/files/azure/deeplearning_description.json
+++ b/infrastructure-provisioning/src/general/files/azure/deeplearning_description.json
@@ -8,11 +8,13 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Deep Learning  2.3",
-      "description": "Base image with Deep Learning and Jupyter",
+      "template_name": "Data Science Virtual Machine - Ubuntu 18.04",
+      "description": "Pre-configured with NVIDIA drivers, CUDA Toolkit, and cuDNN library for GPU workloads with the following highlights: Jupyter, JupyterLab, and JupyterHub; Deep learning with TensorFlow and PyTorch; Machine learning with xgboost, Vowpal Wabbit, and LightGBM; Julia; Azure SDKs and libraries; Azure Machine Learning SDKs and sample notebooks; R support; Spark. Uses Anaconda virtual environments, configured to keep the different framework installations separate and easy to switch between frameworks as Jupyter kernels.",
       "environment_type": "exploratory",
-      "version": "deeplearning-2.3",
+      "version": "microsoft-dsvm:ubuntu-1804:1804-gen2",
       "vendor": "Azure"
     }
-  ]
+  ],
+  "exploratory_environment_images" :
+  []
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/azure/edge_Dockerfile b/infrastructure-provisioning/src/general/files/azure/edge_Dockerfile
index 5ad24cd..eeb5215 100644
--- a/infrastructure-provisioning/src/general/files/azure/edge_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/azure/edge_Dockerfile
@@ -20,13 +20,13 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY edge/ /root/
 COPY general/scripts/azure/edge_* /root/scripts/
-COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python2.7/dlab/edge_lib.py
+COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python3.8/datalab/edge_lib.py
 
 RUN chmod a+x /root/fabfile.py; \
     chmod a+x /root/scripts/*
diff --git a/infrastructure-provisioning/src/general/files/azure/jupyter_Dockerfile b/infrastructure-provisioning/src/general/files/azure/jupyter_Dockerfile
index acbb7a8..c5825ce 100644
--- a/infrastructure-provisioning/src/general/files/azure/jupyter_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/azure/jupyter_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY jupyter/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/azure/jupyter_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/jupyter-notebook.service /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
@@ -35,7 +35,7 @@
 COPY general/templates/os/py3spark_local_template.json /root/templates/
 COPY general/templates/os/r_template.json /root/templates/
 COPY general/templates/os/run_template.sh /root/templates/
-COPY general/files/os/toree-assembly-0.2.0.jar /root/files/
+COPY general/files/os/toree-assembly-0.5.0.jar /root/files/
 COPY general/files/os/toree_kernel.tar.gz /root/files/
 COPY general/templates/os/pyspark_dataengine_template.json /root/templates/
 COPY general/templates/os/r_dataengine_template.json /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/azure/jupyter_description.json b/infrastructure-provisioning/src/general/files/azure/jupyter_description.json
index 7b14870..33ed451 100644
--- a/infrastructure-provisioning/src/general/files/azure/jupyter_description.json
+++ b/infrastructure-provisioning/src/general/files/azure/jupyter_description.json
@@ -15,10 +15,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Jupyter notebook 6.0.2",
+      "template_name": "Jupyter notebook 6.1.6",
       "description": "Base image with Jupyter node creation routines",
       "environment_type": "exploratory",
-      "version": "jupyter_notebook-6.0.2",
+      "version": "jupyter_notebook-6.1.6",
       "vendor": "Azure"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/azure/jupyterlab_Dockerfile b/infrastructure-provisioning/src/general/files/azure/jupyterlab_Dockerfile
index 97739c1..1387eea 100644
--- a/infrastructure-provisioning/src/general/files/azure/jupyterlab_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/azure/jupyterlab_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY jupyterlab/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/azure/jupyter* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/jupyter-notebook.service /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
@@ -35,7 +35,7 @@
 COPY general/templates/os/py3spark_local_template.json /root/templates/
 COPY general/templates/os/r_template.json /root/templates/
 COPY general/templates/os/run_template.sh /root/templates/
-COPY general/files/os/toree-assembly-0.2.0.jar /root/files/
+COPY general/files/os/toree-assembly-0.5.0.jar /root/files/
 COPY general/files/os/toree_kernel.tar.gz /root/files/
 COPY general/templates/os/pyspark_dataengine_template.json /root/templates/
 COPY general/templates/os/r_dataengine_template.json /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/azure/project_Dockerfile b/infrastructure-provisioning/src/general/files/azure/project_Dockerfile
index 823becc..9f13f4b 100644
--- a/infrastructure-provisioning/src/general/files/azure/project_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/azure/project_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY project/ /root/
 COPY general/scripts/azure/project_* /root/scripts/
 COPY general/scripts/azure/edge_* /root/scripts/
-COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python2.7/dlab/edge_lib.py
+COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python3.8/datalab/edge_lib.py
 COPY general/templates/os/manage_step_certs.sh /root/templates/
 COPY general/templates/os/step-cert-manager.service /root/templates/
 
diff --git a/infrastructure-provisioning/src/general/files/azure/rstudio_Dockerfile b/infrastructure-provisioning/src/general/files/azure/rstudio_Dockerfile
index dc77e72..0c39847 100644
--- a/infrastructure-provisioning/src/general/files/azure/rstudio_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/azure/rstudio_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY rstudio/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/azure/rstudio_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
 COPY general/templates/os/inactive_rs.sh /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/azure/rstudio_description.json b/infrastructure-provisioning/src/general/files/azure/rstudio_description.json
index caf01fb..856b8c5 100644
--- a/infrastructure-provisioning/src/general/files/azure/rstudio_description.json
+++ b/infrastructure-provisioning/src/general/files/azure/rstudio_description.json
@@ -15,10 +15,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "RStudio 1.2.5033",
+      "template_name": "RStudio 1.4.1103",
       "description": "Base image with RStudio node creation routines",
       "environment_type": "exploratory",
-      "version": "RStudio-1.2.5033",
+      "version": "RStudio-1.4.1103",
       "vendor": "Azure"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/azure/ssn_Dockerfile b/infrastructure-provisioning/src/general/files/azure/ssn_Dockerfile
index ee9be75..8eb5885 100644
--- a/infrastructure-provisioning/src/general/files/azure/ssn_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/azure/ssn_Dockerfile
@@ -19,13 +19,13 @@
 #
 # ******************************************************************************
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY infrastructure-provisioning/src/ssn/ /root/
 COPY infrastructure-provisioning/src/general/scripts/azure/ssn_* /root/scripts/
-COPY infrastructure-provisioning/src/general/lib/os/${OS}/ssn_lib.py /usr/lib/python2.7/dlab/ssn_lib.py
+COPY infrastructure-provisioning/src/general/lib/os/${OS}/ssn_lib.py /usr/lib/python3.8/datalab/ssn_lib.py
 COPY infrastructure-provisioning/src/general/templates/azure/jenkins_jobs /root/templates/jenkins_jobs
 COPY infrastructure-provisioning/src/general/templates/os/manage_step_certs.sh /root/templates/
 COPY infrastructure-provisioning/src/general/templates/os/step-cert-manager.service /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/azure/ssn_description.json b/infrastructure-provisioning/src/general/files/azure/ssn_description.json
index 61a3d59..caa34a0 100644
--- a/infrastructure-provisioning/src/general/files/azure/ssn_description.json
+++ b/infrastructure-provisioning/src/general/files/azure/ssn_description.json
@@ -1,4 +1,4 @@
 {
-  "template_name": "DLab Azure SelfService Node and infra",
+  "template_name": "DataLab Azure SelfService Node and infra",
   "description": "placeholder"
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/azure/tensor_Dockerfile b/infrastructure-provisioning/src/general/files/azure/tensor_Dockerfile
index 5b2ac3c..4bb12ee 100644
--- a/infrastructure-provisioning/src/general/files/azure/tensor_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/azure/tensor_Dockerfile
@@ -20,20 +20,21 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY tensor/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/azure/tensor_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/jupyter-notebook.service /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
 COPY general/templates/os/pyspark_local_template.json /root/templates/
 COPY general/templates/os/py3spark_local_template.json /root/templates/
 COPY general/templates/os/pyspark_dataengine_template.json /root/templates/
+COPY general/templates/os/sparkmagic_config_template.json /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/tensorboard.service /root/templates/
 COPY general/templates/os/inactive.sh /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/azure/tensor_description.json b/infrastructure-provisioning/src/general/files/azure/tensor_description.json
index 4a71198..3a89e60 100644
--- a/infrastructure-provisioning/src/general/files/azure/tensor_description.json
+++ b/infrastructure-provisioning/src/general/files/azure/tensor_description.json
@@ -8,10 +8,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Jupyter with TensorFlow 1.8.0",
+      "template_name": "Jupyter with TensorFlow 2.5.0",
       "description": "Base image with TensorFlow and Jupyter node creation routines",
       "environment_type": "exploratory",
-      "version": "tensorflow_gpu-1.8.0",
+      "version": "tensorflow_gpu-2.5.0",
       "vendor": "Azure"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/azure/zeppelin_Dockerfile b/infrastructure-provisioning/src/general/files/azure/zeppelin_Dockerfile
index d86ebb7..b2a0a6f 100644
--- a/infrastructure-provisioning/src/general/files/azure/zeppelin_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/azure/zeppelin_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY zeppelin/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/azure/zeppelin_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/azure/interpreter_livy.json /root/templates/
 COPY general/templates/azure/interpreter_spark.json /root/templates/
 COPY general/templates/os/dataengine_interpreter_livy.json /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/azure/zeppelin_description.json b/infrastructure-provisioning/src/general/files/azure/zeppelin_description.json
index 5f0e6c3..8e3441b 100644
--- a/infrastructure-provisioning/src/general/files/azure/zeppelin_description.json
+++ b/infrastructure-provisioning/src/general/files/azure/zeppelin_description.json
@@ -15,10 +15,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Apache Zeppelin 0.8.2",
+      "template_name": "Apache Zeppelin 0.9.0",
       "description": "Base image with Apache Zeppelin node creation routines",
       "environment_type": "exploratory",
-      "version": "zeppelin-0.8.2",
+      "version": "zeppelin-0.9.0",
       "vendor": "Azure"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/gcp/base_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/base_Dockerfile
index 8a66b82..2059bce 100644
--- a/infrastructure-provisioning/src/general/files/gcp/base_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/base_Dockerfile
@@ -19,19 +19,30 @@
 #
 # ******************************************************************************
 
-FROM ubuntu:16.04
+FROM ubuntu:20.04
 ARG OS
 ARG SRC_PATH
 
 # Install any .deb dependecies
 RUN	apt-get update && \
     apt-get -y upgrade && \
-    apt-get -y install python-pip python-dev groff vim less git wget nano libssl-dev libffi-dev libffi6 && \
+    DEBIAN_FRONTEND=noninteractive apt-get -y install python3-pip python3-dev python3-virtualenv groff vim less git wget nano libssl-dev libffi-dev libffi7 && \
     apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
 
+# To cahnge POSIX locale to en_US.UTF-8
+RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y locales
+
+RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
+    dpkg-reconfigure --frontend=noninteractive locales && \
+    update-locale LANG=en_US.UTF-8
+
+ENV LANG en_US.UTF-8
+ENV LANGUAGE en_US:en
+ENV LC_ALL en_US.UTF-8
+
 # Install any python dependencies
-RUN pip install -UI pip==9.0.3 && \
-    pip install boto3 backoff fabric==1.14.0 fabvenv  argparse ujson jupyter pycrypto google-api-python-client google-cloud-storage \
+RUN python3 -m pip install -UI pip==21.0.1 && \
+    python3 -m pip install -U six patchwork configparser boto3 backoff fabric fabvenv argparse ujson jupyter pycryptodome google-api-python-client google-cloud-storage \
     pyyaml google-auth-httplib2 oauth2client
 
 # Configuring ssh for user
@@ -58,16 +69,16 @@
     mkdir -p /root/scripts && \
     mkdir -p /root/templates && \
     mkdir -p /root/files && \
-    mkdir -p /usr/lib/python2.7/dlab && \
+    mkdir -p /usr/lib/python3.8/datalab && \
     mkdir -p /root/keys/.ssh
 
 COPY ${SRC_PATH}base/ /root
 COPY ${SRC_PATH}general/conf/* /root/conf/
 COPY ${SRC_PATH}general/api/*.py /bin/
 COPY ${SRC_PATH}general/scripts/gcp/common_* /root/scripts/
-COPY ${SRC_PATH}general/lib/gcp/* /usr/lib/python2.7/dlab/
-COPY ${SRC_PATH}general/lib/os/${OS}/common_lib.py /usr/lib/python2.7/dlab/common_lib.py
-COPY ${SRC_PATH}general/lib/os/fab.py /usr/lib/python2.7/dlab/fab.py
+COPY ${SRC_PATH}general/lib/gcp/* /usr/lib/python3.8/datalab/
+COPY ${SRC_PATH}general/lib/os/${OS}/common_lib.py /usr/lib/python3.8/datalab/common_lib.py
+COPY ${SRC_PATH}general/lib/os/fab.py /usr/lib/python3.8/datalab/fab.py
 COPY ${SRC_PATH}general/files/os/${OS}/sources.list /root/files/
 COPY ${SRC_PATH}general/files/os/ivysettings.xml /root/templates/
 COPY ${SRC_PATH}general/files/os/local_endpoint.json /root/files/
diff --git a/infrastructure-provisioning/src/general/files/gcp/base_description.json b/infrastructure-provisioning/src/general/files/gcp/base_description.json
index 7773772..1d8b1fe 100644
--- a/infrastructure-provisioning/src/general/files/gcp/base_description.json
+++ b/infrastructure-provisioning/src/general/files/gcp/base_description.json
@@ -1,4 +1,4 @@
 {
-  "template_name": "DLab GCP Base",
+  "template_name": "DataLab GCP Base",
   "description": "Base image with gcp tools"
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/gcp/dataengine-service_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/dataengine-service_Dockerfile
index 00cad0d..91cc9e6 100644
--- a/infrastructure-provisioning/src/general/files/gcp/dataengine-service_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/dataengine-service_Dockerfile
@@ -19,19 +19,22 @@
 #
 # ******************************************************************************
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY dataengine-service/fabfile.py /root/
 COPY dataengine-service/description.json /root/
 COPY general/scripts/gcp/dataengine-service_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/scripts/os/common_* /root/scripts/
 COPY general/scripts/os/install_additional_libs.py /root/scripts/install_additional_libs.py
 COPY general/scripts/os/get_list_available_pkgs.py /root/scripts/get_list_available_pkgs.py
 COPY general/templates/gcp/dataengine-service_cluster.json /root/templates/dataengine-service_cluster.json
+COPY general/templates/gcp/dataengine-service_cluster_with_gpu.json /root/templates/dataengine-service_cluster_with_gpu.json
 COPY general/templates/gcp/dataengine-service_job.json /root/templates/dataengine-service_job.json
+COPY general/templates/gcp/dataengine-service_livy-env.sh /root/templates/dataengine-service_livy-env.sh
+COPY general/templates/gcp/dataengine-service_livy.service /root/templates/dataengine-service_livy.service
 COPY general/templates/os/inactive.sh /root/templates/
 COPY general/templates/os/inactive.service /root/templates/
 COPY general/templates/os/inactive.timer /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/gcp/dataengine-service_description.json b/infrastructure-provisioning/src/general/files/gcp/dataengine-service_description.json
index 1bf4fb6..ba9da13 100644
--- a/infrastructure-provisioning/src/general/files/gcp/dataengine-service_description.json
+++ b/infrastructure-provisioning/src/general/files/gcp/dataengine-service_description.json
@@ -25,7 +25,6 @@
   },
   "templates":
   [
-    {"version":"1.3", "applications": [{"Name":"Hadoop", "Version": "2.9.2"}, {"Name":"Spark", "Version": "2.3.2"}, {"Name":"Hive", "Version": "2.3.4"}]},
-    {"version":"1.4", "applications": [{"Name":"Hadoop", "Version": "2.9.2"}, {"Name":"Spark", "Version": "2.4.4"}, {"Name":"Hive", "Version": "2.3.6"}]}
+    {"version":"2.0.0-RC22-ubuntu18", "applications": [{"Name":"Hadoop", "Version": "3.2.2"}, {"Name":"Spark", "Version": "3.1.1"}, {"Name":"Hive", "Version": "3.1.2"}]}
   ]
-}
\ No newline at end of file
+}
diff --git a/infrastructure-provisioning/src/general/files/gcp/dataengine_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/dataengine_Dockerfile
index 0f4f14a..8445b20 100644
--- a/infrastructure-provisioning/src/general/files/gcp/dataengine_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/dataengine_Dockerfile
@@ -19,7 +19,7 @@
 #
 # ******************************************************************************
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
@@ -29,7 +29,7 @@
 COPY general/scripts/os/reconfigure_spark.py /root/scripts/
 COPY general/scripts/os/install_additional_libs.py /root/scripts/install_additional_libs.py
 COPY general/scripts/os/get_list_available_pkgs.py /root/scripts/get_list_available_pkgs.py
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/scripts/os/notebook_reconfigure_dataengine_spark.py /root/scripts/
 COPY general/scripts/os/common_* /root/scripts/
 COPY general/scripts/gcp/dataengine_* /root/scripts/
@@ -37,6 +37,8 @@
 COPY general/templates/os/tensorboard.service /root/templates/
 COPY general/templates/gcp/core-site.xml /root/templates/
 COPY general/templates/os/${OS}/spark-* /root/templates/
+COPY general/templates/os/${OS}/livy.service /root/templates/
+COPY general/templates/os/livy-env.sh /root/templates/
 
 RUN chmod a+x /root/fabfile.py; \
     chmod a+x /root/scripts/*
diff --git a/infrastructure-provisioning/src/general/files/gcp/deeplearning_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/deeplearning_Dockerfile
index 0a3ad63..41a39cb 100644
--- a/infrastructure-provisioning/src/general/files/gcp/deeplearning_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/deeplearning_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY deeplearning/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/gcp/deeplearning_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/jupyter-notebook.service /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
@@ -35,12 +35,13 @@
 COPY general/templates/os/py3spark_local_template.json /root/templates/
 COPY general/templates/os/pyspark_dataengine_template.json /root/templates/
 COPY general/templates/os/r_template.json /root/templates/
+COPY general/templates/os/sparkmagic_config_template.json /root/templates/
 COPY general/templates/os/run_template.sh /root/templates/
 COPY general/templates/os/tensorboard.service /root/templates/
 COPY general/templates/os/inactive.sh /root/templates/
 COPY general/templates/os/inactive.service /root/templates/
 COPY general/templates/os/inactive.timer /root/templates/
-COPY general/files/os/toree-assembly-0.2.0.jar /root/files/
+COPY general/files/os/toree-assembly-0.5.0.jar /root/files/
 COPY general/files/os/toree_kernel.tar.gz /root/files/
 COPY general/templates/os/pyspark_dataengine-service_template.json /root/templates/
 COPY general/templates/os/r_dataengine-service_template.json /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/gcp/deeplearning_description.json b/infrastructure-provisioning/src/general/files/gcp/deeplearning_description.json
index 080be57..f3dd752 100644
--- a/infrastructure-provisioning/src/general/files/gcp/deeplearning_description.json
+++ b/infrastructure-provisioning/src/general/files/gcp/deeplearning_description.json
@@ -10,11 +10,24 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Deep Learning  2.3",
-      "description": "Base image with Deep Learning and Jupyter",
+      "template_name": "Deeplearning notebook",
+      "description": "Set of Google Deep Learning Images",
       "environment_type": "exploratory",
-      "version": "deeplearning-2.3",
+      "version": "deeplearning_notebook",
       "vendor": "GCP"
     }
+  ],
+  "exploratory_environment_images" :
+  [
+    {"Image family": "common-cu110", "Description": "Google Deep Learning Image: Base, m67 CUDA11.0, A debian-10 Linux based image with CUDA 11.0 preinstalled."},
+    {"Image family": "common-cu100", "Description": "Google Deep Learning Image: Base, m67 CUDA10.0. A debian-10 Linux based image with CUDA 10.0 preinstalled."},
+    {"Image family": "common-cu92", "Description": "Google Deep Learning Image: Base, m67 CUDA 9.2, A Debian based image with CUDA 9.2 pre-installed."},
+    {"Image family": "pytorch-latest-gpu", "Description": "Google Deep Learning Image: PyTorch 1.8, m67 CUDA 110, A debian-10 Linux based image with PyTorch 1.8 pre-installed."},
+    {"Image family": "rapids-latest-gpu-experimental", "Description": "Google RAPIDS 0.5.1 with XGBoost, m64, RAPIDS 0.5.1 with XGBoost with CUDA 10.0."},
+    {"Image family": "chainer-latest-gpu-experimental", "Description": "Image created by Daisy in workflow \"chainer-latest-gpu-experimental\" on behalf of root."},
+    {"Image family": "xgboost-latest-gpu-experimental", "Description": "Google Deep Learning Image: XGBOOST 0.9, m61 CUDA 92, A debian-10 Linux based image with XGBOOST pre-installed."},
+    {"Image family": "mxnet-latest-gpu-experimental", "Description": "Google Deep Learning Image: MXNet 1.5, m61 CUDA 92. A debian-10 Linux based image with MXNet/Gluon and keras pre-installed."},
+    {"Image family": "cntk-latest-gpu-experimental", "Description": "Google Deep Learning Image: CNTK 2.7 m59. A debian-10 Linux based image with CUDA 100 and CNTK preinstalled."},
+    {"Image family": "caffe1-latest-gpu-experimental", "Description": "Google Deep Learning Image: Caffe 1.0. A Debian based image with CUDA 10.0 preinstalled."}
   ]
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/gcp/edge_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/edge_Dockerfile
index f60f409..ef3c1ac 100644
--- a/infrastructure-provisioning/src/general/files/gcp/edge_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/edge_Dockerfile
@@ -20,13 +20,13 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY edge/ /root/
 COPY general/scripts/gcp/edge_* /root/scripts/
-COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python2.7/dlab/edge_lib.py
+COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python3.8/datalab/edge_lib.py
 COPY general/files/gcp/ps_policy.json /root/files/ps_policy.json
 COPY general/files/gcp/ps_roles.json /root/files/ps_roles.json
 
diff --git a/infrastructure-provisioning/src/general/files/gcp/jupyter_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/jupyter_Dockerfile
index 8e5dabd..1ac3f99 100644
--- a/infrastructure-provisioning/src/general/files/gcp/jupyter_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/jupyter_Dockerfile
@@ -20,20 +20,21 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY jupyter/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/gcp/jupyter_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/jupyter-notebook.service /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
 COPY general/templates/os/pyspark_local_template.json /root/templates/
 COPY general/templates/os/py3spark_local_template.json /root/templates/
 COPY general/templates/os/pyspark_dataengine-service_template.json /root/templates/
+COPY general/templates/os/sparkmagic_config_template.json /root/templates/
 COPY general/templates/os/r_dataengine-service_template.json /root/templates/
 COPY general/templates/os/r_template.json /root/templates/
 COPY general/templates/os/run_template.sh /root/templates/
@@ -41,7 +42,7 @@
 COPY general/templates/os/inactive.sh /root/templates/
 COPY general/templates/os/inactive.service /root/templates/
 COPY general/templates/os/inactive.timer /root/templates/
-COPY general/files/os/toree-assembly-0.2.0.jar /root/files/
+COPY general/files/os/toree-assembly-0.5.0.jar /root/files/
 COPY general/files/os/toree_kernel.tar.gz /root/files/
 COPY general/templates/os/pyspark_dataengine_template.json /root/templates/
 COPY general/templates/os/r_dataengine_template.json /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/gcp/jupyter_description.json b/infrastructure-provisioning/src/general/files/gcp/jupyter_description.json
index a94ba57..1eafbed 100644
--- a/infrastructure-provisioning/src/general/files/gcp/jupyter_description.json
+++ b/infrastructure-provisioning/src/general/files/gcp/jupyter_description.json
@@ -23,10 +23,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Jupyter notebook 6.0.2",
+      "template_name": "Jupyter notebook 6.1.6",
       "description": "Base image with jupyter node creation routines",
       "environment_type": "exploratory",
-      "version": "jupyter_notebook-6.0.2",
+      "version": "jupyter_notebook-6.1.6",
       "vendor": "GCP"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/gcp/jupyterlab_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/jupyterlab_Dockerfile
index 4d68e2f..9868954 100644
--- a/infrastructure-provisioning/src/general/files/gcp/jupyterlab_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/jupyterlab_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY jupyterlab/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/gcp/jupyter* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
 COPY general/templates/os/pyspark_local_template.json /root/templates/
@@ -37,7 +37,7 @@
 COPY general/templates/os/r_template.json /root/templates/
 COPY general/templates/os/run_template.sh /root/templates/
 COPY general/templates/os/toree_dataengine-service_* /root/templates/
-COPY general/files/os/toree-assembly-0.2.0.jar /root/files/
+COPY general/files/os/toree-assembly-0.5.0.jar /root/files/
 COPY general/files/os/toree_kernel.tar.gz /root/files/
 COPY general/templates/os/pyspark_dataengine_template.json /root/templates/
 COPY general/templates/os/r_dataengine_template.json /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/gcp/project_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/project_Dockerfile
index 7fc44e5..8c8df3c 100644
--- a/infrastructure-provisioning/src/general/files/gcp/project_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/project_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY project/ /root/
 COPY general/scripts/gcp/project_* /root/scripts/
 COPY general/scripts/gcp/edge_* /root/scripts/
-COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python2.7/dlab/edge_lib.py
+COPY general/lib/os/${OS}/edge_lib.py /usr/lib/python3.8/datalab/edge_lib.py
 COPY general/files/gcp/ps_policy.json /root/files/ps_policy.json
 COPY general/files/gcp/ps_roles.json /root/files/ps_roles.json
 COPY general/templates/os/manage_step_certs.sh /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/gcp/rstudio_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/rstudio_Dockerfile
index 0a07470..5738cba 100644
--- a/infrastructure-provisioning/src/general/files/gcp/rstudio_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/rstudio_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY rstudio/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/gcp/rstudio_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
 COPY general/templates/gcp/core-site.xml /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/gcp/rstudio_description.json b/infrastructure-provisioning/src/general/files/gcp/rstudio_description.json
index 27c2771..1e5944c 100644
--- a/infrastructure-provisioning/src/general/files/gcp/rstudio_description.json
+++ b/infrastructure-provisioning/src/general/files/gcp/rstudio_description.json
@@ -23,10 +23,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "RStudio 1.2.5033",
+      "template_name": "RStudio 1.4.1103",
       "description": "Base image with rstudio node creation routines",
       "environment_type": "exploratory",
-      "version": "RStudio-1.2.5033",
+      "version": "RStudio-1.4.1103",
       "vendor": "GCP"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/gcp/ssn_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/ssn_Dockerfile
index 902f48c..a330912 100644
--- a/infrastructure-provisioning/src/general/files/gcp/ssn_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/ssn_Dockerfile
@@ -19,13 +19,13 @@
 #
 # ******************************************************************************
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY infrastructure-provisioning/src/ssn/ /root/
 COPY infrastructure-provisioning/src/general/scripts/gcp/ssn_* /root/scripts/
-COPY infrastructure-provisioning/src/general/lib/os/${OS}/ssn_lib.py /usr/lib/python2.7/dlab/ssn_lib.py
+COPY infrastructure-provisioning/src/general/lib/os/${OS}/ssn_lib.py /usr/lib/python3.8/datalab/ssn_lib.py
 COPY infrastructure-provisioning/src/general/files/gcp/ssn_policy.json /root/files/
 COPY infrastructure-provisioning/src/general/files/gcp/ssn_roles.json /root/files/
 COPY infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs /root/templates/jenkins_jobs
diff --git a/infrastructure-provisioning/src/general/files/gcp/ssn_description.json b/infrastructure-provisioning/src/general/files/gcp/ssn_description.json
index 8193ad8..7605025 100644
--- a/infrastructure-provisioning/src/general/files/gcp/ssn_description.json
+++ b/infrastructure-provisioning/src/general/files/gcp/ssn_description.json
@@ -1,4 +1,4 @@
 {
-  "template_name": "DLab GCP SelfService Node and infra",
+  "template_name": "DataLab GCP SelfService Node and infra",
   "description": "placeholder"
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/gcp/ssn_policy.json b/infrastructure-provisioning/src/general/files/gcp/ssn_policy.json
index bd95d12..843a452 100644
--- a/infrastructure-provisioning/src/general/files/gcp/ssn_policy.json
+++ b/infrastructure-provisioning/src/general/files/gcp/ssn_policy.json
@@ -16,5 +16,8 @@
     "compute.images.get",
     "compute.images.delete",
     "compute.images.setLabels",
-    "compute.images.list"
+    "compute.images.list",
+    "compute.routes.create",
+    "compute.routes.get",
+    "compute.routes.delete"
 ]
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/files/gcp/superset_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/superset_Dockerfile
index 224482c..8c63e0a 100644
--- a/infrastructure-provisioning/src/general/files/gcp/superset_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/superset_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY superset/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/gcp/superset_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/superset-notebook.service /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 
diff --git a/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_Dockerfile
index 3f609b4..0e85ff3 100644
--- a/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY tensor-rstudio/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/gcp/tensor-rstudio_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_description.json b/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_description.json
index 0b0539e..14f33eb 100644
--- a/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_description.json
+++ b/infrastructure-provisioning/src/general/files/gcp/tensor-rstudio_description.json
@@ -27,10 +27,10 @@
   },
   "exploratory_environment_versions": [
     {
-      "template_name": "RStudio with TensorFlow 1.8.0",
+      "template_name": "RStudio with TensorFlow 2.5.0",
       "description": "Base image with TensorFlow and RStudio node creation routines",
       "environment_type": "exploratory",
-      "version": "tensorflow_gpu-1.8.0",
+      "version": "tensorflow_gpu-2.5.0",
       "vendor": "GCP"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/gcp/tensor_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/tensor_Dockerfile
index 9f1e594..b585dd1 100644
--- a/infrastructure-provisioning/src/general/files/gcp/tensor_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/tensor_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY tensor/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/gcp/tensor_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/os/${OS}/jupyter-notebook.service /root/templates/
 COPY general/templates/os/${OS}/ungit.service /root/templates/
 COPY general/templates/os/notebook_spark-defaults_local.conf /root/templates/
@@ -36,6 +36,7 @@
 COPY general/templates/os/pyspark_dataengine_template.json /root/templates/
 COPY general/templates/os/tensorboard.service /root/templates/
 COPY general/templates/os/pyspark_dataengine-service_template.json /root/templates/
+COPY general/templates/os/sparkmagic_config_template.json /root/templates/
 COPY general/templates/os/inactive.sh /root/templates/
 COPY general/templates/os/inactive.service /root/templates/
 COPY general/templates/os/inactive.timer /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/gcp/tensor_description.json b/infrastructure-provisioning/src/general/files/gcp/tensor_description.json
index b5bebad..8561110 100644
--- a/infrastructure-provisioning/src/general/files/gcp/tensor_description.json
+++ b/infrastructure-provisioning/src/general/files/gcp/tensor_description.json
@@ -10,10 +10,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Jupyter with TensorFlow 1.8.0",
+      "template_name": "Jupyter with TensorFlow 2.5.0",
       "description": "Base image with TensorFlow and Jupyter node creation routines",
       "environment_type": "exploratory",
-      "version": "tensorflow_gpu-1.8.0",
+      "version": "tensorflow_gpu-2.5.0",
       "vendor": "GCP"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/files/gcp/zeppelin_Dockerfile b/infrastructure-provisioning/src/general/files/gcp/zeppelin_Dockerfile
index ab5b22e..3ae5220 100644
--- a/infrastructure-provisioning/src/general/files/gcp/zeppelin_Dockerfile
+++ b/infrastructure-provisioning/src/general/files/gcp/zeppelin_Dockerfile
@@ -20,14 +20,14 @@
 # ******************************************************************************
 
 
-FROM docker.dlab-base:latest
+FROM docker.datalab-base:latest
 
 ARG OS
 
 COPY zeppelin/ /root/
 COPY general/scripts/os/* /root/scripts/
 COPY general/scripts/gcp/zeppelin_* /root/scripts/
-COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python2.7/dlab/notebook_lib.py
+COPY general/lib/os/${OS}/notebook_lib.py /usr/lib/python3.8/datalab/notebook_lib.py
 COPY general/templates/gcp/interpreter_livy.json /root/templates/
 COPY general/templates/gcp/interpreter_spark.json /root/templates/
 COPY general/templates/os/dataengine_interpreter_livy.json /root/templates/
diff --git a/infrastructure-provisioning/src/general/files/gcp/zeppelin_description.json b/infrastructure-provisioning/src/general/files/gcp/zeppelin_description.json
index 159c14e..6a4a772 100644
--- a/infrastructure-provisioning/src/general/files/gcp/zeppelin_description.json
+++ b/infrastructure-provisioning/src/general/files/gcp/zeppelin_description.json
@@ -23,10 +23,10 @@
   "exploratory_environment_versions" :
   [
     {
-      "template_name": "Apache Zeppelin 0.8.2",
+      "template_name": "Apache Zeppelin 0.9.0",
       "description": "Base image with Apache Zeppelin node creation routines",
       "environment_type": "exploratory",
-      "version": "zeppelin-0.8.2",
+      "version": "zeppelin-0.9.0",
       "vendor": "GCP"
     }
   ]
diff --git a/infrastructure-provisioning/src/general/lib/aws/actions_lib.py b/infrastructure-provisioning/src/general/lib/aws/actions_lib.py
index 9519053..b3810c2 100644
--- a/infrastructure-provisioning/src/general/lib/aws/actions_lib.py
+++ b/infrastructure-provisioning/src/general/lib/aws/actions_lib.py
@@ -19,26 +19,25 @@
 #
 # ******************************************************************************
 
+import ast
+import backoff
 import boto3
 import botocore
-from botocore.client import Config
-import backoff
-from botocore.exceptions import ClientError
-import time
-import sys
-import os
 import json
-from fabric.api import *
-from fabric.contrib.files import exists
 import logging
-from dlab.meta_lib import *
-from dlab.fab import *
+import os
+import sys
+import time
 import traceback
-import urllib2
-import meta_lib
-import dlab.fab
+import urllib3
+import urllib.request
 import uuid
-import ast
+import subprocess
+import datalab.fab
+from datalab.meta_lib import *
+from botocore.client import Config as botoConfig
+from patchwork.files import exists
+from patchwork import files
 
 
 def backoff_log(err):
@@ -53,7 +52,7 @@
 
 def put_to_bucket(bucket_name, local_file, destination_file):
     try:
-        s3 = boto3.client('s3', config=Config(signature_version='s3v4'), region_name=os.environ['aws_region'])
+        s3 = boto3.client('s3', config=botoConfig(signature_version='s3v4'), region_name=os.environ['aws_region'])
         with open(local_file, 'rb') as data:
             s3.upload_fileobj(data, bucket_name, destination_file, ExtraArgs={'ServerSideEncryption': 'AES256'})
         return True
@@ -68,12 +67,12 @@
 
 def create_s3_bucket(bucket_name, bucket_tags, region, bucket_name_tag):
     try:
-        s3 = boto3.resource('s3', config=Config(signature_version='s3v4'))
+        s3 = boto3.resource('s3', config=botoConfig(signature_version='s3v4'))
         if region == "us-east-1":
             bucket = s3.create_bucket(Bucket=bucket_name)
         else:
             bucket = s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={'LocationConstraint': region})
-        boto3.client('s3', config=Config(signature_version='s3v4')).put_bucket_encryption(
+        boto3.client('s3', config=botoConfig(signature_version='s3v4')).put_bucket_encryption(
             Bucket=bucket_name, ServerSideEncryptionConfiguration={
                 'Rules': [
                     {
@@ -208,6 +207,7 @@
         route_table.append(rt_id)
         print('Created Route-Table with ID: {}'.format(rt_id))
         create_tag(route_table, json.dumps(tag))
+        create_tag(route_table, json.dumps({"Key": "Name", "Value": "{}-ssn-rt".format(infra_tag_value)}))
         if not secondary:
             ig = ec2.create_internet_gateway()
             ig_id = ig.get('InternetGateway').get('InternetGatewayId')
@@ -224,6 +224,25 @@
                            "error_message": str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout)}))
         traceback.print_exc(file=sys.stdout)
 
+def create_nat_rt(vpc_id, infra_tag_value, edge_instance_id, private_subnet_id, sbn):
+    try:
+        ec2 = boto3.client('ec2')
+        nat_rt = ec2.create_route_table(VpcId=vpc_id)
+        nat_rt_id = nat_rt.get('RouteTable').get('RouteTableId')
+        tag = {"Key": 'Name', "Value": infra_tag_value}
+        create_tag(nat_rt_id, json.dumps(tag))
+        create_tag(nat_rt_id, json.dumps({"Key": "{}-tag".format(sbn), "Value": sbn}))
+        ec2 = boto3.resource('ec2')
+        route_table = ec2.RouteTable(nat_rt_id)
+        route_table.create_route(DestinationCidrBlock='0.0.0.0/0', InstanceId=edge_instance_id)
+        route_table.associate_with_subnet(SubnetId=private_subnet_id)
+    except Exception as err:
+        logging.info(
+            "Unable to create Route Table: " + str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout))
+        append_result(str({"error": "Unable to create Route Table",
+                           "error_message": str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout)}))
+        traceback.print_exc(file=sys.stdout)
+
 
 def create_subnet(vpc_id, subnet, tag, zone):
     try:
@@ -461,7 +480,10 @@
                                              UserData=user_data)
         for instance in instances:
             print("Waiting for instance {} become running.".format(instance.id))
-            instance.wait_until_running()
+            try:
+                instance.wait_until_running()
+            except:
+                pass
             tag = {'Key': 'Name', 'Value': definitions.node_name}
             create_tag(instance.id, tag)
             create_tag(instance.id, instance_tag)
@@ -474,11 +496,20 @@
                            "error_message": str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout)}))
         traceback.print_exc(file=sys.stdout)
 
+def modify_instance_sourcedescheck(instance_id):
+    try:
+        ec2 = boto3.client('ec2')
+        ec2.modify_instance_attribute(InstanceId=instance_id, SourceDestCheck={'Value': False})
+    except Exception as err:
+        logging.info("Unable to modify EC2: " + str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout))
+        append_result(str({"error": "Unable to modify EC2",
+                           "error_message": str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout)}))
+        traceback.print_exc(file=sys.stdout)
 
 def tag_intance_volume(instance_id, node_name, instance_tag):
     try:
         print('volume tagging')
-        volume_list = meta_lib.get_instance_attr(instance_id, 'block_device_mappings')
+        volume_list = datalab.meta_lib.get_instance_attr(instance_id, 'block_device_mappings')
         counter = 0
         instance_tag_value = instance_tag.get('Value')
         for volume in volume_list:
@@ -758,6 +789,21 @@
                            "error_message": str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout)}))
         traceback.print_exc(file=sys.stdout)
 
+def create_nat_gateway(allocation_id, subnet_id, project_name):
+    try:
+        client = boto3.client('ec2')
+        client.create_nat_gateway(AllocationId=allocation_id, SubnetId=subnet_id, TagSpecifications=[
+                                        {
+                                            'ResourceType': 'natgateway',
+                                            'Tags': [{'Key': 'Name', 'Value': '{}-nat'.format(project_name)}]
+                                        }])
+    except Exception as err:
+        logging.info("Unable to create NAT Gateway: " + str(err) + "\n Traceback: " + traceback.print_exc(
+            file=sys.stdout))
+        append_result(str({"error": "Unable to create NAT Gateway",
+                           "error_message": str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout)}))
+        traceback.print_exc(file=sys.stdout)
+
 
 def remove_ec2(tag_name, tag_value):
     try:
@@ -909,6 +955,11 @@
                             service_base_name))
                     except:
                         print('There is no policy {}-ssn-policy to delete'.format(service_base_name))
+                    attached_role_policies = client.list_attached_role_policies(RoleName=iam_role)
+                    if attached_role_policies:
+                        for policy in attached_role_policies['AttachedPolicies']:
+                            print('{} has been detached from {} role'.format(policy['PolicyName'], iam_role))
+                            client.detach_role_policy(RoleName=iam_role, PolicyArn=policy['PolicyArn'])
                     role_profiles = client.list_instance_profiles_for_role(RoleName=iam_role).get('InstanceProfiles')
                     if role_profiles:
                         for i in role_profiles:
@@ -1003,8 +1054,8 @@
 
 
 def s3_cleanup(bucket, cluster_name, user_name):
-    s3_res = boto3.resource('s3', config=Config(signature_version='s3v4'))
-    client = boto3.client('s3', config=Config(signature_version='s3v4'), region_name=os.environ['aws_region'])
+    s3_res = boto3.resource('s3', config=botoConfig(signature_version='s3v4'))
+    client = boto3.client('s3', config=botoConfig(signature_version='s3v4'), region_name=os.environ['aws_region'])
     try:
         client.head_bucket(Bucket=bucket)
     except:
@@ -1024,7 +1075,7 @@
 
 def remove_s3(bucket_type='all', scientist=''):
     try:
-        client = boto3.client('s3', config=Config(signature_version='s3v4'), region_name=os.environ['aws_region'])
+        client = boto3.client('s3', config=botoConfig(signature_version='s3v4'), region_name=os.environ['aws_region'])
         s3 = boto3.resource('s3')
         bucket_list = []
         if bucket_type == 'ssn':
@@ -1215,29 +1266,27 @@
         if instances:
             for instance in instances:
                 private = getattr(instance, 'private_dns_name')
-                env.hosts = "{}".format(private)
-                env.user = "{}".format(ssh_user)
-                env.key_filename = "{}".format(key_path)
-                env.host_string = env.user + "@" + env.hosts
-                sudo('rm -rf /home/{}/.local/share/jupyter/kernels/*_{}'.format(ssh_user, emr_name))
-                if exists('/home/{}/.ensure_dir/dataengine-service_{}_interpreter_ensured'.format(ssh_user, emr_name)):
+                global con
+                con = datalab.fab.init_datalab_connection(private, ssh_user, key_path)
+                con.sudo('rm -rf /home/{}/.local/share/jupyter/kernels/*_{}'.format(ssh_user, emr_name))
+                if exists(con, '/home/{}/.ensure_dir/dataengine-service_{}_interpreter_ensured'.format(ssh_user, emr_name)):
                     if os.environ['notebook_multiple_clusters'] == 'true':
                         try:
-                            livy_port = sudo("cat /opt/" + emr_version + "/" + emr_name +
+                            livy_port = con.sudo("cat /opt/" + emr_version + "/" + emr_name +
                                              "/livy/conf/livy.conf | grep livy.server.port | tail -n 1 | "
-                                             "awk '{printf $3}'")
-                            process_number = sudo("netstat -natp 2>/dev/null | grep ':" + livy_port +
-                                                  "' | awk '{print $7}' | sed 's|/.*||g'")
-                            sudo('kill -9 ' + process_number)
-                            sudo('systemctl disable livy-server-' + livy_port)
+                                             "awk '{printf $3}'").stdout.replace('\n','')
+                            process_number = con.sudo("netstat -natp 2>/dev/null | grep ':" + livy_port +
+                                                  "' | awk '{print $7}' | sed 's|/.*||g'").stdout.replace('\n','')
+                            con.sudo('kill -9 ' + process_number)
+                            con.sudo('systemctl disable livy-server-' + livy_port)
                         except:
                             print("Wasn't able to find Livy server for this EMR!")
-                    sudo('sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/spark/\" '
+                    con.sudo('sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/spark/\" '
                          '/opt/zeppelin/conf/zeppelin-env.sh')
-                    sudo("rm -rf /home/{}/.ensure_dir/dataengine-service_interpreter_ensure".format(ssh_user))
+                    con.sudo("rm -rf /home/{}/.ensure_dir/dataengine-service_interpreter_ensure".format(ssh_user))
                     zeppelin_url = 'http://' + private + ':8080/api/interpreter/setting/'
-                    opener = urllib2.build_opener(urllib2.ProxyHandler({}))
-                    req = opener.open(urllib2.Request(zeppelin_url))
+                    opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
+                    req = opener.open(urllib.request.Request(zeppelin_url))
                     r_text = req.read()
                     interpreter_json = json.loads(r_text)
                     interpreter_prefix = emr_name
@@ -1245,28 +1294,29 @@
                         if interpreter_prefix in interpreter['name']:
                             print("Interpreter with ID: {0} and name: {1} will be removed from zeppelin!".
                                   format(interpreter['id'], interpreter['name']))
-                            request = urllib2.Request(zeppelin_url + interpreter['id'], data='')
+                            request = urllib.request.Request(zeppelin_url + interpreter['id'], data=''.encode())
                             request.get_method = lambda: 'DELETE'
                             url = opener.open(request)
                             print(url.read())
-                    sudo('chown ' + ssh_user + ':' + ssh_user + ' -R /opt/zeppelin/')
-                    sudo('systemctl daemon-reload')
-                    sudo("service zeppelin-notebook stop")
-                    sudo("service zeppelin-notebook start")
+                    con.sudo('chown ' + ssh_user + ':' + ssh_user + ' -R /opt/zeppelin/')
+                    con.sudo('systemctl daemon-reload')
+                    con.sudo("service zeppelin-notebook stop")
+                    con.sudo("service zeppelin-notebook start")
                     zeppelin_restarted = False
                     while not zeppelin_restarted:
-                        sudo('sleep 5')
-                        result = sudo('nmap -p 8080 localhost | grep "closed" > /dev/null; echo $?')
+                        con.sudo('sleep 5')
+                        result = con.sudo('nmap -p 8080 localhost | grep "closed" > /dev/null; echo $?').stdout
                         result = result[:1]
                         if result == '1':
                             zeppelin_restarted = True
-                    sudo('sleep 5')
-                    sudo('rm -rf /home/{}/.ensure_dir/dataengine-service_{}_interpreter_ensured'.format(ssh_user,
+                    con.sudo('sleep 5')
+                    con.sudo('rm -rf /home/{}/.ensure_dir/dataengine-service_{}_interpreter_ensured'.format(ssh_user,
                                                                                                         emr_name))
-                if exists('/home/{}/.ensure_dir/rstudio_dataengine-service_ensured'.format(ssh_user)):
-                    dlab.fab.remove_rstudio_dataengines_kernel(computational_name, ssh_user)
-                sudo('rm -rf  /opt/' + emr_version + '/' + emr_name + '/')
-                print("Notebook's {} kernels were removed".format(env.hosts))
+                if exists(con, '/home/{}/.ensure_dir/rstudio_dataengine-service_ensured'.format(ssh_user)):
+                    datalab.fab.remove_rstudio_dataengines_kernel(computational_name, ssh_user)
+                con.sudo('rm -rf  /opt/' + emr_version + '/' + emr_name + '/')
+                print("Notebook's {} kernels were removed".format(private))
+                con.close()
         else:
             print("There are no notebooks to clean kernels.")
     except Exception as err:
@@ -1277,10 +1327,14 @@
         traceback.print_exc(file=sys.stdout)
 
 
-def remove_route_tables(tag_name, ssn=False):
+def remove_route_tables(tag_name, ssn=False, tag_value=''):
     try:
         client = boto3.client('ec2')
-        rtables = client.describe_route_tables(Filters=[{'Name': 'tag-key', 'Values': [tag_name]}]).get('RouteTables')
+        if tag_value == '':
+            rtables = client.describe_route_tables(Filters=[{'Name': 'tag-key', 'Values': [tag_name]}]).get('RouteTables')
+        else:
+            rtables = client.describe_route_tables(Filters=[{'Name': 'tag-key', 'Values': [tag_name]},
+                {'Name': 'tag-value', 'Values': [tag_value]}]).get('RouteTables')
         for rtable in rtables:
             if rtable:
                 rtable_associations = rtable.get('Associations')
@@ -1351,7 +1405,7 @@
                                           NoReboot=False)
             image.load()
             while image.state != 'available':
-                local("echo Waiting for image creation; sleep 20")
+                subprocess.run("echo Waiting for image creation; sleep 20", shell=True, check=True)
                 image.load()
             tag = {'Key': 'Name', 'Value': image_name}
             sbn_tag = {'Key': 'SBN', 'Value': os.environ['conf_service_base_name']}
@@ -1382,48 +1436,48 @@
 
 
 def install_emr_spark(args):
-    s3_client = boto3.client('s3', config=Config(signature_version='s3v4'), region_name=args.region)
+    s3_client = boto3.client('s3', config=botoConfig(signature_version='s3v4'), region_name=args.region)
     s3_client.download_file(args.bucket, args.project_name + '/' + args.cluster_name + '/spark.tar.gz',
                             '/tmp/spark.tar.gz')
     s3_client.download_file(args.bucket, args.project_name + '/' + args.cluster_name + '/spark-checksum.chk',
                             '/tmp/spark-checksum.chk')
-    if 'WARNING' in local('md5sum -c /tmp/spark-checksum.chk', capture=True):
-        local('rm -f /tmp/spark.tar.gz')
+    if 'WARNING' in subprocess.run('md5sum -c /tmp/spark-checksum.chk', capture_output=True, shell=True, check=True).stdout.decode('UTF-8'):
+        subprocess.run('rm -f /tmp/spark.tar.gz', shell=True, check=True)
         s3_client.download_file(args.bucket, args.project_name + '/' + args.cluster_name + '/spark.tar.gz',
                                 '/tmp/spark.tar.gz')
-        if 'WARNING' in local('md5sum -c /tmp/spark-checksum.chk', capture=True):
+        if 'WARNING' in subprocess.run('md5sum -c /tmp/spark-checksum.chk', capture_output=True, shell=True, check=True).stdout.decode('UTF-8'):
             print("The checksum of spark.tar.gz is mismatched. It could be caused by aws network issue.")
             sys.exit(1)
-    local('sudo tar -zhxvf /tmp/spark.tar.gz -C /opt/' + args.emr_version + '/' + args.cluster_name + '/')
+    subprocess.run('sudo tar -zhxvf /tmp/spark.tar.gz -C /opt/' + args.emr_version + '/' + args.cluster_name + '/', shell=True, check=True)
 
 
 def jars(args, emr_dir):
     print("Downloading jars...")
-    s3_client = boto3.client('s3', config=Config(signature_version='s3v4'), region_name=args.region)
+    s3_client = boto3.client('s3', config=botoConfig(signature_version='s3v4'), region_name=args.region)
     s3_client.download_file(args.bucket, 'jars/' + args.emr_version + '/jars.tar.gz', '/tmp/jars.tar.gz')
     s3_client.download_file(args.bucket, 'jars/' + args.emr_version + '/jars-checksum.chk', '/tmp/jars-checksum.chk')
-    if 'WARNING' in local('md5sum -c /tmp/jars-checksum.chk', capture=True):
-        local('rm -f /tmp/jars.tar.gz')
+    if 'WARNING' in subprocess.run('md5sum -c /tmp/jars-checksum.chk', capture_output=True, shell=True, check=True).stdout.decode('UTF-8'):
+        subprocess.run('rm -f /tmp/jars.tar.gz', shell=True, check=True)
         s3_client.download_file(args.bucket, 'jars/' + args.emr_version + '/jars.tar.gz', '/tmp/jars.tar.gz')
-        if 'WARNING' in local('md5sum -c /tmp/jars-checksum.chk', capture=True):
+        if 'WARNING' in subprocess.run('md5sum -c /tmp/jars-checksum.chk', capture_output=True, shell=True, check=True).stdout.decode('UTF-8'):
             print("The checksum of jars.tar.gz is mismatched. It could be caused by aws network issue.")
             sys.exit(1)
-    local('tar -zhxvf /tmp/jars.tar.gz -C ' + emr_dir)
+    subprocess.run('tar -zhxvf /tmp/jars.tar.gz -C ' + emr_dir, shell=True, check=True)
 
 
 def yarn(args, yarn_dir):
     print("Downloading yarn configuration...")
     if args.region == 'cn-north-1':
-        s3client = boto3.client('s3', config=Config(signature_version='s3v4'),
+        s3client = boto3.client('s3', config=botoConfig(signature_version='s3v4'),
                                 endpoint_url='https://s3.cn-north-1.amazonaws.com.cn', region_name=args.region)
-        s3resource = boto3.resource('s3', config=Config(signature_version='s3v4'),
+        s3resource = boto3.resource('s3', config=botoConfig(signature_version='s3v4'),
                                     endpoint_url='https://s3.cn-north-1.amazonaws.com.cn', region_name=args.region)
     else:
-        s3client = boto3.client('s3', config=Config(signature_version='s3v4'), region_name=args.region)
-        s3resource = boto3.resource('s3', config=Config(signature_version='s3v4'))
+        s3client = boto3.client('s3', config=botoConfig(signature_version='s3v4'), region_name=args.region)
+        s3resource = boto3.resource('s3', config=botoConfig(signature_version='s3v4'))
     get_files(s3client, s3resource, args.project_name + '/' + args.cluster_name + '/config/', args.bucket, yarn_dir)
-    local('sudo mv ' + yarn_dir + args.project_name + '/' + args.cluster_name + '/config/* ' + yarn_dir)
-    local('sudo rm -rf ' + yarn_dir + args.project_name + '/')
+    subprocess.run('sudo mv ' + yarn_dir + args.project_name + '/' + args.cluster_name + '/config/* ' + yarn_dir, shell=True, check=True)
+    subprocess.run('sudo rm -rf ' + yarn_dir + args.project_name + '/', shell=True, check=True)
 
 
 def get_files(s3client, s3resource, dist, bucket, local):
@@ -1440,7 +1494,7 @@
 
 
 def get_cluster_python_version(region, bucket, user_name, cluster_name):
-    s3_client = boto3.client('s3', config=Config(signature_version='s3v4'), region_name=region)
+    s3_client = boto3.client('s3', config=botoConfig(signature_version='s3v4'), region_name=region)
     s3_client.download_file(bucket, user_name + '/' + cluster_name + '/python_version', '/tmp/python_version')
 
 
@@ -1458,8 +1512,8 @@
 def create_aws_config_files(generate_full_config=False):
     try:
         aws_user_dir = os.environ['AWS_DIR']
-        logging.info(local("rm -rf " + aws_user_dir + " 2>&1", capture=True))
-        logging.info(local("mkdir -p " + aws_user_dir + " 2>&1", capture=True))
+        subprocess.run("rm -rf " + aws_user_dir, shell=True, check=True)
+        subprocess.run("mkdir -p " + aws_user_dir, shell=True, check=True)
 
         with open(aws_user_dir + '/config', 'w') as aws_file:
             aws_file.write("[default]\n")
@@ -1471,9 +1525,8 @@
                 aws_file.write("aws_access_key_id = {}\n".format(os.environ['aws_access_key']))
                 aws_file.write("aws_secret_access_key = {}\n".format(os.environ['aws_secret_access_key']))
 
-        logging.info(local("chmod 600 " + aws_user_dir + "/*" + " 2>&1", capture=True))
-        logging.info(local("chmod 550 " + aws_user_dir + " 2>&1", capture=True))
-
+        subprocess.run("chmod 600 " + aws_user_dir + "/*" + " 2>&1", shell=True, check=True)
+        subprocess.run("chmod 550 " + aws_user_dir + " 2>&1", shell=True, check=True)
         return True
     except Exception as err:
         print('Error: {0}'.format(err))
@@ -1482,90 +1535,87 @@
 
 def installing_python(region, bucket, user_name, cluster_name, application='', pip_mirror='', numpy_version='1.14.3'):
     get_cluster_python_version(region, bucket, user_name, cluster_name)
-    with file('/tmp/python_version') as f:
+    with open('/tmp/python_version') as f:
         python_version = f.read()
     python_version = python_version[0:5]
     if not os.path.exists('/opt/python/python' + python_version):
-        local('wget https://www.python.org/ftp/python/' + python_version +
-              '/Python-' + python_version + '.tgz -O /tmp/Python-' + python_version + '.tgz')
-        local('tar zxvf /tmp/Python-' + python_version + '.tgz -C /tmp/')
-        with lcd('/tmp/Python-' + python_version):
-            local('./configure --prefix=/opt/python/python' + python_version +
-                  ' --with-zlib-dir=/usr/local/lib/ --with-ensurepip=install')
-            local('sudo make altinstall')
-        with lcd('/tmp/'):
-            local('sudo rm -rf Python-' + python_version + '/')
+        subprocess.run('wget https://www.python.org/ftp/python/' + python_version +
+              '/Python-' + python_version + '.tgz -O /tmp/Python-' + python_version + '.tgz', shell=True, check=True)
+        subprocess.run('tar zxvf /tmp/Python-' + python_version + '.tgz -C /tmp/', shell=True, check=True)
+        subprocess.run('cd /tmp/Python-{0}; ./configure --prefix=/opt/python/python{0} --with-zlib-dir=/usr/local/lib/ --with-ensurepip=install'.format(python_version), shell=True, check=True)
+        subprocess.run('cd /tmp/Python-{0}; sudo make altinstall'.format(python_version), shell=True, check=True)
+        subprocess.run('cd /tmp/; sudo rm -rf Python-' + python_version + '/', shell=True, check=True)
         if region == 'cn-north-1':
-            local('sudo -i /opt/python/python{}/bin/python{} -m pip install -U pip=={} --no-cache-dir'.format(
-                python_version, python_version[0:3], os.environ['conf_pip_version']))
-            local('sudo mv /etc/pip.conf /etc/back_pip.conf')
-            local('sudo touch /etc/pip.conf')
-            local('sudo echo "[global]" >> /etc/pip.conf')
-            local('sudo echo "timeout = 600" >> /etc/pip.conf')
-        local('sudo -i virtualenv /opt/python/python' + python_version)
+            subprocess.run('sudo -i /opt/python/python{}/bin/python{} -m pip install -U pip=={} --no-cache-dir'.format(
+                python_version, python_version[0:3], os.environ['conf_pip_version']), shell=True, check=True)
+            subprocess.run('sudo mv /etc/pip.conf /etc/back_pip.conf', shell=True, check=True)
+            subprocess.run('sudo touch /etc/pip.conf', shell=True, check=True)
+            subprocess.run('sudo echo "[global]" >> /etc/pip.conf', shell=True, check=True)
+            subprocess.run('sudo echo "timeout = 600" >> /etc/pip.conf', shell=True, check=True)
+        subprocess.run('sudo -i virtualenv /opt/python/python' + python_version, shell=True, check=True)
         venv_command = '/bin/bash /opt/python/python' + python_version + '/bin/activate'
         pip_command = '/opt/python/python' + python_version + '/bin/pip' + python_version[:3]
         if region == 'cn-north-1':
             try:
-                local(venv_command + ' && sudo -i ' + pip_command +
+                subprocess.run(venv_command + ' && sudo -i ' + pip_command +
                       ' install -i https://{0}/simple --trusted-host {0} --timeout 60000 -U pip==9.0.3 '
-                      '--no-cache-dir'.format(pip_mirror))
-                local(venv_command + ' && sudo -i ' + pip_command + ' install pyzmq==17.0.0')
-                local(venv_command + ' && sudo -i ' + pip_command +
+                      '--no-cache-dir'.format(pip_mirror), shell=True, check=True)
+                subprocess.run(venv_command + ' && sudo -i ' + pip_command + ' install pyzmq==17.0.0', shell=True, check=True)
+                subprocess.run(venv_command + ' && sudo -i ' + pip_command +
                       ' install -i https://{0}/simple --trusted-host {0} --timeout 60000 ipython ipykernel '
-                      '--no-cache-dir'.format(pip_mirror))
-                local(venv_command + ' && sudo -i ' + pip_command + ' install NumPy=={0}'.format(numpy_version))
-                local(venv_command + ' && sudo -i ' + pip_command +
+                      '--no-cache-dir'.format(pip_mirror), shell=True, check=True)
+                subprocess.run(venv_command + ' && sudo -i ' + pip_command + ' install NumPy=={0}'.format(numpy_version), shell=True, check=True)
+                subprocess.run(venv_command + ' && sudo -i ' + pip_command +
                       ' install -i https://{0}/simple --trusted-host {0} --timeout 60000 boto boto3 SciPy '
-                      'Matplotlib==2.0.2 pandas Sympy Pillow sklearn --no-cache-dir'.format(pip_mirror))
+                      'Matplotlib=={1} pandas Sympy Pillow sklearn --no-cache-dir'.format(pip_mirror, os.environ['notebook_matplotlib_version']), shell=True, check=True)
                 # Need to refactor when we add GPU cluster
                 if application == 'deeplearning':
-                    local(venv_command + ' && sudo -i ' + pip_command +
+                    subprocess.run(venv_command + ' && sudo -i ' + pip_command +
                           ' install -i https://{0}/simple --trusted-host {0} --timeout 60000 mxnet-cu80 opencv-python '
-                          'keras Theano --no-cache-dir'.format(pip_mirror))
+                          'keras Theano --no-cache-dir'.format(pip_mirror), shell=True, check=True)
                     python_without_dots = python_version.replace('.', '')
-                    local(venv_command + ' && sudo -i ' + pip_command +
+                    subprocess.run(venv_command + ' && sudo -i ' + pip_command +
                           ' install  https://cntk.ai/PythonWheel/GPU/cntk-2.0rc3-cp{0}-cp{0}m-linux_x86_64.whl '
-                          '--no-cache-dir'.format(python_without_dots[:2]))
-                local('sudo rm /etc/pip.conf')
-                local('sudo mv /etc/back_pip.conf /etc/pip.conf')
+                          '--no-cache-dir'.format(python_without_dots[:2]), shell=True, check=True)
+                subprocess.run('sudo rm /etc/pip.conf', shell=True, check=True)
+                subprocess.run('sudo mv /etc/back_pip.conf /etc/pip.conf', shell=True, check=True)
             except:
-                local('sudo rm /etc/pip.conf')
-                local('sudo mv /etc/back_pip.conf /etc/pip.conf')
-                local('sudo rm -rf /opt/python/python{}/'.format(python_version))
+                subprocess.run('sudo rm /etc/pip.conf', shell=True, check=True)
+                subprocess.run('sudo mv /etc/back_pip.conf /etc/pip.conf', shell=True, check=True)
+                subprocess.run('sudo rm -rf /opt/python/python{}/'.format(python_version), shell=True, check=True)
                 sys.exit(1)
         else:
-            local(venv_command + ' && sudo -i ' + pip_command + ' install -U pip==9.0.3')
-            local(venv_command + ' && sudo -i ' + pip_command + ' install pyzmq==17.0.0')
-            local(venv_command + ' && sudo -i ' + pip_command + ' install ipython ipykernel --no-cache-dir')
-            local(venv_command + ' && sudo -i ' + pip_command + ' install NumPy=={}'.format(numpy_version))
-            local(venv_command + ' && sudo -i ' + pip_command +
-                  ' install boto boto3 SciPy Matplotlib==2.0.2 pandas Sympy Pillow sklearn '
-                  '--no-cache-dir')
+            print(subprocess.run(venv_command + ' && sudo -i ' + pip_command + ' install -U pip==9.0.3', shell=True, check=True))
+            subprocess.run(venv_command + ' && sudo -i ' + pip_command + ' install pyzmq==17.0.0', shell=True, check=True)
+            subprocess.run(venv_command + ' && sudo -i ' + pip_command + ' install ipython ipykernel --no-cache-dir', shell=True, check=True)
+            subprocess.run(venv_command + ' && sudo -i ' + pip_command + ' install NumPy=={}'.format(numpy_version), shell=True, check=True)
+            subprocess.run(venv_command + ' && sudo -i ' + pip_command +
+                  ' install boto boto3 SciPy Matplotlib=={} pandas Sympy Pillow sklearn '
+                  '--no-cache-dir'.format(os.environ['notebook_matplotlib_version']), shell=True, check=True)
             # Need to refactor when we add GPU cluster
             if application == 'deeplearning':
-                local(venv_command + ' && sudo -i ' + pip_command +
-                      ' install mxnet-cu80 opencv-python keras Theano --no-cache-dir')
+                subprocess.run(venv_command + ' && sudo -i ' + pip_command +
+                      ' install mxnet-cu80 opencv-python keras Theano --no-cache-dir', shell=True, check=True)
                 python_without_dots = python_version.replace('.', '')
-                local(venv_command + ' && sudo -i ' + pip_command +
+                subprocess.run(venv_command + ' && sudo -i ' + pip_command +
                       ' install  https://cntk.ai/PythonWheel/GPU/cntk-2.0rc3-cp{0}-cp{0}m-linux_x86_64.whl '
-                      '--no-cache-dir'.format(python_without_dots[:2]))
-        local('sudo rm -rf /usr/bin/python{}-dp'.format(python_version[0:3]))
-        local('sudo ln -fs /opt/python/python{0}/bin/python{1} /usr/bin/python{1}-dp'.format(python_version,
-                                                                                             python_version[0:3]))
+                      '--no-cache-dir'.format(python_without_dots[:2]), shell=True, check=True)
+        subprocess.run('sudo rm -rf /usr/bin/python{}-dp'.format(python_version[0:3]), shell=True, check=True)
+        subprocess.run('sudo ln -fs /opt/python/python{0}/bin/python{1} /usr/bin/python{1}-dp'.format(python_version,
+                                                                                             python_version[0:3]), shell=True, check=True)
 
 
 def spark_defaults(args):
     spark_def_path = '/opt/' + args.emr_version + '/' + args.cluster_name + '/spark/conf/spark-defaults.conf'
     for i in eval(args.excluded_lines):
-        local(""" sudo bash -c " sed -i '/""" + i + """/d' """ + spark_def_path + """ " """)
-    local(""" sudo bash -c " sed -i '/#/d' """ + spark_def_path + """ " """)
-    local(""" sudo bash -c " sed -i '/^\s*$/d' """ + spark_def_path + """ " """)
-    local(""" sudo bash -c "sed -i '/spark.driver.extraClassPath/,/spark.driver.extraLibraryPath/s|"""
-          """/usr|/opt/DATAENGINE-SERVICE_VERSION/jars/usr|g' """ + spark_def_path + """ " """)
-    local(
+        subprocess.run(""" sudo bash -c " sed -i '/""" + i + """/d' """ + spark_def_path + """ " """, shell=True, check=True)
+    subprocess.run(""" sudo bash -c " sed -i '/#/d' """ + spark_def_path + """ " """, shell=True, check=True)
+    subprocess.run(""" sudo bash -c " sed -i '/^\s*$/d' """ + spark_def_path + """ " """, shell=True, check=True)
+    subprocess.run(""" sudo bash -c "sed -i '/spark.driver.extraClassPath/,/spark.driver.extraLibraryPath/s|"""
+          """/usr|/opt/DATAENGINE-SERVICE_VERSION/jars/usr|g' """ + spark_def_path + """ " """, shell=True, check=True)
+    subprocess.run(
         """ sudo bash -c "sed -i '/spark.yarn.dist.files/s/\/etc\/spark\/conf/\/opt\/DATAENGINE-SERVICE_VERSION\/CLUSTER\/conf/g' """
-        + spark_def_path + """ " """)
+        + spark_def_path + """ " """, shell=True, check=True)
     template_file = spark_def_path
     with open(template_file, 'r') as f:
         text = f.read()
@@ -1579,22 +1629,22 @@
         endpoint_url = "https://s3.{}.amazonaws.com.cn".format(args.region)
     else:
         endpoint_url = 'https://s3-' + args.region + '.amazonaws.com'
-    local("""bash -c 'echo "spark.hadoop.fs.s3a.endpoint    """ + endpoint_url + """ " >> """ +
-          spark_def_path + """'""")
-    local('echo "spark.hadoop.fs.s3a.server-side-encryption-algorithm   AES256" >> {}'.format(spark_def_path))
+    subprocess.run("""bash -c 'echo "spark.hadoop.fs.s3a.endpoint    """ + endpoint_url + """ " >> """ +
+          spark_def_path + """'""", shell=True, check=True)
+    subprocess.run('echo "spark.hadoop.fs.s3a.server-side-encryption-algorithm   AES256" >> {}'.format(spark_def_path), shell=True, check=True)
 
 
 def ensure_local_jars(os_user, jars_dir):
-    if not exists('/home/{}/.ensure_dir/local_jars_ensured'.format(os_user)):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/local_jars_ensured'.format(os_user)):
         try:
-            sudo('mkdir -p {0}'.format(jars_dir))
-            sudo('wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/{0}/hadoop-aws-{0}.jar -O \
+            datalab.fab.conn.sudo('mkdir -p {0}'.format(jars_dir))
+            datalab.fab.conn.sudo('wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/{0}/hadoop-aws-{0}.jar -O \
                     {1}hadoop-aws-{0}.jar'.format('2.7.4', jars_dir))
-            sudo('wget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk/{0}/aws-java-sdk-{0}.jar -O \
+            datalab.fab.conn.sudo('wget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk/{0}/aws-java-sdk-{0}.jar -O \
                     {1}aws-java-sdk-{0}.jar'.format('1.7.4', jars_dir))
-            # sudo('wget https://maven.twttr.com/com/hadoop/gplcompression/hadoop-lzo/{0}/hadoop-lzo-{0}.jar -O \
+            # datalab.fab.conn.sudo('wget https://maven.twttr.com/com/hadoop/gplcompression/hadoop-lzo/{0}/hadoop-lzo-{0}.jar -O \
             #         {1}hadoop-lzo-{0}.jar'.format('0.4.20', jars_dir))
-            sudo('touch /home/{}/.ensure_dir/local_jars_ensured'.format(os_user))
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/local_jars_ensured'.format(os_user))
         except:
             sys.exit(1)
 
@@ -1603,37 +1653,41 @@
     try:
         # Checking if spark.jars parameter was generated previously
         spark_jars_paths = None
-        if exists('/opt/spark/conf/spark-defaults.conf'):
+        if exists(datalab.fab.conn, '/opt/spark/conf/spark-defaults.conf'):
             try:
-                spark_jars_paths = sudo('cat /opt/spark/conf/spark-defaults.conf | grep -e "^spark.jars " ')
+                spark_jars_paths = datalab.fab.conn.sudo('cat /opt/spark/conf/spark-defaults.conf | grep -e "^spark.jars " ').stdout
             except:
                 spark_jars_paths = None
-        region = sudo('curl http://169.254.169.254/latest/meta-data/placement/availability-zone')[:-1]
+        region = datalab.fab.conn.sudo('curl http://169.254.169.254/latest/meta-data/placement/availability-zone').stdout[:-1]
         if region == 'us-east-1':
             endpoint_url = 'https://s3.amazonaws.com'
         elif region == 'cn-north-1':
             endpoint_url = "https://s3.{}.amazonaws.com.cn".format(region)
         else:
             endpoint_url = 'https://s3-' + region + '.amazonaws.com'
-        put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/notebook_spark-defaults_local.conf')
-        sudo('echo "spark.hadoop.fs.s3a.endpoint     {}" >> /tmp/notebook_spark-defaults_local.conf'.format(
+        datalab.fab.conn.put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/notebook_spark-defaults_local.conf')
+        datalab.fab.conn.sudo('echo "spark.hadoop.fs.s3a.endpoint     {}" >> /tmp/notebook_spark-defaults_local.conf'.format(
             endpoint_url))
-        sudo('echo "spark.hadoop.fs.s3a.server-side-encryption-algorithm   AES256" >> '
+        datalab.fab.conn.sudo('echo "spark.hadoop.fs.s3a.server-side-encryption-algorithm   AES256" >> '
              '/tmp/notebook_spark-defaults_local.conf')
+        if not exists(datalab.fab.conn,'/opt/spark/conf/spark-env.sh'):
+            datalab.fab.conn.sudo('mv /opt/spark/conf/spark-env.sh.template /opt/spark/conf/spark-env.sh')
+        java_home = datalab.fab.conn.run("update-alternatives --query java | grep -o --color=never \'/.*/java-8.*/jre\'").stdout.splitlines()[0].replace('\n','')
+        datalab.fab.conn.sudo("echo 'export JAVA_HOME=\'{}\'' >> /opt/spark/conf/spark-env.sh".format(java_home))
         if os.environ['application'] == 'zeppelin':
-            sudo('echo \"spark.jars $(ls -1 ' + jars_dir + '* | tr \'\\n\' \',\')\" >> '
+            datalab.fab.conn.sudo('echo \"spark.jars $(ls -1 ' + jars_dir + '* | tr \'\\n\' \',\')\" >> '
                                                            '/tmp/notebook_spark-defaults_local.conf')
-        sudo('\cp -f /tmp/notebook_spark-defaults_local.conf /opt/spark/conf/spark-defaults.conf')
+        datalab.fab.conn.sudo('\cp -f /tmp/notebook_spark-defaults_local.conf /opt/spark/conf/spark-defaults.conf')
         if memory_type == 'driver':
-            spark_memory = dlab.fab.get_spark_memory()
-            sudo('sed -i "/spark.*.memory/d" /opt/spark/conf/spark-defaults.conf')
-            sudo('echo "spark.{0}.memory {1}m" >> /opt/spark/conf/spark-defaults.conf'.format(memory_type,
+            spark_memory = datalab.fab.get_spark_memory()
+            datalab.fab.conn.sudo('sed -i "/spark.*.memory/d" /opt/spark/conf/spark-defaults.conf')
+            datalab.fab.conn.sudo('''bash -c 'echo "spark.{0}.memory {1}m" >> /opt/spark/conf/spark-defaults.conf' '''.format(memory_type,
                                                                                               spark_memory))
         if 'spark_configurations' in os.environ:
-            dlab_header = sudo('cat /tmp/notebook_spark-defaults_local.conf | grep "^#"')
+            datalab_header = datalab.fab.conn.sudo('cat /tmp/notebook_spark-defaults_local.conf | grep "^#"').stdout
             spark_configurations = ast.literal_eval(os.environ['spark_configurations'])
             new_spark_defaults = list()
-            spark_defaults = sudo('cat /opt/spark/conf/spark-defaults.conf')
+            spark_defaults = datalab.fab.conn.sudo('cat /opt/spark/conf/spark-defaults.conf').stdout
             current_spark_properties = spark_defaults.split('\n')
             for param in current_spark_properties:
                 if param.split(' ')[0] != '#':
@@ -1646,13 +1700,13 @@
                                     new_spark_defaults.append(property + ' ' + config['Properties'][property])
                     new_spark_defaults.append(param)
             new_spark_defaults = set(new_spark_defaults)
-            sudo("echo '{}' > /opt/spark/conf/spark-defaults.conf".format(dlab_header))
+            datalab.fab.conn.sudo('''bash -c 'echo "{}" > /opt/spark/conf/spark-defaults.conf' '''.format(datalab_header))
             for prop in new_spark_defaults:
                 prop = prop.rstrip()
-                sudo('echo "{}" >> /opt/spark/conf/spark-defaults.conf'.format(prop))
-            sudo('sed -i "/^\s*$/d" /opt/spark/conf/spark-defaults.conf')
+                datalab.fab.conn.sudo('''bash -c 'echo "{}" >> /opt/spark/conf/spark-defaults.conf' '''.format(prop))
+            datalab.fab.conn.sudo('sed -i "/^\s*$/d" /opt/spark/conf/spark-defaults.conf')
             if spark_jars_paths:
-                sudo('echo "{}" >> /opt/spark/conf/spark-defaults.conf'.format(spark_jars_paths))
+                datalab.fab.conn.sudo('''bash -c 'echo "{}" >> /opt/spark/conf/spark-defaults.conf' '''.format(spark_jars_paths))
     except Exception as err:
         print('Error:', str(err))
         sys.exit(1)
@@ -1665,60 +1719,60 @@
         zeppelin_restarted = False
         default_port = 8998
         get_cluster_python_version(region, bucket, user_name, cluster_name)
-        with file('/tmp/python_version') as f:
+        with open('/tmp/python_version') as f:
             python_version = f.read()
         python_version = python_version[0:5]
         livy_port = ''
         livy_path = '/opt/{0}/{1}/livy/'.format(emr_version, cluster_name)
-        spark_libs = "/opt/{0}/jars/usr/share/aws/aws-java-sdk/aws-java-sdk-core*.jar /opt/{0}/jars/usr/lib/hadoop" \
-                     "/hadoop-aws*.jar /opt/" + \
-                     "{0}/jars/usr/share/aws/aws-java-sdk/aws-java-sdk-s3-*.jar /opt/{0}" + \
-                     "/jars/usr/lib/hadoop-lzo/lib/hadoop-lzo-*.jar".format(emr_version)
+        spark_libs = "/opt/{0}/jars/usr/share/aws/aws-java-sdk/aws-java-sdk-core*.jar " \
+                     "/opt/{0}/jars/usr/lib/hadoop/hadoop-aws*.jar " \
+                     "/opt/{0}/jars/usr/share/aws/aws-java-sdk/aws-java-sdk-s3-*.jar " \
+                     "/opt/{0}/jars/usr/lib/hadoop-lzo/lib/hadoop-lzo-*.jar".format(emr_version)
         # fix due to: Multiple py4j files found under ..../spark/python/lib
         # py4j-0.10.7-src.zip still in folder. Versions may varies.
-        local('rm /opt/{0}/{1}/spark/python/lib/py4j-src.zip'.format(emr_version, cluster_name))
+        subprocess.run('rm /opt/{0}/{1}/spark/python/lib/py4j-src.zip'.format(emr_version, cluster_name), shell=True, check=True)
 
-        local('echo \"Configuring emr path for Zeppelin\"')
-        local('sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/{0}\/{1}\/spark/\" '
-              '/opt/zeppelin/conf/zeppelin-env.sh'.format(emr_version, cluster_name))
-        local('sed -i "s/^export HADOOP_CONF_DIR.*/export HADOOP_CONF_DIR=' + \
-              '\/opt\/{0}\/{1}\/conf/" /opt/{0}/{1}/spark/conf/spark-env.sh'.format(emr_version, cluster_name))
-        local('echo \"spark.jars $(ls {0} | tr \'\\n\' \',\')\" >> /opt/{1}/{2}/spark/conf/spark-defaults.conf'
-              .format(spark_libs, emr_version, cluster_name))
-        local('sed -i "/spark.executorEnv.PYTHONPATH/d" /opt/{0}/{1}/spark/conf/spark-defaults.conf'
-              .format(emr_version, cluster_name))
-        local('sed -i "/spark.yarn.dist.files/d" /opt/{0}/{1}/spark/conf/spark-defaults.conf'
-              .format(emr_version, cluster_name))
-        local('sudo chown {0}:{0} -R /opt/zeppelin/'.format(os_user))
-        local('sudo systemctl daemon-reload')
-        local('sudo service zeppelin-notebook stop')
-        local('sudo service zeppelin-notebook start')
+        subprocess.run('echo \"Configuring emr path for Zeppelin\"', shell=True, check=True)
+        subprocess.run('sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/{0}\/{1}\/spark/\" '
+              '/opt/zeppelin/conf/zeppelin-env.sh'.format(emr_version, cluster_name), shell=True, check=True)
+        subprocess.run('sed -i "s/^export HADOOP_CONF_DIR.*/export HADOOP_CONF_DIR=' + \
+              '\/opt\/{0}\/{1}\/conf/" /opt/{0}/{1}/spark/conf/spark-env.sh'.format(emr_version, cluster_name), shell=True, check=True)
+        subprocess.run('echo \"spark.jars $(ls {0} | tr \'\\n\' \',\')\" >> /opt/{1}/{2}/spark/conf/spark-defaults.conf'
+              .format(spark_libs, emr_version, cluster_name), shell=True, check=True)
+        subprocess.run('sed -i "/spark.executorEnv.PYTHONPATH/d" /opt/{0}/{1}/spark/conf/spark-defaults.conf'
+              .format(emr_version, cluster_name), shell=True, check=True)
+        subprocess.run('sed -i "/spark.yarn.dist.files/d" /opt/{0}/{1}/spark/conf/spark-defaults.conf'
+              .format(emr_version, cluster_name), shell=True, check=True)
+        subprocess.run('sudo chown {0}:{0} -R /opt/zeppelin/'.format(os_user), shell=True, check=True)
+        subprocess.run('sudo systemctl daemon-reload', shell=True, check=True)
+        subprocess.run('sudo service zeppelin-notebook stop', shell=True, check=True)
+        subprocess.run('sudo service zeppelin-notebook start', shell=True, check=True)
         while not zeppelin_restarted:
-            local('sleep 5')
-            result = local('sudo bash -c "nmap -p 8080 localhost | grep closed > /dev/null" ; echo $?', capture=True)
+            subprocess.run('sleep 5', shell=True, check=True)
+            result = subprocess.run('sudo bash -c "nmap -p 8080 localhost | grep closed > /dev/null" ; echo $?', capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
             result = result[:1]
             if result == '1':
                 zeppelin_restarted = True
-        local('sleep 5')
-        local('echo \"Configuring emr spark interpreter for Zeppelin\"')
+        subprocess.run('sleep 5', shell=True, check=True)
+        subprocess.run('echo \"Configuring emr spark interpreter for Zeppelin\"', shell=True, check=True)
         if multiple_emrs == 'true':
             while not port_number_found:
-                port_free = local('sudo bash -c "nmap -p ' + str(default_port) +
-                                  ' localhost | grep closed > /dev/null" ; echo $?', capture=True)
+                port_free = subprocess.run('sudo bash -c "nmap -p ' + str(default_port) +
+                                  ' localhost | grep closed > /dev/null" ; echo $?', capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
                 port_free = port_free[:1]
                 if port_free == '0':
                     livy_port = default_port
                     port_number_found = True
                 else:
                     default_port += 1
-            local('sudo echo "livy.server.port = {0}" >> {1}conf/livy.conf'.format(str(livy_port), livy_path))
-            local('sudo echo "livy.spark.master = yarn" >> {}conf/livy.conf'.format(livy_path))
+            subprocess.run('sudo echo "livy.server.port = {0}" >> {1}conf/livy.conf'.format(str(livy_port), livy_path), shell=True, check=True)
+            subprocess.run('sudo echo "livy.spark.master = yarn" >> {}conf/livy.conf'.format(livy_path), shell=True, check=True)
             if os.path.exists('{}conf/spark-blacklist.conf'.format(livy_path)):
-                local('sudo sed -i "s/^/#/g" {}conf/spark-blacklist.conf'.format(livy_path))
-            local(''' sudo echo "export SPARK_HOME={0}" >> {1}conf/livy-env.sh'''.format(spark_dir, livy_path))
-            local(''' sudo echo "export HADOOP_CONF_DIR={0}" >> {1}conf/livy-env.sh'''.format(yarn_dir, livy_path))
-            local(''' sudo echo "export PYSPARK3_PYTHON=python{0}" >> {1}conf/livy-env.sh'''.format(python_version[0:3],
-                                                                                                    livy_path))
+                subprocess.run('sudo sed -i "s/^/#/g" {}conf/spark-blacklist.conf'.format(livy_path), shell=True, check=True)
+            subprocess.run(''' sudo echo "export SPARK_HOME={0}" >> {1}conf/livy-env.sh'''.format(spark_dir, livy_path), shell=True, check=True)
+            subprocess.run(''' sudo echo "export HADOOP_CONF_DIR={0}" >> {1}conf/livy-env.sh'''.format(yarn_dir, livy_path), shell=True, check=True)
+            subprocess.run(''' sudo echo "export PYSPARK3_PYTHON=python{0}" >> {1}conf/livy-env.sh'''.format(python_version[0:3],
+                                                                                                    livy_path), shell=True, check=True)
             template_file = "/tmp/dataengine-service_interpreter.json"
             fr = open(template_file, 'r+')
             text = fr.read()
@@ -1731,21 +1785,21 @@
             fw.close()
             for _ in range(5):
                 try:
-                    local("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
-                          "@/tmp/dataengine-service_interpreter.json http://localhost:8080/api/interpreter/setting")
+                    subprocess.run("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
+                          "@/tmp/dataengine-service_interpreter.json http://localhost:8080/api/interpreter/setting", shell=True, check=True)
                     break
                 except:
-                    local('sleep 5')
-            local('sudo cp /opt/livy-server-cluster.service /etc/systemd/system/livy-server-{}.service'
-                  .format(str(livy_port)))
-            local("sudo sed -i 's|OS_USER|{0}|' /etc/systemd/system/livy-server-{1}.service"
-                  .format(os_user, str(livy_port)))
-            local("sudo sed -i 's|LIVY_PATH|{0}|' /etc/systemd/system/livy-server-{1}.service"
-                  .format(livy_path, str(livy_port)))
-            local('sudo chmod 644 /etc/systemd/system/livy-server-{}.service'.format(str(livy_port)))
-            local("sudo systemctl daemon-reload")
-            local("sudo systemctl enable livy-server-{}".format(str(livy_port)))
-            local('sudo systemctl start livy-server-{}'.format(str(livy_port)))
+                    subprocess.run('sleep 5', shell=True, check=True)
+            subprocess.run('sudo cp /opt/livy-server-cluster.service /etc/systemd/system/livy-server-{}.service'
+                  .format(str(livy_port)), shell=True, check=True)
+            subprocess.run("sudo sed -i 's|OS_USER|{0}|' /etc/systemd/system/livy-server-{1}.service"
+                  .format(os_user, str(livy_port)), shell=True, check=True)
+            subprocess.run("sudo sed -i 's|LIVY_PATH|{0}|' /etc/systemd/system/livy-server-{1}.service"
+                  .format(livy_path, str(livy_port)), shell=True, check=True)
+            subprocess.run('sudo chmod 644 /etc/systemd/system/livy-server-{}.service'.format(str(livy_port)), shell=True, check=True)
+            subprocess.run("sudo systemctl daemon-reload", shell=True, check=True)
+            subprocess.run("sudo systemctl enable livy-server-{}".format(str(livy_port)), shell=True, check=True)
+            subprocess.run('sudo systemctl start livy-server-{}'.format(str(livy_port)), shell=True, check=True)
         else:
             template_file = "/tmp/dataengine-service_interpreter.json"
             p_versions = ["2", "{}-dp".format(python_version[:3])]
@@ -1764,46 +1818,47 @@
                 fw.close()
                 for _ in range(5):
                     try:
-                        local("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
+                        subprocess.run("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
                               "@/tmp/emr_spark_py" + p_version +
-                              "_interpreter.json http://localhost:8080/api/interpreter/setting")
+                              "_interpreter.json http://localhost:8080/api/interpreter/setting", shell=True, check=True)
                         break
                     except:
-                        local('sleep 5')
-        local('touch /home/' + os_user + '/.ensure_dir/dataengine-service_' + cluster_name + '_interpreter_ensured')
+                        subprocess.run('sleep 5', shell=True, check=True)
+        subprocess.run('touch /home/' + os_user + '/.ensure_dir/dataengine-service_' + cluster_name + '_interpreter_ensured', shell=True, check=True)
     except:
         sys.exit(1)
 
 
 def configure_dataengine_spark(cluster_name, jars_dir, cluster_dir, datalake_enabled, spark_configs=''):
-    local("jar_list=`find {0} -name '*.jar' | tr '\\n' ',' | sed 's/,$//'` ; echo \"spark.jars $jar_list\" >> \
-          /tmp/{1}/notebook_spark-defaults_local.conf".format(jars_dir, cluster_name))
-    region = local('curl http://169.254.169.254/latest/meta-data/placement/availability-zone', capture=True)[:-1]
+    subprocess.run("jar_list=`find {0} -name '*.jar' | tr '\\n' ',' | sed 's/,$//'` ; echo \"spark.jars $jar_list\" >> \
+          /tmp/{1}/notebook_spark-defaults_local.conf".format(jars_dir, cluster_name), shell=True, check=True)
+    region = subprocess.run('curl http://169.254.169.254/latest/meta-data/placement/availability-zone', capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")[:-1]
     if region == 'us-east-1':
         endpoint_url = 'https://s3.amazonaws.com'
     elif region == 'cn-north-1':
         endpoint_url = "https://s3.{}.amazonaws.com.cn".format(region)
     else:
         endpoint_url = 'https://s3-' + region + '.amazonaws.com'
-    local("""bash -c 'echo "spark.hadoop.fs.s3a.endpoint    """ + endpoint_url +
-          """" >> /tmp/{}/notebook_spark-defaults_local.conf'""".format(cluster_name))
-    local('echo "spark.hadoop.fs.s3a.server-side-encryption-algorithm   AES256" >> '
-          '/tmp/{}/notebook_spark-defaults_local.conf'.format(cluster_name))
+    subprocess.run("""bash -c 'echo "spark.hadoop.fs.s3a.endpoint    """ + endpoint_url +
+          """" >> /tmp/{}/notebook_spark-defaults_local.conf'""".format(cluster_name), shell=True, check=True)
+    subprocess.run('echo "spark.hadoop.fs.s3a.server-side-encryption-algorithm   AES256" >> '
+          '/tmp/{}/notebook_spark-defaults_local.conf'.format(cluster_name), shell=True, check=True)
     if os.path.exists('{0}spark/conf/spark-defaults.conf'.format(cluster_dir)):
-        additional_spark_properties = local('diff --changed-group-format="%>" --unchanged-group-format="" '
+        additional_spark_properties = subprocess.run('diff --changed-group-format="%>" --unchanged-group-format="" '
                                             '/tmp/{0}/notebook_spark-defaults_local.conf '
                                             '{1}spark/conf/spark-defaults.conf | grep -v "^#"'.format(
-            cluster_name, cluster_dir), capture=True)
+            cluster_name, cluster_dir), capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
         for property in additional_spark_properties.split('\n'):
-            local('echo "{0}" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(property, cluster_name))
-    local('cp -f /tmp/{0}/notebook_spark-defaults_local.conf  {1}spark/conf/spark-defaults.conf'.format(cluster_name,
-                                                                                                        cluster_dir))
-    if spark_configs:
-        dlab_header = local('cat /tmp/{0}/notebook_spark-defaults_local.conf | grep "^#"'.format(cluster_name),
-                            capture=True)
+            subprocess.run('echo "{0}" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(property, cluster_name), shell=True, check=True)
+    if os.path.exists('{0}'.format(cluster_dir)):
+        subprocess.run('cp -f /tmp/{0}/notebook_spark-defaults_local.conf  {1}spark/conf/spark-defaults.conf'.format(cluster_name,
+                                                                                                        cluster_dir), shell=True, check=True)
+    if spark_configs and os.path.exists('{0}'.format(cluster_dir)):
+        datalab_header = subprocess.run('cat /tmp/{0}/notebook_spark-defaults_local.conf | grep "^#"'.format(cluster_name),
+                               capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
         spark_configurations = ast.literal_eval(spark_configs)
         new_spark_defaults = list()
-        spark_defaults = local('cat {0}spark/conf/spark-defaults.conf'.format(cluster_dir), capture=True)
+        spark_defaults = subprocess.run('cat {0}spark/conf/spark-defaults.conf'.format(cluster_dir), capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
         current_spark_properties = spark_defaults.split('\n')
         for param in current_spark_properties:
             if param.split(' ')[0] != '#':
@@ -1816,38 +1871,36 @@
                                 new_spark_defaults.append(property + ' ' + config['Properties'][property])
                 new_spark_defaults.append(param)
         new_spark_defaults = set(new_spark_defaults)
-        local("echo '{0}' > {1}/spark/conf/spark-defaults.conf".format(dlab_header, cluster_dir))
+        subprocess.run("echo '{0}' > {1}/spark/conf/spark-defaults.conf".format(datalab_header, cluster_dir), shell=True, check=True)
         for prop in new_spark_defaults:
             prop = prop.rstrip()
-            local('echo "{0}" >> {1}/spark/conf/spark-defaults.conf'.format(prop, cluster_dir))
-        local('sed -i "/^\s*$/d" {0}/spark/conf/spark-defaults.conf'.format(cluster_dir))
+            subprocess.run('echo "{0}" >> {1}/spark/conf/spark-defaults.conf'.format(prop, cluster_dir), shell=True, check=True)
+        subprocess.run('sed -i "/^\s*$/d" {0}/spark/conf/spark-defaults.conf'.format(cluster_dir), shell=True, check=True)
 
 
 def remove_dataengine_kernels(tag_name, notebook_name, os_user, key_path, cluster_name):
     try:
-        private = meta_lib.get_instance_private_ip_address(tag_name, notebook_name)
-        env.hosts = "{}".format(private)
-        env.user = "{}".format(os_user)
-        env.key_filename = "{}".format(key_path)
-        env.host_string = env.user + "@" + env.hosts
-        sudo('rm -rf /home/{}/.local/share/jupyter/kernels/*_{}'.format(os_user, cluster_name))
-        if exists('/home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name)):
+        private = datalab.meta_lib.get_instance_private_ip_address(tag_name, notebook_name)
+        global con
+        con = datalab.fab.init_datalab_connection(private, os_user, key_path)
+        con.sudo('rm -rf /home/{}/.local/share/jupyter/kernels/*_{}'.format(os_user, cluster_name))
+        if exists(con, '/home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name)):
             if os.environ['notebook_multiple_clusters'] == 'true':
                 try:
-                    livy_port = sudo("cat /opt/" + cluster_name +
-                                     "/livy/conf/livy.conf | grep livy.server.port | tail -n 1 | awk '{printf $3}'")
-                    process_number = sudo("netstat -natp 2>/dev/null | grep ':" + livy_port +
-                                          "' | awk '{print $7}' | sed 's|/.*||g'")
-                    sudo('kill -9 ' + process_number)
-                    sudo('systemctl disable livy-server-' + livy_port)
+                    livy_port = con.sudo("cat /opt/" + cluster_name +
+                                     "/livy/conf/livy.conf | grep livy.server.port | tail -n 1 | awk '{printf $3}'").stdout.replace('\n','')
+                    process_number = con.sudo("netstat -natp 2>/dev/null | grep ':" + livy_port +
+                                          "' | awk '{print $7}' | sed 's|/.*||g'").stdout.replace('\n','')
+                    con.sudo('kill -9 ' + process_number)
+                    con.sudo('systemctl disable livy-server-' + livy_port)
                 except:
                     print("Wasn't able to find Livy server for this EMR!")
-            sudo(
+            con.sudo(
                 'sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/spark/\" /opt/zeppelin/conf/zeppelin-env.sh')
-            sudo("rm -rf /home/{}/.ensure_dir/dataengine_interpreter_ensure".format(os_user))
+            con.sudo("rm -rf /home/{}/.ensure_dir/dataengine_interpreter_ensure".format(os_user))
             zeppelin_url = 'http://' + private + ':8080/api/interpreter/setting/'
-            opener = urllib2.build_opener(urllib2.ProxyHandler({}))
-            req = opener.open(urllib2.Request(zeppelin_url))
+            opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
+            req = opener.open(urllib.request.Request(zeppelin_url))
             r_text = req.read()
             interpreter_json = json.loads(r_text)
             interpreter_prefix = cluster_name
@@ -1855,27 +1908,28 @@
                 if interpreter_prefix in interpreter['name']:
                     print("Interpreter with ID: {} and name: {} will be removed from zeppelin!".format(
                         interpreter['id'], interpreter['name']))
-                    request = urllib2.Request(zeppelin_url + interpreter['id'], data='')
+                    request = urllib.request.Request(zeppelin_url + interpreter['id'], data=''.encode())
                     request.get_method = lambda: 'DELETE'
                     url = opener.open(request)
                     print(url.read())
-            sudo('chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin/')
-            sudo('systemctl daemon-reload')
-            sudo("service zeppelin-notebook stop")
-            sudo("service zeppelin-notebook start")
+            con.sudo('chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin/')
+            con.sudo('systemctl daemon-reload')
+            con.sudo("service zeppelin-notebook stop")
+            con.sudo("service zeppelin-notebook start")
             zeppelin_restarted = False
             while not zeppelin_restarted:
-                sudo('sleep 5')
-                result = sudo('nmap -p 8080 localhost | grep "closed" > /dev/null; echo $?')
+                con.sudo('sleep 5')
+                result = con.sudo('nmap -p 8080 localhost | grep "closed" > /dev/null; echo $?').stdout
                 result = result[:1]
                 if result == '1':
                     zeppelin_restarted = True
-            sudo('sleep 5')
-            sudo('rm -rf /home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name))
-        if exists('/home/{}/.ensure_dir/rstudio_dataengine_ensured'.format(os_user)):
-            dlab.fab.remove_rstudio_dataengines_kernel(os.environ['computational_name'], os_user)
-        sudo('rm -rf  /opt/' + cluster_name + '/')
-        print("Notebook's {} kernels were removed".format(env.hosts))
+            con.sudo('sleep 5')
+            con.sudo('rm -rf /home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name))
+        if exists(con, '/home/{}/.ensure_dir/rstudio_dataengine_ensured'.format(os_user)):
+            datalab.fab.remove_rstudio_dataengines_kernel(os.environ['computational_name'], os_user)
+        con.sudo('rm -rf  /opt/' + cluster_name + '/')
+        print("Notebook's {} kernels were removed".format(private))
+        con.close()
     except Exception as err:
         logging.info("Unable to remove kernels on Notebook: " + str(err) + "\n Traceback: " + traceback.print_exc(
             file=sys.stdout))
@@ -1885,26 +1939,26 @@
 
 
 def prepare_disk(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/disk_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/disk_ensured'):
         try:
-            disk_name = sudo("lsblk | grep disk | awk '{print $1}' | sort | tail -n 1")
-            sudo('''bash -c 'echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/{}' '''.format(disk_name))
-            sudo('mkfs.ext4 -F /dev/{}1'.format(disk_name))
-            sudo('mount /dev/{}1 /opt/'.format(disk_name))
-            sudo(''' bash -c "echo '/dev/{}1 /opt/ ext4 errors=remount-ro 0 1' >> /etc/fstab" '''.format(disk_name))
-            sudo('touch /home/' + os_user + '/.ensure_dir/disk_ensured')
+            disk_name = datalab.fab.conn.sudo("lsblk | grep disk | awk '{print $1}' | sort | tail -n 1").stdout.replace('\n','')
+            datalab.fab.conn.sudo('''bash -c 'echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/{}' '''.format(disk_name))
+            datalab.fab.conn.sudo('mkfs.ext4 -F /dev/{}1'.format(disk_name))
+            datalab.fab.conn.sudo('mount /dev/{}1 /opt/'.format(disk_name))
+            datalab.fab.conn.sudo(''' bash -c "echo '/dev/{}1 /opt/ ext4 errors=remount-ro 0 1' >> /etc/fstab" '''.format(disk_name))
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/disk_ensured')
         except:
             sys.exit(1)
 
 
 def ensure_local_spark(os_user, spark_link, spark_version, hadoop_version, local_spark_path):
-    if not exists('/home/' + os_user + '/.ensure_dir/local_spark_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/local_spark_ensured'):
         try:
-            sudo('wget ' + spark_link + ' -O /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz')
-            sudo('tar -zxvf /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz -C /opt/')
-            sudo('mv /opt/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' + local_spark_path)
-            sudo('chown -R ' + os_user + ':' + os_user + ' ' + local_spark_path)
-            sudo('touch /home/' + os_user + '/.ensure_dir/local_spark_ensured')
+            datalab.fab.conn.sudo('wget ' + spark_link + ' -O /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz')
+            datalab.fab.conn.sudo('tar -zxvf /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz -C /opt/')
+            datalab.fab.conn.sudo('mv /opt/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' + local_spark_path)
+            datalab.fab.conn.sudo('chown -R ' + os_user + ':' + os_user + ' ' + local_spark_path)
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/local_spark_ensured')
         except Exception as err:
             print('Error:', str(err))
             sys.exit(1)
@@ -1912,13 +1966,13 @@
 
 def install_dataengine_spark(cluster_name, spark_link, spark_version, hadoop_version, cluster_dir, os_user,
                              datalake_enabled):
-    local('wget ' + spark_link + ' -O /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' +
-          hadoop_version + '.tgz')
-    local('tar -zxvf /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version +
-          '.tgz -C /opt/' + cluster_name)
-    local('mv /opt/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' +
-          cluster_dir + 'spark/')
-    local('chown -R ' + os_user + ':' + os_user + ' ' + cluster_dir + 'spark/')
+    subprocess.run('wget ' + spark_link + ' -O /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' +
+          hadoop_version + '.tgz', shell=True, check=True)
+    subprocess.run('tar -zxvf /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version +
+          '.tgz -C /opt/' + cluster_name, shell=True, check=True)
+    subprocess.run('mv /opt/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' +
+          cluster_dir + 'spark/', shell=True, check=True)
+    subprocess.run('chown -R ' + os_user + ':' + os_user + ' ' + cluster_dir + 'spark/', shell=True, check=True)
 
 
 def find_des_jars(all_jars, des_path):
@@ -1931,7 +1985,7 @@
                     all_jars.remove(j)
         additional_jars = ['hadoop-aws', 'aws-java-sdk-s3', 'hadoop-lzo', 'aws-java-sdk-core']
         aws_filter = '\|'.join(additional_jars)
-        aws_jars = sudo('find {0} -name *.jar | grep "{1}"'.format(des_path, aws_filter)).split('\r\n')
+        aws_jars = datalab.fab.conn.sudo('find {0} -name *.jar | grep "{1}"'.format(des_path, aws_filter)).stdout.split('\r\n')
         all_jars.extend(aws_jars)
         return all_jars
     except Exception as err:
diff --git a/infrastructure-provisioning/src/general/lib/aws/meta_lib.py b/infrastructure-provisioning/src/general/lib/aws/meta_lib.py
index c852ffc..33d95ec 100644
--- a/infrastructure-provisioning/src/general/lib/aws/meta_lib.py
+++ b/infrastructure-provisioning/src/general/lib/aws/meta_lib.py
@@ -19,18 +19,17 @@
 #
 # ******************************************************************************
 
-import boto3
-from botocore.client import Config
-import json, urllib2
-import time
-import logging
-import traceback
-import sys
+import datalab.actions_lib
 import backoff
-import random
-import string
-from dlab.fab import *
-import actions_lib
+import boto3
+import json
+import logging
+import sys
+import time
+import traceback
+import subprocess
+from botocore.client import Config as botoConfig
+from datalab.fab import *
 
 
 def get_instance_hostname(tag_name, instance_name):
@@ -97,7 +96,7 @@
 
 def get_bucket_by_name(bucket_name):
     try:
-        s3 = boto3.resource('s3', config=Config(signature_version='s3v4'))
+        s3 = boto3.resource('s3', config=botoConfig(signature_version='s3v4'))
         for bucket in s3.buckets.all():
             if bucket.name == bucket_name:
                 return bucket.name
@@ -150,7 +149,7 @@
 
 def get_instance_private_ip_address(tag_name, instance_name):
     try:
-        actions_lib.create_aws_config_files()
+        datalab.actions_lib.create_aws_config_files()
         return get_instance_ip_address(tag_name, instance_name).get('Private')
     except Exception as err:
         logging.error("Error with getting private ip address by name: " + str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout))
@@ -636,7 +635,6 @@
         append_result(str({"error": "Unable to find AMI", "error_message": str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout)}))
         traceback.print_exc(file=sys.stdout)
 
-
 def get_iam_profile(profile_name, count=0):
     client = boto3.client('iam')
     iam_profile = ''
@@ -679,8 +677,7 @@
 
 def emr_waiter(tag_name, tag_value):
     if len(get_emr_list(tag_value, 'Value', False, True)) > 0 or os.path.exists('/response/.emr_creating_' + os.environ['exploratory_name']) or get_not_configured_emr(tag_name, tag_value):
-        with hide('stderr', 'running', 'warnings'):
-            local("echo 'Some EMR cluster is still being created/terminated, waiting..'")
+        subprocess.run("echo 'Some EMR cluster is still being created/terminated, waiting..'", shell=True, check=True)
         time.sleep(60)
         emr_waiter(tag_name, tag_value)
     else:
@@ -798,7 +795,7 @@
         # Price API require full name of region, for example: eu-west-1 -> 'EU (Ireland)'
         # endpoints will be loaded from: botocore/botocore/data/endpoints.json
         data = client._loader._cache.get(('load_data', 'endpoints'))
-        standard_partition = filter(lambda x: 'AWS Standard' == x['partitionName'], data['partitions'])[0]
+        standard_partition = next(filter(lambda x: 'AWS Standard' == x['partitionName'], data['partitions']))
         region_description = standard_partition['regions'][region]['description']
 
         response = client.get_products(
diff --git a/infrastructure-provisioning/src/general/lib/azure/actions_lib.py b/infrastructure-provisioning/src/general/lib/azure/actions_lib.py
index 8cac3c4..f5924d2 100644
--- a/infrastructure-provisioning/src/general/lib/azure/actions_lib.py
+++ b/infrastructure-provisioning/src/general/lib/azure/actions_lib.py
@@ -19,31 +19,33 @@
 #
 # ******************************************************************************
 
-from azure.common.client_factory import get_client_from_auth_file
+import ast
 import azure.common
+import backoff
+import datalab.common_lib
+import datalab.fab
+import datalab.meta_lib
+import json
+import logging
+import os
+import sys
+import time
+import traceback
+import urllib3
+import urllib.request
+import subprocess
+from azure.common.client_factory import get_client_from_auth_file
+from azure.datalake.store import core, lib
 from azure.mgmt.authorization import AuthorizationManagementClient
 from azure.mgmt.compute import ComputeManagementClient
-from azure.mgmt.resource import ResourceManagementClient
+from azure.mgmt.datalake.store import DataLakeStoreAccountManagementClient
 from azure.mgmt.network import NetworkManagementClient
+from azure.mgmt.resource import ResourceManagementClient
 from azure.mgmt.storage import StorageManagementClient
 from azure.storage.blob import BlockBlobService
-from azure.mgmt.datalake.store import DataLakeStoreAccountManagementClient
-from azure.datalake.store import core, lib
-from azure.graphrbac import GraphRbacManagementClient
-from azure.common.credentials import ServicePrincipalCredentials
-import azure.common.exceptions as AzureExceptions
-from fabric.api import *
-from fabric.contrib.files import exists
-import backoff
-import urllib2
-import meta_lib
-import logging
-import traceback
-import sys, time
-import os, json
-import dlab.fab
-import dlab.common_lib
-import ast
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 
 class AzureActions:
@@ -54,7 +56,7 @@
         self.network_client = get_client_from_auth_file(NetworkManagementClient)
         self.storage_client = get_client_from_auth_file(StorageManagementClient)
         self.datalake_client = get_client_from_auth_file(DataLakeStoreAccountManagementClient)
-        self.authorization_client = get_client_from_auth_file(AuthorizationManagementClient)
+        #self.authorization_client = get_client_from_auth_file(AuthorizationManagementClient)
         self.sp_creds = json.loads(open(os.environ['AZURE_AUTH_LOCATION']).read())
         self.dl_filesystem_creds = lib.auth(tenant_id=json.dumps(self.sp_creds['tenantId']).replace('"', ''),
                                             client_secret=json.dumps(self.sp_creds['clientSecret']).replace('"', ''),
@@ -200,16 +202,18 @@
                                    file=sys.stdout)}))
             traceback.print_exc(file=sys.stdout)
 
-    def create_security_group(self, resource_group_name, network_security_group_name, region, tags, list_rules):
+    def create_security_group(self, resource_group_name, network_security_group_name, region, tags, list_rules, preexisting_sg = False):
         try:
-            result = self.network_client.network_security_groups.create_or_update(
-                resource_group_name,
-                network_security_group_name,
-                {
-                    'location': region,
-                    'tags': tags,
-                }
-            ).wait()
+            result = ''
+            if not preexisting_sg:
+                result = self.network_client.network_security_groups.create_or_update(
+                    resource_group_name,
+                    network_security_group_name,
+                    {
+                        'location': region,
+                        'tags': tags,
+                    }
+                ).wait()
             for rule in list_rules:
                 self.network_client.security_rules.create_or_update(
                     resource_group_name,
@@ -217,7 +221,8 @@
                     security_rule_name=rule['name'],
                     security_rule_parameters=rule
                 ).wait()
-            return result
+            if result:
+                return result
         except Exception as err:
             logging.info(
                 "Unable to create security group: " + str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout))
@@ -226,6 +231,21 @@
                                    file=sys.stdout)}))
             traceback.print_exc(file=sys.stdout)
 
+    def remove_security_rules(self, network_security_group, resource_group, security_rule):
+        try:
+            result = self.network_client.security_rules.delete(
+                network_security_group_name = network_security_group,
+                resource_group_name = resource_group,
+                security_rule_name = security_rule).wait()
+            return result
+        except Exception as err:
+            logging.info(
+                "Unable to remove security rule: " + str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout))
+            append_result(str({"error": "Unable to remove security rule",
+                               "error_message": str(err) + "\n Traceback: " + traceback.print_exc(
+                                   file=sys.stdout)}))
+            traceback.print_exc(file=sys.stdout)
+
     def remove_security_group(self, resource_group_name, network_security_group_name):
         try:
             result = self.network_client.network_security_groups.delete(
@@ -410,7 +430,7 @@
 
     def create_blob_container(self, resource_group_name, account_name, container_name):
         try:
-            secret_key = meta_lib.AzureMeta().list_storage_keys(resource_group_name, account_name)[0]
+            secret_key = datalab.meta_lib.AzureMeta().list_storage_keys(resource_group_name, account_name)[0]
             block_blob_service = BlockBlobService(account_name=account_name, account_key=secret_key)
             result = block_blob_service.create_container(container_name)
             return result
@@ -424,7 +444,7 @@
 
     def upload_to_container(self, resource_group_name, account_name, container_name, files):
         try:
-            secret_key = meta_lib.AzureMeta().list_storage_keys(resource_group_name, account_name)[0]
+            secret_key = datalab.meta_lib.AzureMeta().list_storage_keys(resource_group_name, account_name)[0]
             block_blob_service = BlockBlobService(account_name=account_name, account_key=secret_key)
             for filename in files:
                 block_blob_service.create_blob_from_path(container_name, filename, filename)
@@ -439,7 +459,7 @@
 
     def download_from_container(self, resource_group_name, account_name, container_name, files):
         try:
-            secret_key = meta_lib.AzureMeta().list_storage_keys(resource_group_name, account_name)[0]
+            secret_key = datalab.meta_lib.AzureMeta().list_storage_keys(resource_group_name, account_name)[0]
             block_blob_service = BlockBlobService(account_name=account_name, account_key=secret_key)
             for filename in files:
                 block_blob_service.get_blob_to_path(container_name, filename, filename)
@@ -469,7 +489,7 @@
                     }
                 }
             ).wait()
-            return meta_lib.AzureMeta().get_static_ip(resource_group_name, ip_name).ip_address
+            return datalab.meta_lib.AzureMeta().get_static_ip(resource_group_name, ip_name).ip_address
         except Exception as err:
             logging.info(
                 "Unable to create static IP address: " + str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout))
@@ -493,14 +513,15 @@
                                    file=sys.stdout)}))
             traceback.print_exc(file=sys.stdout)
 
-    def create_instance(self, region, instance_size, service_base_name, instance_name, dlab_ssh_user_name, public_key,
+    def create_instance(self, region, instance_size, service_base_name, instance_name, datalab_ssh_user_name,
+                        public_key,
                         network_interface_resource_id, resource_group_name, primary_disk_size, instance_type,
                         image_full_name, tags, project_name='', create_option='fromImage', disk_id='',
                         instance_storage_account_type='Premium_LRS', image_type='default'):
         if image_type == 'pre-configured':
-            image_id = meta_lib.AzureMeta().get_image(resource_group_name, image_full_name).id
+            image_id = datalab.meta_lib.AzureMeta().get_image(resource_group_name, image_full_name).id
         else:
-            image_name = image_full_name.split('_')
+            image_name = image_full_name.split(':')
             publisher = image_name[0]
             offer = image_name[1]
             sku = image_name[2]
@@ -532,12 +553,12 @@
                     },
                     'os_profile': {
                         'computer_name': instance_name.replace('_', '-'),
-                        'admin_username': dlab_ssh_user_name,
+                        'admin_username': datalab_ssh_user_name,
                         'linux_configuration': {
                             'disable_password_authentication': True,
                             'ssh': {
                                 'public_keys': [{
-                                    'path': '/home/{}/.ssh/authorized_keys'.format(dlab_ssh_user_name),
+                                    'path': '/home/{}/.ssh/authorized_keys'.format(datalab_ssh_user_name),
                                     'key_data': public_key
                                 }]
                             }
@@ -580,12 +601,12 @@
                         },
                         'os_profile': {
                             'computer_name': instance_name.replace('_', '-'),
-                            'admin_username': dlab_ssh_user_name,
+                            'admin_username': datalab_ssh_user_name,
                             'linux_configuration': {
                                 'disable_password_authentication': True,
                                 'ssh': {
                                     'public_keys': [{
-                                        'path': '/home/{}/.ssh/authorized_keys'.format(dlab_ssh_user_name),
+                                        'path': '/home/{}/.ssh/authorized_keys'.format(datalab_ssh_user_name),
                                         'key_data': public_key
                                     }]
                                 }
@@ -687,12 +708,12 @@
                     'storage_profile': storage_profile,
                     'os_profile': {
                         'computer_name': instance_name.replace('_', '-'),
-                        'admin_username': dlab_ssh_user_name,
+                        'admin_username': datalab_ssh_user_name,
                         'linux_configuration': {
                             'disable_password_authentication': True,
                             'ssh': {
                                 'public_keys': [{
-                                    'path': '/home/{}/.ssh/authorized_keys'.format(dlab_ssh_user_name),
+                                    'path': '/home/{}/.ssh/authorized_keys'.format(datalab_ssh_user_name),
                                     'key_data': public_key
                                 }]
                             }
@@ -751,12 +772,12 @@
                     'storage_profile': storage_profile,
                     'os_profile': {
                         'computer_name': instance_name.replace('_', '-'),
-                        'admin_username': dlab_ssh_user_name,
+                        'admin_username': datalab_ssh_user_name,
                         'linux_configuration': {
                             'disable_password_authentication': True,
                             'ssh': {
                                 'public_keys': [{
-                                    'path': '/home/{}/.ssh/authorized_keys'.format(dlab_ssh_user_name),
+                                    'path': '/home/{}/.ssh/authorized_keys'.format(datalab_ssh_user_name),
                                     'key_data': public_key
                                 }]
                             }
@@ -787,7 +808,7 @@
 
     def tag_disks(self, resource_group_name, instance_name):
         postfix_list = ['-volume-primary', '-volume-secondary', '-volume-tertiary']
-        disk_list = meta_lib.AzureMeta().get_vm_disks(resource_group_name, instance_name)
+        disk_list = datalab.meta_lib.AzureMeta().get_vm_disks(resource_group_name, instance_name)
         for inx, disk in enumerate(disk_list):
             tags_copy = disk.tags.copy()
             tags_copy['Name'] = tags_copy['Name'] + postfix_list[inx]
@@ -848,7 +869,7 @@
                 print("Disk {} has been removed".format(i))
             # Removing public static IP address and network interfaces
             network_interface_name = instance_name + '-nif'
-            for j in meta_lib.AzureMeta().get_network_interface(resource_group_name,
+            for j in datalab.meta_lib.AzureMeta().get_network_interface(resource_group_name,
                                                                 network_interface_name).ip_configurations:
                 self.delete_network_if(resource_group_name, network_interface_name)
                 print("Network interface {} has been removed".format(network_interface_name))
@@ -883,10 +904,10 @@
     def create_network_if(self, resource_group_name, vpc_name, subnet_name, interface_name, region, security_group_name,
                           tags, public_ip_name="None"):
         try:
-            subnet_cidr = meta_lib.AzureMeta().get_subnet(resource_group_name, vpc_name, subnet_name).address_prefix.split('/')[0]
-            private_ip = meta_lib.AzureMeta().check_free_ip(resource_group_name, vpc_name, subnet_cidr)
-            subnet_id = meta_lib.AzureMeta().get_subnet(resource_group_name, vpc_name, subnet_name).id
-            security_group_id = meta_lib.AzureMeta().get_security_group(resource_group_name, security_group_name).id
+            subnet_cidr = datalab.meta_lib.AzureMeta().get_subnet(resource_group_name, vpc_name, subnet_name).address_prefix.split('/')[0]
+            private_ip = datalab.meta_lib.AzureMeta().check_free_ip(resource_group_name, vpc_name, subnet_cidr)
+            subnet_id = datalab.meta_lib.AzureMeta().get_subnet(resource_group_name, vpc_name, subnet_name).id
+            security_group_id = datalab.meta_lib.AzureMeta().get_security_group(resource_group_name, security_group_name).id
             if public_ip_name == "None":
                 ip_params = [{
                     "name": interface_name,
@@ -898,7 +919,7 @@
                     }
                 }]
             else:
-                public_ip_id = meta_lib.AzureMeta().get_static_ip(resource_group_name, public_ip_name).id
+                public_ip_id = datalab.meta_lib.AzureMeta().get_static_ip(resource_group_name, public_ip_name).id
                 ip_params = [{
                     "name": interface_name,
                     "private_ip_allocation_method": "Static",
@@ -923,7 +944,7 @@
                     "ip_configurations": ip_params
                 }
             ).wait()
-            network_interface_id = meta_lib.AzureMeta().get_network_interface(
+            network_interface_id = datalab.meta_lib.AzureMeta().get_network_interface(
                 resource_group_name,
                 interface_name
             ).id
@@ -950,29 +971,27 @@
 
     def remove_dataengine_kernels(self, resource_group_name, notebook_name, os_user, key_path, cluster_name):
         try:
-            private = meta_lib.AzureMeta().get_private_ip_address(resource_group_name, notebook_name)
-            env.hosts = "{}".format(private)
-            env.user = "{}".format(os_user)
-            env.key_filename = "{}".format(key_path)
-            env.host_string = env.user + "@" + env.hosts
-            sudo('rm -rf /home/{}/.local/share/jupyter/kernels/*_{}'.format(os_user, cluster_name))
-            if exists('/home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name)):
+            private = datalab.meta_lib.AzureMeta().get_private_ip_address(resource_group_name, notebook_name)
+            global conn
+            conn = datalab.fab.init_datalab_connection(private, os_user, key_path)
+            conn.sudo('rm -rf /home/{}/.local/share/jupyter/kernels/*_{}'.format(os_user, cluster_name))
+            if exists(conn, '/home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name)):
                 if os.environ['notebook_multiple_clusters'] == 'true':
                     try:
-                        livy_port = sudo("cat /opt/" + cluster_name +
-                                         "/livy/conf/livy.conf | grep livy.server.port | tail -n 1 | awk '{printf $3}'")
-                        process_number = sudo("netstat -natp 2>/dev/null | grep ':" + livy_port +
-                                              "' | awk '{print $7}' | sed 's|/.*||g'")
-                        sudo('kill -9 ' + process_number)
-                        sudo('systemctl disable livy-server-' + livy_port)
+                        livy_port = conn.sudo("cat /opt/" + cluster_name +
+                                         "/livy/conf/livy.conf | grep livy.server.port | tail -n 1 | awk '{printf $3}'").stdout.replace('\n','')
+                        process_number = conn.sudo("netstat -natp 2>/dev/null | grep ':" + livy_port +
+                                              "' | awk '{print $7}' | sed 's|/.*||g'").stdout.replace('\n','')
+                        conn.sudo('kill -9 ' + process_number)
+                        conn.sudo('systemctl disable livy-server-' + livy_port)
                     except:
                         print("Wasn't able to find Livy server for this dataengine!")
-                sudo(
+                conn.sudo(
                     'sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/spark/\" /opt/zeppelin/conf/zeppelin-env.sh')
-                sudo("rm -rf /home/{}/.ensure_dir/dataengine_interpreter_ensure".format(os_user))
+                conn.sudo("rm -rf /home/{}/.ensure_dir/dataengine_interpreter_ensure".format(os_user))
                 zeppelin_url = 'http://' + private + ':8080/api/interpreter/setting/'
-                opener = urllib2.build_opener(urllib2.ProxyHandler({}))
-                req = opener.open(urllib2.Request(zeppelin_url))
+                opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
+                req = opener.open(urllib.request.Request(zeppelin_url))
                 r_text = req.read()
                 interpreter_json = json.loads(r_text)
                 interpreter_prefix = cluster_name
@@ -980,27 +999,27 @@
                     if interpreter_prefix in interpreter['name']:
                         print("Interpreter with ID: {0} and name: {1} will be removed from zeppelin!".
                               format(interpreter['id'], interpreter['name']))
-                        request = urllib2.Request(zeppelin_url + interpreter['id'], data='')
+                        request = urllib.request.Request(zeppelin_url + interpreter['id'], data=''.encode())
                         request.get_method = lambda: 'DELETE'
                         url = opener.open(request)
                         print(url.read())
-                sudo('chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin/')
-                sudo('systemctl daemon-reload')
-                sudo("service zeppelin-notebook stop")
-                sudo("service zeppelin-notebook start")
+                conn.sudo('chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin/')
+                conn.sudo('systemctl daemon-reload')
+                conn.sudo("service zeppelin-notebook stop")
+                conn.sudo("service zeppelin-notebook start")
                 zeppelin_restarted = False
                 while not zeppelin_restarted:
-                    sudo('sleep 5')
-                    result = sudo('nmap -p 8080 localhost | grep "closed" > /dev/null; echo $?')
+                    conn.sudo('sleep 5')
+                    result = conn.sudo('nmap -p 8080 localhost | grep "closed" > /dev/null; echo $?').stdout
                     result = result[:1]
                     if result == '1':
                         zeppelin_restarted = True
-                sudo('sleep 5')
-                sudo('rm -rf /home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name))
-            if exists('/home/{}/.ensure_dir/rstudio_dataengine_ensured'.format(os_user)):
-                dlab.fab.remove_rstudio_dataengines_kernel(os.environ['computational_name'], os_user)
-            sudo('rm -rf  /opt/' + cluster_name + '/')
-            print("Notebook's {} kernels were removed".format(env.hosts))
+                conn.sudo('sleep 5')
+                conn.sudo('rm -rf /home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name))
+            if exists(conn, '/home/{}/.ensure_dir/rstudio_dataengine_ensured'.format(os_user)):
+                datalab.fab.remove_rstudio_dataengines_kernel(os.environ['computational_name'], os_user)
+            conn.sudo('rm -rf  /opt/' + cluster_name + '/')
+            print("Notebook's {} kernels were removed".format(private))
         except Exception as err:
             logging.info("Unable to remove kernels on Notebook: " + str(err) + "\n Traceback: " + traceback.print_exc(
                 file=sys.stdout))
@@ -1010,10 +1029,10 @@
 
     def create_image_from_instance(self, resource_group_name, instance_name, region, image_name, tags):
         try:
-            instance_id = meta_lib.AzureMeta().get_instance(resource_group_name, instance_name).id
+            instance_id = datalab.meta_lib.AzureMeta().get_instance(resource_group_name, instance_name).id
             self.compute_client.virtual_machines.deallocate(resource_group_name, instance_name).wait()
             self.compute_client.virtual_machines.generalize(resource_group_name, instance_name)
-            if not meta_lib.AzureMeta().get_image(resource_group_name, image_name):
+            if not datalab.meta_lib.AzureMeta().get_image(resource_group_name, image_name):
                 self.compute_client.images.create_or_update(resource_group_name, image_name, parameters={
                     "location": region,
                     "tags": json.loads(tags),
@@ -1043,29 +1062,29 @@
 
 
 def ensure_local_jars(os_user, jars_dir):
-    if not exists('/home/{}/.ensure_dir/local_jars_ensured'.format(os_user)):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/local_jars_ensured'.format(os_user)):
         try:
-            hadoop_version = sudo("ls /opt/spark/jars/hadoop-common* | sed -n 's/.*\([0-9]\.[0-9]\.[0-9]\).*/\\1/p'")
+            hadoop_version = datalab.fab.conn.sudo("ls /opt/spark/jars/hadoop-common* | sed -n 's/.*\([0-9]\.[0-9]\.[0-9]\).*/\\1/p'").stdout.replace('\n','')
             print("Downloading local jars for Azure")
-            sudo('mkdir -p {}'.format(jars_dir))
+            datalab.fab.conn.sudo('mkdir -p {}'.format(jars_dir))
             if os.environ['azure_datalake_enable'] == 'false':
-                sudo('wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-azure/{0}/hadoop-azure-{0}.jar -O \
+                datalab.fab.conn.sudo('wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-azure/{0}/hadoop-azure-{0}.jar -O \
                                  {1}hadoop-azure-{0}.jar'.format(hadoop_version, jars_dir))
-                sudo('wget https://repo1.maven.org/maven2/com/microsoft/azure/azure-storage/{0}/azure-storage-{0}.jar \
+                datalab.fab.conn.sudo('wget https://repo1.maven.org/maven2/com/microsoft/azure/azure-storage/{0}/azure-storage-{0}.jar \
                     -O {1}azure-storage-{0}.jar'.format('2.2.0', jars_dir))
             else:
-                sudo('wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-azure/{0}/hadoop-azure-{0}.jar -O \
+                datalab.fab.conn.sudo('wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-azure/{0}/hadoop-azure-{0}.jar -O \
                                  {1}hadoop-azure-{0}.jar'.format('3.0.0', jars_dir))
-                sudo('wget https://repo1.maven.org/maven2/com/microsoft/azure/azure-storage/{0}/azure-storage-{0}.jar \
+                datalab.fab.conn.sudo('wget https://repo1.maven.org/maven2/com/microsoft/azure/azure-storage/{0}/azure-storage-{0}.jar \
                                     -O {1}azure-storage-{0}.jar'.format('6.1.0', jars_dir))
-                sudo('wget https://repo1.maven.org/maven2/com/microsoft/azure/azure-data-lake-store-sdk/{0}/azure-data-lake-store-sdk-{0}.jar \
+                datalab.fab.conn.sudo('wget https://repo1.maven.org/maven2/com/microsoft/azure/azure-data-lake-store-sdk/{0}/azure-data-lake-store-sdk-{0}.jar \
                     -O {1}azure-data-lake-store-sdk-{0}.jar'.format('2.2.3', jars_dir))
-                sudo('wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-azure-datalake/{0}/hadoop-azure-datalake-{0}.jar \
+                datalab.fab.conn.sudo('wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-azure-datalake/{0}/hadoop-azure-datalake-{0}.jar \
                     -O {1}hadoop-azure-datalake-{0}.jar'.format('3.0.0', jars_dir))
             if os.environ['application'] == 'tensor' or os.environ['application'] == 'deeplearning':
-                sudo('wget https://dl.bintray.com/spark-packages/maven/tapanalyticstoolkit/spark-tensorflow-connector/{0}/spark-tensorflow-connector-{0}.jar \
+                datalab.fab.conn.sudo('wget https://dl.bintray.com/spark-packages/maven/tapanalyticstoolkit/spark-tensorflow-connector/{0}/spark-tensorflow-connector-{0}.jar \
                      -O {1}spark-tensorflow-connector-{0}.jar'.format('1.0.0-s_2.11', jars_dir))
-            sudo('touch /home/{}/.ensure_dir/local_jars_ensured'.format(os_user))
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/local_jars_ensured'.format(os_user))
         except Exception as err:
             logging.info(
                 "Unable to download local jars: " + str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout))
@@ -1079,9 +1098,9 @@
     try:
         # Checking if spark.jars parameter was generated previously
         spark_jars_paths = None
-        if exists('/opt/spark/conf/spark-defaults.conf'):
+        if exists(datalab.fab.conn, '/opt/spark/conf/spark-defaults.conf'):
             try:
-                spark_jars_paths = sudo('cat /opt/spark/conf/spark-defaults.conf | grep -e "^spark.jars " ')
+                spark_jars_paths = datalab.fab.conn.sudo('cat /opt/spark/conf/spark-defaults.conf | grep -e "^spark.jars " ').stdout
             except:
                 spark_jars_paths = None
         user_storage_account_tag = "{}-{}-{}-bucket".format(os.environ['conf_service_base_name'],
@@ -1089,48 +1108,52 @@
                                                             os.environ['endpoint_name'].lower())
         shared_storage_account_tag = '{0}-{1}-shared-bucket'.format(os.environ['conf_service_base_name'],
                                                                     os.environ['endpoint_name'].lower())
-        for storage_account in meta_lib.AzureMeta().list_storage_accounts(os.environ['azure_resource_group_name']):
+        for storage_account in datalab.meta_lib.AzureMeta().list_storage_accounts(os.environ['azure_resource_group_name']):
             if user_storage_account_tag == storage_account.tags["Name"]:
                 user_storage_account_name = storage_account.name
-                user_storage_account_key = meta_lib.AzureMeta().list_storage_keys(
+                user_storage_account_key = datalab.meta_lib.AzureMeta().list_storage_keys(
                     os.environ['azure_resource_group_name'], user_storage_account_name)[0]
             if shared_storage_account_tag == storage_account.tags["Name"]:
                 shared_storage_account_name = storage_account.name
-                shared_storage_account_key = meta_lib.AzureMeta().list_storage_keys(
+                shared_storage_account_key = datalab.meta_lib.AzureMeta().list_storage_keys(
                     os.environ['azure_resource_group_name'], shared_storage_account_name)[0]
         if os.environ['azure_datalake_enable'] == 'false':
-            put(templates_dir + 'core-site-storage.xml', '/tmp/core-site.xml')
+            datalab.fab.conn.put(templates_dir + 'core-site-storage.xml', '/tmp/core-site.xml')
         else:
-            put(templates_dir + 'core-site-datalake.xml', '/tmp/core-site.xml')
-        sudo('sed -i "s|USER_STORAGE_ACCOUNT|{}|g" /tmp/core-site.xml'.format(user_storage_account_name))
-        sudo('sed -i "s|SHARED_STORAGE_ACCOUNT|{}|g" /tmp/core-site.xml'.format(shared_storage_account_name))
-        sudo('sed -i "s|USER_ACCOUNT_KEY|{}|g" /tmp/core-site.xml'.format(user_storage_account_key))
-        sudo('sed -i "s|SHARED_ACCOUNT_KEY|{}|g" /tmp/core-site.xml'.format(shared_storage_account_key))
+            datalab.fab.conn.put(templates_dir + 'core-site-datalake.xml', '/tmp/core-site.xml')
+        datalab.fab.conn.sudo('sed -i "s|USER_STORAGE_ACCOUNT|{}|g" /tmp/core-site.xml'.format(user_storage_account_name))
+        datalab.fab.conn.sudo('sed -i "s|SHARED_STORAGE_ACCOUNT|{}|g" /tmp/core-site.xml'.format(shared_storage_account_name))
+        datalab.fab.conn.sudo('sed -i "s|USER_ACCOUNT_KEY|{}|g" /tmp/core-site.xml'.format(user_storage_account_key))
+        datalab.fab.conn.sudo('sed -i "s|SHARED_ACCOUNT_KEY|{}|g" /tmp/core-site.xml'.format(shared_storage_account_key))
         if os.environ['azure_datalake_enable'] == 'true':
             client_id = os.environ['azure_application_id']
             refresh_token = os.environ['azure_user_refresh_token']
-            sudo('sed -i "s|CLIENT_ID|{}|g" /tmp/core-site.xml'.format(client_id))
-            sudo('sed -i "s|REFRESH_TOKEN|{}|g" /tmp/core-site.xml'.format(refresh_token))
+            datalab.fab.conn.sudo('sed -i "s|CLIENT_ID|{}|g" /tmp/core-site.xml'.format(client_id))
+            datalab.fab.conn.sudo('sed -i "s|REFRESH_TOKEN|{}|g" /tmp/core-site.xml'.format(refresh_token))
         if os.environ['azure_datalake_enable'] == 'false':
-            sudo('rm -f /opt/spark/conf/core-site.xml')
-            sudo('mv /tmp/core-site.xml /opt/spark/conf/core-site.xml')
+            datalab.fab.conn.sudo('rm -f /opt/spark/conf/core-site.xml')
+            datalab.fab.conn.sudo('mv /tmp/core-site.xml /opt/spark/conf/core-site.xml')
         else:
-            sudo('rm -f /opt/hadoop/etc/hadoop/core-site.xml')
-            sudo('mv /tmp/core-site.xml /opt/hadoop/etc/hadoop/core-site.xml')
-        put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/notebook_spark-defaults_local.conf')
-        sudo("jar_list=`find {} -name '*.jar' | tr '\\n' ','` ; echo \"spark.jars   $jar_list\" >> \
+            datalab.fab.conn.sudo('rm -f /opt/hadoop/etc/hadoop/core-site.xml')
+            datalab.fab.conn.sudo('mv /tmp/core-site.xml /opt/hadoop/etc/hadoop/core-site.xml')
+        datalab.fab.conn.put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/notebook_spark-defaults_local.conf')
+        datalab.fab.conn.sudo("jar_list=`find {} -name '*.jar' | tr '\\n' ','` ; echo \"spark.jars   $jar_list\" >> \
               /tmp/notebook_spark-defaults_local.conf".format(jars_dir))
-        sudo('\cp -f /tmp/notebook_spark-defaults_local.conf /opt/spark/conf/spark-defaults.conf')
+        datalab.fab.conn.sudo('\cp -f /tmp/notebook_spark-defaults_local.conf /opt/spark/conf/spark-defaults.conf')
         if memory_type == 'driver':
-            spark_memory = dlab.fab.get_spark_memory()
-            sudo('sed -i "/spark.*.memory/d" /opt/spark/conf/spark-defaults.conf')
-            sudo('echo "spark.{0}.memory {1}m" >> /opt/spark/conf/spark-defaults.conf'.format(memory_type,
+            spark_memory = datalab.fab.get_spark_memory()
+            datalab.fab.conn.sudo('sed -i "/spark.*.memory/d" /opt/spark/conf/spark-defaults.conf')
+            datalab.fab.conn.sudo('''bash -c 'echo "spark.{0}.memory {1}m" >> /opt/spark/conf/spark-defaults.conf' '''.format(memory_type,
                                                                                               spark_memory))
+        if not exists(datalab.fab.conn,'/opt/spark/conf/spark-env.sh'):
+            datalab.fab.conn.sudo('mv /opt/spark/conf/spark-env.sh.template /opt/spark/conf/spark-env.sh')
+        java_home = datalab.fab.conn.run("update-alternatives --query java | grep -o --color=never \'/.*/java-8.*/jre\'").stdout.splitlines()[0].replace('\n','')
+        datalab.fab.conn.sudo("echo 'export JAVA_HOME=\'{}\'' >> /opt/spark/conf/spark-env.sh".format(java_home))
         if 'spark_configurations' in os.environ:
-            dlab_header = sudo('cat /tmp/notebook_spark-defaults_local.conf | grep "^#"')
+            datalab_header = datalab.fab.conn.sudo('cat /tmp/notebook_spark-defaults_local.conf | grep "^#"').stdout
             spark_configurations = ast.literal_eval(os.environ['spark_configurations'])
             new_spark_defaults = list()
-            spark_defaults = sudo('cat /opt/spark/conf/spark-defaults.conf')
+            spark_defaults = datalab.fab.conn.sudo('cat /opt/spark/conf/spark-defaults.conf').stdout
             current_spark_properties = spark_defaults.split('\n')
             for param in current_spark_properties:
                 if param.split(' ')[0] != '#':
@@ -1143,40 +1166,41 @@
                                     new_spark_defaults.append(property + ' ' + config['Properties'][property])
                     new_spark_defaults.append(param)
             new_spark_defaults = set(new_spark_defaults)
-            sudo("echo '{}' > /opt/spark/conf/spark-defaults.conf".format(dlab_header))
+            datalab.fab.conn.sudo('''bash -c 'echo "{}" > /opt/spark/conf/spark-defaults.conf' '''.format(datalab_header))
             for prop in new_spark_defaults:
                 prop = prop.rstrip()
-                sudo('echo "{}" >> /opt/spark/conf/spark-defaults.conf'.format(prop))
-            sudo('sed -i "/^\s*$/d" /opt/spark/conf/spark-defaults.conf')
+                datalab.fab.conn.sudo('''bash -c 'echo "{}" >> /opt/spark/conf/spark-defaults.conf' '''.format(prop))
+            datalab.fab.conn.sudo('sed -i "/^\s*$/d" /opt/spark/conf/spark-defaults.conf')
             if spark_jars_paths:
-                sudo('echo "{}" >> /opt/spark/conf/spark-defaults.conf'.format(spark_jars_paths))
+                datalab.fab.conn.sudo('''bash -c 'echo "{}" >> /opt/spark/conf/spark-defaults.conf' '''.format(spark_jars_paths))
     except Exception as err:
         print('Error:', str(err))
         sys.exit(1)
 
 
 def configure_dataengine_spark(cluster_name, jars_dir, cluster_dir, datalake_enabled, spark_configs=''):
-    local("jar_list=`find {0} -name '*.jar' | tr '\\n' ',' | sed 's/,$//'` ; echo \"spark.jars $jar_list\" >> \
-          /tmp/{1}/notebook_spark-defaults_local.conf".format(jars_dir, cluster_name))
+    subprocess.run("jar_list=`find {0} -name '*.jar' | tr '\\n' ',' | sed 's/,$//'` ; echo \"spark.jars $jar_list\" >> \
+          /tmp/{1}/notebook_spark-defaults_local.conf".format(jars_dir, cluster_name), shell=True, check=True)
     if os.path.exists('{0}spark/conf/spark-defaults.conf'.format(cluster_dir)):
-        additional_spark_properties = local('diff --changed-group-format="%>" --unchanged-group-format="" '
+        additional_spark_properties = subprocess.run('diff --changed-group-format="%>" --unchanged-group-format="" '
                                             '/tmp/{0}/notebook_spark-defaults_local.conf '
                                             '{1}spark/conf/spark-defaults.conf | grep -v "^#"'.format(
-                                             cluster_name, cluster_dir), capture=True)
+                                             cluster_name, cluster_dir), capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
         for property in additional_spark_properties.split('\n'):
-            local('echo "{0}" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(property, cluster_name))
-    local('cp -f /tmp/{0}/notebook_spark-defaults_local.conf  {1}spark/conf/spark-defaults.conf'.format(cluster_name,
-                                                                                                        cluster_dir))
-    if datalake_enabled == 'false':
-        local('cp -f /opt/spark/conf/core-site.xml {}spark/conf/'.format(cluster_dir))
-    else:
-        local('cp -f /opt/hadoop/etc/hadoop/core-site.xml {}hadoop/etc/hadoop/core-site.xml'.format(cluster_dir))
-    if spark_configs:
-        dlab_header = local('cat /tmp/{0}/notebook_spark-defaults_local.conf | grep "^#"'.format(cluster_name),
-                            capture=True)
+            subprocess.run('echo "{0}" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(property, cluster_name), shell=True, check=True)
+    if os.path.exists('{0}'.format(cluster_dir)):
+        subprocess.run('cp -f /tmp/{0}/notebook_spark-defaults_local.conf  {1}spark/conf/spark-defaults.conf'.format(cluster_name,
+                                                                                                        cluster_dir), shell=True, check=True)
+        if datalake_enabled == 'false':
+            subprocess.run('cp -f /opt/spark/conf/core-site.xml {}spark/conf/'.format(cluster_dir), shell=True, check=True)
+        else:
+            subprocess.run('cp -f /opt/hadoop/etc/hadoop/core-site.xml {}hadoop/etc/hadoop/core-site.xml'.format(cluster_dir), shell=True, check=True)
+    if spark_configs and os.path.exists('{0}'.format(cluster_dir)):
+        datalab_header = subprocess.run('cat /tmp/{0}/notebook_spark-defaults_local.conf | grep "^#"'.format(cluster_name),
+                               capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
         spark_configurations = ast.literal_eval(spark_configs)
         new_spark_defaults = list()
-        spark_defaults = local('cat {0}spark/conf/spark-defaults.conf'.format(cluster_dir), capture=True)
+        spark_defaults = subprocess.run('cat {0}spark/conf/spark-defaults.conf'.format(cluster_dir), capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
         current_spark_properties = spark_defaults.split('\n')
         for param in current_spark_properties:
             if param.split(' ')[0] != '#':
@@ -1189,80 +1213,111 @@
                                 new_spark_defaults.append(property + ' ' + config['Properties'][property])
                 new_spark_defaults.append(param)
         new_spark_defaults = set(new_spark_defaults)
-        local("echo '{0}' > {1}/spark/conf/spark-defaults.conf".format(dlab_header, cluster_dir))
+        subprocess.run("echo '{0}' > {1}/spark/conf/spark-defaults.conf".format(datalab_header, cluster_dir), shell=True, check=True)
         for prop in new_spark_defaults:
             prop = prop.rstrip()
-            local('echo "{0}" >> {1}/spark/conf/spark-defaults.conf'.format(prop, cluster_dir))
-        local('sed -i "/^\s*$/d" {0}/spark/conf/spark-defaults.conf'.format(cluster_dir))
+            subprocess.run('echo "{0}" >> {1}/spark/conf/spark-defaults.conf'.format(prop, cluster_dir), shell=True, check=True)
+        subprocess.run('sed -i "/^\s*$/d" {0}/spark/conf/spark-defaults.conf'.format(cluster_dir), shell=True, check=True)
 
 
 def remount_azure_disk(creds=False, os_user='', hostname='', keyfile=''):
     if creds:
-        env['connection_attempts'] = 100
-        env.key_filename = [keyfile]
-        env.host_string = os_user + '@' + hostname
-    sudo('sed -i "/azure_resource-part1/ s|/mnt|/media|g" /etc/fstab')
-    sudo('grep "azure_resource-part1" /etc/fstab > /dev/null &&  umount -f /mnt/ || true')
-    sudo('mount -a')
+        global conn
+        conn = datalab.fab.init_datalab_connection(hostname, os_user, keyfile)
+    else:
+        conn = datalab.fab.conn
+    conn.sudo('sed -i "/azure_resource-part1/ s|/mnt|/media|g" /etc/fstab')
+    conn.sudo('''bash -c 'grep "azure_resource-part1" /etc/fstab > /dev/null &&  umount -f /mnt/ || true' ''')
+    conn.sudo('mount -a')
+    if creds:
+        conn.close()
 
 
 def prepare_vm_for_image(creds=False, os_user='', hostname='', keyfile=''):
     if creds:
-        env['connection_attempts'] = 100
-        env.key_filename = [keyfile]
-        env.host_string = os_user + '@' + hostname
-    sudo('waagent -deprovision -force')
+        global conn
+        conn = datalab.fab.init_datalab_connection(hostname, os_user, keyfile)
+    conn.sudo('waagent -deprovision -force')
+    if creds:
+        conn.close()
 
 
 def prepare_disk(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/disk_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/disk_ensured'):
         try:
+            allow = False
+            counter = 0
             remount_azure_disk()
-            disk_name = sudo("lsblk | grep disk | awk '{print $1}' | sort | tail -n 1")
-            with settings(warn_only=True):
-                sudo('umount -l /dev/{}1'.format(disk_name))
-            sudo('''bash -c 'echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/{}' '''.format(disk_name))
-            sudo('mkfs.ext4 -F /dev/{}1'.format(disk_name))
-            sudo('mount /dev/{}1 /opt/'.format(disk_name))
-            sudo(''' bash -c "echo '/dev/{}1 /opt/ ext4 errors=remount-ro 0 1' >> /etc/fstab" '''.format(disk_name))
-            sudo('touch /home/' + os_user + '/.ensure_dir/disk_ensured')
-        except:
+            disk_name = datalab.fab.conn.sudo("lsblk | grep disk | awk '{print $1}' | sort | tail -n 1").stdout.replace('\n','')
+            datalab.fab.conn.sudo('umount -l /dev/{}1'.format(disk_name), warn=True)
+            while not allow:
+                if counter > 4:
+                    print("Unable to prepare disk")
+                    sys.exit(1)
+                else:
+                    out = datalab.fab.conn.sudo('''bash -c 'echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/{} 2>&1' '''.format(
+                        disk_name)).stdout
+                    if 'Syncing disks' in out:
+                        allow = True
+                    elif 'The kernel still uses the old table.' in out:
+                        if datalab.fab.conn.sudo('partprobe').stdout:
+                            datalab.fab.conn.sudo('reboot', warn=True)
+                        allow = True
+                    else:
+                        counter += 1
+                        time.sleep(5)
+            datalab.fab.conn.sudo('umount -l /dev/{}1'.format(disk_name), warn=True)
+            try:
+                datalab.fab.conn.sudo('mkfs.ext4 -F /dev/{}1'.format(disk_name))
+            except:
+                out = datalab.fab.conn.sudo('mount -l | grep /dev/{}1'.format(disk_name)).stdout
+                if 'type ext4' in out:
+                    pass
+                else:
+                    sys.exit(1)
+            datalab.fab.conn.sudo('mount /dev/{}1 /opt/'.format(disk_name))
+            datalab.fab.conn.sudo(''' bash -c "echo '/dev/{}1 /opt/ ext4 errors=remount-ro 0 1' >> /etc/fstab" '''.format(
+                disk_name))
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/disk_ensured')
+        except Exception as err:
+            traceback.print_exc()
+            print('Error:', str(err))
             sys.exit(1)
 
 
 def ensure_local_spark(os_user, spark_link, spark_version, hadoop_version, local_spark_path):
-    if not exists('/home/' + os_user + '/.ensure_dir/local_spark_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/local_spark_ensured'):
         try:
             if os.environ['azure_datalake_enable'] == 'false':
-                sudo('wget ' + spark_link + ' -O /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz')
-                sudo('tar -zxvf /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz -C /opt/')
-                sudo('mv /opt/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' + local_spark_path)
-                sudo('chown -R ' + os_user + ':' + os_user + ' ' + local_spark_path)
-                sudo('touch /home/' + os_user + '/.ensure_dir/local_spark_ensured')
+                datalab.fab.conn.sudo('wget ' + spark_link + ' -O /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz')
+                datalab.fab.conn.sudo('tar -zxvf /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz -C /opt/')
+                datalab.fab.conn.sudo('mv /opt/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' + local_spark_path)
+                datalab.fab.conn.sudo('chown -R ' + os_user + ':' + os_user + ' ' + local_spark_path)
+                datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/local_spark_ensured')
             else:
                 # Downloading Spark without Hadoop
-                sudo('wget https://archive.apache.org/dist/spark/spark-{0}/spark-{0}-bin-without-hadoop.tgz -O /tmp/spark-{0}-bin-without-hadoop.tgz'
+                datalab.fab.conn.sudo('wget https://archive.apache.org/dist/spark/spark-{0}/spark-{0}-bin-without-hadoop.tgz -O /tmp/spark-{0}-bin-without-hadoop.tgz'
                     .format(spark_version))
-                sudo('tar -zxvf /tmp/spark-{}-bin-without-hadoop.tgz -C /opt/'.format(spark_version))
-                sudo('mv /opt/spark-{}-bin-without-hadoop {}'.format(spark_version, local_spark_path))
-                sudo('chown -R {0}:{0} {1}'.format(os_user, local_spark_path))
+                datalab.fab.conn.sudo('tar -zxvf /tmp/spark-{}-bin-without-hadoop.tgz -C /opt/'.format(spark_version))
+                datalab.fab.conn.sudo('mv /opt/spark-{}-bin-without-hadoop {}'.format(spark_version, local_spark_path))
+                datalab.fab.conn.sudo('chown -R {0}:{0} {1}'.format(os_user, local_spark_path))
                 # Downloading Hadoop
                 hadoop_version = '3.0.0'
-                sudo('wget https://archive.apache.org/dist/hadoop/common/hadoop-{0}/hadoop-{0}.tar.gz -O /tmp/hadoop-{0}.tar.gz'
+                datalab.fab.conn.sudo('wget https://archive.apache.org/dist/hadoop/common/hadoop-{0}/hadoop-{0}.tar.gz -O /tmp/hadoop-{0}.tar.gz'
                     .format(hadoop_version))
-                sudo('tar -zxvf /tmp/hadoop-{0}.tar.gz -C /opt/'.format(hadoop_version))
-                sudo('mv /opt/hadoop-{0} /opt/hadoop/'.format(hadoop_version))
-                sudo('chown -R {0}:{0} /opt/hadoop/'.format(os_user))
+                datalab.fab.conn.sudo('tar -zxvf /tmp/hadoop-{0}.tar.gz -C /opt/'.format(hadoop_version))
+                datalab.fab.conn.sudo('mv /opt/hadoop-{0} /opt/hadoop/'.format(hadoop_version))
+                datalab.fab.conn.sudo('chown -R {0}:{0} /opt/hadoop/'.format(os_user))
                 # Configuring Hadoop and Spark
-                java_path = dlab.common_lib.find_java_path_remote()
-                sudo('echo "export JAVA_HOME={}" >> /opt/hadoop/etc/hadoop/hadoop-env.sh'.format(java_path))
-                sudo("""echo 'export HADOOP_CLASSPATH="$HADOOP_HOME/share/hadoop/tools/lib/*"' >> /opt/hadoop/etc/hadoop/hadoop-env.sh""")
-                sudo('echo "export HADOOP_HOME=/opt/hadoop/" >> /opt/spark/conf/spark-env.sh')
-                sudo('echo "export SPARK_HOME=/opt/spark/" >> /opt/spark/conf/spark-env.sh')
-                spark_dist_classpath = sudo('/opt/hadoop/bin/hadoop classpath')
-                sudo('echo "export SPARK_DIST_CLASSPATH={}" >> /opt/spark/conf/spark-env.sh'.format(
+                java_path = datalab.common_lib.find_java_path_remote()
+                datalab.fab.conn.sudo('echo "export JAVA_HOME={}" >> /opt/hadoop/etc/hadoop/hadoop-env.sh'.format(java_path))
+                datalab.fab.conn.sudo("""echo 'export HADOOP_CLASSPATH="$HADOOP_HOME/share/hadoop/tools/lib/*"' >> /opt/hadoop/etc/hadoop/hadoop-env.sh""")
+                datalab.fab.conn.sudo('echo "export HADOOP_HOME=/opt/hadoop/" >> /opt/spark/conf/spark-env.sh')
+                datalab.fab.conn.sudo('echo "export SPARK_HOME=/opt/spark/" >> /opt/spark/conf/spark-env.sh')
+                spark_dist_classpath = datalab.fab.conn.sudo('/opt/hadoop/bin/hadoop classpath').stdout
+                datalab.fab.conn.sudo('echo "export SPARK_DIST_CLASSPATH={}" >> /opt/spark/conf/spark-env.sh'.format(
                     spark_dist_classpath))
-                sudo('touch /home/{}/.ensure_dir/local_spark_ensured'.format(os_user))
+                datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/local_spark_ensured'.format(os_user))
         except Exception as err:
             print('Error:', str(err))
             sys.exit(1)
@@ -1271,33 +1326,33 @@
 def install_dataengine_spark(cluster_name, spark_link, spark_version, hadoop_version, cluster_dir, os_user, datalake_enabled):
     try:
         if datalake_enabled == 'false':
-            local('wget ' + spark_link + ' -O /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz')
-            local('tar -zxvf /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz -C /opt/')
-            local('mv /opt/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' + cluster_dir + 'spark/')
-            local('chown -R ' + os_user + ':' + os_user + ' ' + cluster_dir + 'spark/')
+            subprocess.run('wget ' + spark_link + ' -O /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz', shell=True, check=True)
+            subprocess.run('tar -zxvf /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz -C /opt/', shell=True, check=True)
+            subprocess.run('mv /opt/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' + cluster_dir + 'spark/', shell=True, check=True)
+            subprocess.run('chown -R ' + os_user + ':' + os_user + ' ' + cluster_dir + 'spark/', shell=True, check=True)
         else:
             # Downloading Spark without Hadoop
-            local('wget https://archive.apache.org/dist/spark/spark-{0}/spark-{0}-bin-without-hadoop.tgz -O /tmp/{1}/spark-{0}-bin-without-hadoop.tgz'
-                 .format(spark_version, cluster_name))
-            local('tar -zxvf /tmp/' + cluster_name + '/spark-{}-bin-without-hadoop.tgz -C /opt/'.format(spark_version))
-            local('mv /opt/spark-{}-bin-without-hadoop {}spark/'.format(spark_version, cluster_dir))
-            local('chown -R {0}:{0} {1}/spark/'.format(os_user, cluster_dir))
+            subprocess.run('wget https://archive.apache.org/dist/spark/spark-{0}/spark-{0}-bin-without-hadoop.tgz -O /tmp/{1}/spark-{0}-bin-without-hadoop.tgz'
+                 .format(spark_version, cluster_name), shell=True, check=True)
+            subprocess.run('tar -zxvf /tmp/' + cluster_name + '/spark-{}-bin-without-hadoop.tgz -C /opt/'.format(spark_version), shell=True, check=True)
+            subprocess.run('mv /opt/spark-{}-bin-without-hadoop {}spark/'.format(spark_version, cluster_dir), shell=True, check=True)
+            subprocess.run('chown -R {0}:{0} {1}/spark/'.format(os_user, cluster_dir), shell=True, check=True)
             # Downloading Hadoop
             hadoop_version = '3.0.0'
-            local('wget https://archive.apache.org/dist/hadoop/common/hadoop-{0}/hadoop-{0}.tar.gz -O /tmp/{1}/hadoop-{0}.tar.gz'
-                 .format(hadoop_version, cluster_name))
-            local('tar -zxvf /tmp/' + cluster_name + '/hadoop-{0}.tar.gz -C /opt/'.format(hadoop_version))
-            local('mv /opt/hadoop-{0} {1}hadoop/'.format(hadoop_version, cluster_dir))
-            local('chown -R {0}:{0} {1}hadoop/'.format(os_user, cluster_dir))
+            subprocess.run('wget https://archive.apache.org/dist/hadoop/common/hadoop-{0}/hadoop-{0}.tar.gz -O /tmp/{1}/hadoop-{0}.tar.gz'
+                 .format(hadoop_version, cluster_name), shell=True, check=True)
+            subprocess.run('tar -zxvf /tmp/' + cluster_name + '/hadoop-{0}.tar.gz -C /opt/'.format(hadoop_version), shell=True, check=True)
+            subprocess.run('mv /opt/hadoop-{0} {1}hadoop/'.format(hadoop_version, cluster_dir), shell=True, check=True)
+            subprocess.run('chown -R {0}:{0} {1}hadoop/'.format(os_user, cluster_dir), shell=True, check=True)
             # Configuring Hadoop and Spark
-            java_path = dlab.common_lib.find_java_path_local()
-            local('echo "export JAVA_HOME={}" >> {}hadoop/etc/hadoop/hadoop-env.sh'.format(java_path, cluster_dir))
-            local("""echo 'export HADOOP_CLASSPATH="$HADOOP_HOME/share/hadoop/tools/lib/*"' >> {}hadoop/etc/hadoop/hadoop-env.sh""".format(cluster_dir))
-            local('echo "export HADOOP_HOME={0}hadoop/" >> {0}spark/conf/spark-env.sh'.format(cluster_dir))
-            local('echo "export SPARK_HOME={0}spark/" >> {0}spark/conf/spark-env.sh'.format(cluster_dir))
-            spark_dist_classpath = local('{}hadoop/bin/hadoop classpath'.format(cluster_dir), capture=True)
-            local('echo "export SPARK_DIST_CLASSPATH={}" >> {}spark/conf/spark-env.sh'.format(
-                spark_dist_classpath, cluster_dir))
+            java_path = datalab.common_lib.find_java_path_local()
+            subprocess.run('echo "export JAVA_HOME={}" >> {}hadoop/etc/hadoop/hadoop-env.sh'.format(java_path, cluster_dir), shell=True, check=True)
+            subprocess.run("""echo 'export HADOOP_CLASSPATH="$HADOOP_HOME/share/hadoop/tools/lib/*"' >> {}hadoop/etc/hadoop/hadoop-env.sh""".format(cluster_dir), shell=True, check=True)
+            subprocess.run('echo "export HADOOP_HOME={0}hadoop/" >> {0}spark/conf/spark-env.sh'.format(cluster_dir), shell=True, check=True)
+            subprocess.run('echo "export SPARK_HOME={0}spark/" >> {0}spark/conf/spark-env.sh'.format(cluster_dir), shell=True, check=True)
+            spark_dist_classpath = subprocess.run('{}hadoop/bin/hadoop classpath'.format(cluster_dir), capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+            subprocess.run('echo "export SPARK_DIST_CLASSPATH={}" >> {}spark/conf/spark-env.sh'.format(
+                spark_dist_classpath, cluster_dir), shell=True, check=True)
     except:
         sys.exit(1)
 
diff --git a/infrastructure-provisioning/src/general/lib/azure/meta_lib.py b/infrastructure-provisioning/src/general/lib/azure/meta_lib.py
index cfc03a8..510e875 100644
--- a/infrastructure-provisioning/src/general/lib/azure/meta_lib.py
+++ b/infrastructure-provisioning/src/general/lib/azure/meta_lib.py
@@ -40,13 +40,14 @@
 
 class AzureMeta:
     def __init__(self):
+
         os.environ['AZURE_AUTH_LOCATION'] = '/root/azure_auth.json'
         self.compute_client = get_client_from_auth_file(ComputeManagementClient)
         self.resource_client = get_client_from_auth_file(ResourceManagementClient)
         self.network_client = get_client_from_auth_file(NetworkManagementClient)
         self.storage_client = get_client_from_auth_file(StorageManagementClient)
         self.datalake_client = get_client_from_auth_file(DataLakeStoreAccountManagementClient)
-        self.authorization_client = get_client_from_auth_file(AuthorizationManagementClient)
+        #self.authorization_client = get_client_from_auth_file(AuthorizationManagementClient)
         self.sp_creds = json.loads(open(os.environ['AZURE_AUTH_LOCATION']).read())
         self.dl_filesystem_creds = lib.auth(tenant_id=json.dumps(self.sp_creds['tenantId']).replace('"', ''),
                                             client_secret=json.dumps(self.sp_creds['clientSecret']).replace('"', ''),
@@ -132,6 +133,21 @@
                                    file=sys.stdout)}))
             traceback.print_exc(file=sys.stdout)
 
+    def list_security_group_rules(self, resource_group_name, sg_name):
+        try:
+            result = self.network_client.security_rules.list(resource_group_name, sg_name)
+            return result
+        except AzureExceptions.CloudError as err:
+            if err.status_code == 404:
+                return ''
+        except Exception as err:
+            logging.info(
+                "Unable to get list of security group rules: " + str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout))
+            append_result(str({"error": "Unable to get list of rules",
+                               "error_message": str(err) + "\n Traceback: " + traceback.print_exc(
+                                   file=sys.stdout)}))
+            traceback.print_exc(file=sys.stdout)
+
     def list_subnets(self, resource_group_name, vpc_name):
         try:
             result = self.network_client.subnets.list(resource_group_name, vpc_name)
diff --git a/infrastructure-provisioning/src/general/lib/gcp/actions_lib.py b/infrastructure-provisioning/src/general/lib/gcp/actions_lib.py
index b1d0acb..fa1d891 100644
--- a/infrastructure-provisioning/src/general/lib/gcp/actions_lib.py
+++ b/infrastructure-provisioning/src/general/lib/gcp/actions_lib.py
@@ -19,27 +19,29 @@
 #
 # ******************************************************************************
 
-from pprint import pprint
-from googleapiclient.discovery import build
+import ast
+import backoff
+import datalab.common_lib
+import datalab.fab
+import datalab.meta_lib
+import google.auth
+import json
+import logging
+import os
+import random
+import sys
+import time
+import traceback
+import urllib3
+import urllib.request
+import subprocess
+from Crypto.PublicKey import RSA
+from datalab.fab import *
+from fabric import *
 from google.cloud import exceptions
 from google.cloud import storage
 from googleapiclient import errors
-import google.auth
-from dlab.fab import *
-import meta_lib
-import os
-import json
-import logging
-import traceback
-import sys, time
-from Crypto.PublicKey import RSA
-from fabric.api import *
-import urllib2
-import dlab.fab
-import dlab.common_lib
-import backoff
-import ast
-import random
+from googleapiclient.discovery import build
 
 
 class GCPActions:
@@ -83,7 +85,7 @@
         try:
             print("Create VPC {}".format(vpc_name))
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'])
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'])
             print("VPC {} has been created".format(vpc_name))
             return result
         except Exception as err:
@@ -98,7 +100,7 @@
         request = self.service.networks().delete(project=self.project, network=vpc_name)
         try:
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'])
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'])
             print("VPC {} has been removed".format(vpc_name))
             return result
         except Exception as err:
@@ -121,7 +123,7 @@
         try:
             print("Create subnet {}".format(subnet_name))
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'], region=region)
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'], region=region)
             print("Subnet {} has been created".format(subnet_name))
             return result
         except Exception as err:
@@ -136,7 +138,7 @@
         request = self.service.subnetworks().delete(project=self.project, region=region, subnetwork=subnet_name)
         try:
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'], region=region)
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'], region=region)
             print("Subnet {} has been removed".format(subnet_name))
             return result
         except Exception as err:
@@ -151,7 +153,7 @@
         request = self.service.firewalls().insert(project=self.project, body=firewall_params)
         try:
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'])
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'])
             print('Firewall {} created.'.format(firewall_params['name']))
             return result
         except Exception as err:
@@ -166,7 +168,7 @@
         request = self.service.firewalls().delete(project=self.project, firewall=firewall_name)
         try:
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'])
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'])
             print('Firewall {} removed.'.format(firewall_name))
             return result
         except Exception as err:
@@ -177,6 +179,37 @@
                                    file=sys.stdout)}))
             traceback.print_exc(file=sys.stdout)
 
+    def create_nat_route(self, nat_route_params):
+        request = self.service.routes().insert(project=self.project, body=nat_route_params)
+        try:
+            result = request.execute()
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'])
+            print('NAT route {} created.'.format(nat_route_params['name']))
+            return result
+        except Exception as err:
+            logging.info(
+                "Unable to create NAT route: " + str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout))
+            append_result(str({"error": "Unable to create NAT route",
+                               "error_message": str(err) + "\n Traceback: " + traceback.print_exc(
+                                   file=sys.stdout)}))
+            traceback.print_exc(file=sys.stdout)
+
+    def delete_nat_route(self, nat_route_name):
+        request = self.service.routes().delete(project=self.project, route=nat_route_name)
+        try:
+            result = request.execute()
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'])
+            print('NAT route {} deleteed.'.format(nat_route_name))
+            return result
+        except Exception as err:
+            logging.info(
+                "Unable to delete NAT route: " + str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout))
+            append_result(str({"error": "Unable to delete NAT route",
+                               "error_message": str(err) + "\n Traceback: " + traceback.print_exc(
+                                   file=sys.stdout)}))
+            traceback.print_exc(file=sys.stdout)
+
+
     def create_bucket(self, bucket_name):
         try:
             bucket = self.storage_client.create_bucket(bucket_name)
@@ -249,7 +282,7 @@
                           "sourceImage": secondary_image_name}
             request = self.service.disks().insert(project=self.project, zone=zone, body=params)
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
             print('Disk {}-secondary created.'.format(instance_name))
             return request
         except Exception as err:
@@ -265,7 +298,7 @@
             request = self.service.disks().delete(project=self.project, zone=zone, disk=instance_name + '-secondary')
             try:
                 result = request.execute()
-                meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
+                datalab.meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
                 print('Disk {}-secondary removed.'.format(instance_name))
             except errors.HttpError as err:
                 if err.resp.status == 404:
@@ -287,10 +320,10 @@
                         initial_user, image_name, secondary_image_name, service_account_name, instance_class,
                         network_tag, labels, static_ip='',
                         primary_disk_size='12', secondary_disk_size='30',
-                        gpu_accelerator_type='None'):
+                        gpu_accelerator_type='None', gpu_accelerator_count='1'):
         key = RSA.importKey(open(ssh_key_path, 'rb').read())
-        ssh_key = key.publickey().exportKey("OpenSSH")
-        unique_index = meta_lib.GCPMeta().get_index_by_service_account_name(service_account_name)
+        ssh_key = key.publickey().exportKey("OpenSSH").decode('UTF-8')
+        unique_index = datalab.meta_lib.GCPMeta().get_index_by_service_account_name(service_account_name)
         service_account_email = "{}-{}@{}.iam.gserviceaccount.com".format(service_base_name, unique_index, self.project)
         access_configs = ''
         if instance_class == 'edge':
@@ -406,12 +439,12 @@
         if instance_class == 'notebook' or instance_class == 'dataengine':
             del instance_params['networkInterfaces'][0]['accessConfigs']
         if gpu_accelerator_type != 'None':
-            request = self.service.acceleratorTypes().list(project=self.project, zone = zone)
-            result = request.execute().get('items')
-            gpu_accelerator_type = result[0].get('name')
+            #request = self.service.acceleratorTypes().list(project=self.project, zone = zone)
+            #result = request.execute().get('items')
+            #gpu_accelerator_type = result[0].get('name')
             instance_params['guestAccelerators'] = [
                 {
-                    "acceleratorCount": 1,
+                    "acceleratorCount": gpu_accelerator_count,
                     "acceleratorType": "projects/{0}/zones/{1}/acceleratorTypes/{2}".format(
                         self.project, zone, gpu_accelerator_type)
                 }
@@ -424,12 +457,17 @@
                                                   body=instance_params)
         try:
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
             print('Instance {} created.'.format(instance_name))
             request = self.service.instances().get(instance=instance_name, project=self.project,
                                                    zone=zone)
             res = request.execute()
-            instance_tag = {"items": [network_tag], "fingerprint": res['tags']['fingerprint']}
+            if 'ssn' in network_tag:
+                instance_tag = {"items": [network_tag, "datalab", "ssn"], "fingerprint": res['tags']['fingerprint']}
+            elif 'edge' in network_tag:
+                instance_tag = {"items": [network_tag, "datalab", "edge"], "fingerprint": res['tags']['fingerprint']}
+            else:
+                instance_tag = {"items": [network_tag, "datalab"], "fingerprint": res['tags']['fingerprint']}
             request = self.service.instances().setTags(instance=instance_name, project=self.project,
                                                        zone=zone,
                                                        body=instance_tag)
@@ -474,7 +512,7 @@
                                                   instance=instance_name)
         try:
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
             print('Instance {} removed.'.format(instance_name))
             return result
         except Exception as err:
@@ -489,7 +527,7 @@
         request = self.service.instances().stop(project=self.project, zone=zone, instance=instance_name)
         try:
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
             return True
         except Exception as err:
             logging.info(
@@ -503,7 +541,7 @@
         request = self.service.instances().start(project=self.project, zone=zone, instance=instance_name)
         try:
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'], zone=zone)
             return True
         except Exception as err:
             logging.info(
@@ -514,16 +552,16 @@
             traceback.print_exc(file=sys.stdout)
 
     def remove_service_account(self, service_account_name, service_base_name):
-        unique_index = meta_lib.GCPMeta().get_index_by_service_account_name(service_account_name)
+        unique_index = datalab.meta_lib.GCPMeta().get_index_by_service_account_name(service_account_name)
         service_account_email = "{}-{}@{}.iam.gserviceaccount.com".format(service_base_name, unique_index, self.project)
         request = self.service_iam.projects().serviceAccounts().delete(
             name='projects/{}/serviceAccounts/{}'.format(self.project, service_account_email))
         try:
             result = request.execute()
-            service_account_removed = meta_lib.GCPMeta().get_service_account(service_account_name, service_base_name)
+            service_account_removed = datalab.meta_lib.GCPMeta().get_service_account(service_account_name, service_base_name)
             while service_account_removed:
                 time.sleep(5)
-                service_account_removed = meta_lib.GCPMeta().get_service_account(service_account_name, service_base_name)
+                service_account_removed = datalab.meta_lib.GCPMeta().get_service_account(service_account_name, service_base_name)
             time.sleep(30)
             print('Service account {} removed.'.format(service_account_name))
             return result
@@ -544,10 +582,10 @@
                                                                        body=params)
         try:
             result = request.execute()
-            service_account_created = meta_lib.GCPMeta().get_service_account(service_account_name, service_base_name)
+            service_account_created = datalab.meta_lib.GCPMeta().get_service_account(service_account_name, service_base_name)
             while not service_account_created:
                 time.sleep(5)
-                service_account_created = meta_lib.GCPMeta().get_service_account(service_account_name, service_base_name)
+                service_account_created = datalab.meta_lib.GCPMeta().get_service_account(service_account_name, service_base_name)
             time.sleep(30)
             print('Service account {} created.'.format(service_account_name))
             return result
@@ -565,7 +603,7 @@
         num += 1
         request = GCPActions().service_resource.projects().getIamPolicy(resource=self.project, body={})
         project_policy = request.execute()
-        unique_index = meta_lib.GCPMeta().get_index_by_service_account_name(service_account_name)
+        unique_index = datalab.meta_lib.GCPMeta().get_index_by_service_account_name(service_account_name)
         service_account_email = "{}-{}@{}.iam.gserviceaccount.com".format(service_base_name, unique_index, self.project)
         params = {
             "role": "projects/{}/roles/{}".format(self.project, role_name.replace('-', '_')),
@@ -608,10 +646,10 @@
                                                                  }})
         try:
             result = request.execute()
-            role_created = meta_lib.GCPMeta().get_role(role_name)
+            role_created = datalab.meta_lib.GCPMeta().get_role(role_name)
             while not role_created:
                 time.sleep(5)
-                role_created = meta_lib.GCPMeta().get_role(role_name)
+                role_created = datalab.meta_lib.GCPMeta().get_role(role_name)
             time.sleep(30)
             print('IAM role {} created.'.format(role_name))
             return result
@@ -631,14 +669,14 @@
                                                              { })
         try:
             result = request.execute()
-            role = meta_lib.GCPMeta().get_role(role_name)
+            role = datalab.meta_lib.GCPMeta().get_role(role_name)
             if 'deleted' in role:
                 role_removed = True
             else:
                 role_removed = False
             while role_removed:
                 time.sleep(5)
-                role = meta_lib.GCPMeta().get_role(role_name)
+                role = datalab.meta_lib.GCPMeta().get_role(role_name)
                 if 'deleted' in role:
                     role_removed = True
             time.sleep(30)
@@ -658,14 +696,14 @@
             name='projects/{}/roles/{}'.format(self.project, role_name.replace('-', '_')))
         try:
             result = request.execute()
-            role = meta_lib.GCPMeta().get_role(role_name)
+            role = datalab.meta_lib.GCPMeta().get_role(role_name)
             if 'deleted' in role:
                 role_removed = True
             else:
                 role_removed = False
             while not role_removed:
                 time.sleep(5)
-                role = meta_lib.GCPMeta().get_role(role_name)
+                role = datalab.meta_lib.GCPMeta().get_role(role_name)
                 if 'deleted' in role:
                     role_removed = True
             time.sleep(30)
@@ -703,7 +741,7 @@
             traceback.print_exc(file=sys.stdout)
 
     def set_service_account_to_instance(self, service_account_name, instance_name, service_base_name):
-        unique_index = meta_lib.GCPMeta().get_index_by_service_account_name(service_account_name)
+        unique_index = datalab.meta_lib.GCPMeta().get_index_by_service_account_name(service_account_name)
         service_account_email = "{}-{}@{}.iam.gserviceaccount.com".format(service_base_name, unique_index, self.project)
         params = {
             "email": service_account_email
@@ -726,7 +764,7 @@
         request = self.service.addresses().insert(project=self.project, region=region, body=params)
         try:
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'], region=region)
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'], region=region)
             print('Static address {} created.'.format(address_name))
             return result
         except Exception as err:
@@ -742,7 +780,7 @@
         request = self.service.addresses().delete(project=self.project, region=region, address=address_name)
         try:
             result = request.execute()
-            meta_lib.GCPMeta().wait_for_operation(result['name'], region=region)
+            datalab.meta_lib.GCPMeta().wait_for_operation(result['name'], region=region)
             print('Static address {} removed.'.format(address_name))
             return result
         except Exception as err:
@@ -766,16 +804,16 @@
         id_list=[]
         try:
             GCPActions().stop_instance(instance_name, zone)
-            primary_image_check = meta_lib.GCPMeta().get_image_by_name(primary_image_name)
+            primary_image_check = datalab.meta_lib.GCPMeta().get_image_by_name(primary_image_name)
             if primary_image_check != '':
                 GCPActions().start_instance(instance_name, zone)
                 return ''
             primary_result = primary_request.execute()
             secondary_result = secondary_request.execute()
-            meta_lib.GCPMeta().wait_for_operation(primary_result['name'])
+            datalab.meta_lib.GCPMeta().wait_for_operation(primary_result['name'])
             print('Image {} has been created.'.format(primary_image_name))
             id_list.append(primary_result.get('id'))
-            meta_lib.GCPMeta().wait_for_operation(secondary_result['name'])
+            datalab.meta_lib.GCPMeta().wait_for_operation(secondary_result['name'])
             print('Image {} has been created.'.format(secondary_image_name))
             id_list.append(secondary_result.get('id'))
             GCPActions().start_instance(instance_name, zone)
@@ -795,7 +833,7 @@
             request = self.service.images().delete(project=self.project, image=image_name)
             try:
                 result = request.execute()
-                meta_lib.GCPMeta().wait_for_operation(result['name'])
+                datalab.meta_lib.GCPMeta().wait_for_operation(result['name'])
                 print('Image {} was removed.'.format(image_name))
             except errors.HttpError as err:
                 if err.resp.status == 404:
@@ -834,7 +872,7 @@
 
     def set_bucket_owner(self, bucket_name, service_account_name, service_base_name):
         try:
-            unique_index = meta_lib.GCPMeta().get_index_by_service_account_name(service_account_name)
+            unique_index = datalab.meta_lib.GCPMeta().get_index_by_service_account_name(service_account_name)
             service_account_email = "{}-{}@{}.iam.gserviceaccount.com".format(service_base_name, unique_index,
                                                                                   self.project)
             bucket = self.storage_client.get_bucket(bucket_name)
@@ -883,11 +921,11 @@
         try:
             result = request.execute()
             time.sleep(5)
-            cluster_status = meta_lib.GCPMeta().get_list_cluster_statuses([cluster_name])
+            cluster_status = datalab.meta_lib.GCPMeta().get_list_cluster_statuses([cluster_name])
             while cluster_status[0]['status'] != 'running':
                 time.sleep(5)
                 print('The cluster is being created... Please wait')
-                cluster_status = meta_lib.GCPMeta().get_list_cluster_statuses([cluster_name])
+                cluster_status = datalab.meta_lib.GCPMeta().get_list_cluster_statuses([cluster_name])
                 if cluster_status[0]['status'] == 'terminated':
                     raise Exception
             return result
@@ -943,11 +981,11 @@
         request = self.dataproc.projects().regions().clusters().delete(projectId=self.project, region=region, clusterName=cluster_name)
         try:
             result = request.execute()
-            cluster_status = meta_lib.GCPMeta().get_list_cluster_statuses([cluster_name])
+            cluster_status = datalab.meta_lib.GCPMeta().get_list_cluster_statuses([cluster_name])
             while cluster_status[0]['status'] != 'terminated':
                 time.sleep(5)
                 print('The cluster is being terminated... Please wait')
-                cluster_status = meta_lib.GCPMeta().get_list_cluster_statuses([cluster_name])
+                cluster_status = datalab.meta_lib.GCPMeta().get_list_cluster_statuses([cluster_name])
             GCPActions().delete_dataproc_jobs(cluster_name)
             return result
         except Exception as err:
@@ -991,10 +1029,10 @@
         try:
             res = request.execute()
             print("Job ID: {}".format(res['reference']['jobId']))
-            job_status = meta_lib.GCPMeta().get_dataproc_job_status(res['reference']['jobId'])
+            job_status = datalab.meta_lib.GCPMeta().get_dataproc_job_status(res['reference']['jobId'])
             while job_status != 'done':
                 time.sleep(5)
-                job_status = meta_lib.GCPMeta().get_dataproc_job_status(res['reference']['jobId'])
+                job_status = datalab.meta_lib.GCPMeta().get_dataproc_job_status(res['reference']['jobId'])
                 if job_status in ('failed', 'error'):
                     raise Exception
             return job_status
@@ -1011,7 +1049,7 @@
 
     def delete_dataproc_jobs(self, cluster_filter):
         try:
-            jobs = meta_lib.GCPMeta().get_dataproc_jobs()
+            jobs = datalab.meta_lib.GCPMeta().get_dataproc_jobs()
             cluster_jobs_ids = [job['reference']['jobId'] for job in jobs
                                 if cluster_filter in job['placement']['clusterName']]
             for job_id in list(set(cluster_jobs_ids)):
@@ -1039,7 +1077,7 @@
         try:
             version_file = '{0}/{1}/{2}_version'.format(user_name, cluster_name, application)
             if GCPActions().get_from_bucket(bucket, version_file, '/tmp/{}_version'.format(application)):
-                with file('/tmp/{}_version'.format(application)) as f:
+                with open('/tmp/{}_version'.format(application)) as f:
                     version = f.read()
                 return version[0:5]
             else:
@@ -1058,74 +1096,72 @@
         print("Downloading jars...")
         GCPActions().get_from_bucket(args.bucket, 'jars/{0}/jars.tar.gz'.format(args.dataproc_version), '/tmp/jars.tar.gz')
         GCPActions().get_from_bucket(args.bucket, 'jars/{0}/jars-checksum.chk'.format(args.dataproc_version), '/tmp/jars-checksum.chk')
-        if 'WARNING' in local('md5sum -c /tmp/jars-checksum.chk', capture=True):
-            local('rm -f /tmp/jars.tar.gz')
+        if 'WARNING' in subprocess.run('md5sum -c /tmp/jars-checksum.chk', capture_output=True, shell=True, check=True).stdout.decode('UTF-8'):
+            subprocess.run('rm -f /tmp/jars.tar.gz', shell=True, check=True)
             GCPActions().get_from_bucket(args.bucket, 'jars/{0}/jars.tar.gz'.format(args.cluster_name), '/tmp/jars.tar.gz')
-            if 'WARNING' in local('md5sum -c /tmp/jars-checksum.chk', capture=True):
+            if 'WARNING' in subprocess.run('md5sum -c /tmp/jars-checksum.chk', capture_output=True, shell=True, check=True).stdout.decode('UTF-8'):
                 print("The checksum of jars.tar.gz is mismatched. It could be caused by gcp network issue.")
                 sys.exit(1)
-        local('tar -zhxvf /tmp/jars.tar.gz -C {}'.format(dataproc_dir))
+        subprocess.run('tar -zhxvf /tmp/jars.tar.gz -C {}'.format(dataproc_dir), shell=True, check=True)
 
     def yarn(self, args, yarn_dir):
         print("Downloading yarn configuration...")
         bucket = self.storage_client.get_bucket(args.bucket)
         list_files = bucket.list_blobs(prefix='{0}/{1}/config/'.format(args.user_name, args.cluster_name))
-        local('mkdir -p /tmp/{0}/{1}/config/'.format(args.user_name, args.cluster_name))
+        subprocess.run('mkdir -p /tmp/{0}/{1}/config/'.format(args.user_name, args.cluster_name), shell=True, check=True)
         for item in list_files:
             local_file = '/tmp/{0}/{1}/config/{2}'.format(args.user_name, args.cluster_name, item.name.split("/")[-1:][0])
             GCPActions().get_from_bucket(args.bucket, item.name, local_file)
-        local('sudo mv /tmp/{0}/{1}/config/* {2}'.format(args.user_name, args.cluster_name, yarn_dir))
-        local('sudo rm -rf /tmp/{}'.format(args.user_name))
+        subprocess.run('sudo mv /tmp/{0}/{1}/config/* {2}'.format(args.user_name, args.cluster_name, yarn_dir), shell=True, check=True)
+        subprocess.run('sudo rm -rf /tmp/{}'.format(args.user_name), shell=True, check=True)
 
     def install_dataproc_spark(self, args):
         print("Installing spark...")
         GCPActions().get_from_bucket(args.bucket, '{0}/{1}/spark.tar.gz'.format(args.user_name, args.cluster_name), '/tmp/spark.tar.gz')
         GCPActions().get_from_bucket(args.bucket, '{0}/{1}/spark-checksum.chk'.format(args.user_name, args.cluster_name), '/tmp/spark-checksum.chk')
-        if 'WARNING' in local('md5sum -c /tmp/spark-checksum.chk', capture=True):
-            local('rm -f /tmp/spark.tar.gz')
+        if 'WARNING' in subprocess.run('md5sum -c /tmp/spark-checksum.chk', capture_output=True, shell=True, check=True).stdout.decode('UTF-8'):
+            subprocess.run('rm -f /tmp/spark.tar.gz', shell=True, check=True)
             GCPActions().get_from_bucket(args.bucket, '{0}/{1}/spark.tar.gz'.format(args.user_name, args.cluster_name), '/tmp/spark.tar.gz')
-            if 'WARNING' in local('md5sum -c /tmp/spark-checksum.chk', capture=True):
+            if 'WARNING' in subprocess.run('md5sum -c /tmp/spark-checksum.chk', capture_output=True, shell=True, check=True).stdout.decode('UTF-8'):
                 print("The checksum of spark.tar.gz is mismatched. It could be caused by gcp network issue.")
                 sys.exit(1)
-        local('sudo tar -zhxvf /tmp/spark.tar.gz -C /opt/{0}/{1}/'.format(args.dataproc_version, args.cluster_name))
+        subprocess.run('sudo tar -zhxvf /tmp/spark.tar.gz -C /opt/{0}/{1}/'.format(args.dataproc_version, args.cluster_name), shell=True, check=True)
 
     def spark_defaults(self, args):
         spark_def_path = '/opt/{0}/{1}/spark/conf/spark-env.sh'.format(args.dataproc_version, args.cluster_name)
-        local(""" sudo bash -c " sed -i '/#/d' {}" """.format(spark_def_path))
-        local(""" sudo bash -c " sed -i '/^\s*$/d' {}" """.format(spark_def_path))
-        local(""" sudo bash -c " sed -i 's|/usr/lib/hadoop|/opt/{0}/jars/usr/lib/hadoop|g' {1}" """.format(args.dataproc_version, spark_def_path))
-        local(""" sudo bash -c " sed -i 's|/etc/hadoop/conf|/opt/{0}/{1}/conf|g' {2}" """.format(args.dataproc_version, args.cluster_name, spark_def_path))
-        local(""" sudo bash -c " sed -i '/\$HADOOP_HOME\/\*/a SPARK_DIST_CLASSPATH=\\"\$SPARK_DIST_CLASSPATH:\$HADOOP_HOME\/client\/*\\"' {}" """.format(spark_def_path))
-        local(""" sudo bash -c " sed -i '/\$HADOOP_YARN_HOME\/\*/a SPARK_DIST_CLASSPATH=\\"\$SPARK_DIST_CLASSPATH:\/opt\/jars\/\*\\"' {}" """.format(spark_def_path))
-        local(""" sudo bash -c " sed -i 's|/hadoop/spark/work|/tmp/hadoop/spark/work|g' {}" """.format(spark_def_path))
-        local(""" sudo bash -c " sed -i 's|/hadoop/spark/tmp|/tmp/hadoop/spark/tmp|g' {}" """.format(spark_def_path))
-        local(""" sudo bash -c " sed -i 's/STANDALONE_SPARK_MASTER_HOST.*/STANDALONE_SPARK_MASTER_HOST={0}-m/g' {1}" """.format(args.cluster_name, spark_def_path))
-        local(""" sudo bash -c " sed -i 's|/hadoop_gcs_connector_metadata_cache|/tmp/hadoop_gcs_connector_metadata_cache|g' /opt/{0}/{1}/conf/core-site.xml" """.format(args.dataproc_version, args.cluster_name))
+        subprocess.run(""" sudo bash -c " sed -i '/#/d' {}" """.format(spark_def_path), shell=True, check=True)
+        subprocess.run(""" sudo bash -c " sed -i '/^\s*$/d' {}" """.format(spark_def_path), shell=True, check=True)
+        subprocess.run(""" sudo bash -c " sed -i 's|/usr/lib/hadoop|/opt/{0}/jars/usr/lib/hadoop|g' {1}" """.format(args.dataproc_version, spark_def_path), shell=True, check=True)
+        subprocess.run(""" sudo bash -c " sed -i 's|/etc/hadoop/conf|/opt/{0}/{1}/conf|g' {2}" """.format(args.dataproc_version, args.cluster_name, spark_def_path), shell=True, check=True)
+        subprocess.run(""" sudo bash -l -c " sed -i '/\$HADOOP_HOME\/\*/a SPARK_DIST_CLASSPATH=\\"\$SPARK_DIST_CLASSPATH:\$HADOOP_HOME\/client\/*\\"' {}" """.format(spark_def_path), shell=True, check=True)
+        subprocess.run(""" sudo bash -l -c " sed -i '/\$HADOOP_YARN_HOME\/\*/a SPARK_DIST_CLASSPATH=\\"\$SPARK_DIST_CLASSPATH:\/opt\/jars\/\*\\"' {}" """.format(spark_def_path), shell=True, check=True)
+        subprocess.run(""" sudo bash -c " sed -i 's|/hadoop/spark/work|/tmp/hadoop/spark/work|g' {}" """.format(spark_def_path), shell=True, check=True)
+        subprocess.run(""" sudo bash -c " sed -i 's|/hadoop/spark/tmp|/tmp/hadoop/spark/tmp|g' {}" """.format(spark_def_path), shell=True, check=True)
+        subprocess.run(""" sudo bash -c " sed -i 's/STANDALONE_SPARK_MASTER_HOST.*/STANDALONE_SPARK_MASTER_HOST={0}-m/g' {1}" """.format(args.cluster_name, spark_def_path), shell=True, check=True)
+        subprocess.run(""" sudo bash -c " sed -i 's|/hadoop_gcs_connector_metadata_cache|/tmp/hadoop_gcs_connector_metadata_cache|g' /opt/{0}/{1}/conf/core-site.xml" """.format(args.dataproc_version, args.cluster_name), shell=True, check=True)
 
     def remove_kernels(self, notebook_name, dataproc_name, dataproc_version, ssh_user, key_path, computational_name):
         try:
-            notebook_ip = meta_lib.GCPMeta().get_private_ip_address(notebook_name)
-            env.hosts = "{}".format(notebook_ip)
-            env.user = "{}".format(ssh_user)
-            env.key_filename = "{}".format(key_path)
-            env.host_string = env.user + "@" + env.hosts
-            sudo('rm -rf /home/{}/.local/share/jupyter/kernels/*_{}'.format(ssh_user, dataproc_name))
-            if exists('/home/{}/.ensure_dir/dataengine-service_{}_interpreter_ensured'.format(ssh_user, dataproc_name)):
+            notebook_ip = datalab.meta_lib.GCPMeta().get_private_ip_address(notebook_name)
+            global con
+            con = datalab.fab.init_datalab_connection(notebook_ip, ssh_user, key_path)
+            con.sudo('rm -rf /home/{}/.local/share/jupyter/kernels/*_{}'.format(ssh_user, dataproc_name))
+            if exists(con, '/home/{}/.ensure_dir/dataengine-service_{}_interpreter_ensured'.format(ssh_user, dataproc_name)):
                 if os.environ['notebook_multiple_clusters'] == 'true':
                     try:
-                        livy_port = sudo("cat /opt/" + dataproc_version + "/" + dataproc_name
-                                         + "/livy/conf/livy.conf | grep livy.server.port | tail -n 1 | awk '{printf $3}'")
-                        process_number = sudo("netstat -natp 2>/dev/null | grep ':" + livy_port +
-                                              "' | awk '{print $7}' | sed 's|/.*||g'")
-                        sudo('kill -9 ' + process_number)
-                        sudo('systemctl disable livy-server-' + livy_port)
+                        livy_port = con.sudo("cat /opt/" + dataproc_version + "/" + dataproc_name
+                                         + "/livy/conf/livy.conf | grep livy.server.port | tail -n 1 | awk '{printf $3}'").stdout.replace('\n','')
+                        process_number = con.sudo("netstat -natp 2>/dev/null | grep ':" + livy_port +
+                                              "' | awk '{print $7}' | sed 's|/.*||g'").stdout.replace('\n','')
+                        con.sudo('kill -9 ' + process_number)
+                        con.sudo('systemctl disable livy-server-' + livy_port)
                     except:
                         print("Wasn't able to find Livy server for this EMR!")
-                sudo('sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/spark/\" /opt/zeppelin/conf/zeppelin-env.sh')
-                sudo("rm -rf /home/{}/.ensure_dir/dataengine-service_interpreter_ensure".format(ssh_user))
+                con.sudo('sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/spark/\" /opt/zeppelin/conf/zeppelin-env.sh')
+                con.sudo("rm -rf /home/{}/.ensure_dir/dataengine-service_interpreter_ensure".format(ssh_user))
                 zeppelin_url = 'http://' + notebook_ip + ':8080/api/interpreter/setting/'
-                opener = urllib2.build_opener(urllib2.ProxyHandler({}))
-                req = opener.open(urllib2.Request(zeppelin_url))
+                opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
+                req = opener.open(urllib.request.Request(zeppelin_url))
                 r_text = req.read()
                 interpreter_json = json.loads(r_text)
                 interpreter_prefix = dataproc_name
@@ -1133,25 +1169,25 @@
                     if interpreter_prefix in interpreter['name']:
                         print("Interpreter with ID: {} and name: {} will be removed from zeppelin!".format(
                             interpreter['id'], interpreter['name']))
-                        request = urllib2.Request(zeppelin_url + interpreter['id'], data='')
+                        request = urllib.request.Request(zeppelin_url + interpreter['id'], data=''.encode())
                         request.get_method = lambda: 'DELETE'
                         url = opener.open(request)
                         print(url.read())
-                sudo('chown {0}:{0} -R /opt/zeppelin/'.format(ssh_user))
-                sudo('systemctl restart zeppelin-notebook.service')
+                con.sudo('chown {0}:{0} -R /opt/zeppelin/'.format(ssh_user))
+                con.sudo('systemctl restart zeppelin-notebook.service')
                 zeppelin_restarted = False
                 while not zeppelin_restarted:
-                    sudo('sleep 5')
-                    result = sudo('nmap -p 8080 localhost | grep "closed" > /dev/null; echo $?')
+                    con.sudo('sleep 5')
+                    result = con.sudo('nmap -p 8080 localhost | grep "closed" > /dev/null; echo $?').stdout.replace('\n','')
                     result = result[:1]
                     if result == '1':
                         zeppelin_restarted = True
-                sudo('sleep 5')
-                sudo('rm -rf /home/{}/.ensure_dir/dataengine-service_{}_interpreter_ensured'.format(ssh_user, dataproc_name))
-            if exists('/home/{}/.ensure_dir/rstudio_dataengine-service_ensured'.format(ssh_user)):
-                dlab.fab.remove_rstudio_dataengines_kernel(computational_name, ssh_user)
-            sudo('rm -rf  /opt/{0}/{1}/'.format(dataproc_version, dataproc_name))
-            print("Notebook's {} kernels were removed".format(env.hosts))
+                con.sudo('sleep 5')
+                con.sudo('rm -rf /home/{}/.ensure_dir/dataengine-service_{}_interpreter_ensured'.format(ssh_user, dataproc_name))
+            if exists(con, '/home/{}/.ensure_dir/rstudio_dataengine-service_ensured'.format(ssh_user)):
+                datalab.fab.remove_rstudio_dataengines_kernel(computational_name, ssh_user)
+            con.sudo('rm -rf  /opt/{0}/{1}/'.format(dataproc_version, dataproc_name))
+            print("Notebook's {} kernels were removed".format(notebook_ip))
         except Exception as err:
             logging.info(
                 "Unable to delete dataproc kernels from notebook: " + str(err) + "\n Traceback: " + traceback.print_exc(
@@ -1169,45 +1205,45 @@
             zeppelin_restarted = False
             default_port = 8998
             GCPActions().get_cluster_app_version(bucket, user_name, cluster_name, 'python')
-            with file('/tmp/python_version') as f:
+            with open('/tmp/python_version') as f:
                 python_version = f.read()
             python_version = python_version[0:5]
             livy_port = ''
             livy_path = '/opt/{0}/{1}/livy/'.format(dataproc_version, cluster_name)
-            local('echo \"Configuring dataproc path for Zeppelin\"')
-            local('sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/{0}\/{1}\/spark/\" /opt/zeppelin/conf/zeppelin-env.sh'
-                  .format(dataproc_version, cluster_name))
-            local('sed -i \"s/^export HADOOP_CONF_DIR.*/export HADOOP_CONF_DIR=\/opt\/{0}\/{1}\/conf/\" /opt/{0}/{1}/spark/conf/spark-env.sh'
-                  .format(dataproc_version, cluster_name))
-            local('sed -i "/spark.executorEnv.PYTHONPATH/d" /opt/{0}/{1}/spark/conf/spark-defaults.conf'.format(dataproc_version, cluster_name))
-            local('sed -i "/spark.yarn.dist.files/d" /opt/{0}/{1}/spark/conf/spark-defaults.conf'.format(dataproc_version, cluster_name))
-            local('sudo chown {0}:{0} -R /opt/zeppelin/'.format(os_user))
-            local('sudo systemctl restart zeppelin-notebook.service')
+            subprocess.run('echo \"Configuring dataproc path for Zeppelin\"', shell=True, check=True)
+            subprocess.run('sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/{0}\/{1}\/spark/\" /opt/zeppelin/conf/zeppelin-env.sh'
+                  .format(dataproc_version, cluster_name), shell=True, check=True)
+            subprocess.run('sed -i \"s/^export HADOOP_CONF_DIR.*/export HADOOP_CONF_DIR=\/opt\/{0}\/{1}\/conf/\" /opt/{0}/{1}/spark/conf/spark-env.sh'
+                  .format(dataproc_version, cluster_name), shell=True, check=True)
+            subprocess.run('sed -i "/spark.executorEnv.PYTHONPATH/d" /opt/{0}/{1}/spark/conf/spark-defaults.conf'.format(dataproc_version, cluster_name), shell=True, check=True)
+            subprocess.run('sed -i "/spark.yarn.dist.files/d" /opt/{0}/{1}/spark/conf/spark-defaults.conf'.format(dataproc_version, cluster_name), shell=True, check=True)
+            subprocess.run('sudo chown {0}:{0} -R /opt/zeppelin/'.format(os_user), shell=True, check=True)
+            subprocess.run('sudo systemctl restart zeppelin-notebook.service', shell=True, check=True)
             while not zeppelin_restarted:
-                local('sleep 5')
-                result = local('sudo bash -c "nmap -p 8080 localhost | grep closed > /dev/null" ; echo $?', capture=True)
+                subprocess.run('sleep 5', shell=True, check=True)
+                result = subprocess.run('sudo bash -c "nmap -p 8080 localhost | grep closed > /dev/null" ; echo $?', capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
                 result = result[:1]
                 if result == '1':
                     zeppelin_restarted = True
-            local('sleep 5')
-            local('echo \"Configuring dataproc spark interpreter for Zeppelin\"')
+            subprocess.run('sleep 5', shell=True, check=True)
+            subprocess.run('echo \"Configuring dataproc spark interpreter for Zeppelin\"', shell=True, check=True)
             if multiple_clusters == 'true':
                 while not port_number_found:
-                    port_free = local('sudo bash -c "nmap -p ' + str(default_port) +
-                                      ' localhost | grep closed > /dev/null" ; echo $?', capture=True)
+                    port_free = subprocess.run('sudo bash -c "nmap -p ' + str(default_port) +
+                                      ' localhost | grep closed > /dev/null" ; echo $?', capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
                     port_free = port_free[:1]
                     if port_free == '0':
                         livy_port = default_port
                         port_number_found = True
                     else:
                         default_port += 1
-                local('sudo echo "livy.server.port = {0}" >> {1}conf/livy.conf'.format(str(livy_port), livy_path))
-                local('sudo echo "livy.spark.master = yarn" >> {}conf/livy.conf'.format(livy_path))
+                subprocess.run('sudo echo "livy.server.port = {0}" >> {1}conf/livy.conf'.format(str(livy_port), livy_path), shell=True, check=True)
+                subprocess.run('sudo echo "livy.spark.master = yarn" >> {}conf/livy.conf'.format(livy_path), shell=True, check=True)
                 if os.path.exists('{}conf/spark-blacklist.conf'.format(livy_path)):
-                    local('sudo sed -i "s/^/#/g" {}conf/spark-blacklist.conf'.format(livy_path))
-                local('sudo echo "export SPARK_HOME={0}" >> {1}conf/livy-env.sh'.format(spark_dir, livy_path))
-                local('sudo echo "export HADOOP_CONF_DIR={0}" >> {1}conf/livy-env.sh'.format(yarn_dir, livy_path))
-                local('sudo echo "export PYSPARK3_PYTHON=python{0}" >> {1}conf/livy-env.sh'.format(python_version[0:3], livy_path))
+                    subprocess.run('sudo sed -i "s/^/#/g" {}conf/spark-blacklist.conf'.format(livy_path), shell=True, check=True)
+                subprocess.run('sudo echo "export SPARK_HOME={0}" >> {1}conf/livy-env.sh'.format(spark_dir, livy_path), shell=True, check=True)
+                subprocess.run('sudo echo "export HADOOP_CONF_DIR={0}" >> {1}conf/livy-env.sh'.format(yarn_dir, livy_path), shell=True, check=True)
+                subprocess.run('sudo echo "export PYSPARK3_PYTHON=python{0}" >> {1}conf/livy-env.sh'.format(python_version[0:3], livy_path), shell=True, check=True)
                 template_file = "/tmp/dataengine-service_interpreter.json"
                 fr = open(template_file, 'r+')
                 text = fr.read()
@@ -1219,18 +1255,18 @@
                 fw.close()
                 for _ in range(5):
                     try:
-                        local("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
-                              "@/tmp/dataengine-service_interpreter.json http://localhost:8080/api/interpreter/setting")
+                        subprocess.run("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
+                              "@/tmp/dataengine-service_interpreter.json http://localhost:8080/api/interpreter/setting", shell=True, check=True)
                         break
                     except:
-                        local('sleep 5')
-                local('sudo cp /opt/livy-server-cluster.service /etc/systemd/system/livy-server-{}.service'.format(str(livy_port)))
-                local("sudo sed -i 's|OS_USER|{0}|' /etc/systemd/system/livy-server-{1}.service".format(os_user, str(livy_port)))
-                local("sudo sed -i 's|LIVY_PATH|{0}|' /etc/systemd/system/livy-server-{1}.service".format(livy_path, str(livy_port)))
-                local('sudo chmod 644 /etc/systemd/system/livy-server-{}.service'.format(str(livy_port)))
-                local('sudo systemctl daemon-reload')
-                local('sudo systemctl enable livy-server-{}'.format(str(livy_port)))
-                local('sudo systemctl start livy-server-{}'.format(str(livy_port)))
+                        subprocess.run('sleep 5', shell=True, check=True)
+                subprocess.run('sudo cp /opt/livy-server-cluster.service /etc/systemd/system/livy-server-{}.service'.format(str(livy_port)), shell=True, check=True)
+                subprocess.run("sudo sed -i 's|OS_USER|{0}|' /etc/systemd/system/livy-server-{1}.service".format(os_user, str(livy_port)), shell=True, check=True)
+                subprocess.run("sudo sed -i 's|LIVY_PATH|{0}|' /etc/systemd/system/livy-server-{1}.service".format(livy_path, str(livy_port)), shell=True, check=True)
+                subprocess.run('sudo chmod 644 /etc/systemd/system/livy-server-{}.service'.format(str(livy_port)), shell=True, check=True)
+                subprocess.run('sudo systemctl daemon-reload', shell=True, check=True)
+                subprocess.run('sudo systemctl enable livy-server-{}'.format(str(livy_port)), shell=True, check=True)
+                subprocess.run('sudo systemctl start livy-server-{}'.format(str(livy_port)), shell=True, check=True)
             else:
                 template_file = "/tmp/dataengine-service_interpreter.json"
                 p_versions = ["2", "{}-dp".format(python_version[:3])]
@@ -1248,44 +1284,42 @@
                     fw.close()
                     for _ in range(5):
                         try:
-                            local("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
-                                  "@/tmp/dataproc_spark_py{}_interpreter.json http://localhost:8080/api/interpreter/setting".format(p_version))
+                            subprocess.run("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
+                                  "@/tmp/dataproc_spark_py{}_interpreter.json http://localhost:8080/api/interpreter/setting".format(p_version), shell=True, check=True)
                             break
                         except:
-                            local('sleep 5')
-            local('touch /home/{0}/.ensure_dir/dataengine-service_{1}_interpreter_ensured'.format(os_user, cluster_name))
+                            subprocess.run('sleep 5', shell=True, check=True)
+            subprocess.run('touch /home/{0}/.ensure_dir/dataengine-service_{1}_interpreter_ensured'.format(os_user, cluster_name), shell=True, check=True)
         except:
             sys.exit(1)
 
     def install_python(self, bucket, user_name, cluster_name, application, numpy_version='1.14.3'):
         try:
             GCPActions().get_cluster_app_version(bucket, user_name, cluster_name, 'python')
-            with file('/tmp/python_version') as f:
+            with open('/tmp/python_version') as f:
                 python_version = f.read()
             python_version = python_version[0:5]
             if not os.path.exists('/opt/python/python{}'.format(python_version)):
-                local('wget https://www.python.org/ftp/python/{0}/Python-{0}.tgz -O /tmp/Python-{0}.tgz'.format(python_version))
-                local('tar zxvf /tmp/Python-{}.tgz -C /tmp/'.format(python_version))
-                with lcd('/tmp/Python-{}'.format(python_version)):
-                    local('./configure --prefix=/opt/python/python{} --with-zlib-dir=/usr/local/lib/ --with-ensurepip=install'.format(python_version))
-                    local('sudo make altinstall')
-                with lcd('/tmp/'):
-                    local('sudo rm -rf Python-{}/'.format(python_version))
-                local('sudo -i virtualenv /opt/python/python{}'.format(python_version))
-                venv_command = '/bin/bash /opt/python/python{}/bin/activate'.format(python_version)
+                subprocess.run('wget https://www.python.org/ftp/python/{0}/Python-{0}.tgz -O /tmp/Python-{0}.tgz'.format(python_version), shell=True, check=True)
+                subprocess.run('tar zxvf /tmp/Python-{}.tgz -C /tmp/'.format(python_version), shell=True, check=True)
+                subprocess.run('cd /tmp/Python-{0}; ./configure --prefix=/opt/python/python{0} --with-zlib-dir=/usr/local/lib/ --with-ensurepip=install'.format(python_version), shell=True, check=True)
+                subprocess.run('cd /tmp/Python-{}; sudo make altinstall'.format(python_version), shell=True, check=True)
+                subprocess.run('cd /tmp/; sudo rm -rf Python-{}/'.format(python_version), shell=True, check=True)
+                subprocess.run('sudo -i virtualenv /opt/python/python{}'.format(python_version), shell=True, check=True)
+                venv_command = 'source /opt/python/python{}/bin/activate'.format(python_version)
                 pip_command = '/opt/python/python{0}/bin/pip{1}'.format(python_version, python_version[:3])
-                local('{0} && sudo -i {1} install -U pip==9.0.3'.format(venv_command, pip_command))
-                local('{0} && sudo -i {1} install pyzmq==17.0.0'.format(venv_command, pip_command))
-                local('{0} && sudo -i {1} install ipython ipykernel --no-cache-dir'.format(venv_command, pip_command))
-                local('{0} && sudo -i {1} install boto boto3 NumPy=={2} SciPy Matplotlib pandas Sympy Pillow sklearn --no-cache-dir'
-                      .format(venv_command, pip_command, numpy_version))
+                subprocess.run('{0} && sudo -i {1} install -U pip==9.0.3'.format(venv_command, pip_command), shell=True, check=True)
+                subprocess.run('{0} && sudo -i {1} install pyzmq==17.0.0'.format(venv_command, pip_command), shell=True, check=True)
+                subprocess.run('{0} && sudo -i {1} install ipython ipykernel --no-cache-dir'.format(venv_command, pip_command), shell=True, check=True)
+                subprocess.run('{0} && sudo -i {1} install boto boto3 NumPy=={2} SciPy Matplotlib pandas Sympy Pillow sklearn --no-cache-dir'
+                      .format(venv_command, pip_command, numpy_version), shell=True, check=True)
                 if application == 'deeplearning':
-                    local('{0} && sudo -i {1} install mxnet-cu80 opencv-python keras Theano --no-cache-dir'.format(venv_command, pip_command))
+                    subprocess.run('{0} && sudo -i {1} install mxnet-cu80 opencv-python keras Theano --no-cache-dir'.format(venv_command, pip_command), shell=True, check=True)
                     python_without_dots = python_version.replace('.', '')
-                    local('{0} && sudo -i {1} install  https://cntk.ai/PythonWheel/GPU/cntk-2.0rc3-cp{2}-cp{2}m-linux_x86_64.whl --no-cache-dir'
-                          .format(venv_command, pip_command, python_without_dots[:2]))
-                local('sudo rm -rf /usr/bin/python{}-dp'.format(python_version[0:3]))
-                local('sudo ln -fs /opt/python/python{0}/bin/python{1} /usr/bin/python{1}-dp'.format(python_version, python_version[0:3]))
+                    subprocess.run('{0} && sudo -i {1} install  https://cntk.ai/PythonWheel/GPU/cntk-2.0rc3-cp{2}-cp{2}m-linux_x86_64.whl --no-cache-dir'
+                          .format(venv_command, pip_command, python_without_dots[:2]), shell=True, check=True)
+                subprocess.run('sudo rm -rf /usr/bin/python{}-dp'.format(python_version[0:3]), shell=True, check=True)
+                subprocess.run('sudo ln -fs /opt/python/python{0}/bin/python{1} /usr/bin/python{1}-dp'.format(python_version, python_version[0:3]), shell=True, check=True)
         except Exception as err:
             logging.info(
                 "Unable to install python: " + str(err) + "\n Traceback: " + traceback.print_exc(
@@ -1298,22 +1332,22 @@
 
 
 def ensure_local_jars(os_user, jars_dir):
-    if not exists('/home/{}/.ensure_dir/gs_kernel_ensured'.format(os_user)):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/gs_kernel_ensured'.format(os_user)):
         try:
             templates_dir = '/root/templates/'
-            sudo('mkdir -p {}'.format(jars_dir))
-            sudo('wget https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-hadoop2-{0}.jar -O {1}'
+            datalab.fab.conn.sudo('mkdir -p {}'.format(jars_dir))
+            datalab.fab.conn.sudo('wget https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-hadoop2-{0}.jar -O {1}'
                  'gcs-connector-hadoop2-{0}.jar'.format(os.environ['notebook_gcs_connector_version'], jars_dir))
-            sudo('wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-yarn-server-web-proxy/2.7.4/{0} -O {1}{0}'
+            datalab.fab.conn.sudo('wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-yarn-server-web-proxy/2.7.4/{0} -O {1}{0}'
                  .format('hadoop-yarn-server-web-proxy-2.7.4.jar', jars_dir))
-            put(templates_dir + 'core-site.xml', '/tmp/core-site.xml')
-            sudo('sed -i "s|GCP_PROJECT_ID|{}|g" /tmp/core-site.xml'.format(os.environ['gcp_project_id']))
-            sudo('mv /tmp/core-site.xml /opt/spark/conf/core-site.xml')
-            put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/notebook_spark-defaults_local.conf')
+            datalab.fab.conn.put(templates_dir + 'core-site.xml', '/tmp/core-site.xml')
+            datalab.fab.conn.sudo('sed -i "s|GCP_PROJECT_ID|{}|g" /tmp/core-site.xml'.format(os.environ['gcp_project_id']))
+            datalab.fab.conn.sudo('mv /tmp/core-site.xml /opt/spark/conf/core-site.xml')
+            datalab.fab.conn.put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/notebook_spark-defaults_local.conf')
             if os.environ['application'] == 'zeppelin':
-                sudo('echo \"spark.jars $(ls -1 ' + jars_dir + '* | tr \'\\n\' \',\')\" >> /tmp/notebook_spark-defaults_local.conf')
-            sudo('\cp /tmp/notebook_spark-defaults_local.conf /opt/spark/conf/spark-defaults.conf')
-            sudo('touch /home/{}/.ensure_dir/gs_kernel_ensured'.format(os_user))
+                datalab.fab.conn.run('echo \"spark.jars $(ls -1 ' + jars_dir + '* | tr \'\\n\' \',\')\" >> /tmp/notebook_spark-defaults_local.conf')
+            datalab.fab.conn.sudo('\cp /tmp/notebook_spark-defaults_local.conf /opt/spark/conf/spark-defaults.conf')
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/gs_kernel_ensured'.format(os_user))
         except Exception as err:
             print('Error:', str(err))
             sys.exit(1)
@@ -1334,26 +1368,26 @@
 
 
 def prepare_disk(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/disk_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/disk_ensured'):
         try:
-            disk_name = sudo("lsblk | grep disk | awk '{print $1}' | sort | tail -n 1")
-            sudo('''bash -c 'echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/{}' '''.format(disk_name))
-            sudo('mkfs.ext4 -F /dev/{}1'.format(disk_name))
-            sudo('mount /dev/{}1 /opt/'.format(disk_name))
-            sudo(''' bash -c "echo '/dev/{}1 /opt/ ext4 errors=remount-ro 0 1' >> /etc/fstab" '''.format(disk_name))
-            sudo('touch /home/' + os_user + '/.ensure_dir/disk_ensured')
+            disk_name = datalab.fab.conn.sudo("lsblk | grep disk | awk '{print $1}' | sort | tail -n 1").stdout.replace('\n','')
+            datalab.fab.conn.sudo('''bash -c 'echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/{}' '''.format(disk_name))
+            datalab.fab.conn.sudo('mkfs.ext4 -F /dev/{}1'.format(disk_name))
+            datalab.fab.conn.sudo('mount /dev/{}1 /opt/'.format(disk_name))
+            datalab.fab.conn.sudo(''' bash -c "echo '/dev/{}1 /opt/ ext4 errors=remount-ro 0 1' >> /etc/fstab" '''.format(disk_name))
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/disk_ensured')
         except:
             sys.exit(1)
 
 
 def ensure_local_spark(os_user, spark_link, spark_version, hadoop_version, local_spark_path):
-    if not exists('/home/' + os_user + '/.ensure_dir/local_spark_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/local_spark_ensured'):
         try:
-            sudo('wget ' + spark_link + ' -O /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz')
-            sudo('tar -zxvf /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz -C /opt/')
-            sudo('mv /opt/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' + local_spark_path)
-            sudo('chown -R ' + os_user + ':' + os_user + ' ' + local_spark_path)
-            sudo('touch /home/' + os_user + '/.ensure_dir/local_spark_ensured')
+            datalab.fab.conn.sudo('wget ' + spark_link + ' -O /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz')
+            datalab.fab.conn.sudo('tar -zxvf /tmp/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz -C /opt/')
+            datalab.fab.conn.sudo('mv /opt/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' + local_spark_path)
+            datalab.fab.conn.sudo('chown -R ' + os_user + ':' + os_user + ' ' + local_spark_path)
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/local_spark_ensured')
         except Exception as err:
             print('Error:', str(err))
             sys.exit(1)
@@ -1363,25 +1397,29 @@
     try:
         # Checking if spark.jars parameter was generated previously
         spark_jars_paths = None
-        if exists('/opt/spark/conf/spark-defaults.conf'):
+        if exists(datalab.fab.conn, '/opt/spark/conf/spark-defaults.conf'):
             try:
-                spark_jars_paths = sudo('cat /opt/spark/conf/spark-defaults.conf | grep -e "^spark.jars " ')
+                spark_jars_paths = datalab.fab.conn.sudo('cat /opt/spark/conf/spark-defaults.conf | grep -e "^spark.jars " ').stdout.replace('\n','')
             except:
                 spark_jars_paths = None
-        put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/notebook_spark-defaults_local.conf')
+        datalab.fab.conn.put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/notebook_spark-defaults_local.conf')
         if os.environ['application'] == 'zeppelin':
-            sudo('echo \"spark.jars $(ls -1 ' + jars_dir + '* | tr \'\\n\' \',\')\" >> /tmp/notebook_spark-defaults_local.conf')
-        sudo('\cp -f /tmp/notebook_spark-defaults_local.conf /opt/spark/conf/spark-defaults.conf')
+            datalab.fab.conn.run('echo \"spark.jars $(ls -1 ' + jars_dir + '* | tr \'\\n\' \',\')\" >> /tmp/notebook_spark-defaults_local.conf')
+        datalab.fab.conn.sudo('\cp -f /tmp/notebook_spark-defaults_local.conf /opt/spark/conf/spark-defaults.conf')
         if memory_type == 'driver':
-            spark_memory = dlab.fab.get_spark_memory()
-            sudo('sed -i "/spark.*.memory/d" /opt/spark/conf/spark-defaults.conf')
-            sudo('echo "spark.{0}.memory {1}m" >> /opt/spark/conf/spark-defaults.conf'.format(memory_type,
-                                                                                              spark_memory))
+            spark_memory = datalab.fab.get_spark_memory()
+            datalab.fab.conn.sudo('sed -i "/spark.*.memory/d" /opt/spark/conf/spark-defaults.conf')
+            datalab.fab.conn.sudo('''bash -c 'echo "spark.{0}.memory {1}m" >> /opt/spark/conf/spark-defaults.conf' '''
+                                  .format(memory_type, spark_memory))
+        if not exists(datalab.fab.conn,'/opt/spark/conf/spark-env.sh'):
+            datalab.fab.conn.sudo('mv /opt/spark/conf/spark-env.sh.template /opt/spark/conf/spark-env.sh')
+        java_home = datalab.fab.conn.run("update-alternatives --query java | grep -o --color=never \'/.*/java-8.*/jre\'").stdout.splitlines()[0]
+        datalab.fab.conn.sudo('''bash -l -c 'echo "export JAVA_HOME={}" >> /opt/spark/conf/spark-env.sh' '''.format(java_home))
         if 'spark_configurations' in os.environ:
-            dlab_header = sudo('cat /tmp/notebook_spark-defaults_local.conf | grep "^#"')
+            datalab_header = datalab.fab.conn.sudo('cat /tmp/notebook_spark-defaults_local.conf | grep "^#"').stdout
             spark_configurations = ast.literal_eval(os.environ['spark_configurations'])
             new_spark_defaults = list()
-            spark_defaults = sudo('cat /opt/spark/conf/spark-defaults.conf')
+            spark_defaults = datalab.fab.conn.sudo('cat /opt/spark/conf/spark-defaults.conf').stdout
             current_spark_properties = spark_defaults.split('\n')
             for param in current_spark_properties:
                 if param.split(' ')[0] != '#':
@@ -1394,13 +1432,12 @@
                                     new_spark_defaults.append(property + ' ' + config['Properties'][property])
                     new_spark_defaults.append(param)
             new_spark_defaults = set(new_spark_defaults)
-            sudo("echo '{}' > /opt/spark/conf/spark-defaults.conf".format(dlab_header))
+            datalab.fab.conn.sudo('''bash -c 'echo "{}" > /opt/spark/conf/spark-defaults.conf' '''.format(datalab_header))
             for prop in new_spark_defaults:
-                prop = prop.rstrip()
-                sudo('echo "{}" >> /opt/spark/conf/spark-defaults.conf'.format(prop))
-            sudo('sed -i "/^\s*$/d" /opt/spark/conf/spark-defaults.conf')
+                datalab.fab.conn.sudo('''bash -c 'echo "{}" >> /opt/spark/conf/spark-defaults.conf' '''.format(prop))
+            datalab.fab.conn.sudo('sed -i "/^\s*$/d" /opt/spark/conf/spark-defaults.conf')
             if spark_jars_paths:
-                sudo('echo "{}" >> /opt/spark/conf/spark-defaults.conf'.format(spark_jars_paths))
+                datalab.fab.conn.sudo('''bash -c 'echo "{}" >> /opt/spark/conf/spark-defaults.conf' '''.format(spark_jars_paths))
     except Exception as err:
         print('Error:', str(err))
         sys.exit(1)
@@ -1409,29 +1446,27 @@
 def remove_dataengine_kernels(notebook_name, os_user, key_path, cluster_name):
     try:
         computational_name = os.environ['computational_name'].replace('_', '-').lower()
-        private = meta_lib.get_instance_private_ip_address(cluster_name, notebook_name)
-        env.hosts = "{}".format(private)
-        env.user = "{}".format(os_user)
-        env.key_filename = "{}".format(key_path)
-        env.host_string = env.user + "@" + env.hosts
-        sudo('rm -rf /home/{}/.local/share/jupyter/kernels/*_{}'.format(os_user, cluster_name))
-        if exists('/home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name)):
+        private = datalab.meta_lib.get_instance_private_ip_address(cluster_name, notebook_name)
+        global con
+        con = datalab.fab.init_datalab_connection(private, os_user, key_path)
+        con.sudo('rm -rf /home/{}/.local/share/jupyter/kernels/*_{}'.format(os_user, cluster_name))
+        if exists(con, '/home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name)):
             if os.environ['notebook_multiple_clusters'] == 'true':
                 try:
-                    livy_port = sudo("cat /opt/" + cluster_name +
-                                     "/livy/conf/livy.conf | grep livy.server.port | tail -n 1 | awk '{printf $3}'")
-                    process_number = sudo("netstat -natp 2>/dev/null | grep ':" + livy_port +
-                                          "' | awk '{print $7}' | sed 's|/.*||g'")
-                    sudo('kill -9 ' + process_number)
-                    sudo('systemctl disable livy-server-' + livy_port)
+                    livy_port = con.sudo("cat /opt/" + cluster_name +
+                                     "/livy/conf/livy.conf | grep livy.server.port | tail -n 1 | awk '{printf $3}'").stdout.replace('\n','')
+                    process_number = con.sudo("netstat -natp 2>/dev/null | grep ':" + livy_port +
+                                          "' | awk '{print $7}' | sed 's|/.*||g'").stdout.replace('\n','')
+                    con.sudo('kill -9 ' + process_number)
+                    con.sudo('systemctl disable livy-server-' + livy_port)
                 except:
                     print("Wasn't able to find Livy server for this EMR!")
-            sudo(
+            con.sudo(
                 'sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/spark/\" /opt/zeppelin/conf/zeppelin-env.sh')
-            sudo("rm -rf /home/{}/.ensure_dir/dataengine_interpreter_ensure".format(os_user))
+            con.sudo("rm -rf /home/{}/.ensure_dir/dataengine_interpreter_ensure".format(os_user))
             zeppelin_url = 'http://' + private + ':8080/api/interpreter/setting/'
-            opener = urllib2.build_opener(urllib2.ProxyHandler({}))
-            req = opener.open(urllib2.Request(zeppelin_url))
+            opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
+            req = opener.open(urllib.request.Request(zeppelin_url))
             r_text = req.read()
             interpreter_json = json.loads(r_text)
             interpreter_prefix = cluster_name
@@ -1439,27 +1474,27 @@
                 if interpreter_prefix in interpreter['name']:
                     print("Interpreter with ID: {} and name: {} will be removed from zeppelin!".format(
                         interpreter['id'], interpreter['name']))
-                    request = urllib2.Request(zeppelin_url + interpreter['id'], data='')
+                    request = urllib.request.Request(zeppelin_url + interpreter['id'], data=''.encode())
                     request.get_method = lambda: 'DELETE'
                     url = opener.open(request)
                     print(url.read())
-            sudo('chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin/')
-            sudo('systemctl daemon-reload')
-            sudo("service zeppelin-notebook stop")
-            sudo("service zeppelin-notebook start")
+            con.sudo('chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin/')
+            con.sudo('systemctl daemon-reload')
+            con.sudo("service zeppelin-notebook stop")
+            con.sudo("service zeppelin-notebook start")
             zeppelin_restarted = False
             while not zeppelin_restarted:
-                sudo('sleep 5')
-                result = sudo('nmap -p 8080 localhost | grep "closed" > /dev/null; echo $?')
+                con.sudo('sleep 5')
+                result = con.sudo('nmap -p 8080 localhost | grep "closed" > /dev/null; echo $?').stdout
                 result = result[:1]
                 if result == '1':
                     zeppelin_restarted = True
-            sudo('sleep 5')
-            sudo('rm -rf /home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name))
-        if exists('/home/{}/.ensure_dir/rstudio_dataengine_ensured'.format(os_user)):
-            dlab.fab.remove_rstudio_dataengines_kernel(computational_name, os_user)
-        sudo('rm -rf  /opt/' + cluster_name + '/')
-        print("Notebook's {} kernels were removed".format(env.hosts))
+            con.sudo('sleep 5')
+            con.sudo('rm -rf /home/{}/.ensure_dir/dataengine_{}_interpreter_ensured'.format(os_user, cluster_name))
+        if exists(con, '/home/{}/.ensure_dir/rstudio_dataengine_ensured'.format(os_user)):
+            datalab.fab.remove_rstudio_dataengines_kernel(computational_name, os_user)
+        con.sudo('rm -rf  /opt/' + cluster_name + '/')
+        print("Notebook's {} kernels were removed".format(private))
     except Exception as err:
         logging.info("Unable to remove kernels on Notebook: " + str(err) + "\n Traceback: " + traceback.print_exc(
             file=sys.stdout))
@@ -1469,31 +1504,33 @@
 
 
 def install_dataengine_spark(cluster_name, spark_link, spark_version, hadoop_version, cluster_dir, os_user, datalake_enabled):
-    local('wget ' + spark_link + ' -O /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz')
-    local('tar -zxvf /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz -C /opt/')
-    local('mv /opt/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' + cluster_dir + 'spark/')
-    local('chown -R ' + os_user + ':' + os_user + ' ' + cluster_dir + 'spark/')
+    subprocess.run('wget ' + spark_link + ' -O /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz', shell=True, check=True)
+    subprocess.run('tar -zxvf /tmp/' + cluster_name + '/spark-' + spark_version + '-bin-hadoop' + hadoop_version + '.tgz -C /opt/', shell=True, check=True)
+    subprocess.run('mv /opt/spark-' + spark_version + '-bin-hadoop' + hadoop_version + ' ' + cluster_dir + 'spark/', shell=True, check=True)
+    subprocess.run('chown -R ' + os_user + ':' + os_user + ' ' + cluster_dir + 'spark/', shell=True, check=True)
 
 
 def configure_dataengine_spark(cluster_name, jars_dir, cluster_dir, datalake_enabled, spark_configs=''):
-    local("jar_list=`find {0} -name '*.jar' | tr '\\n' ',' | sed 's/,$//'` ; echo \"spark.jars $jar_list\" >> \
-          /tmp/{1}/notebook_spark-defaults_local.conf".format(jars_dir, cluster_name))
+    subprocess.run("jar_list=`find {0} -name '*.jar' | tr '\\n' ',' | sed 's/,$//'` ; echo \"spark.jars $jar_list\" >> \
+          /tmp/{1}/notebook_spark-defaults_local.conf".format(jars_dir, cluster_name), shell=True, check=True)
     if os.path.exists('{0}spark/conf/spark-defaults.conf'.format(cluster_dir)):
-        additional_spark_properties = local('diff --changed-group-format="%>" --unchanged-group-format="" '
+        additional_spark_properties = subprocess.run('diff --changed-group-format="%>" --unchanged-group-format="" '
                                             '/tmp/{0}/notebook_spark-defaults_local.conf '
                                             '{1}spark/conf/spark-defaults.conf | grep -v "^#"'.format(
-                                             cluster_name, cluster_dir), capture=True)
+                                             cluster_name, cluster_dir), capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
         for property in additional_spark_properties.split('\n'):
-            local('echo "{0}" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(property, cluster_name))
-    local('cp -f /tmp/{0}/notebook_spark-defaults_local.conf  {1}spark/conf/spark-defaults.conf'.format(cluster_name,
-                                                                                                        cluster_dir))
-    local('cp -f /opt/spark/conf/core-site.xml {}spark/conf/'.format(cluster_dir))
-    if spark_configs:
-        dlab_header = local('cat /tmp/{0}/notebook_spark-defaults_local.conf | grep "^#"'.format(cluster_name),
-                            capture=True)
+            subprocess.run('echo "{0}" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(property, cluster_name), shell=True, check=True)
+    if os.path.exists('{0}'.format(cluster_dir)):
+        subprocess.run('cp -f /tmp/{0}/notebook_spark-defaults_local.conf  {1}spark/conf/spark-defaults.conf'.format(cluster_name,
+                                                                                                        cluster_dir), shell=True, check=True)
+    if os.path.exists('{0}'.format(cluster_dir)):
+        subprocess.run('cp -f /opt/spark/conf/core-site.xml {}spark/conf/'.format(cluster_dir), shell=True, check=True)
+    if spark_configs and os.path.exists('{0}'.format(cluster_dir)):
+        datalab_header = subprocess.run('cat /tmp/{0}/notebook_spark-defaults_local.conf | grep "^#"'.format(cluster_name),
+                               capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
         spark_configurations = ast.literal_eval(spark_configs)
         new_spark_defaults = list()
-        spark_defaults = local('cat {0}spark/conf/spark-defaults.conf'.format(cluster_dir), capture=True)
+        spark_defaults = subprocess.run('cat {0}spark/conf/spark-defaults.conf'.format(cluster_dir), capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
         current_spark_properties = spark_defaults.split('\n')
         for param in current_spark_properties:
             if param.split(' ')[0] != '#':
@@ -1506,11 +1543,11 @@
                                 new_spark_defaults.append(property + ' ' + config['Properties'][property])
                 new_spark_defaults.append(param)
         new_spark_defaults = set(new_spark_defaults)
-        local("echo '{0}' > {1}/spark/conf/spark-defaults.conf".format(dlab_header, cluster_dir))
+        subprocess.run("echo '{0}' > {1}/spark/conf/spark-defaults.conf".format(datalab_header, cluster_dir), shell=True, check=True)
         for prop in new_spark_defaults:
             prop = prop.rstrip()
-            local('echo "{0}" >> {1}/spark/conf/spark-defaults.conf'.format(prop, cluster_dir))
-        local('sed -i "/^\s*$/d" {0}/spark/conf/spark-defaults.conf'.format(cluster_dir))
+            subprocess.run('echo "{0}" >> {1}/spark/conf/spark-defaults.conf'.format(prop, cluster_dir), shell=True, check=True)
+        subprocess.run('sed -i "/^\s*$/d" {0}/spark/conf/spark-defaults.conf'.format(cluster_dir), shell=True, check=True)
 
 
 def find_des_jars(all_jars, des_path):
diff --git a/infrastructure-provisioning/src/general/lib/gcp/meta_lib.py b/infrastructure-provisioning/src/general/lib/gcp/meta_lib.py
index cc16028..be5d17b 100644
--- a/infrastructure-provisioning/src/general/lib/gcp/meta_lib.py
+++ b/infrastructure-provisioning/src/general/lib/gcp/meta_lib.py
@@ -19,19 +19,21 @@
 #
 # ******************************************************************************
 
-from pprint import pprint
-from googleapiclient.discovery import build
-from google.cloud import storage
-from google.cloud import exceptions
-import google.auth
-from dlab.fab import *
-import actions_lib
-import os, re
-from googleapiclient import errors
-import logging
-import traceback
-import sys, time
 import backoff
+import google.auth
+import logging
+import os
+import re
+import sys
+import time
+import traceback
+import subprocess
+from fabric import *
+from datalab.fab import *
+from google.cloud import exceptions
+from google.cloud import storage
+from googleapiclient import errors
+from googleapiclient.discovery import build
 
 
 class GCPMeta:
@@ -157,6 +159,25 @@
                                    file=sys.stdout)}))
             traceback.print_exc(file=sys.stdout)
 
+    def get_route(self, route_name):
+        request = self.service.routes().get(
+            project=self.project,
+            route=route_name)
+        try:
+            return request.execute()
+        except errors.HttpError as err:
+            if err.resp.status == 404:
+                return ''
+            else:
+                raise err
+        except Exception as err:
+            logging.info(
+                "Unable to get Route: " + str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout))
+            append_result(str({"error": "Unable to get Route",
+                               "error_message": str(err) + "\n Traceback: " + traceback.print_exc(
+                                   file=sys.stdout)}))
+            traceback.print_exc(file=sys.stdout)
+
     def get_bucket(self, bucket_name):
         try:
             bucket = self.storage_client.get_bucket(bucket_name)
@@ -373,6 +394,23 @@
                                "error_message": str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout)}))
             traceback.print_exc(file=sys.stdout)
 
+    def get_deeplearning_image_by_family(self, family_name):
+        try:
+            request = self.service.images().getFromFamily(project='deeplearning-platform-release', family=family_name)
+            try:
+                return request.execute()
+            except errors.HttpError as err:
+                if err.resp.status == 404:
+                    return ''
+                else:
+                    raise err
+        except Exception as err:
+            logging.info("Error with getting image by family: " + str(err) + "\n Traceback: " + traceback.print_exc(
+                file=sys.stdout))
+            append_result(str({"error": "Error with getting image by family",
+                               "error_message": str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout)}))
+            traceback.print_exc(file=sys.stdout)
+
     def get_disk(self, disk_name):
         try:
             request = self.service.disks().get(project=self.project, zone=os.environ['gcp_zone'], disk=disk_name)
@@ -561,6 +599,25 @@
             traceback.print_exc(file=sys.stdout)
             return ''
 
+    def get_list_gpu_types(self, zone):
+        try:
+            print('Getting available GPU types')
+            data = []
+            request = self.service.acceleratorTypes().list(project=self.project, zone=zone)
+            result = request.execute().get('items')
+            for id in result:
+                gpu_accelerator_type = id.get('name')
+                if not re.search("vws", gpu_accelerator_type):
+                    data.append(gpu_accelerator_type)
+            return data
+        except Exception as err:
+            logging.info("Error with getting list of GPU types: " + str(err) + "\n Traceback: " + traceback.print_exc(
+                file=sys.stdout))
+            append_result(str({"error": "Error with getting list of GPU types",
+                               "error_message": str(err) + "\n Traceback: " + traceback.print_exc(file=sys.stdout)}))
+            traceback.print_exc(file=sys.stdout)
+            return ''
+
     def get_list_static_addresses(self, region, filter_string=''):
         try:
             if not filter_string:
@@ -704,7 +761,7 @@
                 '/response/.emr_creating_' + os.environ['exploratory_name']) or self.get_not_configured_dataproc(
                 os.environ['notebook_instance_name']):
             with hide('stderr', 'running', 'warnings'):
-                local("echo 'Some Dataproc cluster is still being created/terminated, waiting..'")
+                subprocess.run("echo 'Some Dataproc cluster is still being created/terminated, waiting..'", shell=True, check=True)
             time.sleep(60)
             self.dataproc_waiter(labels)
         else:
diff --git a/infrastructure-provisioning/src/general/lib/os/debian/common_lib.py b/infrastructure-provisioning/src/general/lib/os/debian/common_lib.py
index c70e9a9..29b504b 100644
--- a/infrastructure-provisioning/src/general/lib/os/debian/common_lib.py
+++ b/infrastructure-provisioning/src/general/lib/os/debian/common_lib.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,62 +21,102 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 import sys
 import os
 import time
-
+import subprocess
+import datalab.fab
 
 def manage_pkg(command, environment, requisites):
     try:
-        attempt = 0
-        installed = False
-        while not installed:
-            print('Pkg installation attempt: {}'.format(attempt))
-            if attempt > 60:
+        allow = False
+        counter = 0
+        while not allow:
+            if counter > 60:
                 print("Notebook is broken please recreate it.")
                 sys.exit(1)
             else:
-                try:
-                    allow = False
-                    counter = 0
-                    while not allow:
-                        if counter > 60:
-                            print("Notebook is broken please recreate it.")
-                            sys.exit(1)
-                        else:
-                            print('Package manager is:')
-                            if environment == 'remote':
-                                if sudo('pgrep "^apt" -a && echo "busy" || echo "ready"') == 'busy':
-                                    counter += 1
-                                    time.sleep(10)
-                                else:
-                                    allow = True
-                                    sudo('apt-get {0} {1}'.format(command, requisites))
-                            elif environment == 'local':
-                                if local('sudo pgrep "^apt" -a && echo "busy" || echo "ready"', capture=True) == 'busy':
-                                    counter += 1
-                                    time.sleep(10)
-                                else:
-                                    allow = True
-                                    local('sudo apt-get {0} {1}'.format(command, requisites), capture=True)
-                            else:
-                                print('Wrong environment')
-                    installed = True
-                except:
-                    print("Will try to install with nex attempt.")
-                    sudo('dpkg --configure -a')
-                    attempt += 1
+                print('Package manager is:')
+                if environment == 'remote':
+                    if datalab.fab.conn.sudo('pgrep "^apt" -a && echo "busy" || echo "ready"') == 'busy' or datalab.fab.conn.sudo('pgrep "^dpkg" -a && echo "busy" || echo "ready"') == 'busy':
+                        counter += 1
+                        time.sleep(10)
+                    else:
+                        try:
+                            error_parser = "frontend is locked|locked|not get lock|unavailable"
+
+                            datalab.fab.conn.sudo('dpkg --configure -a 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({0})" /tmp/tee.tmp > '
+                                                  '/tmp/dpkg.log; then echo "no_error" > /tmp/dpkg.log;fi'.format(error_parser))
+                            err = datalab.fab.conn.sudo('cat /tmp/dpkg.log').stdout.replace('\n','')
+                            count = 0
+                            while 'no_error' not in err and count < 10:
+                                pid = datalab.fab.conn.sudo('lsof /var/lib/dpkg/lock-frontend | grep dpkg | awk \'{print $2}\'').stdout.replace('\n','')
+                                if pid != '':
+                                    datalab.fab.conn.sudo('kill -9 {}'.format(pid))
+                                    datalab.fab.conn.sudo('rm -f /var/lib/dpkg/lock-frontend')
+                                    pid = datalab.fab.conn.sudo('lsof /var/lib/dpkg/lock | grep dpkg | awk \'{print $2}\'').stdout.replace('\n','')
+                                if pid != '':
+                                    datalab.fab.conn.sudo('kill -9 {}'.format(pid))
+                                    datalab.fab.conn.sudo('rm -f /var/lib/dpkg/lock')
+                                datalab.fab.conn.sudo('dpkg --configure -a 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({0})" /tmp/tee.tmp > '
+                                     '/tmp/dpkg.log; then echo "no_error" > /tmp/dpkg.log;fi'.format(error_parser))
+                                err = datalab.fab.conn.sudo('cat /tmp/dpkg.log').stdout
+                                count = count + 1
+
+                            datalab.fab.conn.sudo('apt update 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({0})" /tmp/tee.tmp > '
+                                 '/tmp/apt.log; then echo "no_error" > /tmp/apt.log;fi'.format(error_parser))
+                            err = datalab.fab.conn.sudo('cat /tmp/apt.log').stdout
+                            count = 0
+                            while 'no_error' not in err and count < 10:
+                                pid = datalab.fab.conn.sudo('lsof /var/lib/apt/lists/lock | grep apt | awk \'{print $2}\'').stdout.replace('\n','')
+                                if pid != '':
+                                    datalab.fab.conn.sudo('kill -9 {}'.format(pid))
+                                    datalab.fab.conn.sudo('rm -f /var/lib/apt/lists/lock')
+                                datalab.fab.conn.sudo('apt update 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({0})" /tmp/tee.tmp > '
+                                 '/tmp/apt.log; then echo "" > /tmp/apt.log;fi'.format(error_parser))
+                                err = datalab.fab.conn.sudo('cat /tmp/apt.log').stdout
+                                count = count + 1
+
+                            datalab.fab.conn.sudo('apt-get {0} {1} 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({2})" /tmp/tee.tmp > '
+                                 '/tmp/apt-get.log; then echo "no_error" > /tmp/apt-get.log;fi'.format(command, requisites, error_parser))
+                            err = datalab.fab.conn.sudo('cat /tmp/apt-get.log').stdout
+                            count = 0
+                            while 'no_error' not in err and count < 10:
+                                datalab.fab.conn.sudo('lsof /var/lib/dpkg/lock')
+                                datalab.fab.conn.sudo('lsof /var/lib/apt/lists/lock')
+                                datalab.fab.conn.sudo('lsof /var/cache/apt/archives/lock')
+                                datalab.fab.conn.sudo('rm -f /var/lib/apt/lists/lock')
+                                datalab.fab.conn.sudo('rm -f /var/cache/apt/archives/lock')
+                                datalab.fab.conn.sudo('rm -f /var/lib/dpkg/lock')
+                                datalab.fab.conn.sudo('apt-get {0} {1} 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E "({2})" /tmp/tee.tmp > '
+                                     '/tmp/apt.log; then echo "no_error" > /tmp/apt.log;fi'.format(command, requisites, error_parser))
+                                err = datalab.fab.conn.sudo('cat /tmp/apt.log').stdout
+                                count = count + 1
+                            allow = True
+                        except Exception as err:
+                            traceback.print_exc()
+                            append_result("Failed to manage_pkgs", str(err))
+                elif environment == 'local':
+                    if subprocess.run('sudo pgrep "^apt" -a && echo "busy" || echo "ready"', capture_output=True, shell=True, check=True) == 'busy':
+                        counter += 1
+                        time.sleep(10)
+                    else:
+                        allow = True
+                        subprocess.run('sudo apt-get {0} {1}'.format(command, requisites), capture_output=True, shell=True, check=True)
+                else:
+                    print('Wrong environment')
     except:
         sys.exit(1)
 
-def ensure_pkg(user, requisites='linux-headers-generic python-pip python-dev '
-                                'groff gcc vim less git wget sysv-rc-conf '
+def ensure_pkg(user, requisites='linux-headers-generic python3-pip python3-dev python3-virtualenv '
+                                'groff gcc vim less git wget '
                                 'libssl-dev unattended-upgrades nmap '
                                 'libffi-dev unzip libxml2-dev haveged'):
     try:
-        if not exists('/home/{}/.ensure_dir/pkg_upgraded'.format(user)):
+        if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/pkg_upgraded'.format(user)):
             count = 0
             check = False
             while not check:
@@ -90,13 +130,13 @@
                         print("Attempt number " + str(count) + " to install requested tools. Max 60 tries.")
                         manage_pkg('update', 'remote', '')
                         manage_pkg('-y install', 'remote', requisites)
-                        sudo('unattended-upgrades -v')
-                        sudo(
+                        datalab.fab.conn.sudo('unattended-upgrades -v')
+                        datalab.fab.conn.sudo(
                             'sed -i \'s|APT::Periodic::Unattended-Upgrade "1"|APT::Periodic::Unattended-Upgrade "0"|\' /etc/apt/apt.conf.d/20auto-upgrades')
-                        sudo('export LC_ALL=C')
-                        sudo('touch /home/{}/.ensure_dir/pkg_upgraded'.format(user))
-                        sudo('systemctl enable haveged')
-                        sudo('systemctl start haveged')
+                        datalab.fab.conn.run('export LC_ALL=C')
+                        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/pkg_upgraded'.format(user))
+                        datalab.fab.conn.sudo('systemctl enable haveged')
+                        datalab.fab.conn.sudo('systemctl start haveged')
                         if os.environ['conf_cloud_provider'] == 'aws':
                             manage_pkg('-y install --install-recommends', 'remote', 'linux-aws-hwe')
                         check = True
@@ -109,61 +149,118 @@
 
 def renew_gpg_key():
     try:
-        sudo('mv /etc/apt/trusted.gpg /etc/apt/trusted.bkp')
-        sudo('apt-key update')
+#        if exists(conn, '/etc/apt/trusted.gpg'):
+#            datalab.fab.conn.sudo('mv /etc/apt/trusted.gpg /etc/apt/trusted.bkp')
+        datalab.fab.conn.sudo('apt-key update')
     except:
         sys.exit(1)
 
 
 def change_pkg_repos():
-    if not exists('/tmp/pkg_china_ensured'):
-        put('/root/files/sources.list', '/tmp/sources.list')
-        sudo('mv /tmp/sources.list /etc/apt/sources.list')
+    if not exists(datalab.fab.conn,'/tmp/pkg_china_ensured'):
+        datalab.fab.conn.put('/root/files/sources.list', '/tmp/sources.list')
+        datalab.fab.conn.sudo('mv /tmp/sources.list /etc/apt/sources.list')
         manage_pkg('update', 'remote', '')
-        sudo('touch /tmp/pkg_china_ensured')
+        datalab.fab.conn.sudo('touch /tmp/pkg_china_ensured')
 
 
 def find_java_path_remote():
-    java_path = sudo("sh -c \"update-alternatives --query java | grep 'Value: ' | grep -o '/.*/jre'\"")
+    java_path = datalab.fab.conn.sudo("sh -c \"update-alternatives --query java | grep 'Value: ' | grep -o '/.*/jre'\"").stdout.replace('\n','')
     return java_path
 
 
 def find_java_path_local():
-    java_path = local("sh -c \"update-alternatives --query java | grep 'Value: ' | grep -o '/.*/jre'\"", capture=True)
+    java_path = subprocess.run("sh -c \"update-alternatives --query java | grep 'Value: ' | grep -o '/.*/jre'\"", capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
     return java_path
 
 
 def ensure_ntpd(user, edge_private_ip=''):
     try:
-        if not exists('/home/{}/.ensure_dir/ntpd_ensured'.format(user)):
-            sudo('timedatectl set-ntp no')
+        if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/ntpd_ensured'.format(user)):
+            datalab.fab.conn.sudo('timedatectl set-ntp no')
             manage_pkg('-y install', 'remote', 'ntp ntpdate')
-            sudo('echo "tinker panic 0" >> /etc/ntp.conf')
+            datalab.fab.conn.sudo('bash -c \"echo "tinker panic 0" >> /etc/ntp.conf\"')
             if os.environ['conf_resource'] != 'ssn' and os.environ['conf_resource'] != 'edge':
-                sudo('echo "server {} prefer iburst" >> /etc/ntp.conf'.format(edge_private_ip))
-            sudo('systemctl restart ntp')
-            sudo('systemctl enable ntp')
-            sudo('touch /home/{}/.ensure_dir/ntpd_ensured'.format(user))
+                datalab.fab.conn.sudo('bash -c \"echo "server {} prefer iburst" >> /etc/ntp.conf\"'.format(edge_private_ip))
+            datalab.fab.conn.sudo('systemctl restart ntp')
+            datalab.fab.conn.sudo('systemctl enable ntp')
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/ntpd_ensured'.format(user))
     except:
         sys.exit(1)
 
 
 def ensure_java(user):
     try:
-        if not exists('/home/{}/.ensure_dir/java_ensured'.format(user)):
+        if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/java_ensured'.format(user)):
             manage_pkg('-y install', 'remote', 'openjdk-8-jdk')
-            sudo('touch /home/{}/.ensure_dir/java_ensured'.format(user))
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/java_ensured'.format(user))
     except:
         sys.exit(1)
 
 
 def ensure_step(user):
     try:
-        if not exists('/home/{}/.ensure_dir/step_ensured'.format(user)):
+        if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/step_ensured'.format(user)):
             manage_pkg('-y install', 'remote', 'wget')
-            sudo('wget https://github.com/smallstep/cli/releases/download/v0.13.3/step-cli_0.13.3_amd64.deb '
+            datalab.fab.conn.sudo('wget https://github.com/smallstep/cli/releases/download/v0.13.3/step-cli_0.13.3_amd64.deb '
                  '-O /tmp/step-cli_0.13.3_amd64.deb')
-            sudo('dpkg -i /tmp/step-cli_0.13.3_amd64.deb')
-            sudo('touch /home/{}/.ensure_dir/step_ensured'.format(user))
+            datalab.fab.conn.sudo('dpkg -i /tmp/step-cli_0.13.3_amd64.deb')
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/step_ensured'.format(user))
     except:
         sys.exit(1)
+
+def install_certbot(os_family):
+    try:
+        print('Installing Certbot')
+        if os_family == 'debian':
+            datalab.fab.conn.sudo('apt-get -y update')
+            datalab.fab.conn.sudo('snap install core')
+            datalab.fab.conn.sudo('snap refresh core')
+            datalab.fab.conn.sudo('snap install --classic certbot')
+            datalab.fab.conn.sudo('ln -s /snap/bin/certbot /usr/bin/certbot')
+        elif os_family == 'redhat':
+            print('This OS family is not supported yet')
+    except Exception as err:
+        traceback.print_exc()
+        print('Failed Certbot install: ' + str(err))
+        sys.exit(1)
+
+def run_certbot(domain_name, node, email=''):
+    try:
+        print('Running  Certbot')
+        if node == 'ssn':
+            datalab.fab.conn.sudo('service nginx stop')
+        else:
+            datalab.fab.conn.sudo('service openresty stop')
+        if email != '':
+            datalab.fab.conn.sudo('certbot certonly --standalone -n -d {}.{} -m {} --agree-tos'.format(node, domain_name, email))
+        else:
+            datalab.fab.conn.sudo('certbot certonly --standalone -n -d {}.{} --register-unsafely-without-email --agree-tos'.format(node, domain_name))
+    except Exception as err:
+        traceback.print_exc()
+        print('Failed to run Certbot: ' + str(err))
+        sys.exit(1)
+
+def configure_nginx_LE(domain_name, node):
+    try:
+        server_name_line ='    server_name {}.{};'.format(node, domain_name)
+        cert_path_line = '    ssl_certificate  /etc/letsencrypt/live/{}.{}/fullchain.pem;'.format(node, domain_name)
+        cert_key_line = '    ssl_certificate_key /etc/letsencrypt/live/{}.{}/privkey.pem;'.format(node, domain_name)
+        #certbot_service = "ExecStart = /usr/bin/certbot -q renew --pre-hook 'service nginx stop' --post-hook 'service nginx start'"
+        #certbot_service_path = '/lib/systemd/system/certbot.service'
+        if node == 'ssn':
+            nginx_config_path = '/etc/nginx/conf.d/nginx_proxy.conf'
+        else:
+            nginx_config_path = '/usr/local/openresty/nginx/conf/conf.d/proxy.conf'
+        datalab.fab.conn.sudo('sed -i "s|.*    server_name .*|{}|" {}'.format(server_name_line, nginx_config_path))
+        datalab.fab.conn.sudo('sed -i "s|.*    ssl_certificate .*|{}|" {}'.format(cert_path_line, nginx_config_path))
+        datalab.fab.conn.sudo('sed -i "s|.*    ssl_certificate_key .*|{}|" {}'.format(cert_key_line, nginx_config_path))
+        #datalab.fab.conn.sudo('sed -i "s|.*ExecStart.*|{}|" {}'.format(certbot_service, certbot_service_path))
+        if node == 'ssn':
+            datalab.fab.conn.sudo('systemctl restart nginx')
+        else:
+            datalab.fab.conn.sudo('systemctl restart openresty')
+    except Exception as err:
+        traceback.print_exc()
+        print('Failed to run Certbot: ' + str(err))
+        sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/lib/os/debian/edge_lib.py b/infrastructure-provisioning/src/general/lib/os/debian/edge_lib.py
index 582d58e..fb6aa14 100644
--- a/infrastructure-provisioning/src/general/lib/os/debian/edge_lib.py
+++ b/infrastructure-provisioning/src/general/lib/os/debian/edge_lib.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -23,37 +23,40 @@
 
 import os
 import sys
-from fabric.api import *
-from fabric.contrib.files import exists
-from dlab.common_lib import manage_pkg
-
+from datalab.common_lib import configure_nginx_LE
+from datalab.common_lib import install_certbot
+from datalab.common_lib import manage_pkg
+from datalab.common_lib import run_certbot
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
+import datalab.fab
 
 def configure_http_proxy_server(config):
     try:
-        if not exists('/tmp/http_proxy_ensured'):
+        if not exists(datalab.fab.conn,'/tmp/http_proxy_ensured'):
             manage_pkg('-y install', 'remote', 'squid')
             template_file = config['template_file']
             proxy_subnet = config['exploratory_subnet']
-            put(template_file, '/tmp/squid.conf')
-            sudo('\cp /tmp/squid.conf /etc/squid/squid.conf')
-            sudo('sed -i "s|PROXY_SUBNET|{}|g" /etc/squid/squid.conf'.format(proxy_subnet))
-            sudo('sed -i "s|EDGE_USER_NAME|{}|g" /etc/squid/squid.conf'.format(config['project_name']))
-            sudo('sed -i "s|LDAP_HOST|{}|g" /etc/squid/squid.conf'.format(config['ldap_host']))
-            sudo('sed -i "s|LDAP_DN|{}|g" /etc/squid/squid.conf'.format(config['ldap_dn']))
-            sudo('sed -i "s|LDAP_SERVICE_USERNAME|{}|g" /etc/squid/squid.conf'.format(config['ldap_user']))
-            sudo('sed -i "s|LDAP_SERVICE_PASSWORD|{}|g" /etc/squid/squid.conf'.format(config['ldap_password']))
-            sudo('sed -i "s|LDAP_AUTH_PATH|{}|g" /etc/squid/squid.conf'.format('/usr/lib/squid/basic_ldap_auth'))
+            datalab.fab.conn.put(template_file, '/tmp/squid.conf')
+            datalab.fab.conn.sudo('\cp /tmp/squid.conf /etc/squid/squid.conf')
+            datalab.fab.conn.sudo('sed -i "s|PROXY_SUBNET|{}|g" /etc/squid/squid.conf'.format(proxy_subnet))
+            datalab.fab.conn.sudo('sed -i "s|EDGE_USER_NAME|{}|g" /etc/squid/squid.conf'.format(config['project_name']))
+            datalab.fab.conn.sudo('sed -i "s|LDAP_HOST|{}|g" /etc/squid/squid.conf'.format(config['ldap_host']))
+            datalab.fab.conn.sudo('sed -i "s|LDAP_DN|{}|g" /etc/squid/squid.conf'.format(config['ldap_dn']))
+            datalab.fab.conn.sudo('sed -i "s|LDAP_SERVICE_USERNAME|{}|g" /etc/squid/squid.conf'.format(config['ldap_user']))
+            datalab.fab.conn.sudo('sed -i "s|LDAP_SERVICE_PASSWORD|{}|g" /etc/squid/squid.conf'.format(config['ldap_password']))
+            datalab.fab.conn.sudo('sed -i "s|LDAP_AUTH_PATH|{}|g" /etc/squid/squid.conf'.format('/usr/lib/squid/basic_ldap_auth'))
             replace_string = ''
             for cidr in config['vpc_cidrs']:
                 replace_string += 'acl AWS_VPC_CIDR dst {}\\n'.format(cidr)
-            sudo('sed -i "s|VPC_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
+            datalab.fab.conn.sudo('sed -i "s|VPC_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
             replace_string = ''
             for cidr in config['allowed_ip_cidr']:
                 replace_string += 'acl AllowedCIDRS src {}\\n'.format(cidr)
-            sudo('sed -i "s|ALLOWED_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
-            sudo('service squid reload')
-            sudo('sysv-rc-conf squid on')
-            sudo('touch /tmp/http_proxy_ensured')
+            datalab.fab.conn.sudo('sed -i "s|ALLOWED_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
+            datalab.fab.conn.sudo('systemctl restart squid')
+            datalab.fab.conn.sudo('touch /tmp/http_proxy_ensured')
     except Exception as err:
         print("Failed to install and configure squid: " + str(err))
         sys.exit(1)
@@ -63,133 +66,153 @@
                       keycloak_client_secret, user, hostname, step_cert_sans):
     try:
         if not os.path.exists('/tmp/nginx_installed'):
-            manage_pkg('-y install', 'remote', 'wget')
-            manage_pkg('-y install', 'remote', 'gcc build-essential make automake zlib1g-dev libpcre++-dev libssl-dev git libldap2-dev libc6-dev libgd-dev libgeoip-dev libpcre3-dev apt-utils autoconf liblmdb-dev libtool libxml2-dev libyajl-dev pkgconf liblua5.1-0 liblua5.1-0-dev libreadline-dev libreadline6-dev libtinfo-dev libtool-bin lua5.1 zip readline-doc')
+            manage_pkg('-y install', 'remote',
+                       'gcc build-essential make automake zlib1g-dev libpcre++-dev libssl-dev git libldap2-dev '
+                       'libc6-dev libgd-dev libgeoip-dev libpcre3-dev apt-utils autoconf liblmdb-dev libtool '
+                       'libxml2-dev libyajl-dev pkgconf libreadline-dev libreadline6-dev libtinfo-dev '
+                       'libtool-bin zip readline-doc perl curl liblua5.1-0 liblua5.1-0-dev lua5.1')
+            manage_pkg('-y install --no-install-recommends', 'remote', 'wget gnupg ca-certificates')
             if os.environ['conf_stepcerts_enabled'] == 'true':
-                sudo('mkdir -p /home/{0}/keys'.format(user))
-                sudo('''bash -c 'echo "{0}" | base64 --decode > /etc/ssl/certs/root_ca.crt' '''.format(
+                datalab.fab.conn.sudo('mkdir -p /home/{0}/keys'.format(user))
+                datalab.fab.conn.sudo('''bash -c 'echo "{0}" | base64 --decode > /etc/ssl/certs/root_ca.crt' '''.format(
                      os.environ['conf_stepcerts_root_ca']))
-                fingerprint = sudo('step certificate fingerprint /etc/ssl/certs/root_ca.crt')
-                sudo('step ca bootstrap --fingerprint {0} --ca-url "{1}"'.format(fingerprint,
+                fingerprint = datalab.fab.conn.sudo('step certificate fingerprint /etc/ssl/certs/root_ca.crt').stdout.replace('\n','')
+                datalab.fab.conn.sudo('step ca bootstrap --fingerprint {0} --ca-url "{1}"'.format(fingerprint,
                                                                                  os.environ['conf_stepcerts_ca_url']))
-                sudo('echo "{0}" > /home/{1}/keys/provisioner_password'.format(
+                datalab.fab.conn.sudo('''bash -c 'echo "{0}" > /home/{1}/keys/provisioner_password' '''.format(
                      os.environ['conf_stepcerts_kid_password'], user))
                 sans = "--san localhost --san 127.0.0.1 {0}".format(step_cert_sans)
                 cn = edge_ip
-                sudo('step ca token {3} --kid {0} --ca-url "{1}" --root /etc/ssl/certs/root_ca.crt '
+                datalab.fab.conn.sudo('step ca token {3} --kid {0} --ca-url "{1}" --root /etc/ssl/certs/root_ca.crt '
                      '--password-file /home/{2}/keys/provisioner_password {4} --output-file /tmp/step_token'.format(
-                      os.environ['conf_stepcerts_kid'], os.environ['conf_stepcerts_ca_url'], user, cn, sans))
-                token = sudo('cat /tmp/step_token')
-                sudo('step ca certificate "{0}" /etc/ssl/certs/dlab.crt /etc/ssl/certs/dlab.key '
+                    os.environ['conf_stepcerts_kid'], os.environ['conf_stepcerts_ca_url'], user, cn, sans))
+                token = datalab.fab.conn.sudo('cat /tmp/step_token').stdout.replace('\n','')
+                datalab.fab.conn.sudo('step ca certificate "{0}" /etc/ssl/certs/datalab.crt /etc/ssl/certs/datalab.key '
                      '--token "{1}" --kty=RSA --size 2048 --provisioner {2} '.format(cn, token,
                                                                                      os.environ['conf_stepcerts_kid']))
-                sudo('touch /var/log/renew_certificates.log')
-                put('/root/templates/manage_step_certs.sh', '/usr/local/bin/manage_step_certs.sh', use_sudo=True)
-                sudo('chmod +x /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_ROOT_CERT_PATH|/etc/ssl/certs/root_ca.crt|g" '
+                datalab.fab.conn.sudo('touch /var/log/renew_certificates.log')
+                datalab.fab.conn.put('/root/templates/manage_step_certs.sh', '/tmp/manage_step_certs.sh')
+                datalab.fab.conn.sudo('cp /tmp/manage_step_certs.sh /usr/local/bin/manage_step_certs.sh')
+                datalab.fab.conn.sudo('chmod +x /usr/local/bin/manage_step_certs.sh')
+                datalab.fab.conn.sudo('sed -i "s|STEP_ROOT_CERT_PATH|/etc/ssl/certs/root_ca.crt|g" '
                      '/usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_CERT_PATH|/etc/ssl/certs/dlab.crt|g" /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_KEY_PATH|/etc/ssl/certs/dlab.key|g" /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_CA_URL|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
+                datalab.fab.conn.sudo('sed -i "s|STEP_CERT_PATH|/etc/ssl/certs/datalab.crt|g" /usr/local/bin/manage_step_certs.sh')
+                datalab.fab.conn.sudo('sed -i "s|STEP_KEY_PATH|/etc/ssl/certs/datalab.key|g" /usr/local/bin/manage_step_certs.sh')
+                datalab.fab.conn.sudo('sed -i "s|STEP_CA_URL|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
                     os.environ['conf_stepcerts_ca_url']))
-                sudo('sed -i "s|RESOURCE_TYPE|edge|g" /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|SANS|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(sans))
-                sudo('sed -i "s|CN|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(cn))
-                sudo('sed -i "s|KID|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
+                datalab.fab.conn.sudo('sed -i "s|RESOURCE_TYPE|edge|g" /usr/local/bin/manage_step_certs.sh')
+                datalab.fab.conn.sudo('sed -i "s|SANS|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(sans))
+                datalab.fab.conn.sudo('sed -i "s|CN|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(cn))
+                datalab.fab.conn.sudo('sed -i "s|KID|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
                     os.environ['conf_stepcerts_kid']))
-                sudo('sed -i "s|STEP_PROVISIONER_PASSWORD_PATH|/home/{0}/keys/provisioner_password|g" '
+                datalab.fab.conn.sudo('sed -i "s|STEP_PROVISIONER_PASSWORD_PATH|/home/{0}/keys/provisioner_password|g" '
                      '/usr/local/bin/manage_step_certs.sh'.format(user))
-                sudo('bash -c \'echo "0 * * * * root /usr/local/bin/manage_step_certs.sh >> '
+                datalab.fab.conn.sudo('bash -c \'echo "0 * * * * root /usr/local/bin/manage_step_certs.sh >> '
                      '/var/log/renew_certificates.log 2>&1" >> /etc/crontab \'')
-                put('/root/templates/step-cert-manager.service', '/etc/systemd/system/step-cert-manager.service',
-                    use_sudo=True)
-                sudo('systemctl daemon-reload')
-                sudo('systemctl enable step-cert-manager.service')
+                datalab.fab.conn.put('/root/templates/step-cert-manager.service', '/tmp/step-cert-manager.service')
+                datalab.fab.conn.sudo('cp -f /tmp/step-cert-manager.service /etc/systemd/system/step-cert-manager.service')
+                datalab.fab.conn.sudo('systemctl daemon-reload')
+                datalab.fab.conn.sudo('systemctl enable step-cert-manager.service')
             else:
-                sudo('openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/dlab.key \
-                     -out /etc/ssl/certs/dlab.crt -subj "/C=US/ST=US/L=US/O=dlab/CN={}"'.format(hostname))
-            sudo('mkdir -p /tmp/lua')
-            sudo('mkdir -p /tmp/src')
-            with cd('/tmp/src/'):
-                sudo('wget http://nginx.org/download/nginx-{}.tar.gz'.format(nginx_version))
-                sudo('tar -xzf nginx-{}.tar.gz'.format(nginx_version))
+                datalab.fab.conn.sudo('openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/datalab.key \
+                     -out /etc/ssl/certs/datalab.crt -subj "/C=US/ST=US/L=US/O=datalab/CN={}"'.format(hostname))
 
-                sudo('wget https://github.com/openresty/lua-nginx-module/archive/v0.10.15.tar.gz')
-                sudo('tar -xzf v0.10.15.tar.gz')
+            datalab.fab.conn.sudo('mkdir -p /tmp/src')
+            datalab.fab.conn.sudo('''bash -c 'cd /tmp/src/ && wget https://luarocks.org/releases/luarocks-3.3.1.tar.gz' ''')
+            datalab.fab.conn.sudo('''bash -c 'cd /tmp/src/ && tar -xzf luarocks-3.3.1.tar.gz' ''')
 
-                sudo('wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1.tar.gz')
-                sudo('tar -xzf v0.3.1.tar.gz')
+            datalab.fab.conn.sudo('wget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add -')
+            datalab.fab.conn.sudo('add-apt-repository -y "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main"')
+            datalab.fab.conn.sudo('apt-get update')
+            datalab.fab.conn.sudo('apt-get -y install openresty=1.19.3.1-1~focal1')
 
-                sudo('wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz')
-                sudo('tar -xzf LuaJIT-2.0.5.tar.gz')
+            datalab.fab.conn.sudo('''bash -c 'cd /tmp/src/luarocks-3.3.1/ && ./configure' ''')
+            datalab.fab.conn.sudo('''bash -c 'cd /tmp/src/luarocks-3.3.1/ && make install' ''')
+            try:
+                allow = False
+                counter = 0
+                while not allow:
+                    if counter > 5:
+                        sys.exit(1)
+                    else:
+                        if 'Could not fetch' in datalab.fab.conn.sudo('''bash -c 'cd /tmp/src/luarocks-3.3.1/ && luarocks install lua-resty-jwt 0.2.2 --tree /usr/local/openresty/lualib/resty/' ''').stdout \
+                                or 'Could not fetch' in datalab.fab.conn.sudo('''bash -c 'cd /tmp/src/luarocks-3.3.1/ && luarocks install lua-resty-openidc --tree /usr/local/openresty/lualib/resty/' ''').stdout:
+                            counter += 1
+                            time.sleep(10)
+                        else:
+                            allow = True
+            except:
+                sys.exit(1)
 
-                sudo('wget http://keplerproject.github.io/luarocks/releases/luarocks-2.2.2.tar.gz')
-                sudo('tar -xzf luarocks-2.2.2.tar.gz')
+            try:
+                allow = False
+                counter = 0
+                while not allow:
+                    if counter > 5:
+                        sys.exit(1)
+                    else:
+                        if 'Could not fetch' in datalab.fab.conn.sudo('luarocks install lua-resty-jwt 0.2.2').stdout \
+                                or 'Could not fetch' in datalab.fab.conn.sudo('luarocks install lua-resty-openidc').stdout:
+                            counter += 1
+                            time.sleep(10)
+                        else:
+                            allow = True
+            except:
+                sys.exit(1)
 
-                sudo('ln -sf nginx-{} nginx'.format(nginx_version))
+            datalab.fab.conn.sudo('useradd -r nginx')
 
-            with cd('/tmp/src/LuaJIT-2.0.5/'):
-                sudo('make')
-                sudo('make install')
-
-            with cd('/tmp/src/nginx/'), shell_env(LUAJIT_LIB='/usr/local/lib/', LUAJIT_INC='/usr/local/include/luajit-2.0'):
-                sudo('./configure --user=nginx --group=nginx --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx \
-                              --conf-path=/etc/nginx/nginx.conf --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx \
-                              --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log \
-                              --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --with-pcre \
-                              --with-http_realip_module --with-file-aio --with-ipv6 --with-http_v2_module --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB"  \
-                              --without-http_scgi_module --without-http_uwsgi_module --without-http_fastcgi_module --with-http_sub_module \
-                              --add-dynamic-module=/tmp/src/ngx_devel_kit-0.3.1 --add-dynamic-module=/tmp/src/lua-nginx-module-0.10.15')
-                sudo('make')
-                sudo('make install')
-
-            with cd('/tmp/src/luarocks-2.2.2/'):
-                sudo('./configure')
-                sudo('make build')
-                sudo('make install')
-                sudo('wget https://luarocks.org/manifests/cdbattags/lua-resty-jwt-0.2.0-0.src.rock')
-                sudo('luarocks build lua-resty-jwt-0.2.0-0.src.rock')
-                sudo('wget https://luarocks.org/manifests/bungle/lua-resty-session-2.26-1.src.rock')
-                sudo('luarocks build lua-resty-session-2.26-1.src.rock')
-                sudo('wget https://luarocks.org/manifests/pintsized/lua-resty-http-0.15-0.src.rock')
-                sudo('luarocks build lua-resty-http-0.15-0.src.rock')
-                sudo('wget https://luarocks.org/manifests/hanszandbelt/lua-resty-openidc-1.7.2-1.src.rock')
-                sudo('luarocks build lua-resty-openidc-1.7.2-1.src.rock')
-                sudo('wget https://luarocks.org/manifests/starius/luacrypto-0.3.2-2.src.rock')
-                sudo('luarocks build luacrypto-0.3.2-2.src.rock')
-                sudo('wget https://luarocks.org/manifests/openresty/lua-cjson-2.1.0.6-1.src.rock')
-                sudo('luarocks build lua-cjson-2.1.0.6-1.src.rock')
-                sudo('wget https://luarocks.org/manifests/avlubimov/lua-resty-core-0.1.17-4.src.rock')
-                sudo('luarocks build lua-resty-core-0.1.17-4.src.rock')
-                sudo('wget https://luarocks.org/manifests/hjpotter92/random-1.1-0.rockspec')
-                sudo('luarocks install random-1.1-0.rockspec')
-                sudo('wget https://luarocks.org/manifests/rsander/lua-resty-string-0.09-0.rockspec')
-                sudo('luarocks install lua-resty-string-0.09-0.rockspec')
-
-            sudo('useradd -r nginx')
-            sudo('rm -f /etc/nginx/nginx.conf')
-            sudo('mkdir -p /opt/dlab/templates')
-            put('/root/templates', '/opt/dlab', use_sudo=True)
-            sudo('sed -i \'s/EDGE_IP/{}/g\' /opt/dlab/templates/conf.d/proxy.conf'.format(edge_ip))
-            sudo('sed -i \'s|KEYCLOAK_AUTH_URL|{}|g\' /opt/dlab/templates/conf.d/proxy.conf'.format(
+            datalab.fab.conn.sudo('mkdir -p /opt/datalab/templates')
+            datalab.fab.conn.local('''bash -c 'cd  /root/templates; tar -zcvf /tmp/templates.tar.gz *' ''')
+            datalab.fab.conn.put('/tmp/templates.tar.gz', '/tmp/templates.tar.gz')
+            datalab.fab.conn.sudo('tar -zxvf /tmp/templates.tar.gz -C /opt/datalab/templates/')
+            datalab.fab.conn.sudo('sed -i \'s/EDGE_IP/{}/g\' /opt/datalab/templates/conf.d/proxy.conf'.format(edge_ip))
+            datalab.fab.conn.sudo('sed -i \'s|KEYCLOAK_AUTH_URL|{}|g\' /opt/datalab/templates/conf.d/proxy.conf'.format(
                 keycloak_auth_server_url))
-            sudo('sed -i \'s/KEYCLOAK_REALM_NAME/{}/g\' /opt/dlab/templates/conf.d/proxy.conf'.format(
+            datalab.fab.conn.sudo('sed -i \'s/KEYCLOAK_REALM_NAME/{}/g\' /opt/datalab/templates/conf.d/proxy.conf'.format(
                 keycloak_realm_name))
-            sudo('sed -i \'s/KEYCLOAK_CLIENT_ID/{}/g\' /opt/dlab/templates/conf.d/proxy.conf'.format(
+            datalab.fab.conn.sudo('sed -i \'s/KEYCLOAK_CLIENT_ID/{}/g\' /opt/datalab/templates/conf.d/proxy.conf'.format(
                 keycloak_client_id))
-            sudo('sed -i \'s/KEYCLOAK_CLIENT_SECRET/{}/g\' /opt/dlab/templates/conf.d/proxy.conf'.format(
+            datalab.fab.conn.sudo('sed -i \'s/KEYCLOAK_CLIENT_SECRET/{}/g\' /opt/datalab/templates/conf.d/proxy.conf'.format(
                 keycloak_client_secret))
 
-            sudo('cp /opt/dlab/templates/nginx.conf /etc/nginx/')
-            sudo('mkdir /etc/nginx/conf.d')
-            sudo('cp /opt/dlab/templates/conf.d/proxy.conf /etc/nginx/conf.d/')
-            sudo('mkdir /etc/nginx/locations')
-            sudo('cp /opt/dlab/templates/nginx_debian /etc/init.d/nginx')
-            sudo('chmod +x /etc/init.d/nginx')
-            sudo('systemctl daemon-reload')
-            sudo('systemctl enable nginx')
-            sudo('/etc/init.d/nginx start')
-            sudo('touch /tmp/nginx_installed')
+            datalab.fab.conn.sudo('cp /opt/datalab/templates/nginx.conf /usr/local/openresty/nginx/conf')
+            datalab.fab.conn.sudo('mkdir /usr/local/openresty/nginx/conf/conf.d')
+            datalab.fab.conn.sudo('cp /opt/datalab/templates/conf.d/proxy.conf /usr/local/openresty/nginx/conf/conf.d/')
+            datalab.fab.conn.sudo('mkdir /usr/local/openresty/nginx/conf/locations')
+            datalab.fab.conn.sudo('systemctl start openresty')
+            datalab.fab.conn.sudo('touch /tmp/nginx_installed')
+            if os.environ['conf_letsencrypt_enabled'] == 'true':
+                print("Configuring letsencrypt certificates.")
+                install_certbot(os.environ['conf_os_family'])
+                if 'conf_letsencrypt_email' in os.environ:
+                    run_certbot(os.environ['conf_letsencrypt_domain_name'], os.environ['project_name'].lower(), os.environ['conf_letsencrypt_email'])
+                else:
+                    run_certbot(os.environ['conf_letsencrypt_domain_name'], os.environ['project_name'].lower())
+                configure_nginx_LE(os.environ['conf_letsencrypt_domain_name'], os.environ['project_name'].lower())
     except Exception as err:
         print("Failed install nginx with ldap: " + str(err))
+        sys.exit(1)
+
+def configure_nftables(config):
+    try:
+        if not exists(datalab.fab.conn,'/tmp/nftables_ensured'):
+            manage_pkg('-y install', 'remote', 'nftables')
+            datalab.fab.conn.sudo('systemctl enable nftables.service')
+            datalab.fab.conn.sudo('systemctl start nftables')
+            datalab.fab.conn.sudo('sysctl net.ipv4.ip_forward=1')
+            if os.environ['conf_cloud_provider'] == 'aws':
+                interface = 'eth0'
+            elif os.environ['conf_cloud_provider'] == 'gcp':
+                interface = 'ens4'
+            datalab.fab.conn.sudo('sed -i \'s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g\' /etc/sysctl.conf')
+            datalab.fab.conn.sudo('sed -i \'s/EDGE_IP/{}/g\' /opt/datalab/templates/nftables.conf'.format(config['edge_ip']))
+            datalab.fab.conn.sudo('sed -i "s|INTERFACE|{}|g" /opt/datalab/templates/nftables.conf'.format(interface))
+            datalab.fab.conn.sudo(
+                'sed -i "s|SUBNET_CIDR|{}|g" /opt/datalab/templates/nftables.conf'.format(config['exploratory_subnet']))
+            datalab.fab.conn.sudo('cp /opt/datalab/templates/nftables.conf /etc/')
+            datalab.fab.conn.sudo('systemctl restart nftables')
+            datalab.fab.conn.sudo('touch /tmp/nftables_ensured')
+    except Exception as err:
+        print("Failed to configure nftables: " + str(err))
         sys.exit(1)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/lib/os/debian/notebook_lib.py b/infrastructure-provisioning/src/general/lib/os/debian/notebook_lib.py
index d1fa44a..66bebfb 100644
--- a/infrastructure-provisioning/src/general/lib/os/debian/notebook_lib.py
+++ b/infrastructure-provisioning/src/general/lib/os/debian/notebook_lib.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,31 +21,32 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
-import argparse
-import json
-import random
-import string
-import sys
-from dlab.notebook_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
 import backoff
 import os
 import re
+import sys
+import subprocess
+import time
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 
 def enable_proxy(proxy_host, proxy_port):
     try:
         proxy_string = "http://%s:%s" % (proxy_host, proxy_port)
-        sudo('sed -i "/^export http_proxy/d" /etc/profile')
-        sudo('sed -i "/^export https_proxy/d" /etc/profile')
-        sudo('echo export http_proxy=' + proxy_string + ' >> /etc/profile')
-        sudo('echo export https_proxy=' + proxy_string + ' >> /etc/profile')
-        if exists('/etc/apt/apt.conf'):
-            sudo("sed -i '/^Acquire::http::Proxy/d' /etc/apt/apt.conf")
-        sudo("echo 'Acquire::http::Proxy \"" + proxy_string + "\";' >> /etc/apt/apt.conf")
+        proxy_https_string = "http://%s:%s" % (proxy_host, proxy_port)
+        datalab.fab.conn.sudo('sed -i "/^export http_proxy/d" /etc/profile')
+        datalab.fab.conn.sudo('sed -i "/^export https_proxy/d" /etc/profile')
+        datalab.fab.conn.sudo('''bash -c 'echo export http_proxy={} >> /etc/profile' '''.format(proxy_string))
+        datalab.fab.conn.sudo('''bash -c 'echo export https_proxy={} >> /etc/profile' '''.format(proxy_string))
+        if exists(datalab.fab.conn, '/etc/apt/apt.conf'):
+            datalab.fab.conn.sudo("sed -i '/^Acquire::http::Proxy/d' /etc/apt/apt.conf")
+        datalab.fab.conn.sudo('''bash -c "echo 'Acquire::http::Proxy \\"{}\\";' >> /etc/apt/apt.conf" '''.format(proxy_string))
+        datalab.fab.conn.sudo('''bash -c "echo 'Acquire::http::Proxy \\"{}\\";' >> /etc/apt/apt.conf" '''.format(proxy_https_string))
 
         print("Renewing gpg key")
         renew_gpg_key()
@@ -54,344 +55,432 @@
 
 
 def ensure_r_local_kernel(spark_version, os_user, templates_dir, kernels_dir):
-    if not exists('/home/' + os_user + '/.ensure_dir/r_local_kernel_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/r_local_kernel_ensured'):
         try:
-            sudo('R -e "IRkernel::installspec()"')
-            r_version = sudo("R --version | awk '/version / {print $3}'")
-            put(templates_dir + 'r_template.json', '/tmp/r_template.json')
-            sudo('sed -i "s|R_VER|' + r_version + '|g" /tmp/r_template.json')
-            sudo('sed -i "s|SP_VER|' + spark_version + '|g" /tmp/r_template.json')
-            sudo('\cp -f /tmp/r_template.json {}/ir/kernel.json'.format(kernels_dir))
-            sudo('ln -s /opt/spark/ /usr/local/spark')
+            datalab.fab.conn.sudo('R -e "IRkernel::installspec(prefix = \'/home/{}/.local/\')"'.format(os_user))
+            r_version = datalab.fab.conn.sudo("R --version | awk '/version / {print $3}'").stdout.replace('\n','')
+            datalab.fab.conn.put(templates_dir + 'r_template.json', '/tmp/r_template.json')
+            datalab.fab.conn.sudo('sed -i "s|R_VER|' + r_version + '|g" /tmp/r_template.json')
+            datalab.fab.conn.sudo('sed -i "s|SP_VER|' + spark_version + '|g" /tmp/r_template.json')
+            datalab.fab.conn.sudo('\cp -f /tmp/r_template.json {}/ir/kernel.json'.format(kernels_dir))
+            datalab.fab.conn.sudo('ln -s /opt/spark/ /usr/local/spark')
             try:
-                sudo('cd /usr/local/spark/R/lib/SparkR; R -e "install.packages(\'roxygen2\',repos=\'https://cloud.r-project.org\')" R -e "devtools::check(\'.\')"')
+                datalab.fab.conn.sudo('R -e "install.packages(\'roxygen2\',repos=\'https://cloud.r-project.org\')"')
+                datalab.fab.conn.sudo(''' bash -c 'cd /usr/local/spark/R/lib/SparkR; R -e "devtools::check()"' ''')
             except:
                 pass
-            sudo('cd /usr/local/spark/R/lib/SparkR; R -e "devtools::install(\'.\')"')
-            sudo('chown -R ' + os_user + ':' + os_user + ' /home/' + os_user + '/.local')
-            sudo('touch /home/' + os_user + '/.ensure_dir/r_local_kernel_ensured')
+            datalab.fab.conn.sudo(''' bash -c 'cd /usr/local/spark/R/lib/SparkR; R -e "devtools::install()"' ''')
+            datalab.fab.conn.sudo('chown -R ' + os_user + ':' + os_user + ' /home/' + os_user + '/.local')
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/r_local_kernel_ensured')
         except:
             sys.exit(1)
 
 @backoff.on_exception(backoff.expo, SystemExit, max_tries=20)
 def add_marruter_key():
     try:
-        sudo('add-apt-repository -y ppa:marutter/rrutter')
+        datalab.fab.conn.sudo('add-apt-repository -y ppa:marutter/rrutter')
     except:
         sys.exit(1)
 
 def ensure_r(os_user, r_libs, region, r_mirror):
-    if not exists('/home/' + os_user + '/.ensure_dir/r_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/r_ensured'):
         try:
             if region == 'cn-north-1':
                 r_repository = r_mirror
             else:
                 r_repository = 'https://cloud.r-project.org'
-            add_marruter_key()
-            sudo('apt update')
-            manage_pkg('-y install', 'remote', 'libcurl4-openssl-dev libssl-dev libreadline-dev')
+            #add_marruter_key()
+            datalab.fab.conn.sudo('apt update')
+            manage_pkg('-yV install', 'remote', 'libssl-dev libcurl4-gnutls-dev libgit2-dev libxml2-dev libreadline-dev')
             manage_pkg('-y install', 'remote', 'cmake')
+            datalab.fab.conn.sudo('''bash -c -l 'apt-key adv --keyserver-options http-proxy="$http_proxy" --keyserver hkp://keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9' ''')
+            datalab.fab.conn.sudo("add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/'")
+            manage_pkg('update', 'remote', '')
             manage_pkg('-y install', 'remote', 'r-base r-base-dev')
-            sudo('R CMD javareconf')
-            sudo('cd /root; git clone https://github.com/zeromq/zeromq4-x.git; cd zeromq4-x/; mkdir build; cd build; cmake ..; make install; ldconfig')
+            datalab.fab.conn.sudo('R CMD javareconf')
+            datalab.fab.conn.sudo('''bash -c 'cd /root; git clone https://github.com/zeromq/zeromq4-x.git; cd zeromq4-x/; mkdir build; cd build; cmake ..; make install; ldconfig' ''')
+            datalab.fab.conn.sudo('R -e "install.packages(\'devtools\',repos=\'{}\')"'.format(r_repository))
             for i in r_libs:
-                sudo('R -e "install.packages(\'{}\',repos=\'{}\')"'.format(i, r_repository))
-            sudo('R -e "library(\'devtools\');install.packages(repos=\'{}\',c(\'rzmq\',\'repr\',\'digest\',\'stringr\',\'RJSONIO\',\'functional\',\'plyr\'))"'.format(r_repository))
+                if '=' in i:
+                    name = i.split('=')[0]
+                    vers = '"{}"'.format(i.split('=')[1])
+                else:
+                    name = i
+                    vers = ''
+                datalab.fab.conn.sudo('R -e \'devtools::install_version("{}", version = {}, repos ="{}", dependencies = NA)\''.format(name, vers, r_repository))
+                #sudo('R -e "install.packages(\'{}\',repos=\'{}\')"'.format(i, r_repository))
+            datalab.fab.conn.sudo('R -e "library(\'devtools\');install.packages(repos=\'{}\',c(\'rzmq\',\'repr\',\'digest\',\'stringr\',\'RJSONIO\',\'functional\',\'plyr\'))"'.format(r_repository))
             try:
-                sudo('R -e "library(\'devtools\');install_github(\'IRkernel/repr\');install_github(\'IRkernel/IRdisplay\');install_github(\'IRkernel/IRkernel\');"')
+                datalab.fab.conn.sudo('R -e "library(\'devtools\');install_github(\'IRkernel/repr\');install_github(\'IRkernel/IRdisplay\');install_github(\'IRkernel/IRkernel\');"')
             except:
-                sudo('R -e "options(download.file.method = "wget");library(\'devtools\');install_github(\'IRkernel/repr\');install_github(\'IRkernel/IRdisplay\');install_github(\'IRkernel/IRkernel\');"')
+                datalab.fab.conn.sudo('R -e "options(download.file.method = "wget");library(\'devtools\');install_github(\'IRkernel/repr\');install_github(\'IRkernel/IRdisplay\');install_github(\'IRkernel/IRkernel\');"')
             if os.environ['application'] == 'tensor-rstudio':
-                sudo('R -e "library(\'devtools\');install_version(\'keras\', version = \'{}\', repos = \'{}\');"'.format(os.environ['notebook_keras_version'],r_repository))
-            sudo('R -e "install.packages(\'RJDBC\',repos=\'{}\',dep=TRUE)"'.format(r_repository))
-            sudo('touch /home/' + os_user + '/.ensure_dir/r_ensured')
+                datalab.fab.conn.sudo('R -e "library(\'devtools\');install_version(\'keras\', version = \'{}\', repos = \'{}\');"'.format(os.environ['notebook_keras_version'],r_repository))
+            datalab.fab.conn.sudo('R -e "install.packages(\'RJDBC\',repos=\'{}\',dep=TRUE)"'.format(r_repository))
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/r_ensured')
         except:
             sys.exit(1)
 
 
-def install_rstudio(os_user, local_spark_path, rstudio_pass, rstudio_version):
-    if not exists('/home/' + os_user + '/.ensure_dir/rstudio_ensured'):
+def install_rstudio(os_user, local_spark_path, rstudio_pass, rstudio_version, python_venv_version=''):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/rstudio_ensured'):
         try:
             manage_pkg('-y install', 'remote', 'r-base')
             manage_pkg('-y install', 'remote', 'gdebi-core')
-            sudo('wget https://download2.rstudio.org/server/trusty/amd64/rstudio-server-{}-amd64.deb'.format(rstudio_version))
-            sudo('gdebi -n rstudio-server-{}-amd64.deb'.format(rstudio_version))
-            sudo('mkdir -p /mnt/var')
-            sudo('chown {0}:{0} /mnt/var'.format(os_user))
-            sudo("sed -i '/Type=forking/a \Environment=USER=dlab-user' /etc/systemd/system/rstudio-server.service")
-            sudo("sed -i '/ExecStart/s|=/usr/lib/rstudio-server/bin/rserver|=/bin/bash -c \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64; /usr/lib/rstudio-server/bin/rserver --auth-none 1|g' /etc/systemd/system/rstudio-server.service")
-            sudo("sed -i '/ExecStart/s|$|\"|g' /etc/systemd/system/rstudio-server.service")
-            sudo("systemctl daemon-reload")
-            sudo('touch /home/{}/.Renviron'.format(os_user))
-            sudo('chown {0}:{0} /home/{0}/.Renviron'.format(os_user))
-            sudo('''echo 'SPARK_HOME="{0}"' >> /home/{1}/.Renviron'''.format(local_spark_path, os_user))
-            sudo('touch /home/{}/.Rprofile'.format(os_user))
-            sudo('chown {0}:{0} /home/{0}/.Rprofile'.format(os_user))
-            sudo('''echo 'library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))' >> /home/{}/.Rprofile'''.format(os_user))
-            http_proxy = run('echo $http_proxy')
-            https_proxy = run('echo $https_proxy')
-            sudo('''echo 'Sys.setenv(http_proxy = \"{}\")' >> /home/{}/.Rprofile'''.format(http_proxy, os_user))
-            sudo('''echo 'Sys.setenv(https_proxy = \"{}\")' >> /home/{}/.Rprofile'''.format(https_proxy, os_user))
-            sudo('rstudio-server start')
-            sudo('echo "{0}:{1}" | chpasswd'.format(os_user, rstudio_pass))
-            sudo("sed -i '/exit 0/d' /etc/rc.local")
-            sudo('''bash -c "echo \'sed -i 's/^#SPARK_HOME/SPARK_HOME/' /home/{}/.Renviron\' >> /etc/rc.local"'''.format(os_user))
-            sudo("bash -c 'echo exit 0 >> /etc/rc.local'")
-            sudo('touch /home/{}/.ensure_dir/rstudio_ensured'.format(os_user))
+            datalab.fab.conn.sudo('wget https://download2.rstudio.org/server/bionic/amd64/rstudio-server-{}-amd64.deb'.format(rstudio_version))
+            datalab.fab.conn.sudo('gdebi -n rstudio-server-{}-amd64.deb'.format(rstudio_version))
+            datalab.fab.conn.sudo('mkdir -p /mnt/var')
+            datalab.fab.conn.sudo('chown {0}:{0} /mnt/var'.format(os_user))
+            http_proxy = datalab.fab.conn.run('''bash -l -c 'echo $http_proxy' ''').stdout.replace('\n','')
+            https_proxy = datalab.fab.conn.run('''bash -l -c 'echo $https_proxy' ''').stdout.replace('\n','')
+            datalab.fab.conn.sudo("sed -i '/Type=forking/a \Environment=USER=datalab-user' /lib/systemd/system/rstudio-server.service")
+            datalab.fab.conn.sudo("sed -i '/ExecStart/s|=/usr/lib/rstudio-server/bin/rserver|=/bin/bash -c \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64; /usr/lib/rstudio-server/bin/rserver --auth-none 1|g' /lib/systemd/system/rstudio-server.service")
+            datalab.fab.conn.sudo("sed -i '/ExecStart/s|$|\"|g' /lib/systemd/system/rstudio-server.service")
+            datalab.fab.conn.sudo(
+                'sed -i \'/\[Service\]/a Environment=\"HTTP_PROXY={}\"\'  /lib/systemd/system/rstudio-server.service'.format(
+                    http_proxy))
+            datalab.fab.conn.sudo(
+                'sed -i \'/\[Service\]/a Environment=\"HTTPS_PROXY={}\"\'  /lib/systemd/system/rstudio-server.service'.format(
+                    https_proxy))
+            java_home = datalab.fab.conn.run("update-alternatives --query java | grep -o \'/.*/java-8.*/jre\'").stdout.splitlines()[0].replace('\n','')
+            datalab.fab.conn.sudo('sed -i \'/\[Service\]/ a\Environment=\"JAVA_HOME={}\"\'  /lib/systemd/system/rstudio-server.service'.format(
+                java_home))
+            datalab.fab.conn.sudo("systemctl daemon-reload")
+            datalab.fab.conn.sudo('touch /home/{}/.Renviron'.format(os_user))
+            datalab.fab.conn.sudo('chown {0}:{0} /home/{0}/.Renviron'.format(os_user))
+            datalab.fab.conn.sudo('''echo 'SPARK_HOME="{0}"' >> /home/{1}/.Renviron'''.format(local_spark_path, os_user))
+            datalab.fab.conn.sudo('''echo 'JAVA_HOME="{0}"' >> /home/{1}/.Renviron'''.format(java_home, os_user))
+            datalab.fab.conn.sudo(
+                '''echo 'RETICULATE_PYTHON="/opt/python/python{0}/bin/python{1}"' >> /home/{2}/.Renviron'''.format(
+                    python_venv_version, python_venv_version[:3], os_user))
+            datalab.fab.conn.sudo(
+                '''echo 'LD_LIBRARY_PATH="/opt/python/python{0}/lib/"' >> /home/{1}/.Renviron'''.format(python_venv_version, os_user))
+            datalab.fab.conn.sudo('touch /home/{}/.Rprofile'.format(os_user))
+            datalab.fab.conn.sudo('chown {0}:{0} /home/{0}/.Rprofile'.format(os_user))
+            datalab.fab.conn.sudo('''echo 'library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))' >> /home/{}/.Rprofile'''.format(os_user))
+            datalab.fab.conn.sudo('''echo 'Sys.setenv(http_proxy = \"{}\")' >> /home/{}/.Rprofile'''.format(http_proxy, os_user))
+            datalab.fab.conn.sudo('''echo 'Sys.setenv(https_proxy = \"{}\")' >> /home/{}/.Rprofile'''.format(https_proxy, os_user))
+            datalab.fab.conn.sudo('rstudio-server start')
+            datalab.fab.conn.sudo('''bash -c 'echo "{0}:{1}" | chpasswd' '''.format(os_user, rstudio_pass))
+            #sudo("sed -i '/exit 0/d' /etc/rc.local")
+            #sudo('''bash -c "echo \'sed -i 's/^#SPARK_HOME/SPARK_HOME/' /home/{}/.Renviron\' >> /etc/rc.local"'''.format(os_user))
+            #sudo("bash -c 'echo exit 0 >> /etc/rc.local'")
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/rstudio_ensured'.format(os_user))
         except:
             sys.exit(1)
     else:
         try:
-            sudo('echo "{0}:{1}" | chpasswd'.format(os_user, rstudio_pass))
+            datalab.fab.conn.sudo('''bash -c 'echo "{0}:{1}" | chpasswd' '''.format(os_user, rstudio_pass))
         except:
             sys.exit(1)
 
 
 def ensure_matplot(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/matplot_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/matplot_ensured'):
         try:
-            sudo("sudo sed -i~orig -e 's/# deb-src/deb-src/' /etc/apt/sources.list")
+            datalab.fab.conn.sudo("sudo sed -i~orig -e 's/# deb-src/deb-src/' /etc/apt/sources.list")
             manage_pkg('update', 'remote', '')
-            manage_pkg('-y build-dep', 'remote', 'python-matplotlib')
-            sudo('pip2 install matplotlib==2.0.2 --no-cache-dir')
-            sudo('pip3 install matplotlib==2.0.2 --no-cache-dir')
+            manage_pkg('-y build-dep', 'remote', 'python3-matplotlib')
+            datalab.fab.conn.sudo('pip3 install matplotlib=={} --no-cache-dir'.format(os.environ['notebook_matplotlib_version']))
             if os.environ['application'] in ('tensor', 'deeplearning'):
-                sudo('python2.7 -m pip install -U numpy=={} --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-                sudo('python3.5 -m pip install -U numpy=={} --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-            sudo('touch /home/' + os_user + '/.ensure_dir/matplot_ensured')
+                datalab.fab.conn.sudo('python3.8 -m pip install -U numpy=={} --no-cache-dir'.format(os.environ['notebook_numpy_version']))
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/matplot_ensured')
         except:
             sys.exit(1)
 
 @backoff.on_exception(backoff.expo, SystemExit, max_tries=10)
 def add_sbt_key():
-    sudo(
-        'apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823')
+    datalab.fab.conn.sudo(
+        'curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | sudo apt-key add')
 
 def ensure_sbt(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/sbt_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/sbt_ensured'):
         try:
             manage_pkg('-y install', 'remote', 'apt-transport-https')
-            sudo('echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list')
+            datalab.fab.conn.sudo('echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list')
+
             add_sbt_key()
             manage_pkg('update', 'remote', '')
             manage_pkg('-y install', 'remote', 'sbt')
-            sudo('touch /home/' + os_user + '/.ensure_dir/sbt_ensured')
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/sbt_ensured')
         except:
             sys.exit(1)
 
 
 def ensure_scala(scala_link, scala_version, os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/scala_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/scala_ensured'):
         try:
-            sudo('wget {}scala-{}.deb -O /tmp/scala.deb'.format(scala_link, scala_version))
-            sudo('dpkg -i /tmp/scala.deb')
-            sudo('touch /home/' + os_user + '/.ensure_dir/scala_ensured')
+            datalab.fab.conn.sudo('hostname; pwd')
+            datalab.fab.conn.sudo('wget {}scala-{}.deb --tries=3 -O /tmp/scala.deb'.format(scala_link, scala_version))
+            datalab.fab.conn.sudo('dpkg -i /tmp/scala.deb')
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/scala_ensured')
         except:
             sys.exit(1)
 
 
 def ensure_jre_jdk(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/jre_jdk_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/jre_jdk_ensured'):
         try:
             manage_pkg('-y install', 'remote', 'default-jre')
             manage_pkg('-y install', 'remote', 'default-jdk')
-            sudo('touch /home/' + os_user + '/.ensure_dir/jre_jdk_ensured')
+            manage_pkg('-y install', 'remote', 'openjdk-8-jdk')
+            manage_pkg('-y install', 'remote', 'openjdk-8-jre')
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/jre_jdk_ensured')
         except:
             sys.exit(1)
 
 
 def ensure_additional_python_libs(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/additional_python_libs_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/additional_python_libs_ensured'):
         try:
             manage_pkg('-y install', 'remote', 'libjpeg8-dev zlib1g-dev')
             if os.environ['application'] in ('jupyter', 'zeppelin'):
-                sudo('pip2 install NumPy=={} SciPy pandas Sympy Pillow sklearn --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-                sudo('pip3 install NumPy=={} SciPy pandas Sympy Pillow sklearn --no-cache-dir'.format(os.environ['notebook_numpy_version']))
+                datalab.fab.conn.sudo('pip3 install NumPy=={} SciPy pandas Sympy Pillow sklearn --no-cache-dir'.format(os.environ['notebook_numpy_version']))
             if os.environ['application'] in ('tensor', 'deeplearning'):
-                sudo('pip2 install opencv-python h5py --no-cache-dir')
-                sudo('pip3 install opencv-python h5py --no-cache-dir')
-            sudo('touch /home/' + os_user + '/.ensure_dir/additional_python_libs_ensured')
+                datalab.fab.conn.sudo('pip3 install opencv-python h5py --no-cache-dir')
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/additional_python_libs_ensured')
         except:
             sys.exit(1)
 
 
 def ensure_python3_specific_version(python3_version, os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/python3_specific_version_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/python3_specific_version_ensured'):
         try:
             if len(python3_version) < 4:
                 python3_version = python3_version + ".0"
-            sudo('wget https://www.python.org/ftp/python/{0}/Python-{0}.tgz'.format(python3_version))
-            sudo('tar xzf Python-{0}.tgz; cd Python-{0}; ./configure --prefix=/usr/local; make altinstall'.format(python3_version))
-            sudo('touch /home/' + os_user + '/.ensure_dir/python3_specific_version_ensured')
+            datalab.fab.conn.sudo('wget https://www.python.org/ftp/python/{0}/Python-{0}.tgz'.format(python3_version))
+            datalab.fab.conn.sudo(''' bash -c 'tar xzf Python-{0}.tgz; cd Python-{0}; ./configure --prefix=/usr/local; make altinstall' '''.format(python3_version))
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/python3_specific_version_ensured')
         except:
             sys.exit(1)
 
-
-def ensure_python2_libraries(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/python2_libraries_ensured'):
-        try:
-            try:
-                manage_pkg('-y install', 'remote', 'libssl-dev python-virtualenv')
-            except:
-                sudo('pip2 install virtualenv --no-cache-dir')
-                manage_pkg('-y install', 'remote', 'libssl-dev')
-            try:
-                sudo('pip2 install tornado=={0} ipython ipykernel=={1} --no-cache-dir' \
-                     .format(os.environ['notebook_tornado_version'], os.environ['notebook_ipykernel_version']))
-            except:
-                sudo('pip2 install tornado=={0} ipython==5.0.0 ipykernel=={1} --no-cache-dir' \
-                     .format(os.environ['notebook_tornado_version'], os.environ['notebook_ipykernel_version']))
-            sudo('pip2 install -U pip=={} --no-cache-dir'.format(os.environ['conf_pip_version']))
-            sudo('pip2 install boto3 backoff --no-cache-dir')
-            sudo('pip2 install fabvenv fabric-virtualenv future --no-cache-dir')
-            sudo('touch /home/' + os_user + '/.ensure_dir/python2_libraries_ensured')
-        except:
-            sys.exit(1)
-
-
 def ensure_python3_libraries(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/python3_libraries_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/python3_libraries_ensured'):
         try:
-            manage_pkg('-y install', 'remote', 'python3-setuptools')
+            #manage_pkg('-y install', 'remote', 'python3-setuptools')
             manage_pkg('-y install', 'remote', 'python3-pip')
+            manage_pkg('-y install', 'remote', 'libkrb5-dev')
+            datalab.fab.conn.sudo('pip3 install -U keyrings.alt backoff')
+            datalab.fab.conn.sudo('pip3 install setuptools=={}'.format(os.environ['notebook_setuptools_version']))
             try:
-                sudo('pip3 install tornado=={0} ipython==7.9.0 ipykernel=={1} --no-cache-dir' \
+                datalab.fab.conn.sudo('pip3 install tornado=={0} ipython==7.21.0 ipykernel=={1} sparkmagic --no-cache-dir' \
                      .format(os.environ['notebook_tornado_version'], os.environ['notebook_ipykernel_version']))
             except:
-                sudo('pip3 install tornado=={0} ipython==5.0.0 ipykernel=={1} --no-cache-dir' \
+                datalab.fab.conn.sudo('pip3 install tornado=={0} ipython==7.9.0 ipykernel=={1} sparkmagic --no-cache-dir' \
                      .format(os.environ['notebook_tornado_version'], os.environ['notebook_ipykernel_version']))
-            sudo('pip3 install -U pip=={} --no-cache-dir'.format(os.environ['conf_pip_version']))
-            sudo('pip3 install boto3 --no-cache-dir')
-            sudo('pip3 install fabvenv fabric-virtualenv future --no-cache-dir')
-            sudo('touch /home/' + os_user + '/.ensure_dir/python3_libraries_ensured')
+            datalab.fab.conn.sudo('pip3 install -U pip=={} --no-cache-dir'.format(os.environ['conf_pip_version']))
+            datalab.fab.conn.sudo('pip3 install boto3 --no-cache-dir')
+            datalab.fab.conn.sudo('pip3 install fabvenv fabric-virtualenv future patchwork --no-cache-dir')
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/python3_libraries_ensured')
         except:
             sys.exit(1)
 
+def install_nvidia_drivers(os_user):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/nvidia_ensured'.format(os_user)):
+        try:
+            # install nvidia drivers
+            datalab.fab.conn.sudo(
+                'wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin')
+            datalab.fab.conn.sudo('mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600')
+            datalab.fab.conn.sudo(
+                'wget https://developer.download.nvidia.com/compute/cuda/11.4.0/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.0-470.42.01-1_amd64.deb')
+            datalab.fab.conn.sudo('dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.0-470.42.01-1_amd64.deb')
+            datalab.fab.conn.sudo('apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub')
+            manage_pkg('update', 'remote', '')
+            manage_pkg('-y install', 'remote', 'cuda')
+            #clean space on disk
+            manage_pkg('clean', 'remote', 'all')
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/nvidia_ensured'.format(os_user))
+        except Exception as err:
+            print('Failed to install_nvidia_drivers: ', str(err))
+            sys.exit(1)
 
 def install_tensor(os_user, cuda_version, cuda_file_name,
                    cudnn_version, cudnn_file_name, tensorflow_version,
                    templates_dir, nvidia_version):
-    if not exists('/home/{}/.ensure_dir/tensor_ensured'.format(os_user)):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/tensor_ensured'.format(os_user)):
         try:
             # install nvidia drivers
-            sudo('echo "blacklist nouveau" >> /etc/modprobe.d/blacklist-nouveau.conf')
-            sudo('echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist-nouveau.conf')
-            sudo('update-initramfs -u')
-            with settings(warn_only=True):
-                reboot(wait=150)
-            manage_pkg('-y install', 'remote', 'dkms')
-            kernel_version = run('uname -r | tr -d "[..0-9-]"')
-            if kernel_version == 'azure':
-                manage_pkg('-y install', 'remote', 'linux-modules-`uname -r`')
-            else:
-                #legacy support for old kernels
-                sudo('if [[ $(apt-cache search linux-image-`uname -r`) ]]; then apt-get -y install linux-image-`uname -r`; else apt-get -y install linux-modules-`uname -r`; fi;')
-            sudo('wget http://us.download.nvidia.com/XFree86/Linux-x86_64/{0}/NVIDIA-Linux-x86_64-{0}.run -O /home/{1}/NVIDIA-Linux-x86_64-{0}.run'.format(nvidia_version, os_user))
-            sudo('/bin/bash /home/{0}/NVIDIA-Linux-x86_64-{1}.run -s --dkms'.format(os_user, nvidia_version))
-            sudo('rm -f /home/{0}/NVIDIA-Linux-x86_64-{1}.run'.format(os_user, nvidia_version))
+            #datalab.fab.conn.sudo('''bash -c 'echo "blacklist nouveau" >> /etc/modprobe.d/blacklist-nouveau.conf' ''')
+            #datalab.fab.conn.sudo('''bash -c 'echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist-nouveau.conf' ''')
+            #datalab.fab.conn.sudo('update-initramfs -u')
+            #datalab.fab.conn.sudo('reboot', warn=True)
+            #time.sleep(60)
+            ##manage_pkg('-y install', 'remote', 'dkms libglvnd-dev')
+            #kernel_version = datalab.fab.conn.run('uname -r | tr -d "[..0-9-]"').stdout.replace('\n','')
+            #if kernel_version == 'azure':
+            #    manage_pkg('-y install', 'remote', 'linux-modules-`uname -r`')
+            #else:
+                # legacy support for old kernels
+            #    datalab.fab.conn.sudo(''' bash -c 'if [[ $(apt-cache search linux-image-`uname -r`) ]]; then apt-get -y '''
+            #    '''install linux-image-`uname -r`; else apt-get -y install linux-modules-`uname -r`; fi;' ''')
+            #datalab.fab.conn.sudo('wget https://us.download.nvidia.com/tesla/{0}/NVIDIA-Linux-x86_64-{0}.run -O '
+            #     '/home/{1}/NVIDIA-Linux-x86_64-{0}.run'.format(nvidia_version, os_user))
+            #datalab.fab.conn.sudo('/bin/bash /home/{0}/NVIDIA-Linux-x86_64-{1}.run -s --dkms'.format(os_user, nvidia_version))
+            #datalab.fab.conn.sudo('rm -f /home/{0}/NVIDIA-Linux-x86_64-{1}.run'.format(os_user, nvidia_version))
             # install cuda
-            sudo('python3.5 -m pip install --upgrade pip=={0} wheel numpy=={1} --no-cache-dir'. format(os.environ['conf_pip_version'], os.environ['notebook_numpy_version']))
-            sudo('wget -P /opt https://developer.nvidia.com/compute/cuda/{0}/prod/local_installers/{1}'.format(cuda_version, cuda_file_name))
-            sudo('sh /opt/{} --silent --toolkit'.format(cuda_file_name))
-            sudo('mv /usr/local/cuda-{} /opt/'.format(cuda_version))
-            sudo('ln -s /opt/cuda-{0} /usr/local/cuda-{0}'.format(cuda_version))
-            sudo('rm -f /opt/{}'.format(cuda_file_name))
+            #datalab.fab.conn.sudo('python3 -m pip install --upgrade pip=={0} wheel numpy=={1} --no-cache-dir'.format(
+            #    os.environ['conf_pip_version'], os.environ['notebook_numpy_version']))
+            #datalab.fab.conn.sudo('wget -P /opt https://developer.download.nvidia.com/compute/cuda/{0}/Prod/local_installers/{1}'.format(
+            #    cuda_version, cuda_file_name))
+            #datalab.fab.conn.sudo('apt -y install gcc-8 g++-8')
+            ##datalab.fab.conn.sudo('update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8')
+            #datalab.fab.conn.sudo('update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8')
+            #datalab.fab.conn.sudo('sh /opt/{} --silent --toolkit'.format(cuda_file_name))
+            #datalab.fab.conn.sudo('update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9')
+            #datalab.fab.conn.sudo('update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 9')
+            #datalab.fab.conn.sudo('mv /usr/local/cuda-{} /opt/'.format(cuda_version))
+            #datalab.fab.conn.sudo('ln -s /opt/cuda-{0} /usr/local/cuda-{0}'.format(cuda_version))
+            #datalab.fab.conn.sudo('rm -f /opt/{}'.format(cuda_file_name))
             # install cuDNN
-            run('wget http://developer.download.nvidia.com/compute/redist/cudnn/v{0}/{1} -O /tmp/{1}'.format(cudnn_version, cudnn_file_name))
-            run('tar xvzf /tmp/{} -C /tmp'.format(cudnn_file_name))
-            sudo('mkdir -p /opt/cudnn/include')
-            sudo('mkdir -p /opt/cudnn/lib64')
-            sudo('mv /tmp/cuda/include/cudnn.h /opt/cudnn/include')
-            sudo('mv /tmp/cuda/lib64/libcudnn* /opt/cudnn/lib64')
-            sudo('chmod a+r /opt/cudnn/include/cudnn.h /opt/cudnn/lib64/libcudnn*')
-            run('echo "export LD_LIBRARY_PATH=\"$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64\"" >> ~/.bashrc')
+            datalab.fab.conn.run('wget https://developer.download.nvidia.com/compute/redist/cudnn/v{0}/{1} -O /tmp/{1}'.format(
+                cudnn_version, cudnn_file_name))
+            datalab.fab.conn.run('tar xvzf /tmp/{} -C /tmp'.format(cudnn_file_name))
+            datalab.fab.conn.sudo('mkdir -p /opt/cudnn/include')
+            datalab.fab.conn.sudo('mkdir -p /opt/cudnn/lib64')
+            datalab.fab.conn.sudo('mv /tmp/cuda/include/cudnn.h /opt/cudnn/include')
+            datalab.fab.conn.sudo('mv /tmp/cuda/lib64/libcudnn* /opt/cudnn/lib64')
+            datalab.fab.conn.sudo('chmod a+r /opt/cudnn/include/cudnn.h /opt/cudnn/lib64/libcudnn*')
+            datalab.fab.conn.run('''bash -l -c 'echo "export LD_LIBRARY_PATH=\"$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64\"" >> ~/.bashrc' ''')
             # install TensorFlow and run TensorBoard
-            sudo('python2.7 -m pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-{}-cp27-none-linux_x86_64.whl --no-cache-dir'.format(tensorflow_version))
-            sudo('python3 -m pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-{}-cp35-cp35m-linux_x86_64.whl --no-cache-dir'.format(tensorflow_version))
-            sudo('mkdir /var/log/tensorboard; chown {0}:{0} -R /var/log/tensorboard'.format(os_user))
-            put('{}tensorboard.service'.format(templates_dir), '/tmp/tensorboard.service')
-            sudo("sed -i 's|OS_USR|{}|' /tmp/tensorboard.service".format(os_user))
-            sudo("chmod 644 /tmp/tensorboard.service")
-            sudo('\cp /tmp/tensorboard.service /etc/systemd/system/')
-            sudo("systemctl daemon-reload")
-            sudo("systemctl enable tensorboard")
-            sudo("systemctl start tensorboard")
-            sudo('touch /home/{}/.ensure_dir/tensor_ensured'.format(os_user))
+            # datalab.fab.conn.sudo('python2.7 -m pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-{}-cp27-none-linux_x86_64.whl --no-cache-dir'.format(tensorflow_version))
+            datalab.fab.install_venv_pip_pkg('tensorflow-gpu',tensorflow_version)
+            datalab.fab.conn.sudo('mkdir /var/log/tensorboard')
+            datalab.fab.conn.sudo('chown {0}:{0} -R /var/log/tensorboard'.format(os_user))
+            datalab.fab.conn.put('{}tensorboard.service'.format(templates_dir), '/tmp/tensorboard.service')
+            datalab.fab.conn.sudo("sed -i 's|OS_USR|{}|' /tmp/tensorboard.service".format(os_user))
+            venv_activation = 'source /opt/python/python{0}/bin/activate'.format(os.environ['notebook_python_venv_version'])
+            datalab.fab.conn.sudo("sed -i 's|VENV_ACTIVATION|{}|' /tmp/tensorboard.service".format(venv_activation))
+            http_proxy = datalab.fab.conn.run('''bash -l -c 'echo $http_proxy' ''').stdout.replace('\n','')
+            https_proxy = datalab.fab.conn.run('''bash -l -c 'echo $https_proxy' ''').stdout.replace('\n','')
+            datalab.fab.conn.sudo('sed -i \'/\[Service\]/ a\Environment=\"HTTP_PROXY={}\"\'  /tmp/tensorboard.service'.format(
+                http_proxy))
+            datalab.fab.conn.sudo('sed -i \'/\[Service\]/ a\Environment=\"HTTPS_PROXY={}\"\'  /tmp/tensorboard.service'.format(
+                https_proxy))
+            datalab.fab.conn.sudo("chmod 644 /tmp/tensorboard.service")
+            datalab.fab.conn.sudo('\cp /tmp/tensorboard.service /etc/systemd/system/')
+            datalab.fab.conn.sudo("systemctl daemon-reload")
+            datalab.fab.conn.sudo("systemctl enable tensorboard")
+            datalab.fab.conn.sudo("systemctl start tensorboard")
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/tensor_ensured'.format(os_user))
 
-        except:
+        except Exception as err:
+            print('Failed to install_tensor: ', str(err))
             sys.exit(1)
 
 
 def install_maven(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/maven_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/maven_ensured'):
         manage_pkg('-y install', 'remote', 'maven')
-        sudo('touch /home/' + os_user + '/.ensure_dir/maven_ensured')
+        datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/maven_ensured')
 
 def install_gcloud(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/gcloud_ensured'):
-        sudo('echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list')
-        sudo('curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -')
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/gcloud_ensured'):
+        datalab.fab.conn.sudo('echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list')
+        datalab.fab.conn.sudo('curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -')
         manage_pkg('-y install', 'remote', 'google-cloud-sdk')
-        sudo('touch /home/' + os_user + '/.ensure_dir/gcloud_ensured')
+        datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/gcloud_ensured')
 
 def install_livy_dependencies(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/livy_dependencies_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/livy_dependencies_ensured'):
         manage_pkg('-y install', 'remote', 'libkrb5-dev')
-        sudo('pip2 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir')
-        sudo('pip3 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir')
-        sudo('touch /home/' + os_user + '/.ensure_dir/livy_dependencies_ensured')
+        datalab.fab.conn.sudo('pip3 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir')
+        datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/livy_dependencies_ensured')
 
 
 def install_maven_emr(os_user):
     if not os.path.exists('/home/' + os_user + '/.ensure_dir/maven_ensured'):
         manage_pkg('-y install', 'local', 'maven')
-        local('touch /home/' + os_user + '/.ensure_dir/maven_ensured')
+        datalab.fab.conn.local('touch /home/' + os_user + '/.ensure_dir/maven_ensured')
 
 
 def install_livy_dependencies_emr(os_user):
     if not os.path.exists('/home/' + os_user + '/.ensure_dir/livy_dependencies_ensured'):
         manage_pkg('-y install', 'local', 'libkrb5-dev')
-        local('sudo pip2 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir')
-        local('sudo pip3 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir')
-        local('touch /home/' + os_user + '/.ensure_dir/livy_dependencies_ensured')
+        datalab.fab.conn.local('sudo pip3 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir')
+        datalab.fab.conn.local('touch /home/' + os_user + '/.ensure_dir/livy_dependencies_ensured')
 
 
 def install_nodejs(os_user):
-    if not exists('/home/{}/.ensure_dir/nodejs_ensured'.format(os_user)):
-        sudo('curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -')
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/nodejs_ensured'.format(os_user)):
+        datalab.fab.conn.sudo('curl -sL https://deb.nodesource.com/setup_15.x | sudo -E bash -')
         manage_pkg('-y install', 'remote', 'nodejs')
-        sudo('touch /home/{}/.ensure_dir/nodejs_ensured'.format(os_user))
+        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/nodejs_ensured'.format(os_user))
 
 
 def install_os_pkg(requisites):
     status = list()
-    error_parser = "Could not|No matching|Error:|failed|Requires:"
+    error_parser = "Could not|No matching|Error:|E:|failed|Requires:"
+    new_pkgs_parser = "The following NEW packages will be installed:"
     try:
         print("Updating repositories and installing requested tools: {}".format(requisites))
         manage_pkg('update', 'remote', '')
         for os_pkg in requisites:
-            sudo('DEBIAN_FRONTEND=noninteractive apt-get -y install {0} 2>&1 | if ! grep -w -E  "({1})" >  /tmp/os_install_{0}.log; then  echo "" > /tmp/os_install_{0}.log;fi'.format(os_pkg, error_parser))
-            err = sudo('cat /tmp/os_install_{}.log'.format(os_pkg)).replace('"', "'")
-            sudo('apt list --installed | if ! grep {0}/ > /tmp/os_install_{0}.list; then  echo "" > /tmp/os_install_{0}.list;fi'.format(os_pkg))
-            res = sudo('cat /tmp/os_install_{}.list'.format(os_pkg))
-            if res:
+            name, vers = os_pkg
+            if os_pkg[1] != '' and os_pkg[1] !='N/A':
+                version = os_pkg[1]
+                os_pkg = "{}={}".format(os_pkg[0], os_pkg[1])
+            else:
+                version = 'N/A'
+                os_pkg = os_pkg[0]
+            datalab.fab.conn.sudo('DEBIAN_FRONTEND=noninteractive apt-get -y install --allow-downgrades {0} 2>&1 | '
+                                  'tee /tmp/os_install_{2}.tmp; if ! grep -w -E "({1})" /tmp/os_install_{2}.tmp > '
+                                  '/tmp/os_install_{2}.log; then echo "no_error" > /tmp/os_install_{2}.log;fi'
+                                  .format(os_pkg, error_parser, name))
+            err = datalab.fab.conn.sudo('cat /tmp/os_install_{}.log'.format(name)).stdout.replace('"', "'")
+            datalab.fab.conn.sudo('cat /tmp/os_install_{0}.tmp | if ! grep -w -E -A 30 "({1})" /tmp/os_install_{0}.tmp > '
+                                  '/tmp/os_install_{0}.log; then echo "no_new_pkgs" > /tmp/os_install_{0}.log;fi'
+                                  .format(name, new_pkgs_parser))
+            dep = datalab.fab.conn.sudo('cat /tmp/os_install_{}.log'.format(name)).stdout
+            if 'no_new_pkgs' in dep:
+                dep = []
+            else:
+                dep = dep[len(new_pkgs_parser): dep.find(" upgraded, ") - 1].replace('\r', '') \
+                        .replace('\n', '').replace('  ', ' ').strip().split(' ')
+                for n, i in enumerate(dep):
+                    if i == name:
+                        dep[n] = ''
+                    else:
+                        datalab.fab.conn.sudo('apt show {0} 2>&1 | if ! grep Version: > '
+                 '/tmp/os_install_{0}.log; then echo "no_version" > /tmp/os_install_{0}.log;fi'.format(i))
+                        dep[n] = datalab.fab.conn.sudo('cat /tmp/os_install_{}.log'.format(i)).stdout.replace('Version: ', '{} v.'.format(i)).replace('\n', '')
+                dep = [i for i in dep if i]
+            versions = []
+            datalab.fab.conn.sudo('apt list --installed | if ! grep {0}/ > /tmp/os_install_{0}.list; then  echo "not_installed" > /tmp/os_install_{0}.list;fi'.format(name))
+            res = datalab.fab.conn.sudo('cat /tmp/os_install_{}.list'.format(name)).stdout.replace('\n', '')
+            if "no_error" not in err:
+                status_msg = 'installation_error'
+                if 'E: Unable to locate package {}'.format(name) in err:
+                    status_msg = 'invalid_name'
+            elif "not_installed" not in res:
                 ansi_escape = re.compile(r'\x1b[^m]*m')
                 ver = ansi_escape.sub('', res).split("\r\n")
-                version = [i for i in ver if os_pkg in i][0].split(' ')[1]
-                status.append({"group": "os_pkg", "name": os_pkg, "version": version, "status": "installed"})
-            else:
-                status.append({"group": "os_pkg", "name": os_pkg, "status": "failed", "error_message": err})
-        sudo('unattended-upgrades -v')
-        sudo('export LC_ALL=C')
+                version = [i for i in ver if os_pkg.split("=")[0] in i][0].split(' ')[1]
+                status_msg = "installed"
+            if 'E: Version' in err and 'was not found' in err:
+                versions = datalab.fab.conn.sudo('apt-cache policy {} | grep 500 | grep -v Packages'.format(name)).stdout\
+                    .replace('\r\n', '').replace(' 500', '').replace('     ', ' ').replace('***', '').strip().split(' ')
+                if versions != '':
+                    status_msg = 'invalid_version'
+            status.append({"group": "os_pkg", "name": name, "version": version, "status": status_msg,
+                           "error_message": err, "add_pkgs": dep, "available_versions": versions})
+        datalab.fab.conn.sudo('unattended-upgrades -v')
+        #datalab.fab.conn.sudo('export LC_ALL=C')
+        datalab.fab.conn.sudo('rm /tmp/*{}*'.format(name))
         return status
-    except:
-        return "Fail to install OS packages"
+    except Exception as err:
+        for os_pkg in requisites:
+            name, vers = os_pkg
+            status.append(
+                {"group": "os_pkg", "name": name, "version": vers, "status": 'installation_error', "error_message": err})
+        print("Failed to install OS packages: {}".format(requisites))
+        return status
 
 
 @backoff.on_exception(backoff.expo, SystemExit, max_tries=10)
 def remove_os_pkg(pkgs):
     try:
-        sudo('apt remove --purge -y {}'.format(' '.join(pkgs)))
+        datalab.fab.conn.sudo('apt remove --purge -y {}'.format(' '.join(pkgs)))
     except:
         sys.exit(1)
 
@@ -401,8 +490,8 @@
         os_pkgs = dict()
         ansi_escape = re.compile(r'\x1b[^m]*m')
         manage_pkg('update', 'remote', '')
-        apt_raw = sudo("apt list")
-        apt_list = ansi_escape.sub('', apt_raw).split("\r\n")
+        apt_raw = datalab.fab.conn.sudo("apt list").stdout
+        apt_list = ansi_escape.sub('', apt_raw).split("\n")
         for pkg in apt_list:
             if "/" in pkg:
                 os_pkgs[pkg.split('/')[0]] = pkg.split(' ')[1]
@@ -412,76 +501,67 @@
 
 
 def install_caffe2(os_user, caffe2_version, cmake_version):
-    if not exists('/home/{}/.ensure_dir/caffe2_ensured'.format(os_user)):
-        env.shell = "/bin/bash -l -c -i"
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/caffe2_ensured'.format(os_user)):
         manage_pkg('update', 'remote', '')
-        manage_pkg('-y install --no-install-recommends', 'remote', 'build-essential cmake git libgoogle-glog-dev libprotobuf-dev protobuf-compiler python-dev python-pip')
-        sudo('pip2 install numpy=={} protobuf --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-        sudo('pip3 install numpy=={} protobuf --no-cache-dir'.format(os.environ['notebook_numpy_version']))
+        manage_pkg('-y install --no-install-recommends', 'remote', 'build-essential cmake git libgoogle-glog-dev '
+                   'libprotobuf-dev protobuf-compiler python3-dev python3-pip')
+        datalab.fab.conn.sudo('pip3 install numpy=={} protobuf --no-cache-dir'.format(os.environ['notebook_numpy_version']))
         manage_pkg('-y install --no-install-recommends', 'remote', 'libgflags-dev')
-        manage_pkg('-y install --no-install-recommends', 'remote', 'libgtest-dev libiomp-dev libleveldb-dev liblmdb-dev libopencv-dev libopenmpi-dev libsnappy-dev openmpi-bin openmpi-doc python-pydot')
-        sudo('pip2 install flask graphviz hypothesis jupyter matplotlib==2.0.2 pydot python-nvd3 pyyaml requests scikit-image '
-             'scipy setuptools tornado --no-cache-dir')
-        sudo('pip3 install flask graphviz hypothesis jupyter matplotlib==2.0.2 pydot python-nvd3 pyyaml requests scikit-image '
-             'scipy setuptools tornado --no-cache-dir')
-        sudo('cp -f /opt/cudnn/include/* /opt/cuda-8.0/include/')
-        sudo('cp -f /opt/cudnn/lib64/* /opt/cuda-8.0/lib64/')
-        sudo('wget https://cmake.org/files/v{2}/cmake-{1}.tar.gz -O /home/{0}/cmake-{1}.tar.gz'.format(
+        manage_pkg('-y install --no-install-recommends', 'remote', 'libgtest-dev libiomp-dev libleveldb-dev liblmdb-dev '
+                   'libopencv-dev libopenmpi-dev libsnappy-dev openmpi-bin openmpi-doc python-pydot')
+        datalab.fab.conn.sudo('pip3 install flask graphviz hypothesis jupyter matplotlib=={} pydot python-nvd3 pyyaml requests scikit-image '
+             'scipy tornado --no-cache-dir'.format(os.environ['notebook_matplotlib_version']))
+        datalab.fab.conn.sudo('cp -f /opt/cudnn/include/* /opt/cuda-{}/include/'.format(os.environ['notebook_cuda_version']))
+        datalab.fab.conn.sudo('cp -f /opt/cudnn/lib64/* /opt/cuda-{}/lib64/'.format(os.environ['notebook_cuda_version']))
+        datalab.fab.conn.sudo('wget https://cmake.org/files/v{2}/cmake-{1}.tar.gz -O /home/{0}/cmake-{1}.tar.gz'.format(
             os_user, cmake_version, cmake_version.split('.')[0] + "." + cmake_version.split('.')[1]))
-        sudo('tar -zxvf cmake-{}.tar.gz'.format(cmake_version))
-        with cd('/home/{}/cmake-{}/'.format(os_user, cmake_version)):
-            sudo('./bootstrap --prefix=/usr/local && make && make install')
-        sudo('ln -s /usr/local/bin/cmake /bin/cmake{}'.format(cmake_version))
-        sudo('git clone https://github.com/pytorch/pytorch.git')
-        with cd('/home/{}/pytorch/'.format(os_user)):
-            sudo('git submodule update --init')
-            with settings(warn_only=True):
-                sudo('git checkout v{}'.format(caffe2_version))
-                sudo('git submodule update --recursive')
-            sudo('mkdir build && cd build && cmake{} .. && make "-j$(nproc)" install'.format(cmake_version))
-        sudo('touch /home/' + os_user + '/.ensure_dir/caffe2_ensured')
+        datalab.fab.conn.sudo('tar -zxvf cmake-{}.tar.gz'.format(cmake_version))
+        datalab.fab.conn.sudo('''bash -c 'cd /home/{}/cmake-{}/ && ./bootstrap --prefix=/usr/local && make && make install' '''.format(os_user, cmake_version))
+        datalab.fab.conn.sudo('ln -s /usr/local/bin/cmake /bin/cmake{}'.format(cmake_version))
+        datalab.fab.conn.sudo('git clone https://github.com/pytorch/pytorch.git')
+        datalab.fab.conn.sudo('''bash -c 'cd /home/{}/pytorch/ && git submodule update --init' '''.format(os_user))
+        datalab.fab.conn.sudo('''bash -c 'cd /home/{}/pytorch/ && git checkout {}' '''.format(os_user, os.environ['notebook_pytorch_branch']), warn=True)
+        datalab.fab.conn.sudo('''bash -c 'cd /home/{}/pytorch/ && git submodule update --init --recursive' '''.format(os_user), warn=True)
+        datalab.fab.conn.sudo('''bash -c 'cd /home/{}/pytorch/ && python3 setup.py install' '''.format(os_user))
+        datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/caffe2_ensured')
 
 
 def install_cntk(os_user, cntk_version):
-    if not exists('/home/{}/.ensure_dir/cntk_ensured'.format(os_user)):
-        sudo('pip2 install https://cntk.ai/PythonWheel/GPU/cntk-{}-cp27-cp27mu-linux_x86_64.whl --no-cache-dir'.format(cntk_version))
-        sudo('pip3 install https://cntk.ai/PythonWheel/GPU/cntk-{}-cp35-cp35m-linux_x86_64.whl --no-cache-dir'.format(cntk_version))
-        sudo('touch /home/{}/.ensure_dir/cntk_ensured'.format(os_user))
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/cntk_ensured'.format(os_user)):
+        datalab.fab.conn.sudo('pip3 install cntk-gpu=={} --no-cache-dir'.format(cntk_version))
+        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/cntk_ensured'.format(os_user))
 
 
 def install_keras(os_user, keras_version):
-    if not exists('/home/{}/.ensure_dir/keras_ensured'.format(os_user)):
-        sudo('pip2 install keras=={} --no-cache-dir'.format(keras_version))
-        sudo('pip3 install keras=={} --no-cache-dir'.format(keras_version))
-        sudo('touch /home/{}/.ensure_dir/keras_ensured'.format(os_user))
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/keras_ensured'.format(os_user)):
+        datalab.fab.install_venv_pip_pkg('keras',keras_version)
+        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/keras_ensured'.format(os_user))
 
 
 def install_theano(os_user, theano_version):
-    if not exists('/home/{}/.ensure_dir/theano_ensured'.format(os_user)):
-        sudo('python2.7 -m pip install Theano=={} --no-cache-dir'.format(theano_version))
-        sudo('python3 -m pip install Theano=={} --no-cache-dir'.format(theano_version))
-        sudo('touch /home/{}/.ensure_dir/theano_ensured'.format(os_user))
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/theano_ensured'.format(os_user)):
+        datalab.fab.install_venv_pip_pkg('Theano',theano_version)
+        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/theano_ensured'.format(os_user))
 
 
 def install_mxnet(os_user, mxnet_version):
-    if not exists('/home/{}/.ensure_dir/mxnet_ensured'.format(os_user)):
-        sudo('pip2 install mxnet-cu80=={} opencv-python --no-cache-dir'.format(mxnet_version))
-        sudo('pip3 install mxnet-cu80=={} opencv-python --no-cache-dir'.format(mxnet_version))
-        sudo('touch /home/{}/.ensure_dir/mxnet_ensured'.format(os_user))
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/mxnet_ensured'.format(os_user)):
+        datalab.fab.conn.sudo('pip3 install mxnet-cu101=={} opencv-python --no-cache-dir'.format(mxnet_version))
+        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/mxnet_ensured'.format(os_user))
 
 
-def install_torch(os_user):
-    if not exists('/home/{}/.ensure_dir/torch_ensured'.format(os_user)):
-        run('git clone https://github.com/torch/distro.git ~/torch --recursive')
-        with cd('/home/{}/torch/'.format(os_user)):
-            run('bash install-deps;')
-            run('./install.sh -b')
-        run('source /home/{}/.bashrc'.format(os_user))
-        sudo('touch /home/{}/.ensure_dir/torch_ensured'.format(os_user))
+#def install_torch(os_user):
+#    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/torch_ensured'.format(os_user)):
+#        run('git clone https://github.com/nagadomi/distro.git ~/torch --recursive')
+#        with cd('/home/{}/torch/'.format(os_user)):
+#           run('bash install-deps;')
+#           run('./install.sh -b')
+#        run('source /home/{}/.bashrc'.format(os_user))
+#        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/torch_ensured'.format(os_user))
 
 
 def install_gitlab_cert(os_user, certfile):
     try:
-        sudo('mv -f /home/{0}/{1} /etc/ssl/certs/{1}'.format(os_user, certfile))
+        datalab.fab.conn.sudo('mv -f /home/{0}/{1} /etc/ssl/certs/{1}'.format(os_user, certfile))
     except Exception as err:
         print('Failed to install gitlab certificate. {}'.format(str(err)))
diff --git a/infrastructure-provisioning/src/general/lib/os/debian/ssn_lib.py b/infrastructure-provisioning/src/general/lib/os/debian/ssn_lib.py
index f4cda59..c1584c8 100644
--- a/infrastructure-provisioning/src/general/lib/os/debian/ssn_lib.py
+++ b/infrastructure-provisioning/src/general/lib/os/debian/ssn_lib.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,125 +21,130 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
 import crypt
-import yaml
-from dlab.fab import *
-from dlab.meta_lib import *
-import os
 import json
-import traceback
+import os
 import sys
-from dlab.common_lib import manage_pkg
+import traceback
+from datalab.common_lib import manage_pkg
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
+import subprocess
 
-
-def ensure_docker_daemon(dlab_path, os_user, region):
+def ensure_docker_daemon(datalab_path, os_user, region):
     try:
-        if not exists(dlab_path + 'tmp/docker_daemon_ensured'):
+        if not exists(datalab.fab.conn, datalab_path + 'tmp/docker_daemon_ensured'):
             docker_version = os.environ['ssn_docker_version']
-            sudo('curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -')
-            sudo('add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) \
+            datalab.fab.conn.sudo('curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -')
+            datalab.fab.conn.sudo('add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) \
                   stable"')
             manage_pkg('update', 'remote', '')
-            sudo('apt-cache policy docker-ce')
-            manage_pkg('-y install', 'remote', 'docker-ce={}~ce~3-0~ubuntu'.format(docker_version))
-            sudo('usermod -a -G docker ' + os_user)
-            sudo('update-rc.d docker defaults')
-            sudo('update-rc.d docker enable')
-            sudo('touch ' + dlab_path + 'tmp/docker_daemon_ensured')
+            datalab.fab.conn.sudo('apt-cache policy docker-ce')
+            manage_pkg('-y install', 'remote', 'docker-ce=5:{}~3-0~ubuntu-focal'.format(docker_version))
+            datalab.fab.conn.sudo('usermod -a -G docker ' + os_user)
+            datalab.fab.conn.sudo('update-rc.d docker defaults')
+            datalab.fab.conn.sudo('update-rc.d docker enable')
+            datalab.fab.conn.sudo('touch ' + datalab_path + 'tmp/docker_daemon_ensured')
         return True
     except:
+        traceback.print_exc()
+        print('Failed to ensure_docker_daemon')
         return False
 
 
-def ensure_nginx(dlab_path):
+def ensure_nginx(datalab_path):
     try:
-        if not exists(dlab_path + 'tmp/nginx_ensured'):
+        if not exists(datalab.fab.conn,datalab_path + 'tmp/nginx_ensured'):
             manage_pkg('-y install', 'remote', 'nginx')
-            sudo('service nginx restart')
-            sudo('update-rc.d nginx defaults')
-            sudo('update-rc.d nginx enable')
-            sudo('touch ' + dlab_path + 'tmp/nginx_ensured')
+            datalab.fab.conn.sudo('service nginx restart')
+            datalab.fab.conn.sudo('update-rc.d nginx defaults')
+            datalab.fab.conn.sudo('update-rc.d nginx enable')
+            datalab.fab.conn.sudo('touch ' + datalab_path + 'tmp/nginx_ensured')
     except Exception as err:
         traceback.print_exc()
         print('Failed to ensure Nginx: ', str(err))
         sys.exit(1)
 
 
-def ensure_jenkins(dlab_path):
+def ensure_jenkins(datalab_path):
     try:
-        if not exists(dlab_path + 'tmp/jenkins_ensured'):
-            sudo('wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | apt-key add -')
-            sudo('echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list')
+        if not exists(datalab.fab.conn,datalab_path + 'tmp/jenkins_ensured'):
+            datalab.fab.conn.sudo('wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -')
+            datalab.fab.conn.sudo('echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list')
             manage_pkg('-y update', 'remote', '')
             manage_pkg('-y install', 'remote', 'jenkins')
-            sudo('touch ' + dlab_path + 'tmp/jenkins_ensured')
+            datalab.fab.conn.sudo('touch ' + datalab_path + 'tmp/jenkins_ensured')
     except Exception as err:
         traceback.print_exc()
         print('Failed to ensure Jenkins: ', str(err))
         sys.exit(1)
 
 
-def configure_jenkins(dlab_path, os_user, config, tag_resource_id):
+def configure_jenkins(datalab_path, os_user, config, tag_resource_id):
     try:
-        if not exists(dlab_path + 'tmp/jenkins_configured'):
-            sudo('echo \'JENKINS_ARGS="--prefix=/jenkins --httpPort=8070"\' >> /etc/default/jenkins')
-            sudo('rm -rf /var/lib/jenkins/*')
-            sudo('mkdir -p /var/lib/jenkins/jobs/')
-            sudo('chown -R ' + os_user + ':' + os_user + ' /var/lib/jenkins/')
-            put('/root/templates/jenkins_jobs/*', '/var/lib/jenkins/jobs/')
-            sudo("find /var/lib/jenkins/jobs/ -type f | xargs sed -i \'s/OS_USR/{}/g; s/SBN/{}/g; s/CTUN/{}/g; s/SGI/{}/g; s/VPC/{}/g; s/SNI/{}/g; s/AKEY/{}/g\'".format(os_user, config['service_base_name'], tag_resource_id, config['security_group_id'], config['vpc_id'], config['subnet_id'], config['admin_key']))
-            sudo('chown -R jenkins:jenkins /var/lib/jenkins')
-            sudo('/etc/init.d/jenkins stop; sleep 5')
-            sudo('sysv-rc-conf jenkins on')
-            sudo('service jenkins start')
-            sudo('touch ' + dlab_path + '/tmp/jenkins_configured')
-            sudo('echo "jenkins ALL = NOPASSWD:ALL" >> /etc/sudoers')
+        if not exists(datalab.fab.conn,datalab_path + 'tmp/jenkins_configured'):
+            datalab.fab.conn.sudo('echo \'JENKINS_ARGS="--prefix=/jenkins --httpPort=8070"\' >> /etc/default/jenkins')
+            datalab.fab.conn.sudo('rm -rf /var/lib/jenkins/*')
+            datalab.fab.conn.sudo('mkdir -p /var/lib/jenkins/jobs/')
+            datalab.fab.conn.sudo('chown -R ' + os_user + ':' + os_user + ' /var/lib/jenkins/')
+            datalab.fab.conn.put('/root/templates/jenkins_jobs/*', '/var/lib/jenkins/jobs/')
+            datalab.fab.conn.sudo(
+                "find /var/lib/jenkins/jobs/ -type f | xargs sed -i \'s/OS_USR/{}/g; s/SBN/{}/g; s/CTUN/{}/g; s/SGI/{}/g; s/VPC/{}/g; s/SNI/{}/g; s/AKEY/{}/g\'".format(
+                    os_user, config['service_base_name'], tag_resource_id, config['security_group_id'],
+                    config['vpc_id'], config['subnet_id'], config['admin_key']))
+            datalab.fab.conn.sudo('chown -R jenkins:jenkins /var/lib/jenkins')
+            datalab.fab.conn.sudo('/etc/init.d/jenkins stop; sleep 5')
+            datalab.fab.conn.sudo('systemctl enable jenkins')
+            datalab.fab.conn.sudo('systemctl start jenkins')
+            datalab.fab.conn.sudo('touch ' + datalab_path + '/tmp/jenkins_configured')
+            datalab.fab.conn.sudo('echo "jenkins ALL = NOPASSWD:ALL" >> /etc/sudoers')
     except Exception as err:
         traceback.print_exc()
         print('Failed to configure Jenkins: ', str(err))
         sys.exit(1)
 
 
-def configure_nginx(config, dlab_path, hostname):
+def configure_nginx(config, datalab_path, hostname):
     try:
         random_file_part = id_generator(size=20)
-        if not exists("/etc/nginx/conf.d/nginx_proxy.conf"):
-            sudo('useradd -r nginx')
-            sudo('rm -f /etc/nginx/conf.d/*')
-            put(config['nginx_template_dir'] + 'ssn_nginx.conf', '/tmp/nginx.conf')
-            put(config['nginx_template_dir'] + 'nginx_proxy.conf', '/tmp/nginx_proxy.conf')
-            sudo("sed -i 's|SSN_HOSTNAME|" + hostname + "|' /tmp/nginx_proxy.conf")
-            sudo('mv /tmp/nginx.conf ' + dlab_path + 'tmp/')
-            sudo('mv /tmp/nginx_proxy.conf ' + dlab_path + 'tmp/')
-            sudo('\cp ' + dlab_path + 'tmp/nginx.conf /etc/nginx/')
-            sudo('\cp ' + dlab_path + 'tmp/nginx_proxy.conf /etc/nginx/conf.d/')
-            sudo('mkdir -p /etc/nginx/locations')
-            sudo('rm -f /etc/nginx/sites-enabled/default')
+        if not exists(datalab.fab.conn,"/etc/nginx/conf.d/nginx_proxy.conf"):
+            datalab.fab.conn.sudo('useradd -r nginx')
+            datalab.fab.conn.sudo('rm -f /etc/nginx/conf.d/*')
+            datalab.fab.conn.put(config['nginx_template_dir'] + 'ssn_nginx.conf', '/tmp/nginx.conf')
+            datalab.fab.conn.put(config['nginx_template_dir'] + 'nginx_proxy.conf', '/tmp/nginx_proxy.conf')
+            datalab.fab.conn.sudo("sed -i 's|SSN_HOSTNAME|" + hostname + "|' /tmp/nginx_proxy.conf")
+            datalab.fab.conn.sudo('mv /tmp/nginx.conf ' + datalab_path + 'tmp/')
+            datalab.fab.conn.sudo('mv /tmp/nginx_proxy.conf ' + datalab_path + 'tmp/')
+            datalab.fab.conn.sudo('\cp ' + datalab_path + 'tmp/nginx.conf /etc/nginx/')
+            datalab.fab.conn.sudo('\cp ' + datalab_path + 'tmp/nginx_proxy.conf /etc/nginx/conf.d/')
+            datalab.fab.conn.sudo('mkdir -p /etc/nginx/locations')
+            datalab.fab.conn.sudo('rm -f /etc/nginx/sites-enabled/default')
     except Exception as err:
         traceback.print_exc()
         print('Failed to configure Nginx: ', str(err))
         sys.exit(1)
 
     try:
-        if not exists("/etc/nginx/locations/proxy_location_jenkins.conf"):
+        if not exists(datalab.fab.conn,"/etc/nginx/locations/proxy_location_jenkins.conf"):
             nginx_password = id_generator()
             template_file = config['nginx_template_dir'] + 'proxy_location_jenkins_template.conf'
             with open("/tmp/%s-tmpproxy_location_jenkins_template.conf" % random_file_part, 'w') as out:
                 with open(template_file) as tpl:
                     for line in tpl:
                         out.write(line)
-            put("/tmp/%s-tmpproxy_location_jenkins_template.conf" % random_file_part, '/tmp/proxy_location_jenkins.conf')
-            sudo('mv /tmp/proxy_location_jenkins.conf ' + os.environ['ssn_dlab_path'] + 'tmp/')
-            sudo('\cp ' + os.environ['ssn_dlab_path'] + 'tmp/proxy_location_jenkins.conf /etc/nginx/locations/')
-            sudo("echo 'engineer:" + crypt.crypt(nginx_password, id_generator()) + "' > /etc/nginx/htpasswd")
+            datalab.fab.conn.put("/tmp/%s-tmpproxy_location_jenkins_template.conf" % random_file_part,
+                '/tmp/proxy_location_jenkins.conf')
+            datalab.fab.conn.sudo('mv /tmp/proxy_location_jenkins.conf ' + os.environ['ssn_datalab_path'] + 'tmp/')
+            datalab.fab.conn.sudo('\cp ' + os.environ['ssn_datalab_path'] + 'tmp/proxy_location_jenkins.conf /etc/nginx/locations/')
+            datalab.fab.conn.sudo('''bash -c "echo 'engineer:{}' > /etc/nginx/htpasswd"'''.format(crypt.crypt(nginx_password, id_generator())))
             with open('jenkins_creds.txt', 'w+') as f:
                 f.write("Jenkins credentials: engineer  / " + nginx_password)
     except:
         return False
 
     try:
-        sudo('service nginx reload')
+        datalab.fab.conn.sudo('service nginx reload')
         return True
     except:
         return False
@@ -147,11 +152,11 @@
 
 def ensure_supervisor():
     try:
-        if not exists(os.environ['ssn_dlab_path'] + 'tmp/superv_ensured'):
+        if not exists(datalab.fab.conn,os.environ['ssn_datalab_path'] + 'tmp/superv_ensured'):
             manage_pkg('-y install', 'remote', 'supervisor')
-            sudo('update-rc.d supervisor defaults')
-            sudo('update-rc.d supervisor enable')
-            sudo('touch ' + os.environ['ssn_dlab_path'] + 'tmp/superv_ensured')
+            datalab.fab.conn.sudo('update-rc.d supervisor defaults')
+            datalab.fab.conn.sudo('update-rc.d supervisor enable')
+            datalab.fab.conn.sudo('touch ' + os.environ['ssn_datalab_path'] + 'tmp/superv_ensured')
     except Exception as err:
         traceback.print_exc()
         print('Failed to install Supervisor: ', str(err))
@@ -160,47 +165,50 @@
 
 def ensure_mongo():
     try:
-        if not exists(os.environ['ssn_dlab_path'] + 'tmp/mongo_ensured'):
-            sudo('apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927')
-            sudo('ver=`lsb_release -cs`; echo "deb http://repo.mongodb.org/apt/ubuntu $ver/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list; apt-get update')
-            manage_pkg('-y --allow-unauthenticated install', 'remote', 'mongodb-org')
-            sudo('systemctl enable mongod.service')
-            sudo('touch ' + os.environ['ssn_dlab_path'] + 'tmp/mongo_ensured')
+        if not exists(datalab.fab.conn,os.environ['ssn_datalab_path'] + 'tmp/mongo_ensured'):
+            datalab.fab.conn.sudo('wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -')
+            os_version = datalab.fab.conn.sudo('lsb_release -cs').stdout.replace('\n', '')
+            datalab.fab.conn.sudo('echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu {}/mongodb-org/4.4 '
+                                  'multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list'.format(os_version))
+            manage_pkg('update', 'remote', '')
+            manage_pkg('-y install', 'remote', 'mongodb-org')
+            datalab.fab.conn.sudo('systemctl enable mongod.service')
+            datalab.fab.conn.sudo('touch ' + os.environ['ssn_datalab_path'] + 'tmp/mongo_ensured')
     except Exception as err:
         traceback.print_exc()
         print('Failed to install MongoDB: ', str(err))
         sys.exit(1)
 
 
-def start_ss(keyfile, host_string, dlab_conf_dir, web_path,
+def start_ss(keyfile, host_string, datalab_conf_dir, web_path,
              os_user, mongo_passwd, keystore_passwd, cloud_provider,
              service_base_name, tag_resource_id, billing_tag, account_id, billing_bucket,
-             aws_job_enabled, dlab_path, billing_enabled, cloud_params,
+             aws_job_enabled, datalab_path, billing_enabled, cloud_params,
              authentication_file, offer_number, currency,
              locale, region_info, ldap_login, tenant_id,
              application_id, hostname, data_lake_name, subscription_id,
-             validate_permission_scope, dlab_id, usage_date, product,
+             validate_permission_scope, datalab_id, usage_date, product,
              usage_type, usage, cost, resource_id, tags, billing_dataset_name, keycloak_client_id,
              keycloak_client_secret, keycloak_auth_server_url, report_path=''):
     try:
-        if not exists(os.environ['ssn_dlab_path'] + 'tmp/ss_started'):
-            java_path = sudo("update-alternatives --query java | grep 'Value: ' | grep -o '/.*/jre'")
+        if not exists(datalab.fab.conn,os.environ['ssn_datalab_path'] + 'tmp/ss_started'):
+            java_path = datalab.fab.conn.sudo("update-alternatives --query java | grep 'Value: ' | grep -o '/.*/jre'").stdout.replace('\n','')
             supervisor_conf = '/etc/supervisor/conf.d/supervisor_svc.conf'
-            local('sed -i "s|MONGO_PASSWORD|{}|g" /root/templates/ssn.yml'.format(mongo_passwd))
-            local('sed -i "s|KEYSTORE_PASSWORD|{}|g" /root/templates/ssn.yml'.format(keystore_passwd))
-            local('sed -i "s|CLOUD_PROVIDER|{}|g" /root/templates/ssn.yml'.format(cloud_provider))
-            local('sed -i "s|\${JRE_HOME}|' + java_path + '|g" /root/templates/ssn.yml')
-            sudo('sed -i "s|KEYNAME|{}|g" {}/webapp/provisioning-service/conf/provisioning.yml'.
-                 format(os.environ['conf_key_name'], dlab_path))
-            put('/root/templates/ssn.yml', '/tmp/ssn.yml')
-            sudo('mv /tmp/ssn.yml ' + os.environ['ssn_dlab_path'] + 'conf/')
-            put('/root/templates/proxy_location_webapp_template.conf', '/tmp/proxy_location_webapp_template.conf')
-            sudo('mv /tmp/proxy_location_webapp_template.conf ' + os.environ['ssn_dlab_path'] + 'tmp/')
+            datalab.fab.conn.local('sed -i "s|MONGO_PASSWORD|{}|g" /root/templates/ssn.yml'.format(mongo_passwd))
+            datalab.fab.conn.local('sed -i "s|KEYSTORE_PASSWORD|{}|g" /root/templates/ssn.yml'.format(keystore_passwd))
+            datalab.fab.conn.local('sed -i "s|CLOUD_PROVIDER|{}|g" /root/templates/ssn.yml'.format(cloud_provider))
+            datalab.fab.conn.local('sed -i "s|\${JRE_HOME}|' + java_path + '|g" /root/templates/ssn.yml')
+            datalab.fab.conn.sudo('sed -i "s|KEYNAME|{}|g" {}/webapp/provisioning-service/conf/provisioning.yml'.
+                 format(os.environ['conf_key_name'], datalab_path))
+            datalab.fab.conn.put('/root/templates/ssn.yml', '/tmp/ssn.yml')
+            datalab.fab.conn.sudo('mv /tmp/ssn.yml ' + os.environ['ssn_datalab_path'] + 'conf/')
+            datalab.fab.conn.put('/root/templates/proxy_location_webapp_template.conf', '/tmp/proxy_location_webapp_template.conf')
+            datalab.fab.conn.sudo('mv /tmp/proxy_location_webapp_template.conf ' + os.environ['ssn_datalab_path'] + 'tmp/')
             if cloud_provider == 'aws':
-                conf_parameter_name = '--spring.config.location={0}billing_app.yml --conf '.format(dlab_conf_dir)
+                conf_parameter_name = '--spring.config.location={0}billing_app.yml --conf '.format(datalab_conf_dir)
                 with open('/root/templates/supervisor_svc.conf', 'r') as f:
                     text = f.read()
-                text = text.replace('WEB_CONF', dlab_conf_dir).replace('OS_USR', os_user)\
+                text = text.replace('WEB_CONF', datalab_conf_dir).replace('OS_USR', os_user) \
                     .replace('CONF_PARAMETER_NAME', conf_parameter_name)
                 with open('/root/templates/supervisor_svc.conf', 'w') as f:
                     f.write(text)
@@ -208,46 +216,47 @@
                 conf_parameter_name = '--spring.config.location='
                 with open('/root/templates/supervisor_svc.conf', 'r') as f:
                     text = f.read()
-                text = text.replace('WEB_CONF', dlab_conf_dir).replace('OS_USR', os_user)\
+                text = text.replace('WEB_CONF', datalab_conf_dir).replace('OS_USR', os_user) \
                     .replace('CONF_PARAMETER_NAME', conf_parameter_name)
                 with open('/root/templates/supervisor_svc.conf', 'w') as f:
                     f.write(text)
-            put('/root/templates/supervisor_svc.conf', '/tmp/supervisor_svc.conf')
-            sudo('mv /tmp/supervisor_svc.conf ' + os.environ['ssn_dlab_path'] + 'tmp/')
-            sudo('cp ' + os.environ['ssn_dlab_path'] +
+            datalab.fab.conn.put('/root/templates/supervisor_svc.conf', '/tmp/supervisor_svc.conf')
+            datalab.fab.conn.sudo('mv /tmp/supervisor_svc.conf ' + os.environ['ssn_datalab_path'] + 'tmp/')
+            datalab.fab.conn.sudo('cp ' + os.environ['ssn_datalab_path'] +
                  'tmp/proxy_location_webapp_template.conf /etc/nginx/locations/proxy_location_webapp.conf')
-            sudo('cp ' + os.environ['ssn_dlab_path'] + 'tmp/supervisor_svc.conf {}'.format(supervisor_conf))
-            sudo('sed -i \'s=WEB_APP_DIR={}=\' {}'.format(web_path, supervisor_conf))
+            datalab.fab.conn.sudo('cp ' + os.environ['ssn_datalab_path'] + 'tmp/supervisor_svc.conf {}'.format(supervisor_conf))
+            datalab.fab.conn.sudo('sed -i \'s=WEB_APP_DIR={}=\' {}'.format(web_path, supervisor_conf))
             try:
-                sudo('mkdir -p /var/log/application')
-                run('mkdir -p /tmp/yml_tmp/')
+                datalab.fab.conn.sudo('mkdir -p /var/log/application')
+                datalab.fab.conn.run('mkdir -p /tmp/yml_tmp/')
                 for service in ['self-service', 'provisioning-service', 'billing']:
-                    jar = sudo('cd {0}{1}/lib/; find {1}*.jar -type f'.format(web_path, service))
-                    sudo('ln -s {0}{2}/lib/{1} {0}{2}/{2}.jar '.format(web_path, jar, service))
-                    sudo('cp {0}/webapp/{1}/conf/*.yml /tmp/yml_tmp/'.format(dlab_path, service))
+                    jar = datalab.fab.conn.sudo('bash -c "cd {0}{1}/lib/; find {1}*.jar -type f"'.format(web_path, service)).stdout.replace('\n','')
+                    datalab.fab.conn.sudo('ln -s {0}{2}/lib/{1} {0}{2}/{2}.jar '.format(web_path, jar, service))
+                    datalab.fab.conn.sudo('cp {0}/webapp/{1}/conf/*.yml /tmp/yml_tmp/'.format(datalab_path, service))
                 # Replacing Keycloak and cloud parameters
                 for item in json.loads(cloud_params):
                     if "KEYCLOAK_" in item['key']:
-                        sudo('sed -i "s|{0}|{1}|g" /tmp/yml_tmp/self-service.yml'.format(
+                        datalab.fab.conn.sudo('sed -i "s|{0}|{1}|g" /tmp/yml_tmp/self-service.yml'.format(
                             item['key'], item['value']))
-                    sudo('sed -i "s|{0}|{1}|g" /tmp/yml_tmp/provisioning.yml'.format(
+                    datalab.fab.conn.sudo('sed -i "s|{0}|{1}|g" /tmp/yml_tmp/provisioning.yml'.format(
                         item['key'], item['value']))
-                sudo('sed -i "s|SERVICE_BASE_NAME|{0}|g" /tmp/yml_tmp/self-service.yml'.format(service_base_name))
-                sudo('sed -i "s|OPERATION_SYSTEM|debian|g" /tmp/yml_tmp/self-service.yml')
-                sudo('sed -i "s|<SSN_INSTANCE_SIZE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
+                datalab.fab.conn.sudo('sed -i "s|SERVICE_BASE_NAME|{0}|g" /tmp/yml_tmp/self-service.yml'.format(service_base_name))
+                datalab.fab.conn.sudo('sed -i "s|OPERATION_SYSTEM|debian|g" /tmp/yml_tmp/self-service.yml')
+                datalab.fab.conn.sudo('sed -i "s|<SSN_INSTANCE_SIZE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
                     os.environ['{0}_ssn_instance_size'.format(os.environ['conf_cloud_provider'])]))
                 if cloud_provider == 'azure':
-                    sudo('sed -i "s|<LOGIN_USE_LDAP>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(ldap_login))
-                    sudo('sed -i "s|<LOGIN_TENANT_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(tenant_id))
-                    sudo('sed -i "s|<LOGIN_APPLICATION_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(application_id))
-                    sudo('sed -i "s|<DLAB_SUBSCRIPTION_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(subscription_id))
-                    sudo('sed -i "s|<MANAGEMENT_API_AUTH_FILE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
+                    datalab.fab.conn.sudo('sed -i "s|<LOGIN_USE_LDAP>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(ldap_login))
+                    datalab.fab.conn.sudo('sed -i "s|<LOGIN_TENANT_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(tenant_id))
+                    datalab.fab.conn.sudo('sed -i "s|<LOGIN_APPLICATION_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(application_id))
+                    datalab.fab.conn.sudo('sed -i "s|<DATALAB_SUBSCRIPTION_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
+                        subscription_id))
+                    datalab.fab.conn.sudo('sed -i "s|<MANAGEMENT_API_AUTH_FILE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
                         authentication_file))
-                    sudo('sed -i "s|<VALIDATE_PERMISSION_SCOPE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
+                    datalab.fab.conn.sudo('sed -i "s|<VALIDATE_PERMISSION_SCOPE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
                         validate_permission_scope))
-                    sudo('sed -i "s|<LOGIN_APPLICATION_REDIRECT_URL>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
+                    datalab.fab.conn.sudo('sed -i "s|<LOGIN_APPLICATION_REDIRECT_URL>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
                         hostname))
-                    sudo('sed -i "s|<LOGIN_PAGE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(hostname))
+                    datalab.fab.conn.sudo('sed -i "s|<LOGIN_PAGE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(hostname))
                     # if os.environ['azure_datalake_enable'] == 'true':
                     #     permission_scope = 'subscriptions/{}/resourceGroups/{}/providers/Microsoft.DataLakeStore/accounts/{}/providers/Microsoft.Authorization/'.format(
                     #         subscription_id, service_base_name, data_lake_name)
@@ -255,13 +264,13 @@
                     #     permission_scope = 'subscriptions/{}/resourceGroups/{}/providers/Microsoft.Authorization/'.format(
                     #         subscription_id, service_base_name
                     #     )
-                sudo('mv /tmp/yml_tmp/* ' + dlab_conf_dir)
-                sudo('rmdir /tmp/yml_tmp/')
+                datalab.fab.conn.sudo('mv /tmp/yml_tmp/* ' + datalab_conf_dir)
+                datalab.fab.conn.sudo('rmdir /tmp/yml_tmp/')
             except:
                 append_result("Unable to upload webapp jars")
                 sys.exit(1)
             if billing_enabled:
-                local('scp -i {} /root/scripts/configure_billing.py {}:/tmp/configure_billing.py'.format(keyfile,
+                datalab.fab.conn.local('scp -i {} /root/scripts/configure_billing.py {}:/tmp/configure_billing.py'.format(keyfile,
                                                                                                          host_string))
                 params = '--cloud_provider {} ' \
                          '--infrastructure_tag {} ' \
@@ -272,13 +281,13 @@
                          '--aws_job_enabled {} ' \
                          '--report_path "{}" ' \
                          '--mongo_password {} ' \
-                         '--dlab_dir {} ' \
+                         '--datalab_dir {} ' \
                          '--authentication_file "{}" ' \
                          '--offer_number {} ' \
                          '--currency {} ' \
                          '--locale {} ' \
                          '--region_info {} ' \
-                         '--dlab_id {} ' \
+                         '--datalab_id {} ' \
                          '--usage_date {} ' \
                          '--product {} ' \
                          '--usage_type {} ' \
@@ -286,7 +295,7 @@
                          '--cost {} ' \
                          '--resource_id {} ' \
                          '--tags {} ' \
-                         '--billing_dataset_name "{}" '\
+                         '--billing_dataset_name "{}" ' \
                          '--mongo_host localhost ' \
                          '--mongo_port 27017 ' \
                          '--service_base_name {} ' \
@@ -304,13 +313,13 @@
                                    aws_job_enabled,
                                    report_path,
                                    mongo_passwd,
-                                   dlab_path,
+                                   datalab_path,
                                    authentication_file,
                                    offer_number,
                                    currency,
                                    locale,
                                    region_info,
-                                   dlab_id,
+                                   datalab_id,
                                    usage_date,
                                    product,
                                    usage_type,
@@ -325,36 +334,37 @@
                                    keycloak_client_id,
                                    keycloak_client_secret,
                                    keycloak_auth_server_url)
-                sudo('python /tmp/configure_billing.py {}'.format(params))
+                datalab.fab.conn.sudo('python3 /tmp/configure_billing.py {}'.format(params))
             try:
                 if os.environ['conf_stepcerts_enabled'] == 'true':
-                    sudo('openssl pkcs12 -export -in /etc/ssl/certs/dlab.crt -inkey /etc/ssl/certs/dlab.key -name ssn '
-                         '-out ssn.p12 -password pass:{0}'.format(keystore_passwd))
-                    sudo('keytool -importkeystore -srckeystore ssn.p12 -srcstoretype PKCS12 -alias ssn -destkeystore '
+                    datalab.fab.conn.sudo(
+                        'openssl pkcs12 -export -in /etc/ssl/certs/datalab.crt -inkey /etc/ssl/certs/datalab.key -name ssn '
+                        '-out ssn.p12 -password pass:{0}'.format(keystore_passwd))
+                    datalab.fab.conn.sudo('keytool -importkeystore -srckeystore ssn.p12 -srcstoretype PKCS12 -alias ssn -destkeystore '
                          '/home/{0}/keys/ssn.keystore.jks -deststorepass "{1}" -srcstorepass "{1}"'.format(
-                          os_user, keystore_passwd))
-                    sudo('keytool -keystore /home/{0}/keys/ssn.keystore.jks -alias step-ca -import -file '
+                        os_user, keystore_passwd))
+                    datalab.fab.conn.sudo('keytool -keystore /home/{0}/keys/ssn.keystore.jks -alias step-ca -import -file '
                          '/etc/ssl/certs/root_ca.crt  -deststorepass "{1}" -srcstorepass "{1}" -noprompt'.format(
                           os_user, keystore_passwd))
-                    sudo('keytool -importcert -trustcacerts -alias step-ca -file /etc/ssl/certs/root_ca.crt '
+                    datalab.fab.conn.sudo('keytool -importcert -trustcacerts -alias step-ca -file /etc/ssl/certs/root_ca.crt '
                          '-noprompt -storepass changeit -keystore {1}/lib/security/cacerts'.format(os_user, java_path))
-                    sudo('keytool -importcert -trustcacerts -alias ssn -file /etc/ssl/certs/dlab.crt -noprompt '
+                    datalab.fab.conn.sudo('keytool -importcert -trustcacerts -alias ssn -file /etc/ssl/certs/datalab.crt -noprompt '
                          '-storepass changeit -keystore {0}/lib/security/cacerts'.format(java_path))
                 else:
-                    sudo('keytool -genkeypair -alias ssn -keyalg RSA -validity 730 -storepass {1} -keypass {1} \
+                    datalab.fab.conn.sudo('keytool -genkeypair -alias ssn -keyalg RSA -validity 730 -storepass {1} -keypass {1} \
                          -keystore /home/{0}/keys/ssn.keystore.jks -keysize 2048 -dname "CN=localhost"'.format(
-                         os_user, keystore_passwd))
-                    sudo('keytool -exportcert -alias ssn -storepass {1} -file /etc/ssl/certs/dlab.crt \
+                        os_user, keystore_passwd))
+                    datalab.fab.conn.sudo('keytool -exportcert -alias ssn -storepass {1} -file /etc/ssl/certs/datalab.crt \
                          -keystore /home/{0}/keys/ssn.keystore.jks'.format(os_user, keystore_passwd))
-                    sudo('keytool -importcert -trustcacerts -alias ssn -file /etc/ssl/certs/dlab.crt -noprompt \
+                    datalab.fab.conn.sudo('keytool -importcert -trustcacerts -alias ssn -file /etc/ssl/certs/datalab.crt -noprompt \
                          -storepass changeit -keystore {1}/lib/security/cacerts'.format(os_user, java_path))
             except:
                 append_result("Unable to generate cert and copy to java keystore")
                 sys.exit(1)
-            sudo('service supervisor start')
-            sudo('service nginx restart')
-            sudo('service supervisor restart')
-            sudo('touch ' + os.environ['ssn_dlab_path'] + 'tmp/ss_started')
+            datalab.fab.conn.sudo('service supervisor start')
+            datalab.fab.conn.sudo('service nginx restart')
+            datalab.fab.conn.sudo('service supervisor restart')
+            datalab.fab.conn.sudo('touch ' + os.environ['ssn_datalab_path'] + 'tmp/ss_started')
     except Exception as err:
         traceback.print_exc()
         print('Failed to start Self-service: ', str(err))
@@ -363,18 +373,17 @@
 
 def install_build_dep():
     try:
-        if not exists('{}tmp/build_dep_ensured'.format(os.environ['ssn_dlab_path'])):
+        if not exists(datalab.fab.conn,'{}tmp/build_dep_ensured'.format(os.environ['ssn_datalab_path'])):
             maven_version = '3.5.4'
             manage_pkg('-y install', 'remote', 'openjdk-8-jdk git wget unzip')
-            with cd('/opt/'):
-                sudo('wget http://mirrors.sonic.net/apache/maven/maven-{0}/{1}/binaries/apache-maven-{1}-bin.zip'.format(
-                    maven_version.split('.')[0], maven_version))
-                sudo('unzip apache-maven-{}-bin.zip'.format(maven_version))
-                sudo('mv apache-maven-{} maven'.format(maven_version))
-            sudo('bash -c "curl --silent --location https://deb.nodesource.com/setup_12.x | bash -"')
+            datalab.fab.conn.run(
+                    'cd /opt/ && sudo wget http://mirrors.sonic.net/apache/maven/maven-{0}/{1}/binaries/apache-maven-{1}-bin.zip '
+                    '&& sudo unzip apache-maven-{1}-bin.zip && sudo mv apache-maven-{1} maven'.format(
+                        maven_version.split('.')[0], maven_version))
+            datalab.fab.conn.sudo('bash -c "curl --silent --location https://deb.nodesource.com/setup_15.x | bash -"')
             manage_pkg('-y install', 'remote', 'nodejs')
-            sudo('npm config set unsafe-perm=true')
-            sudo('touch {}tmp/build_dep_ensured'.format(os.environ['ssn_dlab_path']))
+            datalab.fab.conn.sudo('npm config set unsafe-perm=true')
+            datalab.fab.conn.sudo('touch {}tmp/build_dep_ensured'.format(os.environ['ssn_datalab_path']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to install build dependencies for UI: ', str(err))
diff --git a/infrastructure-provisioning/src/general/lib/os/fab.py b/infrastructure-provisioning/src/general/lib/os/fab.py
index cd15d42..844d0a7 100644
--- a/infrastructure-provisioning/src/general/lib/os/fab.py
+++ b/infrastructure-provisioning/src/general/lib/os/fab.py
@@ -19,63 +19,146 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
+import csv
+import datetime
+import json
 import logging
 import os
 import random
-import sys
-import string
-import json, uuid, time, datetime, csv
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-import dlab.actions_lib
 import re
+import string
+import sys
+import time
 import traceback
-from dlab.common_lib import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.meta_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
+def ensure_python_venv(python_venv_version):
+    try:
+        if not exists(conn, '/opt/python/python{}'.format(python_venv_version)):
+            conn.sudo('wget https://www.python.org/ftp/python/{0}/Python-{0}.tgz -O /tmp/Python-{0}.tgz'.format(
+                python_venv_version))
+            conn.sudo('tar zxvf /tmp/Python-{}.tgz -C /tmp/'.format(python_venv_version))
+            if os.environ['application'] in ('rstudio', 'tensor-rstudio'):
+                conn.sudo('''bash -l -c 'cd /tmp/Python-{0} && ./configure --prefix=/opt/python/python{0} '''
+                          '''--with-zlib-dir=/usr/local/lib/ --with-ensurepip=install --enable-shared' '''.format(
+                    python_venv_version))
+                conn.sudo(
+                    '''bash -l -c 'echo "export LD_LIBRARY_PATH=/opt/python/python{}/lib" >> /etc/profile' '''.format(
+                        python_venv_version))
+            else:
+                conn.sudo(
+                    '''bash -l -c 'cd /tmp/Python-{0} && ./configure --prefix=/opt/python/python{0} '''
+                    '''--with-zlib-dir=/usr/local/lib/ --with-ensurepip=install' '''.format(
+                        python_venv_version))
+            conn.sudo('''bash -l -c 'cd /tmp/Python-{0} && make altinstall' '''.format(python_venv_version))
+            conn.sudo('''bash -l -c 'cd /tmp && rm -rf Python-{}' '''.format(python_venv_version))
+            conn.sudo('''bash -l -c 'virtualenv /opt/python/python{0}' '''.format(python_venv_version))
+            venv_command = 'source /opt/python/python{}/bin/activate'.format(python_venv_version)
+            pip_command = '/opt/python/python{0}/bin/pip{1}'.format(python_venv_version, python_venv_version[:3])
+            conn.sudo('''bash -l -c '{0} && {1} install -U pip=={2}' '''.format(venv_command, pip_command, os.environ['conf_pip_version']))
+            conn.sudo('''bash -l -c '{0} && {1} install ipython ipykernel --no-cache-dir' '''.format(venv_command, pip_command))
+            conn.sudo('''bash -l -c '{0} && {1} install NumPy=={2} SciPy Matplotlib pandas Sympy Pillow sklearn --no-cache-dir' '''.format(venv_command, pip_command, os.environ['notebook_numpy_version']))
+
+    except Exception as err:
+        print('Error:', str(err))
+        sys.exit(1)
+
+def install_venv_pip_pkg(pkg_name, pkg_version = ''):
+    try:
+        venv_install_command = 'source /opt/python/python{0}/bin/activate && /opt/python/python{0}/bin/pip{1}'.format(
+            os.environ['notebook_python_venv_version'], os.environ['notebook_python_venv_version'][:3])
+        if pkg_version:
+            pip_pkg = '{}=={}'.format(pkg_name,pkg_version)
+        else:
+            pip_pkg = pkg_name
+        conn.sudo('''bash -l -c '{0} install {1} --no-cache-dir' '''.format(venv_install_command, pip_pkg))
+    except Exception as err:
+        print('Error:', str(err))
+        sys.exit(1)
 
 def ensure_pip(requisites):
     try:
-        if not exists('/home/{}/.ensure_dir/pip_path_added'.format(os.environ['conf_os_user'])):
-            sudo('echo PATH=$PATH:/usr/local/bin/:/opt/spark/bin/ >> /etc/profile')
-            sudo('echo export PATH >> /etc/profile')
-            sudo('pip install -UI pip=={} --no-cache-dir'.format(os.environ['conf_pip_version']))
-            sudo('pip install --upgrade setuptools')
-            sudo('pip install -U {} --no-cache-dir'.format(requisites))
-            sudo('touch /home/{}/.ensure_dir/pip_path_added'.format(os.environ['conf_os_user']))
+        if not exists(conn,'/home/{}/.ensure_dir/pip_path_added'.format(os.environ['conf_os_user'])):
+            conn.sudo('bash -l -c "echo PATH=$PATH:/usr/local/bin/:/opt/spark/bin/ >> /etc/profile"')
+            conn.sudo('bash -l -c "echo export PATH >> /etc/profile"')
+            conn.sudo('pip3 install -UI pip=={} --no-cache-dir'.format(os.environ['conf_pip_version']))
+            conn.sudo('pip3 install -U setuptools=={}'.format(os.environ['notebook_setuptools_version']))
+            conn.sudo('pip3 install -UI {} --no-cache-dir'.format(requisites))
+            conn.sudo('touch /home/{}/.ensure_dir/pip_path_added'.format(os.environ['conf_os_user']))
     except:
         sys.exit(1)
 
 
 def dataengine_dir_prepare(cluster_dir):
-    local('mkdir -p ' + cluster_dir)
+    subprocess.run('mkdir -p ' + cluster_dir, shell=True, check=True)
 
 
-def install_pip_pkg(requisites, pip_version, lib_group):
+def install_pip_pkg(requisites, pip_version, lib_group, dataengine_service = False):
     status = list()
-    error_parser = "Could not|No matching|ImportError:|failed|EnvironmentError:"
+    error_parser = "Could not|No matching|ImportError:|failed|EnvironmentError:|requires|FileNotFoundError:|RuntimeError:|error:"
     try:
-        if pip_version == 'pip3' and not exists('/bin/pip3'):
-            sudo('ln -s /bin/pip3.5 /bin/pip3')
-        sudo('{} install -U pip=={} setuptools'.format(pip_version, os.environ['conf_pip_version']))
-        sudo('{} install -U pip=={} --no-cache-dir'.format(pip_version, os.environ['conf_pip_version']))
-        sudo('{} install --upgrade pip=={}'.format(pip_version, os.environ['conf_pip_version']))
+        if dataengine_service:
+            install_command = pip_version
+        elif os.environ['conf_deeplearning_cloud_ami'] == 'true' and os.environ['application'] == 'deeplearning':
+            install_command = 'conda activate && {}'.format(pip_version)
+        else:
+            install_command = 'source /opt/python/python{0}/bin/activate && /opt/python/python{0}/bin/pip{1}'.format(
+                os.environ['notebook_python_venv_version'], os.environ['notebook_python_venv_version'][:3])
+        #if pip_version == 'pip3' and not exists(conn, '/bin/pip3'):
+        #    for v in range(4, 8):
+        #        if exists(conn, '/bin/pip3.{}'.format(v)):
+        #            conn.sudo('ln -s /bin/pip3.{} /bin/pip3'.format(v))
+        #conn.sudo('{} install -U pip=={} setuptools=={}'.format(pip_version, os.environ['conf_pip_version'], os.environ['notebook_setuptools_version']))
+        #conn.sudo('{} install -U pip=={} --no-cache-dir'.format(pip_version, os.environ['conf_pip_version']))
+        #conn.sudo('{} install --upgrade pip=={}'.format(pip_version, os.environ['conf_pip_version']))
         for pip_pkg in requisites:
-            sudo('{0} install {1} --no-cache-dir 2>&1 | if ! grep -w -i -E  "({2})" >  /tmp/{0}install_{1}.log; then  echo "" > /tmp/{0}install_{1}.log;fi'.format(pip_version, pip_pkg, error_parser))
-            err = sudo('cat /tmp/{0}install_{1}.log'.format(pip_version, pip_pkg)).replace('"', "'")
-            sudo('{0} freeze | if ! grep -w -i {1} > /tmp/{0}install_{1}.list; then  echo "" > /tmp/{0}install_{1}.list;fi'.format(pip_version, pip_pkg))
-            res = sudo('cat /tmp/{0}install_{1}.list'.format(pip_version, pip_pkg))
+            name, vers = pip_pkg
+            if pip_pkg[1] == '' or pip_pkg[1] == 'N/A':
+                pip_pkg = pip_pkg[0]
+                version = 'N/A'
+            else:
+                version = pip_pkg[1]
+                pip_pkg = "{}=={}".format(pip_pkg[0], pip_pkg[1])
+            conn.sudo(
+                '''bash -l -c '{0} install -U {1} --use-deprecated=legacy-resolver --no-cache-dir 2>&1 | '''
+                '''tee /tmp/{4}_install_{3}.tmp; if ! grep -w -i -E  "({2})" /tmp/{4}_install_{3}.tmp > /tmp/{4}_install_{3}.log; '''
+                '''then  echo "" > /tmp/{4}_install_{3}.log;fi' '''.format(
+                    install_command, pip_pkg, error_parser, name, pip_version))
+            err = conn.sudo('cat /tmp/{0}_install_{1}.log'.format(pip_version, pip_pkg.split("==")[0])).stdout.replace(
+                '"', "'").replace('\n', ' ')
+            conn.sudo(
+                '''bash -l -c '{0} freeze --all | if ! grep -w -i {1} > /tmp/{2}_install_{1}.list; '''
+                '''then  echo "not_found" > /tmp/{2}_install_{1}.list;fi' '''.format(
+                    install_command, name, pip_version))
+            res = conn.sudo('''bash -l -c 'cat /tmp/{0}_install_{1}.list' '''.format(pip_version, name)).stdout.replace(
+                '\n', '')
+            conn.sudo(
+                '''bash -l -c 'cat /tmp/{0}_install_{1}.tmp | if ! grep -w -i -E "(Successfully installed|up-to-date)" > '''
+                '''/tmp/{0}_install_{1}.list; then  echo "not_installed" > /tmp/{0}_install_{1}.list;fi' '''.format(
+                    pip_version, name))
+            installed_out = conn.sudo(
+                '''bash -l -c 'cat /tmp/{0}_install_{1}.list' '''.format(pip_version, name)).stdout.replace('\n', '')
             changed_pip_pkg = False
-            if res == '':
-                changed_pip_pkg = pip_pkg.replace("_", "-").split('-')
+            if 'not_found' in res:
+                changed_pip_pkg = pip_pkg.split("==")[0].replace("_", "-").split('-')
                 changed_pip_pkg = changed_pip_pkg[0]
-                sudo(
-                    '{0} freeze | if ! grep -w -i {1} > /tmp/{0}install_{1}.list; then  echo "" > /tmp/{0}install_{1}.list;fi'.format(
-                        pip_version, changed_pip_pkg))
-                res = sudo(
-                    'cat /tmp/{0}install_{1}.list'.format(pip_version, changed_pip_pkg))
-            if res:
+                conn.sudo(
+                    '''bash -l -c '{0} freeze --all | if ! grep -w -i {1} > /tmp/{2}_install_{1}.list; then  echo "" > '''
+                    '''/tmp/{2}_install_{1}.list;fi' '''.format(
+                        install_command, changed_pip_pkg, pip_version))
+                res = conn.sudo('cat /tmp/{0}_install_{1}.list'.format(pip_version, changed_pip_pkg)).stdout.replace(
+                    '\n', '')
+            if err and name not in installed_out:
+                status_msg = 'installation_error'
+                if 'ERROR: No matching distribution found for {}'.format(name) in err:
+                    status_msg = 'invalid_name'
+            elif res:
                 res = res.lower()
                 ansi_escape = re.compile(r'\x1b[^m]*m')
                 ver = ansi_escape.sub('', res).split("\r\n")
@@ -83,16 +166,44 @@
                     version = [i for i in ver if changed_pip_pkg.lower() in i][0].split('==')[1]
                 else:
                     version = \
-                    [i for i in ver if pip_pkg.lower() in i][0].split(
-                        '==')[1]
-                status.append({"group": "{}".format(lib_group), "name": pip_pkg, "version": version, "status": "installed"})
+                        [i for i in ver if pip_pkg.split("==")[0].lower() in i][0].split('==')[1]
+                status_msg = "installed"
+            versions = []
+            if 'Could not find a version that satisfies the requirement' in err and 'ERROR: No matching distribution found for {}=='.format(
+                    name) in err:
+                versions = err[err.find("(from versions: ") + 16: err.find(") ")]
+                if versions != '' and versions != 'none':
+                    versions = versions.split(', ')
+                    version = vers
+                    status_msg = 'invalid_version'
+                else:
+                    versions = []
+
+            conn.sudo('cat /tmp/{0}_install_{1}.tmp | if ! grep -w -i -E  "Installing collected packages:" > '
+                      '/tmp/{0}_install_{1}.dep; then  echo "" > /tmp/{0}_install_{1}.dep;fi'.format(pip_version, name))
+            dep = conn.sudo('cat /tmp/{0}_install_{1}.dep'.format(pip_version, name)).stdout.replace('\n', '').strip()[31:]
+            if dep == '':
+                dep = []
             else:
-                status.append({"group": "{}".format(lib_group), "name": pip_pkg, "status": "failed", "error_message": err})
+                dep = dep.split(', ')
+                for n, i in enumerate(dep):
+                    if i == name:
+                        dep[n] = ''
+                    else:
+                        conn.sudo('{0} show {1} 2>&1 | if ! grep Version: > '
+                             '/tmp/{0}_install_{1}.log; then echo "" > /tmp/{0}_install_{1}.log;fi'.format(pip_version, i))
+                        dep[n] = conn.sudo('cat /tmp/{0}_install_{1}.log'.format(pip_version, i)).stdout.replace('\n', '').replace('Version: ', '{} v.'.format(i))
+                dep = [i for i in dep if i]
+            status.append({"group": lib_group, "name": name, "version": version, "status": status_msg,
+                           "error_message": err, "available_versions": versions, "add_pkgs": dep})
+            conn.sudo('rm -rf /tmp/*{}*'.format(name))
         return status
     except Exception as err:
-        append_result("Failed to install {} packages".format(pip_version), str(err))
-        print("Failed to install {} packages".format(pip_version))
-        sys.exit(1)
+        for pip_pkg in requisites:
+            name, vers = pip_pkg
+            status.append({"group": lib_group, "name": name, "version": vers, "status": 'installation_error', "error_message": err})
+        print("Failed to install {} packages: {}".format(pip_version, err))
+        return status
 
 
 def id_generator(size=10, chars=string.digits + string.ascii_letters):
@@ -100,21 +211,21 @@
 
 
 def ensure_dataengine_tensorflow_jars(jars_dir):
-    local('wget https://dl.bintray.com/spark-packages/maven/tapanalyticstoolkit/spark-tensorflow-connector/1.0.0-s_2.11/spark-tensorflow-connector-1.0.0-s_2.11.jar \
-         -O {}spark-tensorflow-connector-1.0.0-s_2.11.jar'.format(jars_dir))
+    subprocess.run('wget https://dl.bintray.com/spark-packages/maven/tapanalyticstoolkit/spark-tensorflow-connector/1.0.0-s_2.11/spark-tensorflow-connector-1.0.0-s_2.11.jar \
+         -O {}spark-tensorflow-connector-1.0.0-s_2.11.jar'.format(jars_dir), shell=True, check=True)
 
 
 def prepare(dataengine_service_dir, yarn_dir):
-    local('mkdir -p ' + dataengine_service_dir)
-    local('mkdir -p ' + yarn_dir)
-    local('sudo mkdir -p /opt/python/')
+    subprocess.run('mkdir -p ' + dataengine_service_dir, shell=True, check=True)
+    subprocess.run('mkdir -p ' + yarn_dir, shell=True, check=True)
+    subprocess.run('sudo mkdir -p /opt/python/', shell=True, check=True)
     result = os.path.exists(dataengine_service_dir + 'usr/')
     return result
 
 
 def configuring_notebook(dataengine_service_version):
     jars_path = '/opt/' + dataengine_service_version + '/jars/'
-    local("""sudo bash -c "find """ + jars_path + """ -name '*netty*' | xargs rm -f" """)
+    subprocess.run("""sudo bash -c "find """ + jars_path + """ -name '*netty*' | xargs rm -f" """, shell=True, check=True)
 
 
 def append_result(error, exception=''):
@@ -140,150 +251,180 @@
     print(data)
 
 
-def put_resource_status(resource, status, dlab_path, os_user, hostname):
-    env['connection_attempts'] = 100
+def put_resource_status(resource, status, datalab_path, os_user, hostname):
     keyfile = os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem"
-    env.key_filename = [keyfile]
-    env.host_string = os_user + '@' + hostname
-    sudo('python ' + dlab_path + 'tmp/resource_status.py --resource {} --status {}'.format(resource, status))
+    init_datalab_connection(hostname, os_user, keyfile)
+    conn.sudo('python3 ' + datalab_path + 'tmp/resource_status.py --resource {} --status {}'.format(resource, status))
+    conn.close()
 
 
 def configure_jupyter(os_user, jupyter_conf_file, templates_dir, jupyter_version, exploratory_name):
-    if not exists('/home/' + os_user + '/.ensure_dir/jupyter_ensured'):
+    if not exists(conn,'/home/' + os_user + '/.ensure_dir/jupyter_ensured'):
         try:
-            sudo('pip2 install notebook==5.7.8 --no-cache-dir')
-            sudo('pip2 install jupyter --no-cache-dir')
-            sudo('pip3.5 install notebook=={} --no-cache-dir'.format(jupyter_version))
-            sudo('pip3.5 install jupyter --no-cache-dir')
-            sudo('rm -rf {}'.format(jupyter_conf_file))
-            run('jupyter notebook --generate-config --config {}'.format(jupyter_conf_file))
-            with cd('/home/{}'.format(os_user)):
-                run('mkdir -p ~/.jupyter/custom/')
-                run('echo "#notebook-container { width: auto; }" > ~/.jupyter/custom/custom.css')
-            sudo('echo "c.NotebookApp.ip = \'0.0.0.0\'" >> {}'.format(jupyter_conf_file))
-            sudo('echo "c.NotebookApp.base_url = \'/{0}/\'" >> {1}'.format(exploratory_name, jupyter_conf_file))
-            sudo('echo c.NotebookApp.open_browser = False >> {}'.format(jupyter_conf_file))
-            sudo('echo \'c.NotebookApp.cookie_secret = b"{0}"\' >> {1}'.format(id_generator(), jupyter_conf_file))
-            sudo('''echo "c.NotebookApp.token = u''" >> {}'''.format(jupyter_conf_file))
-            sudo('echo \'c.KernelSpecManager.ensure_native_kernel = False\' >> {}'.format(jupyter_conf_file))
-            put(templates_dir + 'jupyter-notebook.service', '/tmp/jupyter-notebook.service')
-            sudo("chmod 644 /tmp/jupyter-notebook.service")
+            if os.environ['conf_deeplearning_cloud_ami'] == 'false' or os.environ['application'] != 'deeplearning':
+                conn.sudo('pip3 install notebook=={} --no-cache-dir'.format(jupyter_version))
+                conn.sudo('pip3 install jupyter --no-cache-dir')
+                conn.sudo('rm -rf {}'.format(jupyter_conf_file))
+            conn.run('jupyter notebook --generate-config --config {}'.format(jupyter_conf_file))
+            conn.run('mkdir -p ~/.jupyter/custom/')
+            conn.run('echo "#notebook-container { width: auto; }" > ~/.jupyter/custom/custom.css')
+            conn.sudo('echo "c.NotebookApp.ip = \'0.0.0.0\'" >> {}'.format(jupyter_conf_file))
+            conn.sudo('echo "c.NotebookApp.base_url = \'/{0}/\'" >> {1}'.format(exploratory_name, jupyter_conf_file))
+            conn.sudo('echo c.NotebookApp.open_browser = False >> {}'.format(jupyter_conf_file))
+            conn.sudo('echo \'c.NotebookApp.cookie_secret = b"{0}"\' >> {1}'.format(id_generator(), jupyter_conf_file))
+            conn.sudo('''echo "c.NotebookApp.token = u''" >> {}'''.format(jupyter_conf_file))
+            conn.sudo('echo \'c.KernelSpecManager.ensure_native_kernel = False\' >> {}'.format(jupyter_conf_file))
+            if os.environ['conf_deeplearning_cloud_ami'] == 'true' and os.environ['application'] == 'deeplearning':
+                conn.sudo(
+                    '''echo "c.NotebookApp.kernel_spec_manager_class = 'environment_kernels.EnvironmentKernelSpecManager'" >> {}'''.format(
+                        jupyter_conf_file))
+                conn.sudo(
+                    '''echo "c.EnvironmentKernelSpecManager.conda_env_dirs=['/home/ubuntu/anaconda3/envs']" >> {}'''.format(
+                        jupyter_conf_file))
+            conn.put(templates_dir + 'jupyter-notebook.service', '/tmp/jupyter-notebook.service')
+            conn.sudo("chmod 644 /tmp/jupyter-notebook.service")
             if os.environ['application'] == 'tensor':
-                sudo("sed -i '/ExecStart/s|-c \"|-c \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64; |g' /tmp/jupyter-notebook.service")
-            elif os.environ['application'] == 'deeplearning':
-                sudo("sed -i '/ExecStart/s|-c \"|-c \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cudnn/lib64:"
-                     "/usr/local/cuda/lib64:/usr/lib64/openmpi/lib: ; export PYTHONPATH=/home/" + os_user +
+                conn.sudo("sed -i '/ExecStart/s|-c \"|-c \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64; |g' /tmp/jupyter-notebook.service")
+            elif os.environ['application'] == 'deeplearning' and os.environ['conf_deeplearning_cloud_ami'] == 'false':
+                conn.sudo("sed -i '/ExecStart/s|-c \"|-c \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64:/usr/lib64/openmpi/lib: ; export PYTHONPATH=/home/" + os_user +
                      "/caffe/python:/home/" + os_user + "/pytorch/build:$PYTHONPATH ; |g' /tmp/jupyter-notebook.service")
-            sudo("sed -i 's|CONF_PATH|{}|' /tmp/jupyter-notebook.service".format(jupyter_conf_file))
-            sudo("sed -i 's|OS_USR|{}|' /tmp/jupyter-notebook.service".format(os_user))
-            sudo('\cp /tmp/jupyter-notebook.service /etc/systemd/system/jupyter-notebook.service')
-            sudo('chown -R {0}:{0} /home/{0}/.local'.format(os_user))
-            sudo('mkdir -p /mnt/var')
-            sudo('chown {0}:{0} /mnt/var'.format(os_user))
-            if os.environ['application'] == 'jupyter':
-                sudo('jupyter-kernelspec remove -f python2 || echo "Such kernel doesnt exists"')
-                sudo('jupyter-kernelspec remove -f python3 || echo "Such kernel doesnt exists"')
-            sudo("systemctl daemon-reload")
-            sudo("systemctl enable jupyter-notebook")
-            sudo("systemctl start jupyter-notebook")
-            sudo('touch /home/{}/.ensure_dir/jupyter_ensured'.format(os_user))
+            conn.sudo("sed -i 's|CONF_PATH|{}|' /tmp/jupyter-notebook.service".format(jupyter_conf_file))
+            conn.sudo("sed -i 's|OS_USR|{}|' /tmp/jupyter-notebook.service".format(os_user))
+            http_proxy = conn.run('''bash -l -c 'echo $http_proxy' ''').stdout.replace('\n','')
+            https_proxy = conn.run('''bash -l -c 'echo $https_proxy' ''').stdout.replace('\n','')
+            #sudo('sed -i \'/\[Service\]/ a\Environment=\"HTTP_PROXY={}\"\'  /tmp/jupyter-notebook.service'.format(
+            #    http_proxy))
+            #sudo('sed -i \'/\[Service\]/ a\Environment=\"HTTPS_PROXY={}\"\'  /tmp/jupyter-notebook.service'.format(
+            #    https_proxy))
+            java_home = conn.run("update-alternatives --query java | grep -o --color=never \'/.*/java-8.*/jre\'").stdout.splitlines()[0]
+            conn.sudo('sed -i \'/\[Service\]/ a\Environment=\"JAVA_HOME={}\"\'  /tmp/jupyter-notebook.service'.format(
+                java_home))
+            conn.sudo('\cp /tmp/jupyter-notebook.service /etc/systemd/system/jupyter-notebook.service')
+            conn.sudo('chown -R {0}:{0} /home/{0}/.local'.format(os_user))
+            conn.sudo('mkdir -p /mnt/var')
+            conn.sudo('chown {0}:{0} /mnt/var'.format(os_user))
+            if os.environ['application'] == 'jupyter' or os.environ['application'] == 'deeplearning':
+                try:
+                    conn.sudo('jupyter-kernelspec remove -f python3 || echo "Such kernel doesnt exists"')
+                    conn.sudo('jupyter-kernelspec remove -f python2 || echo "Such kernel doesnt exists"')
+                except Exception as err:
+                    print('Error:', str(err))
+            conn.sudo("systemctl daemon-reload")
+            conn.sudo("systemctl enable jupyter-notebook")
+            conn.sudo("systemctl start jupyter-notebook")
+            conn.sudo('touch /home/{}/.ensure_dir/jupyter_ensured'.format(os_user))
         except:
             sys.exit(1)
     else:
         try:
-            sudo(
+            conn.sudo(
                 'sed -i "s/c.NotebookApp.base_url =.*/c.NotebookApp.base_url = \'\/{0}\/\'/" {1}'.format(exploratory_name, jupyter_conf_file))
-            sudo("systemctl restart jupyter-notebook")
+            conn.sudo("systemctl restart jupyter-notebook")
+        except Exception as err:
+            print('Error:', str(err))
+            sys.exit(1)
+
+def remove_unexisting_kernel(os_user):
+    if not exists(conn,'/home/{}/.ensure_dir/unexisting_kernel_removed'.format(os_user)):
+        try:
+            conn.sudo('jupyter-kernelspec remove -f python3')
+            conn.sudo('touch /home/{}/.ensure_dir/unexisting_kernel_removed'.format(os_user))
         except Exception as err:
             print('Error:', str(err))
             sys.exit(1)
 
 def configure_docker(os_user):
     try:
-        if not exists('/home/' + os_user + '/.ensure_dir/docker_ensured'):
+        if not exists(conn,'/home/' + os_user + '/.ensure_dir/docker_ensured'):
             docker_version = os.environ['ssn_docker_version']
-            sudo('curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -')
-            sudo('add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) \
+            conn.sudo('curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -')
+            conn.sudo('add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) \
                   stable"')
-            manage_pkg('update', 'remote', '')
-            sudo('apt-cache policy docker-ce')
-            manage_pkg('-y install', 'remote', 'docker-ce={}~ce~3-0~ubuntu'.format(docker_version))
-            sudo('touch /home/{}/.ensure_dir/docker_ensured'.format(os_user))
+            #datalab.common_lib.manage_pkg('update', 'remote', '')
+            conn.sudo('apt-get update')
+            conn.sudo('apt-cache policy docker-ce')
+            #datalab.common_lib.manage_pkg('-y install', 'remote', 'docker-ce=5:{}~3-0~ubuntu-focal'.format(docker_version))
+            conn.sudo('apt-get install -y docker-ce=5:{}~3-0~ubuntu-focal'.format(docker_version))
+            conn.sudo('touch /home/{}/.ensure_dir/docker_ensured'.format(os_user))
     except Exception as err:
         print('Failed to configure Docker:', str(err))
         sys.exit(1)
 
 def ensure_jupyterlab_files(os_user, jupyterlab_dir, jupyterlab_image, jupyter_conf_file, jupyterlab_conf_file, exploratory_name, edge_ip):
-    if not exists(jupyterlab_dir):
+    if not exists(conn,jupyterlab_dir):
         try:
-            sudo('mkdir {}'.format(jupyterlab_dir))
-#            put(templates_dir + 'pyspark_local_template.json', '/tmp/pyspark_local_template.json')
-#            put(templates_dir + 'py3spark_local_template.json', '/tmp/py3spark_local_template.json')
-            put('/root/Dockerfile_jupyterlab', '/tmp/Dockerfile_jupyterlab')
-            put('/root/scripts/*', '/tmp/')
-#            sudo('\cp /tmp/pyspark_local_template.json ' + jupyterlab_dir + 'pyspark_local_template.json')
-#            sudo('\cp /tmp/py3spark_local_template.json ' + jupyterlab_dir + 'py3spark_local_template.json')
-#            sudo('sed -i \'s/3.5/3.6/g\' {}py3spark_local_template.json'.format(jupyterlab_dir))
-            sudo('mv /tmp/jupyterlab_run.sh {}jupyterlab_run.sh'.format(jupyterlab_dir))
-            sudo('mv /tmp/Dockerfile_jupyterlab {}Dockerfile_jupyterlab'.format(jupyterlab_dir))
-            sudo('mv /tmp/build.sh {}build.sh'.format(jupyterlab_dir))
-            sudo('mv /tmp/start.sh {}start.sh'.format(jupyterlab_dir))
-            sudo('sed -i \'s/nb_user/{}/g\' {}Dockerfile_jupyterlab'.format(os_user, jupyterlab_dir))
-            sudo('sed -i \'s/jupyterlab_image/{}/g\' {}Dockerfile_jupyterlab'.format(jupyterlab_image, jupyterlab_dir))
-            sudo('sed -i \'s/nb_user/{}/g\' {}start.sh'.format(os_user, jupyterlab_dir))
-#            sudo('sed -i \'s/jup_version/{}/g\' {}Dockerfile_jupyterlab'.format(jupyter_version, jupyterlab_dir))
-#            sudo('sed -i \'s/hadoop_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_hadoop_version'], jupyterlab_dir))
-#            sudo('sed -i \'s/tornado_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_tornado_version'], jupyterlab_dir))
-#            sudo('sed -i \'s/matplotlib_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_matplotlib_version'], jupyterlab_dir))
-#            sudo('sed -i \'s/numpy_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_numpy_version'], jupyterlab_dir))
-#            sudo('sed -i \'s/spark_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_spark_version'], jupyterlab_dir))
-#            sudo('sed -i \'s/scala_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_scala_version'], jupyterlab_dir))
-            sudo('sed -i \'s/CONF_PATH/{}/g\' {}jupyterlab_run.sh'.format(jupyterlab_conf_file, jupyterlab_dir))
-            sudo('touch {}'.format(jupyter_conf_file))
-            sudo('echo "c.NotebookApp.ip = \'0.0.0.0\'" >> {}'.format(jupyter_conf_file))
-            sudo('echo "c.NotebookApp.base_url = \'/{0}/\'" >> {1}'.format(exploratory_name, jupyter_conf_file))
-            sudo('echo c.NotebookApp.open_browser = False >> {}'.format(jupyter_conf_file))
-            sudo('echo \'c.NotebookApp.cookie_secret = b"{0}"\' >> {1}'.format(id_generator(), jupyter_conf_file))
-            sudo('''echo "c.NotebookApp.token = u''" >> {}'''.format(jupyter_conf_file))
-            sudo('echo \'c.KernelSpecManager.ensure_native_kernel = False\' >> {}'.format(jupyter_conf_file))
-            sudo('chown dlab-user:dlab-user /opt')
-            sudo('echo -e "Host git.epam.com\n   HostName git.epam.com\n   ProxyCommand nc -X connect -x {}:3128 %h %p\n" > /home/{}/.ssh/config'.format(edge_ip, os_user))
-            sudo('echo -e "Host github.com\n   HostName github.com\n   ProxyCommand nc -X connect -x {}:3128 %h %p" >> /home/{}/.ssh/config'.format(edge_ip, os_user))
-#            sudo('touch {}'.format(spark_script))
-#            sudo('echo "#!/bin/bash" >> {}'.format(spark_script))
-#            sudo(
+            conn.sudo('mkdir {}'.format(jupyterlab_dir))
+#            conn.put(templates_dir + 'pyspark_local_template.json', '/tmp/pyspark_local_template.json')
+#            conn.put(templates_dir + 'py3spark_local_template.json', '/tmp/py3spark_local_template.json')
+            conn.put('/root/Dockerfile_jupyterlab', '/tmp/Dockerfile_jupyterlab')
+            conn.put('/root/scripts/jupyterlab_run.sh', '/tmp/jupyterlab_run.sh')
+            conn.put('/root/scripts/build.sh', '/tmp/build.sh')
+            conn.put('/root/scripts/start.sh', '/tmp/start.sh')
+#            conn.sudo('\cp /tmp/pyspark_local_template.json ' + jupyterlab_dir + 'pyspark_local_template.json')
+#            conn.sudo('\cp /tmp/py3spark_local_template.json ' + jupyterlab_dir + 'py3spark_local_template.json')
+#            conn.sudo('sed -i \'s/3.5/3.6/g\' {}py3spark_local_template.json'.format(jupyterlab_dir))
+            conn.sudo('mv /tmp/jupyterlab_run.sh {}jupyterlab_run.sh'.format(jupyterlab_dir))
+            conn.sudo('mv /tmp/Dockerfile_jupyterlab {}Dockerfile_jupyterlab'.format(jupyterlab_dir))
+            conn.sudo('mv /tmp/build.sh {}build.sh'.format(jupyterlab_dir))
+            conn.sudo('mv /tmp/start.sh {}start.sh'.format(jupyterlab_dir))
+#            conn.sudo('sed -i \'s/nb_user/{}/g\' {}Dockerfile_jupyterlab'.format(os_user, jupyterlab_dir))
+            conn.sudo('sed -i \'s/jupyterlab_image/{}/g\' {}Dockerfile_jupyterlab'.format(jupyterlab_image, jupyterlab_dir))
+            conn.sudo('sed -i \'s/nb_user/{}/g\' {}start.sh'.format(os_user, jupyterlab_dir))
+#            conn.sudo('sed -i \'s/jup_version/{}/g\' {}Dockerfile_jupyterlab'.format(jupyter_version, jupyterlab_dir))
+#            conn.sudo('sed -i \'s/hadoop_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_hadoop_version'], jupyterlab_dir))
+#            conn.sudo('sed -i \'s/tornado_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_tornado_version'], jupyterlab_dir))
+#            conn.sudo('sed -i \'s/matplotlib_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_matplotlib_version'], jupyterlab_dir))
+#            conn.sudo('sed -i \'s/numpy_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_numpy_version'], jupyterlab_dir))
+#            conn.sudo('sed -i \'s/spark_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_spark_version'], jupyterlab_dir))
+#            conn.sudo('sed -i \'s/scala_version/{}/g\' {}Dockerfile_jupyterlab'.format(os.environ['notebook_scala_version'], jupyterlab_dir))
+            conn.sudo('sed -i \'s/CONF_PATH/{}/g\' {}jupyterlab_run.sh'.format(jupyterlab_conf_file, jupyterlab_dir))
+            conn.sudo('touch {}'.format(jupyter_conf_file))
+            conn.sudo('''bash -l -c "echo 'c.NotebookApp.ip = \\"0.0.0.0\\" ' >> {}" '''.format(jupyter_conf_file))
+            conn.sudo('''bash -l -c "echo 'c.NotebookApp.base_url = \\"/{0}/\\"' >> {1}" '''.format(exploratory_name, jupyter_conf_file))
+            conn.sudo('''bash -l -c 'echo "c.NotebookApp.open_browser = False" >> {}' '''.format(jupyter_conf_file))
+            conn.sudo('''bash -l -c "echo 'c.NotebookApp.cookie_secret = b\\"{0}\\"' >> {1}" '''.format(id_generator(), jupyter_conf_file))
+            conn.sudo('''bash -l -c "echo \\"c.NotebookApp.token = u''\\" >> {}" '''.format(jupyter_conf_file))
+            conn.sudo('''bash -l -c 'echo "c.KernelSpecManager.ensure_native_kernel = False" >> {}' '''.format(jupyter_conf_file))
+            conn.sudo('chown datalab-user:datalab-user /opt')
+            conn.sudo('''bash -l -c 'echo -e "Host git.epam.com\n   HostName git.epam.com\n   ProxyCommand nc -X connect -x {}:3128 %h %p\n" > /home/{}/.ssh/config' '''.format(
+                    edge_ip, os_user))
+            conn.sudo('''bash -l -c 'echo -e "Host github.com\n   HostName github.com\n   ProxyCommand nc -X connect -x {}:3128 %h %p" >> /home/{}/.ssh/config' '''.format(edge_ip, os_user))
+#            conn.sudo('touch {}'.format(spark_script))
+#            conn.sudo('echo "#!/bin/bash" >> {}'.format(spark_script))
+#            conn.sudo(
 #                'echo "PYJ=\`find /opt/spark/ -name \'*py4j*.zip\' | tr \'\\n\' \':\' | sed \'s|:$||g\'\`; sed -i \'s|PY4J|\'$PYJ\'|g\' /tmp/pyspark_local_template.json" >> {}'.format(
 #                spark_script))
-#            sudo(
-#                'echo "sed -i \'14s/:",/:\\/home\\/dlab-user\\/caffe\\/python:\\/home\\/dlab-user\\/pytorch\\/build:",/\' /tmp/pyspark_local_template.json" >> {}'.format(
-#                    spark_script))
-#            sudo('echo \'sed -i "s|SP_VER|{}|g" /tmp/pyspark_local_template.json\' >> {}'.format(os.environ['notebook_spark_version'], spark_script))
-#            sudo(
+        #            conn.sudo(
+        #                'echo "sed -i \'14s/:",/:\\/home\\/datalab-user\\/caffe\\/python:\\/home\\/datalab-user\\/pytorch\\/build:",/\' /tmp/pyspark_local_template.json" >> {}'.format(
+        #                    spark_script))
+#            conn.sudo('echo \'sed -i "s|SP_VER|{}|g" /tmp/pyspark_local_template.json\' >> {}'.format(os.environ['notebook_spark_version'], spark_script))
+#            conn.sudo(
 #                'echo "PYJ=\`find /opt/spark/ -name \'*py4j*.zip\' | tr \'\\n\' \':\' | sed \'s|:$||g\'\`; sed -i \'s|PY4J|\'$PYJ\'|g\' /tmp/py3spark_local_template.json" >> {}'.format(
 #                spark_script))
-#            sudo(
-#                'echo "sed -i \'14s/:",/:\\/home\\/dlab-user\\/caffe\\/python:\\/home\\/dlab-user\\/pytorch\\/build:",/\' /tmp/py3spark_local_template.json" >> {}'.format(
-#                    spark_script))
-#            sudo('echo \'sed -i "s|SP_VER|{}|g" /tmp/py3spark_local_template.json\' >> {}'.format(os.environ['notebook_spark_version'], spark_script))
-#            sudo('echo "cp /tmp/pyspark_local_template.json /home/{}/.local/share/jupyter/kernels/pyspark_local/kernel.json" >> {}'.format(os_user, spark_script))
-#            sudo(
+        #            conn.sudo(
+        #                'echo "sed -i \'14s/:",/:\\/home\\/datalab-user\\/caffe\\/python:\\/home\\/datalab-user\\/pytorch\\/build:",/\' /tmp/py3spark_local_template.json" >> {}'.format(
+        #                    spark_script))
+#            conn.sudo('echo \'sed -i "s|SP_VER|{}|g" /tmp/py3spark_local_template.json\' >> {}'.format(os.environ['notebook_spark_version'], spark_script))
+#            conn.sudo('echo "cp /tmp/pyspark_local_template.json /home/{}/.local/share/jupyter/kernels/pyspark_local/kernel.json" >> {}'.format(os_user, spark_script))
+#            conn.sudo(
 #                'echo "cp /tmp/py3spark_local_template.json /home/{}/.local/share/jupyter/kernels/py3spark_local/kernel.json" >> {}'.format(
 #                    os_user, spark_script))
-#            sudo('git clone https://github.com/legion-platform/legion.git')
-#            sudo('cp {}sdk/Pipfile {}sdk_Pipfile'.format(legion_dir, jupyterlab_dir))
-#            sudo('cp {}sdk/Pipfile.lock {}sdk_Pipfile.lock'.format(legion_dir, jupyterlab_dir))
-#            sudo('cp {}toolchains/python/Pipfile {}toolchains_Pipfile'.format(legion_dir, jupyterlab_dir))
-#            sudo('cp {}toolchains/python/Pipfile.lock {}toolchains_Pipfile.lock'.format(legion_dir, jupyterlab_dir))
-#            sudo('cp {}cli/Pipfile {}cli_Pipfile'.format(legion_dir, jupyterlab_dir))
-#            sudo('cp {}cli/Pipfile.lock {}cli_Pipfile.lock'.format(legion_dir, jupyterlab_dir))
-#            sudo('cp -r {}sdk {}sdk'.format(legion_dir, jupyterlab_dir))
-#            sudo('cp -r {}toolchains/python {}toolchains_python'.format(legion_dir, jupyterlab_dir))
-#            sudo('cp -r {}cli {}cli'.format(legion_dir, jupyterlab_dir))
-        except:
-           sys.exit(1)
+#            conn.sudo('git clone https://github.com/legion-platform/legion.git')
+#            conn.sudo('cp {}sdk/Pipfile {}sdk_Pipfile'.format(legion_dir, jupyterlab_dir))
+#            conn.sudo('cp {}sdk/Pipfile.lock {}sdk_Pipfile.lock'.format(legion_dir, jupyterlab_dir))
+#            conn.sudo('cp {}toolchains/python/Pipfile {}toolchains_Pipfile'.format(legion_dir, jupyterlab_dir))
+#            conn.sudo('cp {}toolchains/python/Pipfile.lock {}toolchains_Pipfile.lock'.format(legion_dir, jupyterlab_dir))
+#            conn.sudo('cp {}cli/Pipfile {}cli_Pipfile'.format(legion_dir, jupyterlab_dir))
+#            conn.sudo('cp {}cli/Pipfile.lock {}cli_Pipfile.lock'.format(legion_dir, jupyterlab_dir))
+#            conn.sudo('cp -r {}sdk {}sdk'.format(legion_dir, jupyterlab_dir))
+#            conn.sudo('cp -r {}toolchains/python {}toolchains_python'.format(legion_dir, jupyterlab_dir))
+#            conn.sudo('cp -r {}cli {}cli'.format(legion_dir, jupyterlab_dir))
+        except Exception as err:
+            print('Error:', str(err))
+            sys.exit(1)
     else:
         try:
-            sudo(
+            conn.sudo(
                 'sed -i "s/c.NotebookApp.base_url =.*/c.NotebookApp.base_url = \'\/{0}\/\'/" {1}'.format(
                     exploratory_name, jupyter_conf_file))
         except Exception as err:
@@ -292,33 +433,35 @@
 
 
 def ensure_pyspark_local_kernel(os_user, pyspark_local_path_dir, templates_dir, spark_version):
-    if not exists('/home/' + os_user + '/.ensure_dir/pyspark_local_kernel_ensured'):
+    if not exists(conn,'/home/' + os_user + '/.ensure_dir/pyspark_local_kernel_ensured'):
         try:
-            sudo('mkdir -p ' + pyspark_local_path_dir)
-            sudo('touch ' + pyspark_local_path_dir + 'kernel.json')
-            put(templates_dir + 'pyspark_local_template.json', '/tmp/pyspark_local_template.json')
-            sudo(
-                "PYJ=`find /opt/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; sed -i 's|PY4J|'$PYJ'|g' /tmp/pyspark_local_template.json")
-            sudo('sed -i "s|SP_VER|' + spark_version + '|g" /tmp/pyspark_local_template.json')
-            sudo('sed -i \'/PYTHONPATH\"\:/s|\(.*\)"|\\1/home/{0}/caffe/python:/home/{0}/pytorch/build:"|\' /tmp/pyspark_local_template.json'.format(os_user))
-            sudo('\cp /tmp/pyspark_local_template.json ' + pyspark_local_path_dir + 'kernel.json')
-            sudo('touch /home/' + os_user + '/.ensure_dir/pyspark_local_kernel_ensured')
+            conn.sudo('mkdir -p ' + pyspark_local_path_dir)
+            conn.sudo('touch ' + pyspark_local_path_dir + 'kernel.json')
+            conn.put(templates_dir + 'pyspark_local_template.json', '/tmp/pyspark_local_template.json')
+            conn.sudo('''bash -l -c "PYJ=`find /opt/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; sed -i 's|PY4J|'$PYJ'|g' /tmp/pyspark_local_template.json" ''')
+            conn.sudo('sed -i "s|SP_VER|' + spark_version + '|g" /tmp/pyspark_local_template.json')
+            conn.sudo('sed -i \'/PYTHONPATH\"\:/s|\(.*\)"|\\1/home/{0}/caffe/python:/home/{0}/pytorch/build:"|\' /tmp/pyspark_local_template.json'.format(os_user))
+            conn.sudo('\cp /tmp/pyspark_local_template.json ' + pyspark_local_path_dir + 'kernel.json')
+            conn.sudo('touch /home/' + os_user + '/.ensure_dir/pyspark_local_kernel_ensured')
         except:
             sys.exit(1)
 
 
-def ensure_py3spark_local_kernel(os_user, py3spark_local_path_dir, templates_dir, spark_version):
-    if not exists('/home/' + os_user + '/.ensure_dir/py3spark_local_kernel_ensured'):
+def ensure_py3spark_local_kernel(os_user, py3spark_local_path_dir, templates_dir, spark_version, python_venv_path, python_venv_version):
+    if not exists(conn,'/home/' + os_user + '/.ensure_dir/py3spark_local_kernel_ensured'):
         try:
-            sudo('mkdir -p ' + py3spark_local_path_dir)
-            sudo('touch ' + py3spark_local_path_dir + 'kernel.json')
-            put(templates_dir + 'py3spark_local_template.json', '/tmp/py3spark_local_template.json')
-            sudo(
-                "PYJ=`find /opt/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; sed -i 's|PY4J|'$PYJ'|g' /tmp/py3spark_local_template.json")
-            sudo('sed -i "s|SP_VER|' + spark_version + '|g" /tmp/py3spark_local_template.json')
-            sudo('sed -i \'/PYTHONPATH\"\:/s|\(.*\)"|\\1/home/{0}/caffe/python:/home/{0}/pytorch/build:"|\' /tmp/py3spark_local_template.json'.format(os_user))
-            sudo('\cp /tmp/py3spark_local_template.json ' + py3spark_local_path_dir + 'kernel.json')
-            sudo('touch /home/' + os_user + '/.ensure_dir/py3spark_local_kernel_ensured')
+            conn.sudo('mkdir -p ' + py3spark_local_path_dir)
+            conn.sudo('touch ' + py3spark_local_path_dir + 'kernel.json')
+            conn.put(templates_dir + 'py3spark_local_template.json', '/tmp/py3spark_local_template.json')
+            conn.sudo(
+                '''bash -l -c "PYJ=`find /opt/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; sed -i 's|PY4J|'$PYJ'|g' /tmp/py3spark_local_template.json" ''')
+            conn.sudo('sed -i "s|PYTHON_VENV_PATH|' + python_venv_path + '|g" /tmp/py3spark_local_template.json')
+            conn.sudo('sed -i "s|PYTHON_VENV_VERSION|' + python_venv_version + '|g" /tmp/py3spark_local_template.json')
+            conn.sudo('sed -i "s|PYTHON_VENV_SHORT_VERSION|' + python_venv_version[:3] + '|g" /tmp/py3spark_local_template.json')
+            conn.sudo('sed -i "s|SP_VER|' + spark_version + '|g" /tmp/py3spark_local_template.json')
+            conn.sudo('sed -i \'/PYTHONPATH\"\:/s|\(.*\)"|\\1/home/{0}/caffe/python:/home/{0}/pytorch/build:"|\' /tmp/py3spark_local_template.json'.format(os_user))
+            conn.sudo('\cp /tmp/py3spark_local_template.json ' + py3spark_local_path_dir + 'kernel.json')
+            conn.sudo('touch /home/' + os_user + '/.ensure_dir/py3spark_local_kernel_ensured')
         except:
             sys.exit(1)
 
@@ -326,7 +469,7 @@
 def pyspark_kernel(kernels_dir, dataengine_service_version, cluster_name, spark_version, bucket, user_name, region, os_user='',
                    application='', pip_mirror='', numpy_version='1.14.3'):
     spark_path = '/opt/{0}/{1}/spark/'.format(dataengine_service_version, cluster_name)
-    local('mkdir -p {0}pyspark_{1}/'.format(kernels_dir, cluster_name))
+    subprocess.run('mkdir -p {0}pyspark_{1}/'.format(kernels_dir, cluster_name), shell=True, check=True)
     kernel_path = '{0}pyspark_{1}/kernel.json'.format(kernels_dir, cluster_name)
     template_file = "/tmp/pyspark_dataengine-service_template.json"
     with open(template_file, 'r') as f:
@@ -334,22 +477,22 @@
     text = text.replace('CLUSTER_NAME', cluster_name)
     text = text.replace('SPARK_VERSION', 'Spark-' + spark_version)
     text = text.replace('SPARK_PATH', spark_path)
-    text = text.replace('PYTHON_SHORT_VERSION', '2.7')
-    text = text.replace('PYTHON_FULL_VERSION', '2.7')
-    text = text.replace('PYTHON_PATH', '/usr/bin/python2.7')
+    text = text.replace('PYTHON_SHORT_VERSION', '3.8')
+    text = text.replace('PYTHON_FULL_VERSION', '3.8')
+    text = text.replace('PYTHON_PATH', '/usr/bin/python3.8')
     text = text.replace('DATAENGINE-SERVICE_VERSION', dataengine_service_version)
     with open(kernel_path, 'w') as f:
         f.write(text)
-    local('touch /tmp/kernel_var.json')
-    local("PYJ=`find /opt/{0}/{1}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {2} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{3}/caffe/python:/home/{3}/pytorch/build:\"|\' > /tmp/kernel_var.json".
-          format(dataengine_service_version, cluster_name, kernel_path, os_user))
-    local('sudo mv /tmp/kernel_var.json ' + kernel_path)
+    subprocess.run('touch /tmp/kernel_var.json', shell=True, check=True)
+    subprocess.run('''bash -l -c "PYJ=`find /opt/{0}/{1}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {2} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{3}/caffe/python:/home/{3}/pytorch/build:\"|\' > /tmp/kernel_var.json" '''.
+          format(dataengine_service_version, cluster_name, kernel_path, os_user), shell=True, check=True)
+    subprocess.run('sudo mv /tmp/kernel_var.json ' + kernel_path, shell=True, check=True)
     get_cluster_python_version(region, bucket, user_name, cluster_name)
-    with file('/tmp/python_version') as f:
+    with open('/tmp/python_version') as f:
         python_version = f.read()
     if python_version != '\n':
         installing_python(region, bucket, user_name, cluster_name, application, pip_mirror, numpy_version)
-        local('mkdir -p {0}py3spark_{1}/'.format(kernels_dir, cluster_name))
+        subprocess.run('mkdir -p {0}py3spark_{1}/'.format(kernels_dir, cluster_name), shell=True, check=True)
         kernel_path = '{0}py3spark_{1}/kernel.json'.format(kernels_dir, cluster_name)
         template_file = "/tmp/pyspark_dataengine-service_template.json"
         with open(template_file, 'r') as f:
@@ -364,64 +507,127 @@
         text = text.replace('DATAENGINE-SERVICE_VERSION', dataengine_service_version)
         with open(kernel_path, 'w') as f:
             f.write(text)
-        local('touch /tmp/kernel_var.json')
-        local("PYJ=`find /opt/{0}/{1}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {2} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{3}/caffe/python:/home/{3}/pytorch/build:\"|\' > /tmp/kernel_var.json"
-              .format(dataengine_service_version, cluster_name, kernel_path, os_user))
-        local('sudo mv /tmp/kernel_var.json {}'.format(kernel_path))
+        subprocess.run('touch /tmp/kernel_var.json', shell=True, check=True)
+        subprocess.run('''bash -l -c "PYJ=`find /opt/{0}/{1}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {2} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{3}/caffe/python:/home/{3}/pytorch/build:\"|\' > /tmp/kernel_var.json" '''
+              .format(dataengine_service_version, cluster_name, kernel_path, os_user), shell=True, check=True)
+        subprocess.run('sudo mv /tmp/kernel_var.json {}'.format(kernel_path), shell=True, check=True)
 
 
 def ensure_ciphers():
     try:
-        sudo('echo -e "\nKexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256" >> /etc/ssh/sshd_config')
-        sudo('echo -e "Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr" >> /etc/ssh/sshd_config')
-        sudo('echo -e "\tKexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256" >> /etc/ssh/ssh_config')
-        sudo('echo -e "\tCiphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr" >> /etc/ssh/ssh_config')
+        conn.sudo('''bash -c "echo -e '\nKexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256' >> /etc/ssh/sshd_config"''')
+        conn.sudo('''bash -c "echo -e 'Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr' >> /etc/ssh/sshd_config"''')
+        conn.sudo('''bash -c "echo -e '\tKexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256' >> /etc/ssh/ssh_config"''')
+        conn.sudo('''bash -c "echo -e '\tCiphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr' >> /etc/ssh/ssh_config"''')
         try:
-            sudo('service ssh reload')
+            conn.sudo('service ssh reload')
         except:
-            sudo('service sshd reload')
+            conn.sudo('service sshd reload')
     except Exception as err:
         traceback.print_exc()
         print('Failed to ensure ciphers: ', str(err))
         sys.exit(1)
 
+def ensure_dataengine_service_devtools():
+    try:
+        if not exists(conn, '/home/{}/dataengine-service-devtools-ensured'.format(os.environ['conf_os_user'])):
+            if os.environ['conf_cloud_provider'] in 'aws':
+                manage_pkg('-y install', 'remote', 'libcurl libcurl-devel')
+            elif (os.environ['conf_cloud_provider'] in 'gcp') and (
+                    '-w-' in conn.sudo('hostname').stdout.replace('\n', '')):
+                # manage_pkg('-y build-dep', 'remote', 'libcurl4-gnutls-dev libxml2-dev')
+                manage_pkg('-y install', 'remote', 'libxml2-dev libcurl4-openssl-dev pkg-config')
+            conn.sudo('R -e "install.packages(\'devtools\', repos = \'cloud.r-project.org\')"')
+            if (os.environ['conf_cloud_provider'] in 'gcp') and (
+                    "R_LIBS_SITE" not in conn.sudo('cat /opt/conda/miniconda3/lib/R/etc/Renviron').stdout):
+                conn.sudo(
+                    '''bash -l -c 'echo "R_LIBS_SITE=${R_LIBS_SITE-'/usr/local/lib/R/site-library:/usr/lib/R/site-library:/usr/lib/R/library'}" >> /opt/conda/miniconda3/lib/R/etc/Renviron' ''')
+            conn.sudo('touch /home/{}/dataengine-service-devtools-ensured'.format(os.environ['conf_os_user']))
+    except Exception as err:
+        print('Failed to ensure devtools for dataproc with err: {}'.format(err))
+        sys.exit(1)
 
 def install_r_pkg(requisites):
     status = list()
-    error_parser = "ERROR:|error:|Cannot|failed|Please run|requires"
+    error_parser = "ERROR:|error:|Cannot|failed|Please run|requires|Error|Skipping|couldn't find"
+    if os.environ['conf_resource'] == 'dataengine-service':
+        ensure_dataengine_service_devtools()
     try:
         for r_pkg in requisites:
-            if r_pkg == 'sparklyr':
-                run('sudo -i R -e \'install.packages("{0}", repos="https://cloud.r-project.org", dep=TRUE)\' 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E  "({1})" /tmp/tee.tmp > /tmp/install_{0}.log; then  echo "" > /tmp/install_{0}.log;fi'.format(r_pkg, error_parser))
-            sudo('R -e \'install.packages("{0}", repos="https://cloud.r-project.org", dep=TRUE)\' 2>&1 | tee /tmp/tee.tmp; if ! grep -w -E  "({1})" /tmp/tee.tmp >  /tmp/install_{0}.log; then  echo "" > /tmp/install_{0}.log;fi'.format(r_pkg, error_parser))
-            err = sudo('cat /tmp/install_{0}.log'.format(r_pkg)).replace('"', "'")
-            sudo('R -e \'installed.packages()[,c(3:4)]\' | if ! grep -w {0} > /tmp/install_{0}.list; then  echo "" > /tmp/install_{0}.list;fi'.format(r_pkg))
-            res = sudo('cat /tmp/install_{0}.list'.format(r_pkg))
-            if res:
-                ansi_escape = re.compile(r'\x1b[^m]*m')
-                version = ansi_escape.sub('', res).split("\r\n")[0].split('"')[1]
-                status.append({"group": "r_pkg", "name": r_pkg, "version": version, "status": "installed"})
+            name, vers = r_pkg
+            version = vers
+            if vers =='N/A':
+                vers = ''
             else:
-                status.append({"group": "r_pkg", "name": r_pkg, "status": "failed", "error_message": err})
+                vers = '"{}"'.format(vers)
+            if name == 'sparklyr':
+                conn.run('sudo -i R -e \'devtools::install_version("{0}", version = {1}, repos = "http://cran.us.r-project.org", '
+                         'dependencies = NA)\' 2>&1 | tee /tmp/install_{0}.tmp; if ! grep -w -E  "({2})" /tmp/install_{0}.tmp '
+                         '> /tmp/install_{0}.log; then  echo "" > /tmp/install_{0}.log;fi'.format(name, vers, error_parser))
+            else:
+                conn.sudo('R -e \'devtools::install_version("{0}", version = {1}, repos = "https://cloud.r-project.org", '
+                          'dependencies = NA)\' 2>&1 | tee /tmp/install_{0}.tmp; if ! grep -w -E "({2})" /tmp/install_{0}.tmp > '
+                          '/tmp/install_{0}.log; then  echo "" > /tmp/install_{0}.log;fi'.format(name, vers, error_parser))
+            dep = conn.sudo('grep "(NA.*->". /tmp/install_' + name + '.tmp | awk \'{print $1}\'').stdout.replace('\n', ' ')
+            dep_ver = conn.sudo('grep "(NA.*->". /tmp/install_' + name + '.tmp | awk \'{print $4}\'').stdout.replace('\n', ' ').replace(')', '').split(' ')
+            if dep == '':
+                dep = []
+            else:
+                dep = dep.split(' ')
+                for n, i in enumerate(dep):
+                    if i == name:
+                        dep[n] = ''
+                    else:
+                        dep[n] = '{} v.{}'.format(dep[n], dep_ver[n])
+                dep = [i for i in dep if i]
+            conn.sudo('hostname')
+            err = conn.sudo('cat /tmp/install_{0}.log'.format(name)).stdout.replace('"', "'").replace('\n', '')
+            conn.sudo('R -e \'installed.packages()[,c(3:4)]\' | if ! grep -w {0} > /tmp/install_{0}.list; then  echo "" > /tmp/install_{0}.list;fi'.format(name))
+            res = conn.sudo('cat /tmp/install_{0}.list'.format(name)).stdout.replace('\n', '')
+            if err:
+                status_msg = 'installation_error'
+                if 'couldn\'t find package \'{}\''.format(name) in err:
+                    status_msg = 'invalid_name'
+            elif res:
+                ansi_escape = re.compile(r'\x1b[^m]*m')
+                version = ansi_escape.sub('', res).split("\n")[0].split('"')[1]
+                status_msg = 'installed'
+            if 'Error in download_version_url(package, version, repos, type) :' in err or 'Error in parse_deps(paste(spec,' in err:
+                conn.sudo('R -e \'install.packages("versions", repos="https://cloud.r-project.org", dep=TRUE)\'')
+                versions = conn.sudo('R -e \'library(versions); available.versions("' + name + '")\' 2>&1 | grep -A 50 '
+                                    '\'date available\' | awk \'{print $2}\'').stdout.strip().replace('\n', ' ')[5:].split(' ')
+                if versions != ['']:
+                    status_msg = 'invalid_version'
+                else:
+                    versions = []
+            else:
+                versions = []
+            status.append({"group": "r_pkg", "name": name, "version": version, "status": status_msg, "error_message": err, "available_versions": versions, "add_pkgs": dep})
+        conn.sudo('rm /tmp/*{}*'.format(name))
         return status
-    except:
-        return "Fail to install R packages"
+    except Exception as err:
+        for r_pkg in requisites:
+            name, vers = r_pkg
+            status.append(
+                {"group": "r_pkg", "name": name, "version": vers, "status": 'installation_error', "error_message": err})
+        print("Failed to install R packages")
+        return status
 
 
 def update_spark_jars(jars_dir='/opt/jars'):
     try:
-        configs = sudo('find /opt/ /etc/ /usr/lib/ -name spark-defaults.conf -type f').split('\r\n')
-        if exists(jars_dir):
+        configs = conn.sudo('find /opt/ /etc/ /usr/lib/ -name spark-defaults.conf -type f').stdout.split('\n')
+        if exists(conn, jars_dir):
             for conf in filter(None, configs):
                 des_path = ''
-                all_jars = sudo('find {0} -name "*.jar"'.format(jars_dir)).split('\r\n')
+                all_jars = conn.sudo('find {0} -name "*.jar"'.format(jars_dir)).stdout.split('\n')
                 if ('-des-' in conf):
                     des_path = '/'.join(conf.split('/')[:3])
                     all_jars = find_des_jars(all_jars, des_path)
-                sudo('''sed -i '/^# Generated\|^spark.jars/d' {0}'''.format(conf))
-                sudo('echo "# Generated spark.jars by DLab from {0}\nspark.jars {1}" >> {2}'
+                conn.sudo('''sed -i '/^# Generated\|^spark.jars/d' {0}'''.format(conf))
+                conn.sudo(''' bash -l -c 'echo "# Generated spark.jars by DataLab from {0}\nspark.jars {1}" >> {2}' '''
                      .format(','.join(filter(None, [jars_dir, des_path])), ','.join(all_jars), conf))
-                # sudo("sed -i 's/^[[:space:]]*//' {0}".format(conf))
+                # conn.sudo("sed -i 's/^[[:space:]]*//' {0}".format(conf))
         else:
             print("Can't find directory {0} with jar files".format(jars_dir))
     except Exception as err:
@@ -432,228 +638,256 @@
 
 def install_java_pkg(requisites):
     status = list()
-    error_parser = "ERROR|error|No such|no such|Please run|requires|module not found"
+    error_parser = "ERROR|error|No such|no such|Please run|requires|module not found|Exception"
     templates_dir = '/root/templates/'
     ivy_dir = '/opt/ivy'
     ivy_cache_dir = '{0}/cache/'.format(ivy_dir)
     ivy_settings = 'ivysettings.xml'
     dest_dir = '/opt/jars/java'
     try:
-        ivy_jar = sudo('find /opt /usr -name "*ivy-{0}.jar" | head -n 1'.format(os.environ['notebook_ivy_version']))
-        sudo('mkdir -p {0} {1}'.format(ivy_dir, dest_dir))
-        put('{0}{1}'.format(templates_dir, ivy_settings), '{0}/{1}'.format(ivy_dir, ivy_settings), use_sudo=True)
-        proxy_string = sudo('cat /etc/profile | grep http_proxy | cut -f2 -d"="')
+        ivy_jar = conn.sudo('find /opt /usr -name "*ivy-{0}.jar" | head -n 1'.format(os.environ['notebook_ivy_version'])).stdout.replace('\n','')
+        conn.sudo('mkdir -p {0} {1}'.format(ivy_dir, dest_dir))
+        conn.put('{0}{1}'.format(templates_dir, ivy_settings), '/tmp/{}'.format(ivy_settings))
+        conn.sudo('cp -f /tmp/{1} {0}/{1}'.format(ivy_dir, ivy_settings))
+        proxy_string = conn.sudo('cat /etc/profile | grep http_proxy | cut -f2 -d"="').stdout.replace('\n','')
         proxy_re = '(?P<proto>http.*)://(?P<host>[^:/ ]+):(?P<port>[0-9]*)'
         proxy_find = re.search(proxy_re, proxy_string)
         java_proxy = "export _JAVA_OPTIONS='-Dhttp.proxyHost={0} -Dhttp.proxyPort={1} \
             -Dhttps.proxyHost={0} -Dhttps.proxyPort={1}'".format(proxy_find.group('host'), proxy_find.group('port'))
         for java_pkg in requisites:
-            sudo('rm -rf {0}'.format(ivy_cache_dir))
-            sudo('mkdir -p {0}'.format(ivy_cache_dir))
+            conn.sudo('rm -rf {0}'.format(ivy_cache_dir))
+            conn.sudo('mkdir -p {0}'.format(ivy_cache_dir))
             group, artifact, version, override = java_pkg
             print("Installing package (override: {3}): {0}:{1}:{2}".format(group, artifact, version, override))
-            sudo('{8}; java -jar {0} -settings {1}/{2} -cache {3} -dependency {4} {5} {6} 2>&1 | tee /tmp/tee.tmp; \
-                if ! grep -w -E  "({7})" /tmp/tee.tmp > /tmp/install_{5}.log; then echo "" > /tmp/install_{5}.log;fi'
-                 .format(ivy_jar, ivy_dir, ivy_settings, ivy_cache_dir, group, artifact, version, error_parser, java_proxy))
-            err = sudo('cat /tmp/install_{0}.log'.format(artifact)).replace('"', "'").strip()
-            sudo('find {0} -name "{1}*.jar" | head -n 1 | rev | cut -f1 -d "/" | rev | \
+            conn.sudo('''bash -c "{8}; java -jar {0} -settings {1}/{2} -cache {3} -dependency {4} {5} {6} 2>&1 | tee /tmp/install_{5}.tmp; if ! grep -w -E  \\"({7})\\" /tmp/install_{5}.tmp > /tmp/install_{5}.log; then echo \\"\\" > /tmp/install_{5}.log;fi" '''.format(ivy_jar, ivy_dir, ivy_settings, ivy_cache_dir, group, artifact, version, error_parser, java_proxy))
+            err = conn.sudo('cat /tmp/install_{0}.log'.format(artifact)).stdout.replace('"', "'").strip()
+            conn.sudo('find {0} -name "{1}*.jar" | head -n 1 | rev | cut -f1 -d "/" | rev | \
                 if ! grep -w -i {1} > /tmp/install_{1}.list; then echo "" > /tmp/install_{1}.list;fi'.format(ivy_cache_dir, artifact))
-            res = sudo('cat /tmp/install_{0}.list'.format(artifact))
+            res = conn.sudo('cat /tmp/install_{0}.list'.format(artifact)).stdout.replace('\n','')
             if res:
-                sudo('cp -f $(find {0} -name "*.jar" | xargs) {1}'.format(ivy_cache_dir, dest_dir))
+                conn.sudo('cp -f $(find {0} -name "*.jar" | xargs) {1}'.format(ivy_cache_dir, dest_dir))
                 status.append({"group": "java", "name": "{0}:{1}".format(group, artifact), "version": version, "status": "installed"})
             else:
-                status.append({"group": "java", "name": "{0}:{1}".format(group, artifact), "status": "failed", "error_message": err})
+                status.append({"group": "java", "name": "{0}:{1}".format(group, artifact), "status": "installation_error", "error_message": err})
         update_spark_jars()
+        conn.sudo('rm -rf /tmp/*{}*'.format(artifact))
         return status
     except Exception as err:
-        append_result("Failed to install {} packages".format(requisites), str(err))
+        for java_pkg in requisites:
+            group, artifact, version, override = java_pkg
+            status.append({"group": "java", "name": "{0}:{1}".format(group, artifact), "status": "installation_error",
+                           "error_message": err})
         print("Failed to install {} packages".format(requisites))
-        sys.exit(1)
-
+        return status
 
 def get_available_r_pkgs():
     try:
         r_pkgs = dict()
-        sudo('R -e \'write.table(available.packages(contriburl="https://cloud.r-project.org/src/contrib"), file="/tmp/r.csv", row.names=F, col.names=F, sep=",")\'')
-        get("/tmp/r.csv", "r.csv")
-        with open('r.csv', 'rb') as csvfile:
+        conn.sudo('R -e \'write.table(available.packages(contriburl="https://cloud.r-project.org/src/contrib"), file="/tmp/r.csv", row.names=F, col.names=F, sep=",")\'')
+        conn.get("/tmp/r.csv", "r.csv")
+        with open('r.csv', 'r') as csvfile:
             reader = csv.reader(csvfile, delimiter=',')
             for row in reader:
                 r_pkgs[row[0]] = row[1]
         return r_pkgs
-    except:
+    except Exception as err:
+        print("Failed to install {} ".format(err))
         sys.exit(1)
 
 
 def ensure_toree_local_kernel(os_user, toree_link, scala_kernel_path, files_dir, scala_version, spark_version):
-    if not exists('/home/' + os_user + '/.ensure_dir/toree_local_kernel_ensured'):
+    if not exists(conn,'/home/' + os_user + '/.ensure_dir/toree_local_kernel_ensured'):
         try:
-            sudo('pip install ' + toree_link + ' --no-cache-dir')
-            sudo('ln -s /opt/spark/ /usr/local/spark')
-            sudo('jupyter toree install')
-            sudo('mv ' + scala_kernel_path + 'lib/* /tmp/')
-            put(files_dir + 'toree-assembly-0.2.0.jar', '/tmp/toree-assembly-0.2.0.jar')
-            sudo('mv /tmp/toree-assembly-0.2.0.jar ' + scala_kernel_path + 'lib/')
-            sudo(
+            conn.sudo('pip install ' + toree_link + ' --no-cache-dir')
+            conn.sudo('ln -s /opt/spark/ /usr/local/spark')
+            conn.sudo('jupyter toree install')
+            conn.sudo('mv ' + scala_kernel_path + 'lib/* /tmp/')
+            conn.put(files_dir + 'toree-assembly-0.5.0.jar', '/tmp/toree-assembly-0.5.0.jar')
+            conn.sudo('mv /tmp/toree-assembly-0.5.0.jar ' + scala_kernel_path + 'lib/')
+            conn.sudo(
                 'sed -i "s|Apache Toree - Scala|Local Apache Toree - Scala (Scala-' + scala_version +
                 ', Spark-' + spark_version + ')|g" ' + scala_kernel_path + 'kernel.json')
-            sudo('touch /home/' + os_user + '/.ensure_dir/toree_local_kernel_ensured')
+            conn.sudo('touch /home/' + os_user + '/.ensure_dir/toree_local_kernel_ensured')
         except:
             sys.exit(1)
 
 
 def install_ungit(os_user, notebook_name, edge_ip):
-    if not exists('/home/{}/.ensure_dir/ungit_ensured'.format(os_user)):
+    if not exists(conn,'/home/{}/.ensure_dir/ungit_ensured'.format(os_user)):
         try:
-            manage_npm_pkg('-g install ungit@{}'.format(os.environ['notebook_ungit_version']))
-            put('/root/templates/ungit.service', '/tmp/ungit.service')
-            sudo("sed -i 's|OS_USR|{}|' /tmp/ungit.service".format(os_user))
-            http_proxy = run('echo $http_proxy')
-            sudo("sed -i 's|PROXY_HOST|{}|g' /tmp/ungit.service".format(http_proxy))
-            sudo("sed -i 's|NOTEBOOK_NAME|{}|' /tmp/ungit.service".format(
+            manage_npm_pkg('npm -g install ungit@{}'.format(os.environ['notebook_ungit_version']))
+            conn.put('/root/templates/ungit.service', '/tmp/ungit.service')
+            conn.sudo("sed -i 's|OS_USR|{}|' /tmp/ungit.service".format(os_user))
+            http_proxy = conn.run('''bash -l -c 'echo $http_proxy' ''').stdout.replace('\n','')
+            conn.sudo("sed -i 's|PROXY_HOST|{}|g' /tmp/ungit.service".format(http_proxy))
+            conn.sudo("sed -i 's|NOTEBOOK_NAME|{}|' /tmp/ungit.service".format(
                 notebook_name))
-            sudo("mv -f /tmp/ungit.service /etc/systemd/system/ungit.service")
-            run('git config --global user.name "Example User"')
-            run('git config --global user.email "example@example.com"')
-            run('mkdir -p ~/.git/templates/hooks')
-            put('/root/scripts/git_pre_commit.py', '~/.git/templates/hooks/pre-commit', mode=0755)
-            run('git config --global init.templatedir ~/.git/templates')
-            run('touch ~/.gitignore')
-            run('git config --global core.excludesfile ~/.gitignore')
-            run('echo ".ipynb_checkpoints/" >> ~/.gitignore')
-            run('echo "spark-warehouse/" >> ~/.gitignore')
-            run('echo "metastore_db/" >> ~/.gitignore')
-            run('echo "derby.log" >> ~/.gitignore')
-            sudo(
-                'echo -e "Host git.epam.com\n   HostName git.epam.com\n   ProxyCommand nc -X connect -x {}:3128 %h %p\n" > /home/{}/.ssh/config'.format(
+            conn.sudo("mv -f /tmp/ungit.service /etc/systemd/system/ungit.service")
+            conn.run('git config --global user.name "Example User"')
+            conn.run('git config --global user.email "example@example.com"')
+            conn.run('mkdir -p ~/.git/templates/hooks')
+            conn.put('/root/scripts/git_pre_commit.py', '/home/{}/.git/templates/hooks/pre-commit'.format(os_user))
+            conn.sudo('chmod 755 ~/.git/templates/hooks/pre-commit')
+            conn.run('git config --global init.templatedir ~/.git/templates')
+            conn.run('touch ~/.gitignore')
+            conn.run('git config --global core.excludesfile ~/.gitignore')
+            conn.run('echo ".ipynb_checkpoints/" >> ~/.gitignore')
+            conn.run('echo "spark-warehouse/" >> ~/.gitignore')
+            conn.run('echo "metastore_db/" >> ~/.gitignore')
+            conn.run('echo "derby.log" >> ~/.gitignore')
+            conn.sudo('''bash -l -c 'echo -e "Host git.epam.com\n   HostName git.epam.com\n   ProxyCommand nc -X connect -x {}:3128 %h %p\n" > /home/{}/.ssh/config' '''.format(
                     edge_ip, os_user))
-            sudo(
-                'echo -e "Host github.com\n   HostName github.com\n   ProxyCommand nc -X connect -x {}:3128 %h %p" >> /home/{}/.ssh/config'.format(
+            conn.sudo('''bash -l -c 'echo -e "Host github.com\n   HostName github.com\n   ProxyCommand nc -X connect -x {}:3128 %h %p" >> /home/{}/.ssh/config' '''.format(
                     edge_ip, os_user))
-            sudo(
-                'echo -e "Host gitlab.com\n   HostName gitlab.com\n   ProxyCommand nc -X connect -x {}:3128 %h %p" >> /home/{}/.ssh/config'.format(
+            conn.sudo('''bash -l -c 'echo -e "Host gitlab.com\n   HostName gitlab.com\n   ProxyCommand nc -X connect -x {}:3128 %h %p" >> /home/{}/.ssh/config' '''.format(
                     edge_ip, os_user))
-            sudo('systemctl daemon-reload')
-            sudo('systemctl enable ungit.service')
-            sudo('systemctl start ungit.service')
-            sudo('touch /home/{}/.ensure_dir/ungit_ensured'.format(os_user))
+            conn.sudo('systemctl daemon-reload')
+            conn.sudo('systemctl enable ungit.service')
+            conn.sudo('systemctl start ungit.service')
+            conn.sudo('touch /home/{}/.ensure_dir/ungit_ensured'.format(os_user))
         except:
             sys.exit(1)
     else:
         try:
-            sudo("sed -i 's|--rootPath=/.*-ungit|--rootPath=/{}-ungit|' /etc/systemd/system/ungit.service".format(
+            conn.sudo("sed -i 's|--rootPath=/.*-ungit|--rootPath=/{}-ungit|' /etc/systemd/system/ungit.service".format(
                 notebook_name))
-            http_proxy = run('echo $http_proxy')
-            sudo("sed -i 's|HTTPS_PROXY=.*3128|HTTPS_PROXY={}|g' /etc/systemd/system/ungit.service".format(http_proxy))
-            sudo("sed -i 's|HTTP_PROXY=.*3128|HTTP_PROXY={}|g' /etc/systemd/system/ungit.service".format(http_proxy))
-            sudo('systemctl daemon-reload')
-            sudo('systemctl restart ungit.service')
+            http_proxy = conn.run('''bash -l -c 'echo $http_proxy' ''').stdout.replace('\n','')
+            conn.sudo("sed -i 's|HTTPS_PROXY=.*3128|HTTPS_PROXY={}|g' /etc/systemd/system/ungit.service".format(http_proxy))
+            conn.sudo("sed -i 's|HTTP_PROXY=.*3128|HTTP_PROXY={}|g' /etc/systemd/system/ungit.service".format(http_proxy))
+            conn.sudo('systemctl daemon-reload')
+            conn.sudo('systemctl restart ungit.service')
         except:
             sys.exit(1)
-    run('git config --global http.proxy $http_proxy')
-    run('git config --global https.proxy $https_proxy')
+    conn.run('''bash -l -c 'git config --global http.proxy $http_proxy' ''')
+    conn.run('''bash -l -c 'git config --global https.proxy $https_proxy' ''')
 
 
 def install_inactivity_checker(os_user, ip_address, rstudio=False):
-    if not exists('/home/{}/.ensure_dir/inactivity_ensured'.format(os_user)):
+    if not exists(conn,'/home/{}/.ensure_dir/inactivity_ensured'.format(os_user)):
         try:
-            if not exists('/opt/inactivity'):
-                sudo('mkdir /opt/inactivity')
-            put('/root/templates/inactive.service', '/etc/systemd/system/inactive.service', use_sudo=True)
-            put('/root/templates/inactive.timer', '/etc/systemd/system/inactive.timer', use_sudo=True)
+            if not exists(conn,'/opt/inactivity'):
+                conn.sudo('mkdir /opt/inactivity')
+            conn.put('/root/templates/inactive.service', '/tmp/inactive.service')
+            conn.sudo('cp /tmp/inactive.service /etc/systemd/system/inactive.service')
+            conn.put('/root/templates/inactive.timer', '/tmp/inactive.timer')
+            conn.sudo('cp /tmp/inactive.timer /etc/systemd/system/inactive.timer')
             if rstudio:
-                put('/root/templates/inactive_rs.sh', '/opt/inactivity/inactive.sh', use_sudo=True)
+                conn.put('/root/templates/inactive_rs.sh', '/tmp/inactive.sh')
+                conn.sudo('cp /tmp/inactive.sh /opt/inactivity/inactive.sh')
             else:
-                put('/root/templates/inactive.sh', '/opt/inactivity/inactive.sh', use_sudo=True)
-            sudo("sed -i 's|IP_ADRESS|{}|g' /opt/inactivity/inactive.sh".format(ip_address))
-            sudo("chmod 755 /opt/inactivity/inactive.sh")
-            sudo("chown root:root /etc/systemd/system/inactive.service")
-            sudo("chown root:root /etc/systemd/system/inactive.timer")
-            sudo("date +%s > /opt/inactivity/local_inactivity")
-            sudo('systemctl daemon-reload')
-            sudo('systemctl enable inactive.timer')
-            sudo('systemctl start inactive.timer')
-            sudo('touch /home/{}/.ensure_dir/inactive_ensured'.format(os_user))
+                conn.put('/root/templates/inactive.sh', '/tmp/inactive.sh')
+                conn.sudo('cp /tmp/inactive.sh /opt/inactivity/inactive.sh')
+            conn.sudo("sed -i 's|IP_ADRESS|{}|g' /opt/inactivity/inactive.sh".format(ip_address))
+            conn.sudo("chmod 755 /opt/inactivity/inactive.sh")
+            conn.sudo("chown root:root /etc/systemd/system/inactive.service")
+            conn.sudo("chown root:root /etc/systemd/system/inactive.timer")
+            conn.sudo('''bash -l -c "date +%s > /opt/inactivity/local_inactivity" ''')
+            conn.sudo('systemctl daemon-reload')
+            conn.sudo('systemctl enable inactive.timer')
+            conn.sudo('systemctl start inactive.timer')
+            conn.sudo('touch /home/{}/.ensure_dir/inactive_ensured'.format(os_user))
         except Exception as err:
             print('Failed to setup inactivity check service!', str(err))
             sys.exit(1)
 
 
 def set_git_proxy(os_user, hostname, keyfile, proxy_host):
-    env['connection_attempts'] = 100
-    env.key_filename = [keyfile]
-    env.host_string = os_user + '@' + hostname
-    run('git config --global http.proxy {}'.format(proxy_host))
-    run('git config --global https.proxy {}'.format(proxy_host))
+    init_datalab_connection(hostname, os_user, keyfile)
+    conn.run('git config --global http.proxy {}'.format(proxy_host))
+    conn.run('git config --global https.proxy {}'.format(proxy_host))
+    conn.close()
 
 
 def set_mongo_parameters(client, mongo_parameters):
     for i in mongo_parameters:
-        client.dlabdb.settings.insert_one({"_id": i, "value": mongo_parameters[i]})
+        client.datalabdb.settings.insert_one({"_id": i, "value": mongo_parameters[i]})
 
 
 def install_r_packages(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/r_packages_ensured'):
-        sudo('R -e "install.packages(\'devtools\', repos = \'https://cloud.r-project.org\')"')
-        sudo('R -e "install.packages(\'knitr\', repos = \'https://cloud.r-project.org\')"')
-        sudo('R -e "install.packages(\'ggplot2\', repos = \'https://cloud.r-project.org\')"')
-        sudo('R -e "install.packages(c(\'devtools\',\'mplot\', \'googleVis\'), '
+    if not exists(conn,'/home/' + os_user + '/.ensure_dir/r_packages_ensured'):
+        conn.sudo('R -e "install.packages(\'devtools\', repos = \'https://cloud.r-project.org\')"')
+        conn.sudo('R -e "install.packages(\'knitr\', repos = \'https://cloud.r-project.org\')"')
+        conn.sudo('R -e "install.packages(\'ggplot2\', repos = \'https://cloud.r-project.org\')"')
+        conn.sudo('R -e "install.packages(c(\'devtools\',\'mplot\', \'googleVis\'), '
              'repos = \'https://cloud.r-project.org\'); require(devtools); install_github(\'ramnathv/rCharts\')"')
-        sudo('touch /home/' + os_user + '/.ensure_dir/r_packages_ensured')
+        conn.sudo('R -e \'install.packages("versions", repos="https://cloud.r-project.org", dep=TRUE)\'')
+        conn.sudo('touch /home/' + os_user + '/.ensure_dir/r_packages_ensured')
 
 
 def add_breeze_library_local(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/breeze_local_ensured'):
+    if not exists(conn,'/home/' + os_user + '/.ensure_dir/breeze_local_ensured'):
         try:
             breeze_tmp_dir = '/tmp/breeze_tmp_local/'
             jars_dir = '/opt/jars/'
-            sudo('mkdir -p {}'.format(breeze_tmp_dir))
-            sudo('wget https://repo1.maven.org/maven2/org/scalanlp/breeze_{0}/{1}/breeze_{0}-{1}.jar -O \
+            conn.sudo('mkdir -p {}'.format(breeze_tmp_dir))
+            conn.sudo('wget https://repo1.maven.org/maven2/org/scalanlp/breeze_{0}/{1}/breeze_{0}-{1}.jar -O \
                     {2}breeze_{0}-{1}.jar'.format('2.11', '0.12', breeze_tmp_dir))
-            sudo('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-natives_{0}/{1}/breeze-natives_{0}-{1}.jar -O \
+            conn.sudo('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-natives_{0}/{1}/breeze-natives_{0}-{1}.jar -O \
                     {2}breeze-natives_{0}-{1}.jar'.format('2.11', '0.12', breeze_tmp_dir))
-            sudo('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-viz_{0}/{1}/breeze-viz_{0}-{1}.jar -O \
+            conn.sudo('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-viz_{0}/{1}/breeze-viz_{0}-{1}.jar -O \
                     {2}breeze-viz_{0}-{1}.jar'.format('2.11', '0.12', breeze_tmp_dir))
-            sudo('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-macros_{0}/{1}/breeze-macros_{0}-{1}.jar -O \
+            conn.sudo('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-macros_{0}/{1}/breeze-macros_{0}-{1}.jar -O \
                     {2}breeze-macros_{0}-{1}.jar'.format('2.11', '0.12', breeze_tmp_dir))
-            sudo('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-parent_{0}/{1}/breeze-parent_{0}-{1}.jar -O \
+            conn.sudo('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-parent_{0}/{1}/breeze-parent_{0}-{1}.jar -O \
                     {2}breeze-parent_{0}-{1}.jar'.format('2.11', '0.12', breeze_tmp_dir))
-            sudo('wget https://repo1.maven.org/maven2/org/jfree/jfreechart/{0}/jfreechart-{0}.jar -O \
+            conn.sudo('wget https://repo1.maven.org/maven2/org/jfree/jfreechart/{0}/jfreechart-{0}.jar -O \
                     {1}jfreechart-{0}.jar'.format('1.0.19', breeze_tmp_dir))
-            sudo('wget https://repo1.maven.org/maven2/org/jfree/jcommon/{0}/jcommon-{0}.jar -O \
+            conn.sudo('wget https://repo1.maven.org/maven2/org/jfree/jcommon/{0}/jcommon-{0}.jar -O \
                     {1}jcommon-{0}.jar'.format('1.0.24', breeze_tmp_dir))
-            sudo('wget --no-check-certificate https://brunelvis.org/jar/spark-kernel-brunel-all-{0}.jar -O \
+            conn.sudo('wget --no-check-certificate https://brunelvis.org/jar/spark-kernel-brunel-all-{0}.jar -O \
                     {1}spark-kernel-brunel-all-{0}.jar'.format('2.3', breeze_tmp_dir))
-            sudo('mv {0}* {1}'.format(breeze_tmp_dir, jars_dir))
-            sudo('touch /home/' + os_user + '/.ensure_dir/breeze_local_ensured')
+            conn.sudo('mv {0}* {1}'.format(breeze_tmp_dir, jars_dir))
+            conn.sudo('touch /home/' + os_user + '/.ensure_dir/breeze_local_ensured')
         except:
             sys.exit(1)
 
 
-def configure_data_engine_service_pip(hostname, os_user, keyfile):
-    env['connection_attempts'] = 100
-    env.key_filename = [keyfile]
-    env.host_string = os_user + '@' + hostname
-    if not exists('/usr/bin/pip2'):
-        sudo('ln -s /usr/bin/pip-2.7 /usr/bin/pip2')
-    if not exists('/usr/bin/pip3') and sudo("python3.4 -V 2>/dev/null | awk '{print $2}'"):
-        sudo('ln -s /usr/bin/pip-3.4 /usr/bin/pip3')
-    elif not exists('/usr/bin/pip3') and sudo("python3.5 -V 2>/dev/null | awk '{print $2}'"):
-        sudo('ln -s /usr/bin/pip-3.5 /usr/bin/pip3')
-    elif not exists('/usr/bin/pip3') and sudo("python3.6 -V 2>/dev/null | awk '{print $2}'"):
-        sudo('ln -s /usr/bin/pip-3.6 /usr/bin/pip3')
-    sudo('echo "export PATH=$PATH:/usr/local/bin" >> /etc/profile')
-    sudo('source /etc/profile')
-    run('source /etc/profile')
+def configure_data_engine_service_pip(hostname, os_user, keyfile, emr=False):
+    init_datalab_connection(hostname, os_user, keyfile)
+    #datalab.common_lib.manage_pkg('-y install', 'remote', 'python3-pip')
+    if not exists(conn,'/usr/bin/pip3') and conn.sudo("python3.9 -V 2>/dev/null | awk '{print $2}'").stdout:
+        conn.sudo('ln -s /usr/bin/pip-3.9 /usr/bin/pip3')
+    elif not exists(conn,'/usr/bin/pip3') and conn.sudo("python3.8 -V 2>/dev/null | awk '{print $2}'").stdout:
+        conn.sudo('ln -s /usr/bin/pip-3.8 /usr/bin/pip3')
+    elif not exists(conn,'/usr/bin/pip3') and conn.sudo("python3.7 -V 2>/dev/null | awk '{print $2}'").stdout:
+        conn.sudo('ln -s /usr/bin/pip-3.7 /usr/bin/pip3')
+    elif not exists(conn,'/usr/bin/pip3') and conn.sudo("python3.6 -V 2>/dev/null | awk '{print $2}'").stdout:
+        conn.sudo('ln -s /usr/bin/pip-3.6 /usr/bin/pip3')
+    elif not exists(conn,'/usr/bin/pip3') and conn.sudo("python3.5 -V 2>/dev/null | awk '{print $2}'").stdout:
+        conn.sudo('ln -s /usr/bin/pip-3.5 /usr/bin/pip3')
+    if emr:
+        conn.sudo('pip3 install -U pip=={}'.format(os.environ['conf_pip_version']))
+        conn.sudo('ln -s /usr/local/bin/pip3.7 /bin/pip3.7')
+    conn.sudo('''bash -c -l 'echo "export PATH=$PATH:/usr/local/bin" >> /etc/profile' ''')
+    conn.sudo('bash -c -l "source /etc/profile"')
+    conn.run('bash -c -l "source /etc/profile"')
+    conn.close()
 
+def configure_data_engine_service_livy(hostname, os_user, keyfile):
+    init_datalab_connection(hostname, os_user, keyfile)
+    if exists(conn,'/usr/local/lib/livy'):
+        conn.sudo('rm -r /usr/local/lib/livy')
+    conn.sudo('wget -P /tmp/  --user={} --password={} '
+                         '{}/repository/packages/livy.tar.gz --no-check-certificate'
+                         .format(os.environ['conf_repository_user'],
+                                 os.environ['conf_repository_pass'], os.environ['conf_repository_address']))
+    conn.sudo('tar -xzvf /tmp/livy.tar.gz -C /usr/local/lib/')
+    conn.sudo('ln -s /usr/local/lib/incubator-livy /usr/local/lib/livy')
+    conn.put('/root/templates/dataengine-service_livy-env.sh', '/usr/local/lib/livy/conf/livy-env.sh')
+    conn.put('/root/templates/dataengine-service_livy.service', '/tmp/livy.service')
+    conn.sudo("sed -i 's|OS_USER|{}|' /tmp/livy.service".format(os_user))
+    conn.sudo('mv /tmp/livy.service /etc/systemd/system/livy.service')
+    conn.sudo('systemctl daemon-reload')
+    conn.sudo('systemctl enable livy.service')
+    conn.sudo('systemctl start livy.service')
+    conn.close()
 
 def remove_rstudio_dataengines_kernel(cluster_name, os_user):
     try:
         cluster_re = ['-{}"'.format(cluster_name),
                       '-{}-'.format(cluster_name),
                       '-{}/'.format(cluster_name)]
-        get('/home/{}/.Rprofile'.format(os_user), 'Rprofile')
+        conn.get('/home/{}/.Rprofile'.format(os_user), 'Rprofile')
         data = open('Rprofile').read()
         conf = filter(None, data.split('\n'))
         # Filter config from any math of cluster_name in line,
@@ -670,8 +904,8 @@
         with open('.Rprofile', 'w') as f:
             for line in conf:
                 f.write('{}\n'.format(line))
-        put('.Rprofile', '/home/{}/.Rprofile'.format(os_user))
-        get('/home/{}/.Renviron'.format(os_user), 'Renviron')
+        conn.put('.Rprofile', '/home/{}/.Rprofile'.format(os_user))
+        conn.get('/home/{}/.Renviron'.format(os_user), 'Renviron')
         data = open('Renviron').read()
         conf = filter(None, data.split('\n'))
         comment_all = lambda x: x if x.startswith('#') else '#{}'.format(x)
@@ -688,41 +922,33 @@
         with open('.Renviron', 'w') as f:
             for line in conf:
                 f.write('{}\n'.format(line))
-        put('.Renviron', '/home/{}/.Renviron'.format(os_user))
+        conn.put('.Renviron', '/home/{}/.Renviron'.format(os_user))
         if len(conf) == 1:
-           sudo('rm -f /home/{}/.ensure_dir/rstudio_dataengine_ensured'.format(os_user))
-           sudo('rm -f /home/{}/.ensure_dir/rstudio_dataengine-service_ensured'.format(os_user))
-        sudo('''R -e "source('/home/{}/.Rprofile')"'''.format(os_user))
+           conn.sudo('rm -f /home/{}/.ensure_dir/rstudio_dataengine_ensured'.format(os_user))
+           conn.sudo('rm -f /home/{}/.ensure_dir/rstudio_dataengine-service_ensured'.format(os_user))
+        conn.sudo('''R -e "source('/home/{}/.Rprofile')"'''.format(os_user))
     except:
         sys.exit(1)
 
 
 def restart_zeppelin(creds=False, os_user='', hostname='', keyfile=''):
     if creds:
-        env['connection_attempts'] = 100
-        env.key_filename = [keyfile]
-        env.host_string = os_user + '@' + hostname
-    sudo("systemctl daemon-reload")
-    sudo("systemctl restart zeppelin-notebook")
-
+        init_datalab_connection(hostname, os_user, keyfile)
+    conn.sudo("systemctl daemon-reload")
+    conn.sudo("systemctl restart zeppelin-notebook")
+    if creds:
+        conn.close()
 
 def get_spark_memory(creds=False, os_user='', hostname='', keyfile=''):
     if creds:
-        with settings(host_string='{}@{}'.format(os_user, hostname)):
-            mem = sudo('free -m | grep Mem | tr -s " " ":" | cut -f 2 -d ":"')
-            instance_memory = int(mem)
-    else:
-        mem = sudo('free -m | grep Mem | tr -s " " ":" | cut -f 2 -d ":"')
+        con = init_datalab_connection(hostname, os_user, keyfile)
+        mem = con.sudo('free -m | grep Mem | tr -s " " ":" | cut -f 2 -d ":"').stdout.replace('\n', '')
         instance_memory = int(mem)
-    try:
-        if instance_memory > int(os.environ['dataengine_expl_instance_memory']):
-            spark_memory = instance_memory - int(os.environ['dataengine_os_expl_memory'])
-        else:
-            spark_memory = instance_memory * int(os.environ['dataengine_os_memory']) / 100
-        return spark_memory
-    except Exception as err:
-        print('Error:', str(err))
-        return err
+    else:
+        mem = conn.sudo('free -m | grep Mem | tr -s " " ":" | cut -f 2 -d ":"').stdout.replace('\n','')
+        instance_memory = int(mem)
+    spark_memory = round(instance_memory*90/100)
+    return spark_memory
 
 
 def replace_multi_symbols(string, symbol, symbol_cut=False):
@@ -746,25 +972,22 @@
 
 
 def update_pyopenssl_lib(os_user):
-    if not exists('/home/{}/.ensure_dir/pyopenssl_updated'.format(os_user)):
+    if not exists(conn,'/home/{}/.ensure_dir/pyopenssl_updated'.format(os_user)):
         try:
-            if exists('/usr/bin/pip3'):
-                sudo('pip3 install -U pyopenssl')
-            sudo('pip2 install -U pyopenssl')
-            sudo('touch /home/{}/.ensure_dir/pyopenssl_updated'.format(os_user))
+            if exists(conn, '/usr/bin/pip3'):
+                conn.sudo('pip3 install -U pyopenssl')
+            conn.sudo('touch /home/{}/.ensure_dir/pyopenssl_updated'.format(os_user))
         except:
             sys.exit(1)
 
 
 def find_cluster_kernels():
     try:
-        with settings(sudo_user='root'):
-            de = [i for i in sudo('find /opt/ -maxdepth 1 -name "*-de-*" -type d | rev | '
-                                  'cut -f 1 -d "/" | rev | xargs -r').split(' ') if i != '']
-            des =  [i for i in sudo('find /opt/ -maxdepth 2 -name "*-des-*" -type d | rev | '
-                                    'cut -f 1,2 -d "/" | rev | xargs -r').split(' ') if i != '']
+        de = [i for i in conn.sudo('''bash -l -c 'find /opt/ -maxdepth 1 -name "*-de-*" -type d | rev | cut -f 1 -d "/" | rev | xargs -r' ''').stdout.replace('\n', '').split(' ') if i != '']
+        des =  [i for i in conn.sudo('''bash -l -c 'find /opt/ -maxdepth 2 -name "*-des-*" -type d | rev | cut -f 1,2 -d "/" | rev | xargs -r' ''').stdout.replace('\n', '').split(' ') if i != '']
         return (de, des)
-    except:
+    except Exception as err:
+        print('Failed to find cluster kernels.', str(err))
         sys.exit(1)
 
 
@@ -773,7 +996,7 @@
         interpreters_config = '/opt/zeppelin/conf/interpreter.json'
         local_interpreters_config = '/tmp/interpreter.json'
         if interpreter_mode != 'remote':
-            get(local_interpreters_config, local_interpreters_config)
+            conn.get(local_interpreters_config, local_interpreters_config)
         if multiple_clusters == 'true':
             groups = [{"class": "org.apache.zeppelin.livy.LivySparkInterpreter", "name": "spark"},
                       {"class": "org.apache.zeppelin.livy.LivyPySparkInterpreter", "name": "pyspark"},
@@ -805,13 +1028,13 @@
         if interpreter_mode != 'remote':
             with open(local_interpreters_config, 'w') as f:
                 f.write(json.dumps(data, indent=2))
-            put(local_interpreters_config, local_interpreters_config)
-            sudo('cp -f {0} {1}'.format(local_interpreters_config, interpreters_config))
-            sudo('systemctl restart zeppelin-notebook')
+            conn.put(local_interpreters_config, local_interpreters_config)
+            conn.sudo('cp -f {0} {1}'.format(local_interpreters_config, interpreters_config))
+            conn.sudo('systemctl restart zeppelin-notebook')
         else:
             with open(interpreters_config, 'w') as f:
                 f.write(json.dumps(data, indent=2))
-            local('sudo systemctl restart zeppelin-notebook')
+            subprocess.run('sudo systemctl restart zeppelin-notebook', shell=True, check=True)
     except Exception as err:
         print('Failed to update Zeppelin interpreters', str(err))
         sys.exit(1)
@@ -819,23 +1042,24 @@
 
 def update_hosts_file(os_user):
     try:
-        if not exists('/home/{}/.ensure_dir/hosts_file_updated'.format(os_user)):
-            sudo('sed -i "s/^127.0.0.1 localhost/127.0.0.1 localhost localhost.localdomain/g" /etc/hosts')
-            sudo('touch /home/{}/.ensure_dir/hosts_file_updated'.format(os_user))
+        if not exists(conn,'/home/{}/.ensure_dir/hosts_file_updated'.format(os_user)):
+            conn.sudo('sed -i "s/^127.0.0.1 localhost/127.0.0.1 localhost localhost.localdomain/g" /etc/hosts')
+            conn.sudo('touch /home/{}/.ensure_dir/hosts_file_updated'.format(os_user))
     except Exception as err:
+        traceback.print_exc()
         print('Failed to update hosts file', str(err))
         sys.exit(1)
 
 def ensure_docker_compose(os_user):
     try:
         configure_docker(os_user)
-        if not exists('/home/{}/.ensure_dir/docker_compose_ensured'.format(os_user)):
+        if not exists(conn,'/home/{}/.ensure_dir/docker_compose_ensured'.format(os_user)):
             docker_compose_version = "1.24.1"
-            sudo('curl -L https://github.com/docker/compose/releases/download/{}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose'.format(docker_compose_version))
-            sudo('chmod +x /usr/local/bin/docker-compose')
-            sudo('touch /home/{}/.ensure_dir/docker_compose_ensured'.format(os_user))
-        sudo('systemctl daemon-reload')
-        sudo('systemctl restart docker')
+            conn.sudo('curl -L https://github.com/docker/compose/releases/download/{}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose'.format(docker_compose_version))
+            conn.sudo('chmod +x /usr/local/bin/docker-compose')
+            conn.sudo('touch /home/{}/.ensure_dir/docker_compose_ensured'.format(os_user))
+        conn.sudo('systemctl daemon-reload')
+        conn.sudo('systemctl restart docker')
         return True
     except:
         return False
@@ -843,32 +1067,45 @@
 def configure_superset(os_user, keycloak_auth_server_url, keycloak_realm_name, keycloak_client_id, keycloak_client_secret, edge_instance_private_ip, edge_instance_public_ip, superset_name):
     print('Superset configuring')
     try:
-        if not exists('/home/{}/incubator-superset'.format(os_user)):
-            with cd('/home/{}'.format(os_user)):
-                sudo('wget https://github.com/apache/incubator-superset/archive/{}.tar.gz'.format(os.environ['notebook_superset_version']))
-                sudo('tar -xzf {}.tar.gz'.format(os.environ['notebook_superset_version']))
-                sudo('ln -sf incubator-superset-{} incubator-superset'.format(os.environ['notebook_superset_version']))
-        if not exists('/tmp/superset-notebook_installed'):
-            sudo('mkdir -p /opt/dlab/templates')
-            put('/root/templates', '/opt/dlab', use_sudo=True)
-            sudo('sed -i \'s/OS_USER/{}/g\' /opt/dlab/templates/.env'.format(os_user))
+        if not exists(conn,'/home/{}/incubator-superset'.format(os_user)):
+            conn.sudo('''bash -c 'cd /home/{} && wget https://github.com/apache/incubator-superset/archive/{}.tar.gz' '''.format(
+                    os_user, os.environ['notebook_superset_version']))
+            conn.sudo('''bash -c 'cd /home/{} && tar -xzf {}.tar.gz' '''.format(os_user, os.environ['notebook_superset_version']))
+            conn.sudo('''bash -c 'cd /home/{} && ln -sf incubator-superset-{} incubator-superset' '''.format(os_user, os.environ['notebook_superset_version']))
+        if not exists(conn,'/tmp/superset-notebook_installed'):
+            conn.sudo('mkdir -p /opt/datalab/templates')
+            conn.local('cd  /root/templates; tar -zcvf /tmp/templates.tar.gz *')
+            conn.put('/tmp/templates.tar.gz', '/tmp/templates.tar.gz')
+            conn.sudo('tar -zxvf /tmp/templates.tar.gz -C /opt/datalab/templates')
+            conn.sudo('sed -i \'s/OS_USER/{}/g\' /opt/datalab/templates/.env'.format(os_user))
             proxy_string = '{}:3128'.format(edge_instance_private_ip)
-            sudo('sed -i \'s|KEYCLOAK_AUTH_SERVER_URL|{}|g\' /opt/dlab/templates/id_provider.json'.format(keycloak_auth_server_url))
-            sudo('sed -i \'s/KEYCLOAK_REALM_NAME/{}/g\' /opt/dlab/templates/id_provider.json'.format(keycloak_realm_name))
-            sudo('sed -i \'s/CLIENT_ID/{}/g\' /opt/dlab/templates/id_provider.json'.format(keycloak_client_id))
-            sudo('sed -i \'s/CLIENT_SECRET/{}/g\' /opt/dlab/templates/id_provider.json'.format(keycloak_client_secret))
-            sudo('sed -i \'s/PROXY_STRING/{}/g\' /opt/dlab/templates/docker-compose.yml'.format(proxy_string))
-            sudo('sed -i \'s|KEYCLOAK_AUTH_SERVER_URL|{}|g\' /opt/dlab/templates/superset_config.py'.format(keycloak_auth_server_url))
-            sudo('sed -i \'s/KEYCLOAK_REALM_NAME/{}/g\' /opt/dlab/templates/superset_config.py'.format(keycloak_realm_name))
-            sudo('sed -i \'s/EDGE_IP/{}/g\' /opt/dlab/templates/superset_config.py'.format(edge_instance_public_ip))
-            sudo('sed -i \'s/SUPERSET_NAME/{}/g\' /opt/dlab/templates/superset_config.py'.format(superset_name))
-            sudo('cp -f /opt/dlab/templates/.env /home/{}/incubator-superset/contrib/docker/'.format(os_user))
-            sudo('cp -f /opt/dlab/templates/docker-compose.yml /home/{}/incubator-superset/contrib/docker/'.format(os_user))
-            sudo('cp -f /opt/dlab/templates/id_provider.json /home/{}/incubator-superset/contrib/docker/'.format(os_user))
-            sudo('cp -f /opt/dlab/templates/requirements-extra.txt /home/{}/incubator-superset/contrib/docker/'.format(os_user))
-            sudo('cp -f /opt/dlab/templates/superset_config.py /home/{}/incubator-superset/contrib/docker/'.format(os_user))
-            sudo('cp -f /opt/dlab/templates/docker-init.sh /home/{}/incubator-superset/contrib/docker/'.format(os_user))
-            sudo('touch /tmp/superset-notebook_installed')
+            conn.sudo('sed -i \'s|KEYCLOAK_AUTH_SERVER_URL|{}|g\' /opt/datalab/templates/id_provider.json'.format(
+                keycloak_auth_server_url))
+            conn.sudo('sed -i \'s/KEYCLOAK_REALM_NAME/{}/g\' /opt/datalab/templates/id_provider.json'.format(
+                keycloak_realm_name))
+            conn.sudo('sed -i \'s/CLIENT_ID/{}/g\' /opt/datalab/templates/id_provider.json'.format(keycloak_client_id))
+            conn.sudo('sed -i \'s/CLIENT_SECRET/{}/g\' /opt/datalab/templates/id_provider.json'.format(
+                keycloak_client_secret))
+            conn.sudo('sed -i \'s/PROXY_STRING/{}/g\' /opt/datalab/templates/docker-compose.yml'.format(proxy_string))
+            conn.sudo('sed -i \'s|KEYCLOAK_AUTH_SERVER_URL|{}|g\' /opt/datalab/templates/superset_config.py'.format(
+                keycloak_auth_server_url))
+            conn.sudo('sed -i \'s/KEYCLOAK_REALM_NAME/{}/g\' /opt/datalab/templates/superset_config.py'.format(
+                keycloak_realm_name))
+            conn.sudo('sed -i \'s/EDGE_IP/{}/g\' /opt/datalab/templates/superset_config.py'.format(edge_instance_public_ip))
+            conn.sudo('sed -i \'s/SUPERSET_NAME/{}/g\' /opt/datalab/templates/superset_config.py'.format(superset_name))
+            conn.sudo('cp -f /opt/datalab/templates/.env /home/{}/incubator-superset/contrib/docker/'.format(os_user))
+            conn.sudo('cp -f /opt/datalab/templates/docker-compose.yml /home/{}/incubator-superset/contrib/docker/'.format(
+                os_user))
+            conn.sudo('cp -f /opt/datalab/templates/id_provider.json /home/{}/incubator-superset/contrib/docker/'.format(
+                os_user))
+            conn.sudo(
+                'cp -f /opt/datalab/templates/requirements-extra.txt /home/{}/incubator-superset/contrib/docker/'.format(
+                    os_user))
+            conn.sudo('cp -f /opt/datalab/templates/superset_config.py /home/{}/incubator-superset/contrib/docker/'.format(
+                os_user))
+            conn.sudo('cp -f /opt/datalab/templates/docker-init.sh /home/{}/incubator-superset/contrib/docker/'.format(
+                os_user))
+            conn.sudo('touch /tmp/superset-notebook_installed')
     except Exception as err:
         print("Failed configure superset: " + str(err))
         sys.exit(1)
@@ -885,13 +1122,33 @@
             else:
                 try:
                     if npm_count % 2 == 0:
-                        sudo('npm config set registry {}'.format(npm_registry[0]))
+                        conn.sudo('npm config set registry {}'.format(npm_registry[0]))
                     else:
-                        sudo('npm config set registry {}'.format(npm_registry[1]))
-                    sudo('npm {}'.format(command))
+                        conn.sudo('npm config set registry {}'.format(npm_registry[1]))
+                    conn.sudo('{}'.format(command))
                     installed = True
                 except:
                     npm_count += 1
                     time.sleep(50)
     except:
+        sys.exit(1)
+
+def init_datalab_connection(hostname, username, keyfile):
+    try:
+        global conn
+        attempt = 0
+        while attempt < 15:
+            print('connection attempt {}'.format(attempt))
+            conn = Connection(host = hostname, user = username, connect_kwargs={'banner_timeout': 200,
+                                                                                'key_filename': keyfile})
+            conn.config.run.echo = True
+            try:
+                conn.run('ls')
+                conn.config.run.echo = True
+                return conn
+            except:
+                attempt += 1
+                time.sleep(10)
+    except:
+        traceback.print_exc()
         sys.exit(1)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/lib/os/redhat/common_lib.py b/infrastructure-provisioning/src/general/lib/os/redhat/common_lib.py
index ea5d4f2..6b432fd 100644
--- a/infrastructure-provisioning/src/general/lib/os/redhat/common_lib.py
+++ b/infrastructure-provisioning/src/general/lib/os/redhat/common_lib.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,10 +21,13 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 import sys
 import os
+import subprocess
+import datalab.fab
 
 def manage_pkg(command, environment, requisites):
     try:
@@ -37,19 +40,19 @@
             else:
                 print('Package manager is:')
                 if environment == 'remote':
-                    if sudo('pgrep yum -a && echo "busy" || echo "ready"') == 'busy':
+                    if datalab.fab.conn.sudo('pgrep yum -a && echo "busy" || echo "ready"') == 'busy':
                         counter += 1
                         time.sleep(10)
                     else:
                         allow = True
-                        sudo('yum {0} {1}'.format(command, requisites))
+                        datalab.fab.conn.sudo('yum {0} {1}'.format(command, requisites))
                 elif environment == 'local':
-                    if local('sudo pgrep yum -a && echo "busy" || echo "ready"', capture=True) == 'busy':
+                    if subprocess.run('sudo pgrep yum -a && echo "busy" || echo "ready"', capture_output=True, shell=True, check=True) == 'busy':
                         counter += 1
                         time.sleep(10)
                     else:
                         allow = True
-                        local('sudo yum {0} {1}'.format(command, requisites), capture=True)
+                        subprocess.run('sudo yum {0} {1}'.format(command, requisites), capture_output=True, shell=True, check=True)
                 else:
                     print('Wrong environment')
     except:
@@ -57,86 +60,111 @@
 
 def ensure_pkg(user, requisites='git vim gcc python-devel openssl-devel nmap libffi libffi-devel unzip libxml2-devel'):
     try:
-        if not exists('/home/{}/.ensure_dir/pkg_upgraded'.format(user)):
+        if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/pkg_upgraded'.format(user)):
             print("Updating repositories and installing requested tools: {}".format(requisites))
-            if sudo("systemctl list-units  --all | grep firewalld | awk '{print $1}'") != '':
-                sudo('systemctl disable firewalld.service')
-                sudo('systemctl stop firewalld.service')
-            sudo('setenforce 0')
-            sudo("sed -i '/^SELINUX=/s/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config")
+            if datalab.fab.conn.sudo("systemctl list-units  --all | grep firewalld | awk '{print $1}'") != '':
+                datalab.fab.conn.sudo('systemctl disable firewalld.service')
+                datalab.fab.conn.sudo('systemctl stop firewalld.service')
+            datalab.fab.conn.sudo('setenforce 0')
+            datalab.fab.conn.sudo("sed -i '/^SELINUX=/s/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config")
             mirror = 'mirror.centos.org'
-            with cd('/etc/yum.repos.d/'):
-                sudo('echo "[Centos-repo]" > centOS-base.repo')
-                sudo('echo "name=Centos 7 Repository" >> centOS-base.repo')
-                sudo('echo "baseurl=http://{}/centos/7/os/x86_64/" >> centOS-base.repo'.format(mirror))
-                sudo('echo "enabled=1" >> centOS-base.repo')
-                sudo('echo "gpgcheck=1" >> centOS-base.repo')
-                sudo('echo "gpgkey=http://{}/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7" >> centOS-base.repo'.format(mirror))
-            sudo('yum-config-manager --enable rhui-REGION-rhel-server-optional')
+            datalab.fab.conn.sudo('echo "[Centos-repo]" > /etc/yum.repos.d/centOS-base.repo')
+            datalab.fab.conn.sudo('echo "name=Centos 7 Repository" >> /etc/yum.repos.d/centOS-base.repo')
+            datalab.fab.conn.sudo('echo "baseurl=http://{}/centos/7/os/x86_64/" >> /etc/yum.repos.d/centOS-base.repo'.format(mirror))
+            datalab.fab.conn.sudo('echo "enabled=1" >> /etc/yum.repos.d/centOS-base.repo')
+            datalab.fab.conn.sudo('echo "gpgcheck=1" >> /etc/yum.repos.d/centOS-base.repo')
+            datalab.fab.conn.sudo('echo "gpgkey=http://{}/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7" >> /etc/yum.repos.d/centOS-base.repo'.format(mirror))
+            datalab.fab.conn.sudo('yum-config-manager --enable rhui-REGION-rhel-server-optional')
             manage_pkg('update-minimal --security -y', 'remote', '')
             manage_pkg('-y install', 'remote', 'wget')
-            sudo('wget --no-check-certificate https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm')
-            sudo('rpm -ivh epel-release-latest-7.noarch.rpm')
+            datalab.fab.conn.sudo('wget --no-check-certificate https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm')
+            datalab.fab.conn.sudo('rpm -ivh epel-release-latest-7.noarch.rpm')
             manage_pkg('repolist', 'remote', '')
-            manage_pkg('-y install', 'remote', 'python-pip gcc')
-            sudo('rm -f epel-release-latest-7.noarch.rpm')
-            sudo('export LC_ALL=C')
+            manage_pkg('-y install', 'remote', 'python3-pip gcc')
+            datalab.fab.conn.sudo('rm -f epel-release-latest-7.noarch.rpm')
+            datalab.fab.conn.sudo('export LC_ALL=C')
             manage_pkg('-y install', 'remote', requisites)
-            sudo('touch /home/{}/.ensure_dir/pkg_upgraded'.format(user))
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/pkg_upgraded'.format(user))
     except:
         sys.exit(1)
 
 
 def change_pkg_repos():
-    if not exists('/tmp/pkg_china_ensured'):
-        put('/root/files/sources.list', '/tmp/sources.list')
-        sudo('mv /tmp/sources.list  /etc/yum.repos.d/CentOS-Base-aliyun.repo')
-        sudo('touch /tmp/pkg_china_ensured')
+    if not exists(datalab.fab.conn,'/tmp/pkg_china_ensured'):
+        datalab.fab.conn.put('/root/files/sources.list', '/tmp/sources.list')
+        datalab.fab.conn.sudo('mv /tmp/sources.list  /etc/yum.repos.d/CentOS-Base-aliyun.repo')
+        datalab.fab.conn.sudo('touch /tmp/pkg_china_ensured')
 
 
 def find_java_path_remote():
-    java_path = sudo("alternatives --display java | grep 'slave jre: ' | awk '{print $3}'")
+    java_path = datalab.fab.conn.sudo("alternatives --display java | grep 'slave jre: ' | awk '{print $3}'").stdout.replace('\n','')
     return java_path
 
 
 def find_java_path_local():
-    java_path = local("alternatives --display java | grep 'slave jre: ' | awk '{print $3}'", capture=True)
+    java_path = subprocess.run("alternatives --display java | grep 'slave jre: ' | awk '{print $3}'", capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
     return java_path
 
 
 def ensure_ntpd(user, edge_private_ip=''):
     try:
-        if not exists('/home/{}/.ensure_dir/ntpd_ensured'.format(user)):
-            sudo('systemctl disable chronyd')
+        if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/ntpd_ensured'.format(user)):
+            datalab.fab.conn.sudo('systemctl disable chronyd')
             manage_pkg('-y install', 'remote', 'ntp')
-            sudo('echo "tinker panic 0" >> /etc/ntp.conf')
-            sudo('systemctl start ntpd')
+            datalab.fab.conn.sudo('echo "tinker panic 0" >> /etc/ntp.conf')
+            datalab.fab.conn.sudo('systemctl start ntpd')
             if os.environ['conf_resource'] != 'ssn' and os.environ['conf_resource'] != 'edge':
-                sudo('echo "server {} prefer iburst" >> /etc/ntp.conf'.format(edge_private_ip))
-                sudo('systemctl restart ntpd')
-            sudo('systemctl enable ntpd')
-            sudo('touch /home/{}/.ensure_dir/ntpd_ensured'.format(user))
+                datalab.fab.conn.sudo('echo "server {} prefer iburst" >> /etc/ntp.conf'.format(edge_private_ip))
+                datalab.fab.conn.sudo('systemctl restart ntpd')
+            datalab.fab.conn.sudo('systemctl enable ntpd')
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/ntpd_ensured'.format(user))
     except:
         sys.exit(1)
 
 
 def ensure_java(user):
     try:
-        if not exists('/home/{}/.ensure_dir/java_ensured'.format(user)):
+        if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/java_ensured'.format(user)):
             manage_pkg('-y install', 'remote', 'java-1.8.0-openjdk-devel')
-            sudo('touch /home/{}/.ensure_dir/java_ensured'.format(user))
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/java_ensured'.format(user))
     except:
         sys.exit(1)
 
 
 def ensure_step(user):
     try:
-        if not exists('/home/{}/.ensure_dir/step_ensured'.format(user)):
+        if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/step_ensured'.format(user)):
             manage_pkg('-y install', 'remote', 'wget')
-            sudo('wget https://github.com/smallstep/cli/releases/download/v0.13.3/step_0.13.3_linux_amd64.tar.gz '
+            datalab.fab.conn.sudo('wget https://github.com/smallstep/cli/releases/download/v0.13.3/step_0.13.3_linux_amd64.tar.gz '
                  '-O /tmp/step_0.13.3_linux_amd64.tar.gz')
-            sudo('tar zxvf /tmp/step_0.13.3_linux_amd64.tar.gz -C /tmp/')
-            sudo('mv /tmp/step_0.13.3/bin/step /usr/bin/')
-            sudo('touch /home/{}/.ensure_dir/step_ensured'.format(user))
+            datalab.fab.conn.sudo('tar zxvf /tmp/step_0.13.3_linux_amd64.tar.gz -C /tmp/')
+            datalab.fab.conn.sudo('mv /tmp/step_0.13.3/bin/step /usr/bin/')
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/step_ensured'.format(user))
     except:
         sys.exit(1)
+
+def install_certbot(os_family):
+    try:
+        print('Installing Certbot')
+        print('Redhat is not supported yet. Skipping....')
+    except Exception as err:
+        traceback.print_exc()
+        print('Failed Certbot install: ' + str(err))
+        sys.exit(1)
+
+def run_certbot(domain_name, email=''):
+    try:
+        print('Running  Certbot')
+        print('Redhat is not supported yet. Skipping....')
+    except Exception as err:
+        traceback.print_exc()
+        print('Failed to run Certbot: ' + str(err))
+        sys.exit(1)
+
+def configure_nginx_LE(domain_name):
+    try:
+        print('Redhat is not supported yet. Skipping....')
+    except Exception as err:
+        traceback.print_exc()
+        print('Failed to run Certbot: ' + str(err))
+        sys.exit(1)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/lib/os/redhat/edge_lib.py b/infrastructure-provisioning/src/general/lib/os/redhat/edge_lib.py
index 8dde808..ae81a2b 100644
--- a/infrastructure-provisioning/src/general/lib/os/redhat/edge_lib.py
+++ b/infrastructure-provisioning/src/general/lib/os/redhat/edge_lib.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -23,37 +23,38 @@
 
 import os
 import sys
-from fabric.api import *
-from fabric.contrib.files import exists
-from dlab.common_lib import manage_pkg
+from datalab.common_lib import manage_pkg
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 
 def configure_http_proxy_server(config):
     try:
-        if not exists('/tmp/http_proxy_ensured'):
+        if not exists(conn,'/tmp/http_proxy_ensured'):
             manage_pkg('-y install', 'remote', 'squid')
             template_file = config['template_file']
             proxy_subnet = config['exploratory_subnet']
-            put(template_file, '/tmp/squid.conf')
-            sudo('\cp /tmp/squid.conf /etc/squid/squid.conf')
-            sudo('sed -i "s|PROXY_SUBNET|{}|g" /etc/squid/squid.conf'.format(proxy_subnet))
-            sudo('sed -i "s|EDGE_USER_NAME|{}|g" /etc/squid/squid.conf'.format(config['project_name']))
-            sudo('sed -i "s|LDAP_HOST|{}|g" /etc/squid/squid.conf'.format(config['ldap_host']))
-            sudo('sed -i "s|LDAP_DN|{}|g" /etc/squid/squid.conf'.format(config['ldap_dn']))
-            sudo('sed -i "s|LDAP_SERVICE_USERNAME|{}|g" /etc/squid/squid.conf'.format(config['ldap_user']))
-            sudo('sed -i "s|LDAP_SERVICE_PASSWORD|{}|g" /etc/squid/squid.conf'.format(config['ldap_password']))
-            sudo('sed -i "s|LDAP_AUTH_PATH|{}|g" /etc/squid/squid.conf'.format('/usr/lib64/squid/basic_ldap_auth'))
+            conn.put(template_file, '/tmp/squid.conf')
+            conn.sudo('\cp /tmp/squid.conf /etc/squid/squid.conf')
+            conn.sudo('sed -i "s|PROXY_SUBNET|{}|g" /etc/squid/squid.conf'.format(proxy_subnet))
+            conn.sudo('sed -i "s|EDGE_USER_NAME|{}|g" /etc/squid/squid.conf'.format(config['project_name']))
+            conn.sudo('sed -i "s|LDAP_HOST|{}|g" /etc/squid/squid.conf'.format(config['ldap_host']))
+            conn.sudo('sed -i "s|LDAP_DN|{}|g" /etc/squid/squid.conf'.format(config['ldap_dn']))
+            conn.sudo('sed -i "s|LDAP_SERVICE_USERNAME|{}|g" /etc/squid/squid.conf'.format(config['ldap_user']))
+            conn.sudo('sed -i "s|LDAP_SERVICE_PASSWORD|{}|g" /etc/squid/squid.conf'.format(config['ldap_password']))
+            conn.sudo('sed -i "s|LDAP_AUTH_PATH|{}|g" /etc/squid/squid.conf'.format('/usr/lib64/squid/basic_ldap_auth'))
             replace_string = ''
             for cidr in config['vpc_cidrs']:
                 replace_string += 'acl AWS_VPC_CIDR dst {}\\n'.format(cidr)
-            sudo('sed -i "s|VPC_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
+            conn.sudo('sed -i "s|VPC_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
             replace_string = ''
             for cidr in config['allowed_ip_cidr']:
                 replace_string += 'acl AllowedCIDRS src {}\\n'.format(cidr)
-            sudo('sed -i "s|ALLOWED_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
-            sudo('systemctl restart squid')
-            sudo('chkconfig squid on')
-            sudo('touch /tmp/http_proxy_ensured')
+            conn.sudo('sed -i "s|ALLOWED_CIDRS|{}|g" /etc/squid/squid.conf'.format(replace_string))
+            conn.sudo('systemctl restart squid')
+            conn.sudo('chkconfig squid on')
+            conn.sudo('touch /tmp/http_proxy_ensured')
     except Exception as err:
         print("Failed to install and configure squid: " + str(err))
         sys.exit(1)
@@ -64,125 +65,133 @@
     try:
         if not os.path.exists('/tmp/nginx_installed'):
             manage_pkg('-y install', 'remote', 'wget')
-            sudo('wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm')
+            conn.sudo('wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm')
             try:
-                sudo('rpm -ivh epel-release-latest-7.noarch.rpm')
+                conn.sudo('rpm -ivh epel-release-latest-7.noarch.rpm')
             except:
                 print('Looks like EPEL is already installed.')
             manage_pkg('-y install', 'remote', 'gcc gcc-c++ make zlib-devel pcre-devel openssl-devel git openldap-devel')
             if os.environ['conf_stepcerts_enabled'] == 'true':
-                sudo('mkdir -p /home/{0}/keys'.format(user))
-                sudo('''bash -c 'echo "{0}" | base64 --decode > /etc/ssl/certs/root_ca.crt' '''.format(
+                conn.sudo('mkdir -p /home/{0}/keys'.format(user))
+                conn.sudo('''bash -c 'echo "{0}" | base64 --decode > /etc/ssl/certs/root_ca.crt' '''.format(
                      os.environ['conf_stepcerts_root_ca']))
-                fingerprint = sudo('step certificate fingerprint /etc/ssl/certs/root_ca.crt')
-                sudo('step ca bootstrap --fingerprint {0} --ca-url "{1}"'.format(fingerprint,
+                fingerprint = conn.sudo('step certificate fingerprint /etc/ssl/certs/root_ca.crt').stdout.replace('\n','')
+                conn.sudo('step ca bootstrap --fingerprint {0} --ca-url "{1}"'.format(fingerprint,
                                                                                  os.environ['conf_stepcerts_ca_url']))
-                sudo('echo "{0}" > /home/{1}/keys/provisioner_password'.format(
+                conn.sudo('echo "{0}" > /home/{1}/keys/provisioner_password'.format(
                      os.environ['conf_stepcerts_kid_password'], user))
                 sans = "--san localhost --san 127.0.0.1 {0}".format(step_cert_sans)
                 cn = edge_ip
-                sudo('step ca token {3} --kid {0} --ca-url "{1}" --root /etc/ssl/certs/root_ca.crt '
+                conn.sudo('step ca token {3} --kid {0} --ca-url "{1}" --root /etc/ssl/certs/root_ca.crt '
                      '--password-file /home/{2}/keys/provisioner_password {4} --output-file /tmp/step_token'.format(
-                      os.environ['conf_stepcerts_kid'], os.environ['conf_stepcerts_ca_url'], user, cn, sans))
-                token = sudo('cat /tmp/step_token')
-                sudo('step ca certificate "{0}" /etc/ssl/certs/dlab.crt /etc/ssl/certs/dlab.key '
+                    os.environ['conf_stepcerts_kid'], os.environ['conf_stepcerts_ca_url'], user, cn, sans))
+                token = conn.sudo('cat /tmp/step_token').stdout.replace('\n','')
+                conn.sudo('step ca certificate "{0}" /etc/ssl/certs/datalab.crt /etc/ssl/certs/datalab.key '
                      '--token "{1}" --kty=RSA --size 2048 --provisioner {2} '.format(cn, token,
                                                                                      os.environ['conf_stepcerts_kid']))
-                sudo('touch /var/log/renew_certificates.log')
-                put('/root/templates/manage_step_certs.sh', '/usr/local/bin/manage_step_certs.sh', use_sudo=True)
-                sudo('chmod +x /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_ROOT_CERT_PATH|/etc/ssl/certs/root_ca.crt|g" '
+                conn.sudo('touch /var/log/renew_certificates.log')
+                conn.put('/root/templates/manage_step_certs.sh', '/tmp/manage_step_certs.sh')
+                conn.sudo('cp /tmp/manage_step_certs.sh /usr/local/bin/manage_step_certs.sh')
+                conn.sudo('chmod +x /usr/local/bin/manage_step_certs.sh')
+                conn.sudo('sed -i "s|STEP_ROOT_CERT_PATH|/etc/ssl/certs/root_ca.crt|g" '
                      '/usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_CERT_PATH|/etc/ssl/certs/dlab.crt|g" /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_KEY_PATH|/etc/ssl/certs/dlab.key|g" /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_CA_URL|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
+                conn.sudo('sed -i "s|STEP_CERT_PATH|/etc/ssl/certs/datalab.crt|g" /usr/local/bin/manage_step_certs.sh')
+                conn.sudo('sed -i "s|STEP_KEY_PATH|/etc/ssl/certs/datalab.key|g" /usr/local/bin/manage_step_certs.sh')
+                conn.sudo('sed -i "s|STEP_CA_URL|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
                     os.environ['conf_stepcerts_ca_url']))
-                sudo('sed -i "s|RESOURCE_TYPE|edge|g" /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|SANS|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(sans))
-                sudo('sed -i "s|CN|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(cn))
-                sudo('sed -i "s|KID|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
+                conn.sudo('sed -i "s|RESOURCE_TYPE|edge|g" /usr/local/bin/manage_step_certs.sh')
+                conn.sudo('sed -i "s|SANS|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(sans))
+                conn.sudo('sed -i "s|CN|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(cn))
+                conn.sudo('sed -i "s|KID|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
                     os.environ['conf_stepcerts_kid']))
-                sudo('sed -i "s|STEP_PROVISIONER_PASSWORD_PATH|/home/{0}/keys/provisioner_password|g" '
+                conn.sudo('sed -i "s|STEP_PROVISIONER_PASSWORD_PATH|/home/{0}/keys/provisioner_password|g" '
                      '/usr/local/bin/manage_step_certs.sh'.format(user))
-                sudo('bash -c \'echo "0 * * * * root /usr/local/bin/manage_step_certs.sh >> '
+                conn.sudo('bash -c \'echo "0 * * * * root /usr/local/bin/manage_step_certs.sh >> '
                      '/var/log/renew_certificates.log 2>&1" >> /etc/crontab \'')
-                put('/root/templates/step-cert-manager.service', '/etc/systemd/system/step-cert-manager.service',
-                    use_sudo=True)
-                sudo('systemctl daemon-reload')
-                sudo('systemctl enable step-cert-manager.service')
+                conn.put('/root/templates/step-cert-manager.service', '/tmp/step-cert-manager.service')
+                conn.sudo('''bash -c 'cd -f /tmp/step-cert-manager.service /etc/systemd/system/step-cert-manager.service' ''')
+                conn.sudo('systemctl daemon-reload')
+                conn.sudo('systemctl enable step-cert-manager.service')
             else:
-                sudo('openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/dlab.key \
-                     -out /etc/ssl/certs/dlab.crt -subj "/C=US/ST=US/L=US/O=dlab/CN={}"'.format(hostname))
-            sudo('mkdir -p /tmp/lua')
-            sudo('mkdir -p /tmp/src')
-            with cd('/tmp/src/'):
-                sudo('wget http://nginx.org/download/nginx-{}.tar.gz'.format(nginx_version))
-                sudo('tar -xzf nginx-{}.tar.gz'.format(nginx_version))
+                if os.environ['conf_letsencrypt_enabled'] == 'true':
+                    print(
+                        'Lets Encrypt certificates are not supported for redhat in DataLab. Using self signed certificates')
+                conn.sudo('openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/datalab.key \
+                     -out /etc/ssl/certs/datalab.crt -subj "/C=US/ST=US/L=US/O=datalab/CN={}"'.format(hostname))
+            conn.sudo('mkdir -p /tmp/lua')
+            conn.sudo('mkdir -p /tmp/src')
 
-                sudo('wget https://github.com/openresty/lua-nginx-module/archive/v0.10.15.tar.gz')
-                sudo('tar -xzf v0.10.15.tar.gz')
+            conn.sudo('''bash -c 'cd /tmp/src/ && wget http://nginx.org/download/nginx-{}.tar.gz' '''.format(nginx_version))
+            conn.sudo('''bash -c 'cd /tmp/src/ && tar -xzf nginx-{}.tar.gz' '''.format(nginx_version))
 
-                sudo('wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1.tar.gz')
-                sudo('tar -xzf v0.3.1.tar.gz')
+            conn.sudo('''bash -c 'cd /tmp/src/ && wget https://github.com/openresty/lua-nginx-module/archive/v0.10.15.tar.gz' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/ && tar -xzf v0.10.15.tar.gz' ''')
 
-                sudo('wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz')
-                sudo('tar -xzf LuaJIT-2.0.5.tar.gz')
+            conn.sudo('''bash -c 'cd /tmp/src/ && wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1.tar.gz' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/ && tar -xzf v0.3.1.tar.gz' ''')
 
-                sudo('wget http://keplerproject.github.io/luarocks/releases/luarocks-2.2.2.tar.gz')
-                sudo('tar -xzf luarocks-2.2.2.tar.gz')
+            conn.sudo('''bash -c 'cd /tmp/src/ && wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/ && tar -xzf LuaJIT-2.0.5.tar.gz' ''')
 
-                sudo('ln -sf nginx-{} nginx'.format(nginx_version))
+            conn.sudo('''bash -c 'cd /tmp/src/ && wget http://keplerproject.github.io/luarocks/releases/luarocks-2.2.2.tar.gz' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/ && tar -xzf luarocks-2.2.2.tar.gz' ''')
 
-            with cd('/tmp/src/LuaJIT-2.0.5/'):
-                sudo('make')
-                sudo('make install')
+            conn.sudo('''bash -c 'cd /tmp/src/ && ln -sf nginx-{} nginx' '''.format(nginx_version))
 
-            with cd('/tmp/src/nginx/'), shell_env(LUAJIT_LIB='/usr/local/lib/', LUAJIT_INC='/usr/local/include/luajit-2.0'):
-                sudo('./configure --user=nginx --group=nginx --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx \
+            conn.sudo('''bash -c 'cd /tmp/src/LuaJIT-2.0.5/ && make' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/LuaJIT-2.0.5/ && make install' ''')
+
+            conn.sudo('export LUAJIT_LIB=/usr/local/lib/ LUAJIT_INC=/usr/local/include/luajit-2.0')
+            conn.sudo('''bash -l -c 'cd /tmp/src/nginx/ && ./configure --user=nginx --group=nginx --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx \
                                               --conf-path=/etc/nginx/nginx.conf --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx \
                                               --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log \
                                               --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --with-pcre \
                                               --with-http_realip_module --with-file-aio --with-ipv6 --with-http_v2_module --with-ld-opt="-Wl,-rpath,$LUAJIT_LIB"  \
                                               --without-http_scgi_module --without-http_uwsgi_module --without-http_fastcgi_module --with-http_sub_module \
-                                              --add-dynamic-module=/tmp/src/ngx_devel_kit-0.3.1 --add-dynamic-module=/tmp/src/lua-nginx-module-0.10.15')
-                sudo('make')
-                sudo('make install')
+                                              --add-dynamic-module=/tmp/src/ngx_devel_kit-0.3.1 --add-dynamic-module=/tmp/src/lua-nginx-module-0.10.15' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/nginx/ && make' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/nginx/ && make install' ''')
 
-            with cd('/tmp/src/luarocks-2.2.2/'):
-                sudo('./configure --with-lua-include=/usr/local/include/luajit-2.0')
-                sudo('make build')
-                sudo('make install')
-                sudo('luarocks install lua-resty-jwt')
-                sudo('luarocks install lua-resty-session')
-                sudo('luarocks install lua-resty-http')
-                sudo('luarocks install lua-resty-openidc')
-                sudo('luarocks install luacrypto')
-                sudo('luarocks install lua-cjson')
-                sudo('luarocks install lua-resty-core')
-                sudo('luarocks install random')
-                sudo('luarocks install lua-resty-string')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && ./configure --with-lua-include=/usr/local/include/luajit-2.0' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && make build' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && make install' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && luarocks install lua-resty-jwt' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && luarocks install lua-resty-session' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && luarocks install lua-resty-http' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && luarocks install lua-resty-openidc' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && luarocks install luacrypto' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && luarocks install lua-cjson' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && luarocks install lua-resty-core' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && luarocks install random' ''')
+            conn.sudo('''bash -c 'cd /tmp/src/luarocks-2.2.2/ && luarocks install lua-resty-string' ''')
 
-            sudo('useradd -r nginx')
-            sudo('rm -f /etc/nginx/nginx.conf')
-            sudo('mkdir -p /opt/dlab/templates')
-            put('/root/templates', '/opt/dlab', use_sudo=True)
-            sudo('sed -i \'s/EDGE_IP/{}/g\' /opt/dlab/templates/conf.d/proxy.conf'.format(edge_ip))
-            sudo('sed -i \'s|KEYCLOAK_AUTH_URL|{}|g\' /opt/dlab/templates/conf.d/proxy.conf'.format(keycloak_auth_server_url))
-            sudo('sed -i \'s/KEYCLOAK_REALM_NAME/{}/g\' /opt/dlab/templates/conf.d/proxy.conf'.format(keycloak_realm_name))
-            sudo('sed -i \'s/KEYCLOAK_CLIENT_ID/{}/g\' /opt/dlab/templates/conf.d/proxy.conf'.format(keycloak_client_id))
-            sudo('sed -i \'s/KEYCLOAK_CLIENT_SECRET/{}/g\' /opt/dlab/templates/conf.d/proxy.conf'.format(keycloak_client_secret))
+            conn.sudo('useradd -r nginx')
+            conn.sudo('rm -f /etc/nginx/nginx.conf')
+            conn.sudo('mkdir -p /opt/datalab/templates')
+            conn.local('cd  /root/templates; tar -zcvf /tmp/templates.tar.gz *')
+            conn.put('/tmp/templates.tar.gz', '/tmp/templates.tar.gz')
+            conn.sudo('tar -zxvf /tmp/templates.tar.gz -C /opt/datalab/templates/')
+            conn.sudo('sed -i \'s/EDGE_IP/{}/g\' /opt/datalab/templates/conf.d/proxy.conf'.format(edge_ip))
+            conn.sudo('sed -i \'s|KEYCLOAK_AUTH_URL|{}|g\' /opt/datalab/templates/conf.d/proxy.conf'.format(
+                keycloak_auth_server_url))
+            conn.sudo('sed -i \'s/KEYCLOAK_REALM_NAME/{}/g\' /opt/datalab/templates/conf.d/proxy.conf'.format(
+                keycloak_realm_name))
+            conn.sudo('sed -i \'s/KEYCLOAK_CLIENT_ID/{}/g\' /opt/datalab/templates/conf.d/proxy.conf'.format(
+                keycloak_client_id))
+            conn.sudo('sed -i \'s/KEYCLOAK_CLIENT_SECRET/{}/g\' /opt/datalab/templates/conf.d/proxy.conf'.format(
+                keycloak_client_secret))
 
-            sudo('cp /opt/dlab/templates/nginx.conf /etc/nginx/')
-            sudo('mkdir /etc/nginx/conf.d')
-            sudo('cp /opt/dlab/templates/conf.d/proxy.conf /etc/nginx/conf.d/')
-            sudo('mkdir /etc/nginx/locations')
-            sudo('cp /opt/dlab/templates/nginx_redhat /etc/init.d/nginx')
-            sudo('chmod +x /etc/init.d/nginx')
-            sudo('chkconfig --add nginx')
-            sudo('chkconfig --level 345 nginx on')
-            sudo('setsebool -P httpd_can_network_connect 1')
-            sudo('service nginx start')
-            sudo('touch /tmp/nginx_installed')
+            conn.sudo('cp /opt/datalab/templates/nginx.conf /etc/nginx/')
+            conn.sudo('mkdir /etc/nginx/conf.d')
+            conn.sudo('cp /opt/datalab/templates/conf.d/proxy.conf /etc/nginx/conf.d/')
+            conn.sudo('mkdir /etc/nginx/locations')
+            conn.sudo('cp /opt/datalab/templates/nginx_redhat /etc/init.d/nginx')
+            conn.sudo('chmod +x /etc/init.d/nginx')
+            conn.sudo('chkconfig --add nginx')
+            conn.sudo('chkconfig --level 345 nginx on')
+            conn.sudo('setsebool -P httpd_can_network_connect 1')
+            conn.sudo('service nginx start')
+            conn.sudo('touch /tmp/nginx_installed')
     except Exception as err:
         print("Failed install nginx with ldap: " + str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/lib/os/redhat/notebook_lib.py b/infrastructure-provisioning/src/general/lib/os/redhat/notebook_lib.py
index 34bae34..f90df73 100644
--- a/infrastructure-provisioning/src/general/lib/os/redhat/notebook_lib.py
+++ b/infrastructure-provisioning/src/general/lib/os/redhat/notebook_lib.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,29 +21,29 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
-import argparse
 import json
-import random
-import string
+import os
 import sys
-from dlab.notebook_lib import *
-from dlab.fab import *
-import os, time
-from dlab.common_lib import manage_pkg
+import time
+from datalab.common_lib import manage_pkg
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 
 def enable_proxy(proxy_host, proxy_port):
     try:
         proxy_string = "http://%s:%s" % (proxy_host, proxy_port)
-        sudo('sed -i "/^export http_proxy/d" /etc/profile')
-        sudo('sed -i "/^export https_proxy/d" /etc/profile')
-        sudo('echo export http_proxy=' + proxy_string + ' >> /etc/profile')
-        sudo('echo export https_proxy=' + proxy_string + ' >> /etc/profile')
-        if exists('/etc/yum.conf'):
-            sudo('sed -i "/^proxy=/d" /etc/yum.conf')
-        sudo("echo 'proxy={}' >> /etc/yum.conf".format(proxy_string))
+        proxy_https_string = "https://%s:%s" % (proxy_host, proxy_port)
+        datalab.fab.conn.sudo('sed -i "/^export http_proxy/d" /etc/profile')
+        datalab.fab.conn.sudo('sed -i "/^export https_proxy/d" /etc/profile')
+        datalab.fab.conn.sudo('bash -c "echo export http_proxy=' + proxy_string + ' >> /etc/profile"')
+        datalab.fab.conn.sudo('bash -c "echo export https_proxy=' + proxy_string + ' >> /etc/profile"')
+        if exists(datalab.fab.conn, '/etc/yum.conf'):
+            datalab.fab.conn.sudo('sed -i "/^proxy=/d" /etc/yum.conf')
+        datalab.fab.conn.sudo('''bash -c "echo 'proxy={}' >> /etc/yum.conf" '''.format(proxy_string))
         manage_pkg('clean all', 'remote', '')
     except:
         sys.exit(1)
@@ -51,7 +51,7 @@
 
 def downgrade_python_version():
     try:
-       sudo('python -c "import os,sys,yum; yb = yum.YumBase(); pl = yb.doPackageLists(); \
+       datalab.fab.conn.sudo('python3 -c "import os,sys,yum; yb = yum.YumBase(); pl = yb.doPackageLists(); \
         version = [pkg.vr for pkg in pl.installed if pkg.name == \'python\']; \
         os.system(\'yum -y downgrade python python-devel-2.7.5-58.el7.x86_64 python-libs-2.7.5-58.el7.x86_64\') \
         if version != [] and version[0] == \'2.7.5-68.el7\' else False"')
@@ -60,30 +60,30 @@
 
 
 def ensure_r_local_kernel(spark_version, os_user, templates_dir, kernels_dir):
-    if not exists('/home/{}/.ensure_dir/r_kernel_ensured'.format(os_user)):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/r_kernel_ensured'.format(os_user)):
         try:
-            sudo('chown -R ' + os_user + ':' + os_user + ' /home/' + os_user + '/.local')
-            run('R -e "IRkernel::installspec()"')
-            sudo('ln -s /opt/spark/ /usr/local/spark')
+            datalab.fab.conn.sudo('chown -R ' + os_user + ':' + os_user + ' /home/' + os_user + '/.local')
+            datalab.fab.conn.run('R -e "IRkernel::installspec()"')
+            datalab.fab.conn.sudo('ln -s /opt/spark/ /usr/local/spark')
             try:
-                sudo('cd /usr/local/spark/R/lib/SparkR; R -e "install.packages(\'roxygen2\',repos=\'https://cloud.r-project.org\')" R -e "devtools::check(\'.\')"')
+                datalab.fab.conn.sudo('''bash -c 'cd /usr/local/spark/R/lib/SparkR; R -e "install.packages(\'roxygen2\',repos=\'https://cloud.r-project.org\')" R -e "devtools::check(\'.\')"' ''')
             except:
                 pass
-            sudo('cd /usr/local/spark/R/lib/SparkR; R -e "devtools::install(\'.\')"')
-            r_version = sudo("R --version | awk '/version / {print $3}'")
-            put(templates_dir + 'r_template.json', '/tmp/r_template.json')
-            sudo('sed -i "s|R_VER|' + r_version + '|g" /tmp/r_template.json')
-            sudo('sed -i "s|SP_VER|' + spark_version + '|g" /tmp/r_template.json')
-            sudo('\cp -f /tmp/r_template.json {}/ir/kernel.json'.format(kernels_dir))
-            sudo('ln -s /usr/lib64/R/ /usr/lib/R')
-            sudo('chown -R ' + os_user + ':' + os_user + ' /home/' + os_user + '/.local')
-            sudo('touch /home/{}/.ensure_dir/r_kernel_ensured'.format(os_user))
+            datalab.fab.conn.sudo('''bash -c 'cd /usr/local/spark/R/lib/SparkR; R -e "devtools::install(\'.\')"' ''')
+            r_version = datalab.fab.conn.sudo("R --version | awk '/version / {print $3}'").stdout.replace('\n','')
+            datalab.fab.conn.put(templates_dir + 'r_template.json', '/tmp/r_template.json')
+            datalab.fab.conn.sudo('sed -i "s|R_VER|' + r_version + '|g" /tmp/r_template.json')
+            datalab.fab.conn.sudo('sed -i "s|SP_VER|' + spark_version + '|g" /tmp/r_template.json')
+            datalab.fab.conn.sudo('\cp -f /tmp/r_template.json {}/ir/kernel.json'.format(kernels_dir))
+            datalab.fab.conn.sudo('ln -s /usr/lib64/R/ /usr/lib/R')
+            datalab.fab.conn.sudo('chown -R ' + os_user + ':' + os_user + ' /home/' + os_user + '/.local')
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/r_kernel_ensured'.format(os_user))
         except:
             sys.exit(1)
 
 
 def ensure_r(os_user, r_libs, region, r_mirror):
-    if not exists('/home/{}/.ensure_dir/r_ensured'.format(os_user)):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/r_ensured'.format(os_user)):
         try:
             if region == 'cn-north-1':
                 r_repository = r_mirror
@@ -91,167 +91,140 @@
                 r_repository = 'https://cloud.r-project.org'
             manage_pkg('-y install', 'remote', 'cmake')
             manage_pkg('-y install', 'remote', 'libcur*')
-            sudo('echo -e "[base]\nname=CentOS-7-Base\nbaseurl=http://buildlogs.centos.org/centos/7/os/x86_64-20140704-1/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7\npriority=1\nexclude=php mysql" >> /etc/yum.repos.d/CentOS-base.repo')
+            datalab.fab.conn.sudo('echo -e "[base]\nname=CentOS-7-Base\nbaseurl=http://buildlogs.centos.org/centos/7/os/x86_64-20140704-1/\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7\npriority=1\nexclude=php mysql" >> /etc/yum.repos.d/CentOS-base.repo')
             manage_pkg('-y install', 'remote', 'R R-core R-core-devel R-devel --nogpgcheck')
-            sudo('R CMD javareconf')
-            sudo('cd /root; git clone https://github.com/zeromq/zeromq4-x.git; cd zeromq4-x/; mkdir build; cd build; cmake ..; make install; ldconfig')
+            datalab.fab.conn.sudo('R CMD javareconf')
+            datalab.fab.conn.sudo('''bash -c 'cd /root; git clone https://github.com/zeromq/zeromq4-x.git; cd zeromq4-x/; mkdir build; cd build; cmake ..; make install; ldconfig' ''')
             for i in r_libs:
-                sudo('R -e "install.packages(\'{}\',repos=\'{}\')"'.format(i, r_repository))
-            sudo('R -e "library(\'devtools\');install.packages(repos=\'{}\',c(\'rzmq\',\'repr\',\'digest\',\'stringr\',\'RJSONIO\',\'functional\',\'plyr\'))"'.format(r_repository))
-            sudo('R -e "library(\'devtools\');install_github(\'IRkernel/repr\');install_github(\'IRkernel/IRdisplay\');install_github(\'IRkernel/IRkernel\');"')
-            sudo('R -e "library(\'devtools\');install_version(\'keras\', version = \'{}\', repos = \'{}\');"'.format(os.environ['notebook_keras_version'],r_repository))
-            sudo('R -e "install.packages(\'RJDBC\',repos=\'{}\',dep=TRUE)"'.format(r_repository))
-            sudo('touch /home/{}/.ensure_dir/r_ensured'.format(os_user))
+                datalab.fab.conn.sudo('R -e "install.packages(\'{}\',repos=\'{}\')"'.format(i, r_repository))
+            datalab.fab.conn.sudo('R -e "library(\'devtools\');install.packages(repos=\'{}\',c(\'rzmq\',\'repr\',\'digest\',\'stringr\',\'RJSONIO\',\'functional\',\'plyr\'))"'.format(r_repository))
+            datalab.fab.conn.sudo('R -e "library(\'devtools\');install_github(\'IRkernel/repr\');install_github(\'IRkernel/IRdisplay\');install_github(\'IRkernel/IRkernel\');"')
+            datalab.fab.conn.sudo('R -e "library(\'devtools\');install_version(\'keras\', version = \'{}\', repos = \'{}\');"'.format(os.environ['notebook_keras_version'],r_repository))
+            datalab.fab.conn.sudo('R -e "install.packages(\'RJDBC\',repos=\'{}\',dep=TRUE)"'.format(r_repository))
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/r_ensured'.format(os_user))
         except:
             sys.exit(1)
 
 
 def install_rstudio(os_user, local_spark_path, rstudio_pass, rstudio_version):
-    if not exists('/home/' + os_user + '/.ensure_dir/rstudio_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/rstudio_ensured'):
         try:
             manage_pkg('-y install --nogpgcheck', 'remote', 'https://download2.rstudio.org/server/centos6/x86_64/rstudio-server-rhel-{}-x86_64.rpm'.format(rstudio_version))
-            sudo('mkdir -p /mnt/var')
-            sudo('chown {0}:{0} /mnt/var'.format(os_user))
-            sudo("sed -i '/Type=forking/a \Environment=USER=dlab-user' /etc/systemd/system/rstudio-server.service")
-            sudo("sed -i '/ExecStart/s|=/usr/lib/rstudio-server/bin/rserver|=/bin/bash -c \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64; /usr/lib/rstudio-server/bin/rserver --auth-none 1|g' /etc/systemd/system/rstudio-server.service")
-            sudo("sed -i '/ExecStart/s|$|\"|g' /etc/systemd/system/rstudio-server.service")
-            sudo("systemctl daemon-reload")
-            sudo('touch /home/{}/.Renviron'.format(os_user))
-            sudo('chown {0}:{0} /home/{0}/.Renviron'.format(os_user))
-            sudo('''echo 'SPARK_HOME="{0}"' >> /home/{1}/.Renviron'''.format(local_spark_path, os_user))
-            sudo('touch /home/{}/.Rprofile'.format(os_user))
-            sudo('chown {0}:{0} /home/{0}/.Rprofile'.format(os_user))
-            sudo('''echo 'library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))' >> /home/{}/.Rprofile'''.format(os_user))
-            http_proxy = run('echo $http_proxy')
-            https_proxy = run('echo $https_proxy')
-            sudo('''echo 'Sys.setenv(http_proxy = \"{}\")' >> /home/{}/.Rprofile'''.format(http_proxy, os_user))
-            sudo('''echo 'Sys.setenv(https_proxy = \"{}\")' >> /home/{}/.Rprofile'''.format(https_proxy, os_user))
-            sudo('rstudio-server start')
-            sudo('echo "{0}:{1}" | chpasswd'.format(os_user, rstudio_pass))
-            sudo("sed -i '/exit 0/d' /etc/rc.local")
-            sudo('''bash -c "echo \'sed -i 's/^#SPARK_HOME/SPARK_HOME/' /home/{}/.Renviron\' >> /etc/rc.local"'''.format(os_user))
-            sudo("bash -c 'echo exit 0 >> /etc/rc.local'")
-            sudo('touch /home/{}/.ensure_dir/rstudio_ensured'.format(os_user))
+            datalab.fab.conn.sudo('mkdir -p /mnt/var')
+            datalab.fab.conn.sudo('chown {0}:{0} /mnt/var'.format(os_user))
+            datalab.fab.conn.sudo("sed -i '/Type=forking/a \Environment=USER=datalab-user' /lib/systemd/system/rstudio-server.service")
+            datalab.fab.conn.sudo(
+                "sed -i '/ExecStart/s|=/usr/lib/rstudio-server/bin/rserver|=/bin/bash -c \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64; /usr/lib/rstudio-server/bin/rserver --auth-none 1|g' /lib/systemd/system/rstudio-server.service")
+            datalab.fab.conn.sudo("sed -i '/ExecStart/s|$|\"|g' /lib/systemd/system/rstudio-server.service")
+            datalab.fab.conn.sudo("systemctl daemon-reload")
+            datalab.fab.conn.sudo('touch /home/{}/.Renviron'.format(os_user))
+            datalab.fab.conn.sudo('chown {0}:{0} /home/{0}/.Renviron'.format(os_user))
+            datalab.fab.conn.sudo('''echo 'SPARK_HOME="{0}"' >> /home/{1}/.Renviron'''.format(local_spark_path, os_user))
+            datalab.fab.conn.sudo('touch /home/{}/.Rprofile'.format(os_user))
+            datalab.fab.conn.sudo('chown {0}:{0} /home/{0}/.Rprofile'.format(os_user))
+            datalab.fab.conn.sudo('''echo 'library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))' >> /home/{}/.Rprofile'''.format(os_user))
+            http_proxy = datalab.fab.conn.run('''bash -l -c 'echo $http_proxy' ''').stdout.replace('\n','')
+            https_proxy = datalab.fab.conn.run('''bash -l -c 'echo $https_proxy' ''').stdout.replace('\n','')
+            datalab.fab.conn.sudo('''echo 'Sys.setenv(http_proxy = \"{}\")' >> /home/{}/.Rprofile'''.format(http_proxy, os_user))
+            datalab.fab.conn.sudo('''echo 'Sys.setenv(https_proxy = \"{}\")' >> /home/{}/.Rprofile'''.format(https_proxy, os_user))
+            datalab.fab.conn.sudo('rstudio-server start')
+            datalab.fab.conn.sudo('''bash -c 'echo "{0}:{1}" | chpasswd' '''.format(os_user, rstudio_pass))
+            datalab.fab.conn.sudo("sed -i '/exit 0/d' /etc/rc.local")
+            datalab.fab.conn.sudo('''bash -c "echo \'sed -i 's/^#SPARK_HOME/SPARK_HOME/' /home/{}/.Renviron\' >> /etc/rc.local"'''.format(os_user))
+            datalab.fab.conn.sudo("bash -c 'echo exit 0 >> /etc/rc.local'")
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/rstudio_ensured'.format(os_user))
         except:
             sys.exit(1)
     else:
         try:
-            sudo('echo "{0}:{1}" | chpasswd'.format(os_user, rstudio_pass))
+            datalab.fab.conn.sudo('''bash -c 'echo "{0}:{1}" | chpasswd' '''.format(os_user, rstudio_pass))
         except:
             sys.exit(1)
 
 
 def ensure_matplot(os_user):
-    if not exists('/home/{}/.ensure_dir/matplot_ensured'.format(os_user)):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/matplot_ensured'.format(os_user)):
         try:
-            sudo('pip2 install matplotlib==2.0.2 --no-cache-dir')
-            sudo('python3.5 -m pip install matplotlib==2.0.2 --no-cache-dir')
+            datalab.fab.conn.sudo('python3.5 -m pip install matplotlib=={} --no-cache-dir'.format(os.environ['notebook_matplotlib_version']))
             if os.environ['application'] in ('tensor', 'deeplearning'):
-                sudo('python2.7 -m pip install -U numpy=={} --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-                sudo('python3.5 -m pip install -U numpy=={} --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-            sudo('touch /home/{}/.ensure_dir/matplot_ensured'.format(os_user))
+                datalab.fab.conn.sudo('python3.8 -m pip install -U numpy=={} --no-cache-dir'.format(os.environ['notebook_numpy_version']))
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/matplot_ensured'.format(os_user))
         except:
             sys.exit(1)
 
 
 def ensure_sbt(os_user):
-    if not exists('/home/{}/.ensure_dir/sbt_ensured'.format(os_user)):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/sbt_ensured'.format(os_user)):
         try:
-            sudo('curl https://bintray.com/sbt/rpm/rpm | sudo tee /etc/yum.repos.d/bintray-sbt-rpm.repo')
+            datalab.fab.conn.sudo('curl https://bintray.com/sbt/rpm/rpm | sudo tee /etc/yum.repos.d/bintray-sbt-rpm.repo')
             manage_pkg('-y install', 'remote', 'sbt')
-            sudo('touch /home/{}/.ensure_dir/sbt_ensured'.format(os_user))
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/sbt_ensured'.format(os_user))
         except:
             sys.exit(1)
 
 
 def ensure_jre_jdk(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/jre_jdk_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/jre_jdk_ensured'):
         try:
             manage_pkg('-y install', 'remote', 'java-1.8.0-openjdk')
             manage_pkg('-y install', 'remote', 'java-1.8.0-openjdk-devel')
-            sudo('touch /home/' + os_user + '/.ensure_dir/jre_jdk_ensured')
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/jre_jdk_ensured')
         except:
             sys.exit(1)
 
 
 def ensure_scala(scala_link, scala_version, os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/scala_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/scala_ensured'):
         try:
-            sudo('wget {}scala-{}.rpm -O /tmp/scala.rpm'.format(scala_link, scala_version))
-            sudo('rpm -i /tmp/scala.rpm')
-            sudo('touch /home/' + os_user + '/.ensure_dir/scala_ensured')
+            datalab.fab.conn.sudo('wget {}scala-{}.rpm -O /tmp/scala.rpm'.format(scala_link, scala_version))
+            datalab.fab.conn.sudo('rpm -i /tmp/scala.rpm')
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/scala_ensured')
         except:
             sys.exit(1)
 
 
 def ensure_additional_python_libs(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/additional_python_libs_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/additional_python_libs_ensured'):
         try:
             manage_pkg('clean', 'remote', 'all')
             manage_pkg('-y install', 'remote', 'zlib-devel libjpeg-turbo-devel --nogpgcheck')
             if os.environ['application'] in ('jupyter', 'zeppelin'):
-                sudo('pip2 install NumPy=={} SciPy pandas Sympy Pillow sklearn --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-                sudo('python3.5 -m pip install NumPy=={} SciPy pandas Sympy Pillow sklearn --no-cache-dir'.format(os.environ['notebook_numpy_version']))
+                datalab.fab.conn.sudo('python3.5 -m pip install NumPy=={} SciPy pandas Sympy Pillow sklearn --no-cache-dir'.format(os.environ['notebook_numpy_version']))
             if os.environ['application'] in ('tensor', 'deeplearning'):
-                sudo('python2.7 -m pip install opencv-python h5py --no-cache-dir')
-                sudo('python3.5 -m pip install opencv-python h5py --no-cache-dir')
-            sudo('touch /home/' + os_user + '/.ensure_dir/additional_python_libs_ensured')
+                datalab.fab.conn.sudo('python3.8 -m pip install opencv-python h5py --no-cache-dir')
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/additional_python_libs_ensured')
         except:
             sys.exit(1)
 
 
 def ensure_python3_specific_version(python3_version, os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/python3_specific_version_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/python3_specific_version_ensured'):
         try:
             manage_pkg('-y install', 'remote', 'yum-utils python34 openssl-devel')
             manage_pkg('-y groupinstall', 'remote', 'development --nogpgcheck')
             if len(python3_version) < 4:
                 python3_version = python3_version + ".0"
-            sudo('wget https://www.python.org/ftp/python/{0}/Python-{0}.tgz'.format(python3_version))
-            sudo('tar xzf Python-{0}.tgz; cd Python-{0}; ./configure --prefix=/usr/local; make altinstall'.format(python3_version))
-            sudo('touch /home/' + os_user + '/.ensure_dir/python3_specific_version_ensured')
+            datalab.fab.conn.sudo('wget https://www.python.org/ftp/python/{0}/Python-{0}.tgz'.format(python3_version))
+            datalab.fab.conn.sudo('tar xzf Python-{0}.tgz; cd Python-{0}; ./configure --prefix=/usr/local; make altinstall'.format(python3_version))
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/python3_specific_version_ensured')
         except:
             sys.exit(1)
 
-
-def ensure_python2_libraries(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/python2_libraries_ensured'):
-        try:
-            sudo('pip2 install pyparsing==2.0.3')
-            manage_pkg('-y install', 'remote', 'python-setuptools python-wheel')
-            manage_pkg('-y install', 'remote', 'python-virtualenv openssl-devel python-devel openssl-libs libxslt-devel --nogpgcheck')
-            try:
-                sudo('python2 -m pip install backports.shutil_get_terminal_size tornado=={0} ipython ipykernel=={1} --no-cache-dir' \
-                     .format(os.environ['notebook_tornado_version'], os.environ['notebook_ipykernel_version']))
-            except:
-                sudo('python2 -m pip install backports.shutil_get_terminal_size tornado=={0} ipython==5.0.0 ipykernel=={1} --no-cache-dir' \
-                     .format(os.environ['notebook_tornado_version'], os.environ['notebook_ipykernel_version']))
-            sudo('echo y | python2 -m pip uninstall backports.shutil_get_terminal_size')
-            sudo('python2 -m pip install backports.shutil_get_terminal_size --no-cache-dir')
-            sudo('pip2 install -UI pip=={} setuptools --no-cache-dir'.format(os.environ['conf_pip_version']))
-            sudo('pip2 install boto3 backoff --no-cache-dir')
-            sudo('pip2 install fabvenv fabric-virtualenv future --no-cache-dir')
-            downgrade_python_version()
-            sudo('touch /home/' + os_user + '/.ensure_dir/python2_libraries_ensured')
-        except:
-            sys.exit(1)
-
-
 def ensure_python3_libraries(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/python3_libraries_ensured'):
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/python3_libraries_ensured'):
         try:
             manage_pkg('-y install', 'remote', 'https://centos7.iuscommunity.org/ius-release.rpm')
             manage_pkg('-y install', 'remote', 'python35u python35u-pip python35u-devel')
-            sudo('python3.5 -m pip install -U pip=={} setuptools --no-cache-dir'.format(os.environ['conf_pip_version']))
-            sudo('python3.5 -m pip install boto3 --no-cache-dir')
-            sudo('python3.5 -m pip install fabvenv fabric-virtualenv future --no-cache-dir')
+            datalab.fab.conn.sudo('python3.5 -m pip install -U pip=={} setuptools --no-cache-dir'.format(os.environ['conf_pip_version']))
+            datalab.fab.conn.sudo('python3.5 -m pip install boto3 --no-cache-dir')
+            datalab.fab.conn.sudo('python3.5 -m pip install fabvenv fabric-virtualenv future patchwork --no-cache-dir')
             try:
-                sudo('python3.5 -m pip install tornado=={0} ipython==7.9.0 ipykernel=={1} --no-cache-dir' \
+                datalab.fab.conn.sudo('python3.5 -m pip install tornado=={0} ipython==7.9.0 ipykernel=={1} --no-cache-dir' \
                      .format(os.environ['notebook_tornado_version'], os.environ['notebook_ipykernel_version']))
             except:
-                sudo('python3.5 -m pip install tornado=={0} ipython==5.0.0 ipykernel=={1} --no-cache-dir' \
+                datalab.fab.conn.sudo('python3.5 -m pip install tornado=={0} ipython==5.0.0 ipykernel=={1} --no-cache-dir' \
                      .format(os.environ['notebook_tornado_version'], os.environ['notebook_ipykernel_version']))
-            sudo('touch /home/' + os_user + '/.ensure_dir/python3_libraries_ensured')
+            datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/python3_libraries_ensured')
         except:
             sys.exit(1)
 
@@ -259,110 +232,154 @@
 def install_tensor(os_user, cuda_version, cuda_file_name,
                    cudnn_version, cudnn_file_name, tensorflow_version,
                    templates_dir, nvidia_version):
-    if not exists('/home/{}/.ensure_dir/tensor_ensured'.format(os_user)):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/tensor_ensured'.format(os_user)):
         try:
             # install nvidia drivers
-            sudo('echo "blacklist nouveau" >> /etc/modprobe.d/blacklist-nouveau.conf')
-            sudo('echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist-nouveau.conf')
-            sudo('dracut --force')
-            with settings(warn_only=True):
-                reboot(wait=150)
+            datalab.fab.conn.sudo('''bash -c 'echo "blacklist nouveau" >> /etc/modprobe.d/blacklist-nouveau.conf' ''')
+            datalab.fab.conn.sudo('''bash -c 'echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist-nouveau.conf' ''')
+            datalab.fab.conn.sudo('dracut --force')
+            datalab.fab.conn.sudo('reboot', warn=True)
+            time.sleep(150)
             manage_pkg('-y install', 'remote', 'libglvnd-opengl libglvnd-devel dkms gcc kernel-devel-$(uname -r) kernel-headers-$(uname -r)')
-            sudo('wget http://us.download.nvidia.com/XFree86/Linux-x86_64/{0}/NVIDIA-Linux-x86_64-{0}.run -O /home/{1}/NVIDIA-Linux-x86_64-{0}.run'.format(nvidia_version, os_user))
-            sudo('/bin/bash /home/{0}/NVIDIA-Linux-x86_64-{1}.run -s --dkms'.format(os_user, nvidia_version))
-            sudo('rm -f /home/{0}/NVIDIA-Linux-x86_64-{1}.run'.format(os_user, nvidia_version))
+            datalab.fab.conn.sudo('wget http://us.download.nvidia.com/XFree86/Linux-x86_64/{0}/NVIDIA-Linux-x86_64-{0}.run -O /home/{1}/NVIDIA-Linux-x86_64-{0}.run'.format(nvidia_version, os_user))
+            datalab.fab.conn.sudo('/bin/bash /home/{0}/NVIDIA-Linux-x86_64-{1}.run -s --dkms'.format(os_user, nvidia_version))
+            datalab.fab.conn.sudo('rm -f /home/{0}/NVIDIA-Linux-x86_64-{1}.run'.format(os_user, nvidia_version))
             # install cuda
-            sudo('python3.5 -m pip install --upgrade pip=={0} wheel numpy=={1} --no-cache-dir'. format(os.environ['conf_pip_version'], os.environ['notebook_numpy_version']))
-            sudo('wget -P /opt https://developer.nvidia.com/compute/cuda/{0}/prod/local_installers/{1}'.format(cuda_version, cuda_file_name))
-            sudo('sh /opt/{} --silent --toolkit'.format(cuda_file_name))
-            sudo('mv /usr/local/cuda-{} /opt/'.format(cuda_version))
-            sudo('ln -s /opt/cuda-{0} /usr/local/cuda-{0}'.format(cuda_version))
-            sudo('rm -f /opt/{}'.format(cuda_file_name))
+            datalab.fab.conn.sudo('python3.5 -m pip install --upgrade pip=={0} wheel numpy=={1} --no-cache-dir'. format(os.environ['conf_pip_version'], os.environ['notebook_numpy_version']))
+            datalab.fab.conn.sudo('wget -P /opt https://developer.nvidia.com/compute/cuda/{0}/prod/local_installers/{1}'.format(cuda_version, cuda_file_name))
+            datalab.fab.conn.sudo('sh /opt/{} --silent --toolkit'.format(cuda_file_name))
+            datalab.fab.conn.sudo('mv /usr/local/cuda-{} /opt/'.format(cuda_version[:-2]))
+            datalab.fab.conn.sudo('ln -s /opt/cuda-{0} /usr/local/cuda-{0}'.format(cuda_version[:-2]))
+            datalab.fab.conn.sudo('rm -f /opt/{}'.format(cuda_file_name))
             # install cuDNN
-            run('wget http://developer.download.nvidia.com/compute/redist/cudnn/v{0}/{1} -O /tmp/{1}'.format(cudnn_version, cudnn_file_name))
-            run('tar xvzf /tmp/{} -C /tmp'.format(cudnn_file_name))
-            sudo('mkdir -p /opt/cudnn/include')
-            sudo('mkdir -p /opt/cudnn/lib64')
-            sudo('mv /tmp/cuda/include/cudnn.h /opt/cudnn/include')
-            sudo('mv /tmp/cuda/lib64/libcudnn* /opt/cudnn/lib64')
-            sudo('chmod a+r /opt/cudnn/include/cudnn.h /opt/cudnn/lib64/libcudnn*')
-            run('echo "export LD_LIBRARY_PATH=\"$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64\"" >> ~/.bashrc')
+            datalab.fab.conn.run('wget https://developer.download.nvidia.com/compute/redist/cudnn/v{0}/{1} -O /tmp/{1}'.format(cudnn_version, cudnn_file_name))
+            datalab.fab.conn.run('tar xvzf /tmp/{} -C /tmp'.format(cudnn_file_name))
+            datalab.fab.conn.sudo('mkdir -p /opt/cudnn/include')
+            datalab.fab.conn.sudo('mkdir -p /opt/cudnn/lib64')
+            datalab.fab.conn.sudo('mv /tmp/cuda/include/cudnn.h /opt/cudnn/include')
+            datalab.fab.conn.sudo('mv /tmp/cuda/lib64/libcudnn* /opt/cudnn/lib64')
+            datalab.fab.conn.sudo('chmod a+r /opt/cudnn/include/cudnn.h /opt/cudnn/lib64/libcudnn*')
+            datalab.fab.conn.run('''bash -l -c 'echo "export LD_LIBRARY_PATH=\"$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64\"" >> ~/.bashrc' ''')
             # install TensorFlow and run TensorBoard
-            sudo('wget https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-{}-cp27-none-linux_x86_64.whl'.format(tensorflow_version))
-            sudo('wget https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-{}-cp35-cp35m-linux_x86_64.whl'.format(tensorflow_version))
-            sudo('python2.7 -m pip install --upgrade tensorflow_gpu-{}-cp27-none-linux_x86_64.whl --no-cache-dir'.format(tensorflow_version))
-            sudo('python3.5 -m pip install --upgrade tensorflow_gpu-{}-cp35-cp35m-linux_x86_64.whl --no-cache-dir'.format(tensorflow_version))
-            sudo('rm -rf /home/{}/tensorflow_gpu-*'.format(os_user))
-            sudo('mkdir /var/log/tensorboard; chown {0}:{0} -R /var/log/tensorboard'.format(os_user))
-            put('{}tensorboard.service'.format(templates_dir), '/tmp/tensorboard.service')
-            sudo("sed -i 's|OS_USR|{}|' /tmp/tensorboard.service".format(os_user))
-            sudo("chmod 644 /tmp/tensorboard.service")
-            sudo('\cp /tmp/tensorboard.service /etc/systemd/system/')
-            sudo("systemctl daemon-reload")
-            sudo("systemctl enable tensorboard")
-            sudo("systemctl start tensorboard")
-            sudo('touch /home/{}/.ensure_dir/tensor_ensured'.format(os_user))
+            datalab.fab.conn.sudo('wget https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-{}-cp27-none-linux_x86_64.whl'.format(tensorflow_version))
+            datalab.fab.conn.sudo('wget https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-{}-cp35-cp35m-linux_x86_64.whl'.format(tensorflow_version))
+            datalab.fab.conn.sudo('python3.8 -m pip install --upgrade tensorflow_gpu-{}-cp35-cp35m-linux_x86_64.whl --no-cache-dir'.format(tensorflow_version))
+            datalab.fab.conn.sudo('rm -rf /home/{}/tensorflow_gpu-*'.format(os_user))
+            datalab.fab.conn.sudo('mkdir /var/log/tensorboard; chown {0}:{0} -R /var/log/tensorboard'.format(os_user))
+            datalab.fab.conn.put('{}tensorboard.service'.format(templates_dir), '/tmp/tensorboard.service')
+            datalab.fab.conn.sudo("sed -i 's|OS_USR|{}|' /tmp/tensorboard.service".format(os_user))
+            datalab.fab.conn.sudo("chmod 644 /tmp/tensorboard.service")
+            datalab.fab.conn.sudo('\cp /tmp/tensorboard.service /etc/systemd/system/')
+            datalab.fab.conn.sudo("systemctl daemon-reload")
+            datalab.fab.conn.sudo("systemctl enable tensorboard")
+            datalab.fab.conn.sudo("systemctl start tensorboard")
+            datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/tensor_ensured'.format(os_user))
         except:
             sys.exit(1)
 
 
 def install_maven(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/maven_ensured'):
-        sudo('wget http://apache.volia.net/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz -O /tmp/maven.tar.gz')
-        sudo('tar -zxvf /tmp/maven.tar.gz -C /opt/')
-        sudo('ln -fs /opt/apache-maven-3.3.9/bin/mvn /usr/bin/mvn')
-        sudo('touch /home/' + os_user + '/.ensure_dir/maven_ensured')
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/maven_ensured'):
+        datalab.fab.conn.sudo('wget http://apache.volia.net/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz -O /tmp/maven.tar.gz')
+        datalab.fab.conn.sudo('tar -zxvf /tmp/maven.tar.gz -C /opt/')
+        datalab.fab.conn.sudo('ln -fs /opt/apache-maven-3.3.9/bin/mvn /usr/bin/mvn')
+        datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/maven_ensured')
 
 
 def install_livy_dependencies(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/livy_dependencies_ensured'):
-        sudo('pip2 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir')
-        sudo('pip3.5 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir')
-        sudo('touch /home/' + os_user + '/.ensure_dir/livy_dependencies_ensured')
+    if not exists(datalab.fab.conn,'/home/' + os_user + '/.ensure_dir/livy_dependencies_ensured'):
+        datalab.fab.conn.sudo('pip3.5 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir')
+        datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/livy_dependencies_ensured')
 
 
 def install_maven_emr(os_user):
     if not os.path.exists('/home/' + os_user + '/.ensure_dir/maven_ensured'):
-        local('wget http://apache.volia.net/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz -O /tmp/maven.tar.gz')
-        local('sudo tar -zxvf /tmp/maven.tar.gz -C /opt/')
-        local('sudo ln -fs /opt/apache-maven-3.3.9/bin/mvn /usr/bin/mvn')
-        local('touch /home/' + os_user + '/.ensure_dir/maven_ensured')
+        subprocess.run('wget http://apache.volia.net/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz -O /tmp/maven.tar.gz', shell=True, check=True)
+        subprocess.run('sudo tar -zxvf /tmp/maven.tar.gz -C /opt/', shell=True, check=True)
+        subprocess.run('sudo ln -fs /opt/apache-maven-3.3.9/bin/mvn /usr/bin/mvn', shell=True, check=True)
+        subprocess.run('touch /home/' + os_user + '/.ensure_dir/maven_ensured', shell=True, check=True)
 
 
 def install_livy_dependencies_emr(os_user):
     if not os.path.exists('/home/' + os_user + '/.ensure_dir/livy_dependencies_ensured'):
-        local('sudo -i pip2 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir')
-        local('sudo -i pip3.5 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir')
-        local('touch /home/' + os_user + '/.ensure_dir/livy_dependencies_ensured')
+        subprocess.run('sudo -i pip3.5 install cloudpickle requests requests-kerberos flake8 flaky pytest --no-cache-dir', shell=True, check=True)
+        subprocess.run('touch /home/' + os_user + '/.ensure_dir/livy_dependencies_ensured', shell=True, check=True)
 
 
 def install_nodejs(os_user):
-    if not exists('/home/{}/.ensure_dir/nodejs_ensured'.format(os_user)):
-        sudo('curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -')
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/nodejs_ensured'.format(os_user)):
+        datalab.fab.conn.sudo('curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -')
         manage_pkg('-y install', 'remote', 'nodejs')
-        sudo('touch /home/{}/.ensure_dir/nodejs_ensured'.format(os_user))
+        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/nodejs_ensured'.format(os_user))
 
 
 def install_os_pkg(requisites):
     status = list()
     error_parser = "Could not|No matching|Error:|failed|Requires:|Errno"
+    new_pkgs_parser = "Dependency Installed:"
     try:
         print("Updating repositories and installing requested tools: {}".format(requisites))
         manage_pkg('update-minimal --security -y --skip-broken', 'remote', '')
-        sudo('export LC_ALL=C')
+        #datalab.fab.conn.sudo('export LC_ALL=C')
         for os_pkg in requisites:
-            manage_pkg('-y install', 'remote', '{0} --nogpgcheck 2>&1 | if ! grep -w -E  "({1})" >  /tmp/os_install_{0}.log; then  echo "" > /tmp/os_install_{0}.log;fi'.format(os_pkg, error_parser))
-            err = sudo('cat /tmp/os_install_{}.log'.format(os_pkg)).replace('"', "'")
-            try:
-                res = sudo('python -c "import os,sys,yum; yb = yum.YumBase(); pl = yb.doPackageLists(); print [pkg.vr for pkg in pl.installed if pkg.name == \'{0}\'][0]"'.format(os_pkg))
-                version = res.split('\r\n')[1].replace("'", "\"")
-                status.append({"group": "os_pkg", "name": os_pkg, "version": version, "status": "installed"})
-            except:
-                status.append({"group": "os_pkg", "name": os_pkg, "status": "failed", "error_message": err})
+            name, vers = os_pkg
+            if vers != '' and vers !='N/A':
+                version = vers
+                os_pkg = "{}-{}".format(name, vers)
+            else:
+                version = 'N/A'
+                os_pkg = name
+            manage_pkg('-y install', 'remote', '{0} --nogpgcheck 2>&1 | tee /tmp/os_install_{2}.tmp; if ! grep -w -E  "({1})" '
+                                               '/tmp/os_install_{2}.tmp >  /tmp/os_install_{2}.log; then  echo "no_error" > /tmp/os_install_{2}.log;fi'.format(os_pkg, error_parser, name))
+            install_output = datalab.fab.conn.sudo('cat /tmp/os_install_{}.tmp'.format(name)).stdout
+            err = datalab.fab.conn.sudo('cat /tmp/os_install_{}.log'.format(name)).stdout.replace('"', "'")
+            datalab.fab.conn.sudo('cat /tmp/os_install_{0}.tmp | if ! grep -w -E -A 30 "({1})" /tmp/os_install_{0}.tmp > '
+                 '/tmp/os_install_{0}.log; then echo "no_dependencies" > /tmp/os_install_{0}.log;fi'.format(name, new_pkgs_parser))
+            dep = datalab.fab.conn.sudo('cat /tmp/os_install_{}.log'.format(name)).stdout
+            if 'no_dependencies' in dep:
+                dep = []
+            else:
+                dep = dep[len(new_pkgs_parser): dep.find("Complete!") - 1].replace('  ', '').strip().split('\r\n')
+                for n, i in enumerate(dep):
+                    i = i.split('.')[0]
+                    datalab.fab.conn.sudo('yum info {0} 2>&1 | if ! grep Version > /tmp/os_install_{0}.log; then echo "" > /tmp/os_install_{0}.log;fi'.format(i))
+                    dep[n] =sudo('cat /tmp/os_install_{}.log'.format(i)).replace('Version     : ', '{} v.'.format(i))
+                dep = [i for i in dep if i]
+            versions = []
+            datalab.fab.conn.sudo(
+                'yum list installed | if ! grep "{0}\." > /tmp/os_install_{0}.list; then echo "not_installed" > /tmp/os_install_{0}.list;fi'.format(
+                    name))
+            res = datalab.fab.conn.sudo('cat /tmp/os_install_{}.list '.format(name) + '| awk \'{print $1":"$2}\'').stdout.replace('\n', '')
+            #res = datalab.fab.conn.sudo('python3 -c "import os,sys,yum; yb = yum.YumBase(); pl = yb.doPackageLists(); print [pkg.vr for pkg in pl.installed if pkg.name == \'{0}\']"'.format(name)).stdout.split('\r\n')[1]
+            if "no_error" not in err:
+                status_msg = 'installation_error'
+            elif "not_installed" not in res:
+                version = res.split(":")[1]
+                status_msg = "installed"
+            if 'No package {} available'.format(os_pkg) in install_output:
+                versions = datalab.fab.conn.sudo('yum --showduplicates list ' + name + ' | expand | grep ' + name + ' | awk \'{print $2}\'').stdout.replace('\r\n', '')
+                if versions and versions != 'Error: No matching Packages to list':
+                    versions = versions.split(' ')
+                    status_msg = 'invalid_version'
+                    for n, i in enumerate(versions):
+                        if ':' in i:
+                            versions[n] = i.split(':')[1].split('-')[0]
+                        else:
+                            versions[n] = i.split('-')[0]
+                else:
+                    versions = []
+                    status_msg = 'invalid_name'
+            status.append({"group": "os_pkg", "name": name, "version": version, "status": status_msg,
+                           "error_message": err, "add_pkgs": dep, "available_versions": versions})
+        datalab.fab.conn.sudo('rm /tmp/*{}*'.format(name))
         return status
-    except:
-        return "Fail to install OS packages"
-
+    except Exception as err:
+        for os_pkg in requisites:
+            name, vers = os_pkg
+            status.append(
+                {"group": "os_pkg", "name": name, "version": vers, "status": 'installation_error', "error_message": err})
+        print("Failed to install OS packages: {}".format(requisites))
+        return status
 
 def remove_os_pkg(pkgs):
     try:
@@ -373,13 +390,15 @@
 
 def get_available_os_pkgs():
     try:
+        os_pkgs = dict()
         manage_pkg('update-minimal --security -y --skip-broken', 'remote', '')
-        downgrade_python_version()
-        yum_raw = sudo('python -c "import os,sys,yum; yb = yum.YumBase(); pl = yb.doPackageLists(); print {pkg.name:pkg.vr for pkg in pl.available}"')
-        yum_re = re.sub\
-            (r'\w*\s\w*\D\s\w*.\w*.\s\w*.\w*.\w.\w*.\w*.\w*', '', yum_raw)
-        yum_list = yum_re.replace("'", "\"")
-        os_pkgs = json.loads(yum_list)
+        #downgrade_python_version()
+        yum_names = datalab.fab.conn.sudo("yum list available | grep -v \"Loaded plugins:\|Available Packages\" | xargs -n3 | column -t | awk '{print $1}'").stdout.split('\n')
+        for pkg in yum_names:
+            if "." in pkg:
+                os_pkgs[pkg.split('.')[0]] = 'N/A'
+            elif pkg != '':
+                os_pkgs[pkg] = 'N/A'
         return os_pkgs
     except Exception as err:
         append_result("Failed to get available os packages.", str(err))
@@ -387,94 +406,82 @@
 
 
 def install_opencv(os_user):
-    if not exists('/home/{}/.ensure_dir/opencv_ensured'.format(os_user)):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/opencv_ensured'.format(os_user)):
         manage_pkg('-y install', 'remote', 'cmake python34 python34-devel python34-pip gcc gcc-c++')
-        sudo('pip2 install numpy=={} --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-        sudo('pip3.4 install numpy=={} --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-        sudo('pip3.5 install numpy=={} --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-        run('git clone https://github.com/opencv/opencv.git')
-        with cd('/home/{}/opencv/'.format(os_user)):
-            run('git checkout 3.2.0')
-            run('mkdir release')
-        with cd('/home/{}/opencv/release/'.format(os_user)):
-            run('cmake -DINSTALL_TESTS=OFF -D CUDA_GENERATION=Auto -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=$(python2 -c "import sys; print(sys.prefix)") -D PYTHON_EXECUTABLE=$(which python2) ..')
-            run('make -j$(nproc)')
-            sudo('make install')
-        sudo('touch /home/' + os_user + '/.ensure_dir/opencv_ensured')
+        datalab.fab.conn.sudo('pip3.4 install numpy=={} --no-cache-dir'.format(os.environ['notebook_numpy_version']))
+        datalab.fab.conn.sudo('pip3.5 install numpy=={} --no-cache-dir'.format(os.environ['notebook_numpy_version']))
+        datalab.fab.conn.run('git clone https://github.com/opencv/opencv.git')
+        datalab.fab.conn.run('cd /home/{}/opencv/ && git checkout 3.2.0'.format(os_user))
+        datalab.fab.conn.run('cd /home/{}/opencv/ && mkdir release'.format(os_user))
+        datalab.fab.conn.run('cd /home/{}/opencv/release/ && cmake -DINSTALL_TESTS=OFF -D CUDA_GENERATION=Auto -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=$(python2 -c "import sys; print(sys.prefix)") -D PYTHON_EXECUTABLE=$(which python2) ..')
+        datalab.fab.conn.run('cd /home/{}/opencv/release/ && make -j$(nproc)')
+        datalab.fab.conn.sudo('''bash -c 'cd /home/{}/opencv/release/ &&  make install' ''')
+        datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/opencv_ensured')
 
 
 def install_caffe2(os_user, caffe2_version, cmake_version):
-    if not exists('/home/{}/.ensure_dir/caffe2_ensured'.format(os_user)):
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/caffe2_ensured'.format(os_user)):
         env.shell = "/bin/bash -l -c -i"
         manage_pkg('update-minimal --security -y', 'remote', '')
         manage_pkg('-y install --nogpgcheck', 'remote', 'automake cmake3 gcc gcc-c++ kernel-devel leveldb-devel lmdb-devel libtool protobuf-devel graphviz')
-        sudo('pip2 install flask graphviz hypothesis jupyter matplotlib==2.0.2 numpy=={} protobuf pydot python-nvd3 pyyaml '
-             'requests scikit-image scipy setuptools tornado future --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-        sudo('pip3.5 install flask graphviz hypothesis jupyter matplotlib==2.0.2 numpy=={} protobuf pydot python-nvd3 pyyaml '
-             'requests scikit-image scipy setuptools tornado future --no-cache-dir'.format(os.environ['notebook_numpy_version']))
-        sudo('cp /opt/cudnn/include/* /opt/cuda-8.0/include/')
-        sudo('cp /opt/cudnn/lib64/* /opt/cuda-8.0/lib64/')
-        sudo('wget https://cmake.org/files/v{2}/cmake-{1}.tar.gz -O /home/{0}/cmake-{1}.tar.gz'.format(
+        datalab.fab.conn.sudo('pip3.5 install flask graphviz hypothesis jupyter matplotlib=={} numpy=={} protobuf pydot python-nvd3 pyyaml '
+             'requests scikit-image scipy setuptools tornado future --no-cache-dir'.format(os.environ['notebook_matplotlib_version'], os.environ['notebook_numpy_version']))
+        datalab.fab.conn.sudo('cp /opt/cudnn/include/* /opt/cuda-8.0/include/')
+        datalab.fab.conn.sudo('cp /opt/cudnn/lib64/* /opt/cuda-8.0/lib64/')
+        datalab.fab.conn.sudo('wget https://cmake.org/files/v{2}/cmake-{1}.tar.gz -O /home/{0}/cmake-{1}.tar.gz'.format(
             os_user, cmake_version, cmake_version.split('.')[0] + "." + cmake_version.split('.')[1]))
-        sudo('tar -zxvf cmake-{}.tar.gz'.format(cmake_version))
-        with cd('/home/{}/cmake-{}/'.format(os_user, cmake_version)):
-            sudo('./bootstrap --prefix=/usr/local && make && make install')
-        sudo('ln -s /usr/local/bin/cmake /bin/cmake{}'.format(cmake_version))
-        sudo('git clone https://github.com/pytorch/pytorch.git')
-        with cd('/home/{}/pytorch/'.format(os_user)):
-            sudo('git submodule update --init')
-            with settings(warn_only=True):
-                sudo('git checkout v{}'.format(caffe2_version))
-                sudo('git submodule update --recursive')
-            sudo('mkdir build && cd build && cmake{} .. && make "-j$(nproc)" install'.format(cmake_version))
-        sudo('touch /home/' + os_user + '/.ensure_dir/caffe2_ensured')
+        datalab.fab.conn.sudo('tar -zxvf cmake-{}.tar.gz'.format(cmake_version))
+        datalab.fab.conn.sudo('''bash -c 'cd /home/{}/cmake-{}/ && ./bootstrap --prefix=/usr/local && make && make install' '''.format(os_user, cmake_version))
+        datalab.fab.conn.sudo('ln -s /usr/local/bin/cmake /bin/cmake{}'.format(cmake_version))
+        datalab.fab.conn.sudo('git clone https://github.com/pytorch/pytorch.git')
+        datalab.fab.conn.sudo('''bash -c 'cd /home/{}/pytorch/ && git submodule update --init' '''.format(os_user))
+        datalab.fab.conn.sudo('''bash -c 'cd /home/{}/pytorch/ && git checkout v{}' '''.format(os_user, caffe2_version), warn=True)
+        datalab.fab.conn.sudo('''bash -c 'cd /home/{}/pytorch/ && git submodule update --recursive' '''.format(os_user), warn=True)
+        datalab.fab.conn.sudo('''bash -c 'cd /home/{}/pytorch/ && mkdir build && cd build && cmake{} .. && make "-j$(nproc)" install' '''.format(os_user, cmake_version))
+        datalab.fab.conn.sudo('touch /home/' + os_user + '/.ensure_dir/caffe2_ensured')
 
 
 def install_cntk(os_user, cntk_version):
-    if not exists('/home/{}/.ensure_dir/cntk_ensured'.format(os_user)):
-        sudo('echo "exclude=*.i386 *.i686" >> /etc/yum.conf')
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/cntk_ensured'.format(os_user)):
+        datalab.fab.conn.sudo('echo "exclude=*.i386 *.i686" >> /etc/yum.conf')
         manage_pkg('clean', 'remote', 'all')
         manage_pkg('update-minimal --security -y', 'remote', '')
         manage_pkg('-y install --nogpgcheck', 'remote', 'openmpi openmpi-devel')
-        sudo('pip2 install https://cntk.ai/PythonWheel/GPU/cntk-{}-cp27-cp27mu-linux_x86_64.whl --no-cache-dir'.format(cntk_version))
-        sudo('pip3.5 install https://cntk.ai/PythonWheel/GPU/cntk-{}-cp35-cp35m-linux_x86_64.whl --no-cache-dir'.format(cntk_version))
-        sudo('touch /home/{}/.ensure_dir/cntk_ensured'.format(os_user))
+        datalab.fab.conn.sudo('pip3.5 install https://cntk.ai/PythonWheel/GPU/cntk-{}-cp35-cp35m-linux_x86_64.whl --no-cache-dir'.format(cntk_version))
+        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/cntk_ensured'.format(os_user))
 
 
 def install_keras(os_user, keras_version):
-    if not exists('/home/{}/.ensure_dir/keras_ensured'.format(os_user)):
-        sudo('pip2 install keras=={} --no-cache-dir'.format(keras_version))
-        sudo('pip3.5 install keras=={} --no-cache-dir'.format(keras_version))
-        sudo('touch /home/{}/.ensure_dir/keras_ensured'.format(os_user))
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/keras_ensured'.format(os_user)):
+        datalab.fab.conn.sudo('pip3.5 install keras=={} --no-cache-dir'.format(keras_version))
+        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/keras_ensured'.format(os_user))
 
 
 def install_theano(os_user, theano_version):
-    if not exists('/home/{}/.ensure_dir/theano_ensured'.format(os_user)):
-        sudo('python2.7 -m pip install Theano=={} --no-cache-dir'.format(theano_version))
-        sudo('python3.5 -m pip install Theano=={} --no-cache-dir'.format(theano_version))
-        sudo('touch /home/{}/.ensure_dir/theano_ensured'.format(os_user))
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/theano_ensured'.format(os_user)):
+        datalab.fab.conn.sudo('python3.8 -m pip install Theano=={} --no-cache-dir'.format(theano_version))
+        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/theano_ensured'.format(os_user))
 
 
 def install_mxnet(os_user, mxnet_version):
-    if not exists('/home/{}/.ensure_dir/mxnet_ensured'.format(os_user)):
-        sudo('pip2 install mxnet-cu80=={} opencv-python --no-cache-dir'.format(mxnet_version))
-        sudo('pip3.5 install mxnet-cu80=={} opencv-python --no-cache-dir'.format(mxnet_version))
-        sudo('touch /home/{}/.ensure_dir/mxnet_ensured'.format(os_user))
+    if not exists(datalab.fab.conn,'/home/{}/.ensure_dir/mxnet_ensured'.format(os_user)):
+        datalab.fab.conn.sudo('pip3.5 install mxnet-cu80=={} opencv-python --no-cache-dir'.format(mxnet_version))
+        datalab.fab.conn.sudo('touch /home/{}/.ensure_dir/mxnet_ensured'.format(os_user))
 
 
-def install_torch(os_user):
-    if not exists('/home/{}/.ensure_dir/torch_ensured'.format(os_user)):
-        run('git clone https://github.com/torch/distro.git ~/torch --recursive')
-        with cd('/home/{}/torch/'.format(os_user)):
-            manage_pkg('-y install --nogpgcheck', 'remote', 'cmake curl readline-devel ncurses-devel gcc-c++ gcc-gfortran git gnuplot unzip libjpeg-turbo-devel libpng-devel ImageMagick GraphicsMagick-devel fftw-devel sox-devel sox zeromq3-devel qt-devel qtwebkit-devel sox-plugins-freeworld qt-devel')
-            run('./install.sh -b')
-        run('source /home/{}/.bashrc'.format(os_user))
-        sudo('touch /home/{}/.ensure_dir/torch_ensured'.format(os_user))
+#def install_torch(os_user):
+#    if not exists(conn,'/home/{}/.ensure_dir/torch_ensured'.format(os_user)):
+#        run('git clone https://github.com/torch/distro.git ~/torch --recursive')
+#        with cd('/home/{}/torch/'.format(os_user)):
+#            manage_pkg('-y install --nogpgcheck', 'remote', 'cmake curl readline-devel ncurses-devel gcc-c++ gcc-gfortran git gnuplot unzip libjpeg-turbo-devel libpng-devel ImageMagick GraphicsMagick-devel fftw-devel sox-devel sox zeromq3-devel qt-devel qtwebkit-devel sox-plugins-freeworld qt-devel')
+#            run('./install.sh -b')
+#        run('source /home/{}/.bashrc'.format(os_user))
+#        conn.sudo('touch /home/{}/.ensure_dir/torch_ensured'.format(os_user))
 
 
 def install_gitlab_cert(os_user, certfile):
     try:
-        sudo('mv -f /home/{0}/{1} /etc/pki/ca-trust/source/anchors/{1}'.format(os_user, certfile))
-        sudo('update-ca-trust')
+        datalab.fab.conn.sudo('mv -f /home/{0}/{1} /etc/pki/ca-trust/source/anchors/{1}'.format(os_user, certfile))
+        datalab.fab.conn.sudo('update-ca-trust')
     except Exception as err:
         print('Failed to install gitlab certificate.{}'.format(str(err)))
diff --git a/infrastructure-provisioning/src/general/lib/os/redhat/ssn_lib.py b/infrastructure-provisioning/src/general/lib/os/redhat/ssn_lib.py
index 83fd2ca..39ad178 100644
--- a/infrastructure-provisioning/src/general/lib/os/redhat/ssn_lib.py
+++ b/infrastructure-provisioning/src/general/lib/os/redhat/ssn_lib.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,138 +21,142 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
 import crypt
-import yaml
-from dlab.fab import *
-from dlab.meta_lib import *
-import os
 import json
+import os
 import sys
 import traceback
-from dlab.common_lib import manage_pkg
+import subprocess
+from datalab.common_lib import manage_pkg
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 
-def ensure_docker_daemon(dlab_path, os_user, region):
+def ensure_docker_daemon(datalab_path, os_user, region):
     try:
-        if not exists('{}tmp/docker_daemon_ensured'.format(dlab_path)):
+        if not exists(conn,'{}tmp/docker_daemon_ensured'.format(datalab_path)):
             docker_version = os.environ['ssn_docker_version']
             if region == 'cn-north-1':
                 mirror = 'mirror.lzu.edu.cn'
             else:
                 mirror = 'mirror.centos.org'
-            with cd('/etc/yum.repos.d/'):
-                sudo('echo "[centosrepo]" > centos.repo')
-                sudo('echo "name=Centos 7 Repository" >> centos.repo')
-                sudo('echo "baseurl=http://{}/centos/7/extras/x86_64/" >> centos.repo'.format(mirror))
-                sudo('echo "enabled=1" >> centos.repo')
-                sudo('echo "gpgcheck=1" >> centos.repo')
-                sudo('echo "gpgkey=http://{}/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7" >> centos.repo'.format(mirror))
-            sudo('yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo')
+            conn.sudo('''bash -c 'cd /etc/yum.repos.d/ && echo "[centosrepo]" > centos.repo' ''')
+            conn.sudo('''bash -c 'cd /etc/yum.repos.d/ && echo "name=Centos 7 Repository" >> centos.repo' ''')
+            conn.sudo('''bash -c 'cd /etc/yum.repos.d/ && echo "baseurl=http://{}/centos/7/extras/x86_64/" >> centos.repo' '''.format(mirror))
+            conn.sudo('''bash -c 'cd /etc/yum.repos.d/ && echo "enabled=1" >> centos.repo' ''')
+            conn.sudo('''bash -c 'cd /etc/yum.repos.d/ && echo "gpgcheck=1" >> centos.repo' ''')
+            conn.sudo('''bash -c 'cd /etc/yum.repos.d/ && echo "gpgkey=http://{}/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7" >> centos.repo' '''.format(mirror))
+            conn.sudo('yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo')
             manage_pkg('update-minimal --security -y', 'remote', '')
             manage_pkg('-y install', 'remote', 'container-selinux')
             manage_pkg('-y install', 'remote', 'docker-ce-{}.ce'.format(docker_version))
-            sudo('usermod -aG docker {}'.format(os_user))
-            sudo('systemctl enable docker.service')
-            sudo('systemctl start docker')
-            sudo('touch {}tmp/docker_daemon_ensured'.format(dlab_path))
+            conn.sudo('usermod -aG docker {}'.format(os_user))
+            conn.sudo('systemctl enable docker.service')
+            conn.sudo('systemctl start docker')
+            conn.sudo('touch {}tmp/docker_daemon_ensured'.format(datalab_path))
         return True
     except:
         return False
 
 
-def ensure_nginx(dlab_path):
+def ensure_nginx(datalab_path):
     try:
-        if not exists('{}tmp/nginx_ensured'.format(dlab_path)):
+        if not exists(conn,'{}tmp/nginx_ensured'.format(datalab_path)):
             manage_pkg('-y install', 'remote', 'nginx')
-            sudo('systemctl restart nginx.service')
-            sudo('chkconfig nginx on')
-            sudo('touch {}tmp/nginx_ensured'.format(dlab_path))
+            conn.sudo('systemctl restart nginx.service')
+            conn.sudo('chkconfig nginx on')
+            conn.sudo('touch {}tmp/nginx_ensured'.format(datalab_path))
     except Exception as err:
         traceback.print_exc()
         print('Failed to ensure Nginx: ', str(err))
         sys.exit(1)
 
 
-def ensure_jenkins(dlab_path):
+def ensure_jenkins(datalab_path):
     try:
-        if not exists('{}tmp/jenkins_ensured'.format(dlab_path)):
-            sudo('wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo')
+        if not exists(conn,'{}tmp/jenkins_ensured'.format(datalab_path)):
+            conn.sudo('wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo')
             try:
-                sudo('rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key')
+                conn.sudo('rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key')
             except:
                 pass
             manage_pkg('-y install', 'remote', 'jenkins')
             manage_pkg('-y install', 'remote', 'policycoreutils-python')
-            sudo('touch {}tmp/jenkins_ensured'.format(dlab_path))
+            conn.sudo('touch {}tmp/jenkins_ensured'.format(datalab_path))
     except Exception as err:
         traceback.print_exc()
         print('Failed to ensure Jenkins: ', str(err))
         sys.exit(1)
 
 
-def configure_jenkins(dlab_path, os_user, config, tag_resource_id):
+def configure_jenkins(datalab_path, os_user, config, tag_resource_id):
     try:
-        if not exists('{}tmp/jenkins_configured'.format(dlab_path)):
-            sudo('rm -rf /var/lib/jenkins/*')
-            sudo('mkdir -p /var/lib/jenkins/jobs/')
-            sudo('chown -R {0}:{0} /var/lib/jenkins/'.format(os_user))
-            put('/root/templates/jenkins_jobs/*', '/var/lib/jenkins/jobs/')
-            #sudo("find /var/lib/jenkins/jobs/ -type f | xargs sed -i \'s/OS_USR/{}/g\'".format(os_user))
-            sudo("find /var/lib/jenkins/jobs/ -type f | xargs sed -i \'s/OS_USR/{}/g; s/SBN/{}/g; s/CTUN/{}/g; s/SGI/{}/g; s/VPC/{}/g; s/SNI/{}/g; s/AKEY/{}/g\'".format(os_user, config['service_base_name'], tag_resource_id, config['security_group_id'], config['vpc_id'], config['subnet_id'], config['admin_key']))
-            sudo('chown -R jenkins:jenkins /var/lib/jenkins')
-            sudo('/etc/init.d/jenkins stop; sleep 5')
-            sudo('sed -i \'/JENKINS_PORT/ s/^/#/\' /etc/sysconfig/jenkins; echo \'JENKINS_PORT="8070"\' >> /etc/sysconfig/jenkins')
-            sudo('sed -i \'/JENKINS_ARGS/ s|=""|="--prefix=/jenkins"|\' /etc/sysconfig/jenkins')
-            sudo('semanage port -a -t http_port_t -p tcp 8070')
-            sudo('setsebool -P httpd_can_network_connect 1')
-            sudo('chkconfig jenkins on')
-            sudo('systemctl start jenkins.service')
-            sudo('echo "jenkins ALL = NOPASSWD:ALL" >> /etc/sudoers')
-            sudo('touch {}tmp/jenkins_configured'.format(dlab_path))
+        if not exists(conn,'{}tmp/jenkins_configured'.format(datalab_path)):
+            conn.sudo('rm -rf /var/lib/jenkins/*')
+            conn.sudo('mkdir -p /var/lib/jenkins/jobs/')
+            conn.sudo('chown -R {0}:{0} /var/lib/jenkins/'.format(os_user))
+            conn.put('/root/templates/jenkins_jobs/*', '/var/lib/jenkins/jobs/')
+            # conn.sudo("find /var/lib/jenkins/jobs/ -type f | xargs sed -i \'s/OS_USR/{}/g\'".format(os_user))
+            conn.sudo(
+                "find /var/lib/jenkins/jobs/ -type f | xargs sed -i \'s/OS_USR/{}/g; s/SBN/{}/g; s/CTUN/{}/g; s/SGI/{}/g; s/VPC/{}/g; s/SNI/{}/g; s/AKEY/{}/g\'".format(
+                    os_user, config['service_base_name'], tag_resource_id, config['security_group_id'],
+                    config['vpc_id'], config['subnet_id'], config['admin_key']))
+            conn.sudo('chown -R jenkins:jenkins /var/lib/jenkins')
+            conn.sudo('/etc/init.d/jenkins stop; sleep 5')
+            conn.sudo(
+                'sed -i \'/JENKINS_PORT/ s/^/#/\' /etc/sysconfig/jenkins; echo \'JENKINS_PORT="8070"\' >> /etc/sysconfig/jenkins')
+            conn.sudo('sed -i \'/JENKINS_ARGS/ s|=""|="--prefix=/jenkins"|\' /etc/sysconfig/jenkins')
+            conn.sudo('semanage port -a -t http_port_t -p tcp 8070')
+            conn.sudo('setsebool -P httpd_can_network_connect 1')
+            conn.sudo('chkconfig jenkins on')
+            conn.sudo('systemctl start jenkins.service')
+            conn.sudo('echo "jenkins ALL = NOPASSWD:ALL" >> /etc/sudoers')
+            conn.sudo('touch {}tmp/jenkins_configured'.format(datalab_path))
     except Exception as err:
         traceback.print_exc()
         print('Failed to configure Jenkins: ', str(err))
         sys.exit(1)
 
 
-def configure_nginx(config, dlab_path, hostname):
+def configure_nginx(config, datalab_path, hostname):
     try:
         random_file_part = id_generator(size=20)
-        if not exists("/etc/nginx/conf.d/nginx_proxy.conf"):
-            sudo('rm -f /etc/nginx/conf.d/*')
-            put(config['nginx_template_dir'] + 'nginx_proxy.conf', '/tmp/nginx_proxy.conf')
-            put(config['nginx_template_dir'] + 'ssn_nginx.conf', '/tmp/nginx.conf')
-            sudo("sed -i 's|SSN_HOSTNAME|" + hostname + "|' /tmp/nginx_proxy.conf")
-            sudo('cat /tmp/nginx.conf > /etc/nginx/nginx.conf')
-            sudo('mv /tmp/nginx_proxy.conf ' + dlab_path + 'tmp/')
-            sudo('\cp ' + dlab_path + 'tmp/nginx_proxy.conf /etc/nginx/conf.d/')
-            sudo('mkdir -p /etc/nginx/locations')
-            sudo('rm -f /etc/nginx/sites-enabled/default')
+        if not exists(conn,"/etc/nginx/conf.d/nginx_proxy.conf"):
+            conn.sudo('rm -f /etc/nginx/conf.d/*')
+            conn.put(config['nginx_template_dir'] + 'nginx_proxy.conf', '/tmp/nginx_proxy.conf')
+            conn.put(config['nginx_template_dir'] + 'ssn_nginx.conf', '/tmp/nginx.conf')
+            conn.sudo("sed -i 's|SSN_HOSTNAME|" + hostname + "|' /tmp/nginx_proxy.conf")
+            conn.sudo('cat /tmp/nginx.conf > /etc/nginx/nginx.conf')
+            conn.sudo('mv /tmp/nginx_proxy.conf ' + datalab_path + 'tmp/')
+            conn.sudo('\cp ' + datalab_path + 'tmp/nginx_proxy.conf /etc/nginx/conf.d/')
+            conn.sudo('mkdir -p /etc/nginx/locations')
+            conn.sudo('rm -f /etc/nginx/sites-enabled/default')
     except Exception as err:
         traceback.print_exc()
         print('Failed to configure Nginx: ', str(err))
         sys.exit(1)
 
     try:
-        if not exists("/etc/nginx/locations/proxy_location_jenkins.conf"):
+        if not exists(conn,"/etc/nginx/locations/proxy_location_jenkins.conf"):
             nginx_password = id_generator()
             template_file = config['nginx_template_dir'] + 'proxy_location_jenkins_template.conf'
             with open("/tmp/%s-tmpproxy_location_jenkins_template.conf" % random_file_part, 'w') as out:
                 with open(template_file) as tpl:
                     for line in tpl:
                         out.write(line)
-            put("/tmp/%s-tmpproxy_location_jenkins_template.conf" % random_file_part,
+            conn.put("/tmp/%s-tmpproxy_location_jenkins_template.conf" % random_file_part,
                 '/tmp/proxy_location_jenkins.conf')
-            sudo('\cp /tmp/proxy_location_jenkins.conf /etc/nginx/locations/')
-            sudo("echo 'engineer:" + crypt.crypt(nginx_password, id_generator()) + "' > /etc/nginx/htpasswd")
+            conn.sudo('\cp /tmp/proxy_location_jenkins.conf /etc/nginx/locations/')
+            conn.sudo('''bash -c "echo 'engineer:{}' > /etc/nginx/htpasswd"'''.format(
+                crypt.crypt(nginx_password, id_generator())))
             with open('jenkins_creds.txt', 'w+') as f:
                 f.write("Jenkins credentials: engineer  / " + nginx_password)
     except:
         return False
 
     try:
-        sudo('service nginx reload')
+        conn.sudo('service nginx reload')
         return True
     except:
         return False
@@ -160,12 +164,12 @@
 
 def ensure_supervisor():
     try:
-        if not exists('{}tmp/superv_ensured'.format(os.environ['ssn_dlab_path'])):
+        if not exists(conn,'{}tmp/superv_ensured'.format(os.environ['ssn_datalab_path'])):
             manage_pkg('-y install', 'remote', 'supervisor')
-            #sudo('pip install supervisor')
-            sudo('chkconfig supervisord on')
-            sudo('systemctl start supervisord')
-            sudo('touch {}tmp/superv_ensured'.format(os.environ['ssn_dlab_path']))
+            # conn.sudo('pip install supervisor')
+            conn.sudo('chkconfig supervisord on')
+            conn.sudo('systemctl start supervisord')
+            conn.sudo('touch {}tmp/superv_ensured'.format(os.environ['ssn_datalab_path']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to install supervisor: ', str(err))
@@ -174,54 +178,55 @@
 
 def ensure_mongo():
     try:
-        if not exists('{}tmp/mongo_ensured'.format(os.environ['ssn_dlab_path'])):
-            sudo('echo -e "[mongodb-org-3.2]\nname=MongoDB Repository'
+        if not exists(conn,'{}tmp/mongo_ensured'.format(os.environ['ssn_datalab_path'])):
+            conn.sudo('echo -e "[mongodb-org-3.2]\nname=MongoDB Repository'
                  '\nbaseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/3.2/x86_64/'
                  '\ngpgcheck=1'
                  '\nenabled=1'
                  '\ngpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc" '
                  '> /etc/yum.repos.d/mongodb.repo')
             manage_pkg('-y install', 'remote', 'mongodb-org')
-            sudo('semanage port -a -t mongod_port_t -p tcp 27017')
-            sudo('chkconfig mongod on')
-            sudo('echo "d /var/run/mongodb 0755 mongod mongod" > /lib/tmpfiles.d/mongodb.conf')
-            sudo('sudo systemd-tmpfiles --create mongodb.conf')
-            sudo('systemctl start mongod.service')
-            sudo('touch {}tmp/mongo_ensured'.format(os.environ['ssn_dlab_path']))
+            conn.sudo('semanage port -a -t mongod_port_t -p tcp 27017')
+            conn.sudo('chkconfig mongod on')
+            conn.sudo('echo "d /var/run/mongodb 0755 mongod mongod" > /lib/tmpfiles.d/mongodb.conf')
+            conn.sudo('sudo systemd-tmpfiles --create mongodb.conf')
+            conn.sudo('systemctl start mongod.service')
+            conn.sudo('touch {}tmp/mongo_ensured'.format(os.environ['ssn_datalab_path']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to install MongoDB: ', str(err))
         sys.exit(1)
 
 
-def start_ss(keyfile, host_string, dlab_conf_dir, web_path,
+def start_ss(keyfile, host_string, datalab_conf_dir, web_path,
              os_user, mongo_passwd, keystore_passwd, cloud_provider,
              service_base_name, tag_resource_id, billing_tag, account_id, billing_bucket,
-             aws_job_enabled, dlab_path, billing_enabled, cloud_params,
+             aws_job_enabled, datalab_path, billing_enabled, cloud_params,
              authentication_file, offer_number, currency,
              locale, region_info, ldap_login, tenant_id,
              application_id, hostname, data_lake_name, subscription_id,
-             validate_permission_scope, dlab_id, usage_date, product,
-             usage_type, usage, cost, resource_id, tags, billing_dataset_name, report_path=''):
+             validate_permission_scope, datalab_id, usage_date, product,
+             usage_type, usage, cost, resource_id, tags, billing_dataset_name, keycloak_client_id,
+             keycloak_client_secret, keycloak_auth_server_url, report_path=''):
     try:
-        if not exists('{}tmp/ss_started'.format(os.environ['ssn_dlab_path'])):
-            java_path = sudo("alternatives --display java | grep 'slave jre: ' | awk '{print $3}'")
+        if not exists(conn,'{}tmp/ss_started'.format(os.environ['ssn_datalab_path'])):
+            java_path = conn.sudo("alternatives --display java | grep 'slave jre: ' | awk '{print $3}'").stdout.replace('\n','')
             supervisor_conf = '/etc/supervisord.d/supervisor_svc.ini'
-            local('sed -i "s|MONGO_PASSWORD|{}|g" /root/templates/ssn.yml'.format(mongo_passwd))
-            local('sed -i "s|KEYSTORE_PASSWORD|{}|g" /root/templates/ssn.yml'.format(keystore_passwd))
-            local('sed -i "s|CLOUD_PROVIDER|{}|g" /root/templates/ssn.yml'.format(cloud_provider))
-            local('sed -i "s|\${JRE_HOME}|' + java_path + '|g" /root/templates/ssn.yml')
-            sudo('sed -i "s|KEYNAME|{}|g" {}/webapp/provisioning-service/conf/provisioning.yml'.
-                  format(os.environ['conf_key_name'], dlab_path))
-            put('/root/templates/ssn.yml', '/tmp/ssn.yml')
-            sudo('mv /tmp/ssn.yml ' + os.environ['ssn_dlab_path'] + 'conf/')
-            put('/root/templates/proxy_location_webapp_template.conf', '/tmp/proxy_location_webapp_template.conf')
-            sudo('mv /tmp/proxy_location_webapp_template.conf ' + os.environ['ssn_dlab_path'] + 'tmp/')
+            conn.local('sed -i "s|MONGO_PASSWORD|{}|g" /root/templates/ssn.yml'.format(mongo_passwd))
+            conn.local('sed -i "s|KEYSTORE_PASSWORD|{}|g" /root/templates/ssn.yml'.format(keystore_passwd))
+            conn.local('sed -i "s|CLOUD_PROVIDER|{}|g" /root/templates/ssn.yml'.format(cloud_provider))
+            conn.local('sed -i "s|\${JRE_HOME}|' + java_path + '|g" /root/templates/ssn.yml')
+            conn.sudo('sed -i "s|KEYNAME|{}|g" {}/webapp/provisioning-service/conf/provisioning.yml'.
+                 format(os.environ['conf_key_name'], datalab_path))
+            conn.put('/root/templates/ssn.yml', '/tmp/ssn.yml')
+            conn.sudo('mv /tmp/ssn.yml ' + os.environ['ssn_datalab_path'] + 'conf/')
+            conn.put('/root/templates/proxy_location_webapp_template.conf', '/tmp/proxy_location_webapp_template.conf')
+            conn.sudo('mv /tmp/proxy_location_webapp_template.conf ' + os.environ['ssn_datalab_path'] + 'tmp/')
             if cloud_provider == 'gcp':
                 conf_parameter_name = '--spring.config.location='
                 with open('/root/templates/supervisor_svc.conf', 'r') as f:
                     text = f.read()
-                text = text.replace('WEB_CONF', dlab_conf_dir).replace('OS_USR', os_user)\
+                text = text.replace('WEB_CONF', datalab_conf_dir).replace('OS_USR', os_user) \
                     .replace('CONF_PARAMETER_NAME', conf_parameter_name)
                 with open('/root/templates/supervisor_svc.conf', 'w') as f:
                     f.write(text)
@@ -229,43 +234,45 @@
                 conf_parameter_name = '--conf '
                 with open('/root/templates/supervisor_svc.conf', 'r') as f:
                     text = f.read()
-                text = text.replace('WEB_CONF', dlab_conf_dir).replace('OS_USR', os_user)\
+                text = text.replace('WEB_CONF', datalab_conf_dir).replace('OS_USR', os_user) \
                     .replace('CONF_PARAMETER_NAME', conf_parameter_name)
                 with open('/root/templates/supervisor_svc.conf', 'w') as f:
                     f.write(text)
-            put('/root/templates/supervisor_svc.conf', '/tmp/supervisor_svc.conf')
-            sudo('mv /tmp/supervisor_svc.conf ' + os.environ['ssn_dlab_path'] + 'tmp/')
-            sudo('cp ' + os.environ['ssn_dlab_path'] +
+            conn.put('/root/templates/supervisor_svc.conf', '/tmp/supervisor_svc.conf')
+            conn.sudo('mv /tmp/supervisor_svc.conf ' + os.environ['ssn_datalab_path'] + 'tmp/')
+            conn.sudo('cp ' + os.environ['ssn_datalab_path'] +
                  'tmp/proxy_location_webapp_template.conf /etc/nginx/locations/proxy_location_webapp.conf')
-            sudo('cp ' + os.environ['ssn_dlab_path'] + 'tmp/supervisor_svc.conf {}'.format(supervisor_conf))
-            sudo('sed -i \'s=WEB_APP_DIR={}=\' {}'.format(web_path, supervisor_conf))
+            conn.sudo('cp ' + os.environ['ssn_datalab_path'] + 'tmp/supervisor_svc.conf {}'.format(supervisor_conf))
+            conn.sudo('sed -i \'s=WEB_APP_DIR={}=\' {}'.format(web_path, supervisor_conf))
             try:
-                sudo('mkdir -p /var/log/application')
-                run('mkdir -p /tmp/yml_tmp/')
+                conn.sudo('mkdir -p /var/log/application')
+                conn.run('mkdir -p /tmp/yml_tmp/')
                 for service in ['self-service', 'provisioning-service', 'billing']:
-                    jar = sudo('cd {0}{1}/lib/; find {1}*.jar -type f'.format(web_path, service))
-                    sudo('ln -s {0}{2}/lib/{1} {0}{2}/{2}.jar '.format(web_path, jar, service))
-                    sudo('cp {0}/webapp/{1}/conf/*.yml /tmp/yml_tmp/'.format(dlab_path, service))
+                    jar = conn.sudo('''bash -c 'cd {0}{1}/lib/; find {1}*.jar -type f' '''.format(web_path, service)).stdout
+                    conn.sudo('ln -s {0}{2}/lib/{1} {0}{2}/{2}.jar '.format(web_path, jar, service))
+                    conn.sudo('cp {0}/webapp/{1}/conf/*.yml /tmp/yml_tmp/'.format(datalab_path, service))
                 # Replacing Keycloak and cloud parameters
                 for item in json.loads(cloud_params):
                     if "KEYCLOAK_" in item['key']:
-                        sudo('sed -i "s|{0}|{1}|g" /tmp/yml_tmp/self-service.yml'.format(
+                        conn.sudo('sed -i "s|{0}|{1}|g" /tmp/yml_tmp/self-service.yml'.format(
                             item['key'], item['value']))
-                    sudo('sed -i "s|{0}|{1}|g" /tmp/yml_tmp/provisioning.yml'.format(
+                    conn.sudo('sed -i "s|{0}|{1}|g" /tmp/yml_tmp/provisioning.yml'.format(
                         item['key'], item['value']))
-                sudo('sed -i "s|SERVICE_BASE_NAME|{0}|g" /tmp/yml_tmp/self-service.yml'.format(service_base_name))
-                sudo('sed -i "s|OPERATION_SYSTEM|redhat|g" /tmp/yml_tmp/self-service.yml')
-                sudo('sed -i "s|<SSN_INSTANCE_SIZE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
+                conn.sudo('sed -i "s|SERVICE_BASE_NAME|{0}|g" /tmp/yml_tmp/self-service.yml'.format(service_base_name))
+                conn.sudo('sed -i "s|OPERATION_SYSTEM|redhat|g" /tmp/yml_tmp/self-service.yml')
+                conn.sudo('sed -i "s|<SSN_INSTANCE_SIZE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
                     os.environ['{0}_ssn_instance_size'.format(os.environ['conf_cloud_provider'])]))
                 if os.environ['conf_cloud_provider'] == 'azure':
-                    sudo('sed -i "s|<LOGIN_USE_LDAP>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(ldap_login))
-                    sudo('sed -i "s|<LOGIN_TENANT_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(tenant_id))
-                    sudo('sed -i "s|<LOGIN_APPLICATION_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(application_id))
-                    sudo('sed -i "s|<DLAB_SUBSCRIPTION_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(subscription_id))
-                    sudo('sed -i "s|<MANAGEMENT_API_AUTH_FILE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(authentication_file))
-                    sudo('sed -i "s|<VALIDATE_PERMISSION_SCOPE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(validate_permission_scope))
-                    sudo('sed -i "s|<LOGIN_APPLICATION_REDIRECT_URL>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(hostname))
-                    sudo('sed -i "s|<LOGIN_PAGE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(hostname))
+                    conn.sudo('sed -i "s|<LOGIN_USE_LDAP>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(ldap_login))
+                    conn.sudo('sed -i "s|<LOGIN_TENANT_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(tenant_id))
+                    conn.sudo('sed -i "s|<LOGIN_APPLICATION_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(application_id))
+                    conn.sudo('sed -i "s|<DATALAB_SUBSCRIPTION_ID>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
+                        subscription_id))
+                    conn.sudo('sed -i "s|<MANAGEMENT_API_AUTH_FILE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(
+                        authentication_file))
+                    conn.sudo('sed -i "s|<VALIDATE_PERMISSION_SCOPE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(validate_permission_scope))
+                    conn.sudo('sed -i "s|<LOGIN_APPLICATION_REDIRECT_URL>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(hostname))
+                    conn.sudo('sed -i "s|<LOGIN_PAGE>|{0}|g" /tmp/yml_tmp/self-service.yml'.format(hostname))
                     # if os.environ['azure_datalake_enable'] == 'true':
                     #     permission_scope = 'subscriptions/{}/resourceGroups/{}/providers/Microsoft.DataLakeStore/accounts/{}/providers/Microsoft.Authorization/'.format(
                     #         subscription_id, service_base_name, data_lake_name
@@ -274,15 +281,15 @@
                     #     permission_scope = 'subscriptions/{}/resourceGroups/{}/providers/Microsoft.Authorization/'.format(
                     #         subscription_id, service_base_name
                     #     )
-                sudo('mv /tmp/yml_tmp/* ' + os.environ['ssn_dlab_path'] + 'conf/')
-                sudo('rmdir /tmp/yml_tmp/')
+                conn.sudo('mv /tmp/yml_tmp/* ' + os.environ['ssn_datalab_path'] + 'conf/')
+                conn.sudo('rmdir /tmp/yml_tmp/')
             except Exception as err:
                 traceback.print_exc()
                 append_result("Unable to upload webapp jars. ", str(err))
                 sys.exit(1)
 
             if billing_enabled:
-                local('scp -i {} /root/scripts/configure_billing.py {}:/tmp/configure_billing.py'.format(keyfile,
+                conn.local('scp -i {} /root/scripts/configure_billing.py {}:/tmp/configure_billing.py'.format(keyfile,
                                                                                                          host_string))
                 params = '--cloud_provider {} ' \
                          '--infrastructure_tag {} ' \
@@ -293,13 +300,13 @@
                          '--aws_job_enabled {} ' \
                          '--report_path "{}" ' \
                          '--mongo_password {} ' \
-                         '--dlab_dir {} ' \
+                         '--datalab_dir {} ' \
                          '--authentication_file "{}" ' \
                          '--offer_number {} ' \
                          '--currency {} ' \
                          '--locale {} ' \
                          '--region_info {} ' \
-                         '--dlab_id {} ' \
+                         '--datalab_id {} ' \
                          '--usage_date {} ' \
                          '--product {} ' \
                          '--usage_type {} ' \
@@ -307,7 +314,10 @@
                          '--cost {} ' \
                          '--resource_id {} ' \
                          '--tags {} ' \
-                         '--billing_dataset_name "{}" '.\
+                         '--billing_dataset_name "{}" ' \
+                         '--keycloak_client_id {} ' \
+                         '--keycloak_client_secret {} ' \
+                         '--keycloak_auth_server_url {} '. \
                             format(cloud_provider,
                                    service_base_name,
                                    tag_resource_id,
@@ -317,13 +327,13 @@
                                    aws_job_enabled,
                                    report_path,
                                    mongo_passwd,
-                                   dlab_path,
+                                   datalab_path,
                                    authentication_file,
                                    offer_number,
                                    currency,
                                    locale,
                                    region_info,
-                                   dlab_id,
+                                   datalab_id,
                                    usage_date,
                                    product,
                                    usage_type,
@@ -331,37 +341,44 @@
                                    cost,
                                    resource_id,
                                    tags,
-                                   billing_dataset_name)
-                sudo('python /tmp/configure_billing.py {}'.format(params))
+                                   billing_dataset_name,
+                                   keycloak_client_id,
+                                   keycloak_client_secret,
+                                   keycloak_auth_server_url)
+                conn.sudo('python3 /tmp/configure_billing.py {}'.format(params))
 
             try:
                 if os.environ['conf_stepcerts_enabled'] == 'true':
-                    sudo('openssl pkcs12 -export -in /etc/ssl/certs/dlab.crt -inkey /etc/ssl/certs/dlab.key -name ssn '
-                         '-out ssn.p12 -password pass:{0}'.format(keystore_passwd))
-                    sudo('keytool -importkeystore -srckeystore ssn.p12 -srcstoretype PKCS12 -alias ssn -destkeystore '
+                    conn.sudo(
+                        'openssl pkcs12 -export -in /etc/ssl/certs/datalab.crt -inkey /etc/ssl/certs/datalab.key -name ssn '
+                        '-out ssn.p12 -password pass:{0}'.format(keystore_passwd))
+                    conn.sudo('keytool -importkeystore -srckeystore ssn.p12 -srcstoretype PKCS12 -alias ssn -destkeystore '
                          '/home/{0}/keys/ssn.keystore.jks -deststorepass "{1}" -srcstorepass "{1}"'.format(
                         os_user, keystore_passwd))
-                    sudo('keytool -keystore /home/{0}/keys/ssn.keystore.jks -alias step-ca -import -file '
+                    conn.sudo('keytool -keystore /home/{0}/keys/ssn.keystore.jks -alias step-ca -import -file '
                          '/etc/ssl/certs/root_ca.crt  -deststorepass "{1}" -srcstorepass "{1}" -noprompt'.format(
                         os_user, keystore_passwd))
-                    sudo('keytool -importcert -trustcacerts -alias step-ca -file /etc/ssl/certs/root_ca.crt '
+                    conn.sudo('keytool -importcert -trustcacerts -alias step-ca -file /etc/ssl/certs/root_ca.crt '
                          '-noprompt -storepass changeit -keystore {1}/lib/security/cacerts'.format(os_user, java_path))
-                    sudo('keytool -importcert -trustcacerts -alias ssn -file /etc/ssl/certs/dlab.crt -noprompt '
+                    conn.sudo('keytool -importcert -trustcacerts -alias ssn -file /etc/ssl/certs/datalab.crt -noprompt '
                          '-storepass changeit -keystore {0}/lib/security/cacerts'.format(java_path))
                 else:
-                    sudo('keytool -genkeypair -alias ssn -keyalg RSA -validity 730 -storepass {1} -keypass {1} \
+                    if os.environ['conf_letsencrypt_enabled'] == 'true':
+                        print(
+                            'Lets Encrypt certificates are not supported for redhat in datalab. Using self signed certificates')
+                    conn.sudo('keytool -genkeypair -alias ssn -keyalg RSA -validity 730 -storepass {1} -keypass {1} \
                          -keystore /home/{0}/keys/ssn.keystore.jks -keysize 2048 -dname "CN=localhost"'.format(
                         os_user, keystore_passwd))
-                    sudo('keytool -exportcert -alias ssn -storepass {1} -file /etc/ssl/certs/dlab.crt \
+                    conn.sudo('keytool -exportcert -alias ssn -storepass {1} -file /etc/ssl/certs/datalab.crt \
                          -keystore /home/{0}/keys/ssn.keystore.jks'.format(os_user, keystore_passwd))
-                    sudo('keytool -importcert -trustcacerts -alias ssn -file /etc/ssl/certs/dlab.crt -noprompt \
+                    conn.sudo('keytool -importcert -trustcacerts -alias ssn -file /etc/ssl/certs/datalab.crt -noprompt \
                          -storepass changeit -keystore {1}/lib/security/cacerts'.format(os_user, java_path))
             except:
                 append_result("Unable to generate cert and copy to java keystore")
                 sys.exit(1)
-            sudo('systemctl restart supervisord')
-            sudo('service nginx restart')
-            sudo('touch ' + os.environ['ssn_dlab_path'] + 'tmp/ss_started')
+            conn.sudo('systemctl restart supervisord')
+            conn.sudo('service nginx restart')
+            conn.sudo('touch ' + os.environ['ssn_datalab_path'] + 'tmp/ss_started')
     except Exception as err:
         traceback.print_exc()
         print('Failed to start Self-service: ', str(err))
@@ -370,18 +387,18 @@
 
 def install_build_dep():
     try:
-        if not exists('{}tmp/build_dep_ensured'.format(os.environ['ssn_dlab_path'])):
+        if not exists(conn,'{}tmp/build_dep_ensured'.format(os.environ['ssn_datalab_path'])):
             maven_version = '3.5.4'
             manage_pkg('-y install', 'remote', 'java-1.8.0-openjdk java-1.8.0-openjdk-devel git wget unzip')
-            with cd('/opt/'):
-                sudo('wget http://mirrors.sonic.net/apache/maven/maven-{0}/{1}/binaries/apache-maven-{1}-bin.zip'.format(
-                    maven_version.split('.')[0], maven_version))
-                sudo('unzip apache-maven-{}-bin.zip'.format(maven_version))
-                sudo('mv apache-maven-{} maven'.format(maven_version))
-            sudo('bash -c "curl --silent --location https://rpm.nodesource.com/setup_12.x | bash -"')
+            conn.sudo(
+                    'cd /opt/ && wget http://mirrors.sonic.net/apache/maven/maven-{0}/{1}/binaries/apache-maven-{1}-bin.zip'.format(
+                        maven_version.split('.')[0], maven_version))
+            conn.sudo('''bash -c 'cd /opt/ &&unzip apache-maven-{}-bin.zip' '''.format(maven_version))
+            conn.sudo('''bash -c 'cd /opt/ &&mv apache-maven-{} maven' '''.format(maven_version))
+            conn.sudo('bash -c "curl --silent --location https://rpm.nodesource.com/setup_12.x | bash -"')
             manage_pkg('-y install', 'remote', 'nodejs')
-            sudo('npm config set unsafe-perm=true')
-            sudo('touch {}tmp/build_dep_ensured'.format(os.environ['ssn_dlab_path']))
+            conn.sudo('npm config set unsafe-perm=true')
+            conn.sudo('touch {}tmp/build_dep_ensured'.format(os.environ['ssn_datalab_path']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to install build dependencies for UI: ', str(err))
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_collect_data.py b/infrastructure-provisioning/src/general/scripts/aws/common_collect_data.py
index e63a63f..14d2bde 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_collect_data.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_collect_data.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,22 +22,19 @@
 # ******************************************************************************
 
 import argparse
-import json
-import datetime
-from fabric.api import *
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-from dlab.fab import *
-import traceback
-import sys
 import ast
-
+import json
+import sys
+import traceback
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--list_resources', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     data = ast.literal_eval(args.list_resources.replace('\'', '"'))
     statuses = {}
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_create_bucket.py b/infrastructure-provisioning/src/general/scripts/aws/common_create_bucket.py
index 207af06..bf98c4d 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_create_bucket.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_create_bucket.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,11 +22,9 @@
 # ******************************************************************************
 
 import argparse
-import json
-from dlab.actions_lib import *
-from dlab.meta_lib import *
 import sys
-
+from datalab.actions_lib import create_s3_bucket
+from datalab.meta_lib import get_bucket_by_name
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket_name', type=str, default='')
@@ -35,7 +33,6 @@
 parser.add_argument('--bucket_name_tag', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     if args.bucket_name != '':
         try:
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_create_instance.py b/infrastructure-provisioning/src/general/scripts/aws/common_create_instance.py
index ecf46be..a626c03 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_create_instance.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_create_instance.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -23,10 +23,9 @@
 
 import argparse
 import json
-from dlab.actions_lib import *
-from dlab.meta_lib import *
 import sys
-
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--node_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_create_notebook_image.py b/infrastructure-provisioning/src/general/scripts/aws/common_create_notebook_image.py
index 1d5cb04..a1ac88b 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_create_notebook_image.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_create_notebook_image.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,20 +21,18 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import sys
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import uuid
 import os
-
+import sys
 
 if __name__ == "__main__":
     try:
         image_conf = dict()
-        dlab.actions_lib.create_aws_config_files()
-        image_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
+        datalab.actions_lib.create_aws_config_files()
+        image_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
             os.environ['conf_service_base_name'][:20], '-', True)
         image_conf['project_name'] = os.environ['project_name']
         image_conf['project_tag'] = os.environ['project_name']
@@ -55,7 +53,7 @@
                               "FIN": image_conf['full_image_name'],
                               os.environ['conf_billing_tag_key']: os.environ['conf_billing_tag_value']}
 
-        ami_id = dlab.meta_lib.get_ami_id_by_name(image_conf['full_image_name'])
+        ami_id = datalab.meta_lib.get_ami_id_by_name(image_conf['full_image_name'])
         if ami_id == '':
             try:
                 os.environ['conf_additional_tags'] = os.environ['conf_additional_tags'] + \
@@ -64,10 +62,10 @@
             except KeyError:
                 os.environ['conf_additional_tags'] = 'project_tag:{0};endpoint_tag:{1}'.format(
                     os.environ['project_name'], os.environ['endpoint_name'])
-            image_id = dlab.actions_lib.create_image_from_instance(tag_name=image_conf['instance_tag'],
-                                                                   instance_name=image_conf['instance_name'],
-                                                                   image_name=image_conf['full_image_name'],
-                                                                   tags=json.dumps(image_conf['tags']))
+            image_id = datalab.actions_lib.create_image_from_instance(tag_name=image_conf['instance_tag'],
+                                                                      instance_name=image_conf['instance_name'],
+                                                                      image_name=image_conf['full_image_name'],
+                                                                      tags=json.dumps(image_conf['tags']))
             print("Image was successfully created. It's name is {}".format(image_conf['full_image_name']))
 
             with open("/root/result.json", 'w') as result:
@@ -79,5 +77,5 @@
                        "Action": "Create image from notebook"}
                 result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to create image from notebook", str(err))
+        datalab.fab.append_result("Failed to create image from notebook", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_create_policy.py b/infrastructure-provisioning/src/general/scripts/aws/common_create_policy.py
index 8b7f038..0fe2fdc 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_create_policy.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_create_policy.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,10 +22,11 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
+import boto3
+import botocore
 import sys
-import boto3, botocore
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_create_role_policy.py b/infrastructure-provisioning/src/general/scripts/aws/common_create_role_policy.py
index 1f914c1..2794e9c 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_create_role_policy.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_create_role_policy.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,9 +22,9 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
 import sys
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--role_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_create_security_group.py b/infrastructure-provisioning/src/general/scripts/aws/common_create_security_group.py
index 4ee0575..b15a1b9 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_create_security_group.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_create_security_group.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,13 +21,11 @@
 #
 # ******************************************************************************
 
-import json
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
+import json
 import sys
-from botocore.exceptions import ClientError
-
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_create_subnet.py b/infrastructure-provisioning/src/general/scripts/aws/common_create_subnet.py
index b4dc3c6..80cffb8 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_create_subnet.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_create_subnet.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,14 +22,13 @@
 # ******************************************************************************
 
 import argparse
-import json
-from botocore import exceptions
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-import sys
 import boto3
 import ipaddress
-
+import json
+import sys
+from botocore import exceptions
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--vpc_id', type=str, default='')
@@ -53,7 +52,7 @@
             private_subnet_size = ipaddress.ip_network(u'0.0.0.0/{}'.format(args.prefix)).num_addresses
             vpc = ec2.Vpc(args.vpc_id)
             vpc_cidr = vpc.cidr_block
-            first_vpc_ip = int(ipaddress.IPv4Address(vpc_cidr.split('/')[0].decode("utf-8")))
+            first_vpc_ip = int(ipaddress.IPv4Address(vpc_cidr.split('/')[0]))
             subnets = list(vpc.subnets.all())
             subnets_cidr = []
             for subnet in subnets:
@@ -69,7 +68,7 @@
             last_ip = first_vpc_ip
             previous_subnet_size = private_subnet_size
             for cidr in sorted_subnets_cidr:
-                first_ip = int(ipaddress.IPv4Address(cidr.split('/')[0].decode("utf-8")))
+                first_ip = int(ipaddress.IPv4Address(cidr.split('/')[0]))
                 if first_ip - last_ip < private_subnet_size or previous_subnet_size < private_subnet_size:
                     subnet_size = ipaddress.ip_network(u'{}'.format(cidr)).num_addresses
                     last_ip = first_ip + subnet_size - 1
@@ -77,18 +76,18 @@
                 else:
                     break
 
-            dlab_subnet_cidr = ''
+            datalab_subnet_cidr = ''
             if previous_subnet_size < private_subnet_size:
                 while True:
                     try:
-                        dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix)
-                        ipaddress.ip_network(dlab_subnet_cidr.decode('utf-8'))
+                        datalab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix)
+                        ipaddress.ip_network(datalab_subnet_cidr.decode('utf-8'))
                         break
                     except ValueError:
                         last_ip = last_ip + 2
                         continue
             else:
-                dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix)
+                datalab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix)
         else:
             pre_defined_subnet_list = []
             subnet_cidr = args.user_subnets_range.split('-')[0].replace(' ', '')
@@ -111,38 +110,41 @@
                 print("There is no available subnet to create. Aborting...")
                 sys.exit(1)
             else:
-                dlab_subnet_cidr = available_subnets[0]
+                datalab_subnet_cidr = available_subnets[0]
         if args.ssn:
-            subnet_id = get_subnet_by_cidr(dlab_subnet_cidr, args.vpc_id)
+            subnet_id = get_subnet_by_cidr(datalab_subnet_cidr, args.vpc_id)
             subnet_check = get_subnet_by_tag(tag, False, args.vpc_id)
         else:
-            subnet_id = get_subnet_by_cidr(dlab_subnet_cidr, args.vpc_id)
+            subnet_id = get_subnet_by_cidr(datalab_subnet_cidr, args.vpc_id)
             subnet_check = get_subnet_by_tag(tag, args.vpc_id)
         if not subnet_check:
             if subnet_id == '':
                 print("Creating subnet {0} in vpc {1} with tag {2}".
-                      format(dlab_subnet_cidr, args.vpc_id, json.dumps(tag)))
-                subnet_id = create_subnet(args.vpc_id, dlab_subnet_cidr, tag, args.zone)
+                      format(datalab_subnet_cidr, args.vpc_id, json.dumps(tag)))
+                subnet_id = create_subnet(args.vpc_id, datalab_subnet_cidr, tag, args.zone)
                 create_tag(subnet_id, tag_name)
         else:
             print("REQUESTED SUBNET ALREADY EXISTS. USING CIDR {}".format(subnet_check))
             subnet_id = get_subnet_by_cidr(subnet_check)
         print("SUBNET_ID: {}".format(subnet_id))
         if not args.ssn:
-            print("Associating route_table with the subnet")
-            ec2 = boto3.resource('ec2')
-            if os.environ['conf_duo_vpc_enable'] == 'true':
-                rt = get_route_table_by_tag(args.infra_tag_value + '-secondary-tag', args.infra_tag_value)
+            if os.environ['edge_is_nat'] == 'true':
+                print('Subnet will be associted with route table for NAT')
             else:
-                rt = get_route_table_by_tag(args.infra_tag_name, args.infra_tag_value)
-            route_table = ec2.RouteTable(rt)
-            try:
-                route_table.associate_with_subnet(SubnetId=subnet_id)
+                print("Associating route_table with the subnet")
+                ec2 = boto3.resource('ec2')
                 if os.environ['conf_duo_vpc_enable'] == 'true':
-                    create_peer_routes(os.environ['aws_peering_id'], args.infra_tag_value)
-            except exceptions.ClientError as err:
-                if 'Resource.AlreadyAssociated' in str(err):
-                    print('Other route table is already associted with this subnet. Skipping...')
+                    rt = get_route_table_by_tag(args.infra_tag_value + '-secondary-tag', args.infra_tag_value)
+                else:
+                    rt = get_route_table_by_tag(args.infra_tag_name, args.infra_tag_value)
+                route_table = ec2.RouteTable(rt)
+                try:
+                    route_table.associate_with_subnet(SubnetId=subnet_id)
+                    if os.environ['conf_duo_vpc_enable'] == 'true':
+                        create_peer_routes(os.environ['aws_peering_id'], args.infra_tag_value)
+                except exceptions.ClientError as err:
+                    if 'Resource.AlreadyAssociated' in str(err):
+                        print('Other route table is already associted with this subnet. Skipping...')
         else:
             print("Associating route_table with the subnet")
             ec2 = boto3.resource('ec2')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_download_git_certfile.py b/infrastructure-provisioning/src/general/scripts/aws/common_download_git_certfile.py
index 8051e6d..535ac06 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_download_git_certfile.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_download_git_certfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,10 +22,10 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
-from fabric.api import *
 import os
-
+from datalab.actions_lib import *
+from fabric import *
+from datalab.fab import replace_multi_symbols
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--keyfile', type=str, default='')
@@ -33,14 +33,10 @@
 parser.add_argument('--os_user', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     create_aws_config_files()
-    env.hosts = "{}".format(args.notebook_ip)
-    env['connection_attempts'] = 100
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
 
     service_base_name = os.environ['conf_service_base_name'] = replace_multi_symbols(
         os.environ['conf_service_base_name'][:20], '-', True)
@@ -49,9 +45,11 @@
     bucket_name = ('{0}-{1}-{2}-bucket'.format(service_base_name,
                                                project_name, endpoint_name)).lower().replace('_', '-')
     gitlab_certfile = os.environ['conf_gitlab_certfile']
-    if dlab.actions_lib.get_gitlab_cert(bucket_name, gitlab_certfile):
-        put(gitlab_certfile, gitlab_certfile)
-        sudo('chown root:root {}'.format(gitlab_certfile))
+    if datalab.actions_lib.get_gitlab_cert(bucket_name, gitlab_certfile):
+        conn.put(gitlab_certfile, gitlab_certfile)
+        conn.sudo('chown root:root {}'.format(gitlab_certfile))
         print('{} has been downloaded'.format(gitlab_certfile))
     else:
         print('There is no {} to download'.format(gitlab_certfile))
+
+    conn.close()
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_notebook_configure_dataengine-service.py b/infrastructure-provisioning/src/general/scripts/aws/common_notebook_configure_dataengine-service.py
index 1d0df4f..4d542b4 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_notebook_configure_dataengine-service.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_notebook_configure_dataengine-service.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,24 +21,24 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import logging
 import os
-import uuid
-from fabric.api import *
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 
 def clear_resources():
-    emr_id = dlab.meta_lib.get_emr_id_by_name(notebook_config['cluster_name'])
-    dlab.actions_lib.terminate_emr(emr_id)
-    dlab.actions_lib. remove_kernels(notebook_config['cluster_name'], notebook_config['tag_name'],
-                                     os.environ['notebook_instance_name'], os.environ['conf_os_user'],
-                                     notebook_config['key_path'], os.environ['emr_version'])
+    emr_id = datalab.meta_lib.get_emr_id_by_name(notebook_config['cluster_name'])
+    datalab.actions_lib.terminate_emr(emr_id)
+    datalab.actions_lib.remove_kernels(notebook_config['cluster_name'], notebook_config['tag_name'],
+                                       os.environ['notebook_instance_name'], os.environ['conf_os_user'],
+                                       notebook_config['key_path'], os.environ['emr_version'])
 
 
 if __name__ == "__main__":
@@ -50,35 +50,36 @@
                         filename=local_log_filepath)
     try:
         # generating variables dictionary
-        dlab.actions_lib.create_aws_config_files()
+        datalab.actions_lib.create_aws_config_files()
         print('Generating infrastructure names and tags')
         notebook_config = dict()
-        notebook_config['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
-                os.environ['conf_service_base_name'][:20], '-', True)
+        notebook_config['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
+            os.environ['conf_service_base_name'][:20], '-', True)
         notebook_config['notebook_name'] = os.environ['notebook_instance_name']
         notebook_config['tag_name'] = notebook_config['service_base_name'] + '-tag'
         notebook_config['project_name'] = os.environ['project_name']
         notebook_config['endpoint_name'] = os.environ['endpoint_name']
         notebook_config['bucket_name'] = '{0}-{1}-{2}-bucket'.format(notebook_config['service_base_name'],
-                                                                      notebook_config['project_name'],
-                                                                      notebook_config['endpoint_name']
+                                                                     notebook_config['project_name'],
+                                                                     notebook_config['endpoint_name']
                                                                      ).lower().replace('_', '-')
-        notebook_config['cluster_name'] = dlab.meta_lib.get_not_configured_emr(notebook_config['tag_name'],
-                                                                               notebook_config['notebook_name'], True)
-        notebook_config['notebook_ip'] = dlab.meta_lib.get_instance_ip_address(
+        notebook_config['cluster_name'] = datalab.meta_lib.get_not_configured_emr(notebook_config['tag_name'],
+                                                                                  notebook_config['notebook_name'],
+                                                                                  True)
+        notebook_config['notebook_ip'] = datalab.meta_lib.get_instance_ip_address(
             notebook_config['tag_name'], notebook_config['notebook_name']).get('Private')
         notebook_config['key_path'] = os.environ['conf_key_dir'] + '/' + os.environ['conf_key_name'] + '.pem'
-        notebook_config['cluster_id'] = dlab.meta_lib.get_emr_id_by_name(notebook_config['cluster_name'])
+        notebook_config['cluster_id'] = datalab.meta_lib.get_emr_id_by_name(notebook_config['cluster_name'])
         edge_instance_name = '{}-{}-{}-edge'.format(notebook_config['service_base_name'],
                                                     os.environ['project_name'], os.environ['endpoint_name'])
-        edge_instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
+        edge_instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
         if os.environ['application'] == 'deeplearning':
             application = 'jupyter'
         else:
             application = os.environ['application']
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
 
     try:
@@ -93,15 +94,15 @@
                     os.environ['conf_os_user'], edge_instance_hostname, '3128', os.environ['notebook_scala_version'],
                     os.environ['application'], os.environ['conf_pypi_mirror'])
         try:
-            local("~/scripts/{}_{}.py {}".format(application, 'install_dataengine-service_kernels', params))
-            dlab.actions_lib.remove_emr_tag(notebook_config['cluster_id'], ['State'])
-            dlab.actions_lib.tag_emr_volume(notebook_config['cluster_id'], notebook_config['cluster_name'],
-                                            os.environ['conf_tag_resource_id'])
+            subprocess.run("~/scripts/{}_{}.py {}".format(application, 'install_dataengine-service_kernels', params), shell=True, check=True)
+            datalab.actions_lib.remove_emr_tag(notebook_config['cluster_id'], ['State'])
+            datalab.actions_lib.tag_emr_volume(notebook_config['cluster_id'], notebook_config['cluster_name'],
+                                               os.environ['conf_tag_resource_id'])
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing EMR kernels.", str(err))
+        datalab.fab.append_result("Failed installing EMR kernels.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -115,15 +116,15 @@
                     notebook_config['key_path'],
                     os.environ['conf_os_user'])
         try:
-            local("~/scripts/{0}.py {1}".format('common_configure_spark', params))
-            dlab.actions_lib.remove_emr_tag(notebook_config['cluster_id'], ['State'])
-            dlab.actions_lib.tag_emr_volume(notebook_config['cluster_id'], notebook_config['cluster_name'],
-                                            os.environ['conf_tag_resource_id'])
+            subprocess.run("~/scripts/{0}.py {1}".format('common_configure_spark', params), shell=True, check=True)
+            datalab.actions_lib.remove_emr_tag(notebook_config['cluster_id'], ['State'])
+            datalab.actions_lib.tag_emr_volume(notebook_config['cluster_id'], notebook_config['cluster_name'],
+                                               os.environ['conf_tag_resource_id'])
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure Spark.", str(err))
+        datalab.fab.append_result("Failed to configure Spark.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -135,6 +136,6 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_notebook_configure_dataengine.py b/infrastructure-provisioning/src/general/scripts/aws/common_notebook_configure_dataengine.py
index c80328b..adf6e07 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_notebook_configure_dataengine.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_notebook_configure_dataengine.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,23 +21,23 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import logging
 import os
-import uuid
-from fabric.api import *
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 
 def clear_resources():
-    dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['master_node_name'])
+    datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['master_node_name'])
     for i in range(notebook_config['instance_count'] - 1):
         slave_name = notebook_config['slave_node_name'] + '{}'.format(i + 1)
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], slave_name)
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], slave_name)
 
 
 if __name__ == "__main__":
@@ -50,7 +50,7 @@
 
     try:
         # generating variables dictionary
-        dlab.actions_lib.create_aws_config_files()
+        datalab.actions_lib.create_aws_config_files()
         print('Generating infrastructure names and tags')
         notebook_config = dict()
         if 'exploratory_name' in os.environ:
@@ -61,7 +61,7 @@
             notebook_config['computational_name'] = os.environ['computational_name']
         else:
             notebook_config['computational_name'] = ''
-        notebook_config['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
+        notebook_config['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
             os.environ['conf_service_base_name'][:20], '-', True)
         notebook_config['region'] = os.environ['aws_region']
         notebook_config['tag_name'] = notebook_config['service_base_name'] + '-tag'
@@ -75,21 +75,21 @@
         notebook_config['slave_node_name'] = notebook_config['cluster_name'] + '-s'
         notebook_config['notebook_name'] = os.environ['notebook_instance_name']
         notebook_config['key_path'] = os.environ['conf_key_dir'] + '/' + os.environ['conf_key_name'] + '.pem'
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['instance_count'] = int(os.environ['dataengine_instance_count'])
         try:
-            notebook_config['spark_master_ip'] = dlab.meta_lib.get_instance_private_ip_address(
+            notebook_config['spark_master_ip'] = datalab.meta_lib.get_instance_private_ip_address(
                 notebook_config['tag_name'], notebook_config['master_node_name'])
-            notebook_config['notebook_ip'] = dlab.meta_lib.get_instance_private_ip_address(
+            notebook_config['notebook_ip'] = datalab.meta_lib.get_instance_private_ip_address(
                 notebook_config['tag_name'], notebook_config['notebook_name'])
         except Exception as err:
-            dlab.fab.append_result("Failed to get ip address", str(err))
+            datalab.fab.append_result("Failed to get ip address", str(err))
             sys.exit(1)
         notebook_config['spark_master_url'] = 'spark://{}:7077'.format(notebook_config['spark_master_ip'])
 
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to generate infrastructure names", str(err))
+        datalab.fab.append_result("Failed to generate infrastructure names", str(err))
         sys.exit(1)
 
     try:
@@ -98,17 +98,17 @@
         params = "--cluster_name {0} --spark_version {1} --hadoop_version {2} --os_user {3} --spark_master {4}" \
                  " --keyfile {5} --notebook_ip {6} --spark_master_ip {7}".\
             format(notebook_config['cluster_name'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], notebook_config['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], notebook_config['datalab_ssh_user'],
                    notebook_config['spark_master_url'], notebook_config['key_path'],
                    notebook_config['notebook_ip'], notebook_config['spark_master_ip'])
         try:
-            local("~/scripts/{}_{}.py {}".format(os.environ['application'], 'install_dataengine_kernels', params))
+            subprocess.run("~/scripts/{}_{}.py {}".format(os.environ['application'], 'install_dataengine_kernels', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed installing Dataengine kernels.", str(err))
+        datalab.fab.append_result("Failed installing Dataengine kernels.", str(err))
         sys.exit(1)
 
     try:
@@ -120,16 +120,16 @@
                  "--cluster_name {3}" \
             .format(notebook_config['notebook_ip'],
                     notebook_config['key_path'],
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     notebook_config['cluster_name'])
         try:
-            local("~/scripts/{0}.py {1}".format('common_configure_spark', params))
+            subprocess.run("~/scripts/{0}.py {1}".format('common_configure_spark', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure Spark.", str(err))
+        datalab.fab.append_result("Failed to configure Spark.", str(err))
         sys.exit(1)
 
     try:
@@ -139,6 +139,6 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_prepare_notebook.py b/infrastructure-provisioning/src/general/scripts/aws/common_prepare_notebook.py
index 5c481ac..ad7f59d 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_prepare_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_prepare_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,17 @@
 #
 # ******************************************************************************
 
-import logging
-import json
-import sys
-import os
 import argparse
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
+import json
+import logging
+import os
+import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-from fabric.api import *
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--uuid', type=str, default='')
@@ -46,7 +47,7 @@
                         filename=local_log_filepath)
     try:
         # generating variables dictionary
-        dlab.actions_lib.create_aws_config_files()
+        datalab.actions_lib.create_aws_config_files()
         notebook_config = dict()
         notebook_config['service_base_name'] = os.environ['conf_service_base_name']
         notebook_config['project_name'] = os.environ['project_name']
@@ -54,17 +55,18 @@
         notebook_config['edge_name'] = '{}-{}-{}-edge'.format(notebook_config['service_base_name'],
                                                               notebook_config['project_name'],
                                                               notebook_config['endpoint_name'])
-        edge_status = dlab.meta_lib.get_instance_status(notebook_config['service_base_name'] + '-tag',
-                                                        notebook_config['edge_name'])
+        edge_status = datalab.meta_lib.get_instance_status(notebook_config['service_base_name'] + '-tag',
+                                                           notebook_config['edge_name'])
         if edge_status != 'running':
             logging.info('ERROR: Edge node is unavailable! Aborting...')
             print('ERROR: Edge node is unavailable! Aborting...')
-            notebook_config['ssn_hostname'] = dlab.meta_lib.get_instance_hostname(
+            notebook_config['ssn_hostname'] = datalab.meta_lib.get_instance_hostname(
                 '{}-tag'.format(notebook_config['service_base_name']),
                 '{}-ssn'.format(notebook_config['service_base_name']))
-            dlab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_dlab_path'], os.environ['conf_os_user'],
-                                         notebook_config['ssn_hostname'])
-            dlab.fab.append_result("Edge node is unavailable")
+            datalab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_datalab_path'],
+                                            os.environ['conf_os_user'],
+                                            notebook_config['ssn_hostname'])
+            datalab.fab.append_result("Edge node is unavailable")
             sys.exit(1)
         print('Generating infrastructure names and tags')
         try:
@@ -78,7 +80,7 @@
                                                                       notebook_config['project_name'],
                                                                       notebook_config['endpoint_name'],
                                                                       notebook_config['exploratory_name'], args.uuid)
-        notebook_config['primary_disk_size'] = (lambda x: '30' if x == 'deeplearning' else '12')(
+        notebook_config['primary_disk_size'] = (lambda x: '100' if x == 'deeplearning' else '16')(
             os.environ['application'])
         notebook_config['role_profile_name'] = '{}-{}-{}-nb-de-profile'.format(
             notebook_config['service_base_name'], notebook_config['project_name'], notebook_config['endpoint_name'])
@@ -99,9 +101,11 @@
             os.environ['application'], os.environ['notebook_image_name']) if (x != 'None' and x != '')
             else notebook_config['expected_image_name'])(str(os.environ.get('notebook_image_name')))
         print('Searching pre-configured images')
-        notebook_config['ami_id'] = dlab.meta_lib.get_ami_id(os.environ['aws_{}_image_name'.format(
+        notebook_config['ami_id'] = datalab.meta_lib.get_ami_id(os.environ['aws_{}_image_name'.format(
             os.environ['conf_os_family'])])
-        image_id = dlab.meta_lib.get_ami_id_by_name(notebook_config['notebook_image_name'], 'available')
+        image_id = datalab.meta_lib.get_ami_id_by_name(notebook_config['notebook_image_name'], 'available')
+        if os.environ['conf_deeplearning_cloud_ami'] == 'true' and os.environ['application'] == 'deeplearning' and image_id == '':
+            image_id = datalab.meta_lib.get_ami_id(os.environ['notebook_image_name'])
         if image_id != '':
             notebook_config['ami_id'] = image_id
             print('Pre-configured image found. Using: {}'.format(notebook_config['ami_id']))
@@ -112,7 +116,7 @@
         tag = {"Key": notebook_config['tag_name'],
                "Value": "{}-{}-{}-subnet".format(notebook_config['service_base_name'], notebook_config['project_name'],
                                                  notebook_config['endpoint_name'])}
-        notebook_config['subnet_cidr'] = dlab.meta_lib.get_subnet_by_tag(tag)
+        notebook_config['subnet_cidr'] = datalab.meta_lib.get_subnet_by_tag(tag)
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
 
         with open('/root/result.json', 'w') as f:
@@ -128,7 +132,7 @@
 
         print('Additional tags will be added: {}'.format(os.environ['conf_additional_tags']))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
 
     # launching instance for notebook server
@@ -138,20 +142,19 @@
         params = "--node_name {} --ami_id {} --instance_type {} --key_name {} --security_group_ids {} --subnet_id {} " \
                  "--iam_profile {} --infra_tag_name {} --infra_tag_value {} --instance_class {} " \
                  "--instance_disk_size {} --primary_disk_size {}" .format(
-                  notebook_config['instance_name'], notebook_config['ami_id'], notebook_config['instance_type'],
-                  notebook_config['key_name'],
-                  dlab.meta_lib.get_security_group_by_name(notebook_config['security_group_name']),
-                  dlab.meta_lib.get_subnet_by_cidr(notebook_config['subnet_cidr'], os.environ['aws_notebook_vpc_id']),
-                  notebook_config['role_profile_name'],
-                  notebook_config['tag_name'], notebook_config['instance_name'], instance_class,
-                  os.environ['notebook_disk_size'], notebook_config['primary_disk_size'])
+            notebook_config['instance_name'], notebook_config['ami_id'], notebook_config['instance_type'],
+            notebook_config['key_name'],
+            datalab.meta_lib.get_security_group_by_name(notebook_config['security_group_name']),
+            datalab.meta_lib.get_subnet_by_cidr(notebook_config['subnet_cidr'], os.environ['aws_notebook_vpc_id']),
+            notebook_config['role_profile_name'],
+            notebook_config['tag_name'], notebook_config['instance_name'], instance_class,
+            os.environ['notebook_disk_size'], notebook_config['primary_disk_size'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
 
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create instance.", str(err))
+        datalab.fab.append_result("Failed to create instance.", str(err))
         sys.exit(1)
-
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_put_to_bucket.py b/infrastructure-provisioning/src/general/scripts/aws/common_put_to_bucket.py
index 8f433fe..66ea63b 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_put_to_bucket.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_put_to_bucket.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,8 +22,8 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
 import sys
+from datalab.actions_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_remove_remote_kernels.py b/infrastructure-provisioning/src/general/scripts/aws/common_remove_remote_kernels.py
index 826bff4..e1af215 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_remove_remote_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_remove_remote_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,12 +21,11 @@
 #
 # ******************************************************************************
 
-import os
-import sys
 import argparse
-from fabric.api import *
-from dlab.fab import find_cluster_kernels
-from dlab.actions_lib import *
+import sys
+from datalab.actions_lib import remove_dataengine_kernels, remove_kernels
+from datalab.fab import init_datalab_connection, find_cluster_kernels
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -39,9 +38,8 @@
 
 if __name__ == "__main__":
     print('Configure connections')
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     try:
         de_clusters, des_clusters = find_cluster_kernels()
@@ -50,8 +48,8 @@
         for cluster in des_clusters:
             remove_kernels(cluster.split('/')[1], args.nb_tag_name, args.nb_tag_value,
                            args.os_user, args.keyfile, cluster.split('/')[0])
+        conn.close()
+        sys.exit(0)
     except Exception as err:
         print('Failed to remove cluster kernels.', str(err))
-        sys.exit(1)
-
-    sys.exit(0)
\ No newline at end of file
+        sys.exit(1)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_reupload_key.py b/infrastructure-provisioning/src/general/scripts/aws/common_reupload_key.py
index 3fd8adf..d80f53a 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_reupload_key.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_reupload_key.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -23,11 +23,11 @@
 
 
 import argparse
-from fabric.api import *
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-from dlab.fab import *
-import json
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--conf_resource', type=str, default='')
@@ -46,7 +46,7 @@
         params = "--user {} --hostname {} --keyfile '{}' --additional_config '{}'".format(
             args.os_user, ip, args.keyfile, args.additional_config)
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except Exception as err:
             print('Error: {0}'.format(err))
             sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_start_notebook.py b/infrastructure-provisioning/src/general/scripts/aws/common_start_notebook.py
index d153082..22c0d5e 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_start_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_start_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import logging
 import os
-import uuid
-import argparse
-from fabric.api import *
-
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -42,7 +40,7 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    dlab.actions_lib.create_aws_config_files()
+    datalab.actions_lib.create_aws_config_files()
     print('Generating infrastructure names and tags')
     notebook_config = dict()
     notebook_config['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -55,10 +53,10 @@
         params = "--tag_name {} --nb_tag_value {}".format(notebook_config['tag_name'], notebook_config['notebook_name'])
         try:
             print("Starting notebook")
-            dlab.actions_lib.start_ec2(notebook_config['tag_name'], notebook_config['notebook_name'])
+            datalab.actions_lib.start_ec2(notebook_config['tag_name'], notebook_config['notebook_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to start notebook.", str(err))
+            datalab.fab.append_result("Failed to start notebook.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -66,16 +64,16 @@
     try:
         logging.info('[SETUP USER GIT CREDENTIALS]')
         print('[SETUP USER GIT CREDENTIALS]')
-        notebook_config['notebook_ip'] = dlab.meta_lib.get_instance_ip_address(
+        notebook_config['notebook_ip'] = datalab.meta_lib.get_instance_ip_address(
             notebook_config['tag_name'], notebook_config['notebook_name']).get('Private')
         notebook_config['keyfile'] = '{}{}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
             .format(os.environ['conf_os_user'], notebook_config['notebook_ip'], notebook_config['keyfile'])
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to setup git credentials.", str(err))
+            datalab.fab.append_result("Failed to setup git credentials.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -86,18 +84,18 @@
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
             .format(os.environ['conf_os_user'], notebook_config['notebook_ip'], notebook_config['keyfile'])
         try:
-            local("~/scripts/{}.py {}".format('update_inactivity_on_start', params))
+            subprocess.run("~/scripts/{}.py {}".format('update_inactivity_on_start', params), shell=True, check=True)
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to update last activity time.", str(err))
+            datalab.fab.append_result("Failed to update last activity time.", str(err))
             raise Exception
     except:
         sys.exit(1)
 
     try:
-        ip_address = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                           notebook_config['notebook_name']).get('Private')
-        dns_name = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['notebook_name'])
+        ip_address = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                              notebook_config['notebook_name']).get('Private')
+        dns_name = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['notebook_name'])
         print('[SUMMARY]')
         logging.info('[SUMMARY]')
         print("Instance name: {}".format(notebook_config['notebook_name']))
@@ -112,7 +110,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
-
-
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_stop_notebook.py b/infrastructure-provisioning/src/general/scripts/aws/common_stop_notebook.py
index 679d4eb..9ddcdf4 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_stop_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_stop_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,25 +21,21 @@
 #
 # ******************************************************************************
 
-import logging
-import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-from fabric.api import *
-import traceback
-import os
-import uuid
 import boto3
-import argparse
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
+import json
+import logging
+import os
 import sys
+from fabric import *
 
 
 def stop_notebook(nb_tag_value, bucket_name, tag_name, ssh_user, key_path):
     print('Terminating EMR cluster and cleaning EMR config from S3 bucket')
     try:
-        clusters_list = dlab.meta_lib.get_emr_list(nb_tag_value, 'Value')
+        clusters_list = datalab.meta_lib.get_emr_list(nb_tag_value, 'Value')
         if clusters_list:
             for cluster_id in clusters_list:
                 computational_name = ''
@@ -51,12 +47,12 @@
                 for tag in cluster.get('Tags'):
                     if tag.get('Key') == 'ComputationalName':
                         computational_name = tag.get('Value')
-                dlab.actions_lib.s3_cleanup(bucket_name, emr_name, os.environ['project_name'])
+                datalab.actions_lib.s3_cleanup(bucket_name, emr_name, os.environ['project_name'])
                 print("The bucket {} has been cleaned successfully".format(bucket_name))
-                dlab.actions_lib.terminate_emr(cluster_id)
+                datalab.actions_lib.terminate_emr(cluster_id)
                 print("The EMR cluster {} has been terminated successfully".format(emr_name))
-                dlab.actions_lib.remove_kernels(emr_name, tag_name, nb_tag_value, ssh_user, key_path, emr_version,
-                                                computational_name)
+                datalab.actions_lib.remove_kernels(emr_name, tag_name, nb_tag_value, ssh_user, key_path, emr_version,
+                                                   computational_name)
                 print("{} kernels have been removed from notebook successfully".format(emr_name))
         else:
             print("There are no EMR clusters to terminate.")
@@ -67,22 +63,22 @@
     try:
         cluster_list = []
         master_ids = []
-        cluster_instances_list = dlab.meta_lib.get_ec2_list('dataengine_notebook_name', nb_tag_value)
+        cluster_instances_list = datalab.meta_lib.get_ec2_list('dataengine_notebook_name', nb_tag_value)
         for instance in cluster_instances_list:
             for tag in instance.tags:
                 if tag['Key'] == 'Type' and tag['Value'] == 'master':
                     master_ids.append(instance.id)
         for id in master_ids:
-            for tag in dlab.meta_lib.get_instance_attr(id, 'tags'):
+            for tag in datalab.meta_lib.get_instance_attr(id, 'tags'):
                 if tag['Key'] == 'Name':
                     cluster_list.append(tag['Value'].replace(' ', '')[:-2])
-        dlab.actions_lib.stop_ec2('dataengine_notebook_name', nb_tag_value)
+        datalab.actions_lib.stop_ec2('dataengine_notebook_name', nb_tag_value)
     except:
         sys.exit(1)
 
     print("Stopping notebook")
     try:
-        dlab.actions_lib.stop_ec2(tag_name, nb_tag_value)
+        datalab.actions_lib.stop_ec2(tag_name, nb_tag_value)
     except:
         sys.exit(1)
 
@@ -96,7 +92,7 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    dlab.actions_lib.create_aws_config_files()
+    datalab.actions_lib.create_aws_config_files()
     print('Generating infrastructure names and tags')
     notebook_config = dict()
     notebook_config['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -117,7 +113,7 @@
                       os.environ['conf_os_user'], notebook_config['key_path'])
     except Exception as err:
         print('Error: {0}'.format(err))
-        dlab.fab.append_result("Failed to stop notebook.", str(err))
+        datalab.fab.append_result("Failed to stop notebook.", str(err))
         sys.exit(1)
 
 
@@ -130,6 +126,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
-
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_terminate_notebook.py b/infrastructure-provisioning/src/general/scripts/aws/common_terminate_notebook.py
index c199089..5a90d1b 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_terminate_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_terminate_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,22 +21,21 @@
 #
 # ******************************************************************************
 
-import logging
-import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
-import os
 import boto3
-import uuid
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
+import json
+import logging
+import os
+import sys
+import traceback
 
 
 def terminate_nb(nb_tag_value, bucket_name, tag_name):
     print('Terminating EMR cluster and cleaning EMR config from S3 bucket')
     try:
-        clusters_list = dlab.meta_lib.get_emr_list(nb_tag_value, 'Value')
+        clusters_list = datalab.meta_lib.get_emr_list(nb_tag_value, 'Value')
         if clusters_list:
             for cluster_id in clusters_list:
                 client = boto3.client('emr')
@@ -44,10 +43,10 @@
                 cluster = cluster.get("Cluster")
                 emr_name = cluster.get('Name')
                 print('Cleaning bucket from configs for cluster {}'.format(emr_name))
-                dlab.actions_lib.s3_cleanup(bucket_name, emr_name, os.environ['project_name'])
+                datalab.actions_lib.s3_cleanup(bucket_name, emr_name, os.environ['project_name'])
                 print("The bucket {} has been cleaned successfully".format(bucket_name))
                 print('Terminating cluster {}'.format(emr_name))
-                dlab.actions_lib.terminate_emr(cluster_id)
+                datalab.actions_lib.terminate_emr(cluster_id)
                 print("The EMR cluster {} has been terminated successfully".format(emr_name))
         else:
             print("There are no EMR clusters to terminate.")
@@ -56,13 +55,13 @@
 
     print("Terminating data engine cluster")
     try:
-        dlab.actions_lib.remove_ec2('dataengine_notebook_name', nb_tag_value)
+        datalab.actions_lib.remove_ec2('dataengine_notebook_name', nb_tag_value)
     except:
         sys.exit(1)
 
     print("Terminating notebook")
     try:
-        dlab.actions_lib.remove_ec2(tag_name, nb_tag_value)
+        datalab.actions_lib.remove_ec2(tag_name, nb_tag_value)
     except:
         sys.exit(1)
 
@@ -75,7 +74,7 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    dlab.actions_lib.create_aws_config_files()
+    datalab.actions_lib.create_aws_config_files()
     print('Generating infrastructure names and tags')
     notebook_config = dict()
     notebook_config['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -95,7 +94,7 @@
             terminate_nb(notebook_config['notebook_name'], notebook_config['bucket_name'], notebook_config['tag_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate notebook.", str(err))
+            datalab.fab.append_result("Failed to terminate notebook.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -109,5 +108,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/common_terminate_notebook_image.py b/infrastructure-provisioning/src/general/scripts/aws/common_terminate_notebook_image.py
index 3da4f63..e076c51 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/common_terminate_notebook_image.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/common_terminate_notebook_image.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,23 +21,22 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import sys
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
 import os
-
+import sys
 
 if __name__ == "__main__":
     try:
-        dlab.actions_lib.create_aws_config_files()
+        datalab.actions_lib.create_aws_config_files()
         image_conf = dict()
         image_conf['full_image_name'] = os.environ['notebook_image_name']
 
-        image_id = dlab.meta_lib.get_ami_id_by_name(image_conf['full_image_name'], 'available')
+        image_id = datalab.meta_lib.get_ami_id_by_name(image_conf['full_image_name'], 'available')
         if image_id != '':
-            dlab.actions_lib.deregister_image(image_conf['full_image_name'])
+            datalab.actions_lib.deregister_image(image_conf['full_image_name'])
 
             with open("/root/result.json", 'w') as result:
                 res = {"notebook_image_name": image_conf['full_image_name'],
@@ -45,5 +44,5 @@
                        "Action": "Delete existing notebook image"}
                 result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to delete existing notebook image", str(err))
+        datalab.fab.append_result("Failed to delete existing notebook image", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_configure.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_configure.py
index 9e9fb40..2cbec9b 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,19 +21,19 @@
 #
 # ******************************************************************************
 
-import json
-import time
-from fabric.api import *
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
-import sys
-import os
-import logging
 import argparse
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
+import json
+import logging
 import multiprocessing
-
+import os
+import sys
+import traceback
+from datalab.common_lib import manage_pkg
+from fabric import *
+import subprocess
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--uuid', type=str, default='')
@@ -43,19 +43,19 @@
 def configure_dataengine_service(instance, emr_conf):
     emr_conf['instance_ip'] = instance.get('PrivateIpAddress')
     try:
-        logging.info('[CREATING DLAB SSH USER ON DATAENGINE SERVICE]')
-        print('[CREATING DLAB SSH USER ON DATAENGINE SERVICE]')
+        logging.info('[CREATING DATALAB SSH USER ON DATAENGINE SERVICE]')
+        print('[CREATING DATALAB SSH USER ON DATAENGINE SERVICE]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format \
             (emr_conf['instance_ip'], emr_conf['key_path'], emr_conf['initial_user'],
              emr_conf['os_user'], emr_conf['sudo_group'])
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create dlab ssh user.", str(err))
-        dlab.actions_lib.terminate_emr(emr_conf['cluster_id'])
+        datalab.fab.append_result("Failed to create DataLab ssh user.", str(err))
+        datalab.actions_lib.terminate_emr(emr_conf['cluster_id'])
         sys.exit(1)
 
     # configuring proxy on Data Engine service
@@ -67,32 +67,32 @@
             .format(emr_conf['instance_ip'], emr_conf['cluster_name'], emr_conf['key_path'],
                     json.dumps(additional_config), emr_conf['os_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
-        dlab.actions_lib.terminate_emr(emr_conf['cluster_id'])
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.actions_lib.terminate_emr(emr_conf['cluster_id'])
         sys.exit(1)
 
     try:
         logging.info('[CONFIGURE DATAENGINE SERVICE]')
         print('[CONFIGURE DATAENGINE SERVICE]')
         try:
-            dlab.fab.configure_data_engine_service_pip(emr_conf['instance_ip'], emr_conf['os_user'],
-                                                       emr_conf['key_path'])
-            env['connection_attempts'] = 100
-            env.key_filename = emr_conf['key_path']
-            env.host_string = emr_conf['os_user'] + '@' + emr_conf['instance_ip']
-            sudo('echo "[main]" > /etc/yum/pluginconf.d/priorities.conf ; echo "enabled = 0" >> '
-                 '/etc/yum/pluginconf.d/priorities.conf')
+            datalab.fab.configure_data_engine_service_pip(emr_conf['instance_ip'], emr_conf['os_user'],
+                                                          emr_conf['key_path'], True)
+            global conn
+            conn = datalab.fab.init_datalab_connection(emr_conf['instance_ip'], emr_conf['os_user'], emr_conf['key_path'])
+            conn.sudo('''bash -c 'echo "[main]" > /etc/yum/pluginconf.d/priorities.conf ; echo "enabled = 0" >> /etc/yum/pluginconf.d/priorities.conf' ''')
+            manage_pkg('-y install', 'remote', 'R-devel')
+            conn.close()
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure dataengine service.", str(err))
-        dlab.actions_lib.terminate_emr(emr_conf['cluster_id'])
+        datalab.fab.append_result("Failed to configure dataengine service.", str(err))
+        datalab.actions_lib.terminate_emr(emr_conf['cluster_id'])
         sys.exit(1)
 
 
@@ -128,13 +128,13 @@
                     emr_conf['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed edge reverse proxy template", str(err))
-        dlab.actions_lib.terminate_emr(emr_conf['cluster_id'])
+        datalab.fab.append_result("Failed edge reverse proxy template", str(err))
+        datalab.actions_lib.terminate_emr(emr_conf['cluster_id'])
         sys.exit(1)
 
     try:
@@ -144,13 +144,13 @@
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             emr_conf['instance_ip'], emr_conf['key_path'], json.dumps(additional_config), emr_conf['os_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key", str(err))
-        dlab.actions_lib.terminate_emr(emr_conf['cluster_id'])
+        datalab.fab.append_result("Failed installing users key", str(err))
+        datalab.actions_lib.terminate_emr(emr_conf['cluster_id'])
         sys.exit(1)
 
 
@@ -163,7 +163,7 @@
                         filename=local_log_filepath)
 
     try:
-        dlab.actions_lib.create_aws_config_files()
+        datalab.actions_lib.create_aws_config_files()
         print('Generating infrastructure names and tags')
         emr_conf = dict()
         if 'exploratory_name' in os.environ:
@@ -174,7 +174,7 @@
             emr_conf['computational_name'] = os.environ['computational_name']
         else:
             emr_conf['computational_name'] = ''
-        emr_conf['apps'] = 'Hadoop Hive Hue Spark'
+        emr_conf['apps'] = 'Hadoop Hive Hue Spark Livy'
         emr_conf['service_base_name'] = os.environ['conf_service_base_name']
         emr_conf['project_name'] = os.environ['project_name']
         emr_conf['endpoint_name'] = os.environ['endpoint_name']
@@ -185,7 +185,7 @@
         emr_conf['master_instance_type'] = os.environ['emr_master_instance_type']
         emr_conf['slave_instance_type'] = os.environ['emr_slave_instance_type']
         emr_conf['instance_count'] = os.environ['emr_instance_count']
-        emr_conf['notebook_ip'] = dlab.meta_lib.get_instance_ip_address(
+        emr_conf['notebook_ip'] = datalab.meta_lib.get_instance_ip_address(
             emr_conf['tag_name'], os.environ['notebook_instance_name']).get('Private')
         emr_conf['network_type'] = os.environ['conf_network_type']
         emr_conf['role_service_name'] = os.environ['emr_service_role']
@@ -207,7 +207,7 @@
                                                                emr_conf['endpoint_name']).lower().replace('_', '-')
         tag = {"Key": "{}-tag".format(emr_conf['service_base_name']), "Value": "{}-{}-{}-subnet".format(
             emr_conf['service_base_name'], emr_conf['project_name'], emr_conf['endpoint_name'])}
-        emr_conf['subnet_cidr'] = dlab.meta_lib.get_subnet_by_tag(tag)
+        emr_conf['subnet_cidr'] = datalab.meta_lib.get_subnet_by_tag(tag)
         emr_conf['key_path'] = '{}/{}.pem'.format(os.environ['conf_key_dir'],
                                                   os.environ['conf_key_name'])
         emr_conf['all_ip_cidr'] = '0.0.0.0/0'
@@ -215,23 +215,23 @@
                                                                                    emr_conf['project_name'],
                                                                                    emr_conf['endpoint_name'])
         emr_conf['vpc_id'] = os.environ['aws_vpc_id']
-        emr_conf['cluster_id'] = dlab.meta_lib.get_emr_id_by_name(emr_conf['cluster_name'])
-        emr_conf['cluster_instances'] = dlab.meta_lib.get_emr_instances_list(emr_conf['cluster_id'])
-        emr_conf['cluster_master_instances'] = dlab.meta_lib.get_emr_instances_list(emr_conf['cluster_id'], 'MASTER')
-        emr_conf['cluster_core_instances'] = dlab.meta_lib.get_emr_instances_list(emr_conf['cluster_id'], 'CORE')
+        emr_conf['cluster_id'] = datalab.meta_lib.get_emr_id_by_name(emr_conf['cluster_name'])
+        emr_conf['cluster_instances'] = datalab.meta_lib.get_emr_instances_list(emr_conf['cluster_id'])
+        emr_conf['cluster_master_instances'] = datalab.meta_lib.get_emr_instances_list(emr_conf['cluster_id'], 'MASTER')
+        emr_conf['cluster_core_instances'] = datalab.meta_lib.get_emr_instances_list(emr_conf['cluster_id'], 'CORE')
         emr_conf['edge_instance_name'] = '{0}-{1}-{2}-edge'.format(emr_conf['service_base_name'],
                                                                    emr_conf['project_name'], emr_conf['endpoint_name'])
-        emr_conf['edge_instance_hostname'] = dlab.meta_lib.get_instance_private_ip_address(
+        emr_conf['edge_instance_hostname'] = datalab.meta_lib.get_instance_private_ip_address(
             emr_conf['tag_name'], emr_conf['edge_instance_name'])
-        emr_conf['edge_instance_hostname'] = dlab.meta_lib.get_instance_hostname(emr_conf['tag_name'],
-                                                                                 emr_conf['edge_instance_name'])
+        emr_conf['edge_instance_hostname'] = datalab.meta_lib.get_instance_hostname(emr_conf['tag_name'],
+                                                                                    emr_conf['edge_instance_name'])
         emr_conf['user_keyname'] = emr_conf['project_name']
         emr_conf['os_user'] = os.environ['conf_os_user']
         emr_conf['initial_user'] = 'ec2-user'
         emr_conf['sudo_group'] = 'wheel'
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
-        dlab.actions_lib.terminate_emr(emr_conf['cluster_id'])
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.actions_lib.terminate_emr(emr_conf['cluster_id'])
         sys.exit(1)
 
     try:
@@ -260,7 +260,7 @@
         print('[SUMMARY]')
         print("Service base name: {}".format(emr_conf['service_base_name']))
         print("Cluster name: {}".format(emr_conf['cluster_name']))
-        print("Cluster id: {}".format(dlab.meta_lib.get_emr_id_by_name(emr_conf['cluster_name'])))
+        print("Cluster id: {}".format(datalab.meta_lib.get_emr_id_by_name(emr_conf['cluster_name'])))
         print("Key name: {}".format(emr_conf['key_name']))
         print("Region: {}".format(emr_conf['region']))
         print("EMR version: {}".format(emr_conf['release_label']))
@@ -271,19 +271,19 @@
         print("Bucket name: {}".format(emr_conf['bucket_name']))
         with open("/root/result.json", 'w') as result:
             res = {"hostname": emr_conf['cluster_name'],
-                   "instance_id": dlab.meta_lib.get_emr_id_by_name(emr_conf['cluster_name']),
+                   "instance_id": datalab.meta_lib.get_emr_id_by_name(emr_conf['cluster_name']),
                    "key_name": emr_conf['key_name'],
                    "user_own_bucket_name": emr_conf['bucket_name'],
                    "Action": "Create new EMR cluster",
                    "computational_url": [
                        {"description": "EMR Master",
                         "url": emr_master_acces_url},
-                       #{"description": "EMR Master (via tunnl)",
-                        #"url": emr_master_url}
+                       # {"description": "EMR Master (via tunnl)",
+                       # "url": emr_master_url}
                    ]}
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
-        dlab.actions_lib.terminate_emr(emr_conf['cluster_id'])
+        datalab.fab.append_result("Error with writing results", str(err))
+        datalab.actions_lib.terminate_emr(emr_conf['cluster_id'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_create.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_create.py
index 6017968..093cbfd 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_create.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_create.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,28 +21,29 @@
 #
 # ******************************************************************************
 
-import boto3
-from botocore.client import Config
 import argparse
-import re
-import time
-import sys
-from fabric.api import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-import json
-import traceback
-import logging
 import ast
+import boto3
+import logging
+import re
+import sys
+import time
+import traceback
+from botocore.client import Config as botoConfig
+from datalab.actions_lib import *
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 # parser.add_argument('--id', type=str, default='')
 parser.add_argument('--dry_run', action='store_true', help='Print all variables')
 parser.add_argument('--name', type=str, default='', help='Name to be applied to Cluster ( MANDATORY !!! )')
 parser.add_argument('--applications', type=str, default='',
-                    help='Set of applications to be installed on EMR (Default are: "Hadoop Hive Hue Spark")')
-parser.add_argument('--master_instance_type', type=str, default='', help='EC2 instance size for Master-Node (Default: m3.xlarge)')
-parser.add_argument('--slave_instance_type', type=str, default='', help='EC2 instance size for Worker-Nodes (Default: m3.xlarge)')
+                    help='Set of applications to be installed on EMR (Default are: "Hadoop Hive Hue Spark Livy")')
+parser.add_argument('--master_instance_type', type=str, default='',
+                    help='EC2 instance size for Master-Node (Default: m3.xlarge)')
+parser.add_argument('--slave_instance_type', type=str, default='',
+                    help='EC2 instance size for Worker-Nodes (Default: m3.xlarge)')
 parser.add_argument('--instance_count', type=int, default='',
                     help='Number of nodes the cluster will consist of (Default: 3)')
 parser.add_argument('--release_label', type=str, default='', help='EMR release version (Default: "emr-4.8.0")')
@@ -118,9 +119,9 @@
           "--sse AES256 --endpoint-url {6} --region {2}, " \
           "ActionOnFailure=TERMINATE_CLUSTER,Jar=command-runner.jar;" \
           "Name=CUSTOM_JAR, Args=sudo " \
-          "/usr/bin/python /tmp/key_importer.py --user_name {4}, " \
+          "/usr/bin/python3 /tmp/key_importer.py --user_name {4}, " \
           "ActionOnFailure=TERMINATE_CLUSTER,Jar=command-runner.jar; " \
-          "Name=CUSTOM_JAR, Args=/usr/bin/python /tmp/jars_parser.py " \
+          "Name=CUSTOM_JAR, Args=/usr/bin/python3 /tmp/jars_parser.py " \
           "--bucket {0} --emr_version {3} --region {2} --user_name {4} " \
           "--cluster_name {5}, " \
           "ActionOnFailure=TERMINATE_CLUSTER,Jar=command-runner.jar".\
@@ -140,7 +141,7 @@
 
 def get_object_count(bucket, prefix):
     try:
-        s3_cli = boto3.client('s3', config=Config(signature_version='s3v4'),
+        s3_cli = boto3.client('s3', config=botoConfig(signature_version='s3v4'),
                               region_name=args.region)
         content = s3_cli.get_paginator('list_objects')
         file_list = []
@@ -162,7 +163,7 @@
 
 def upload_jars_parser(args):
     try:
-        s3 = boto3.resource('s3', config=Config(signature_version='s3v4'))
+        s3 = boto3.resource('s3', config=botoConfig(signature_version='s3v4'))
         s3.meta.client.upload_file('/root/scripts/dataengine-service_jars_parser.py',
                                    args.s3_bucket, 'jars_parser.py',
                                    ExtraArgs={'ServerSideEncryption': 'AES256'})
@@ -175,7 +176,7 @@
 
 def upload_user_key(args):
     try:
-        s3 = boto3.resource('s3', config=Config(signature_version='s3v4'))
+        s3 = boto3.resource('s3', config=botoConfig(signature_version='s3v4'))
         s3.meta.client.upload_file(args.key_dir + '/' +
                                    args.project_name + '.pub',
                                    args.s3_bucket, args.project_name +
@@ -196,7 +197,7 @@
 def remove_user_key(args):
     try:
         client = boto3.client('s3',
-                              config=Config(signature_version='s3v4'),
+                              config=botoConfig(signature_version='s3v4'),
                               region_name=args.region)
         client.delete_object(Bucket=args.s3_bucket,
                              Key=args.project_name + '.pub')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_install_libs.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_install_libs.py
index a8a1e47..d687c8a 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_install_libs.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_install_libs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,25 +21,26 @@
 #
 # ******************************************************************************
 
+import logging
+import multiprocessing
 import os
 import sys
-import logging
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
-import multiprocessing
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 
 def install_libs(instance, data_engine):
     data_engine['instance_ip'] = instance.get('PrivateIpAddress')
-    params = '--os_user {} --instance_ip {} --keyfile "{}" --libs "{}"'\
+    params = '--os_user {} --instance_ip {} --keyfile "{}" --libs "{}" --dataengine_service True' \
         .format(data_engine['os_user'], data_engine['instance_ip'],
                 data_engine['keyfile'], data_engine['libs'])
     try:
         # Run script to install additional libs
-        local("~/scripts/{}.py {}".format('install_additional_libs', params))
+        subprocess.run("~/scripts/{}.py {}".format('install_additional_libs', params), shell=True, check=True)
     except:
         traceback.print_exc()
         raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_jars_parser.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_jars_parser.py
index 0626285..2f5e33e 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_jars_parser.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_jars_parser.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -39,12 +39,10 @@
     spark_def_path = "/usr/lib/spark/conf/spark-defaults.conf"
     spark_def_path_line1 = subprocess.check_output("cat " + spark_def_path +
                                                    " | grep spark.driver.extraClassPath | awk '{print $2}' | "
-                                                   "sed 's/^:// ; s~jar:~jar ~g; s~/\*:~/\* ~g; s~:~/\* ~g'",
-                                                   shell=True)
+                                                   "sed 's/^:// ; s~jar:~jar ~g; s~/\*:~/\* ~g; s~:~/\* ~g'", shell=True).decode('UTF-8')
     spark_def_path_line2 = subprocess.check_output("cat " + spark_def_path +
                                                    " | grep spark.driver.extraLibraryPath | awk '{print $2}' | "
-                                                   "sed 's/^:// ; s~jar:~jar ~g; s~/\*:~/\* ~g; s~:\|$~/\* ~g'",
-                                                   shell=True)
+                                                   "sed 's/^:// ; s~jar:~jar ~g; s~/\*:~/\* ~g; s~:\|$~/\* ~g'",shell=True).decode('UTF-8')
     spark_def_path_line1 = spark_def_path_line1.strip('\n')
     spark_def_path_line2 = spark_def_path_line2.strip('\n')
     if args.region == 'us-east-1':
@@ -63,9 +61,9 @@
     with open('/tmp/r_version', 'w') as outfile:
         outfile.write(r_ver)
     os.system('touch /tmp/python_version')
-    for v in range(4, 7):
+    for v in range(4, 8):
         python_ver_checker = "python3.{} -V 2>/dev/null".format(v) + " | awk '{print $2}'"
-        python_ver = subprocess.check_output(python_ver_checker, shell=True)
+        python_ver = subprocess.check_output(python_ver_checker, shell=True).decode('UTF-8')
         if python_ver != '':
             with open('/tmp/python_version', 'w') as outfile:
                 outfile.write(python_ver)
@@ -76,10 +74,10 @@
               format(spark_def_path_line1,
                      spark_def_path_line2))
     os.system('/bin/tar -zhcvf /tmp/spark.tar.gz -C /usr/lib/ spark')
-    md5sum = subprocess.check_output('md5sum /tmp/jars.tar.gz', shell=True)
+    md5sum = subprocess.check_output('md5sum /tmp/jars.tar.gz', shell=True).decode('UTF-8')
     with open('/tmp/jars-checksum.chk', 'w') as outfile:
         outfile.write(md5sum)
-    md5sum = subprocess.check_output('md5sum /tmp/spark.tar.gz', shell=True)
+    md5sum = subprocess.check_output('md5sum /tmp/spark.tar.gz', shell=True).decode('UTF-8')
     with open('/tmp/spark-checksum.chk', 'w') as outfile:
         outfile.write(md5sum)
     os.system('aws s3 cp /tmp/jars.tar.gz '
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_key_importer.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_key_importer.py
index 8d5efd4..a4d4a1c 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_key_importer.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_key_importer.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_list_libs.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_list_libs.py
index e4a0f38..967fc6f 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_list_libs.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_list_libs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,15 @@
 #
 # ******************************************************************************
 
+import logging
 import os
 import sys
-import logging
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -47,6 +48,7 @@
         try:
             data_engine['os_user'] = 'ec2-user'
             data_engine['cluster_name'] = os.environ['computational_id']
+            data_engine['group_name'] = os.environ['libCacheKey']
             data_engine['cluster_id'] = get_emr_id_by_name(data_engine['cluster_name'])
             data_engine['cluster_instances'] = get_emr_instances_list(data_engine['cluster_id'], 'MASTER')
             data_engine['master_ip'] = data_engine['cluster_instances'][0].get('PrivateIpAddress')
@@ -54,11 +56,11 @@
         except Exception as err:
             append_result("Failed to get parameter.", str(err))
             sys.exit(1)
-        params = "--os_user {} --instance_ip {} --keyfile '{}'" \
-            .format(data_engine['os_user'], data_engine['master_ip'], data_engine['keyfile'])
+        params = "--os_user {} --instance_ip {} --keyfile '{}' --group {}" \
+            .format(data_engine['os_user'], data_engine['master_ip'], data_engine['keyfile'], data_engine['group_name'])
         try:
             # Run script to get available libs
-            local("~/scripts/{}.py {}".format('get_list_available_pkgs', params))
+            subprocess.run("~/scripts/{}.py {}".format('get_list_available_pkgs', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_prepare.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_prepare.py
index 7dd94d9..bf9da3b 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,24 +21,23 @@
 #
 # ******************************************************************************
 
-import json
-import time
-from fabric.api import *
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
 import argparse
-import sys
-import os
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
+import json
 import logging
-
+import os
+import sys
+import time
+import traceback
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--uuid', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id'])
@@ -54,31 +53,31 @@
             emr_conf['exploratory_name'] = ''
         if os.path.exists('/response/.emr_creating_{}'.format(emr_conf['exploratory_name'])):
             time.sleep(30)
-        dlab.actions_lib.create_aws_config_files()
+        datalab.actions_lib.create_aws_config_files()
         emr_conf['service_base_name'] = os.environ['conf_service_base_name']
         emr_conf['project_name'] = os.environ['project_name']
         emr_conf['endpoint_name'] = os.environ['endpoint_name']
-        edge_status = dlab.meta_lib.get_instance_status(
+        edge_status = datalab.meta_lib.get_instance_status(
             '{}-tag'.format(emr_conf['service_base_name']),
             '{0}-{1}-{2}-edge'.format(emr_conf['service_base_name'], emr_conf['project_name'],
                                       emr_conf['endpoint_name']))
         if edge_status != 'running':
             logging.info('ERROR: Edge node is unavailable! Aborting...')
             print('ERROR: Edge node is unavailable! Aborting...')
-            ssn_hostname = dlab.meta_lib.get_instance_hostname(
+            ssn_hostname = datalab.meta_lib.get_instance_hostname(
                 emr_conf['service_base_name'] + '-tag',
                 emr_conf['service_base_name'] + '-ssn')
-            dlab.fab.put_resource_status('edge', 'Unavailable',
-                                         os.environ['ssn_dlab_path'],
-                                         os.environ['conf_os_user'], ssn_hostname)
-            dlab.fab.append_result("Edge node is unavailable")
+            datalab.fab.put_resource_status('edge', 'Unavailable',
+                                            os.environ['ssn_datalab_path'],
+                                            os.environ['conf_os_user'], ssn_hostname)
+            datalab.fab.append_result("Edge node is unavailable")
             sys.exit(1)
         print('Generating infrastructure names and tags')
         if 'computational_name' in os.environ:
             emr_conf['computational_name'] = os.environ['computational_name']
         else:
             emr_conf['computational_name'] = ''
-        emr_conf['apps'] = 'Hadoop Hive Hue Spark'
+        emr_conf['apps'] = 'Hadoop Hive Hue Spark Livy'
         emr_conf['tag_name'] = '{0}-tag'.format(emr_conf['service_base_name'])
         emr_conf['key_name'] = os.environ['conf_key_name']
         emr_conf['endpoint_tag'] = emr_conf['endpoint_name']
@@ -88,10 +87,12 @@
         emr_conf['edge_instance_name'] = '{0}-{1}-{2}-edge'.format(emr_conf['service_base_name'],
                                                                    emr_conf['project_name'], emr_conf['endpoint_name'])
         emr_conf['edge_security_group_name'] = '{0}-sg'.format(emr_conf['edge_instance_name'])
+        emr_conf['nb_security_group_name'] = '{0}-{1}-{2}-nb-sg'.format(emr_conf['service_base_name'],
+                                                                   emr_conf['project_name'], emr_conf['endpoint_name'])
         emr_conf['master_instance_type'] = os.environ['emr_master_instance_type']
         emr_conf['slave_instance_type'] = os.environ['emr_slave_instance_type']
         emr_conf['instance_count'] = os.environ['emr_instance_count']
-        emr_conf['notebook_ip'] = dlab.meta_lib.get_instance_ip_address(
+        emr_conf['notebook_ip'] = datalab.meta_lib.get_instance_ip_address(
             emr_conf['tag_name'], os.environ['notebook_instance_name']).get('Private')
         emr_conf['role_service_name'] = os.environ['emr_service_role']
         emr_conf['role_ec2_name'] = os.environ['emr_ec2_role']
@@ -122,7 +123,7 @@
         tag = {"Key": "{}-tag".format(emr_conf['service_base_name']),
                "Value": "{}-{}-{}-subnet".format(emr_conf['service_base_name'], emr_conf['project_name'],
                                                  emr_conf['endpoint_name'])}
-        emr_conf['subnet_cidr'] = dlab.meta_lib.get_subnet_by_tag(tag)
+        emr_conf['subnet_cidr'] = datalab.meta_lib.get_subnet_by_tag(tag)
         emr_conf['key_path'] = '{0}{1}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
         emr_conf['all_ip_cidr'] = '0.0.0.0/0'
         emr_conf['additional_emr_sg_name'] = '{}-{}-{}-de-se-additional-sg'\
@@ -131,14 +132,14 @@
         emr_conf['vpc2_id'] = os.environ['aws_notebook_vpc_id']
         emr_conf['provision_instance_ip'] = None
         try:
-            emr_conf['provision_instance_ip'] = dlab.meta_lib.get_instance_ip_address(
+            emr_conf['provision_instance_ip'] = datalab.meta_lib.get_instance_ip_address(
                 emr_conf['tag_name'], '{0}-{1}-endpoint'.format(emr_conf['service_base_name'],
                                                                 emr_conf['endpoint_name'])).get('Private') + "/32"
         except:
-            emr_conf['provision_instance_ip'] = dlab.meta_lib.get_instance_ip_address(
+            emr_conf['provision_instance_ip'] = datalab.meta_lib.get_instance_ip_address(
                 emr_conf['tag_name'], '{0}-ssn'.format(emr_conf['service_base_name'])).get('Private') + "/32"
         if os.environ['emr_slave_instance_spot'] == 'True':
-            ondemand_price = float(dlab.meta_lib.get_ec2_price(emr_conf['slave_instance_type'], emr_conf['region']))
+            ondemand_price = float(datalab.meta_lib.get_ec2_price(emr_conf['slave_instance_type'], emr_conf['region']))
             emr_conf['slave_bid_price'] = (ondemand_price * int(os.environ['emr_slave_instance_spot_pct_price'])) / 100
         else:
             emr_conf['slave_bid_price'] = 0
@@ -147,7 +148,7 @@
         else:
             emr_conf['emr_timeout'] = "1200"
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         sys.exit(1)
 
     print("Will create exploratory environment with edge node as access point as following: {}".format(
@@ -159,11 +160,11 @@
         json.dump(data, f)
 
     try:
-        dlab.meta_lib.emr_waiter(emr_conf['tag_name'], os.environ['notebook_instance_name'])
-        local('touch /response/.emr_creating_{}'.format(emr_conf['exploratory_name']))
+        datalab.meta_lib.emr_waiter(emr_conf['tag_name'], os.environ['notebook_instance_name'])
+        subprocess.run('touch /response/.emr_creating_{}'.format(emr_conf['exploratory_name']), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
-        dlab.fab.append_result("EMR waiter fail.", str(err))
+        datalab.fab.append_result("EMR waiter fail.", str(err))
         sys.exit(1)
 
     with open('/root/result.json', 'w') as f:
@@ -173,8 +174,8 @@
     logging.info('[CREATING ADDITIONAL SECURITY GROUPS FOR EMR]')
     print("[CREATING ADDITIONAL SECURITY GROUPS FOR EMR]")
     try:
-        edge_group_id = dlab.meta_lib.check_security_group(emr_conf['edge_security_group_name'])
-        cluster_sg_ingress = dlab.meta_lib.format_sg([
+        group_id = datalab.meta_lib.check_security_group(emr_conf['edge_security_group_name'])
+        cluster_sg_ingress = [
             {
                 "IpProtocol": "-1",
                 "IpRanges": [{"CidrIp": emr_conf['subnet_cidr']}],
@@ -183,18 +184,12 @@
             },
             {
                 "IpProtocol": "-1",
-                "IpRanges": [],
-                "UserIdGroupPairs": [{"GroupId": edge_group_id}],
-                "PrefixListIds": []
-            },
-            {
-                "IpProtocol": "-1",
                 "IpRanges": [{"CidrIp": emr_conf['provision_instance_ip']}],
                 "UserIdGroupPairs": [],
                 "PrefixListIds": []
             }
-        ])
-        cluster_sg_egress = dlab.meta_lib.format_sg([
+        ]
+        cluster_sg_egress = [
             {
                 "IpProtocol": "-1",
                 "IpRanges": [{"CidrIp": emr_conf['subnet_cidr']}],
@@ -208,12 +203,6 @@
                 "PrefixListIds": [],
             },
             {
-                "IpProtocol": "-1",
-                "IpRanges": [],
-                "UserIdGroupPairs": [{"GroupId": edge_group_id}],
-                "PrefixListIds": []
-            },
-            {
                 "IpProtocol": "tcp",
                 "IpRanges": [{"CidrIp": emr_conf['all_ip_cidr']}],
                 "FromPort": 443,
@@ -221,7 +210,22 @@
                 "UserIdGroupPairs": [],
                 "PrefixListIds": [],
             }
-        ])
+        ]
+        if group_id:
+            cluster_sg_ingress.append({
+                "IpProtocol": "-1",
+                "IpRanges": [],
+                "UserIdGroupPairs": [{"GroupId": group_id}],
+                "PrefixListIds": []
+            })
+            cluster_sg_egress.append({
+                "IpProtocol": "-1",
+                "IpRanges": [],
+                "UserIdGroupPairs": [{"GroupId": group_id}],
+                "PrefixListIds": []
+            })
+        cluster_sg_ingress = datalab.meta_lib.format_sg(cluster_sg_ingress)
+        cluster_sg_egress = datalab.meta_lib.format_sg(cluster_sg_egress)
 
         params = "--name {} " \
                  "--vpc_id {} " \
@@ -244,15 +248,15 @@
                 os.environ['conf_additional_tags'] = 'project_tag:{0};endpoint_tag:{1}'.format(emr_conf['project_tag'],
                                                                                                emr_conf['endpoint_tag'])
             print('Additional tags will be added: {}'.format(os.environ['conf_additional_tags']))
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create sg.", str(err))
+        datalab.fab.append_result("Failed to create sg.", str(err))
         sys.exit(1)
 
-    local("echo Waiting for changes to propagate; sleep 10")
+    subprocess.run("echo Waiting for changes to propagate; sleep 10", shell=True, check=True)
 
     try:
         logging.info('[Creating EMR Cluster]')
@@ -304,16 +308,16 @@
                     emr_conf['additional_emr_sg_name'],
                     emr_conf['configurations'])
         try:
-            local("~/scripts/{}.py {}".format('dataengine-service_create', params))
+            subprocess.run("~/scripts/{}.py {}".format('dataengine-service_create', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
         cluster_name = emr_conf['cluster_name']
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], emr_conf['key_name'])
-        local('rm /response/.emr_creating_{}'.format(emr_conf['exploratory_name']))
+        subprocess.run('rm /response/.emr_creating_{}'.format(emr_conf['exploratory_name']), shell=True, check=True)
     except Exception as err:
-        dlab.fab.append_result("Failed to create EMR Cluster.", str(err))
-        local('rm /response/.emr_creating_{}'.format(emr_conf['exploratory_name']))
-        emr_id = dlab.meta_lib.get_emr_id_by_name(emr_conf['cluster_name'])
-        dlab.actions_lib.terminate_emr(emr_id)
+        datalab.fab.append_result("Failed to create EMR Cluster.", str(err))
+        subprocess.run('rm /response/.emr_creating_{}'.format(emr_conf['exploratory_name']), shell=True, check=True)
+        emr_id = datalab.meta_lib.get_emr_id_by_name(emr_conf['cluster_name'])
+        datalab.actions_lib.terminate_emr(emr_id)
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_terminate.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_terminate.py
index e9551e3..db9077c 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine-service_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,22 +21,21 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
 import boto3
-import logging
-import argparse
-import sys
-import os
-import traceback
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
+import logging
+import os
+import sys
+import traceback
 
 
 def terminate_emr_cluster(emr_name, bucket_name, tag_name, nb_tag_value, ssh_user, key_path):
     print('Terminating EMR cluster and cleaning EMR config from S3 bucket')
     try:
-        clusters_list = dlab.meta_lib.get_emr_list(emr_name, 'Value')
+        clusters_list = datalab.meta_lib.get_emr_list(emr_name, 'Value')
         if clusters_list:
             for cluster_id in clusters_list:
                 computational_name = ''
@@ -48,13 +47,13 @@
                 for tag in cluster.get('Tags'):
                     if tag.get('Key') == 'ComputationalName':
                         computational_name = tag.get('Value')
-                dlab.actions_lib.s3_cleanup(bucket_name, emr_name, os.environ['project_name'])
+                datalab.actions_lib.s3_cleanup(bucket_name, emr_name, os.environ['project_name'])
                 print("The bucket {} has been cleaned successfully".format(bucket_name))
-                dlab.actions_lib.terminate_emr(cluster_id)
+                datalab.actions_lib.terminate_emr(cluster_id)
                 print("The EMR cluster {} has been terminated successfully".format(emr_name))
                 print("Removing EMR kernels from notebook")
-                dlab.actions_lib.remove_kernels(emr_name, tag_name, nb_tag_value, ssh_user, key_path,
-                                                emr_version, computational_name)
+                datalab.actions_lib.remove_kernels(emr_name, tag_name, nb_tag_value, ssh_user, key_path,
+                                                   emr_version, computational_name)
         else:
             print("There are no EMR clusters to terminate.")
     except:
@@ -70,7 +69,7 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    dlab.actions_lib.create_aws_config_files()
+    datalab.actions_lib.create_aws_config_files()
     print('Generating infrastructure names and tags')
     emr_conf = dict()
     emr_conf['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -91,7 +90,7 @@
                                   emr_conf['notebook_name'], os.environ['conf_os_user'], emr_conf['key_path'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate EMR cluster.", str(err))
+            datalab.fab.append_result("Failed to terminate EMR cluster.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -105,5 +104,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine_configure.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine_configure.py
index e0a4f0c..7995824 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,54 +21,51 @@
 #
 # ******************************************************************************
 
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import time
-from fabric.api import *
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
-import sys
-import os
-import uuid
 import logging
-from Crypto.PublicKey import RSA
 import multiprocessing
-
+import os
+import sys
+import traceback
+from fabric import *
+import subprocess
 
 def configure_slave(slave_number, data_engine):
     slave_name = data_engine['slave_node_name'] + '{}'.format(slave_number + 1)
-    slave_hostname = dlab.meta_lib.get_instance_private_ip_address(data_engine['tag_name'], slave_name)
+    slave_hostname = datalab.meta_lib.get_instance_private_ip_address(data_engine['tag_name'], slave_name)
     try:
-        logging.info('[CREATING DLAB SSH USER ON SLAVE NODE]')
-        print('[CREATING DLAB SSH USER ON SLAVE NODE]')
+        logging.info('[CREATING DATALAB SSH USER ON SLAVE NODE]')
+        print('[CREATING DATALAB SSH USER ON SLAVE NODE]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             master_node_hostname, "{}{}.pem".format(os.environ['conf_key_dir'], data_engine['key_name']),
-            data_engine['initial_user'], data_engine['dlab_ssh_user'], data_engine['sudo_group'])
+            data_engine['initial_user'], data_engine['datalab_ssh_user'], data_engine['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to create ssh user on slave.", str(err))
+        datalab.fab.append_result("Failed to create ssh user on slave.", str(err))
         sys.exit(1)
 
     try:
         logging.info('[CLEANING INSTANCE FOR SLAVE NODE]')
         print('[CLEANING INSTANCE FOR SLAVE NODE]')
         params = '--hostname {} --keyfile {} --os_user {} --application {}' \
-            .format(slave_hostname, keyfile_name, data_engine['dlab_ssh_user'], os.environ['application'])
+            .format(slave_hostname, keyfile_name, data_engine['datalab_ssh_user'], os.environ['application'])
         try:
-            local("~/scripts/{}.py {}".format('common_clean_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_clean_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to clean slave instance.", str(err))
+        datalab.fab.append_result("Failed to clean slave instance.", str(err))
         sys.exit(1)
 
     try:
@@ -77,31 +74,31 @@
         additional_config = {"proxy_host": edge_instance_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(slave_hostname, slave_name, keyfile_name, json.dumps(additional_config),
-                    data_engine['dlab_ssh_user'])
+                    data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure proxy on slave.", str(err))
+        datalab.fab.append_result("Failed to configure proxy on slave.", str(err))
         sys.exit(1)
 
     try:
         logging.info('[INSTALLING PREREQUISITES ON SLAVE NODE]')
         print('[INSTALLING PREREQUISITES ON SLAVE NODE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
-            format(slave_hostname, keyfile_name, data_engine['dlab_ssh_user'], data_engine['region'],
+            format(slave_hostname, keyfile_name, data_engine['datalab_ssh_user'], data_engine['region'],
                    edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to install prerequisites on slave.", str(err))
+        datalab.fab.append_result("Failed to install prerequisites on slave.", str(err))
         sys.exit(1)
 
     try:
@@ -110,17 +107,17 @@
         params = "--hostname {} --keyfile {} --region {} --spark_version {} --hadoop_version {} --os_user {} " \
                  "--scala_version {} --r_mirror {} --master_ip {} --node_type {}". \
             format(slave_hostname, keyfile_name, data_engine['region'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], data_engine['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], data_engine['datalab_ssh_user'],
                    os.environ['notebook_scala_version'], os.environ['notebook_r_mirror'], master_node_hostname,
                    'slave')
         try:
-            local("~/scripts/{}.py {}".format('configure_dataengine', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_dataengine', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure slave node.", str(err))
+        datalab.fab.append_result("Failed to configure slave node.", str(err))
         sys.exit(1)
 
     try:
@@ -128,23 +125,23 @@
         logging.info('[INSTALLING USERs KEY]')
         additional_config = {"user_keyname": data_engine['user_keyname'], "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            slave_hostname, keyfile_name, json.dumps(additional_config), data_engine['dlab_ssh_user'])
+            slave_hostname, keyfile_name, json.dumps(additional_config), data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed install users key on slave node.", str(err))
+        datalab.fab.append_result("Failed install users key on slave node.", str(err))
         sys.exit(1)
 
 
 def clear_resources():
-    dlab.actions_lib.remove_ec2(data_engine['tag_name'], data_engine['master_node_name'])
+    datalab.actions_lib.remove_ec2(data_engine['tag_name'], data_engine['master_node_name'])
     for i in range(data_engine['instance_count'] - 1):
         slave_name = data_engine['slave_node_name'] + '{}'.format(i + 1)
-        dlab.actions_lib.remove_ec2(data_engine['tag_name'], slave_name)
+        datalab.actions_lib.remove_ec2(data_engine['tag_name'], slave_name)
 
 
 if __name__ == "__main__":
@@ -189,22 +186,22 @@
         tag = {"Key": data_engine['tag_name'],
                "Value": "{}-{}-{}-subnet".format(data_engine['service_base_name'], data_engine['project_name'],
                                                  data_engine['endpoint_name'])}
-        data_engine['subnet_cidr'] = dlab.meta_lib.get_subnet_by_tag(tag)
+        data_engine['subnet_cidr'] = datalab.meta_lib.get_subnet_by_tag(tag)
         data_engine['notebook_dataengine_role_profile_name'] = '{}-{}-{}-nb-de-profile' \
             .format(data_engine['service_base_name'], data_engine['project_name'], data_engine['endpoint_name'])
         data_engine['instance_count'] = int(os.environ['dataengine_instance_count'])
-        master_node_hostname = dlab.meta_lib.get_instance_hostname(data_engine['tag_name'],
-                                                                   data_engine['master_node_name'])
-        data_engine['dlab_ssh_user'] = os.environ['conf_os_user']
+        master_node_hostname = datalab.meta_lib.get_instance_hostname(data_engine['tag_name'],
+                                                                      data_engine['master_node_name'])
+        data_engine['datalab_ssh_user'] = os.environ['conf_os_user']
         data_engine['user_keyname'] = data_engine['project_name']
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
         edge_instance_name = '{0}-{1}-{2}-edge'.format(data_engine['service_base_name'],
                                                        data_engine['project_name'], data_engine['endpoint_name'])
-        edge_instance_hostname = dlab.meta_lib.get_instance_hostname(data_engine['tag_name'], edge_instance_name)
-        edge_instance_private_ip = dlab.meta_lib.get_instance_ip_address(data_engine['tag_name'],
-                                                                         edge_instance_name).get('Private')
-        data_engine['edge_instance_hostname'] = dlab.meta_lib.get_instance_hostname(data_engine['tag_name'],
-                                                                                    edge_instance_name)
+        edge_instance_hostname = datalab.meta_lib.get_instance_hostname(data_engine['tag_name'], edge_instance_name)
+        edge_instance_private_ip = datalab.meta_lib.get_instance_ip_address(data_engine['tag_name'],
+                                                                            edge_instance_name).get('Private')
+        data_engine['edge_instance_hostname'] = datalab.meta_lib.get_instance_hostname(data_engine['tag_name'],
+                                                                                       edge_instance_name)
         if os.environ['conf_os_family'] == 'debian':
             data_engine['initial_user'] = 'ubuntu'
             data_engine['sudo_group'] = 'sudo'
@@ -220,39 +217,39 @@
         data_engine['master_node_name'] = data_engine['cluster_name'] + '-m'
         data_engine['slave_node_name'] = data_engine['cluster_name'] + '-s'
         clear_resources()
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
 
     try:
-        logging.info('[CREATING DLAB SSH USER ON MASTER NODE]')
-        print('[CREATING DLAB SSH USER ON MASTER NODE]')
+        logging.info('[CREATING DATALAB SSH USER ON MASTER NODE]')
+        print('[CREATING DATALAB SSH USER ON MASTER NODE]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             master_node_hostname, "{}{}.pem".format(os.environ['conf_key_dir'], data_engine['key_name']),
-            data_engine['initial_user'], data_engine['dlab_ssh_user'], data_engine['sudo_group'])
+            data_engine['initial_user'], data_engine['datalab_ssh_user'], data_engine['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to create ssh user on master.", str(err))
+        datalab.fab.append_result("Failed to create ssh user on master.", str(err))
         sys.exit(1)
 
     try:
         logging.info('[CLEANING INSTANCE FOR MASTER NODE]')
         print('[CLEANING INSTANCE FOR MASTER NODE]')
         params = '--hostname {} --keyfile {} --os_user {} --application {}' \
-            .format(master_node_hostname, keyfile_name, data_engine['dlab_ssh_user'], os.environ['application'])
+            .format(master_node_hostname, keyfile_name, data_engine['datalab_ssh_user'], os.environ['application'])
         try:
-            local("~/scripts/{}.py {}".format('common_clean_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_clean_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to clean master instance.", str(err))
+        datalab.fab.append_result("Failed to clean master instance.", str(err))
         sys.exit(1)
 
     try:
@@ -261,31 +258,31 @@
         additional_config = {"proxy_host": edge_instance_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(master_node_hostname, data_engine['master_node_name'], keyfile_name, json.dumps(additional_config),
-                    data_engine['dlab_ssh_user'])
+                    data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure proxy on master.", str(err))
+        datalab.fab.append_result("Failed to configure proxy on master.", str(err))
         sys.exit(1)
 
     try:
         logging.info('[INSTALLING PREREQUISITES ON MASTER NODE]')
         print('[INSTALLING PREREQUISITES ON MASTER NODE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(master_node_hostname, keyfile_name, data_engine['dlab_ssh_user'], data_engine['region'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(master_node_hostname, keyfile_name, data_engine['datalab_ssh_user'], data_engine['region'],
                    edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to install prerequisites on master.", str(err))
+        datalab.fab.append_result("Failed to install prerequisites on master.", str(err))
         sys.exit(1)
 
     try:
@@ -293,15 +290,15 @@
         logging.info('[INSTALLING USERs KEY]')
         additional_config = {"user_keyname": data_engine['user_keyname'], "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            master_node_hostname, keyfile_name, json.dumps(additional_config), data_engine['dlab_ssh_user'])
+            master_node_hostname, keyfile_name, json.dumps(additional_config), data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed install users key on master node.", str(err))
+        datalab.fab.append_result("Failed install users key on master node.", str(err))
         sys.exit(1)
 
     try:
@@ -310,16 +307,16 @@
         params = "--hostname {} --keyfile {} --region {} --spark_version {} --hadoop_version {} --os_user {} " \
                  "--scala_version {} --r_mirror {} --master_ip {} --node_type {}".\
             format(master_node_hostname, keyfile_name, data_engine['region'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], data_engine['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], data_engine['datalab_ssh_user'],
                    os.environ['notebook_scala_version'], os.environ['notebook_r_mirror'], master_node_hostname,
                    'master')
         try:
-            local("~/scripts/{}.py {}".format('configure_dataengine', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_dataengine', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure master node", str(err))
+        datalab.fab.append_result("Failed to configure master node", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -335,15 +332,15 @@
             if job.exitcode != 0:
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure slave nodes.", str(err))
+        datalab.fab.append_result("Failed to configure slave nodes.", str(err))
         clear_resources()
         sys.exit(1)
 
     try:
         print('[SETUP EDGE REVERSE PROXY TEMPLATE]')
         logging.info('[SETUP EDGE REVERSE PROXY TEMPLATE]')
-        notebook_instance_ip = dlab.meta_lib.get_instance_private_ip_address('Name',
-                                                                             os.environ['notebook_instance_name'])
+        notebook_instance_ip = datalab.meta_lib.get_instance_private_ip_address('Name',
+                                                                                os.environ['notebook_instance_name'])
         additional_info = {
             "computational_name": data_engine['computational_name'],
             "master_node_hostname": master_node_hostname,
@@ -361,23 +358,23 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     keyfile_name,
-                    data_engine['dlab_ssh_user'],
+                    data_engine['datalab_ssh_user'],
                     'spark',
                     data_engine['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure reverse proxy.", str(err))
+        datalab.fab.append_result("Failed to configure reverse proxy.", str(err))
         clear_resources()
         sys.exit(1)
 
     try:
-        ip_address = dlab.meta_lib.get_instance_ip_address(data_engine['tag_name'],
-                                                           data_engine['master_node_name']).get('Private')
+        ip_address = datalab.meta_lib.get_instance_ip_address(data_engine['tag_name'],
+                                                              data_engine['master_node_name']).get('Private')
         spark_master_url = "http://" + ip_address + ":8080"
         spark_master_access_url = "https://{}/{}_{}/".format(data_engine['edge_instance_hostname'],
                                                              data_engine['exploratory_name'],
@@ -392,8 +389,8 @@
         print("Instance count: {}".format(str(data_engine['instance_count'])))
         with open("/root/result.json", 'w') as result:
             res = {"hostname": data_engine['cluster_name'],
-                   "instance_id": dlab.meta_lib.get_instance_by_name(data_engine['tag_name'],
-                                                                     data_engine['master_node_name']),
+                   "instance_id": datalab.meta_lib.get_instance_by_name(data_engine['tag_name'],
+                                                                        data_engine['master_node_name']),
                    "key_name": data_engine['key_name'],
                    "Action": "Create new Data Engine",
                    "computational_url": [
@@ -405,6 +402,6 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine_prepare.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine_prepare.py
index ad19f7a..3919513 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,20 +21,16 @@
 #
 # ******************************************************************************
 
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import time
-from fabric.api import *
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
-import sys
-import os
-import uuid
 import logging
-from Crypto.PublicKey import RSA
-import multiprocessing
-
+import os
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -44,22 +40,23 @@
                         level=logging.INFO,
                         filename=local_log_filepath)
     try:
-        dlab.actions_lib.create_aws_config_files()
+        datalab.actions_lib.create_aws_config_files()
         data_engine = dict()
         data_engine['service_base_name'] = (os.environ['conf_service_base_name'])
         data_engine['project_name'] = os.environ['project_name']
         data_engine['endpoint_name'] = os.environ['endpoint_name']
-        edge_status = dlab.meta_lib.get_instance_status(
+        edge_status = datalab.meta_lib.get_instance_status(
             data_engine['service_base_name'] + '-tag', '{0}-{1}-{2}-edge'.format(
                 data_engine['service_base_name'], data_engine['project_name'], data_engine['endpoint_name']))
         if edge_status != 'running':
             logging.info('ERROR: Edge node is unavailable! Aborting...')
             print('ERROR: Edge node is unavailable! Aborting...')
-            ssn_hostname = dlab.meta_lib.get_instance_hostname(data_engine['service_base_name'] + '-tag',
-                                                               data_engine['service_base_name'] + '-ssn')
-            dlab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_dlab_path'], os.environ['conf_os_user'],
-                                         ssn_hostname)
-            dlab.fab.append_result("Edge node is unavailable")
+            ssn_hostname = datalab.meta_lib.get_instance_hostname(data_engine['service_base_name'] + '-tag',
+                                                                  data_engine['service_base_name'] + '-ssn')
+            datalab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_datalab_path'],
+                                            os.environ['conf_os_user'],
+                                            ssn_hostname)
+            datalab.fab.append_result("Edge node is unavailable")
             sys.exit(1)
         print('Generating infrastructure names and tags')
         if 'exploratory_name' in os.environ:
@@ -89,7 +86,7 @@
         tag = {"Key": data_engine['tag_name'],
                "Value": "{}-{}-{}-subnet".format(data_engine['service_base_name'], data_engine['project_name'],
                                                  data_engine['endpoint_name'])}
-        data_engine['subnet_cidr'] = dlab.meta_lib.get_subnet_by_tag(tag)
+        data_engine['subnet_cidr'] = datalab.meta_lib.get_subnet_by_tag(tag)
         data_engine['notebook_dataengine_role_profile_name'] = '{}-{}-{}-nb-de-profile' \
             .format(data_engine['service_base_name'], data_engine['project_name'], data_engine['endpoint_name'])
         data_engine['instance_count'] = int(os.environ['dataengine_instance_count'])
@@ -120,9 +117,9 @@
                     x != 'None' and x != '')
             else data_engine['expected_image_name'])(str(os.environ.get('notebook_image_name')))
         print('Searching pre-configured images')
-        data_engine['ami_id'] = dlab.meta_lib.get_ami_id(os.environ['aws_{}_image_name'.format(
+        data_engine['ami_id'] = datalab.meta_lib.get_ami_id(os.environ['aws_{}_image_name'.format(
             os.environ['conf_os_family'])])
-        image_id = dlab.meta_lib.get_ami_id_by_name(data_engine['notebook_image_name'], 'available')
+        image_id = datalab.meta_lib.get_ami_id_by_name(data_engine['notebook_image_name'], 'available')
         if image_id != '' and os.environ['application'] in os.environ['dataengine_image_notebooks'].split(','):
             data_engine['ami_id'] = image_id
             print('Pre-configured image found. Using: {}'.format(data_engine['ami_id']))
@@ -131,7 +128,7 @@
             print('No pre-configured image found. Using default one: {}'.format(data_engine['ami_id']))
 
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
 
     with open('/root/result.json', 'w') as f:
@@ -155,23 +152,23 @@
                  "--instance_class {}" \
             .format(data_engine['master_node_name'], data_engine['ami_id'], data_engine['master_size'],
                     data_engine['key_name'],
-                    dlab.meta_lib.get_security_group_by_name(data_engine['dataengine_master_security_group_name']),
-                    dlab.meta_lib.get_subnet_by_cidr(data_engine['subnet_cidr'], os.environ['aws_notebook_vpc_id']),
+                    datalab.meta_lib.get_security_group_by_name(data_engine['dataengine_master_security_group_name']),
+                    datalab.meta_lib.get_subnet_by_cidr(data_engine['subnet_cidr'], os.environ['aws_notebook_vpc_id']),
                     data_engine['notebook_dataengine_role_profile_name'], data_engine['tag_name'],
                     data_engine['master_node_name'], data_engine['primary_disk_size'], data_engine['instance_class'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
-            data_engine['master_id'] = dlab.meta_lib.get_instance_by_name(data_engine['tag_name'],
-                                                                          data_engine['master_node_name'])
-            dlab.actions_lib.create_tag(data_engine['master_id'], data_engine['cluster_nodes_tag'], False)
-            dlab.actions_lib.create_tag(data_engine['master_id'], data_engine['cluster_nodes_resource_tag'], False)
-            dlab.actions_lib.create_tag(data_engine['master_id'], data_engine['cluster_nodes_billing_tag'], False)
-            dlab.actions_lib.create_tag(data_engine['master_id'], data_engine['cluster_nodes_tag_type'], False)
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
+            data_engine['master_id'] = datalab.meta_lib.get_instance_by_name(data_engine['tag_name'],
+                                                                             data_engine['master_node_name'])
+            datalab.actions_lib.create_tag(data_engine['master_id'], data_engine['cluster_nodes_tag'], False)
+            datalab.actions_lib.create_tag(data_engine['master_id'], data_engine['cluster_nodes_resource_tag'], False)
+            datalab.actions_lib.create_tag(data_engine['master_id'], data_engine['cluster_nodes_billing_tag'], False)
+            datalab.actions_lib.create_tag(data_engine['master_id'], data_engine['cluster_nodes_tag_type'], False)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create master instance.", str(err))
+        datalab.fab.append_result("Failed to create master instance.", str(err))
         sys.exit(1)
 
     try:
@@ -185,27 +182,30 @@
                      "--primary_disk_size {} --instance_class {}" \
                 .format(slave_name, data_engine['ami_id'], data_engine['slave_size'],
                         data_engine['key_name'],
-                        dlab.meta_lib.get_security_group_by_name(data_engine['dataengine_slave_security_group_name']),
-                        dlab.meta_lib.get_subnet_by_cidr(data_engine['subnet_cidr'], os.environ['aws_notebook_vpc_id']),
+                        datalab.meta_lib.get_security_group_by_name(
+                            data_engine['dataengine_slave_security_group_name']),
+                        datalab.meta_lib.get_subnet_by_cidr(data_engine['subnet_cidr'],
+                                                            os.environ['aws_notebook_vpc_id']),
                         data_engine['notebook_dataengine_role_profile_name'], data_engine['tag_name'],
                         slave_name, data_engine['primary_disk_size'], data_engine['instance_class'])
             try:
-                local("~/scripts/{}.py {}".format('common_create_instance', params))
-                data_engine['slave_id'] = dlab.meta_lib.get_instance_by_name(data_engine['tag_name'], slave_name)
-                dlab.actions_lib.create_tag(data_engine['slave_id'], data_engine['cluster_nodes_tag'], False)
-                dlab.actions_lib.create_tag(data_engine['slave_id'], data_engine['cluster_nodes_resource_tag'], False)
-                dlab.actions_lib.create_tag(data_engine['slave_id'], data_engine['cluster_nodes_billing_tag'], False)
-                dlab.actions_lib.create_tag(data_engine['slave_id'], data_engine['cluster_nodes_tag_type'], False)
+                subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
+                data_engine['slave_id'] = datalab.meta_lib.get_instance_by_name(data_engine['tag_name'], slave_name)
+                datalab.actions_lib.create_tag(data_engine['slave_id'], data_engine['cluster_nodes_tag'], False)
+                datalab.actions_lib.create_tag(data_engine['slave_id'], data_engine['cluster_nodes_resource_tag'],
+                                               False)
+                datalab.actions_lib.create_tag(data_engine['slave_id'], data_engine['cluster_nodes_billing_tag'], False)
+                datalab.actions_lib.create_tag(data_engine['slave_id'], data_engine['cluster_nodes_tag_type'], False)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.actions_lib.remove_ec2(data_engine['tag_name'], data_engine['master_node_name'])
+        datalab.actions_lib.remove_ec2(data_engine['tag_name'], data_engine['master_node_name'])
         for i in range(data_engine['instance_count'] - 1):
             slave_name = data_engine['slave_node_name'] + '{}'.format(i+1)
             try:
-                dlab.actions_lib.remove_ec2(data_engine['tag_name'], slave_name)
+                datalab.actions_lib.remove_ec2(data_engine['tag_name'], slave_name)
             except:
                 print("The slave instance {} hasn't been created.".format(slave_name))
-        dlab.fab.append_result("Failed to create slave instances.", str(err))
+        datalab.fab.append_result("Failed to create slave instances.", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine_start.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine_start.py
index 0450ff7..e8b3ecd 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine_start.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine_start.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,21 +21,22 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
+import logging
 import os
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
 import sys
 import traceback
-from fabric.api import *
+import subprocess
+from fabric import *
 
 
 def start_data_engine(cluster_name):
     print("Start Data Engine")
     try:
-        dlab.actions_lib.start_ec2(os.environ['conf_tag_resource_id'], cluster_name)
+        datalab.actions_lib.start_ec2(os.environ['conf_tag_resource_id'], cluster_name)
     except:
         sys.exit(1)
 
@@ -51,7 +52,7 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    dlab.actions_lib.create_aws_config_files()
+    datalab.actions_lib.create_aws_config_files()
     print('Generating infrastructure names and tags')
     data_engine = dict()
     
@@ -79,7 +80,7 @@
                                          data_engine['cluster_name']))
     except Exception as err:
         print('Error: {0}'.format(err))
-        dlab.fab.append_result("Failed to start Data Engine.", str(err))
+        datalab.fab.append_result("Failed to start Data Engine.", str(err))
         sys.exit(1)
 
     try:
@@ -87,19 +88,19 @@
         print('[UPDATE LAST ACTIVITY TIME]')
         data_engine['computational_id'] = data_engine['cluster_name'] + '-m'
         data_engine['tag_name'] = data_engine['service_base_name'] + '-tag'
-        data_engine['notebook_ip'] = dlab.meta_lib.get_instance_ip_address(
+        data_engine['notebook_ip'] = datalab.meta_lib.get_instance_ip_address(
             data_engine['tag_name'], os.environ['notebook_instance_name']).get('Private')
-        data_engine['computational_ip'] = dlab.meta_lib.get_instance_ip_address(
+        data_engine['computational_ip'] = datalab.meta_lib.get_instance_ip_address(
             data_engine['tag_name'], data_engine['computational_id']).get('Private')
         data_engine['keyfile'] = '{}{}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
         params = '--os_user {0} --notebook_ip {1} --keyfile "{2}" --cluster_ip {3}' \
             .format(os.environ['conf_os_user'], data_engine['notebook_ip'], data_engine['keyfile'],
                     data_engine['computational_ip'])
         try:
-            local("~/scripts/{}.py {}".format('update_inactivity_on_start', params))
+            subprocess.run("~/scripts/{}.py {}".format('update_inactivity_on_start', params), shell=True, check=True)
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to update last activity time.", str(err))
+            datalab.fab.append_result("Failed to update last activity time.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -111,5 +112,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine_stop.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine_stop.py
index d31d395..8f849ab 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine_stop.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine_stop.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,18 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
 import json
+import logging
 import os
-import dlab.fab
-import dlab.actions_lib
 import sys
 
 
 def stop_data_engine(cluster_name):
     print("Stop Data Engine")
     try:
-        dlab.actions_lib.stop_ec2(os.environ['conf_tag_resource_id'], cluster_name)
+        datalab.actions_lib.stop_ec2(os.environ['conf_tag_resource_id'], cluster_name)
     except:
         sys.exit(1)
 
@@ -48,7 +48,7 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    dlab.actions_lib.create_aws_config_files()
+    datalab.actions_lib.create_aws_config_files()
     print('Generating infrastructure names and tags')
     data_engine_config = dict()
     try:
@@ -74,7 +74,7 @@
                                         data_engine_config['cluster_name']))
     except Exception as err:
         print('Error: {0}'.format(err))
-        dlab.fab.append_result("Failed to stop Data Engine.", str(err))
+        datalab.fab.append_result("Failed to stop Data Engine.", str(err))
         sys.exit(1)
 
     try:
@@ -84,5 +84,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/dataengine_terminate.py b/infrastructure-provisioning/src/general/scripts/aws/dataengine_terminate.py
index 7d8c10d..f0bfe5a 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/dataengine_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/dataengine_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,13 +21,13 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import traceback
+import logging
 import os
+import sys
+import traceback
 
 
 def terminate_data_engine(tag_name, notebook_name,
@@ -35,14 +35,14 @@
                           cluster_name, remote_kernel_name):
     print("Terminating data engine cluster")
     try:
-        dlab.actions_lib.remove_ec2(os.environ['conf_tag_resource_id'], cluster_name)
+        datalab.actions_lib.remove_ec2(os.environ['conf_tag_resource_id'], cluster_name)
     except:
         sys.exit(1)
 
     print("Removing Data Engine kernels from notebook")
     try:
-        dlab.actions_lib.remove_dataengine_kernels(tag_name, notebook_name,
-                                                   os_user, key_path, remote_kernel_name)
+        datalab.actions_lib.remove_dataengine_kernels(tag_name, notebook_name,
+                                                      os_user, key_path, remote_kernel_name)
     except:
         sys.exit(1)
 
@@ -58,7 +58,7 @@
                         filename=local_log_filepath)
     # generating variables dictionary
     print('Generating infrastructure names and tags')
-    dlab.actions_lib.create_aws_config_files()
+    datalab.actions_lib.create_aws_config_files()
     data_engine = dict()
     
     try:
@@ -92,7 +92,7 @@
                     data_engine['cluster_name']), data_engine['cluster_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate Data Engine.", str(err))
+            datalab.fab.append_result("Failed to terminate Data Engine.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -104,5 +104,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/deeplearning_configure.py b/infrastructure-provisioning/src/general/scripts/aws/deeplearning_configure.py
index a2ca856..4c18945 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/deeplearning_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/deeplearning_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,17 @@
 #
 # ******************************************************************************
 
-import logging
+import argparse
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import argparse
-from fabric.api import *
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--uuid', type=str, default='')
@@ -81,25 +82,26 @@
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
         notebook_config['tag_name'] = '{}-tag'.format(notebook_config['service_base_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
-        notebook_config['ip_address'] = dlab.meta_lib.get_instance_ip_address(
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['ip_address'] = datalab.meta_lib.get_instance_ip_address(
             notebook_config['tag_name'], notebook_config['instance_name']).get('Private')
 
         # generating variables regarding EDGE proxy on Notebook instance
-        instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                notebook_config['instance_name'])
+        instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                   notebook_config['instance_name'])
         edge_instance_name = '{}-{}-{}-edge'.format(notebook_config['service_base_name'],
                                                     notebook_config['project_name'], notebook_config['endpoint_name'])
-        edge_instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
-        edge_instance_private_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                                         edge_instance_name).get('Private')
-        notebook_config['edge_instance_hostname'] = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                                        edge_instance_name)
+        edge_instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
+        edge_instance_private_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                                            edge_instance_name).get('Private')
+        notebook_config['edge_instance_hostname'] = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                                           edge_instance_name)
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        edge_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get('Private')
+        edge_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get(
+            'Private')
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -110,20 +112,20 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # configuring proxy on Notebook instance
@@ -133,15 +135,15 @@
         additional_config = {"proxy_host": edge_instance_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -150,15 +152,15 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing users key.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # updating repositories & installing python packages
@@ -166,16 +168,16 @@
         logging.info('[INSTALLING PREREQUISITES TO DEEPLEARNING NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO DEEPLEARNING NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".format(
-            instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['aws_region'],
+            instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['aws_region'],
             edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -186,51 +188,51 @@
                  "--scala_version {4} --spark_version {5} " \
                  "--hadoop_version {6} --region {7} " \
                  "--r_mirror {8} --ip_address {9} --exploratory_name {10} --edge_ip {11}" \
-                 .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
-                         os.environ['notebook_jupyter_version'], os.environ['notebook_scala_version'],
-                         os.environ['notebook_spark_version'], os.environ['notebook_hadoop_version'],
-                         os.environ['aws_region'], os.environ['notebook_r_mirror'],
-                         notebook_config['ip_address'], notebook_config['exploratory_name'], edge_ip)
+            .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
+                    os.environ['notebook_jupyter_version'], os.environ['notebook_scala_version'],
+                    os.environ['notebook_spark_version'], os.environ['notebook_hadoop_version'],
+                    os.environ['aws_region'], os.environ['notebook_r_mirror'],
+                    notebook_config['ip_address'], notebook_config['exploratory_name'], edge_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_deep_learning_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_deep_learning_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure Deep Learning node.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure Deep Learning node.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --nb_tag_name {} --nb_tag_value {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['tag_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -248,25 +250,25 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     keyfile_name,
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'jupyter',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
         print('Error: {0}'.format(err))
-        dlab.fab.append_result("Failed edge reverse proxy template.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed edge reverse proxy template.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     if notebook_config['image_enabled'] == 'true':
         try:
             print('[CREATING AMI]')
-            ami_id = dlab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
+            ami_id = datalab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
             if ami_id == '' and notebook_config['shared_image_enabled'] == 'false':
                 print("Looks like it's first time we configure notebook server. Creating image.")
                 try:
@@ -276,7 +278,7 @@
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'project_tag:{0};endpoint_tag:{1}'.format(
                         notebook_config['project_name'], notebook_config['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
@@ -288,20 +290,20 @@
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'ami:shared;endpoint_tag:{}'.format(
                         notebook_config['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
                     print("Image was successfully created. It's ID is {}".format(image_id))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
-            dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+            datalab.fab.append_result("Failed creating image.", str(err))
+            datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
             sys.exit(1)
     try:
         # generating output information
-        ip_address = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                           notebook_config['instance_name']).get('Private')
-        dns_name = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
+        ip_address = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                              notebook_config['instance_name']).get('Private')
+        dns_name = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
         tensor_board_url = 'http://' + ip_address + ':6006'
         jupyter_url = 'http://' + ip_address + ':8888/{}/'.format(notebook_config['exploratory_name'])
         jupyter_notebook_access_url = "https://{}/{}/".format(notebook_config['edge_instance_hostname'],
@@ -316,8 +318,8 @@
         print("Instance name: {}".format(notebook_config['instance_name']))
         print("Private DNS: {}".format(dns_name))
         print("Private IP: {}".format(ip_address))
-        print("Instance ID: {}".format(dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                          notebook_config['instance_name'])))
+        print("Instance ID: {}".format(datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                             notebook_config['instance_name'])))
         print("Instance type: {}".format(notebook_config['instance_type']))
         print("Key name: {}".format(notebook_config['key_name']))
         print("User key name: {}".format(notebook_config['user_keyname']))
@@ -327,15 +329,15 @@
 
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'],notebook_config['dlab_ssh_user'], ip_address))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
         print('SSH access (from Edge node, via FQDN): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], dns_name))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], dns_name))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": dns_name,
                    "ip": ip_address,
-                   "instance_id": dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                     notebook_config['instance_name']),
+                   "instance_id": datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                        notebook_config['instance_name']),
                    "master_keyname": os.environ['conf_key_name'],
                    "notebook_name": notebook_config['instance_name'],
                    "notebook_image_name": notebook_config['notebook_image_name'],
@@ -343,8 +345,8 @@
                    "exploratory_url": [
                        {"description": "Jupyter",
                         "url": jupyter_notebook_access_url},
-                       {"description": "TensorBoard",
-                        "url": tensorboard_access_url},
+                       #{"description": "TensorBoard",
+                       # "url": tensorboard_access_url},
                        {"description": "Ungit",
                         "url": jupyter_ungit_access_url}#,
                        #{"description": "Jupyter (via tunnel)",
@@ -356,6 +358,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Error with writing results.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/edge_associate_elastic_ip.py b/infrastructure-provisioning/src/general/scripts/aws/edge_associate_elastic_ip.py
index 131ac46..8f5eb71 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/edge_associate_elastic_ip.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/edge_associate_elastic_ip.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,12 +21,12 @@
 #
 # ******************************************************************************
 
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-import os
 import argparse
+import os
+import sys
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--elastic_ip', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py b/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py
index d96ef49..1257464 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/edge_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,17 @@
 #
 # ******************************************************************************
 
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import time
-import os
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
 import logging
+import os
+import sys
 import traceback
 import uuid
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -42,19 +41,20 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
 
+
     def clear_resources():
-        dlab.actions_lib.remove_all_iam_resources('notebook', edge_conf['project_name'])
-        dlab.actions_lib.remove_all_iam_resources('edge', edge_conf['project_name'])
-        dlab.actions_lib.remove_ec2(edge_conf['tag_name'], edge_conf['instance_name'])
-        dlab.actions_lib.remove_sgroups(edge_conf['dataengine_instances_name'])
-        dlab.actions_lib.remove_sgroups(edge_conf['notebook_instance_name'])
-        dlab.actions_lib.remove_sgroups(edge_conf['instance_name'])
-        dlab.actions_lib.remove_s3('edge', edge_conf['project_name'])
+        datalab.actions_lib.remove_all_iam_resources('notebook', edge_conf['project_name'])
+        datalab.actions_lib.remove_all_iam_resources('edge', edge_conf['project_name'])
+        datalab.actions_lib.remove_ec2(edge_conf['tag_name'], edge_conf['instance_name'])
+        datalab.actions_lib.remove_sgroups(edge_conf['dataengine_instances_name'])
+        datalab.actions_lib.remove_sgroups(edge_conf['notebook_instance_name'])
+        datalab.actions_lib.remove_sgroups(edge_conf['instance_name'])
+        datalab.actions_lib.remove_s3('edge', edge_conf['project_name'])
 
     try:
         print('Generating infrastructure names and tags')
         edge_conf = dict()
-        edge_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
+        edge_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
             os.environ['conf_service_base_name'][:20], '-', True)
         edge_conf['key_name'] = os.environ['conf_key_name']
         edge_conf['user_key'] = os.environ['key']
@@ -87,21 +87,22 @@
         tag = {"Key": edge_conf['tag_name'],
                "Value": "{}-{}-{}-subnet".format(edge_conf['service_base_name'], edge_conf['project_name'],
                                                  edge_conf['endpoint_name'])}
-        edge_conf['private_subnet_cidr'] = dlab.meta_lib.get_subnet_by_tag(tag)
-        edge_conf['dlab_ssh_user'] = os.environ['conf_os_user']
+        edge_conf['private_subnet_cidr'] = datalab.meta_lib.get_subnet_by_tag(tag)
+        edge_conf['datalab_ssh_user'] = os.environ['conf_os_user']
         edge_conf['network_type'] = os.environ['conf_network_type']
         if edge_conf['network_type'] == 'public':
-            edge_conf['edge_public_ip'] = dlab.meta_lib.get_instance_ip_address(edge_conf['tag_name'],
-                                                                  edge_conf['instance_name']).get('Public')
-            edge_conf['edge_private_ip'] = dlab.meta_lib.get_instance_ip_address(
+            edge_conf['edge_public_ip'] = datalab.meta_lib.get_instance_ip_address(edge_conf['tag_name'],
+                                                                                   edge_conf['instance_name']).get(
+                'Public')
+            edge_conf['edge_private_ip'] = datalab.meta_lib.get_instance_ip_address(
                 edge_conf['tag_name'], edge_conf['instance_name']).get('Private')
         elif edge_conf['network_type'] == 'private':
-            edge_conf['edge_private_ip'] = dlab.meta_lib.get_instance_ip_address(
+            edge_conf['edge_private_ip'] = datalab.meta_lib.get_instance_ip_address(
                 edge_conf['tag_name'], edge_conf['instance_name']).get('Private')
             edge_conf['edge_public_ip'] = edge_conf['edge_private_ip']
-        edge_conf['vpc1_cidrs'] = dlab.meta_lib.get_vpc_cidr_by_id(os.environ['aws_vpc_id'])
+        edge_conf['vpc1_cidrs'] = datalab.meta_lib.get_vpc_cidr_by_id(os.environ['aws_vpc_id'])
         try:
-            edge_conf['vpc2_cidrs'] = dlab.meta_lib.get_vpc_cidr_by_id(os.environ['aws_notebook_vpc_id'])
+            edge_conf['vpc2_cidrs'] = datalab.meta_lib.get_vpc_cidr_by_id(os.environ['aws_notebook_vpc_id'])
             edge_conf['vpc_cidrs'] = list(set(edge_conf['vpc1_cidrs'] + edge_conf['vpc2_cidrs']))
         except KeyError:
             edge_conf['vpc_cidrs'] = list(set(edge_conf['vpc1_cidrs']))
@@ -110,15 +111,15 @@
         for cidr in os.environ['conf_allowed_ip_cidr'].split(','):
             edge_conf['allowed_ip_cidr'].append(cidr.replace(' ', ''))
 
-        edge_conf['instance_hostname'] = dlab.meta_lib.get_instance_hostname(edge_conf['tag_name'],
-                                                                             edge_conf['instance_name'])
+        edge_conf['instance_hostname'] = datalab.meta_lib.get_instance_hostname(edge_conf['tag_name'],
+                                                                                edge_conf['instance_name'])
         edge_conf['keyfile_name'] = "{}{}.pem".format(os.environ['conf_key_dir'], edge_conf['key_name'])
 
         if os.environ['conf_stepcerts_enabled'] == 'true':
             edge_conf['step_cert_sans'] = ' --san {0} '.format(edge_conf['edge_private_ip'])
             if edge_conf['network_type'] == 'public':
                 edge_conf['step_cert_sans'] += ' --san {0} --san {1}'.format(
-                    dlab.meta_lib.get_instance_hostname(edge_conf['tag_name'], edge_conf['instance_name']),
+                    datalab.meta_lib.get_instance_hostname(edge_conf['tag_name'], edge_conf['instance_name']),
                     edge_conf['edge_public_ip'])
         else:
             edge_conf['step_cert_sans'] = ''
@@ -129,40 +130,55 @@
             edge_conf['initial_user'] = 'ec2-user'
             edge_conf['sudo_group'] = 'wheel'
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         clear_resources()
         sys.exit(1)
 
     try:
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             edge_conf['instance_hostname'], os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem",
-            edge_conf['initial_user'], edge_conf['dlab_ssh_user'], edge_conf['sudo_group'])
+            edge_conf['initial_user'], edge_conf['datalab_ssh_user'], edge_conf['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         clear_resources()
         sys.exit(1)
 
     try:
         print('[INSTALLING PREREQUISITES]')
         logging.info('[INSTALLING PREREQUISITES]')
-        params = "--hostname {} --keyfile {} --user {} --region {}".\
-            format(edge_conf['instance_hostname'], edge_conf['keyfile_name'], edge_conf['dlab_ssh_user'],
+        params = "--hostname {} --keyfile {} --user {} --region {}". \
+            format(edge_conf['instance_hostname'], edge_conf['keyfile_name'], edge_conf['datalab_ssh_user'],
                    os.environ['aws_region'])
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
+        print('RESTARTING EDGE NODE')
+        try:
+            print('Stoping EDGE node')
+            datalab.actions_lib.stop_ec2(edge_conf['tag_name'], edge_conf['instance_name'])
+        except Exception as err:
+            print('Error: {0}'.format(err))
+            datalab.fab.append_result("Failed to stop edge.", str(err))
+            sys.exit(1)
+        try:
+            print('Starting EDGE node')
+            datalab.actions_lib.start_ec2(edge_conf['tag_name'], edge_conf['instance_name'])
+        except Exception as err:
+            print('Error: {0}'.format(err))
+            datalab.fab.append_result("Failed to start edge.", str(err))
+            sys.exit(1)
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -180,14 +196,14 @@
                              "allowed_ip_cidr": edge_conf['allowed_ip_cidr']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             edge_conf['instance_hostname'], edge_conf['keyfile_name'], json.dumps(additional_config),
-            edge_conf['dlab_ssh_user'])
+            edge_conf['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('configure_http_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_http_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing http proxy.", str(err))
+        datalab.fab.append_result("Failed installing http proxy.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -200,14 +216,14 @@
                              "user_key": edge_conf['user_key']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             edge_conf['instance_hostname'], edge_conf['keyfile_name'], json.dumps(additional_config),
-            edge_conf['dlab_ssh_user'])
+            edge_conf['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key." + str(err))
+        datalab.fab.append_result("Failed installing users key." + str(err))
         clear_resources()
         sys.exit(1)
 
@@ -217,30 +233,53 @@
         edge_conf['keycloak_client_secret'] = str(uuid.uuid4())
         params = "--hostname {} --keyfile {} --user {} --keycloak_client_id {} --keycloak_client_secret {} " \
                  "--step_cert_sans '{}' ".format(
-                  edge_conf['instance_hostname'], edge_conf['keyfile_name'], edge_conf['dlab_ssh_user'],
-                  '{}-{}-{}'.format(edge_conf['service_base_name'], edge_conf['project_name'],
-                                    edge_conf['endpoint_name']),
-                  edge_conf['keycloak_client_secret'], edge_conf['step_cert_sans'])
+            edge_conf['instance_hostname'], edge_conf['keyfile_name'], edge_conf['datalab_ssh_user'],
+            '{}-{}-{}'.format(edge_conf['service_base_name'], edge_conf['project_name'],
+                              edge_conf['endpoint_name']),
+            edge_conf['keycloak_client_secret'], edge_conf['step_cert_sans'])
         try:
-            local("~/scripts/{}.py {}".format('configure_nginx_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_nginx_reverse_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
+        if os.environ['conf_letsencrypt_enabled'] == 'true' and 'conf_letsencrypt_domain_name' in os.environ:
+            edge_conf['edge_hostname'] = '{}.{}'.format(edge_conf['project_name'], os.environ['conf_letsencrypt_domain_name'])
+        else:
+            edge_conf['edge_hostname'] = "''"
         keycloak_params = "--service_base_name {} --keycloak_auth_server_url {} --keycloak_realm_name {} " \
                           "--keycloak_user {} --keycloak_user_password {} --keycloak_client_secret {} " \
-                          "--edge_public_ip {} --hostname {} --project_name {} --endpoint_name {} ".format(
+                          "--edge_public_ip {} --hostname {} --project_name {} --endpoint_name {} --hostname {} ".format(
                            edge_conf['service_base_name'], os.environ['keycloak_auth_server_url'],
                            os.environ['keycloak_realm_name'], os.environ['keycloak_user'],
                            os.environ['keycloak_user_password'], edge_conf['keycloak_client_secret'],
                            edge_conf['instance_hostname'], edge_conf['instance_hostname'], edge_conf['project_name'],
-                           edge_conf['endpoint_name'])
+                           edge_conf['endpoint_name'], edge_conf['edge_hostname'])
         try:
-            local("~/scripts/{}.py {}".format('configure_keycloak', keycloak_params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_keycloak', keycloak_params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing nginx reverse proxy." + str(err))
+        datalab.fab.append_result("Failed installing nginx reverse proxy." + str(err))
+        clear_resources()
+        sys.exit(1)
+
+    try:
+        print('[CONFIGRING EDGE AS NAT]')
+        if os.environ['edge_is_nat'] == 'true':
+            print('Installing nftables')
+            additional_config = {"exploratory_subnet": edge_conf['private_subnet_cidr'],
+                                 "edge_ip": edge_conf['edge_private_ip']}
+            params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
+                edge_conf['instance_hostname'], edge_conf['keyfile_name'], json.dumps(additional_config),
+                edge_conf['datalab_ssh_user'])
+            try:
+                subprocess.run("~/scripts/{}.py {}".format('configure_nftables', params), shell=True, check=True)
+            except:
+                traceback.print_exc()
+                raise Exception
+    except Exception as err:
+        datalab.fab.append_result("Failed to configure NAT." + str(err))
         clear_resources()
         sys.exit(1)
 
@@ -251,8 +290,8 @@
         print("Hostname: {}".format(edge_conf['instance_hostname']))
         print("Public IP: {}".format(edge_conf['edge_public_ip']))
         print("Private IP: {}".format(edge_conf['edge_private_ip']))
-        print("Instance ID: {}".format(dlab.meta_lib.get_instance_by_name(edge_conf['tag_name'],
-                                                                          edge_conf['instance_name'])))
+        print("Instance ID: {}".format(datalab.meta_lib.get_instance_by_name(edge_conf['tag_name'],
+                                                                             edge_conf['instance_name'])))
         print("Key name: {}".format(edge_conf['key_name']))
         print("Bucket name: {}".format(edge_conf['bucket_name']))
         print("Shared bucket name: {}".format(edge_conf['shared_bucket_name']))
@@ -264,7 +303,8 @@
             res = {"hostname": edge_conf['instance_hostname'],
                    "public_ip": edge_conf['edge_public_ip'],
                    "ip": edge_conf['edge_private_ip'],
-                   "instance_id": dlab.meta_lib.get_instance_by_name(edge_conf['tag_name'], edge_conf['instance_name']),
+                   "instance_id": datalab.meta_lib.get_instance_by_name(edge_conf['tag_name'],
+                                                                        edge_conf['instance_name']),
                    "key_name": edge_conf['key_name'],
                    "user_own_bicket_name": edge_conf['bucket_name'],
                    "shared_bucket_name": edge_conf['shared_bucket_name'],
@@ -276,12 +316,12 @@
                    "notebook_subnet": edge_conf['private_subnet_cidr'],
                    "full_edge_conf": edge_conf,
                    "project_name": edge_conf['project_name'],
-                   "@class": "com.epam.dlab.dto.aws.edge.EdgeInfoAws",
+                   "@class": "com.epam.datalab.dto.aws.edge.EdgeInfoAws",
                    "Action": "Create new EDGE server"}
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
+        datalab.fab.append_result("Error with writing results.", str(err))
         clear_resources()
         sys.exit(1)
 
diff --git a/infrastructure-provisioning/src/general/scripts/aws/edge_configure_route_table.py b/infrastructure-provisioning/src/general/scripts/aws/edge_configure_route_table.py
new file mode 100644
index 0000000..bf0e5f2
--- /dev/null
+++ b/infrastructure-provisioning/src/general/scripts/aws/edge_configure_route_table.py
@@ -0,0 +1,38 @@
+#!/usr/bin/python3
+
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+import argparse
+from datalab.actions_lib import *
+from datalab.meta_lib import *
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--vpc_id', type=str, default='')
+parser.add_argument('--infra_tag_value', type=str, default='')
+parser.add_argument('--edge_instance_id', type=str, default='')
+parser.add_argument('--private_subnet_id', type=str, default='')
+parser.add_argument('--sbn', type=str, default='')
+args = parser.parse_args()
+
+if __name__ == "__main__":
+    rt_id = create_nat_rt(args.vpc_id, args.infra_tag_value, args.edge_instance_id, args.private_subnet_id, args.sbn)
+
diff --git a/infrastructure-provisioning/src/general/scripts/aws/edge_start.py b/infrastructure-provisioning/src/general/scripts/aws/edge_start.py
index a9f856a..893fb89 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/edge_start.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/edge_start.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,13 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import sys
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
+import json
 import logging
 import os
-import json
-
-
+import sys
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -40,7 +38,7 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    dlab.actions_lib.create_aws_config_files()
+    datalab.actions_lib.create_aws_config_files()
     print('Generating infrastructure names and tags')
     edge_conf = dict()
     edge_conf['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -53,15 +51,15 @@
     logging.info('[START EDGE]')
     print('[START EDGE]')
     try:
-        dlab.actions_lib.start_ec2(edge_conf['tag_name'], edge_conf['instance_name'])
+        datalab.actions_lib.start_ec2(edge_conf['tag_name'], edge_conf['instance_name'])
     except Exception as err:
         print('Error: {0}'.format(err))
-        dlab.fab.append_result("Failed to start edge.", str(err))
+        datalab.fab.append_result("Failed to start edge.", str(err))
         sys.exit(1)
 
     try:
-        instance_hostname = dlab.meta_lib.get_instance_hostname(edge_conf['tag_name'], edge_conf['instance_name'])
-        addresses = dlab.meta_lib.get_instance_ip_address(edge_conf['tag_name'], edge_conf['instance_name'])
+        instance_hostname = datalab.meta_lib.get_instance_hostname(edge_conf['tag_name'], edge_conf['instance_name'])
+        addresses = datalab.meta_lib.get_instance_ip_address(edge_conf['tag_name'], edge_conf['instance_name'])
         ip_address = addresses.get('Private')
         public_ip_address = addresses.get('Public')
         print('[SUMMARY]')
@@ -79,5 +77,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/edge_status.py b/infrastructure-provisioning/src/general/scripts/aws/edge_status.py
index d8bd92e..591fc6d 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/edge_status.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/edge_status.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,15 @@
 #
 # ******************************************************************************
 
-
-import json
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import sys
-import time
-import os
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import logging
+import os
+import sys
 import traceback
-from fabric.api import *
-
+from fabric import *
+import subprocess
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
@@ -42,18 +39,18 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
 
-    dlab.actions_lib.create_aws_config_files()
-    print('Getting statuses of DLAB resources')
+    datalab.actions_lib.create_aws_config_files()
+    print('Getting statuses of DataLab resources')
 
     try:
         logging.info('[COLLECT DATA]')
         print('[COLLECTING DATA]')
         params = '--list_resources "{}"'.format(os.environ['edge_list_resources'])
         try:
-            local("~/scripts/{}.py {}".format('common_collect_data', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_collect_data', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to collect necessary information.", str(err))
+        datalab.fab.append_result("Failed to collect necessary information.", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/edge_stop.py b/infrastructure-provisioning/src/general/scripts/aws/edge_stop.py
index 3948781..062e8d3 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/edge_stop.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/edge_stop.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,13 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import sys
-import os
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-
+import logging
+import os
+import sys
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -39,7 +38,7 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    dlab.actions_lib.create_aws_config_files()
+    datalab.actions_lib.create_aws_config_files()
     print('Generating infrastructure names and tags')
     edge_conf = dict()
     edge_conf['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -52,9 +51,9 @@
     logging.info('[STOP EDGE]')
     print('[STOP EDGE]')
     try:
-        dlab.actions_lib.stop_ec2(edge_conf['tag_name'], edge_conf['instance_name'])
+        datalab.actions_lib.stop_ec2(edge_conf['tag_name'], edge_conf['instance_name'])
     except Exception as err:
-        dlab.fab.append_result("Failed to stop edge.", str(err))
+        datalab.fab.append_result("Failed to stop edge.", str(err))
         sys.exit(1)
 
     try:
@@ -64,5 +63,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/jupyter_configure.py b/infrastructure-provisioning/src/general/scripts/aws/jupyter_configure.py
index cc53b22..b040f03 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/jupyter_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/jupyter_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,17 @@
 #
 # ******************************************************************************
 
-import logging
+import argparse
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import argparse
-from fabric.api import *
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--uuid', type=str, default='')
@@ -81,25 +82,26 @@
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
         notebook_config['tag_name'] = '{}-tag'.format(notebook_config['service_base_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
-        notebook_config['ip_address'] = dlab.meta_lib.get_instance_ip_address(
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['ip_address'] = datalab.meta_lib.get_instance_ip_address(
             notebook_config['tag_name'], notebook_config['instance_name']).get('Private')
 
         # generating variables regarding EDGE proxy on Notebook instance
-        instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                notebook_config['instance_name'])
+        instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                   notebook_config['instance_name'])
         edge_instance_name = '{}-{}-{}-edge'.format(notebook_config['service_base_name'],
                                                     notebook_config['project_name'], notebook_config['endpoint_name'])
-        edge_instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
-        edge_instance_private_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                                         edge_instance_name).get('Private')
-        notebook_config['edge_instance_hostname'] = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                                        edge_instance_name)
+        edge_instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
+        edge_instance_private_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                                            edge_instance_name).get('Private')
+        notebook_config['edge_instance_hostname'] = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                                           edge_instance_name)
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        edge_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get('Private')
+        edge_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get(
+            'Private')
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -110,20 +112,20 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # configuring proxy on Notebook instance
@@ -133,15 +135,15 @@
         additional_config = {"proxy_host": edge_instance_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}".format(
             instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-            notebook_config['dlab_ssh_user'])
+            notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # updating repositories & installing python packages
@@ -149,16 +151,16 @@
         logging.info('[INSTALLING PREREQUISITES TO JUPYTER NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO JUPYTER NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".format(
-            instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['aws_region'],
+            instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['aws_region'],
             edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # installing and configuring jupiter and all dependencies
@@ -181,20 +183,20 @@
                    os.environ['aws_region'],
                    os.environ['notebook_spark_version'],
                    os.environ['notebook_hadoop_version'],
-                   notebook_config['dlab_ssh_user'],
+                   notebook_config['datalab_ssh_user'],
                    os.environ['notebook_scala_version'],
                    os.environ['notebook_r_mirror'],
                    notebook_config['ip_address'],
                    notebook_config['exploratory_name'],
                    edge_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_jupyter_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_jupyter_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure jupyter.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure jupyter.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -203,48 +205,48 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing users key.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --nb_tag_name {} --nb_tag_value {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['tag_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -262,24 +264,24 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     keyfile_name,
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'jupyter',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     if notebook_config['image_enabled'] == 'true':
         try:
             print('[CREATING AMI]')
-            ami_id = dlab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
+            ami_id = datalab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
             if ami_id == '' and notebook_config['shared_image_enabled'] == 'false':
                 print("Looks like it's first time we configure notebook server. Creating image.")
                 try:
@@ -288,7 +290,7 @@
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'project_tag:{0};endpoint_tag:{1}'.format(
                         os.environ['project_name'], os.environ['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
@@ -300,21 +302,21 @@
                         os.environ['conf_additional_tags'], os.environ['endpoint_name'])
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'ami:shared;endpoint_tag:{}'.format(os.environ['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
                     print("Image was successfully created. It's ID is {}".format(image_id))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
-            dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+            datalab.fab.append_result("Failed creating image.", str(err))
+            datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
             sys.exit(1)
 
     try:
         # generating output information
-        ip_address = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                           notebook_config['instance_name']).get('Private')
-        dns_name = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
+        ip_address = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                              notebook_config['instance_name']).get('Private')
+        dns_name = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
         jupyter_ip_url = "http://" + ip_address + ":8888/{}/".format(notebook_config['exploratory_name'])
         jupyter_dns_url = "http://" + dns_name + ":8888/{}/".format(notebook_config['exploratory_name'])
         jupyter_notebook_access_url = "https://{}/{}/".format(notebook_config['edge_instance_hostname'],
@@ -327,8 +329,8 @@
         print("Instance name: {}".format(notebook_config['instance_name']))
         print("Private DNS: {}".format(dns_name))
         print("Private IP: {}".format(ip_address))
-        print("Instance ID: {}".format(dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                          notebook_config['instance_name'])))
+        print("Instance ID: {}".format(datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                             notebook_config['instance_name'])))
         print("Instance type: {}".format(notebook_config['instance_type']))
         print("Key name: {}".format(notebook_config['key_name']))
         print("User key name: {}".format(notebook_config['user_keyname']))
@@ -341,15 +343,15 @@
         print("ReverseProxyNotebook".format(jupyter_notebook_access_url))
         print("ReverseProxyUngit".format(jupyter_ungit_access_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
         print('SSH access (from Edge node, via FQDN): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], dns_name))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], dns_name))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": dns_name,
                    "ip": ip_address,
-                   "instance_id": dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                     notebook_config['instance_name']),
+                   "instance_id": datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                        notebook_config['instance_name']),
                    "master_keyname": os.environ['conf_key_name'],
                    "notebook_name": notebook_config['instance_name'],
                    "notebook_image_name": notebook_config['notebook_image_name'],
@@ -366,6 +368,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Error with writing results.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/jupyter_dataengine-service_create_configs.py b/infrastructure-provisioning/src/general/scripts/aws/jupyter_dataengine-service_create_configs.py
index 5f17c07..ca5277f 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/jupyter_dataengine-service_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/jupyter_dataengine-service_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,20 +21,14 @@
 #
 # ******************************************************************************
 
-import boto3
-from botocore.client import Config
-from fabric.api import *
 import argparse
-import os
 import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+import subprocess
+#from datalab.actions_lib import *
+#from datalab.common_lib import *
+#from datalab.fab import *
+#from datalab.notebook_lib import *
+#from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -52,6 +46,8 @@
 parser.add_argument('--pip_mirror', type=str, default='')
 parser.add_argument('--numpy_version', type=str, default='')
 parser.add_argument('--application', type=str, default='')
+parser.add_argument('--master_ip', type=str, default='')
+parser.add_argument('--python_version', type=str, default='')
 args = parser.parse_args()
 
 emr_dir = '/opt/' + args.emr_version + '/jars/'
@@ -62,7 +58,7 @@
 
 def r_kernel(args):
     spark_path = '/opt/{}/{}/spark/'.format(args.emr_version, args.cluster_name)
-    local('mkdir -p {}/r_{}/'.format(kernels_dir, args.cluster_name))
+    subprocess.run('mkdir -p {}/r_{}/'.format(kernels_dir, args.cluster_name), shell=True, check=True)
     kernel_path = "{}/r_{}/kernel.json".format(kernels_dir, args.cluster_name)
     template_file = "/tmp/r_dataengine-service_template.json"
 
@@ -85,9 +81,9 @@
 
 def toree_kernel(args):
     spark_path = '/opt/' + args.emr_version + '/' + args.cluster_name + '/spark/'
-    scala_version = local("Spark-submit --version 2>&1 | awk '/Scala version / {gsub(/,/, \"\"); print $4}'")
+    scala_version = subprocess.run("Spark-submit --version 2>&1 | awk '/Scala version / {gsub(/,/, \"\"); print $4}'", shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
     if args.emr_version == 'emr-4.3.0' or args.emr_version == 'emr-4.6.0' or args.emr_version == 'emr-4.8.0':
-        local('mkdir -p ' + kernels_dir + 'toree_' + args.cluster_name + '/')
+        subprocess.run('mkdir -p ' + kernels_dir + 'toree_' + args.cluster_name + '/', shell=True, check=True)
         kernel_path = kernels_dir + "toree_" + args.cluster_name + "/kernel.json"
         template_file = "/tmp/toree_dataengine-service_template.json"
         with open(template_file, 'r') as f:
@@ -99,15 +95,15 @@
         text = text.replace('SCALA_VERSION', args.scala_version)
         with open(kernel_path, 'w') as f:
             f.write(text)
-        local('touch /tmp/kernel_var.json')
-        local(
-            "PYJ=`find /opt/" + args.emr_version + "/" + args.cluster_name + "/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat " + kernel_path + " | sed 's|PY4J|'$PYJ'|g' > /tmp/kernel_var.json")
-        local('sudo mv /tmp/kernel_var.json ' + kernel_path)
+        subprocess.run('touch /tmp/kernel_var.json', shell=True, check=True)
+        subprocess.run(
+            '''bash -l -c "PYJ=`find /opt/" + args.emr_version + "/" + args.cluster_name + "/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat " + kernel_path + " | sed 's|PY4J|'$PYJ'|g' > /tmp/kernel_var.json" ''', shell=True, check=True)
+        subprocess.run('sudo mv /tmp/kernel_var.json ' + kernel_path, shell=True, check=True)
     else:
-        local('mkdir -p ' + kernels_dir + 'toree_' + args.cluster_name + '/')
-        local('tar zxvf /tmp/toree_kernel.tar.gz -C ' + kernels_dir + 'toree_' + args.cluster_name + '/')
-        local('sudo mv {0}toree_{1}/toree-0.2.0-incubating/* {0}toree_{1}/'.format(kernels_dir, args.cluster_name))
-        local('sudo rm -r {0}toree_{1}/toree-0.2.0-incubating'.format(kernels_dir, args.cluster_name))
+        subprocess.run('mkdir -p ' + kernels_dir + 'toree_' + args.cluster_name + '/', shell=True, check=True)
+        subprocess.run('tar zxvf /tmp/toree_kernel.tar.gz -C ' + kernels_dir + 'toree_' + args.cluster_name + '/', shell=True, check=True)
+        subprocess.run('sudo mv {0}toree_{1}/toree-0.3.0-incubating/* {0}toree_{1}/'.format(kernels_dir, args.cluster_name), shell=True, check=True)
+        subprocess.run('sudo rm -r {0}toree_{1}/toree-0.3.0-incubating'.format(kernels_dir, args.cluster_name), shell=True, check=True)
         kernel_path = kernels_dir + "toree_" + args.cluster_name + "/kernel.json"
         template_file = "/tmp/toree_dataengine-service_templatev2.json"
         with open(template_file, 'r') as f:
@@ -120,12 +116,9 @@
         text = text.replace('SCALA_VERSION', args.scala_version)
         with open(kernel_path, 'w') as f:
             f.write(text)
-        local('touch /tmp/kernel_var.json')
-        local(
-            "PYJ=`find /opt/" + args.emr_version + "/" + args.cluster_name +
-            "/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat " + kernel_path +
-            " | sed 's|PY4J|'$PYJ'|g' > /tmp/kernel_var.json")
-        local('sudo mv /tmp/kernel_var.json ' + kernel_path)
+        subprocess.run('touch /tmp/kernel_var.json', shell=True, check=True)
+        subprocess.run('''bash -l -c "PYJ=`find /opt/{}/{}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {} | sed 's|PY4J|'$PYJ'|g' > /tmp/kernel_var.json" '''.format(args.emr_versio, args.cluster_name, kernel_path), shell=True, check=True)
+        subprocess.run('sudo mv /tmp/kernel_var.json ' + kernel_path, shell=True, check=True)
         run_sh_path = kernels_dir + "toree_" + args.cluster_name + "/bin/run.sh"
         template_sh_file = '/tmp/run_template.sh'
         with open(template_sh_file, 'r') as f:
@@ -140,44 +133,80 @@
     spark_defaults_path = '/opt/' + args.emr_version + '/' + args.cluster_name + '/spark/conf/spark-defaults.conf'
     new_jars_directory_path = '/opt/' + args.emr_version + '/jars/usr/other/'
     breeze_tmp_dir = '/tmp/breeze_tmp_emr/'
-    local('sudo mkdir -p ' + new_jars_directory_path)
-    local('mkdir -p ' + breeze_tmp_dir)
-    local('wget https://repo1.maven.org/maven2/org/scalanlp/breeze_2.11/0.12/breeze_2.11-0.12.jar -O ' +
-          breeze_tmp_dir + 'breeze_2.11-0.12.jar')
-    local('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-natives_2.11/0.12/breeze-natives_2.11-0.12.jar -O '
-          + breeze_tmp_dir + 'breeze-natives_2.11-0.12.jar')
-    local('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-viz_2.11/0.12/breeze-viz_2.11-0.12.jar -O ' +
-          breeze_tmp_dir + 'breeze-viz_2.11-0.12.jar')
-    local('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-macros_2.11/0.12/breeze-macros_2.11-0.12.jar -O ' +
-          breeze_tmp_dir + 'breeze-macros_2.11-0.12.jar')
-    local('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-parent_2.11/0.12/breeze-parent_2.11-0.12.jar -O ' +
-          breeze_tmp_dir + 'breeze-parent_2.11-0.12.jar')
-    local('wget https://repo1.maven.org/maven2/org/jfree/jfreechart/1.0.19/jfreechart-1.0.19.jar -O ' +
-          breeze_tmp_dir + 'jfreechart-1.0.19.jar')
-    local('wget https://repo1.maven.org/maven2/org/jfree/jcommon/1.0.24/jcommon-1.0.24.jar -O ' +
-          breeze_tmp_dir + 'jcommon-1.0.24.jar')
-    local('wget --no-check-certificate https://brunelvis.org/jar/spark-kernel-brunel-all-2.3.jar -O ' +
-          breeze_tmp_dir + 'spark-kernel-brunel-all-2.3.jar')
-    local('sudo mv ' + breeze_tmp_dir + '* ' + new_jars_directory_path)
-    local(""" sudo bash -c "sed -i '/spark.driver.extraClassPath/s/$/:\/opt\/""" + args.emr_version +
-          """\/jars\/usr\/other\/*/' """ + spark_defaults_path + """" """)
+    subprocess.run('sudo mkdir -p ' + new_jars_directory_path, shell=True, check=True)
+    subprocess.run('mkdir -p ' + breeze_tmp_dir, shell=True, check=True)
+    subprocess.run('wget https://repo1.maven.org/maven2/org/scalanlp/breeze_2.11/0.12/breeze_2.11-0.12.jar -O ' +
+          breeze_tmp_dir + 'breeze_2.11-0.12.jar', shell=True, check=True)
+    subprocess.run('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-natives_2.11/0.12/breeze-natives_2.11-0.12.jar -O '
+          + breeze_tmp_dir + 'breeze-natives_2.11-0.12.jar', shell=True, check=True)
+    subprocess.run('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-viz_2.11/0.12/breeze-viz_2.11-0.12.jar -O ' +
+          breeze_tmp_dir + 'breeze-viz_2.11-0.12.jar', shell=True, check=True)
+    subprocess.run('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-macros_2.11/0.12/breeze-macros_2.11-0.12.jar -O ' +
+          breeze_tmp_dir + 'breeze-macros_2.11-0.12.jar', shell=True, check=True)
+    subprocess.run('wget https://repo1.maven.org/maven2/org/scalanlp/breeze-parent_2.11/0.12/breeze-parent_2.11-0.12.jar -O ' +
+          breeze_tmp_dir + 'breeze-parent_2.11-0.12.jar', shell=True, check=True)
+    subprocess.run('wget https://repo1.maven.org/maven2/org/jfree/jfreechart/1.0.19/jfreechart-1.0.19.jar -O ' +
+          breeze_tmp_dir + 'jfreechart-1.0.19.jar', shell=True, check=True)
+    subprocess.run('wget https://repo1.maven.org/maven2/org/jfree/jcommon/1.0.24/jcommon-1.0.24.jar -O ' +
+          breeze_tmp_dir + 'jcommon-1.0.24.jar', shell=True, check=True)
+    subprocess.run('wget --no-check-certificate https://brunelvis.org/jar/spark-kernel-brunel-all-2.3.jar -O ' +
+          breeze_tmp_dir + 'spark-kernel-brunel-all-2.3.jar', shell=True, check=True)
+    subprocess.run('sudo mv ' + breeze_tmp_dir + '* ' + new_jars_directory_path, shell=True, check=True)
+    subprocess.run(""" sudo bash -c "sed -i '/spark.driver.extraClassPath/s/$/:\/opt\/""" + args.emr_version +
+          """\/jars\/usr\/other\/*/' """ + spark_defaults_path + """" """, shell=True, check=True)
+
+def install_sparkamagic_kernels(args):
+    try:
+        subprocess.run('sudo jupyter nbextension enable --py --sys-prefix widgetsnbextension', shell=True, check=True)
+        sparkmagic_dir = subprocess.run("sudo pip3 show sparkmagic | grep 'Location: ' | awk '{print $2}'", capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/sparkkernel --user'.format(sparkmagic_dir), shell=True, check=True)
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/pysparkkernel --user'.format(sparkmagic_dir), shell=True, check=True)
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/sparkrkernel --user'.format(sparkmagic_dir), shell=True, check=True)
+        pyspark_kernel_name = 'PySpark (Python-{0} / Spark-{1} ) [{2}]'.format(args.python_version, args.spark_version,
+                                                                         args.cluster_name)
+        subprocess.run('sed -i \'s|PySpark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/pysparkkernel/kernel.json'.format(
+            pyspark_kernel_name, args.os_user), shell=True, check=True)
+        spark_kernel_name = 'Spark (Scala-{0} / Spark-{1} ) [{2}]'.format(args.scala_version, args.spark_version,
+                                                                         args.cluster_name)
+        subprocess.run('sed -i \'s|Spark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkkernel/kernel.json'.format(
+            spark_kernel_name, args.os_user), shell=True, check=True)
+        sparkr_kernel_name = 'SparkR (R-{0} / Spark-{1} ) [{2}]'.format(args.r_version, args.spark_version,
+                                                                            args.cluster_name)
+        subprocess.run('sed -i \'s|SparkR|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkrkernel/kernel.json'.format(
+            sparkr_kernel_name, args.os_user), shell=True, check=True)
+        subprocess.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/pysparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/pysparkkernel_{1}'.format(args.os_user, args.cluster_name), shell=True, check=True)
+        subprocess.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/sparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/sparkkernel_{1}'.format(args.os_user, args.cluster_name), shell=True, check=True)
+        subprocess.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/sparkrkernel '
+              '/home/{0}/.local/share/jupyter/kernels/sparkrkernel_{1}'.format(args.os_user, args.cluster_name), shell=True, check=True)
+        subprocess.run('mkdir -p /home/' + args.os_user + '/.sparkmagic', shell=True, check=True)
+        subprocess.run('cp -f /tmp/sparkmagic_config_template.json /home/' + args.os_user + '/.sparkmagic/config.json', shell=True, check=True)
+        subprocess.run('sed -i \'s|LIVY_HOST|{0}|g\' /home/{1}/.sparkmagic/config.json'.format(
+                args.master_ip, args.os_user), shell=True, check=True)
+        subprocess.run('sudo chown -R {0}:{0} /home/{0}/.sparkmagic/'.format(args.os_user), shell=True, check=True)
+    except:
+        traceback.print_exc()
+        sys.exit(1)
+
 
 
 if __name__ == "__main__":
     if args.dry_run == 'true':
         parser.print_help()
     else:
-        result = prepare(emr_dir, yarn_dir)
-        if result == False :
-            jars(args, emr_dir)
-        yarn(args, yarn_dir)
-        install_emr_spark(args)
-        pyspark_kernel(kernels_dir, args.emr_version, args.cluster_name, args.spark_version, args.bucket,
-                       args.project_name, args.region, args.os_user, args.application, args.pip_mirror, args.numpy_version)
-        toree_kernel(args)
-        if args.r_version != 'false':
-            print('R version: {}'.format(args.r_version))
-            r_kernel(args)
-        spark_defaults(args)
-        configuring_notebook(args.emr_version)
-        add_breeze_library_emr(args)
+        install_sparkamagic_kernels(args)
+        #result = prepare(emr_dir, yarn_dir)
+        #if result == False :
+        #    jars(args, emr_dir)
+        #yarn(args, yarn_dir)
+        #install_emr_spark(args)
+        #pyspark_kernel(kernels_dir, args.emr_version, args.cluster_name, args.spark_version, args.bucket,
+        #               args.project_name, args.region, args.os_user, args.application, args.pip_mirror, args.numpy_version)
+        #toree_kernel(args)
+        #if args.r_version != 'false':
+        #    print('R version: {}'.format(args.r_version))
+        #    r_kernel(args)
+        #spark_defaults(args)
+        #configuring_notebook(args.emr_version)
+        #add_breeze_library_emr(args)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/jupyter_install_dataengine-service_kernels.py b/infrastructure-provisioning/src/general/scripts/aws/jupyter_install_dataengine-service_kernels.py
index fb29f0a..91a93e8 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/jupyter_install_dataengine-service_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/jupyter_install_dataengine-service_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,10 +22,12 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
 import boto3
-from dlab.meta_lib import *
 import os
+import time
+import subprocess
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -50,51 +52,91 @@
     templates_dir = '/root/templates/'
     files_dir = '/root/files/'
     scripts_dir = '/root/scripts/'
-    put(templates_dir + 'pyspark_dataengine-service_template.json', '/tmp/pyspark_dataengine-service_template.json')
-    put(templates_dir + 'r_dataengine-service_template.json', '/tmp/r_dataengine-service_template.json')
-    put(templates_dir + 'toree_dataengine-service_template.json','/tmp/toree_dataengine-service_template.json')
-    put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application),
+    conn.put(templates_dir + 'sparkmagic_config_template.json', '/tmp/sparkmagic_config_template.json')
+    # conn.put(templates_dir + 'pyspark_dataengine-service_template.json', '/tmp/pyspark_dataengine-service_template.json')
+    # conn.put(templates_dir + 'r_dataengine-service_template.json', '/tmp/r_dataengine-service_template.json')
+    # conn.put(templates_dir + 'toree_dataengine-service_template.json','/tmp/toree_dataengine-service_template.json')
+    conn.put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application),
         '/tmp/jupyter_dataengine-service_create_configs.py')
-    put(files_dir + 'toree_kernel.tar.gz', '/tmp/toree_kernel.tar.gz')
-    put(templates_dir + 'toree_dataengine-service_templatev2.json', '/tmp/toree_dataengine-service_templatev2.json')
-    put(templates_dir + 'run_template.sh', '/tmp/run_template.sh')
-    sudo('\cp /tmp/jupyter_dataengine-service_create_configs.py /usr/local/bin/jupyter_dataengine-service_create_configs.py')
-    sudo('chmod 755 /usr/local/bin/jupyter_dataengine-service_create_configs.py')
-    sudo('mkdir -p /usr/lib/python2.7/dlab/')
-    run('mkdir -p /tmp/dlab_libs/')
-    local('scp -i {} /usr/lib/python2.7/dlab/* {}:/tmp/dlab_libs/'.format(args.keyfile, env.host_string))
-    run('chmod a+x /tmp/dlab_libs/*')
-    sudo('mv /tmp/dlab_libs/* /usr/lib/python2.7/dlab/')
-    if exists('/usr/lib64'):
-        sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+    # conn.put(files_dir + 'toree_kernel.tar.gz', '/tmp/toree_kernel.tar.gz')
+    # conn.put(templates_dir + 'toree_dataengine-service_templatev2.json', '/tmp/toree_dataengine-service_templatev2.json')
+    # conn.put(templates_dir + 'run_template.sh', '/tmp/run_template.sh')
+    conn.sudo(
+        '\cp /tmp/jupyter_dataengine-service_create_configs.py /usr/local/bin/jupyter_dataengine-service_create_configs.py')
+    conn.sudo('chmod 755 /usr/local/bin/jupyter_dataengine-service_create_configs.py')
+    conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+    conn.run('mkdir -p /tmp/datalab_libs/')
+    subprocess.run('scp -i {} /usr/lib/python3.8/datalab/*.py {}@{}:/tmp/datalab_libs'.format(args.keyfile, args.os_user, args.notebook_ip), shell=True, check=True)
+    conn.run('chmod a+x /tmp/datalab_libs/*')
+    conn.sudo('mv /tmp/datalab_libs/* /usr/lib/python3.8/datalab/')
+    if exists(conn, '/usr/lib64'):
+        conn.sudo('mkdir -p /usr/lib64/python3.8')
+        conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
+
+def install_sparkamagic_kernels(args):
+    try:
+        datalab.fab.conn.sudo('jupyter nbextension enable --py --sys-prefix widgetsnbextension')
+        sparkmagic_dir = datalab.fab.conn.sudo(''' bash -l -c 'pip3 show sparkmagic | grep "Location: "' ''').stdout.rstrip("\n\r").split(' ')[1]
+        datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/sparkkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/pysparkkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/sparkrkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        pyspark_kernel_name = 'PySpark (Python-{0} / Spark-{1} ) [{2}]'.format(args.python_version, args.spark_version,
+                                                                         args.cluster_name)
+        datalab.fab.conn.sudo('sed -i \'s|PySpark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/pysparkkernel/kernel.json'.format(
+            pyspark_kernel_name, args.os_user))
+        spark_kernel_name = 'Spark (Scala-{0} / Spark-{1} ) [{2}]'.format(args.scala_version, args.spark_version,
+                                                                         args.cluster_name)
+        datalab.fab.conn.sudo('sed -i \'s|Spark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkkernel/kernel.json'.format(
+            spark_kernel_name, args.os_user))
+        sparkr_kernel_name = 'SparkR (R-{0} / Spark-{1} ) [{2}]'.format(args.r_version, args.spark_version,
+                                                                            args.cluster_name)
+        datalab.fab.conn.sudo('sed -i \'s|SparkR|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkrkernel/kernel.json'.format(
+            sparkr_kernel_name, args.os_user))
+        datalab.fab.conn.sudo('mkdir -p /home/' + args.os_user + '/.sparkmagic')
+        datalab.fab.conn.sudo('cp -f /tmp/sparkmagic_config_template.json /home/' + args.os_user + '/.sparkmagic/config.json')
+        datalab.fab.conn.sudo('sed -i \'s|LIVY_HOST|{0}|g\' /home/{1}/.sparkmagic/config.json'.format(
+                args.master_ip, args.os_user))
+        datalab.fab.conn.sudo('chown -R {0}:{0} /home/{0}/.sparkmagic/'.format(args.os_user))
+    except:
+        traceback.print_exc()
+        sys.exit(1)
 
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     configure_notebook(args)
-    spark_version = get_spark_version(args.cluster_name)
-    hadoop_version = get_hadoop_version(args.cluster_name)
+    args.spark_version = get_spark_version(args.cluster_name)
+    args.hadoop_version = get_hadoop_version(args.cluster_name)
     r_enabled = os.environ['notebook_r_enabled']
-    numpy_version = os.environ['notebook_numpy_version']
-    s3_client = boto3.client('s3', config=Config(signature_version='s3v4'), region_name=args.region)
+    #numpy_version = os.environ['notebook_numpy_version']
+    s3_client = boto3.client('s3', config=botoConfig(signature_version='s3v4'), region_name=args.region)
     s3_client.download_file(args.bucket, args.project_name + '/' + args.cluster_name + '/scala_version',
                             '/tmp/scala_version')
-    with file('/tmp/scala_version') as f:
-        scala_version = str(f.read()).rstrip()
-        print(scala_version)
+    s3_client.download_file(args.bucket, args.project_name + '/' + args.cluster_name + '/python_version',
+                            '/tmp/python_version')
+    with open('/tmp/scala_version') as f:
+        args.scala_version = str(f.read()).rstrip()
+        print(args.scala_version)
+    with open('/tmp/python_version') as f:
+        args.python_version = str(f.read()).rstrip()
+        print(args.python_version)
     if r_enabled == 'true':
         s3_client.download_file(args.bucket, args.project_name + '/' + args.cluster_name + '/r_version', '/tmp/r_version')
-        with file('/tmp/r_version') as g:
-            r_version = str(g.read()).rstrip()
-            print(r_version)
+        with open('/tmp/r_version') as g:
+            args.r_version = str(g.read()).rstrip()
+            print(args.r_version)
     else:
         r_version = 'false'
-    sudo("/usr/bin/python /usr/local/bin/jupyter_dataengine-service_create_configs.py --bucket " + args.bucket
-         + " --cluster_name " + args.cluster_name + " --emr_version " + args.emr_version + " --spark_version "
-         + spark_version + " --scala_version " + scala_version + " --r_version " + r_version + " --hadoop_version "
-         + hadoop_version + " --region " + args.region + " --excluded_lines '" + args.emr_excluded_spark_properties
-         + "' --project_name " + args.project_name + " --os_user " + args.os_user + " --pip_mirror "
-         + args.pip_mirror + " --numpy_version " + numpy_version + " --application " + args.application)
+    cluster_id = get_emr_id_by_name(args.cluster_name)
+    master_instances = get_emr_instances_list(cluster_id, 'MASTER')
+    args.master_ip = master_instances[0].get('PrivateIpAddress')
+    #conn.sudo("/usr/bin/python3 /usr/local/bin/jupyter_dataengine-service_create_configs.py --bucket " + args.bucket
+    #     + " --cluster_name " + args.cluster_name + " --emr_version " + args.emr_version + " --spark_version "
+    #     + spark_version + " --scala_version " + scala_version + " --r_version " + r_version + " --hadoop_version "
+    #     + hadoop_version + " --region " + args.region + " --excluded_lines '" + args.emr_excluded_spark_properties
+    #     + "' --project_name " + args.project_name + " --os_user " + args.os_user + " --pip_mirror "
+    #     + args.pip_mirror + " --numpy_version " + numpy_version + " --application "
+    #     + args.application + " --master_ip " + master_ip + " --python_version " + python_version)
+
+    install_sparkamagic_kernels(args)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/jupyterlab_configure.py b/infrastructure-provisioning/src/general/scripts/aws/jupyterlab_configure.py
index d828df5..425c08d 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/jupyterlab_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/jupyterlab_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,17 @@
 #
 # ******************************************************************************
 
-import logging
+import argparse
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import argparse
-from fabric.api import *
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--uuid', type=str, default='')
@@ -81,25 +82,26 @@
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
         notebook_config['tag_name'] = '{}-tag'.format(notebook_config['service_base_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
-        notebook_config['ip_address'] = dlab.meta_lib.get_instance_ip_address(
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['ip_address'] = datalab.meta_lib.get_instance_ip_address(
             notebook_config['tag_name'], notebook_config['instance_name']).get('Private')
 
         # generating variables regarding EDGE proxy on Notebook instance
-        instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                notebook_config['instance_name'])
+        instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                   notebook_config['instance_name'])
         edge_instance_name = '{}-{}-{}-edge'.format(notebook_config['service_base_name'],
                                                     notebook_config['project_name'], notebook_config['endpoint_name'])
-        edge_instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
-        edge_instance_private_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                                         edge_instance_name).get('Private')
-        notebook_config['edge_instance_hostname'] = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                                        edge_instance_name)
+        edge_instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
+        edge_instance_private_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                                            edge_instance_name).get('Private')
+        notebook_config['edge_instance_hostname'] = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                                           edge_instance_name)
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        edge_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get('Private')
+        edge_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get(
+            'Private')
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -110,20 +112,20 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
-        params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format\
-            (instance_hostname,  "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
-             notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
+        params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format \
+            (instance_hostname, "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
+             notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # configuring proxy on Notebook instance
@@ -133,31 +135,31 @@
         additional_config = {"proxy_host": edge_instance_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # updating repositories & installing python packages
     try:
         logging.info('[INSTALLING PREREQUISITES TO JUPYTERLAB NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO JUPYTERLAB NOTEBOOK INSTANCE]')
-        params = "--hostname {} --keyfile {} --user {} --region {}".\
-            format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['aws_region'])
+        params = "--hostname {} --keyfile {} --user {} --region {}". \
+            format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['aws_region'])
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # installing and configuring jupiter and all dependencies
@@ -181,19 +183,19 @@
                    os.environ['aws_region'],
                    os.environ['notebook_spark_version'],
                    os.environ['notebook_hadoop_version'],
-                   notebook_config['dlab_ssh_user'],
+                   notebook_config['datalab_ssh_user'],
                    os.environ['notebook_scala_version'],
                    os.environ['notebook_r_mirror'],
                    notebook_config['ip_address'],
                    notebook_config['exploratory_name'])
         try:
-            local("~/scripts/{}.py {}".format('configure_jupyterlab_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_jupyterlab_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure jupyterlab.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure jupyterlab.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -202,48 +204,48 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing users key.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --nb_tag_name {} --nb_tag_value {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['tag_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -261,34 +263,34 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     keyfile_name,
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'jupyter',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
-    if notebook_config['shared_image_enabled'] == 'true':
+    if notebook_config['image_enabled'] == 'true':
         try:
             print('[CREATING AMI]')
-            ami_id = dlab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
+            ami_id = datalab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
             if ami_id == '':
                 print("Looks like it's first time we configure notebook server. Creating image.")
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
                     print("Image was successfully created. It's ID is {}".format(image_id))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
-            dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+            datalab.fab.append_result("Failed creating image.", str(err))
+            datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
             sys.exit(1)
 
     try:
@@ -299,15 +301,15 @@
                  "--os_user {} ". \
             format(instance_hostname,
                    keyfile_name,
-                   notebook_config['dlab_ssh_user'])
+                   notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/configure_proxy_for_docker.py {}".format(params))
+            subprocess.run("~/scripts/configure_proxy_for_docker.py {}".format(params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy for docker.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure proxy for docker.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -318,22 +320,22 @@
                  "--os_user {} ". \
             format(instance_hostname,
                    keyfile_name,
-                   notebook_config['dlab_ssh_user'])
+                   notebook_config['datalab_ssh_user'])
         try:
-           local("~/scripts/jupyterlab_container_start.py {}".format(params))
+           subprocess.run("~/scripts/jupyterlab_container_start.py {}".format(params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to start Jupyter container.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to start Jupyter container.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         # generating output information
-        ip_address = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                           notebook_config['instance_name']).get('Private')
-        dns_name = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
+        ip_address = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                              notebook_config['instance_name']).get('Private')
+        dns_name = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
         jupyter_ip_url = "http://" + ip_address + ":8888/{}/".format(notebook_config['exploratory_name'])
         jupyter_dns_url = "http://" + dns_name + ":8888/{}/".format(notebook_config['exploratory_name'])
         jupyter_notebook_acces_url = "http://{}/{}/".format(notebook_config['edge_instance_hostname'],
@@ -346,8 +348,8 @@
         print("Instance name: {}".format(notebook_config['instance_name']))
         print("Private DNS: {}".format(dns_name))
         print("Private IP: {}".format(ip_address))
-        print("Instance ID: {}".format(dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                          notebook_config['instance_name'])))
+        print("Instance ID: {}".format(datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                             notebook_config['instance_name'])))
         print("Instance type: {}".format(notebook_config['instance_type']))
         print("Key name: {}".format(notebook_config['key_name']))
         print("User key name: {}".format(notebook_config['user_keyname']))
@@ -360,15 +362,15 @@
         print("ReverseProxyNotebook".format(jupyter_notebook_acces_url))
         print("ReverseProxyUngit".format(jupyter_ungit_acces_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
         print('SSH access (from Edge node, via FQDN): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], dns_name))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], dns_name))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": dns_name,
                    "ip": ip_address,
-                   "instance_id": dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                     notebook_config['instance_name']),
+                   "instance_id": datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                        notebook_config['instance_name']),
                    "master_keyname": os.environ['conf_key_name'],
                    "notebook_name": notebook_config['instance_name'],
                    "notebook_image_name": notebook_config['notebook_image_name'],
@@ -385,6 +387,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Error with writing results.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/odahu_deploy.py b/infrastructure-provisioning/src/general/scripts/aws/odahu_deploy.py
new file mode 100644
index 0000000..64a67a8
--- /dev/null
+++ b/infrastructure-provisioning/src/general/scripts/aws/odahu_deploy.py
@@ -0,0 +1,294 @@
+#!/usr/bin/python3
+
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+import logging
+import json
+import sys
+from datalab.fab import *
+from datalab.meta_lib import *
+from datalab.actions_lib import *
+import os
+import base64
+import subprocess
+
+if __name__ == "__main__":
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
+                                               os.environ['request_id'])
+    local_log_filepath = "/logs/project/" + local_log_filename
+    logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
+                        level=logging.DEBUG,
+                        filename=local_log_filepath)
+
+    print('Generating infrastructure names and tags')
+    odahu_conf = dict()
+    odahu_conf['allowed_cidr'] = os.environ['odahu_allowed_cidr'].split(',')
+    odahu_conf['project_id'] = (os.environ['gcp_project_id'])
+    odahu_conf['region'] = (os.environ['aws_region'])
+    odahu_conf['zone'] = (os.environ['aws_zone'])
+    odahu_conf['edge_user_name'] = os.environ['edge_user_name']
+    odahu_conf['dns_zone_name'] = os.environ['odahu_dns_zone_name']
+    odahu_conf['docker_repo'] = os.environ['odahu_docker_repo']
+    odahu_conf['cidr'] = os.environ['odahu_cidr']
+    odahu_conf['service_base_name'] = (os.environ['conf_service_base_name']).lower().replace('_', '-')
+    odahu_conf['project_name'] = (os.environ['project_name']).lower().replace('_', '-')
+    odahu_conf['cluster_name'] = "{}-{}".format((os.environ['conf_service_base_name']).lower().replace('_', '-'),
+                                                (os.environ['odahu_cluster_name']).lower().replace('_', '-'))
+    odahu_conf['bucket_name'] = "{}-tfstate".format(odahu_conf['cluster_name'])
+    try:
+        if os.environ['gcp_vpc_name'] == '':
+            raise KeyError
+        else:
+            odahu_conf['vpc_name'] = os.environ['gcp_vpc_name']
+    except KeyError:
+        odahu_conf['vpc_name'] = odahu_conf['service_base_name'] + '-ssn-vpc'
+    odahu_conf['vpc_cidr'] = os.environ['conf_vpc_cidr']
+    tag = {"Key": '{}-Tag'.format(odahu_conf['service_base_name']),
+           "Value": "{}-{}-subnet".format(odahu_conf['service_base_name'], odahu_conf['project_name'])}
+    odahu_conf['private_subnet_cidr'] = get_subnet_by_tag(tag)
+    odahu_conf['grafana_admin'] = os.environ['odahu_grafana_admin']
+    odahu_conf['grafana_pass'] = id_generator()
+    odahu_conf['docker_password'] = base64.b64decode(os.environ['odahu_docker_password'] + "==")
+    odahu_conf['initial_node_count'] = os.environ['odahu_initial_node_count']
+    odahu_conf['istio_helm_repo'] = os.environ['odahu_istio_helm_repo']
+    odahu_conf['helm_repo'] = os.environ['odahu_helm_repo']
+    odahu_conf['k8s_version'] = os.environ['odahu_k8s_version']
+    odahu_conf['oauth_oidc_issuer_url'] = "{}/realms/{}".format(os.environ['keycloak_auth_server_url'],
+                                                                os.environ['keycloak_realm_name'])
+    odahu_conf['oauth_oidc_host'] = os.environ['keycloak_auth_server_url'].replace('https://', '').replace('/auth', '')
+    odahu_conf['oauth_client_id'] = os.environ['keycloak_client_name']
+    odahu_conf['oauth_client_secret'] = os.environ['keycloak_client_secret']
+    odahu_conf['oauth_cookie_secret'] = base64.b64encode(id_generator(16))
+    odahu_conf['oauth_local_jwks'] = os.environ['odahu_oauth_local_jwks']
+    odahu_conf['infra_version'] = os.environ['odahu_infra_version']
+    odahu_conf['odahuflow_version'] = os.environ['odahu_odahuflow_version']
+    odahu_conf['mlflow_toolchain_version'] = os.environ['odahu_mlflow_toolchain_version']
+    odahu_conf['jupyterlab_version'] = os.environ['odahu_jupyterlab_version']
+    odahu_conf['packager_version'] = os.environ['odahu_packager_version']
+    odahu_conf['infra_cidr'] = os.environ['odahu_pods_cidr']
+    odahu_conf['root_domain'] = os.environ['odahu_root_domain']
+    odahu_conf['service_cidr'] = os.environ['odahu_service_cidr']
+    odahu_conf['tls_crt'] = base64.b64decode(os.environ['odahu_tls_crt'] + "==")
+    odahu_conf['tls_key'] = base64.b64decode(os.environ['odahu_tls_key'] + "==")
+    odahu_conf['ssh_key'] = os.environ['ssh_key']
+    odahu_conf['dns_project_id'] = os.environ['odahu_dns_project_id']
+    odahu_conf['decrypt_token'] = id_generator()
+    odahu_conf['infra_vpc_peering'] = os.environ['odahu_infra_vpc_peering']
+    odahu_conf['automation_version'] = os.environ['odahu_automation_version']
+    odahu_conf['ui_version'] = os.environ['odahu_ui_version']
+    odahu_conf['examples_version'] = os.environ['odahu_examples_version']
+    odahu_conf['jupyterhub_enabled'] = os.environ['odahu_jupyterhub_enabled']
+    odahu_conf['oauth_mesh_enabled'] = os.environ['odahu_oauth_mesh_enabled']
+    odahu_conf['keysecret'] = os.environ['odahu_keysecret']
+    odahu_conf['airflow_secret'] = os.environ['odahu_airflow_secret']
+    odahu_conf['operator_secret'] =os.environ['odahu_operator_secret']
+    odahu_conf['resource-uploader_secret'] = os.environ['odahu_resource_uploader_secret']
+    odahu_conf['tester_secret'] = os.environ['odahu_tester_secret']
+    odahu_conf['tester-data-scientist_secret'] = os.environ['odahu_tester_data_scientist_secret']
+
+    print('Preparing parameters file')
+    try:
+        subprocess.run("cp /root/templates/profile.json /tmp/", shell=True, check=True)
+        with open("/tmp/profile.json", 'w') as profile:
+            prof ={
+                    "allowed_ips": odahu_conf['allowed_cidr'],
+                    "authorization_enabled": "true",
+                    "authz_dry_run": "false",
+                    "cloud": {
+                        "aws": {
+                            "az_list": ["{}".format(odahu_conf['zone'])],
+                            "zone": "{}".format(odahu_conf['zone']),
+                        },
+                        "region": "{}".format(odahu_conf['region']),
+                        "type": "aws"
+                    },
+                    "cluster_name": "{}".format(odahu_conf['cluster_name']),
+                    "cluster_type": "aws/eks",
+                    "data_bucket": "{}-data-bucket".format(odahu_conf['cluster_name']),
+                    "dns": {
+                        "domain": "odahu.{}.{}".format(odahu_conf['cluster_name'], odahu_conf['root_domain']),
+                        "gcp_credentials": "{}",
+                        "gcp_project_id": "{}".format(odahu_conf['project_id']),
+                        "provider": "gcp",
+                        "zone_name": "{}".format(odahu_conf['dns_zone_name']),
+                    },
+                    "docker_password": "{}".format(odahu_conf['docker_password']),
+                    "docker_repo": "{}".format(odahu_conf['docker_repo']),
+                    "docker_username": "_json_key",
+                    "infra_cidr": "{}".format(odahu_conf['infra_cidr']),
+                    "examples_version": "{}".format(odahu_conf['examples_version']),
+                    "grafana_pass": "{}".format(odahu_conf['grafana_pass']),
+                    "helm_repo": "{}".format(odahu_conf['helm_repo']),
+                    "jupyterhub_enabled": odahu_conf['jupyterhub_enabled'],
+                    "jupyterlab_version": "{}".format(odahu_conf['jupyterlab_version']),
+                    "k8s_version": "{}".format(odahu_conf['k8s_version']),
+                    "mlflow_toolchain_version": "{}".format(odahu_conf['mlflow_toolchain_version']),
+                    "nat_subnet_cidr": "{}".format(odahu_conf['cidr']),
+                    "node_pools": {
+                        "main": {
+                            "init_node_count": 1,
+                            "max_node_count": 7,
+                            "min_node_count": 1
+                        },
+                        "model_deployment": {
+                            "labels": {
+                                "mode": "odahu-flow-deployment"
+                            },
+                            "max_node_count": 3,
+                            "taints": [
+                                {
+                                    "effect": "NO_SCHEDULE",
+                                    "key": "dedicated",
+                                    "value": "deployment"
+                                }
+                            ]
+                        },
+                        "packaging": {
+                            "disk_size_gb": 100,
+                            "labels": {
+                                "mode": "odahu-flow-packaging"
+                            },
+                            "max_node_count": 3,
+                            "taints": [
+                                {
+                                    "effect": "NO_SCHEDULE",
+                                    "key": "dedicated",
+                                    "value": "packaging"
+                                }
+                            ]
+                        },
+                        "training": {
+                            "disk_size_gb": 50,
+                            "labels": {
+                                "mode": "odahu-flow-training"
+                            },
+                            "machine_type": "c5.2xlarge",
+                            "taints": [
+                                {
+                                    "effect": "NO_SCHEDULE",
+                                    "key": "dedicated",
+                                    "value": "training"
+                                }
+                            ]
+                        }
+                    },
+                    "oauth_client_id": "{}".format(odahu_conf['oauth_client_id']),
+                    "oauth_client_secret": "{}".format(odahu_conf['oauth_client_secret']),
+                    "oauth_cookie_secret": "{}".format(odahu_conf['oauth_cookie_secret']),
+                    "oauth_local_jwks": "{}".format(odahu_conf['oauth_local_jwks']),
+                    "oauth_mesh_enabled": odahu_conf['oauth_mesh_enabled'],
+                    "oauth_oidc_audience": "legion",
+                    "oauth_oidc_host": "{}".format(odahu_conf['oauth_oidc_host']),
+                    "oauth_oidc_issuer_url": "{}".format(odahu_conf['oauth_oidc_issuer_url']),
+                    "oauth_oidc_jwks_url": "{}/protocol/openid-connect/certs".format(odahu_conf['oauth_oidc_issuer_url']),
+                    "oauth_oidc_port": 443,
+                    "oauth_oidc_scope": "openid profile email offline_access groups",
+                    "oauth_oidc_token_endpoint": "{}/protocol/openid-connect/token".format(odahu_conf['oauth_oidc_issuer_url']),
+                    "odahu_automation_version": "{}".format(odahu_conf['automation_version']),
+                    "odahu_infra_version": "{}".format(odahu_conf['infra_version']),
+                    "odahu_ui_version": "{}".format(odahu_conf['ui_version']),
+                    "odahuflow_connection_decrypt_token": "{}".format(odahu_conf['decrypt_token']),
+                    "odahuflow_connections": [
+                        {
+                            "id": "odahu-flow-examples",
+                            "spec": {
+                                "description": "Git repository with the Odahu-Flow examples",
+                                "keySecret": "{}".format(odahu_conf['keysecret']),
+                                "reference": "{}".format(odahu_conf['examples_version']),
+                                "type": "git",
+                                "uri": "git@github.com:odahu/odahu-examples.git",
+                                "webUILink": "https://github.com/odahu/odahu-examples"
+                            }
+                        }
+                    ],
+                    "odahuflow_version": "{}".format(odahu_conf['odahuflow_version']),
+                    "opa_policies": {},
+                    "packager_version": "{}".format(odahu_conf['packager_version']),
+                    "service_accounts": {
+                        "airflow": {
+                            "client_id": "sa-airflow",
+                            "client_secret": "{}".format(odahu_conf['airflow_secret'])
+                        },
+                        "operator": {
+                            "client_id": "sa-operator",
+                            "client_secret": "{}".format(odahu_conf['operator_secret'])
+                        },
+                        "resource_uploader": {
+                            "client_id": "sa-resource-uploader",
+                            "client_secret": "{}".format(odahu_conf['resource-uploader_secret'])
+                        },
+                        "test": {
+                            "client_id": "sa-tester",
+                            "client_secret": "{}".format(odahu_conf['tester_secret'])
+                        },
+                        "test_data_scientist": {
+                            "client_id": "sa-tester-data-scientist",
+                            "client_secret": "{}".format(odahu_conf['tester-data-scientist_secret'])
+                        }
+                    },
+                    "service_cidr": "{}".format(odahu_conf['service_cidr']),
+                    "ssh_key": "{}".format(odahu_conf['ssh_key'].replace('\n', '')),
+                    "subnet_name": "{}".format(odahu_conf['private_subnet_name']),
+                    "tfstate_bucket": "{}-tfstate".format(odahu_conf['cluster_name']),
+                    "tls_crt": "{}".format(odahu_conf['tls_crt']),
+                    "tls_key": "{}".format(odahu_conf['tls_key']),
+                    "vpc_name": "{}".format(odahu_conf['vpc_name']),
+                    "vault": {
+                        "enabled": "true"
+                    }
+                    }
+            profile.write(json.dumps(prof))
+        subprocess.run('cat /tmp/profile.json', shell=True, check=True)
+        subprocess.run('cp /tmp/profile.json /', shell=True, check=True)
+    except Exception as err:
+        traceback.print_exc()
+        append_result("Failed to configure parameter file.", str(err))
+        GCPActions().remove_bucket(odahu_conf['bucket_name'])
+        GCPActions().remove_static_address(odahu_conf['static_address_name'], odahu_conf['region'])
+        sys.exit(1)
+
+    try:
+        subprocess.run('tf_runner create -o /tmp/result.json', shell=True, check=True)
+        subprocess.run("sed -i 's|name|description|g' /tmp/result.json", shell=True, check=True)
+    except Exception as err:
+        traceback.print_exc()
+        append_result("Failed to deploy Odahu cluster.", str(err))
+        GCPActions().remove_bucket(odahu_conf['bucket_name'])
+        GCPActions().remove_static_address(odahu_conf['static_address_name'], odahu_conf['region'])
+        sys.exit(1)
+
+    # generating output information
+    print('[SUMMARY]')
+    logging.info('[SUMMARY]')
+    print('Cluster name: {}'.format(odahu_conf['cluster_name']))
+    with open('/tmp/result.json', 'r') as f:
+        output = json.load(f)
+        odahu_urls = json.dumps(output['odahu_urls']['value'], sort_keys=True, indent=4)
+    print('Odahu urls: {}'.format(odahu_urls))
+    res = dict()
+    res['odahu_urls'] = output['odahu_urls']['value']
+    res['oauth_cookie_secret'] = odahu_conf['oauth_cookie_secret']
+    res['odahuflow_connection_decrypt_token'] = odahu_conf['decrypt_token']
+    res['grafana_pass'] = odahu_conf['grafana_pass']
+    res['grafana_admin'] = odahu_conf['grafana_admin']
+    with open("/root/result.json", 'w') as result:
+        result.write(json.dumps(res))
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/aws/odahu_prepare.py b/infrastructure-provisioning/src/general/scripts/aws/odahu_prepare.py
new file mode 100644
index 0000000..4a8e9e7
--- /dev/null
+++ b/infrastructure-provisioning/src/general/scripts/aws/odahu_prepare.py
@@ -0,0 +1,159 @@
+#!/usr/bin/python3
+
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+import logging
+import json
+import sys
+import requests
+import subprocess
+from datalab.fab import *
+from datalab.meta_lib import *
+from datalab.actions_lib import *
+import os
+
+if __name__ == "__main__":
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
+                                               os.environ['request_id'])
+    local_log_filepath = "/logs/project/" + local_log_filename
+    logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
+                        level=logging.DEBUG,
+                        filename=local_log_filepath)
+
+    print('Generating infrastructure names and tags')
+    odahu_conf = dict()
+    odahu_conf['service_base_name'] = (os.environ['conf_service_base_name']).lower().replace('_', '-')
+    odahu_conf['project_name'] = (os.environ['project_name']).lower().replace('_', '-')
+    odahu_conf['endpoint_name'] = (os.environ['endpoint_name']).lower().replace('_', '-')
+    odahu_conf['cluster_name'] = "{}-{}".format((os.environ['conf_service_base_name']).lower().replace('_', '-'),
+                                                (os.environ['odahu_cluster_name']).lower().replace('_', '-'))
+    odahu_conf['tag_name'] = '{}-tag'.format(odahu_conf['service_base_name'])
+    odahu_conf['endpoint_tag'] = (os.environ['endpoint_name']).lower().replace('_', '-')
+    odahu_conf['project_tag'] = (os.environ['project_name']).lower().replace('_', '-')
+    odahu_conf['region'] = os.environ['gcp_region']
+    odahu_conf['ssn_subnet_id'] = os.environ['ssn_subnet_id']
+    odahu_conf['bucket_name'] = "{}-tfstate".format(odahu_conf['cluster_name'])
+    odahu_conf['static_address_name'] = "{}-nat-gw".format(odahu_conf['cluster_name'])
+    odahu_conf['keycloak_auth_server_url'] = os.environ['keycloak_auth_server_url']
+    odahu_conf['keycloak_realm_name'] = os.environ['keycloak_realm_name']
+    odahu_conf['keycloak_client_name'] = os.environ['keycloak_client_name']
+    odahu_conf['keycloak_user'] = os.environ['keycloak_user']
+    odahu_conf['keycloak_user_password'] = os.environ['keycloak_user_password']
+    odahu_conf['root_domain'] = os.environ['odahu_root_domain']
+    if 'conf_additional_tags' in os.environ:
+        odahu_conf['bucket_additional_tags'] = ';' + os.environ['conf_additional_tags']
+        os.environ['conf_additional_tags'] = os.environ['conf_additional_tags'] + \
+                                             ';project_tag:{0};endpoint_tag:{1};'.format(
+                                                 odahu_conf['project_tag'], odahu_conf['endpoint_tag'])
+    else:
+        odahu_conf['bucket_additional_tags'] = ''
+        os.environ['conf_additional_tags'] = 'project_tag:{0};endpoint_tag:{1}'.format(odahu_conf['project_tag'],
+                                                                                       odahu_conf['endpoint_tag'])
+    print('Additional tags will be added: {}'.format(os.environ['conf_additional_tags']))
+
+
+    try:
+        logging.info('[CREATE STATE BUCKETS]')
+        print('[CREATE STATE BUCKETS]')
+
+        odahu_conf['bucket_tags'] = 'endpoint_tag:{0};{1}:{2};project_tag:{3};{4}:{5}{6}'\
+            .format(odahu_conf['endpoint_tag'], os.environ['conf_billing_tag_key'], os.environ['conf_billing_tag_value'],
+                    odahu_conf['project_tag'], odahu_conf['tag_name'], odahu_conf['bucket_name'],
+                    odahu_conf['bucket_additional_tags']).replace(';', ',')
+
+        params = "--bucket_name {0} --bucket_tags {1} --region {2} --bucket_name_tag {0}". \
+            format(odahu_conf['bucket_name'], odahu_conf['bucket_tags'], odahu_conf['region'])
+        try:
+            subprocess.run("~/scripts/{}.py {}".format('common_create_bucket', params), shell=True, check=True)
+        except:
+            traceback.print_exc()
+            raise Exception
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Unable to create bucket.", str(err))
+        sys.exit(1)
+
+    try:
+        logging.info('[CREATE NAT GATEWAY]')
+        print('[CREATE NAT GATEWAY]')
+        print("Allocating Elastic IP")
+        allocation_id = allocate_elastic_ip()
+        tag = {"Key": odahu_conf['tag_name'], "Value": odahu_conf['static_address_name']}
+        tag_name = {"Key": "Name", "Value": odahu_conf['static_address_name']}
+        create_tag(allocation_id, tag)
+        create_tag(allocation_id, tag_name)
+        print("Creating NAT")
+        create_nat_gatway(allocation_id, odahu_conf['ssn_subnet_id'], odahu_conf['project_tag'])
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Unable to Unable to create NAT Gateway.", str(err))
+        remove_s3(bucket_type='odahu')
+        sys.exit(1)
+
+    try:
+        print('[CONFIGURE REDIRECT URI]')
+        logging.info('[CONFIGURE REDIRECT URI]')
+        keycloak_auth_server_url = '{}/realms/master/protocol/openid-connect/token'.format(
+            odahu_conf['keycloak_auth_server_url'])
+        keycloak_auth_data = {
+            "username": odahu_conf['keycloak_user'],
+            "password": odahu_conf['keycloak_user_password'],
+            "grant_type": "password",
+            "client_id": "admin-cli",
+        }
+        keycloak_client_create_url = '{0}/admin/realms/{1}/clients'.format(odahu_conf['keycloak_auth_server_url'],
+                                                                           odahu_conf['keycloak_realm_name'])
+        odahu_redirectUris = 'https://odahu.{0}.{1}/*,http://odahu.{0}.{1}/*'.format(odahu_conf['cluster_name'],
+                                                                                        odahu_conf['root_domain']).split(',')
+
+
+        try:
+            keycloak_token = requests.post(keycloak_auth_server_url, data=keycloak_auth_data, verify=False).json()
+            keycloak_get_Uris = requests.get(keycloak_client_create_url,
+                                            headers={"Authorization": "Bearer " + keycloak_token.get("access_token"),
+                                                     "Content-Type": "application/json"}, verify=False).json()
+            for dict in keycloak_get_Uris:
+                if dict["clientId"] == odahu_conf['keycloak_client_name']:
+                    ui_redirectUris = dict["redirectUris"]
+                    keycloak_client_id = dict["id"]
+            keycloak_redirectUris = odahu_redirectUris + ui_redirectUris
+            updated_client_data = {
+                "clientId": odahu_conf['keycloak_client_name'],
+                "id": keycloak_client_id,
+                "enabled": "true",
+                "redirectUris": keycloak_redirectUris,
+                "publicClient": "false",
+                "protocol": "openid-connect",
+            }
+            client_url = "{}/{}".format(keycloak_client_create_url, keycloak_client_id)
+            keycloak_update_Uris = requests.put(client_url, json=updated_client_data,
+                                            headers={"Authorization": "Bearer " + keycloak_token.get("access_token"),
+                                                     "Content-Type": "application/json"}, verify=False)
+        except Exception as err:
+            append_result("Failed to configure keycloak.")
+            sys.exit(1)
+    except Exception as err:
+        print('Error: {0}'.format(err))
+        append_result("Failed to configure keycloak.", str(err))
+        remove_s3(bucket_type='odahu')
+        release_elastic_ip(allocation_id)
+        sys.exit(1)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/aws/project_prepare.py b/infrastructure-provisioning/src/general/scripts/aws/project_prepare.py
index 9d44ba5..48497b2 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/project_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/project_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,18 @@
 #
 # ******************************************************************************
 
+import boto3
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
+import os
 import sys
 import time
-import os
 import traceback
-import boto3
-import logging
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -43,10 +43,10 @@
                         filename=local_log_filepath)
 
     try:
-        dlab.actions_lib.create_aws_config_files()
+        datalab.actions_lib.create_aws_config_files()
         print('Generating infrastructure names and tags')
         project_conf = dict()
-        project_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
+        project_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
             os.environ['conf_service_base_name'][:20], '-', True)
         project_conf['endpoint_name'] = os.environ['endpoint_name']
         project_conf['endpoint_tag'] = project_conf['endpoint_name']
@@ -56,10 +56,11 @@
         project_conf['public_subnet_id'] = os.environ['aws_subnet_id']
         project_conf['vpc_id'] = os.environ['aws_vpc_id']
         project_conf['region'] = os.environ['aws_region']
-        project_conf['ami_id'] = dlab.meta_lib.get_ami_id(os.environ['aws_{}_image_name'.format(
+        project_conf['ami_id'] = datalab.meta_lib.get_ami_id(os.environ['aws_{}_image_name'.format(
             os.environ['conf_os_family'])])
         project_conf['instance_size'] = os.environ['aws_edge_instance_size']
         project_conf['sg_ids'] = os.environ['aws_security_groups_ids']
+        project_conf['instance_class'] = 'edge'
         project_conf['edge_instance_name'] = '{}-{}-{}-edge'.format(project_conf['service_base_name'],
                                                                     project_conf['project_name'],
                                                                     project_conf['endpoint_name'])
@@ -117,11 +118,11 @@
         project_conf['provision_instance_ip'] = None
         project_conf['local_endpoint'] = False
         try:
-            project_conf['provision_instance_ip'] = '{}/32'.format(dlab.meta_lib.get_instance_ip_address(
+            project_conf['provision_instance_ip'] = '{}/32'.format(datalab.meta_lib.get_instance_ip_address(
                 project_conf['tag_name'], '{0}-{1}-endpoint'.format(project_conf['service_base_name'],
                                                                     project_conf['endpoint_name'])).get('Private'))
         except:
-            project_conf['provision_instance_ip'] = '{}/32'.format(dlab.meta_lib.get_instance_ip_address(
+            project_conf['provision_instance_ip'] = '{}/32'.format(datalab.meta_lib.get_instance_ip_address(
                 project_conf['tag_name'], '{0}-ssn'.format(project_conf['service_base_name'])).get('Private'))
             project_conf['local_endpoint'] = True
         if 'aws_user_predefined_s3_policies' not in os.environ:
@@ -137,8 +138,8 @@
         try:
             project_conf['user_key'] = os.environ['key']
             try:
-                local('echo "{0}" >> {1}{2}.pub'.format(project_conf['user_key'], os.environ['conf_key_dir'],
-                                                        project_conf['project_name']))
+                subprocess.run('echo "{0}" >> {1}{2}.pub'.format(project_conf['user_key'], os.environ['conf_key_dir'],
+                                                        project_conf['project_name']), shell=True, check=True)
             except:
                 print("ADMINSs PUBLIC KEY DOES NOT INSTALLED")
         except KeyError:
@@ -160,13 +161,13 @@
                                                                                            project_conf['endpoint_tag'])
         print('Additional tags will be added: {}'.format(os.environ['conf_additional_tags']))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
 
     if not project_conf['local_endpoint']:
         # attach project_tag and endpoint_tag to endpoint
         try:
-            endpoint_id = dlab.meta_lib.get_instance_by_name(project_conf['tag_name'], '{0}-{1}-endpoint'.format(
+            endpoint_id = datalab.meta_lib.get_instance_by_name(project_conf['tag_name'], '{0}-{1}-endpoint'.format(
                 project_conf['service_base_name'], project_conf['endpoint_name']))
             print("Endpoint id: " + endpoint_id)
             ec2 = boto3.client('ec2')
@@ -196,19 +197,19 @@
                   project_conf['private_subnet_name'],
                   project_conf['zone'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_subnet', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_subnet', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create subnet.", str(err))
+        datalab.fab.append_result("Failed to create subnet.", str(err))
         sys.exit(1)
 
     tag = {"Key": project_conf['tag_name'],
            "Value": "{0}-{1}-{2}-subnet".format(project_conf['service_base_name'], project_conf['project_name'],
                                                 project_conf['endpoint_name'])}
-    project_conf['private_subnet_cidr'] = dlab.meta_lib.get_subnet_by_tag(tag)
-    subnet_id = dlab.meta_lib.get_subnet_by_cidr(project_conf['private_subnet_cidr'], project_conf['vpc2_id'])
+    project_conf['private_subnet_cidr'] = datalab.meta_lib.get_subnet_by_tag(tag)
+    subnet_id = datalab.meta_lib.get_subnet_by_cidr(project_conf['private_subnet_cidr'], project_conf['vpc2_id'])
     print('Subnet id: {}'.format(subnet_id))
     print('NEW SUBNET CIDR CREATED: {}'.format(project_conf['private_subnet_cidr']))
 
@@ -219,16 +220,16 @@
                                                       project_conf['endpoint_name'])
         params = "--role_name {} --role_profile_name {} --policy_name {} --region {} --infra_tag_name {} " \
                  "--infra_tag_value {} --user_tag_value {}" \
-                 .format(project_conf['edge_role_name'], project_conf['edge_role_profile_name'],
+            .format(project_conf['edge_role_name'], project_conf['edge_role_profile_name'],
                          project_conf['edge_policy_name'], os.environ['aws_region'], project_conf['tag_name'],
                          project_conf['service_base_name'], user_tag)
         try:
-            local("~/scripts/{}.py {}".format('common_create_role_policy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_role_policy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to creating roles.", str(err))
+        datalab.fab.append_result("Failed to creating roles.", str(err))
         sys.exit(1)
 
     try:
@@ -243,198 +244,210 @@
                          project_conf['notebook_dataengine_policy_name'], os.environ['aws_region'],
                          project_conf['tag_name'], project_conf['service_base_name'], user_tag)
         try:
-            local("~/scripts/{}.py {}".format('common_create_role_policy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_role_policy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to creating roles.", str(err))
-        dlab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
+        datalab.fab.append_result("Failed to creating roles.", str(err))
+        datalab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
         sys.exit(1)
 
     try:
-        logging.info('[CREATE SECURITY GROUP FOR EDGE NODE]')
-        print('[CREATE SECURITY GROUPS FOR EDGE]')
-        edge_sg_ingress = dlab.meta_lib.format_sg([
-            {
-                "IpProtocol": "-1",
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "UserIdGroupPairs": [], "PrefixListIds": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 22,
-                "IpRanges": project_conf['allowed_ip_cidr'],
-                "ToPort": 22, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 3128,
-                "IpRanges": project_conf['allowed_ip_cidr'],
-                "ToPort": 3128, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 80,
-                "IpRanges": project_conf['allowed_ip_cidr'],
-                "ToPort": 80, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 443,
-                "IpRanges": project_conf['allowed_ip_cidr'],
-                "ToPort": 443, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "IpProtocol": "-1",
-                "IpRanges": [{"CidrIp": project_conf['provision_instance_ip']}],
-                "UserIdGroupPairs": [],
-                "PrefixListIds": []
-            }
-        ])
-        edge_sg_egress = dlab.meta_lib.format_sg([
-            {
-                "PrefixListIds": [],
-                "FromPort": 22,
-                "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
-                "ToPort": 22, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 8888,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 8888, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 8080,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 8080, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 8787,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 8787, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 6006,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 6006, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 20888,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 20888, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 8042,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 8042, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 8088,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 8088, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 8081,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 8081, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 4040,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 4140, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 18080,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 18080, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 50070,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 50070, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 53,
-                "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
-                "ToPort": 53, "IpProtocol": "udp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 80,
-                "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
-                "ToPort": 80, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 123,
-                "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
-                "ToPort": 123, "IpProtocol": "udp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 443,
-                "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
-                "ToPort": 443, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 8085,
-                "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
-                "ToPort": 8085, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            },
-            {
-                "PrefixListIds": [],
-                "FromPort": 389,
-                "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
-                "ToPort": 389, "IpProtocol": "tcp", "UserIdGroupPairs": []
-            }
-        ])
-        params = "--name {} --vpc_id {} --security_group_rules '{}' --infra_tag_name {} --infra_tag_value {} \
-            --egress '{}' --force {} --nb_sg_name {} --resource {}".\
-            format(project_conf['edge_security_group_name'], project_conf['vpc_id'], json.dumps(edge_sg_ingress),
-                   project_conf['service_base_name'], project_conf['edge_instance_name'], json.dumps(edge_sg_egress),
-                   True, project_conf['notebook_instance_name'], 'edge')
+        if os.environ['aws_security_groups_ids'] == '':
+            raise KeyError
+    except KeyError:
         try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
-        except Exception as err:
-            traceback.print_exc()
-            dlab.fab.append_result("Failed creating security group for edge node.", str(err))
-            raise Exception
+            logging.info('[CREATE SECURITY GROUP FOR EDGE NODE]')
+            print('[CREATE SECURITY GROUPS FOR EDGE]')
+            edge_sg_ingress = datalab.meta_lib.format_sg([
+                {
+                    "IpProtocol": "-1",
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "UserIdGroupPairs": [], "PrefixListIds": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 22,
+                    "IpRanges": project_conf['allowed_ip_cidr'],
+                    "ToPort": 22, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 3128,
+                    "IpRanges": project_conf['allowed_ip_cidr'],
+                    "ToPort": 3128, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 80,
+                    "IpRanges": project_conf['allowed_ip_cidr'],
+                    "ToPort": 80, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 443,
+                    "IpRanges": project_conf['allowed_ip_cidr'],
+                    "ToPort": 443, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "IpProtocol": "-1",
+                    "IpRanges": [{"CidrIp": project_conf['provision_instance_ip']}],
+                    "UserIdGroupPairs": [],
+                    "PrefixListIds": []
+                }
+            ])
+            edge_sg_egress = datalab.meta_lib.format_sg([
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 22,
+                    "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
+                    "ToPort": 22, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 8888,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 8888, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 8080,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 8080, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 8787,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 8787, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 6006,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 6006, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 20888,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 20888, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 8042,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 8042, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 8088,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 8088, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 8081,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 8081, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 4040,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 4140, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 18080,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 18080, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 50070,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 50070, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 53,
+                    "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
+                    "ToPort": 53, "IpProtocol": "udp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 80,
+                    "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
+                    "ToPort": 80, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 123,
+                    "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
+                    "ToPort": 123, "IpProtocol": "udp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 443,
+                    "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
+                    "ToPort": 443, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 8085,
+                    "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
+                    "ToPort": 8085, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": 389,
+                    "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
+                    "ToPort": 389, "IpProtocol": "tcp", "UserIdGroupPairs": []
+                },
+                {
+                    "PrefixListIds": [],
+                    "FromPort": -1,
+                    "IpRanges": [{"CidrIp": project_conf['all_ip_cidr']}],
+                    "ToPort": -1, "IpProtocol": "icmp", "UserIdGroupPairs": []
+                }
+            ])
+            params = "--name {} --vpc_id {} --security_group_rules '{}' --infra_tag_name {} --infra_tag_value {} \
+                --egress '{}' --force {} --nb_sg_name {} --resource {}".\
+                format(project_conf['edge_security_group_name'], project_conf['vpc_id'], json.dumps(edge_sg_ingress),
+                       project_conf['service_base_name'], project_conf['edge_instance_name'], json.dumps(edge_sg_egress),
+                       True, project_conf['notebook_instance_name'], 'edge')
+            try:
+                subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
+            except Exception as err:
+                traceback.print_exc()
+                datalab.fab.append_result("Failed creating security group for edge node.", str(err))
+                raise Exception
 
-        with hide('stderr', 'running', 'warnings'):
             print('Waiting for changes to propagate')
             time.sleep(10)
-    except:
-        dlab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
-        dlab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
-        sys.exit(1)
+        except:
+            datalab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
+            datalab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
+            sys.exit(1)
 
     try:
         logging.info('[CREATE SECURITY GROUP FOR PRIVATE SUBNET]')
         print('[CREATE SECURITY GROUP FOR PRIVATE SUBNET]')
-        project_group_id = dlab.meta_lib.check_security_group(project_conf['edge_security_group_name'])
-        sg_list = project_conf['sg_ids'].replace(" ", "").split(',')
         rules_list = []
-        for i in sg_list:
-            rules_list.append({"GroupId": i})
-        private_sg_ingress = dlab.meta_lib.format_sg([
+        sg_list = project_conf['sg_ids'].replace(" ", "").split(',')
+        if os.environ['aws_security_groups_ids'] == '':
+            project_group_id = datalab.meta_lib.check_security_group(project_conf['edge_security_group_name'])
+            rules_list.append({"GroupId": project_group_id})
+        else:
+            for i in sg_list:
+                rules_list.append({"GroupId": i})
+        private_sg_ingress = datalab.meta_lib.format_sg([
             {
                 "IpProtocol": "-1",
                 "IpRanges": [],
-                "UserIdGroupPairs": [{"GroupId": project_group_id}],
+                "UserIdGroupPairs": rules_list,
                 "PrefixListIds": []
             },
             {
@@ -451,7 +464,7 @@
             }
         ])
 
-        private_sg_egress = dlab.meta_lib.format_sg([
+        private_sg_egress = datalab.meta_lib.format_sg([
             {
                 "IpProtocol": "-1",
                 "IpRanges": [{"CidrIp": project_conf['private_subnet_cidr']}],
@@ -467,7 +480,7 @@
             {
                 "IpProtocol": "-1",
                 "IpRanges": [],
-                "UserIdGroupPairs": [{"GroupId": project_group_id}],
+                "UserIdGroupPairs": rules_list,
                 "PrefixListIds": []
             },
             {
@@ -487,20 +500,19 @@
                                                           project_conf['service_base_name'],
                                                           project_conf['notebook_instance_name'], True)
         try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
 
-        with hide('stderr', 'running', 'warnings'):
-            print('Waiting for changes to propagate')
-            time.sleep(10)
+        print('Waiting for changes to propagate')
+        time.sleep(10)
     except Exception as err:
-        dlab.fab.append_result("Failed creating security group for private subnet.", str(err))
-        dlab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
-        dlab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
+        datalab.fab.append_result("Failed creating security group for private subnet.", str(err))
+        datalab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
+        datalab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
         sys.exit(1)
 
     logging.info('[CREATING SECURITY GROUPS FOR MASTER NODE]')
@@ -513,16 +525,16 @@
                                                           project_conf['service_base_name'],
                                                           project_conf['dataengine_instances_name'], True)
         try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create sg.", str(err))
-        dlab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
-        dlab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
+        datalab.fab.append_result("Failed to create sg.", str(err))
+        datalab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
+        datalab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
         sys.exit(1)
 
     logging.info('[CREATING SECURITY GROUPS FOR SLAVE NODES]')
@@ -535,17 +547,17 @@
                                                           project_conf['service_base_name'],
                                                           project_conf['dataengine_instances_name'], True)
         try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create security group.", str(err))
-        dlab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
-        dlab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['dataengine_instances_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
+        datalab.fab.append_result("Failed to create security group.", str(err))
+        datalab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
+        datalab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['dataengine_instances_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
         sys.exit(1)
 
     try:
@@ -559,7 +571,7 @@
             format(project_conf['shared_bucket_name'], project_conf['shared_bucket_tags'], project_conf['region'],
                    project_conf['shared_bucket_name_tag'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_bucket', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_bucket', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -571,17 +583,17 @@
                  .format(project_conf['bucket_name'], project_conf['bucket_tags'], project_conf['region'],
                          project_conf['bucket_name_tag'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_bucket', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_bucket', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create buckets.", str(err))
-        dlab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
-        dlab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['dataengine_instances_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
+        datalab.fab.append_result("Failed to create buckets.", str(err))
+        datalab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
+        datalab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['dataengine_instances_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
         sys.exit(1)
 
     try:
@@ -595,52 +607,62 @@
                   project_conf['service_base_name'], project_conf['region'],
                   os.environ['aws_user_predefined_s3_policies'], project_conf['endpoint_name'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_policy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_policy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create bucket policy.", str(err))
-        dlab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
-        dlab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['dataengine_instances_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
-        dlab.actions_lib.remove_s3('edge', project_conf['project_name'])
+        datalab.fab.append_result("Failed to create bucket policy.", str(err))
+        datalab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
+        datalab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['dataengine_instances_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
+        datalab.actions_lib.remove_s3('edge', project_conf['project_name'])
         sys.exit(1)
 
     try:
+        if os.environ['aws_security_groups_ids'] == '':
+            edge_group_id = datalab.meta_lib.check_security_group(project_conf['edge_security_group_name'])
+        else:
+            edge_group_id = os.environ['aws_security_groups_ids']
         logging.info('[CREATE EDGE INSTANCE]')
         print('[CREATE EDGE INSTANCE]')
         params = "--node_name {} --ami_id {} --instance_type {} --key_name {} --security_group_ids {} " \
                  "--subnet_id {} --iam_profile {} --infra_tag_name {} --infra_tag_value {}" \
             .format(project_conf['edge_instance_name'], project_conf['ami_id'], project_conf['instance_size'],
-                    project_conf['key_name'], project_group_id, project_conf['public_subnet_id'],
+                    project_conf['key_name'], edge_group_id, project_conf['public_subnet_id'],
                     project_conf['edge_role_profile_name'], project_conf['tag_name'],
                     project_conf['edge_instance_name'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
-            edge_instance = dlab.meta_lib.get_instance_by_name(project_conf['tag_name'],
-                                                               project_conf['edge_instance_name'])
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
+            edge_instance = datalab.meta_lib.get_instance_by_name(project_conf['tag_name'],
+                                                                  project_conf['edge_instance_name'])
+            if os.environ['edge_is_nat']:
+                try:
+                    datalab.actions_lib.modify_instance_sourcedescheck(edge_instance)
+                except:
+                    traceback.print_exc()
+                    raise Exception
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create instance.", str(err))
-        dlab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
-        dlab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['dataengine_instances_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
-        dlab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
-        dlab.actions_lib.remove_s3('edge', project_conf['project_name'])
+        datalab.fab.append_result("Failed to create instance.", str(err))
+        datalab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
+        datalab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['dataengine_instances_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
+        datalab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
+        datalab.actions_lib.remove_s3('edge', project_conf['project_name'])
         sys.exit(1)
 
     if project_conf['network_type'] == 'public':
         try:
             logging.info('[ASSOCIATING ELASTIC IP]')
             print('[ASSOCIATING ELASTIC IP]')
-            project_conf['edge_id'] = dlab.meta_lib.get_instance_by_name(project_conf['tag_name'],
-                                                                         project_conf['edge_instance_name'])
+            project_conf['edge_id'] = datalab.meta_lib.get_instance_by_name(project_conf['tag_name'],
+                                                                            project_conf['edge_instance_name'])
             try:
                 project_conf['elastic_ip'] = os.environ['edge_elastic_ip']
             except:
@@ -649,24 +671,58 @@
                 project_conf['elastic_ip'], project_conf['edge_id'], project_conf['tag_name'],
                 project_conf['elastic_ip_name'])
             try:
-                local("~/scripts/{}.py {}".format('edge_associate_elastic_ip', params))
+                subprocess.run("~/scripts/{}.py {}".format('edge_associate_elastic_ip', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
         except Exception as err:
-            dlab.fab.append_result("Failed to associate elastic ip.", str(err))
+            datalab.fab.append_result("Failed to associate elastic ip.", str(err))
             try:
-                project_conf['edge_public_ip'] = dlab.meta_lib.get_instance_ip_address(
+                project_conf['edge_public_ip'] = datalab.meta_lib.get_instance_ip_address(
                     project_conf['tag_name'], project_conf['edge_instance_name']).get('Public')
-                project_conf['allocation_id'] = dlab.meta_lib.get_allocation_id_by_elastic_ip(
+                project_conf['allocation_id'] = datalab.meta_lib.get_allocation_id_by_elastic_ip(
                     project_conf['edge_public_ip'])
             except:
                 print("No Elastic IPs to release!")
-            dlab.actions_lib.remove_ec2(project_conf['tag_name'], project_conf['edge_instance_name'])
-            dlab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
-            dlab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
-            dlab.actions_lib.remove_sgroups(project_conf['dataengine_instances_name'])
-            dlab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
-            dlab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
-            dlab.actions_lib.remove_s3('edge', project_conf['project_name'])
+            datalab.actions_lib.remove_ec2(project_conf['tag_name'], project_conf['edge_instance_name'])
+            datalab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
+            datalab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
+            datalab.actions_lib.remove_sgroups(project_conf['dataengine_instances_name'])
+            datalab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
+            datalab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
+            datalab.actions_lib.remove_s3('edge', project_conf['project_name'])
+            sys.exit(1)
+
+    if os.environ['edge_is_nat'] == 'true':
+        try:
+            print('[CONFIGURING ROUTE TABLE FOR NAT]')
+            project_conf['nat_rt_name'] = '{0}-{1}-{2}-nat-rt'.format(project_conf['service_base_name'],
+                                                                              project_conf['project_name'],
+                                                                              project_conf['endpoint_name'])
+            params = "--vpc_id {} --infra_tag_value {} --edge_instance_id {} --private_subnet_id {} --sbn {}".format(
+                project_conf['vpc2_id'], project_conf['nat_rt_name'], edge_instance, subnet_id, project_conf['service_base_name'])
+            try:
+                subprocess.run("~/scripts/{}.py {}".format('edge_configure_route_table', params), shell=True, check=True)
+            except:
+                traceback.print_exc()
+                raise Exception
+        except Exception as err:
+            datalab.fab.append_result("Failed to configure route table.", str(err))
+            try:
+                project_conf['edge_public_ip'] = datalab.meta_lib.get_instance_ip_address(
+                    project_conf['tag_name'], project_conf['edge_instance_name']).get('Public')
+                project_conf['allocation_id'] = datalab.meta_lib.get_allocation_id_by_elastic_ip(
+                    project_conf['edge_public_ip'])
+            except:
+                print("No Elastic IPs to release!")
+            datalab.actions_lib.remove_ec2(project_conf['tag_name'], project_conf['edge_instance_name'])
+            datalab.actions_lib.remove_all_iam_resources('notebook', project_conf['project_name'])
+            datalab.actions_lib.remove_all_iam_resources('edge', project_conf['project_name'])
+            datalab.actions_lib.remove_sgroups(project_conf['dataengine_instances_name'])
+            datalab.actions_lib.remove_sgroups(project_conf['notebook_instance_name'])
+            datalab.actions_lib.remove_sgroups(project_conf['edge_instance_name'])
+            datalab.actions_lib.remove_s3('edge', project_conf['project_name'])
+            datalab.actions_lib.remove_route_tables("Name", False,
+                                                    '{}-{}-{}-nat-rt'.format(service_base_name, project_name,
+                                                                             endpoint_name))
             sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/project_terminate.py b/infrastructure-provisioning/src/general/scripts/aws/project_terminate.py
index 3495b13..16fcf23 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/project_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/project_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,23 +21,23 @@
 #
 # ******************************************************************************
 
-import json
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import sys
-import time
-import os
-import traceback
-import logging
 import boto3
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
+import json
+import logging
+import os
 import requests
+import sys
+import traceback
 
 
-def terminate_edge_node(tag_name, project_name, tag_value, nb_sg, edge_sg, de_sg, emr_sg, endpoint_name):
+def terminate_edge_node(tag_name, project_name, tag_value, nb_sg, edge_sg, de_sg, emr_sg, endpoint_name,
+                        service_base_name):
     print('Terminating EMR cluster')
     try:
-        clusters_list = dlab.meta_lib.get_emr_list(tag_name)
+        clusters_list = datalab.meta_lib.get_emr_list(tag_name)
         if clusters_list:
             for cluster_id in clusters_list:
                 client = boto3.client('emr')
@@ -45,60 +45,66 @@
                 cluster = cluster.get("Cluster")
                 emr_name = cluster.get('Name')
                 if '{}'.format(tag_value[:-1]) in emr_name:
-                    dlab.actions_lib.terminate_emr(cluster_id)
+                    datalab.actions_lib.terminate_emr(cluster_id)
                     print("The EMR cluster {} has been terminated successfully".format(emr_name))
         else:
             print("There are no EMR clusters to terminate.")
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate EMR cluster.", str(err))
+        datalab.fab.append_result("Failed to terminate EMR cluster.", str(err))
         sys.exit(1)
 
     print("Terminating EDGE and notebook instances")
     try:
-        dlab.actions_lib.remove_ec2(tag_name, tag_value)
+        datalab.actions_lib.remove_ec2(tag_name, tag_value)
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate instances.", str(err))
+        datalab.fab.append_result("Failed to terminate instances.", str(err))
         sys.exit(1)
 
     print("Removing s3 bucket")
     try:
-        dlab.actions_lib.remove_s3('edge', project_name)
+        datalab.actions_lib.remove_s3('edge', project_name)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove buckets.", str(err))
+        datalab.fab.append_result("Failed to remove buckets.", str(err))
         sys.exit(1)
 
     print("Removing IAM roles and profiles")
     try:
-        dlab.actions_lib.remove_all_iam_resources('notebook', project_name, endpoint_name)
-        dlab.actions_lib.remove_all_iam_resources('edge', project_name, endpoint_name)
+        datalab.actions_lib.remove_all_iam_resources('notebook', project_name, endpoint_name)
+        datalab.actions_lib.remove_all_iam_resources('edge', project_name, endpoint_name)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove IAM roles and profiles.", str(err))
+        datalab.fab.append_result("Failed to remove IAM roles and profiles.", str(err))
         sys.exit(1)
 
     print("Deregistering project specific notebook's AMI")
     try:
-        dlab.actions_lib.deregister_image(project_name)
+        datalab.actions_lib.deregister_image('{}-{}-{}-*'.format(service_base_name, project_name, endpoint_name))
     except Exception as err:
-        dlab.fab.append_result("Failed to deregister images.", str(err))
+        datalab.fab.append_result("Failed to deregister images.", str(err))
         sys.exit(1)
 
     print("Removing security groups")
     try:
-        dlab.actions_lib.remove_sgroups(emr_sg)
-        dlab.actions_lib.remove_sgroups(de_sg)
-        dlab.actions_lib.remove_sgroups(nb_sg)
-        dlab.actions_lib.remove_sgroups(edge_sg)
+        datalab.actions_lib.remove_sgroups(emr_sg)
+        datalab.actions_lib.remove_sgroups(de_sg)
+        datalab.actions_lib.remove_sgroups(nb_sg)
+        datalab.actions_lib.remove_sgroups(edge_sg)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove Security Groups.", str(err))
+        datalab.fab.append_result("Failed to remove Security Groups.", str(err))
         sys.exit(1)
 
     print("Removing private subnet")
     try:
-        dlab.actions_lib.remove_subnets(tag_value)
+        datalab.actions_lib.remove_subnets(tag_value)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove subnets.", str(err))
+        datalab.fab.append_result("Failed to remove subnets.", str(err))
         sys.exit(1)
 
+    print("Removing project route tables")
+    try:
+        datalab.actions_lib.remove_route_tables("Name", False, '{}-{}-{}-nat-rt'.format(service_base_name, project_name, endpoint_name))
+    except Exception as err:
+        datalab.fab.append_result("Failed to remove project route table.", str(err))
+        sys.exit(1)
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -109,7 +115,7 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    dlab.actions_lib.create_aws_config_files()
+    datalab.actions_lib.create_aws_config_files()
     print('Generating infrastructure names and tags')
     project_conf = dict()
     project_conf['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -140,17 +146,17 @@
         try:
             terminate_edge_node(project_conf['tag_name'], project_conf['project_name'], project_conf['tag_value'],
                                 project_conf['nb_sg'], project_conf['edge_sg'], project_conf['de_sg'],
-                                project_conf['emr_sg'], project_conf['endpoint_name'])
+                                project_conf['emr_sg'], project_conf['endpoint_name'], project_conf['service_base_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate project.", str(err))
+            datalab.fab.append_result("Failed to terminate project.", str(err))
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
 
     try:
-        endpoint_id = dlab.meta_lib.get_instance_by_name(project_conf['tag_name'],
-                                                         project_conf['endpoint_instance_name'])
+        endpoint_id = datalab.meta_lib.get_instance_by_name(project_conf['tag_name'],
+                                                            project_conf['endpoint_instance_name'])
         print("Endpoint id: " + endpoint_id)
         ec2 = boto3.client('ec2')
         ec2.delete_tags(Resources=[endpoint_id], Tags=[{'Key': 'project_tag'}, {'Key': 'endpoint_tag'}])
@@ -206,5 +212,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/rstudio_configure.py b/infrastructure-provisioning/src/general/scripts/aws/rstudio_configure.py
index dd2a93c..3ad6aca 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/rstudio_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/rstudio_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,17 @@
 #
 # ******************************************************************************
 
-import logging
+import argparse
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import argparse
-from fabric.api import *
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--uuid', type=str, default='')
@@ -82,26 +83,27 @@
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
         notebook_config['tag_name'] = '{}-tag'.format(notebook_config['service_base_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
-        notebook_config['ip_address'] = dlab.meta_lib.get_instance_ip_address(
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['ip_address'] = datalab.meta_lib.get_instance_ip_address(
             notebook_config['tag_name'], notebook_config['instance_name']).get('Private')
 
         # generating variables regarding EDGE proxy on Notebook instance
-        instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                notebook_config['instance_name'])
+        instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                   notebook_config['instance_name'])
         edge_instance_name = '{}-{}-{}-edge'.format(notebook_config['service_base_name'],
                                                     notebook_config['project_name'], notebook_config['endpoint_name'])
-        edge_instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
-        edge_instance_private_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                                         edge_instance_name).get('Private')
-        notebook_config['edge_instance_hostname'] = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                                        edge_instance_name)
+        edge_instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
+        edge_instance_private_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                                            edge_instance_name).get('Private')
+        notebook_config['edge_instance_hostname'] = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                                           edge_instance_name)
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        edge_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get('Private')
-        notebook_config['rstudio_pass'] = dlab.fab.id_generator()
+        edge_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get(
+            'Private')
+        notebook_config['rstudio_pass'] = datalab.fab.id_generator()
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -112,20 +114,20 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # configuring proxy on Notebook instance
@@ -135,32 +137,32 @@
         additional_config = {"proxy_host": edge_instance_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # updating repositories & installing python packages
     try:
         logging.info('[INSTALLING PREREQUISITES TO R_STUDIO NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO R_STUDIO NOTEBOOK INSTANCE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['aws_region'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['aws_region'],
                    edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # installing and configuring R_STUDIO and all dependencies
@@ -173,17 +175,17 @@
                  "--r_mirror {6} --ip_address {7} --exploratory_name {8} --edge_ip {9}" \
             .format(instance_hostname, keyfile_name,
                     os.environ['aws_region'], notebook_config['rstudio_pass'],
-                    os.environ['notebook_rstudio_version'], notebook_config['dlab_ssh_user'],
+                    os.environ['notebook_rstudio_version'], notebook_config['datalab_ssh_user'],
                     os.environ['notebook_r_mirror'], notebook_config['ip_address'],
                     notebook_config['exploratory_name'], edge_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_rstudio_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_rstudio_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure rstudio.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure rstudio.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -192,47 +194,47 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing users key.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --nb_tag_name {} --nb_tag_value {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['tag_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -242,23 +244,23 @@
             'instance_hostname': instance_hostname,
             'tensor': False
         }
-        params = "--edge_hostname {} --keyfile {} --os_user {} --type {} --exploratory_name {} --additional_info '{}'"\
-            .format(edge_instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], 'rstudio',
+        params = "--edge_hostname {} --keyfile {} --os_user {} --type {} --exploratory_name {} --additional_info '{}'" \
+            .format(edge_instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], 'rstudio',
                     notebook_config['exploratory_name'], json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     if notebook_config['image_enabled'] == 'true':
         try:
             print('[CREATING AMI]')
-            ami_id = dlab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
+            ami_id = datalab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
             if ami_id == '' and notebook_config['shared_image_enabled'] == 'false':
                 print("Looks like it's first time we configure notebook server. Creating image.")
                 try:
@@ -267,7 +269,7 @@
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'project_tag:{0};endpoint_tag:{1}'.format(
                         os.environ['project_name'], os.environ['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
@@ -279,21 +281,21 @@
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'ami:shared;endpoint_tag:{}'.format(
                         os.environ['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
                     print("Image was successfully created. It's ID is {}".format(image_id))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
-            dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+            datalab.fab.append_result("Failed creating image.", str(err))
+            datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
             sys.exit(1)
 
     try:
         # generating output information
-        ip_address = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                           notebook_config['instance_name']).get('Private')
-        dns_name = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
+        ip_address = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                              notebook_config['instance_name']).get('Private')
+        dns_name = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
         rstudio_ip_url = "http://" + ip_address + ":8787/"
         rstudio_dns_url = "http://" + dns_name + ":8787/"
         rstudio_notebook_access_url = "https://{}/{}/".format(notebook_config['edge_instance_hostname'],
@@ -306,8 +308,8 @@
         print("Instance name: {}".format(notebook_config['instance_name']))
         print("Private DNS: {}".format(dns_name))
         print("Private IP: {}".format(ip_address))
-        print("Instance ID: {}".format(dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                          notebook_config['instance_name'])))
+        print("Instance ID: {}".format(datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                             notebook_config['instance_name'])))
         print("Instance type: {}".format(notebook_config['instance_type']))
         print("Key name: {}".format(notebook_config['key_name']))
         print("User key name: {}".format(notebook_config['user_keyname']))
@@ -316,19 +318,19 @@
         print("SG name: {}".format(notebook_config['security_group_name']))
         print("Rstudio URL: {}".format(rstudio_ip_url))
         print("Rstudio URL: {}".format(rstudio_dns_url))
-        print("Rstudio user: {}".format(notebook_config['dlab_ssh_user']))
+        print("Rstudio user: {}".format(notebook_config['datalab_ssh_user']))
         print("Rstudio pass: {}".format(notebook_config['rstudio_pass']))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
         print('SSH access (from Edge node, via FQDN): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], dns_name))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], dns_name))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": dns_name,
                    "ip": ip_address,
-                   "instance_id": dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                     notebook_config['instance_name']),
+                   "instance_id": datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                        notebook_config['instance_name']),
                    "master_keyname": os.environ['conf_key_name'],
                    "notebook_name": notebook_config['instance_name'],
                    "notebook_image_name": notebook_config['notebook_image_name'],
@@ -337,16 +339,16 @@
                        {"description": "RStudio",
                         "url": rstudio_notebook_access_url},
                        {"description": "Ungit",
-                        "url": rstudio_ungit_access_url}#,
-                       #{"description": "RStudio (via tunnel)",
+                        "url": rstudio_ungit_access_url}  # ,
+                       # {"description": "RStudio (via tunnel)",
                        # "url": rstudio_ip_url},
-                       #{"description": "Ungit (via tunnel)",
+                       # {"description": "Ungit (via tunnel)",
                        # "url": ungit_ip_url}
                    ],
-                   "exploratory_user": notebook_config['dlab_ssh_user'],
+                   "exploratory_user": notebook_config['datalab_ssh_user'],
                    "exploratory_pass": notebook_config['rstudio_pass']}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Error with writing results.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/rstudio_dataengine-service_create_configs.py b/infrastructure-provisioning/src/general/scripts/aws/rstudio_dataengine-service_create_configs.py
index f82c0f0..6ab945a 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/rstudio_dataengine-service_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/rstudio_dataengine-service_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,20 +21,15 @@
 #
 # ******************************************************************************
 
-import boto3
-from botocore.client import Config
-from fabric.api import *
 import argparse
 import os
 import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -57,34 +52,34 @@
 def configure_rstudio():
     if not os.path.exists('/home/' + args.os_user + '/.ensure_dir/rstudio_dataengine-service_ensured'):
         try:
-            local('echo "export R_LIBS_USER=' + spark_dir + '/R/lib:" >> /home/' + args.os_user + '/.bashrc')
-            local("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron")
-            local('echo \'SPARK_HOME="' + spark_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local('echo \'YARN_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local('echo \'HADOOP_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile")
-            local('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user))
+            subprocess.run('echo "export R_LIBS_USER=' + spark_dir + '/R/lib:" >> /home/' + args.os_user + '/.bashrc', shell=True, check=True)
+            subprocess.run("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run('echo \'SPARK_HOME="' + spark_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run('echo \'YARN_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run('echo \'HADOOP_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile", shell=True, check=True)
+            subprocess.run('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user), shell=True, check=True)
             #fix emr 5.19 problem with warnings in rstudio because of bug in AWS configuration
             if args.emr_version == "emr-5.19.0":
-                local("sed -i '/DRFA/s/^/#/' " + spark_dir + "conf/log4j.properties")
-            local('touch /home/' + args.os_user + '/.ensure_dir/rstudio_dataengine-service_ensured')
+                subprocess.run("sed -i '/DRFA/s/^/#/' " + spark_dir + "conf/log4j.properties", shell=True, check=True)
+            subprocess.run('touch /home/' + args.os_user + '/.ensure_dir/rstudio_dataengine-service_ensured', shell=True, check=True)
         except Exception as err:
             print('Error: {0}'.format(err))
             sys.exit(1)
     else:
         try:
-            local("sed -i '/R_LIBS_USER/ { s|=\(.*\)|=\\1" + spark_dir + "/R/lib:| }' /home/" + args.os_user + "/.bashrc")
-            local("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile")
-            local('echo \'SPARK_HOME="' + spark_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local('echo \'YARN_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local('echo \'HADOOP_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user))
+            subprocess.run("sed -i '/R_LIBS_USER/ { s|=\(.*\)|=\\1" + spark_dir + "/R/lib:| }' /home/" + args.os_user + "/.bashrc", shell=True, check=True)
+            subprocess.run("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile", shell=True, check=True)
+            subprocess.run('echo \'SPARK_HOME="' + spark_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run('echo \'YARN_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run('echo \'HADOOP_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user), shell=True, check=True)
             #fix emr 5.19 problem with warnings in rstudio because of bug in AWS configuration
             if args.emr_version == "emr-5.19.0":
-                local("sed -i '/DRFA/s/^/#/' " + spark_dir + "conf/log4j.properties")
+                subprocess.run("sed -i '/DRFA/s/^/#/' " + spark_dir + "conf/log4j.properties", shell=True, check=True)
         except Exception as err:
             print('Error: {0}'.format(err))
             sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/rstudio_install_dataengine-service_kernels.py b/infrastructure-provisioning/src/general/scripts/aws/rstudio_install_dataengine-service_kernels.py
index 4393b21..66eccb5 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/rstudio_install_dataengine-service_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/rstudio_install_dataengine-service_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,10 +22,8 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-import boto3
-from dlab.meta_lib import *
-import os
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -48,28 +46,28 @@
 
 def configure_notebook(args):
     scripts_dir = '/root/scripts/'
-    put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application),
+    conn.put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application),
         '/tmp/rstudio_dataengine-service_create_configs.py')
-    sudo('\cp /tmp/rstudio_dataengine-service_create_configs.py /usr/local/bin/rstudio_dataengine-service_create_configs.py')
-    sudo('chmod 755 /usr/local/bin/rstudio_dataengine-service_create_configs.py')
-    sudo('mkdir -p /usr/lib/python2.7/dlab/')
-    run('mkdir -p /tmp/dlab_libs/')
-    local('scp -i {} /usr/lib/python2.7/dlab/* {}:/tmp/dlab_libs/'.format(args.keyfile, env.host_string))
-    run('chmod a+x /tmp/dlab_libs/*')
-    sudo('mv /tmp/dlab_libs/* /usr/lib/python2.7/dlab/')
-    if exists('/usr/lib64'):
-        sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+    conn.sudo(
+        '\cp /tmp/rstudio_dataengine-service_create_configs.py /usr/local/bin/rstudio_dataengine-service_create_configs.py')
+    conn.sudo('chmod 755 /usr/local/bin/rstudio_dataengine-service_create_configs.py')
+    conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+    conn.run('mkdir -p /tmp/datalab_libs/')
+    conn.local('scp -i {} /usr/lib/python3.8/datalab/*.py {}@{}:/tmp/datalab_libs/'.format(args.keyfile, args.os_user, args.notebook_ip))
+    conn.run('chmod a+x /tmp/datalab_libs/*')
+    conn.sudo('mv /tmp/datalab_libs/* /usr/lib/python3.8/datalab/')
+    if exists(conn, '/usr/lib64'):
+        conn.sudo('mkdir -p /usr/lib64/python3.8')
+        conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
 
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     configure_notebook(args)
     spark_version = get_spark_version(args.cluster_name)
     hadoop_version = get_hadoop_version(args.cluster_name)
-    sudo("/usr/bin/python /usr/local/bin/rstudio_dataengine-service_create_configs.py --bucket " + args.bucket +
+    conn.sudo("/usr/bin/python3 /usr/local/bin/rstudio_dataengine-service_create_configs.py --bucket " + args.bucket +
          " --cluster_name " + args.cluster_name + " --emr_version " + args.emr_version + " --spark_version " +
          spark_version + " --hadoop_version " + hadoop_version + " --region " + args.region + " --excluded_lines '"
          + args.emr_excluded_spark_properties + "' --project_name " + args.project_name + " --os_user " + args.os_user)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/ssn_associate_elastic_ip.py b/infrastructure-provisioning/src/general/scripts/aws/ssn_associate_elastic_ip.py
index 55bb37d..6615744 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/ssn_associate_elastic_ip.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/ssn_associate_elastic_ip.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,12 +21,12 @@
 #
 # ******************************************************************************
 
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-import os
 import argparse
+import os
+import sys
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--elastic_ip', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/ssn_configure.py b/infrastructure-provisioning/src/general/scripts/aws/ssn_configure.py
index bb8c555..eceb451 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/ssn_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/ssn_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,17 @@
 #
 # ******************************************************************************
 
-import logging
-import sys
-import os
-from fabric.api import *
-import dlab.ssn_lib
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
+import datalab.ssn_lib
 import json
+import logging
+import os
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}.log".format(os.environ['conf_resource'], os.environ['request_id'])
@@ -44,35 +45,35 @@
 
     def clear_resources():
         if ssn_conf['domain_created']:
-            dlab.actions_lib.remove_route_53_record(os.environ['ssn_hosted_zone_id'],
-                                                    os.environ['ssn_hosted_zone_name'],
-                                                    os.environ['ssn_subdomain'])
-        dlab.actions_lib.remove_ec2(ssn_conf['tag_name'], ssn_conf['instance_name'])
-        dlab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
-        dlab.actions_lib.remove_s3(ssn_conf['instance'])
+            datalab.actions_lib.remove_route_53_record(os.environ['ssn_hosted_zone_id'],
+                                                       os.environ['ssn_hosted_zone_name'],
+                                                       os.environ['ssn_subdomain'])
+        datalab.actions_lib.remove_ec2(ssn_conf['tag_name'], ssn_conf['instance_name'])
+        datalab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
+        datalab.actions_lib.remove_s3(ssn_conf['instance'])
         if ssn_conf['pre_defined_sg']:
-            dlab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
+            datalab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
         if ssn_conf['pre_defined_subnet']:
-            dlab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
-                                                      ssn_conf['service_base_name'])
-            dlab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
+            datalab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
+                                                         ssn_conf['service_base_name'])
+            datalab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
         if ssn_conf['pre_defined_vpc']:
-            dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc_id'])
-            dlab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
-            dlab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
+            datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc_id'])
+            datalab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
+            datalab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
         if ssn_conf['pre_defined_vpc2']:
-            dlab.actions_lib.remove_peering('*')
+            datalab.actions_lib.remove_peering('*')
             try:
-                dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
+                datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
             except:
                 print("There are no VPC Endpoints")
-            dlab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
-            dlab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
+            datalab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
+            datalab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
 
     try:
         logging.info('[DERIVING NAMES]')
         print('[DERIVING NAMES]')
-        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
+        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
             os.environ['conf_service_base_name'][:20], '-', True)
         if 'ssn_hosted_zone_id' in os.environ and 'ssn_hosted_zone_name' in os.environ and \
                 'ssn_subdomain' in os.environ:
@@ -95,42 +96,43 @@
         ssn_conf['subnet_name'] = '{}-subnet'.format(ssn_conf['service_base_name'])
         ssn_conf['sg_name'] = '{}-ssn-sg'.format(ssn_conf['service_base_name'])
         ssn_conf['network_type'] = os.environ['conf_network_type']
-        ssn_conf['dlab_ssh_user'] = os.environ['conf_os_user']
+        ssn_conf['datalab_ssh_user'] = os.environ['conf_os_user']
 
         try:
             if os.environ['aws_vpc_id'] == '':
                 raise KeyError
         except KeyError:
             ssn_conf['tag'] = {"Key": ssn_conf['tag_name'], "Value": "{}-subnet".format(ssn_conf['service_base_name'])}
-            os.environ['aws_vpc_id'] = dlab.meta_lib.get_vpc_by_tag(ssn_conf['tag_name'], ssn_conf['service_base_name'])
+            os.environ['aws_vpc_id'] = datalab.meta_lib.get_vpc_by_tag(ssn_conf['tag_name'],
+                                                                       ssn_conf['service_base_name'])
             ssn_conf['pre_defined_vpc'] = True
         try:
             if os.environ['aws_subnet_id'] == '':
                 raise KeyError
         except KeyError:
             ssn_conf['tag'] = {"Key": ssn_conf['tag_name'], "Value": "{}-subnet".format(ssn_conf['service_base_name'])}
-            os.environ['aws_subnet_id'] = dlab.meta_lib.get_subnet_by_tag(ssn_conf['tag'], True)
+            os.environ['aws_subnet_id'] = datalab.meta_lib.get_subnet_by_tag(ssn_conf['tag'], True)
             ssn_conf['pre_defined_subnet'] = True
         try:
             if os.environ['conf_duo_vpc_enable'] == 'true' and not os.environ['aws_vpc2_id']:
                 raise KeyError
         except KeyError:
             ssn_conf['tag'] = {"Key": ssn_conf['tag2_name'], "Value": "{}-subnet".format(ssn_conf['service_base_name'])}
-            os.environ['aws_vpc2_id'] = dlab.meta_lib.get_vpc_by_tag(ssn_conf['tag2_name'],
-                                                                     ssn_conf['service_base_name'])
+            os.environ['aws_vpc2_id'] = datalab.meta_lib.get_vpc_by_tag(ssn_conf['tag2_name'],
+                                                                        ssn_conf['service_base_name'])
             ssn_conf['pre_defined_vpc2'] = True
         try:
             if os.environ['conf_duo_vpc_enable'] == 'true' and not os.environ['aws_peering_id']:
                 raise KeyError
         except KeyError:
-            os.environ['aws_peering_id'] = dlab.meta_lib.get_peering_by_tag(ssn_conf['tag_name'],
-                                                                            ssn_conf['service_base_name'])
+            os.environ['aws_peering_id'] = datalab.meta_lib.get_peering_by_tag(ssn_conf['tag_name'],
+                                                                               ssn_conf['service_base_name'])
             ssn_conf['pre_defined_peering'] = True
         try:
             if os.environ['aws_security_groups_ids'] == '':
                 raise KeyError
         except KeyError:
-            os.environ['aws_security_groups_ids'] = dlab.meta_lib.get_security_group_by_name(ssn_conf['sg_name'])
+            os.environ['aws_security_groups_ids'] = datalab.meta_lib.get_security_group_by_name(ssn_conf['sg_name'])
             ssn_conf['pre_defined_sg'] = True
         try:
             if os.environ['aws_account_id'] == '':
@@ -148,7 +150,7 @@
         except KeyError:
             os.environ['aws_report_path'] = ''
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -161,54 +163,54 @@
             ssn_conf['sudo_group'] = 'wheel'
 
         if ssn_conf['network_type'] == 'private':
-            ssn_conf['instance_hostname'] = dlab.meta_lib.get_instance_ip_address(
+            ssn_conf['instance_hostname'] = datalab.meta_lib.get_instance_ip_address(
                 ssn_conf['tag_name'], ssn_conf['instance_name']).get('Private')
         else:
-            ssn_conf['instance_hostname'] = dlab.meta_lib.get_instance_hostname(
+            ssn_conf['instance_hostname'] = datalab.meta_lib.get_instance_hostname(
                 ssn_conf['tag_name'], ssn_conf['instance_name'])
 
         if os.environ['conf_stepcerts_enabled'] == 'true':
-            ssn_conf['step_cert_sans'] = ' --san {0} '.format(dlab.meta_lib.get_instance_ip_address(
+            ssn_conf['step_cert_sans'] = ' --san {0} '.format(datalab.meta_lib.get_instance_ip_address(
                 ssn_conf['tag_name'], ssn_conf['instance_name']).get('Private'))
             if ssn_conf['network_type'] == 'public':
                 ssn_conf['step_cert_sans'] += ' --san {0} --san {1}'.format(
-                    dlab.meta_lib.get_instance_hostname(ssn_conf['tag_name'], ssn_conf['instance_name']),
-                    dlab.meta_lib.get_instance_ip_address(ssn_conf['tag_name'],
-                                                          ssn_conf['instance_name']).get('Public'))
+                    datalab.meta_lib.get_instance_hostname(ssn_conf['tag_name'], ssn_conf['instance_name']),
+                    datalab.meta_lib.get_instance_ip_address(ssn_conf['tag_name'],
+                                                             ssn_conf['instance_name']).get('Public'))
         else:
             ssn_conf['step_cert_sans'] = ''
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             ssn_conf['instance_hostname'], os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem",
-            ssn_conf['initial_user'], ssn_conf['dlab_ssh_user'], ssn_conf['sudo_group'])
+            ssn_conf['initial_user'], ssn_conf['datalab_ssh_user'], ssn_conf['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         clear_resources()
         sys.exit(1)
 
     try:
         logging.info('[INSTALLING PREREQUISITES TO SSN INSTANCE]')
         print('[INSTALLING PREREQUISITES TO SSN INSTANCE]')
-        params = "--hostname {} --keyfile {} --pip_packages 'boto3 backoff argparse fabric==1.14.0 awscli pymongo " \
+        params = "--hostname {} --keyfile {} --pip_packages 'boto3 bcrypt==3.1.7 backoff argparse fabric==1.14.0 awscli pymongo " \
                  "pyyaml jinja2' --user {} --region {}". \
             format(ssn_conf['instance_hostname'], os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem",
-                   ssn_conf['dlab_ssh_user'], os.environ['aws_region'])
+                   ssn_conf['datalab_ssh_user'], os.environ['aws_region'])
 
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing software: pip, packages.", str(err))
+        datalab.fab.append_result("Failed installing software: pip, packages.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -216,24 +218,24 @@
         logging.info('[CONFIGURE SSN INSTANCE]')
         print('[CONFIGURE SSN INSTANCE]')
         additional_config = {"nginx_template_dir": "/root/templates/", "service_base_name":
-                             ssn_conf['service_base_name'],
+            ssn_conf['service_base_name'],
                              "security_group_id": os.environ['aws_security_groups_ids'],
                              "vpc_id": os.environ['aws_vpc_id'], "subnet_id": os.environ['aws_subnet_id'],
                              "admin_key": os.environ['conf_key_name']}
-        params = "--hostname {} --keyfile {} --additional_config '{}' --os_user {} --dlab_path {} " \
+        params = "--hostname {} --keyfile {} --additional_config '{}' --os_user {} --datalab_path {} " \
                  "--tag_resource_id {} --step_cert_sans '{}' ".format(
-                  ssn_conf['instance_hostname'],
-                  "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
-                  json.dumps(additional_config), ssn_conf['dlab_ssh_user'], os.environ['ssn_dlab_path'],
-                  os.environ['conf_tag_resource_id'], ssn_conf['step_cert_sans'])
+            ssn_conf['instance_hostname'],
+            "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
+            json.dumps(additional_config), ssn_conf['datalab_ssh_user'], os.environ['ssn_datalab_path'],
+            os.environ['conf_tag_resource_id'], ssn_conf['step_cert_sans'])
 
         try:
-            local("~/scripts/{}.py {}".format('configure_ssn_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_ssn_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed configuring ssn.", str(err))
+        datalab.fab.append_result("Failed configuring ssn.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -252,21 +254,21 @@
                              {"name": "deeplearning", "tag": "latest"},
                              {"name": "dataengine-service", "tag": "latest"},
                              {"name": "dataengine", "tag": "latest"}]
-        params = "--hostname {} --keyfile {} --additional_config '{}' --os_family {} --os_user {} --dlab_path {} " \
+        params = "--hostname {} --keyfile {} --additional_config '{}' --os_family {} --os_user {} --datalab_path {} " \
                  "--cloud_provider {} --region {}".format(ssn_conf['instance_hostname'],
                                                           "{}{}.pem".format(os.environ['conf_key_dir'],
                                                                             os.environ['conf_key_name']),
                                                           json.dumps(additional_config), os.environ['conf_os_family'],
-                                                          ssn_conf['dlab_ssh_user'], os.environ['ssn_dlab_path'],
+                                                          ssn_conf['datalab_ssh_user'], os.environ['ssn_datalab_path'],
                                                           os.environ['conf_cloud_provider'], os.environ['aws_region'])
 
         try:
-            local("~/scripts/{}.py {}".format('configure_docker', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_docker', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Unable to configure docker.", str(err))
+        datalab.fab.append_result("Unable to configure docker.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -274,8 +276,8 @@
         cloud_params = [
             {
                 'key': 'KEYCLOAK_REDIRECT_URI',
-                'value': "https://{0}/".format(dlab.meta_lib.get_instance_hostname(ssn_conf['tag_name'],
-                                                                                   ssn_conf['instance_name']))
+                'value': "https://{0}/".format(datalab.meta_lib.get_instance_hostname(ssn_conf['tag_name'],
+                                                                                      ssn_conf['instance_name']))
             },
             {
                 'key': 'KEYCLOAK_REALM_NAME',
@@ -456,6 +458,62 @@
                     'key': 'STEP_CA_URL',
                     'value': os.environ['conf_stepcerts_ca_url']
                 })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_ENABLED',
+                    'value': 'false'
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_DOMAIN_NAME',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_EMAIL',
+                    'value': ''
+                })
+        elif os.environ['conf_letsencrypt_enabled'] == 'true':
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_ENABLED',
+                    'value': os.environ['conf_letsencrypt_enabled']
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_DOMAIN_NAME',
+                    'value': os.environ['conf_letsencrypt_domain_name']
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_EMAIL',
+                    'value': os.environ['conf_letsencrypt_email']
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_CERTS_ENABLED',
+                    'value': 'false'
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_ROOT_CA',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_KID_ID',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_KID_PASSWORD',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_CA_URL',
+                    'value': ''
+                })
         else:
             cloud_params.append(
                 {
@@ -482,11 +540,26 @@
                     'key': 'STEP_CA_URL',
                     'value': ''
                 })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_ENABLED',
+                    'value': 'false'
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_DOMAIN_NAME',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_EMAIL',
+                    'value': ''
+                })
         logging.info('[CONFIGURE SSN INSTANCE UI]')
         print('[CONFIGURE SSN INSTANCE UI]')
         params = "--hostname {} " \
                  "--keyfile {} " \
-                 "--dlab_path {} " \
+                 "--datalab_path {} " \
                  "--os_user {} " \
                  "--os_family {} " \
                  "--request_id {} " \
@@ -501,7 +574,7 @@
                  "--report_path '{}' " \
                  "--billing_enabled {} " \
                  "--cloud_params '{}' " \
-                 "--dlab_id '{}' " \
+                 "--datalab_id '{}' " \
                  "--usage_date {} " \
                  "--product {} " \
                  "--usage_type {} " \
@@ -515,8 +588,8 @@
                  "--keycloak_auth_server_url {}". \
             format(ssn_conf['instance_hostname'],
                    "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
-                   os.environ['ssn_dlab_path'],
-                   ssn_conf['dlab_ssh_user'],
+                   os.environ['ssn_datalab_path'],
+                   ssn_conf['datalab_ssh_user'],
                    os.environ['conf_os_family'],
                    os.environ['request_id'],
                    os.environ['conf_resource'],
@@ -530,7 +603,7 @@
                    os.environ['aws_report_path'],
                    ssn_conf['billing_enabled'],
                    json.dumps(cloud_params),
-                   os.environ['dlab_id'],
+                   os.environ['datalab_id'],
                    os.environ['usage_date'],
                    os.environ['product'],
                    os.environ['usage_type'],
@@ -543,12 +616,12 @@
                    os.environ['keycloak_client_secret'],
                    os.environ['keycloak_auth_server_url'])
         try:
-            local("~/scripts/{}.py {}".format('configure_ui', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_ui', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Unable to configure UI.", str(err))
+        datalab.fab.append_result("Unable to configure UI.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -568,15 +641,15 @@
         print("SSN instance shape: {}".format(os.environ['aws_ssn_instance_size']))
         print("SSN AMI name: {}".format(ssn_conf['ssn_image_name']))
         print("Region: {}".format(ssn_conf['region']))
-        ssn_conf['jenkins_url'] = "http://{}/jenkins".format(dlab.meta_lib.get_instance_hostname(
+        ssn_conf['jenkins_url'] = "http://{}/jenkins".format(datalab.meta_lib.get_instance_hostname(
             ssn_conf['tag_name'], ssn_conf['instance_name']))
-        ssn_conf['jenkins_url_https'] = "https://{}/jenkins".format(dlab.meta_lib.get_instance_hostname(
+        ssn_conf['jenkins_url_https'] = "https://{}/jenkins".format(datalab.meta_lib.get_instance_hostname(
             ssn_conf['tag_name'], ssn_conf['instance_name']))
         print("Jenkins URL: {}".format(ssn_conf['jenkins_url']))
         print("Jenkins URL HTTPS: {}".format(ssn_conf['jenkins_url_https']))
-        print("DLab UI HTTP URL: http://{}".format(dlab.meta_lib.get_instance_hostname(
+        print("DataLab UI HTTP URL: http://{}".format(datalab.meta_lib.get_instance_hostname(
             ssn_conf['tag_name'], ssn_conf['instance_name'])))
-        print("DLab UI HTTPS URL: https://{}".format(dlab.meta_lib.get_instance_hostname(
+        print("DataLab UI HTTPS URL: https://{}".format(datalab.meta_lib.get_instance_hostname(
             ssn_conf['tag_name'], ssn_conf['instance_name'])))
         try:
             with open('jenkins_creds.txt') as f:
@@ -587,8 +660,8 @@
         with open("/root/result.json", 'w') as f:
             res = {"service_base_name": ssn_conf['service_base_name'],
                    "instance_name": ssn_conf['instance_name'],
-                   "instance_hostname": dlab.meta_lib.get_instance_hostname(ssn_conf['tag_name'],
-                                                                            ssn_conf['instance_name']),
+                   "instance_hostname": datalab.meta_lib.get_instance_hostname(ssn_conf['tag_name'],
+                                                                               ssn_conf['instance_name']),
                    "role_name": ssn_conf['role_name'],
                    "role_profile_name": ssn_conf['role_profile_name'],
                    "policy_name": ssn_conf['policy_name'],
@@ -602,18 +675,18 @@
             f.write(json.dumps(res))
 
         print('Upload response file')
-        params = "--instance_name {} --local_log_filepath {} --os_user {} --instance_hostname {}".\
-            format(ssn_conf['instance_name'], local_log_filepath, ssn_conf['dlab_ssh_user'],
+        params = "--instance_name {} --local_log_filepath {} --os_user {} --instance_hostname {}". \
+            format(ssn_conf['instance_name'], local_log_filepath, ssn_conf['datalab_ssh_user'],
                    ssn_conf['instance_hostname'])
-        local("~/scripts/{}.py {}".format('upload_response_file', params))
+        subprocess.run("~/scripts/{}.py {}".format('upload_response_file', params), shell=True, check=True)
 
         logging.info('[FINALIZE]')
         print('[FINALIZE]')
         params = ""
         if os.environ['conf_lifecycle_stage'] == 'prod':
             params += "--key_id {}".format(os.environ['aws_access_key'])
-            local("~/scripts/{}.py {}".format('ssn_finalize', params))
+            subprocess.run("~/scripts/{}.py {}".format('ssn_finalize', params), shell=True, check=True)
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
+        datalab.fab.append_result("Error with writing results.", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/ssn_create_endpoint.py b/infrastructure-provisioning/src/general/scripts/aws/ssn_create_endpoint.py
index f44c6d9..9a04ac0 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/ssn_create_endpoint.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/ssn_create_endpoint.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,12 +22,13 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
+import boto3
+import botocore
 import sys
-import boto3, botocore
-from dlab.ssn_lib import *
 import time
+from datalab.actions_lib import *
+from datalab.meta_lib import *
+from datalab.ssn_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--vpc_id', type=str, default='')
@@ -36,7 +37,6 @@
 parser.add_argument('--infra_tag_value', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     tag = {"Key": args.infra_tag_name, "Value": args.infra_tag_value}
     waiter = time.sleep(10)
@@ -61,6 +61,7 @@
                         break
                 print('Created Route-Table with ID: {}'.format(route_table))
                 create_tag(route_table, json.dumps(tag))
+                create_tag(route_table, json.dumps({"Key": "Name", "Value": "{}-rt".format(args.infra_tag_value)}))
             endpoints = get_vpc_endpoints(args.vpc_id)
             if not endpoints:
                 print('Creating EP')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/ssn_create_vpc.py b/infrastructure-provisioning/src/general/scripts/aws/ssn_create_vpc.py
index 3ab99dd..afaea63 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/ssn_create_vpc.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/ssn_create_vpc.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,9 +22,8 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--vpc', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/ssn_finalize.py b/infrastructure-provisioning/src/general/scripts/aws/ssn_finalize.py
index ee6ac9d..31ae0a3a100ae 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/ssn_finalize.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/ssn_finalize.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,11 +21,10 @@
 #
 # ******************************************************************************
 
-import boto3
 import argparse
+import boto3
 import sys
-from dlab.ssn_lib import *
-
+from datalab.ssn_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--key_id', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/aws/ssn_prepare.py b/infrastructure-provisioning/src/general/scripts/aws/ssn_prepare.py
index 45c65f2..bee2e3f 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/ssn_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/ssn_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,17 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
-import sys
-import os
-from fabric.api import *
-import dlab.ssn_lib
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-
+import logging
+import os
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}.log".format(os.environ['conf_resource'], os.environ['request_id'])
@@ -49,19 +48,19 @@
         logging.info('[CREATE AWS CONFIG FILE]')
         print('[CREATE AWS CONFIG FILE]')
         if 'aws_access_key' in os.environ and 'aws_secret_access_key' in os.environ:
-            dlab.actions_lib.create_aws_config_files(generate_full_config=True)
+            datalab.actions_lib.create_aws_config_files(generate_full_config=True)
         else:
-            dlab.actions_lib.create_aws_config_files()
+            datalab.actions_lib.create_aws_config_files()
     except Exception as err:
         logging.info('Unable to create configuration')
-        dlab.fab.append_result("Unable to create configuration", err)
+        datalab.fab.append_result("Unable to create configuration", err)
         traceback.print_exc()
         sys.exit(1)
 
     try:
         logging.info('[DERIVING NAMES]')
         print('[DERIVING NAMES]')
-        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
+        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
             os.environ['conf_service_base_name'][:20], '-', True)
         ssn_conf['role_name'] = '{}-ssn-role'.format(ssn_conf['service_base_name'])
         ssn_conf['role_profile_name'] = '{}-ssn-profile'.format(ssn_conf['service_base_name'])
@@ -73,7 +72,7 @@
         ssn_conf['region'] = os.environ['aws_region']
         ssn_conf['zone_full'] = os.environ['aws_region'] + os.environ['aws_zone']
         ssn_conf['ssn_image_name'] = os.environ['aws_{}_image_name'.format(os.environ['conf_os_family'])]
-        ssn_conf['ssn_ami_id'] = dlab.meta_lib.get_ami_id(ssn_conf['ssn_image_name'])
+        ssn_conf['ssn_ami_id'] = datalab.meta_lib.get_ami_id(ssn_conf['ssn_image_name'])
         ssn_conf['policy_path'] = '/root/files/ssn_policy.json'
         ssn_conf['vpc_cidr'] = os.environ['conf_vpc_cidr']
         ssn_conf['vpc2_cidr'] = os.environ['conf_vpc2_cidr']
@@ -88,10 +87,10 @@
         ssn_conf['all_ip_cidr'] = '0.0.0.0/0'
         ssn_conf['elastic_ip_name'] = '{0}-ssn-static-ip'.format(ssn_conf['service_base_name'])
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
 
-    if dlab.meta_lib.get_instance_by_name(ssn_conf['tag_name'], ssn_conf['instance_name']):
+    if datalab.meta_lib.get_instance_by_name(ssn_conf['tag_name'], ssn_conf['instance_name']):
         print("Service base name should be unique and less or equal 20 symbols. Please try again.")
         sys.exit(1)
 
@@ -107,18 +106,18 @@
                 ssn_conf['vpc_cidr'], ssn_conf['region'], ssn_conf['tag_name'], ssn_conf['service_base_name'],
                 ssn_conf['vpc_name'])
             try:
-                local("~/scripts/{}.py {}".format('ssn_create_vpc', params))
+                subprocess.run("~/scripts/{}.py {}".format('ssn_create_vpc', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
-            os.environ['aws_vpc_id'] = dlab.meta_lib.get_vpc_by_tag(ssn_conf['tag_name'],
-                                                                    ssn_conf['service_base_name'])
+            os.environ['aws_vpc_id'] = datalab.meta_lib.get_vpc_by_tag(ssn_conf['tag_name'],
+                                                                       ssn_conf['service_base_name'])
         except Exception as err:
-            dlab.fab.append_result("Failed to create VPC", str(err))
+            datalab.fab.append_result("Failed to create VPC", str(err))
             sys.exit(1)
 
     ssn_conf['allowed_vpc_cidr_ip_ranges'] = list()
-    for cidr in dlab.meta_lib.get_vpc_cidr_by_id(os.environ['aws_vpc_id']):
+    for cidr in datalab.meta_lib.get_vpc_cidr_by_id(os.environ['aws_vpc_id']):
         ssn_conf['allowed_vpc_cidr_ip_ranges'].append({"CidrIp": cidr})
 
     try:
@@ -133,19 +132,19 @@
                      "--vpc_name {}".format(ssn_conf['vpc2_cidr'], ssn_conf['region'], ssn_conf['tag2_name'],
                                             ssn_conf['service_base_name'], ssn_conf['vpc2_name'])
             try:
-                local("~/scripts/{}.py {}".format('ssn_create_vpc', params))
+                subprocess.run("~/scripts/{}.py {}".format('ssn_create_vpc', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
-            os.environ['aws_vpc2_id'] = dlab.meta_lib.get_vpc_by_tag(ssn_conf['tag2_name'],
-                                                                     ssn_conf['service_base_name'])
+            os.environ['aws_vpc2_id'] = datalab.meta_lib.get_vpc_by_tag(ssn_conf['tag2_name'],
+                                                                        ssn_conf['service_base_name'])
         except Exception as err:
-            dlab.fab.append_result("Failed to create secondary VPC.", str(err))
+            datalab.fab.append_result("Failed to create secondary VPC.", str(err))
             if ssn_conf['pre_defined_vpc']:
-                dlab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
-                                                          ssn_conf['service_base_name'])
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
+                datalab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
+                                                             ssn_conf['service_base_name'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
             sys.exit(1)
 
     try:
@@ -161,31 +160,31 @@
                       os.environ['aws_vpc_id'], 'ssn', ssn_conf['tag_name'],ssn_conf['service_base_name'], '20',
                       True, ssn_conf['zone_full'], ssn_conf['subnet_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_create_subnet', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_create_subnet', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
             with open('/tmp/ssn_subnet_id', 'r') as f:
                 os.environ['aws_subnet_id'] = f.read()
-            dlab.actions_lib.enable_auto_assign_ip(os.environ['aws_subnet_id'])
+            datalab.actions_lib.enable_auto_assign_ip(os.environ['aws_subnet_id'])
         except Exception as err:
-            dlab.fab.append_result("Failed to create Subnet.", str(err))
+            datalab.fab.append_result("Failed to create Subnet.", str(err))
             if ssn_conf['pre_defined_vpc']:
-                dlab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
-                                                          ssn_conf['service_base_name'])
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
+                datalab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
+                                                             ssn_conf['service_base_name'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
                 try:
-                    dlab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
+                    datalab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
                 except:
                     print("Subnet hasn't been created.")
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
             if ssn_conf['pre_defined_vpc2']:
                 try:
-                    dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
+                    datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
                 except:
                     print("There are no VPC Endpoints")
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
             sys.exit(1)
 
     try:
@@ -195,29 +194,29 @@
         try:
             logging.info('[CREATE PEERING CONNECTION]')
             print('[CREATE PEERING CONNECTION]')
-            os.environ['aws_peering_id'] = dlab.actions_lib.create_peering_connection(
+            os.environ['aws_peering_id'] = datalab.actions_lib.create_peering_connection(
                 os.environ['aws_vpc_id'], os.environ['aws_vpc2_id'], ssn_conf['service_base_name'])
             print('PEERING CONNECTION ID:' + os.environ['aws_peering_id'])
-            dlab.actions_lib.create_route_by_id(os.environ['aws_subnet_id'], os.environ['aws_vpc_id'],
-                                                os.environ['aws_peering_id'],
-                                                dlab.meta_lib.get_cidr_by_vpc(os.environ['aws_vpc2_id']))
+            datalab.actions_lib.create_route_by_id(os.environ['aws_subnet_id'], os.environ['aws_vpc_id'],
+                                                   os.environ['aws_peering_id'],
+                                                   datalab.meta_lib.get_cidr_by_vpc(os.environ['aws_vpc2_id']))
         except Exception as err:
-            dlab.fab.append_result("Failed to create peering connection.", str(err))
+            datalab.fab.append_result("Failed to create peering connection.", str(err))
             if ssn_conf['pre_defined_vpc']:
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
                 try:
-                    dlab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
+                    datalab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
                 except:
                     print("Subnet hasn't been created.")
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
             if ssn_conf['pre_defined_vpc2']:
-                dlab.actions_lib.remove_peering('*')
+                datalab.actions_lib.remove_peering('*')
                 try:
-                    dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
+                    datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
                 except:
                     print("There are no VPC Endpoints")
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
             sys.exit(1)
 
     try:
@@ -228,7 +227,7 @@
             ssn_conf['pre_defined_sg'] = True
             logging.info('[CREATE SG FOR SSN]')
             print('[CREATE SG FOR SSN]')
-            ssn_conf['ingress_sg_rules_template'] = dlab.meta_lib.format_sg([
+            ssn_conf['ingress_sg_rules_template'] = datalab.meta_lib.format_sg([
                 {
                     "PrefixListIds": [],
                     "FromPort": 80,
@@ -266,7 +265,7 @@
                     "ToPort": 443, "IpProtocol": "tcp", "UserIdGroupPairs": []
                 }
             ])
-            egress_sg_rules_template = dlab.meta_lib.format_sg([
+            egress_sg_rules_template = datalab.meta_lib.format_sg([
                 {"IpProtocol": "-1", "IpRanges": [{"CidrIp": ssn_conf['all_ip_cidr']}], "UserIdGroupPairs": [],
                  "PrefixListIds": []}
             ])
@@ -276,28 +275,28 @@
                        json.dumps(ssn_conf['ingress_sg_rules_template']), json.dumps(egress_sg_rules_template),
                        ssn_conf['service_base_name'], ssn_conf['tag_name'], False, True)
             try:
-                local("~/scripts/{}.py {}".format('common_create_security_group', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
             with open('/tmp/ssn_sg_id', 'r') as f:
                 os.environ['aws_security_groups_ids'] = f.read()
         except Exception as err:
-            dlab.gab_lib.append_result("Failed creating security group for SSN.", str(err))
+            datalab.gab_lib.append_result("Failed creating security group for SSN.", str(err))
             if ssn_conf['pre_defined_vpc']:
-                dlab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
-                                                          ssn_conf['service_base_name'])
-                dlab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
+                datalab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
+                                                             ssn_conf['service_base_name'])
+                datalab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
             if ssn_conf['pre_defined_vpc2']:
-                dlab.actions_lib.remove_peering('*')
+                datalab.actions_lib.remove_peering('*')
                 try:
-                    dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
+                    datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
                 except:
                     print("There are no VPC Endpoints")
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
             sys.exit(1)
 
     try:
@@ -309,29 +308,29 @@
                    ssn_conf['policy_path'], os.environ['aws_region'], ssn_conf['tag_name'],
                    ssn_conf['service_base_name'], ssn_conf['user_tag'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_role_policy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_role_policy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Unable to create roles.", str(err))
+        datalab.fab.append_result("Unable to create roles.", str(err))
         if ssn_conf['pre_defined_sg']:
-            dlab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
+            datalab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
         if ssn_conf['pre_defined_subnet']:
-            dlab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
-                                                      ssn_conf['service_base_name'])
-            dlab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
+            datalab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
+                                                         ssn_conf['service_base_name'])
+            datalab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
         if ssn_conf['pre_defined_vpc']:
-            dlab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
-            dlab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
+            datalab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
+            datalab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
         if ssn_conf['pre_defined_vpc2']:
-            dlab.actions_lib.remove_peering('*')
+            datalab.actions_lib.remove_peering('*')
             try:
-                dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
+                datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
             except:
                 print("There are no VPC Endpoints")
-            dlab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
-            dlab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
+            datalab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
+            datalab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
         sys.exit(1)
 
     try:
@@ -340,30 +339,30 @@
         params = "--vpc_id {} --region {} --infra_tag_name {} --infra_tag_value {}".format(
             os.environ['aws_vpc_id'], os.environ['aws_region'], ssn_conf['tag_name'], ssn_conf['service_base_name'])
         try:
-            local("~/scripts/{}.py {}".format('ssn_create_endpoint', params))
+            subprocess.run("~/scripts/{}.py {}".format('ssn_create_endpoint', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Unable to create an endpoint.", str(err))
-        dlab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
+        datalab.fab.append_result("Unable to create an endpoint.", str(err))
+        datalab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
         if ssn_conf['pre_defined_sg']:
-            dlab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
+            datalab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
         if ssn_conf['pre_defined_subnet']:
-            dlab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
-                                                      ssn_conf['service_base_name'])
-            dlab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
+            datalab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
+                                                         ssn_conf['service_base_name'])
+            datalab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
         if ssn_conf['pre_defined_vpc']:
-            dlab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
-            dlab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
+            datalab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
+            datalab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
         if ssn_conf['pre_defined_vpc2']:
-            dlab.actions_lib.remove_peering('*')
+            datalab.actions_lib.remove_peering('*')
             try:
-                dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
+                datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
             except:
                 print("There are no VPC Endpoints")
-            dlab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
-            dlab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
+            datalab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
+            datalab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
         sys.exit(1)
 
     if os.environ['conf_duo_vpc_enable'] == 'true':
@@ -374,30 +373,30 @@
                 os.environ['aws_vpc2_id'], os.environ['aws_region'], ssn_conf['tag2_name'],
                 ssn_conf['service_base_name'])
             try:
-                local("~/scripts/{}.py {}".format('ssn_create_endpoint', params))
+                subprocess.run("~/scripts/{}.py {}".format('ssn_create_endpoint', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
         except Exception as err:
-            dlab.fab.append_result("Unable to create secondary endpoint.", str(err))
-            dlab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
+            datalab.fab.append_result("Unable to create secondary endpoint.", str(err))
+            datalab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
             if ssn_conf['pre_defined_sg']:
-                dlab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
+                datalab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
             if ssn_conf['pre_defined_subnet']:
-                dlab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
-                                                          ssn_conf['service_base_name'])
-                dlab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
+                datalab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
+                                                             ssn_conf['service_base_name'])
+                datalab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
             if ssn_conf['pre_defined_vpc']:
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
             if ssn_conf['pre_defined_vpc2']:
-                dlab.actions_lib.remove_peering('*')
+                datalab.actions_lib.remove_peering('*')
                 try:
-                    dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
+                    datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
                 except:
                     print("There are no VPC Endpoints")
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
             sys.exit(1)
 
     try:
@@ -411,39 +410,39 @@
                    ssn_conf['role_profile_name'], ssn_conf['tag_name'], ssn_conf['instance_name'], 'ssn', '20')
 
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Unable to create ssn instance.", str(err))
-        dlab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
-        dlab.actions_lib.remove_s3(ssn_conf['instance'])
+        datalab.fab.append_result("Unable to create ssn instance.", str(err))
+        datalab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
+        datalab.actions_lib.remove_s3(ssn_conf['instance'])
         if ssn_conf['pre_defined_sg']:
-            dlab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
+            datalab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
         if ssn_conf['pre_defined_subnet']:
-            dlab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
-                                                      ssn_conf['service_base_name'])
-            dlab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
+            datalab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
+                                                         ssn_conf['service_base_name'])
+            datalab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
         if ssn_conf['pre_defined_vpc']:
-            dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc_id'])
-            dlab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
-            dlab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
+            datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc_id'])
+            datalab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
+            datalab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
         if ssn_conf['pre_defined_vpc2']:
-            dlab.actions_lib.remove_peering('*')
+            datalab.actions_lib.remove_peering('*')
             try:
-                dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
+                datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
             except:
                 print("There are no VPC Endpoints")
-            dlab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
-            dlab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
+            datalab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
+            datalab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
         sys.exit(1)
 
     if ssn_conf['network_type'] == 'public':
         try:
             logging.info('[ASSOCIATING ELASTIC IP]')
             print('[ASSOCIATING ELASTIC IP]')
-            ssn_conf['ssn_id'] = dlab.meta_lib.get_instance_by_name(ssn_conf['tag_name'], ssn_conf['instance_name'])
+            ssn_conf['ssn_id'] = datalab.meta_lib.get_instance_by_name(ssn_conf['tag_name'], ssn_conf['instance_name'])
             try:
                 ssn_conf['elastic_ip'] = os.environ['ssn_elastic_ip']
             except:
@@ -451,77 +450,77 @@
             params = "--elastic_ip {} --ssn_id {} --infra_tag_name {} --infra_tag_value {}".format(
                 ssn_conf['elastic_ip'], ssn_conf['ssn_id'], ssn_conf['tag_name'], ssn_conf['elastic_ip_name'])
             try:
-                local("~/scripts/{}.py {}".format('ssn_associate_elastic_ip', params))
+                subprocess.run("~/scripts/{}.py {}".format('ssn_associate_elastic_ip', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
         except Exception as err:
-            dlab.fab.append_result("Failed to associate elastic ip.", str(err))
-            dlab.actions_lib.remove_ec2(ssn_conf['tag_name'], ssn_conf['instance_name'])
-            dlab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
-            dlab.actions_lib.remove_s3(ssn_conf['instance'])
+            datalab.fab.append_result("Failed to associate elastic ip.", str(err))
+            datalab.actions_lib.remove_ec2(ssn_conf['tag_name'], ssn_conf['instance_name'])
+            datalab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
+            datalab.actions_lib.remove_s3(ssn_conf['instance'])
             if ssn_conf['pre_defined_sg']:
-                dlab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
+                datalab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
             if ssn_conf['pre_defined_subnet']:
-                dlab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
-                                                          ssn_conf['service_base_name'])
-                dlab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
+                datalab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
+                                                             ssn_conf['service_base_name'])
+                datalab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
             if ssn_conf['pre_defined_vpc']:
-                dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc_id'])
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
+                datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc_id'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
             if ssn_conf['pre_defined_vpc2']:
-                dlab.actions_lib.remove_peering('*')
+                datalab.actions_lib.remove_peering('*')
                 try:
-                    dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
+                    datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
                 except:
                     print("There are no VPC Endpoints")
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
             sys.exit(1)
 
     if ssn_conf['network_type'] == 'private':
-        ssn_conf['instance_ip'] = dlab.meta_lib.get_instance_ip_address(ssn_conf['tag_name'],
-                                                                        ssn_conf['instance_name']).get('Private')
+        ssn_conf['instance_ip'] = datalab.meta_lib.get_instance_ip_address(ssn_conf['tag_name'],
+                                                                           ssn_conf['instance_name']).get('Private')
     else:
-        ssn_conf['instance_ip'] = dlab.meta_lib.get_instance_ip_address(ssn_conf['tag_name'],
-                                                                        ssn_conf['instance_name']).get('Public')
+        ssn_conf['instance_ip'] = datalab.meta_lib.get_instance_ip_address(ssn_conf['tag_name'],
+                                                                           ssn_conf['instance_name']).get('Public')
 
     if 'ssn_hosted_zone_id' in os.environ and 'ssn_hosted_zone_name' in os.environ and 'ssn_subdomain' in os.environ:
         try:
             logging.info('[CREATING ROUTE53 RECORD]')
             print('[CREATING ROUTE53 RECORD]')
             try:
-                dlab.actions_lib.create_route_53_record(os.environ['ssn_hosted_zone_id'],
-                                                        os.environ['ssn_hosted_zone_name'],
-                                                        os.environ['ssn_subdomain'], ssn_conf['instance_ip'])
+                datalab.actions_lib.create_route_53_record(os.environ['ssn_hosted_zone_id'],
+                                                           os.environ['ssn_hosted_zone_name'],
+                                                           os.environ['ssn_subdomain'], ssn_conf['instance_ip'])
             except:
                 traceback.print_exc()
                 raise Exception
         except Exception as err:
-            dlab.fab.append_result("Failed to create route53 record.", str(err))
-            dlab.actions_lib.remove_route_53_record(os.environ['ssn_hosted_zone_id'],
-                                                    os.environ['ssn_hosted_zone_name'],
-                                   os.environ['ssn_subdomain'])
-            dlab.actions_lib.remove_ec2(ssn_conf['tag_name'], ssn_conf['instance_name'])
-            dlab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
-            dlab.actions_lib.remove_s3(ssn_conf['instance'])
+            datalab.fab.append_result("Failed to create route53 record.", str(err))
+            datalab.actions_lib.remove_route_53_record(os.environ['ssn_hosted_zone_id'],
+                                                       os.environ['ssn_hosted_zone_name'],
+                                                       os.environ['ssn_subdomain'])
+            datalab.actions_lib.remove_ec2(ssn_conf['tag_name'], ssn_conf['instance_name'])
+            datalab.actions_lib.remove_all_iam_resources(ssn_conf['instance'])
+            datalab.actions_lib.remove_s3(ssn_conf['instance'])
             if ssn_conf['pre_defined_sg']:
-                dlab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
+                datalab.actions_lib.remove_sgroups(ssn_conf['tag_name'])
             if ssn_conf['pre_defined_subnet']:
-                dlab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
-                                                          ssn_conf['service_base_name'])
-                dlab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
+                datalab.actions_lib.remove_internet_gateways(os.environ['aws_vpc_id'], ssn_conf['tag_name'],
+                                                             ssn_conf['service_base_name'])
+                datalab.actions_lib.remove_subnets(ssn_conf['subnet_name'])
             if ssn_conf['pre_defined_vpc']:
-                dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc_id'])
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
+                datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc_id'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag_name'], True)
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc_id'])
             if ssn_conf['pre_defined_vpc2']:
-                dlab.actions_lib.remove_peering('*')
+                datalab.actions_lib.remove_peering('*')
                 try:
-                    dlab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
+                    datalab.actions_lib.remove_vpc_endpoints(os.environ['aws_vpc2_id'])
                 except:
                     print("There are no VPC Endpoints")
-                dlab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
-                dlab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
+                datalab.actions_lib.remove_route_tables(ssn_conf['tag2_name'], True)
+                datalab.actions_lib.remove_vpc(os.environ['aws_vpc2_id'])
             sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/ssn_terminate.py b/infrastructure-provisioning/src/general/scripts/aws/ssn_terminate.py
index 975e8d3..1dd2ffe 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/ssn_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/ssn_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,14 @@
 #
 # ******************************************************************************
 
-import sys
-import os
-import logging
-import traceback
-from fabric.api import *
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import dlab.ssn_lib
+import datalab.ssn_lib
 import json
+import logging
+import os
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}.log".format(os.environ['conf_resource'], os.environ['request_id'])
@@ -40,13 +38,13 @@
                         filename=local_log_filepath)
     # generating variables dictionary
     if 'aws_access_key' in os.environ and 'aws_secret_access_key' in os.environ:
-        dlab.actions_lib.create_aws_config_files(generate_full_config=True)
+        datalab.actions_lib.create_aws_config_files(generate_full_config=True)
     else:
-        dlab.actions_lib.create_aws_config_files()
+        datalab.actions_lib.create_aws_config_files()
     print('Generating infrastructure names and tags')
     ssn_conf = dict()
-    ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
-            os.environ['conf_service_base_name'][:20], '-', True)
+    ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
+        os.environ['conf_service_base_name'][:20], '-', True)
     ssn_conf['tag_name'] = ssn_conf['service_base_name'] + '-tag'
     ssn_conf['edge_sg'] = ssn_conf['service_base_name'] + "*" + '-edge'
     ssn_conf['nb_sg'] = ssn_conf['service_base_name'] + "*" + '-nb'
@@ -60,13 +58,13 @@
                  format(ssn_conf['tag_name'], ssn_conf['edge_sg'], ssn_conf['nb_sg'], ssn_conf['de_sg'],
                         ssn_conf['service_base_name'], ssn_conf['de-service_sg'])
         try:
-            local("~/scripts/{}.py {}".format('ssn_terminate_aws_resources', params))
+            subprocess.run("~/scripts/{}.py {}".format('ssn_terminate_aws_resources', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         print('Error: {0}'.format(err))
-        dlab.fab.append_result("Failed to terminate ssn.", str(err))
+        datalab.fab.append_result("Failed to terminate ssn.", str(err))
         sys.exit(1)
 
     try:
@@ -76,5 +74,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/ssn_terminate_aws_resources.py b/infrastructure-provisioning/src/general/scripts/aws/ssn_terminate_aws_resources.py
index 27b5913..72ad38f 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/ssn_terminate_aws_resources.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/ssn_terminate_aws_resources.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,11 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import dlab.ssn_lib
-import boto3
 import argparse
-import sys
+import boto3
+import datalab.ssn_lib
 import os
+import sys
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--tag_name', type=str)
@@ -47,129 +44,129 @@
 if __name__ == "__main__":
     print('Terminating EMR cluster')
     try:
-        clusters_list = dlab.meta_lib.get_emr_list(args.tag_name)
+        clusters_list = datalab.meta_lib.get_emr_list(args.tag_name)
         if clusters_list:
             for cluster_id in clusters_list:
                 client = boto3.client('emr')
                 cluster = client.describe_cluster(ClusterId=cluster_id)
                 cluster = cluster.get("Cluster")
                 emr_name = cluster.get('Name')
-                dlab.actions_lib.terminate_emr(cluster_id)
+                datalab.actions_lib.terminate_emr(cluster_id)
                 print("The EMR cluster {} has been terminated successfully".format(emr_name))
         else:
             print("There are no EMR clusters to terminate.")
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate EMR cluster.", str(err))
+        datalab.fab.append_result("Failed to terminate EMR cluster.", str(err))
         sys.exit(1)
 
     print("Deregistering notebook's AMI")
     try:
-        dlab.actions_lib.deregister_image()
+        datalab.actions_lib.deregister_image()
     except Exception as err:
-        dlab.fab.append_result("Failed to deregister images.", str(err))
+        datalab.fab.append_result("Failed to deregister images.", str(err))
         sys.exit(1)
 
     print("Terminating EC2 instances")
     try:
-        dlab.actions_lib.remove_ec2(args.tag_name, '*')
+        datalab.actions_lib.remove_ec2(args.tag_name, '*')
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate instances.", str(err))
+        datalab.fab.append_result("Failed to terminate instances.", str(err))
         sys.exit(1)
 
     if 'ssn_hosted_zone_id' in os.environ and 'ssn_hosted_zone_name' in os.environ and 'ssn_subdomain' in os.environ:
         print("Removing Route53 records")
-        dlab.actions_lib.remove_route_53_record(os.environ['ssn_hosted_zone_id'], os.environ['ssn_hosted_zone_name'],
-                                                os.environ['ssn_subdomain'])
+        datalab.actions_lib.remove_route_53_record(os.environ['ssn_hosted_zone_id'], os.environ['ssn_hosted_zone_name'],
+                                                   os.environ['ssn_subdomain'])
 
     print("Removing security groups")
     try:
-        dlab.actions_lib.remove_sgroups(args.de_se_sg)
-        dlab.actions_lib.remove_sgroups(args.de_sg)
-        dlab.actions_lib.remove_sgroups(args.nb_sg)
-        dlab.actions_lib.remove_sgroups(args.edge_sg)
+        datalab.actions_lib.remove_sgroups(args.de_se_sg)
+        datalab.actions_lib.remove_sgroups(args.de_sg)
+        datalab.actions_lib.remove_sgroups(args.nb_sg)
+        datalab.actions_lib.remove_sgroups(args.edge_sg)
         try:
-            dlab.actions_lib.remove_sgroups(args.tag_name)
+            datalab.actions_lib.remove_sgroups(args.tag_name)
         except:
             print("There is no pre-defined SSN SG")
     except Exception as err:
-        dlab.fab.append_result("Failed to remove security groups.", str(err))
+        datalab.fab.append_result("Failed to remove security groups.", str(err))
         sys.exit(1)
 
     print("Removing private subnet")
     try:
-        dlab.actions_lib.remove_subnets('*')
+        datalab.actions_lib.remove_subnets('*')
     except Exception as err:
-        dlab.fab.append_result("Failed to remove subnets.", str(err))
+        datalab.fab.append_result("Failed to remove subnets.", str(err))
         sys.exit(1)
 
     print("Removing peering connection")
     try:
-        dlab.actions_lib.remove_peering('*')
+        datalab.actions_lib.remove_peering('*')
     except Exception as err:
-        dlab.fab.append_result("Failed to remove peering connections.", str(err))
+        datalab.fab.append_result("Failed to remove peering connections.", str(err))
         sys.exit(1)
 
     print("Removing s3 buckets")
     try:
-        dlab.actions_lib.remove_s3()
+        datalab.actions_lib.remove_s3()
     except Exception as err:
-        dlab.fab.append_result("Failed to remove buckets.", str(err))
+        datalab.fab.append_result("Failed to remove buckets.", str(err))
         sys.exit(1)
 
     print("Removing IAM roles, profiles and policies")
     try:
-        dlab.actions_lib.remove_all_iam_resources('all')
+        datalab.actions_lib.remove_all_iam_resources('all')
     except Exception as err:
-        dlab.fab.append_result("Failed to remove IAM roles, profiles and policies.", str(err))
+        datalab.fab.append_result("Failed to remove IAM roles, profiles and policies.", str(err))
         sys.exit(1)
 
     print("Removing route tables")
     try:
-        dlab.actions_lib.remove_route_tables(args.tag_name)
-        dlab.actions_lib.remove_route_tables(tag2)
+        datalab.actions_lib.remove_route_tables(args.tag_name)
+        datalab.actions_lib.remove_route_tables(tag2)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove route tables.", str(err))
+        datalab.fab.append_result("Failed to remove route tables.", str(err))
         sys.exit(1)
 
     print("Removing SSN subnet")
     try:
-        dlab.actions_lib.remove_subnets(args.service_base_name + '-subnet')
+        datalab.actions_lib.remove_subnets(args.service_base_name + '-subnet')
     except Exception as err:
-        dlab.fab.append_result("Failed to remove SSN subnet.", str(err))
+        datalab.fab.append_result("Failed to remove SSN subnet.", str(err))
         sys.exit(1)
 
     print("Removing SSN VPC")
     try:
-        vpc_id = dlab.meta_lib.get_vpc_by_tag(args.tag_name, args.service_base_name)
+        vpc_id = datalab.meta_lib.get_vpc_by_tag(args.tag_name, args.service_base_name)
         if vpc_id != '':
             try:
-                dlab.actions_lib.remove_vpc_endpoints(vpc_id)
+                datalab.actions_lib.remove_vpc_endpoints(vpc_id)
             except:
                 print("There is no such VPC Endpoint")
             try:
-                dlab.actions_lib.remove_internet_gateways(vpc_id, args.tag_name, args.service_base_name)
+                datalab.actions_lib.remove_internet_gateways(vpc_id, args.tag_name, args.service_base_name)
             except:
                 print("There is no such Internet gateway")
-            dlab.actions_lib.remove_route_tables(args.tag_name, True)
-            dlab.actions_lib.remove_vpc(vpc_id)
+            datalab.actions_lib.remove_route_tables(args.tag_name, True)
+            datalab.actions_lib.remove_vpc(vpc_id)
         else:
             print("There is no pre-defined SSN VPC")
     except Exception as err:
-        dlab.fab.append_result("Failed to remove SSN VPC.", str(err))
+        datalab.fab.append_result("Failed to remove SSN VPC.", str(err))
         sys.exit(1)
 
     print("Removing notebook VPC")
     try:
-        vpc_id = dlab.meta_lib.get_vpc_by_tag(tag2, args.service_base_name)
+        vpc_id = datalab.meta_lib.get_vpc_by_tag(tag2, args.service_base_name)
         if vpc_id != '':
             try:
-                dlab.actions_lib.remove_vpc_endpoints(vpc_id)
+                datalab.actions_lib.remove_vpc_endpoints(vpc_id)
             except:
                 print("There is no such VPC Endpoint")
-            dlab.actions_lib.remove_route_tables(tag2, True)
-            dlab.actions_lib.remove_vpc(vpc_id)
+            datalab.actions_lib.remove_route_tables(tag2, True)
+            datalab.actions_lib.remove_vpc(vpc_id)
         else:
             print("There is no pre-defined notebook VPC")
     except Exception as err:
-        dlab.fab.append_result("Failed to remove wecondary VPC.", str(err))
+        datalab.fab.append_result("Failed to remove wecondary VPC.", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/tensor-rstudio_configure.py b/infrastructure-provisioning/src/general/scripts/aws/tensor-rstudio_configure.py
index 6baaf45..46fdeb7 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/tensor-rstudio_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/tensor-rstudio_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,23 +21,22 @@
 #
 # ******************************************************************************
 
-import logging
+import argparse
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import argparse
-import traceback
-from fabric.api import *
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--uuid', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     instance_class = 'notebook'
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -83,26 +82,27 @@
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
         notebook_config['tag_name'] = '{}-tag'.format(notebook_config['service_base_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
-        notebook_config['ip_address'] = dlab.meta_lib.get_instance_ip_address(
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['ip_address'] = datalab.meta_lib.get_instance_ip_address(
             notebook_config['tag_name'], notebook_config['instance_name']).get('Private')
 
         # generating variables regarding EDGE proxy on Notebook instance
-        instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                notebook_config['instance_name'])
+        instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                   notebook_config['instance_name'])
         edge_instance_name = '{}-{}-{}-edge'.format(notebook_config['service_base_name'],
                                                     notebook_config['project_name'], notebook_config['endpoint_name'])
-        edge_instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
-        edge_instance_private_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                                         edge_instance_name).get('Private')
-        notebook_config['edge_instance_hostname'] = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                                        edge_instance_name)
+        edge_instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
+        edge_instance_private_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                                            edge_instance_name).get('Private')
+        notebook_config['edge_instance_hostname'] = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                                           edge_instance_name)
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        edge_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get('Private')
-        notebook_config['rstudio_pass'] = dlab.fab.id_generator()
+        edge_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get(
+            'Private')
+        notebook_config['rstudio_pass'] = datalab.fab.id_generator()
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -113,20 +113,20 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # configuring proxy on Notebook instance
@@ -136,32 +136,32 @@
         additional_config = {"proxy_host": edge_instance_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # updating repositories & installing python packages
     try:
         logging.info('[INSTALLING PREREQUISITES TO TENSORFLOW-RSTUDIO NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO TENSORFLOW-RSTUDIO NOTEBOOK INSTANCE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['aws_region'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['aws_region'],
                    edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # installing and configuring TensorFlow and RSTUDIO and all dependencies
@@ -174,17 +174,17 @@
                  "--r_mirror {6} --ip_address {7} --exploratory_name {8} --edge_ip {9}" \
             .format(instance_hostname, keyfile_name,
                     os.environ['aws_region'], notebook_config['rstudio_pass'],
-                    os.environ['notebook_rstudio_version'], notebook_config['dlab_ssh_user'],
+                    os.environ['notebook_rstudio_version'], notebook_config['datalab_ssh_user'],
                     os.environ['notebook_r_mirror'], notebook_config['ip_address'],
                     notebook_config['exploratory_name'], edge_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_tensor-rstudio_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_tensor-rstudio_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure tensoflow-rstudio.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure tensoflow-rstudio.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -193,47 +193,47 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing users key.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --nb_tag_name {} --nb_tag_value {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['tag_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -243,23 +243,23 @@
             'instance_hostname': instance_hostname,
             'tensor': True
         }
-        params = "--edge_hostname {} --keyfile {} --os_user {} --type {} --exploratory_name {} --additional_info '{}'"\
-            .format(edge_instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], 'rstudio',
+        params = "--edge_hostname {} --keyfile {} --os_user {} --type {} --exploratory_name {} --additional_info '{}'" \
+            .format(edge_instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], 'rstudio',
                     notebook_config['exploratory_name'], json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     if notebook_config['image_enabled'] == 'true':
         try:
             print('[CREATING AMI]')
-            ami_id = dlab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
+            ami_id = datalab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
             if ami_id == '' and notebook_config['shared_image_enabled'] == 'false':
                 print("Looks like it's first time we configure notebook server. Creating image.")
                 try:
@@ -268,7 +268,7 @@
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'project_tag:{0};endpoint_tag:{1}'.format(
                         os.environ['project_name'], os.environ['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
@@ -281,21 +281,21 @@
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'ami:shared;endpoint_tag:{}'.format(
                         os.environ['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
                     print("Image was successfully created. It's ID is {}".format(image_id))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
-            dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+            datalab.fab.append_result("Failed creating image.", str(err))
+            datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
             sys.exit(1)
 
     try:
         # generating output information
-        ip_address = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                           notebook_config['instance_name']).get('Private')
-        dns_name = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
+        ip_address = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                              notebook_config['instance_name']).get('Private')
+        dns_name = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
         tensorboard_url = "http://" + ip_address + ":6006/"
         rstudio_ip_url = "http://" + ip_address + ":8787/"
         rstudio_dns_url = "http://" + dns_name + ":8787/"
@@ -311,8 +311,8 @@
         print("Instance name: {}".format(notebook_config['instance_name']))
         print("Private DNS: {}".format(dns_name))
         print("Private IP: {}".format(ip_address))
-        print("Instance ID: {}".format(dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                          notebook_config['instance_name'])))
+        print("Instance ID: {}".format(datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                             notebook_config['instance_name'])))
         print("Instance type: {}".format(notebook_config['instance_type']))
         print("Key name: {}".format(notebook_config['key_name']))
         print("User key name: {}".format(notebook_config['user_keyname']))
@@ -323,19 +323,19 @@
         print("TensorBoard log dir: /var/log/tensorboard")
         print("Rstudio URL: {}".format(rstudio_ip_url))
         print("Rstudio URL: {}".format(rstudio_dns_url))
-        print("Rstudio user: {}".format(notebook_config['dlab_ssh_user']))
+        print("Rstudio user: {}".format(notebook_config['datalab_ssh_user']))
         print("Rstudio pass: {}".format(notebook_config['rstudio_pass']))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
         print('SSH access (from Edge node, via FQDN): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], dns_name))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], dns_name))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": dns_name,
                    "ip": ip_address,
-                   "instance_id": dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                     notebook_config['instance_name']),
+                   "instance_id": datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                        notebook_config['instance_name']),
                    "master_keyname": os.environ['conf_key_name'],
                    "tensorboard_log_dir": "/var/log/tensorboard",
                    "notebook_name": notebook_config['instance_name'],
@@ -347,18 +347,18 @@
                        {"description": "TensorBoard",
                         "url": tensorboard_access_url},
                        {"description": "Ungit",
-                        "url": rstudio_ungit_access_url}#,
-                       #{"description": "RStudio (via tunnel)",
+                        "url": rstudio_ungit_access_url}  # ,
+                       # {"description": "RStudio (via tunnel)",
                        # "url": rstudio_ip_url},
-                       #{"description": "TensorBoard (via tunnel)",
+                       # {"description": "TensorBoard (via tunnel)",
                        # "url": tensorboard_url},
-                       #{"description": "Ungit (via tunnel)",
+                       # {"description": "Ungit (via tunnel)",
                        # "url": ungit_ip_url}
                    ],
-                   "exploratory_user": notebook_config['dlab_ssh_user'],
+                   "exploratory_user": notebook_config['datalab_ssh_user'],
                    "exploratory_pass": notebook_config['rstudio_pass']}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Error with writing results.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/tensor_configure.py b/infrastructure-provisioning/src/general/scripts/aws/tensor_configure.py
index 3cf3a46..a77ce0f 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/tensor_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/tensor_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,23 +21,22 @@
 #
 # ******************************************************************************
 
-import logging
+import argparse
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import argparse
-import traceback
-from fabric.api import *
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--uuid', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     instance_class = 'notebook'
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -83,25 +82,26 @@
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
         notebook_config['tag_name'] = '{}-tag'.format(notebook_config['service_base_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
-        notebook_config['ip_address'] = dlab.meta_lib.get_instance_ip_address(
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['ip_address'] = datalab.meta_lib.get_instance_ip_address(
             notebook_config['tag_name'], notebook_config['instance_name']).get('Private')
 
         # generating variables regarding EDGE proxy on Notebook instance
-        instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                notebook_config['instance_name'])
+        instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                   notebook_config['instance_name'])
         edge_instance_name = '{}-{}-{}-edge'.format(notebook_config['service_base_name'],
                                                     notebook_config['project_name'], notebook_config['endpoint_name'])
-        edge_instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
-        edge_instance_private_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                                         edge_instance_name).get('Private')
-        notebook_config['edge_instance_hostname'] = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                                        edge_instance_name)
+        edge_instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
+        edge_instance_private_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                                            edge_instance_name).get('Private')
+        notebook_config['edge_instance_hostname'] = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                                           edge_instance_name)
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        edge_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get('Private')
+        edge_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get(
+            'Private')
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -112,20 +112,20 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # configuring proxy on Notebook instance
@@ -135,32 +135,32 @@
         additional_config = {"proxy_host": edge_instance_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # updating repositories & installing python packages
     try:
         logging.info('[INSTALLING PREREQUISITES TO TENSOR NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO TENSOR NOTEBOOK INSTANCE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['aws_region'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['aws_region'],
                    edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # installing and configuring TensorFlow and all dependencies
@@ -171,16 +171,16 @@
                  "--region {2} --os_user {3} " \
                  "--ip_address {4} --exploratory_name {5} --edge_ip {6}" \
                  .format(instance_hostname, keyfile_name,
-                         os.environ['aws_region'], notebook_config['dlab_ssh_user'],
+                         os.environ['aws_region'], notebook_config['datalab_ssh_user'],
                          notebook_config['ip_address'], notebook_config['exploratory_name'], edge_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_tensor_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_tensor_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure TensorFlow.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure TensorFlow.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -189,47 +189,47 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing users key.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --nb_tag_name {} --nb_tag_value {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['tag_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -239,23 +239,23 @@
             'instance_hostname': instance_hostname,
             'tensor': True
         }
-        params = "--edge_hostname {} --keyfile {} --os_user {} --type {} --exploratory_name {} --additional_info '{}'"\
-            .format(edge_instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], 'jupyter',
+        params = "--edge_hostname {} --keyfile {} --os_user {} --type {} --exploratory_name {} --additional_info '{}'" \
+            .format(edge_instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], 'jupyter',
                     notebook_config['exploratory_name'], json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     if notebook_config['image_enabled'] == 'true':
         try:
             print('[CREATING AMI]')
-            ami_id = dlab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
+            ami_id = datalab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
             if ami_id == '' and notebook_config['shared_image_enabled'] == 'false':
                 print("Looks like it's first time we configure notebook server. Creating image.")
                 try:
@@ -264,7 +264,7 @@
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'project_tag:{0};endpoint_tag:{1}'.format(
                         os.environ['project_name'], os.environ['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
@@ -277,20 +277,20 @@
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'ami:shared;endpoint_tag:{}'.format(
                         os.environ['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
                     print("Image was successfully created. It's ID is {}".format(image_id))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
-            dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+            datalab.fab.append_result("Failed creating image.", str(err))
+            datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
             sys.exit(1)
     try:
         # generating output information
-        ip_address = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                           notebook_config['instance_name']).get('Private')
-        dns_name = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
+        ip_address = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                              notebook_config['instance_name']).get('Private')
+        dns_name = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
         tensorboard_url = "http://" + ip_address + ":6006/"
         jupyter_ip_url = "http://" + ip_address + ":8888/{}/".format(notebook_config['exploratory_name'])
         jupyter_notebook_access_url = "https://{}/{}/".format(notebook_config['edge_instance_hostname'],
@@ -305,8 +305,8 @@
         print("Instance name: {}".format(notebook_config['instance_name']))
         print("Private DNS: {}".format(dns_name))
         print("Private IP: {}".format(ip_address))
-        print("Instance ID: {}".format(dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                          notebook_config['instance_name'])))
+        print("Instance ID: {}".format(datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                             notebook_config['instance_name'])))
         print("Instance type: {}".format(notebook_config['instance_type']))
         print("Key name: {}".format(notebook_config['key_name']))
         print("User key name: {}".format(notebook_config['user_keyname']))
@@ -318,15 +318,15 @@
         print("Jupyter URL: {}".format(jupyter_ip_url))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
         print('SSH access (from Edge node, via FQDN): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], dns_name))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], dns_name))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": dns_name,
                    "ip": ip_address,
-                   "instance_id": dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                     notebook_config['instance_name']),
+                   "instance_id": datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                        notebook_config['instance_name']),
                    "master_keyname": os.environ['conf_key_name'],
                    "tensorboard_log_dir": "/var/log/tensorboard",
                    "notebook_name": notebook_config['instance_name'],
@@ -348,6 +348,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Error with writing results.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/zeppelin_configure.py b/infrastructure-provisioning/src/general/scripts/aws/zeppelin_configure.py
index dbdae70..3e86490 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/zeppelin_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/zeppelin_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,23 +21,22 @@
 #
 # ******************************************************************************
 
-import logging
+import argparse
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import argparse
-import traceback
-from fabric.api import *
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--uuid', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     instance_class = 'notebook'
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -83,8 +82,8 @@
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
         notebook_config['tag_name'] = '{}-tag'.format(notebook_config['service_base_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
-        notebook_config['ip_address'] = dlab.meta_lib.get_instance_ip_address(
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['ip_address'] = datalab.meta_lib.get_instance_ip_address(
             notebook_config['tag_name'], notebook_config['instance_name']).get('Private')
         notebook_config['region'] = os.environ['aws_region']
         if notebook_config['region'] == 'us-east-1':
@@ -94,20 +93,21 @@
         else:
             notebook_config['endpoint_url'] = 'https://s3-{}.amazonaws.com'.format(notebook_config['region'])
         # generating variables regarding EDGE proxy on Notebook instance
-        instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                notebook_config['instance_name'])
+        instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                   notebook_config['instance_name'])
         edge_instance_name = '{}-{}-{}-edge'.format(notebook_config['service_base_name'],
                                                     notebook_config['project_name'], notebook_config['endpoint_name'])
-        edge_instance_hostname = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
-        edge_instance_private_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                                         edge_instance_name).get('Private')
-        notebook_config['edge_instance_hostname'] = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                                        edge_instance_name)
+        edge_instance_hostname = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], edge_instance_name)
+        edge_instance_private_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                                            edge_instance_name).get('Private')
+        notebook_config['edge_instance_hostname'] = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                                           edge_instance_name)
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        edge_ip = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get('Private')
+        edge_ip = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'], edge_instance_name).get(
+            'Private')
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -118,20 +118,20 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # configuring proxy on Notebook instance
@@ -141,15 +141,15 @@
         additional_config = {"proxy_host": edge_instance_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result('Unable to configure proxy on zeppelin notebook. Exception: ' + str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result('Unable to configure proxy on zeppelin notebook. Exception: ' + str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # updating repositories & installing python packages
@@ -157,17 +157,17 @@
         logging.info('[INSTALLING PREREQUISITES TO ZEPPELIN NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO ZEPPELIN NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}" \
-            .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['aws_region'],
+            .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['aws_region'],
                     edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         print('Error: {0}'.format(err))
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     # installing and configuring zeppelin and all dependencies
@@ -175,8 +175,9 @@
         logging.info('[CONFIGURE ZEPPELIN NOTEBOOK INSTANCE]')
         print('[CONFIGURE ZEPPELIN NOTEBOOK INSTANCE]')
         additional_config = {"frontend_hostname": edge_instance_hostname,
-                             "backend_hostname": dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
-                                                                                     notebook_config['instance_name']),
+                             "backend_hostname": datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'],
+                                                                                        notebook_config[
+                                                                                            'instance_name']),
                              "backend_port": "8080",
                              "nginx_template_dir": "/root/templates/"}
         params = "--hostname {0} --instance_name {1} " \
@@ -189,20 +190,21 @@
                  "--r_mirror {14} --endpoint_url {15} " \
                  "--ip_address {16} --exploratory_name {17} --edge_ip {18}" \
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, os.environ['aws_region'],
-                    json.dumps(additional_config), notebook_config['dlab_ssh_user'], os.environ['notebook_spark_version'],
+                    json.dumps(additional_config), notebook_config['datalab_ssh_user'],
+                    os.environ['notebook_spark_version'],
                     os.environ['notebook_hadoop_version'], edge_instance_hostname, '3128',
                     os.environ['notebook_zeppelin_version'], os.environ['notebook_scala_version'],
                     os.environ['notebook_livy_version'], os.environ['notebook_multiple_clusters'],
                     os.environ['notebook_r_mirror'], notebook_config['endpoint_url'], notebook_config['ip_address'],
                     notebook_config['exploratory_name'], edge_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_zeppelin_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_zeppelin_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure zeppelin.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to configure zeppelin.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -211,47 +213,47 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed installing users key.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
     
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --nb_tag_name {} --nb_tag_value {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['tag_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
@@ -261,23 +263,23 @@
             'instance_hostname': instance_hostname,
             'tensor': False
         }
-        params = "--edge_hostname {} --keyfile {} --os_user {} --type {} --exploratory_name {} --additional_info '{}'"\
-            .format(edge_instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], 'zeppelin',
+        params = "--edge_hostname {} --keyfile {} --os_user {} --type {} --exploratory_name {} --additional_info '{}'" \
+            .format(edge_instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], 'zeppelin',
                     notebook_config['exploratory_name'], json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     if notebook_config['image_enabled'] == 'true':
         try:
             print('[CREATING AMI]')
-            ami_id = dlab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
+            ami_id = datalab.meta_lib.get_ami_id_by_name(notebook_config['expected_image_name'])
             if ami_id == '' and notebook_config['shared_image_enabled'] == 'false':
                 print("Looks like it's first time we configure notebook server. Creating image.")
                 try:
@@ -286,7 +288,7 @@
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'project_tag:{0};endpoint_tag:{1}'.format(
                         os.environ['project_name'], os.environ['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
@@ -299,20 +301,20 @@
                 except KeyError:
                     os.environ['conf_additional_tags'] = 'ami:shared;endpoint_tag:{}'.format(
                         os.environ['endpoint_name'])
-                image_id = dlab.actions_lib.create_image_from_instance(
+                image_id = datalab.actions_lib.create_image_from_instance(
                     tag_name=notebook_config['tag_name'], instance_name=notebook_config['instance_name'],
                     image_name=notebook_config['expected_image_name'])
                 if image_id != '':
                     print("Image was successfully created. It's ID is {}".format(image_id))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
-            dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+            datalab.fab.append_result("Failed creating image.", str(err))
+            datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
             sys.exit(1)
     try:
         # generating output information
-        ip_address = dlab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
-                                                           notebook_config['instance_name']).get('Private')
-        dns_name = dlab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
+        ip_address = datalab.meta_lib.get_instance_ip_address(notebook_config['tag_name'],
+                                                              notebook_config['instance_name']).get('Private')
+        dns_name = datalab.meta_lib.get_instance_hostname(notebook_config['tag_name'], notebook_config['instance_name'])
         zeppelin_ip_url = "http://" + ip_address + ":8080/"
         zeppelin_dns_url = "http://" + dns_name + ":8080/"
         zeppelin_notebook_access_url = "https://{}/{}/".format(notebook_config['edge_instance_hostname'],
@@ -325,8 +327,8 @@
         print("Instance name: {}".format(notebook_config['instance_name']))
         print("Private DNS: {}".format(dns_name))
         print("Private IP: {}".format(ip_address))
-        print("Instance ID: {}".format(dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                          notebook_config['instance_name'])))
+        print("Instance ID: {}".format(datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                             notebook_config['instance_name'])))
         print("Instance type: {}".format(notebook_config['instance_type']))
         print("Key name: {}".format(notebook_config['key_name']))
         print("User key name: {}".format(notebook_config['user_keyname']))
@@ -337,15 +339,15 @@
         print("Zeppelin URL: {}".format(zeppelin_dns_url))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
         print('SSH access (from Edge node, via FQDN): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], dns_name))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], dns_name))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": dns_name,
                    "ip": ip_address,
-                   "instance_id": dlab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
-                                                                     notebook_config['instance_name']),
+                   "instance_id": datalab.meta_lib.get_instance_by_name(notebook_config['tag_name'],
+                                                                        notebook_config['instance_name']),
                    "master_keyname": os.environ['conf_key_name'],
                    "notebook_name": notebook_config['instance_name'],
                    "notebook_image_name": notebook_config['notebook_image_name'],
@@ -362,6 +364,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
-        dlab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
+        datalab.fab.append_result("Error with writing results.", str(err))
+        datalab.actions_lib.remove_ec2(notebook_config['tag_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/aws/zeppelin_dataengine-service_create_configs.py b/infrastructure-provisioning/src/general/scripts/aws/zeppelin_dataengine-service_create_configs.py
index bc452fc..4f6e073 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/zeppelin_dataengine-service_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/zeppelin_dataengine-service_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,20 +21,13 @@
 #
 # ******************************************************************************
 
-import boto3
-from botocore.client import Config
-from fabric.api import *
 import argparse
-import os
-import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+import subprocess
+from datalab.actions_lib import jars, yarn, install_emr_spark, spark_defaults, installing_python, configure_zeppelin_emr_interpreter
+from datalab.common_lib import *
+from datalab.fab import configuring_notebook, update_zeppelin_interpreters
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -71,20 +64,20 @@
 
 
 def install_remote_livy(args):
-    local('sudo chown ' + args.os_user + ':' + args.os_user + ' -R /opt/zeppelin/')
-    local('sudo service zeppelin-notebook stop')
-    local('sudo -i wget http://archive.cloudera.com/beta/livy/livy-server-' + args.livy_version + '.zip -O /opt/'
-          + args.emr_version + '/' + args.cluster_name + '/livy-server-' + args.livy_version + '.zip')
-    local('sudo unzip /opt/'
+    subprocess.run('sudo chown ' + args.os_user + ':' + args.os_user + ' -R /opt/zeppelin/', shell=True, check=True)
+    subprocess.run('sudo service zeppelin-notebook stop', shell=True, check=True)
+    subprocess.run('sudo -i wget http://archive.cloudera.com/beta/livy/livy-server-' + args.livy_version + '.zip -O /opt/'
+          + args.emr_version + '/' + args.cluster_name + '/livy-server-' + args.livy_version + '.zip', shell=True, check=True)
+    subprocess.run('sudo unzip /opt/'
           + args.emr_version + '/' + args.cluster_name + '/livy-server-' + args.livy_version + '.zip -d /opt/'
-          + args.emr_version + '/' + args.cluster_name + '/')
-    local('sudo mv /opt/' + args.emr_version + '/' + args.cluster_name + '/livy-server-' + args.livy_version +
-          '/ /opt/' + args.emr_version + '/' + args.cluster_name + '/livy/')
+          + args.emr_version + '/' + args.cluster_name + '/', shell=True, check=True)
+    subprocess.run('sudo mv /opt/' + args.emr_version + '/' + args.cluster_name + '/livy-server-' + args.livy_version +
+          '/ /opt/' + args.emr_version + '/' + args.cluster_name + '/livy/', shell=True, check=True)
     livy_path = '/opt/' + args.emr_version + '/' + args.cluster_name + '/livy/'
-    local('sudo mkdir -p ' + livy_path + '/logs')
-    local('sudo mkdir -p /var/run/livy')
-    local('sudo chown ' + args.os_user + ':' + args.os_user + ' -R /var/run/livy')
-    local('sudo chown ' + args.os_user + ':' + args.os_user + ' -R ' + livy_path)
+    subprocess.run('sudo mkdir -p ' + livy_path + '/logs', shell=True, check=True)
+    subprocess.run('sudo mkdir -p /var/run/livy', shell=True, check=True)
+    subprocess.run('sudo chown ' + args.os_user + ':' + args.os_user + ' -R /var/run/livy', shell=True, check=True)
+    subprocess.run('sudo chown ' + args.os_user + ':' + args.os_user + ' -R ' + livy_path, shell=True, check=True)
 
 
 if __name__ == "__main__":
diff --git a/infrastructure-provisioning/src/general/scripts/aws/zeppelin_install_dataengine-service_kernels.py b/infrastructure-provisioning/src/general/scripts/aws/zeppelin_install_dataengine-service_kernels.py
index 7a04296..96615dc 100644
--- a/infrastructure-provisioning/src/general/scripts/aws/zeppelin_install_dataengine-service_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/aws/zeppelin_install_dataengine-service_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,10 +22,9 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-import boto3
-from dlab.meta_lib import *
 import os
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -50,34 +49,34 @@
     templates_dir = '/root/templates/'
     scripts_dir = '/root/scripts/'
     if os.environ['notebook_multiple_clusters'] == 'true':
-        put(templates_dir + 'dataengine-service_interpreter_livy.json', '/tmp/dataengine-service_interpreter.json')
+        conn.put(templates_dir + 'dataengine-service_interpreter_livy.json', '/tmp/dataengine-service_interpreter.json')
     else:
-        put(templates_dir + 'dataengine-service_interpreter_spark.json', '/tmp/dataengine-service_interpreter.json')
-    put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application),
+        conn.put(templates_dir + 'dataengine-service_interpreter_spark.json', '/tmp/dataengine-service_interpreter.json')
+    conn.put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application),
         '/tmp/zeppelin_dataengine-service_create_configs.py')
-    sudo('\cp /tmp/zeppelin_dataengine-service_create_configs.py /usr/local/bin/zeppelin_dataengine-service_create_configs.py')
-    sudo('chmod 755 /usr/local/bin/zeppelin_dataengine-service_create_configs.py')
-    sudo('mkdir -p /usr/lib/python2.7/dlab/')
-    run('mkdir -p /tmp/dlab_libs/')
-    local('scp -i {} /usr/lib/python2.7/dlab/* {}:/tmp/dlab_libs/'.format(args.keyfile, env.host_string))
-    run('chmod a+x /tmp/dlab_libs/*')
-    sudo('mv /tmp/dlab_libs/* /usr/lib/python2.7/dlab/')
-    if exists('/usr/lib64'):
-        sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+    conn.sudo(
+        '\cp /tmp/zeppelin_dataengine-service_create_configs.py /usr/local/bin/zeppelin_dataengine-service_create_configs.py')
+    conn.sudo('chmod 755 /usr/local/bin/zeppelin_dataengine-service_create_configs.py')
+    conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+    conn.run('mkdir -p /tmp/datalab_libs/')
+    conn.local('scp -i {} /usr/lib/python3.8/datalab/*.py {}@{}:/tmp/datalab_libs/'.format(args.keyfile, args.os_user, args.notebook_ip))
+    conn.run('chmod a+x /tmp/datalab_libs/*')
+    conn.sudo('mv /tmp/datalab_libs/* /usr/lib/python3.8/datalab/')
+    if exists(conn, '/usr/lib64'):
+        conn.sudo('mkdir -p /usr/lib64/python3.8')
+        conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
 
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     configure_notebook(args)
     spark_version = get_spark_version(args.cluster_name)
     hadoop_version = get_hadoop_version(args.cluster_name)
     livy_version = os.environ['notebook_livy_version']
     r_enabled = os.environ['notebook_r_enabled']
     numpy_version = os.environ['notebook_numpy_version']
-    command = "/usr/bin/python /usr/local/bin/zeppelin_dataengine-service_create_configs.py " \
+    command = "/usr/bin/python3 /usr/local/bin/zeppelin_dataengine-service_create_configs.py " \
              "--bucket {0} " \
              "--cluster_name {1} " \
              "--emr_version {2} " \
@@ -114,4 +113,4 @@
                 numpy_version,
                 args.application,
                 r_enabled)
-    sudo(command)
\ No newline at end of file
+    conn.sudo(command)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_collect_data.py b/infrastructure-provisioning/src/general/scripts/azure/common_collect_data.py
index 29660b0..11a62db 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_collect_data.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_collect_data.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,23 +22,20 @@
 # ******************************************************************************
 
 import argparse
-import json
-import datetime
-from fabric.api import *
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-from dlab.fab import *
-import traceback
-import sys
 import ast
-
+import json
+import sys
+import traceback
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--resource_group_name', type=str, default='')
 parser.add_argument('--list_resources', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     data = ast.literal_eval(args.list_resources.replace('\'', '"'))
     statuses = {}
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_create_datalake_directory.py b/infrastructure-provisioning/src/general/scripts/azure/common_create_datalake_directory.py
index 0493b07..29ff0c2 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_create_datalake_directory.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_create_datalake_directory.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,11 +22,10 @@
 # ******************************************************************************
 
 import argparse
-import json
-from dlab.fab import *
-from dlab.actions_lib import *
-from dlab.meta_lib import *
 import sys
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--resource_group_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_create_instance.py b/infrastructure-provisioning/src/general/scripts/azure/common_create_instance.py
index 295e191..5ad8253 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_create_instance.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_create_instance.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -23,10 +23,9 @@
 
 import argparse
 import json
-from dlab.actions_lib import *
-from dlab.meta_lib import *
 import sys
-
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--instance_name', type=str, default='')
@@ -36,7 +35,7 @@
 parser.add_argument('--network_interface_name', type=str, default='')
 parser.add_argument('--subnet_name', type=str, default='')
 parser.add_argument('--service_base_name', type=str, default='')
-parser.add_argument('--dlab_ssh_user_name', type=str, default='')
+parser.add_argument('--datalab_ssh_user_name', type=str, default='')
 parser.add_argument('--public_ip_name', type=str, default='')
 parser.add_argument('--public_key', type=str, default='')
 parser.add_argument('--primary_disk_size', type=str, default='')
@@ -89,9 +88,10 @@
                     disk_id = disk.id
                 print("Creating instance {}".format(args.instance_name))
                 AzureActions().create_instance(args.region, args.instance_size, args.service_base_name,
-                                               args.instance_name, args.dlab_ssh_user_name, args.public_key,
+                                               args.instance_name, args.datalab_ssh_user_name, args.public_key,
                                                network_interface_id, args.resource_group_name, args.primary_disk_size,
-                                               args.instance_type, args.image_name, json.loads(args.tags), args.project_name,
+                                               args.instance_type, args.image_name, json.loads(args.tags),
+                                               args.project_name,
                                                create_option, disk_id, args.instance_storage_account_type,
                                                args.image_type)
         except Exception as err:
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_create_notebook_image.py b/infrastructure-provisioning/src/general/scripts/azure/common_create_notebook_image.py
index 5746fb8..294d7a8 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_create_notebook_image.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_create_notebook_image.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,20 +21,19 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import traceback
-import sys
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-from fabric.api import *
-
+import os
+import sys
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         image_conf = dict()
         image_conf['service_base_name'] = os.environ['conf_service_base_name']
         image_conf['resource_group_name'] = os.environ['azure_resource_group_name']
@@ -45,7 +44,7 @@
         image_conf['endpoint_tag'] = image_conf['endpoint_name']
         image_conf['instance_name'] = os.environ['notebook_instance_name']
         image_conf['application'] = os.environ['application']
-        image_conf['dlab_ssh_user'] = os.environ['conf_os_user']
+        image_conf['datalab_ssh_user'] = os.environ['conf_os_user']
         image_conf['image_name'] = os.environ['notebook_image_name']
         image_conf['full_image_name'] = '{}-{}-{}-{}-{}'.format(image_conf['service_base_name'],
                                                                 image_conf['project_name'],
@@ -78,7 +77,8 @@
         image = AzureMeta.get_image(image_conf['resource_group_name'], image_conf['full_image_name'])
         if image == '':
             print('Creating image from existing notebook.')
-            dlab.actions_lib.prepare_vm_for_image(True, image_conf['dlab_ssh_user'], instance_hostname, keyfile_name)
+            datalab.actions_lib.prepare_vm_for_image(True, image_conf['datalab_ssh_user'], instance_hostname,
+                                                     keyfile_name)
             AzureActions.create_image_from_instance(image_conf['resource_group_name'],
                                                     image_conf['instance_name'],
                                                     os.environ['azure_region'],
@@ -86,7 +86,7 @@
                                                     json.dumps(image_conf['tags']))
             print("Image was successfully created.")
             try:
-                local("~/scripts/{}.py".format('common_prepare_notebook'))
+                subprocess.run("~/scripts/{}.py".format('common_prepare_notebook'), shell=True, check=True)
                 instance_running = False
                 while not instance_running:
                     if AzureMeta.get_instance_status(image_conf['resource_group_name'],
@@ -94,18 +94,19 @@
                         instance_running = True
                 instance_hostname = AzureMeta.get_private_ip_address(image_conf['resource_group_name'],
                                                                      image_conf['instance_name'])
-                dlab.actions_lib.remount_azure_disk(True, image_conf['dlab_ssh_user'], instance_hostname, keyfile_name)
-                dlab.fab.set_git_proxy(image_conf['dlab_ssh_user'], instance_hostname, keyfile_name,
-                                       'http://{}:3128'.format(edge_instance_hostname))
+                datalab.actions_lib.remount_azure_disk(True, image_conf['datalab_ssh_user'], instance_hostname,
+                                                       keyfile_name)
+                datalab.fab.set_git_proxy(image_conf['datalab_ssh_user'], instance_hostname, keyfile_name,
+                                          'http://{}:3128'.format(edge_instance_hostname))
                 additional_config = {"proxy_host": edge_instance_hostname, "proxy_port": "3128"}
                 params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
                     .format(instance_hostname, image_conf['instance_name'], keyfile_name,
-                            json.dumps(additional_config), image_conf['dlab_ssh_user'])
-                local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+                            json.dumps(additional_config), image_conf['datalab_ssh_user'])
+                subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
                 print("Image was successfully created. It's name is {}".format(image_conf['full_image_name']))
             except Exception as err:
                 AzureActions.remove_instance(image_conf['resource_group_name'], image_conf['instance_name'])
-                dlab.fab.append_result("Failed to create instance from image.", str(err))
+                datalab.fab.append_result("Failed to create instance from image.", str(err))
                 sys.exit(1)
 
             with open("/root/result.json", 'w') as result:
@@ -119,5 +120,5 @@
                        "Action": "Create image from notebook"}
                 result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to create image from notebook", str(err))
+        datalab.fab.append_result("Failed to create image from notebook", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_create_security_group.py b/infrastructure-provisioning/src/general/scripts/azure/common_create_security_group.py
index 62cd0d7..05b6a8b 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_create_security_group.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_create_security_group.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,11 +21,11 @@
 #
 # ******************************************************************************
 
-import json
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
+import json
 import sys
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--resource_group_name', type=str, default='')
@@ -39,7 +39,10 @@
 if __name__ == "__main__":
     try:
         if AzureMeta().get_security_group(args.resource_group_name, args.security_group_name):
-            print("REQUESTED SECURITY GROUP {} ALREADY EXISTS".format(args.security_group_name))
+            print("REQUESTED SECURITY GROUP {} ALREADY EXISTS. Updating rules".format(args.security_group_name))
+            security_group = AzureActions().create_security_group(args.resource_group_name, args.security_group_name,
+                                                                  args.region, json.loads(args.tags),
+                                                                  json.loads(args.list_rules), True)
         else:
             print("Creating security group {}.".format(args.security_group_name))
             security_group = AzureActions().create_security_group(args.resource_group_name, args.security_group_name,
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_create_storage_account.py b/infrastructure-provisioning/src/general/scripts/azure/common_create_storage_account.py
index d2e3dcc..04f47bd 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_create_storage_account.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_create_storage_account.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -23,11 +23,10 @@
 
 import argparse
 import json
-from dlab.fab import *
-from dlab.actions_lib import *
-from dlab.meta_lib import *
 import sys
-
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--container_name', type=str, default='')
@@ -36,7 +35,6 @@
 parser.add_argument('--region', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     try:
         check_account = False
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_create_subnet.py b/infrastructure-provisioning/src/general/scripts/azure/common_create_subnet.py
index 6e57137..6345565 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_create_subnet.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_create_subnet.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,12 +22,10 @@
 # ******************************************************************************
 
 import argparse
-import json
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-import sys
 import ipaddress
-
+import sys
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--resource_group_name', type=str, default='')
@@ -43,7 +41,7 @@
     try:
         empty_vpc = False
         private_subnet_size = ipaddress.ip_network(u'0.0.0.0/{}'.format(args.prefix)).num_addresses
-        first_vpc_ip = int(ipaddress.IPv4Address(args.vpc_cidr.split('/')[0].decode("utf-8")))
+        first_vpc_ip = int(ipaddress.IPv4Address(args.vpc_cidr.split('/')[0]))
         subnets_cidr = []
         subnets = AzureMeta().list_subnets(args.resource_group_name, args.vpc_name)
         for subnet in subnets:
@@ -54,22 +52,23 @@
 
         last_ip = first_vpc_ip
         for cidr in sorted_subnets_cidr:
-            first_ip = int(ipaddress.IPv4Address(cidr.split('/')[0].decode("utf-8")))
+            first_ip = int(ipaddress.IPv4Address(cidr.split('/')[0]))
             if first_ip - last_ip < private_subnet_size:
                 subnet_size = ipaddress.ip_network(u'{}'.format(cidr)).num_addresses
                 last_ip = first_ip + subnet_size - 1
             else:
                 break
         if empty_vpc:
-            dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip), args.prefix)
+            datalab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip), args.prefix)
         else:
-            dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix)
+            datalab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix)
         if args.subnet_name != '':
             if AzureMeta().get_subnet(args.resource_group_name, args.vpc_name, args.subnet_name):
                 print("REQUESTED SUBNET {} ALREADY EXISTS".format(args.subnet_name))
             else:
                 print("Creating Subnet {}".format(args.subnet_name))
-                AzureActions().create_subnet(args.resource_group_name, args.vpc_name, args.subnet_name, dlab_subnet_cidr)
+                AzureActions().create_subnet(args.resource_group_name, args.vpc_name, args.subnet_name,
+                                             datalab_subnet_cidr)
         else:
             print("Subnet name can't be empty")
             sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_download_git_certfile.py b/infrastructure-provisioning/src/general/scripts/azure/common_download_git_certfile.py
index 2a9e606..eb707fe 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_download_git_certfile.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_download_git_certfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,11 +22,10 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-from fabric.api import *
 import os
-
+from datalab.actions_lib import *
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--keyfile', type=str, default='')
@@ -41,18 +40,17 @@
 gitlab_certfile = os.environ['conf_gitlab_certfile']
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env['connection_attempts'] = 100
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
 
     for storage_account in AzureMeta().list_storage_accounts(resource_group_name):
         if ssn_storage_account_tag == storage_account.tags["Name"]:
             ssn_storage_account_name = storage_account.name
     if AzureActions().download_from_container(resource_group_name, ssn_storage_account_name, container_name, gitlab_certfile):
-        put(gitlab_certfile, gitlab_certfile)
-        sudo('chown root:root {}'.format(gitlab_certfile))
+        conn.put(gitlab_certfile, gitlab_certfile)
+        conn.sudo('chown root:root {}'.format(gitlab_certfile))
         print('{} has been downloaded'.format(gitlab_certfile))
     else:
         print('There is no {} to download'.format(gitlab_certfile))
+
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_notebook_configure_dataengine.py b/infrastructure-provisioning/src/general/scripts/azure/common_notebook_configure_dataengine.py
index 2e697eb..0e4f206 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_notebook_configure_dataengine.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_notebook_configure_dataengine.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
-import uuid
-from fabric.api import *
+import sys
 import traceback
+import subprocess
+from fabric import *
 
 
 def clear_resources():
@@ -50,8 +50,8 @@
 
     try:
         # generating variables dictionary
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         print('Generating infrastructure names and tags')
         notebook_config = dict()
         if 'exploratory_name' in os.environ:
@@ -78,7 +78,7 @@
         notebook_config['slave_node_name'] = notebook_config['cluster_name'] + '-s'
         notebook_config['notebook_name'] = os.environ['notebook_instance_name']
         notebook_config['key_path'] = '{}/{}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['instance_count'] = int(os.environ['dataengine_instance_count'])
         try:
             notebook_config['spark_master_ip'] = AzureMeta.get_private_ip_address(
@@ -86,14 +86,14 @@
             notebook_config['notebook_ip'] = AzureMeta.get_private_ip_address(
                 notebook_config['resource_group_name'], notebook_config['notebook_name'])
         except Exception as err:
-            dlab.fab.append_result("Failed to get instance IP address", str(err))
+            datalab.fab.append_result("Failed to get instance IP address", str(err))
             clear_resources()
             sys.exit(1)
         notebook_config['spark_master_url'] = 'spark://{}:7077'.format(notebook_config['spark_master_ip'])
 
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to generate infrastructure names", str(err))
+        datalab.fab.append_result("Failed to generate infrastructure names", str(err))
         sys.exit(1)
 
     try:
@@ -102,17 +102,17 @@
         params = "--cluster_name {0} --spark_version {1} --hadoop_version {2} --os_user {3} --spark_master {4}" \
                  " --keyfile {5} --notebook_ip {6} --datalake_enabled {7} --spark_master_ip {8}".\
             format(notebook_config['cluster_name'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], notebook_config['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], notebook_config['datalab_ssh_user'],
                    notebook_config['spark_master_url'], notebook_config['key_path'], notebook_config['notebook_ip'],
                    os.environ['azure_datalake_enable'], notebook_config['spark_master_ip'])
         try:
-            local("~/scripts/{}_{}.py {}".format(os.environ['application'], 'install_dataengine_kernels', params))
+            subprocess.run("~/scripts/{}_{}.py {}".format(os.environ['application'], 'install_dataengine_kernels', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed installing Dataengine kernels.", str(err))
+        datalab.fab.append_result("Failed installing Dataengine kernels.", str(err))
         sys.exit(1)
 
     try:
@@ -124,16 +124,16 @@
                  "--cluster_name {3} " \
             .format(notebook_config['notebook_ip'],
                     notebook_config['key_path'],
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     notebook_config['cluster_name'])
         try:
-            local("~/scripts/{0}.py {1}".format('common_configure_spark', params))
+            subprocess.run("~/scripts/{0}.py {1}".format('common_configure_spark', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure Spark.", str(err))
+        datalab.fab.append_result("Failed to configure Spark.", str(err))
         sys.exit(1)
 
     try:
@@ -143,6 +143,6 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_notebook_update_refresh_token.py b/infrastructure-provisioning/src/general/scripts/azure/common_notebook_update_refresh_token.py
index 4add786..2af23ca 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_notebook_update_refresh_token.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_notebook_update_refresh_token.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,13 +22,13 @@
 # ******************************************************************************
 
 from xml.etree.ElementTree import parse, Element
-from fabric.api import *
+from fabric import *
 import argparse
 import os
 import sys
 import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--refresh_token', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_prepare_notebook.py b/infrastructure-provisioning/src/general/scripts/azure/common_prepare_notebook.py
index a4dda9d..bdfc5ff 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_prepare_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_prepare_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,17 +21,17 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
+import logging
 import os
-from Crypto.PublicKey import RSA
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import sys
 import traceback
-from fabric.api import *
-
+import subprocess
+from Crypto.PublicKey import RSA
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -44,8 +44,8 @@
 
     # generating variables dictionary
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         notebook_config = dict()
         notebook_config['user_name'] = os.environ['edge_user_name']
         notebook_config['project_name'] = os.environ['project_name']
@@ -53,7 +53,7 @@
         notebook_config['endpoint_name'] = os.environ['endpoint_name']
         notebook_config['endpoint_tag'] = notebook_config['endpoint_name']
         notebook_config['application'] = os.environ['application'].lower()
-        
+
         print('Generating infrastructure names and tags')
         try:
             notebook_config['exploratory_name'] = os.environ['exploratory_name']
@@ -75,7 +75,7 @@
                                    "project_tag": notebook_config['project_tag'],
                                    "endpoint_tag": notebook_config['endpoint_tag'],
                                    "Exploratory": notebook_config['exploratory_name'],
-                                   "product": "dlab"}
+                                   "product": "datalab"}
         notebook_config['network_interface_name'] = notebook_config['instance_name'] + "-nif"
         notebook_config['security_group_name'] = '{}-{}-{}-nb-sg'.format(notebook_config['service_base_name'],
                                                                          notebook_config['project_name'],
@@ -85,7 +85,7 @@
                                                                           notebook_config['endpoint_name'])
         ssh_key_path = '{}{}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
         key = RSA.importKey(open(ssh_key_path, 'rb').read())
-        notebook_config['public_ssh_key'] = key.publickey().exportKey("OpenSSH")
+        notebook_config['public_ssh_key'] = key.publickey().exportKey("OpenSSH").decode('UTF-8')
         notebook_config['primary_disk_size'] = '32'
         notebook_config['instance_storage_account_type'] = (lambda x: 'Standard_LRS' if x in ('deeplearning', 'tensor')
                                                             else 'Premium_LRS')(os.environ['application'])
@@ -124,7 +124,7 @@
             print('No pre-configured image found. Using default one: {}'.format(notebook_config['image_name']))
     except Exception as err:
         print("Failed to generate variables dictionary.")
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
 
     try:
@@ -138,12 +138,13 @@
             print('ERROR: Edge node is unavailable! Aborting...')
             ssn_hostname = AzureMeta.get_private_ip_address(notebook_config['resource_group_name'],
                                                               os.environ['conf_service_base_name'] + '-ssn')
-            dlab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_dlab_path'], os.environ['conf_os_user'],
-                                         ssn_hostname)
-            dlab.fab.append_result("Edge node is unavailable")
+            datalab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_datalab_path'],
+                                            os.environ['conf_os_user'],
+                                            ssn_hostname)
+            datalab.fab.append_result("Edge node is unavailable")
             sys.exit(1)
     except Exception as err:
-        dlab.fab.append_result("Failed to verify edge status.", str(err))
+        datalab.fab.append_result("Failed to verify edge status.", str(err))
         sys.exit(1)
 
     with open('/root/result.json', 'w') as f:
@@ -156,7 +157,7 @@
         print('[CREATE NOTEBOOK INSTANCE]')
         params = "--instance_name {} --instance_size {} --region {} --vpc_name {} --network_interface_name {} \
             --security_group_name {} --subnet_name {} --service_base_name {} --resource_group_name {} \
-            --dlab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
+            --datalab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
             --instance_type {} --project_name {} --instance_storage_account_type {} --image_name {} \
             --image_type {} --tags '{}'". \
             format(notebook_config['instance_name'], notebook_config['instance_size'], notebook_config['region'],
@@ -168,7 +169,7 @@
                    notebook_config['instance_storage_account_type'], notebook_config['image_name'],
                    notebook_config['image_type'], json.dumps(notebook_config['tags']))
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -177,5 +178,5 @@
             AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         except:
             print("The instance hasn't been created.")
-        dlab.fab.append_result("Failed to create instance.", str(err))
-        sys.exit(1)
\ No newline at end of file
+        datalab.fab.append_result("Failed to create instance.", str(err))
+        sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_remove_remote_kernels.py b/infrastructure-provisioning/src/general/scripts/azure/common_remove_remote_kernels.py
index 830969b..4aa8d12 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_remove_remote_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_remove_remote_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,12 +21,11 @@
 #
 # ******************************************************************************
 
-import os
-import sys
 import argparse
-from fabric.api import *
-from dlab.fab import find_cluster_kernels
-from dlab.actions_lib import *
+import sys
+from datalab.actions_lib import *
+from datalab.fab import find_cluster_kernels
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -39,9 +38,8 @@
 
 if __name__ == "__main__":
     print('Configure connections')
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     try:
         de_clusters, des_clusters = find_cluster_kernels()
@@ -51,3 +49,4 @@
     except Exception as err:
         print('Failed to remove cluster kernels.', str(err))
         sys.exit(1)
+    conn.close()
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_reupload_key.py b/infrastructure-provisioning/src/general/scripts/azure/common_reupload_key.py
index f4d7cb4..73dff2f 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_reupload_key.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_reupload_key.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -23,11 +23,11 @@
 
 
 import argparse
-from fabric.api import *
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-from dlab.fab import *
-import json
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--conf_resource', type=str, default='')
@@ -45,7 +45,7 @@
         params = "--user {} --hostname {} --keyfile '{}' --additional_config '{}'".format(
             args.os_user, ip, args.keyfile, args.additional_config)
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except Exception as err:
             print('Error: {0}'.format(err))
             sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_start_notebook.py b/infrastructure-provisioning/src/general/scripts/azure/common_start_notebook.py
index ab3c080..af27198 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_start_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_start_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import logging
 import os
-import uuid
-import argparse
-from fabric.api import *
-
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -42,8 +40,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    AzureMeta = dlab.meta_lib.AzureMeta()
-    AzureActions = dlab.actions_lib.AzureActions()
+    AzureMeta = datalab.meta_lib.AzureMeta()
+    AzureActions = datalab.actions_lib.AzureActions()
     print('Generating infrastructure names and tags')
     notebook_config = dict()
     notebook_config['service_base_name'] = os.environ['conf_service_base_name']
@@ -61,7 +59,7 @@
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to start notebook.", str(err))
+        datalab.fab.append_result("Failed to start notebook.", str(err))
         sys.exit(1)
 
     try:
@@ -73,12 +71,12 @@
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
             .format(os.environ['conf_os_user'], notebook_config['notebook_ip'], notebook_config['keyfile'])
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         sys.exit(1)
 
     if os.environ['azure_datalake_enable'] == 'true':
@@ -87,21 +85,20 @@
             print('[UPDATE STORAGE CREDENTIALS]')
             notebook_config['notebook_ip'] = AzureMeta.get_private_ip_address(
                 notebook_config['resource_group_name'], notebook_config['notebook_name'])
-            env.hosts = "{}".format(notebook_config['notebook_ip'])
-            env.user = os.environ['conf_os_user']
-            env.key_filename = "{}".format(notebook_config['keyfile'])
-            env.host_string = env.user + "@" + env.hosts
+            global conn
+            conn = datalab.fab.init_datalab_connection(notebook_config['notebook_ip'], os.environ['conf_os_user'],
+                                                       notebook_config['keyfile'])
             params = '--refresh_token {}'.format(os.environ['azure_user_refresh_token'])
             try:
-                put('~/scripts/common_notebook_update_refresh_token.py', '/tmp/common_notebook_update_refresh_token.py')
-                sudo('mv /tmp/common_notebook_update_refresh_token.py '
+                conn.put('~/scripts/common_notebook_update_refresh_token.py', '/tmp/common_notebook_update_refresh_token.py')
+                conn.sudo('mv /tmp/common_notebook_update_refresh_token.py '
                      '/usr/local/bin/common_notebook_update_refresh_token.py')
-                sudo("/usr/bin/python /usr/local/bin/{}.py {}".format('common_notebook_update_refresh_token', params))
+                conn.sudo("/usr/bin/python3 /usr/local/bin/{}.py {}".format('common_notebook_update_refresh_token', params))
             except:
                 traceback.print_exc()
                 raise Exception
         except Exception as err:
-            dlab.fab.append_result("Failed to update storage credentials.", str(err))
+            datalab.fab.append_result("Failed to update storage credentials.", str(err))
             sys.exit(1)
 
     try:
@@ -110,12 +107,12 @@
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
             .format(os.environ['conf_os_user'], notebook_config['notebook_ip'], notebook_config['keyfile'])
         try:
-            local("~/scripts/{}.py {}".format('update_inactivity_on_start', params))
+            subprocess.run("~/scripts/{}.py {}".format('update_inactivity_on_start', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to update last activity time.", str(err))
+        datalab.fab.append_result("Failed to update last activity time.", str(err))
         sys.exit(1)
 
     try:
@@ -132,7 +129,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
-
-
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_stop_notebook.py b/infrastructure-provisioning/src/general/scripts/azure/common_stop_notebook.py
index 5e77666..82a9533 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_stop_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_stop_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,12 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
-import uuid
-import argparse
 import sys
 
 
@@ -45,7 +42,7 @@
                     AzureActions.stop_instance(resource_group_name, vm.name)
                     print("Instance {} has been stopped".format(vm.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to stop clusters", str(err))
+        datalab.fab.append_result("Failed to stop clusters", str(err))
         sys.exit(1)
 
     print("Stopping notebook")
@@ -56,7 +53,7 @@
                     AzureActions.stop_instance(resource_group_name, vm.name)
                     print("Instance {} has been stopped".format(vm.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to stop instance", str(err))
+        datalab.fab.append_result("Failed to stop instance", str(err))
         sys.exit(1)
 
 
@@ -69,8 +66,8 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    AzureMeta = dlab.meta_lib.AzureMeta()
-    AzureActions = dlab.actions_lib.AzureActions()
+    AzureMeta = datalab.meta_lib.AzureMeta()
+    AzureActions = datalab.actions_lib.AzureActions()
     print('Generating infrastructure names and tags')
     notebook_config = dict()
     if 'exploratory_name' in os.environ:
@@ -89,7 +86,7 @@
     try:
         stop_notebook(notebook_config['resource_group_name'], notebook_config['notebook_name'])
     except Exception as err:
-        dlab.fab.append_result("Failed to stop notebook.", str(err))
+        datalab.fab.append_result("Failed to stop notebook.", str(err))
         sys.exit(1)
 
     try:
@@ -99,5 +96,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_terminate_notebook.py b/infrastructure-provisioning/src/general/scripts/azure/common_terminate_notebook.py
index 73eab17..d2b8216 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_terminate_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_terminate_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,13 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
-import uuid
+import sys
 import traceback
 
 
@@ -41,7 +40,7 @@
                     AzureActions.remove_instance(resource_group_name, vm.name)
                     print("Instance {} has been terminated".format(vm.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate clusters", str(err))
+        datalab.fab.append_result("Failed to terminate clusters", str(err))
         sys.exit(1)
 
     print("Terminating notebook")
@@ -52,7 +51,7 @@
                     AzureActions.remove_instance(resource_group_name, vm.name)
                     print("Instance {} has been terminated".format(vm.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate instance", str(err))
+        datalab.fab.append_result("Failed to terminate instance", str(err))
         sys.exit(1)
 
 
@@ -64,8 +63,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    AzureMeta = dlab.meta_lib.AzureMeta()
-    AzureActions = dlab.actions_lib.AzureActions()
+    AzureMeta = datalab.meta_lib.AzureMeta()
+    AzureActions = datalab.actions_lib.AzureActions()
     print('Generating infrastructure names and tags')
     notebook_config = dict()
     if 'exploratory_name' in os.environ:
@@ -86,7 +85,7 @@
             terminate_nb(notebook_config['resource_group_name'], notebook_config['notebook_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate notebook.", str(err))
+            datalab.fab.append_result("Failed to terminate notebook.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -98,5 +97,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/common_terminate_notebook_image.py b/infrastructure-provisioning/src/general/scripts/azure/common_terminate_notebook_image.py
index c74abfe..295ecab 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/common_terminate_notebook_image.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/common_terminate_notebook_image.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,17 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import sys
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
 import os
-
+import sys
 
 if __name__ == "__main__":
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         image_conf = dict()
         image_conf['service_base_name'] = os.environ['conf_service_base_name']
         image_conf['resource_group_name'] = os.environ['azure_resource_group_name']
@@ -48,5 +47,5 @@
                        "Action": "Delete existing notebook image"}
                 result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to delete existing notebook image", str(err))
+        datalab.fab.append_result("Failed to delete existing notebook image", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/dataengine_configure.py b/infrastructure-provisioning/src/general/scripts/azure/dataengine_configure.py
index 8d90b5e..f678c9f 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/dataengine_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/dataengine_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,39 +21,38 @@
 #
 # ******************************************************************************
 
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import time
-from fabric.api import *
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
-import sys
-import os
-import uuid
 import logging
-from Crypto.PublicKey import RSA
 import multiprocessing
+import os
+import sys
+import traceback
+import subprocess
+from Crypto.PublicKey import RSA
+from fabric import *
 
 
 def configure_slave(slave_number, data_engine):
     slave_name = data_engine['slave_node_name'] + '{}'.format(slave_number + 1)
     slave_hostname = AzureMeta.get_private_ip_address(data_engine['resource_group_name'], slave_name)
     try:
-        logging.info('[CREATING DLAB SSH USER ON SLAVE NODE]')
-        print('[CREATING DLAB SSH USER ON SLAVE NODE]')
+        logging.info('[CREATING DATALAB SSH USER ON SLAVE NODE]')
+        print('[CREATING DATALAB SSH USER ON SLAVE NODE]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format \
             (slave_hostname, os.environ['conf_key_dir'] + data_engine['key_name'] + ".pem", initial_user,
-             data_engine['dlab_ssh_user'], sudo_group)
+             data_engine['datalab_ssh_user'], sudo_group)
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to create ssh user on slave.", str(err))
+        datalab.fab.append_result("Failed to create ssh user on slave.", str(err))
         sys.exit(1)
 
     try:
@@ -62,30 +61,31 @@
         additional_config = {"user_keyname": data_engine['project_name'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            slave_hostname, os.environ['conf_key_dir'] + data_engine['key_name'] + ".pem", json.dumps(additional_config), data_engine['dlab_ssh_user'])
+            slave_hostname, os.environ['conf_key_dir'] + data_engine['key_name'] + ".pem",
+            json.dumps(additional_config), data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to install user ssh key on slave.", str(err))
+        datalab.fab.append_result("Failed to install user ssh key on slave.", str(err))
         sys.exit(1)
 
     try:
         logging.info('[CLEANING INSTANCE FOR MASTER NODE]')
         print('[CLEANING INSTANCE FOR MASTER NODE]')
         params = '--hostname {} --keyfile {} --os_user {} --application {}' \
-            .format(slave_hostname, keyfile_name, data_engine['dlab_ssh_user'], os.environ['application'])
+            .format(slave_hostname, keyfile_name, data_engine['datalab_ssh_user'], os.environ['application'])
         try:
-            local("~/scripts/{}.py {}".format('common_clean_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_clean_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to clean slave instance..", str(err))
+        datalab.fab.append_result("Failed to clean slave instance..", str(err))
         sys.exit(1)
 
     try:
@@ -94,31 +94,31 @@
         additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(slave_hostname, slave_name, keyfile_name, json.dumps(additional_config),
-                    data_engine['dlab_ssh_user'])
+                    data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure proxy on slave.", str(err))
+        datalab.fab.append_result("Failed to configure proxy on slave.", str(err))
         sys.exit(1)
 
     try:
         logging.info('[INSTALLING PREREQUISITES ON SLAVE NODE]')
         print('[INSTALLING PREREQUISITES ON SLAVE NODE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
-            format(slave_hostname, keyfile_name, data_engine['dlab_ssh_user'], data_engine['region'],
+            format(slave_hostname, keyfile_name, data_engine['datalab_ssh_user'], data_engine['region'],
                    edge_instance_private_hostname)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to install prerequisites on slave.", str(err))
+        datalab.fab.append_result("Failed to install prerequisites on slave.", str(err))
         sys.exit(1)
 
     try:
@@ -127,17 +127,17 @@
         params = "--hostname {} --keyfile {} --region {} --spark_version {} --hadoop_version {} --os_user {} " \
                  "--scala_version {} --r_mirror {} --master_ip {} --node_type {}". \
             format(slave_hostname, keyfile_name, data_engine['region'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], data_engine['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], data_engine['datalab_ssh_user'],
                    os.environ['notebook_scala_version'], os.environ['notebook_r_mirror'], master_node_hostname,
                    'slave')
         try:
-            local("~/scripts/{}.py {}".format('configure_dataengine', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_dataengine', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure slave node.", str(err))
+        datalab.fab.append_result("Failed to configure slave node.", str(err))
         sys.exit(1)
 
 
@@ -157,8 +157,8 @@
                         filename=local_log_filepath)
 
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         print('Generating infrastructure names and tags')
         data_engine = dict()
         if 'exploratory_name' in os.environ:
@@ -199,7 +199,7 @@
         data_engine['master_size'] = os.environ['azure_dataengine_master_size']
         data_engine['instance_count'] = int(os.environ['dataengine_instance_count'])
         data_engine['slave_size'] = os.environ['azure_dataengine_slave_size']
-        data_engine['dlab_ssh_user'] = os.environ['conf_os_user']
+        data_engine['datalab_ssh_user'] = os.environ['conf_os_user']
         data_engine['notebook_name'] = os.environ['notebook_instance_name']
         master_node_hostname = AzureMeta.get_private_ip_address(data_engine['resource_group_name'],
                                                                 data_engine['master_node_name'])
@@ -217,7 +217,7 @@
             edge_instance_hostname = data_engine['edge_instance_dns_name']
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
         key = RSA.importKey(open(keyfile_name, 'rb').read())
-        data_engine['public_ssh_key'] = key.publickey().exportKey("OpenSSH")
+        data_engine['public_ssh_key'] = key.publickey().exportKey("OpenSSH").decode('UTF-8')
         if os.environ['conf_os_family'] == 'debian':
             initial_user = 'ubuntu'
             sudo_group = 'sudo'
@@ -226,24 +226,24 @@
             sudo_group = 'wheel'
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
 
     try:
-        logging.info('[CREATING DLAB SSH USER ON MASTER NODE]')
-        print('[CREATING DLAB SSH USER ON MASTER NODE]')
-        params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format\
+        logging.info('[CREATING DATA ATA LAB SSH USER ON MASTER NODE]')
+        print('[CREATING DATALAB SSH USER ON MASTER NODE]')
+        params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format \
             (master_node_hostname, os.environ['conf_key_dir'] + data_engine['key_name'] + ".pem", initial_user,
-             data_engine['dlab_ssh_user'], sudo_group)
+             data_engine['datalab_ssh_user'], sudo_group)
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to create ssh user on master.", str(err))
+        datalab.fab.append_result("Failed to create ssh user on master.", str(err))
         sys.exit(1)
 
     try:
@@ -253,15 +253,15 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             master_node_hostname, os.environ['conf_key_dir'] + data_engine['key_name'] + ".pem", json.dumps(
-                additional_config), data_engine['dlab_ssh_user'])
+                additional_config), data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to install ssh user key on master.", str(err))
+        datalab.fab.append_result("Failed to install ssh user key on master.", str(err))
         sys.exit(1)
 
 
@@ -269,15 +269,15 @@
         logging.info('[CLEANING INSTANCE FOR MASTER NODE]')
         print('[CLEANING INSTANCE FOR MASTER NODE]')
         params = '--hostname {} --keyfile {} --os_user {} --application {}' \
-            .format(master_node_hostname, keyfile_name, data_engine['dlab_ssh_user'], os.environ['application'])
+            .format(master_node_hostname, keyfile_name, data_engine['datalab_ssh_user'], os.environ['application'])
         try:
-            local("~/scripts/{}.py {}".format('common_clean_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_clean_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to clean master instance.", str(err))
+        datalab.fab.append_result("Failed to clean master instance.", str(err))
         sys.exit(1)
 
     try:
@@ -286,31 +286,31 @@
         additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(master_node_hostname, data_engine['master_node_name'], keyfile_name, json.dumps(additional_config),
-                    data_engine['dlab_ssh_user'])
+                    data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure proxy on master.", str(err))
+        datalab.fab.append_result("Failed to configure proxy on master.", str(err))
         sys.exit(1)
 
     try:
         logging.info('[INSTALLING PREREQUISITES ON MASTER NODE]')
         print('[INSTALLING PREREQUISITES ON MASTER NODE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(master_node_hostname, keyfile_name, data_engine['dlab_ssh_user'], data_engine['region'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(master_node_hostname, keyfile_name, data_engine['datalab_ssh_user'], data_engine['region'],
                    edge_instance_private_hostname)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to install prerequisites on master.", str(err))
+        datalab.fab.append_result("Failed to install prerequisites on master.", str(err))
         sys.exit(1)
 
     try:
@@ -319,16 +319,16 @@
         params = "--hostname {} --keyfile {} --region {} --spark_version {} --hadoop_version {} --os_user {} " \
                  "--scala_version {} --r_mirror {} --master_ip {} --node_type {}".\
             format(master_node_hostname, keyfile_name, data_engine['region'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], data_engine['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], data_engine['datalab_ssh_user'],
                    os.environ['notebook_scala_version'], os.environ['notebook_r_mirror'], master_node_hostname,
                    'master')
         try:
-            local("~/scripts/{}.py {}".format('configure_dataengine', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_dataengine', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure master node", str(err))
+        datalab.fab.append_result("Failed to configure master node", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -344,7 +344,7 @@
             if job.exitcode != 0:
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure slave nodes", str(err))
+        datalab.fab.append_result("Failed to configure slave nodes", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -370,17 +370,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_private_hostname,
                     keyfile_name,
-                    data_engine['dlab_ssh_user'],
+                    data_engine['datalab_ssh_user'],
                     'spark',
                     data_engine['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure reverse proxy", str(err))
+        datalab.fab.append_result("Failed to configure reverse proxy", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -413,6 +413,6 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/dataengine_prepare.py b/infrastructure-provisioning/src/general/scripts/azure/dataengine_prepare.py
index 86dc7a9..995b7d0 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/dataengine_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/dataengine_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,20 +21,17 @@
 #
 # ******************************************************************************
 
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import time
-from fabric.api import *
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
-import sys
-import os
-import uuid
 import logging
+import os
+import sys
+import traceback
+import subprocess
 from Crypto.PublicKey import RSA
-import multiprocessing
-
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -44,8 +41,8 @@
                         level=logging.INFO,
                         filename=local_log_filepath)
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         data_engine = dict()
         data_engine['user_name'] = os.environ['edge_user_name']
         data_engine['project_name'] = os.environ['project_name']
@@ -86,7 +83,7 @@
         data_engine['master_size'] = os.environ['azure_dataengine_master_size']
         key = RSA.importKey(open('{}{}.pem'.format(os.environ['conf_key_dir'],
                                                    os.environ['conf_key_name']), 'rb').read())
-        data_engine['public_ssh_key'] = key.publickey().exportKey("OpenSSH")
+        data_engine['public_ssh_key'] = key.publickey().exportKey("OpenSSH").decode('UTF-8')
         data_engine['instance_count'] = int(os.environ['dataengine_instance_count'])
         data_engine['slave_size'] = os.environ['azure_dataengine_slave_size']
         data_engine['instance_storage_account_type'] = 'Premium_LRS'
@@ -132,7 +129,7 @@
             data_engine['image_name'] = os.environ['azure_{}_image_name'.format(os.environ['conf_os_family'])]
             print('No pre-configured image found. Using default one: {}'.format(data_engine['image_name']))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         sys.exit(1)
 
     try:
@@ -145,12 +142,13 @@
             print('ERROR: Edge node is unavailable! Aborting...')
             ssn_hostname = AzureMeta.get_private_ip_address(data_engine['resource_group_name'],
                                                             data_engine['service_base_name'] + '-ssn')
-            dlab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_dlab_path'], os.environ['conf_os_user'],
-                                         ssn_hostname)
-            dlab.fab.append_result("Edge node is unavailable")
+            datalab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_datalab_path'],
+                                            os.environ['conf_os_user'],
+                                            ssn_hostname)
+            datalab.fab.append_result("Edge node is unavailable")
             sys.exit(1)
     except Exception as err:
-        dlab.fab.append_result("Failed to verify edge status.", str(err))
+        datalab.fab.append_result("Failed to verify edge status.", str(err))
         sys.exit(1)
 
     if os.environ['conf_os_family'] == 'debian':
@@ -169,7 +167,7 @@
 
         params = "--instance_name {} --instance_size {} --region {} --vpc_name {} --network_interface_name {} \
             --security_group_name {} --subnet_name {} --service_base_name {} --resource_group_name {} \
-            --dlab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
+            --datalab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
             --instance_type {} --project_name {} --instance_storage_account_type {} --image_name {} \
             --image_type {} --tags '{}'". \
             format(data_engine['master_node_name'], data_engine['master_size'], data_engine['region'],
@@ -180,7 +178,7 @@
                    data_engine['project_name'], data_engine['instance_storage_account_type'],
                    data_engine['image_name'], data_engine['image_type'], json.dumps(data_engine['master_tags']))
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -189,7 +187,7 @@
             AzureActions.remove_instance(data_engine['resource_group_name'], data_engine['master_node_name'])
         except:
             print("The instance hasn't been created.")
-        dlab.fab.append_result("Failed to create master instance.", str(err))
+        datalab.fab.append_result("Failed to create master instance.", str(err))
         sys.exit(1)
 
     try:
@@ -204,7 +202,7 @@
 
             params = "--instance_name {} --instance_size {} --region {} --vpc_name {} --network_interface_name {} \
                 --security_group_name {} --subnet_name {} --service_base_name {} --resource_group_name {} \
-                --dlab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
+                --datalab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
                 --instance_type {} --project_name {} --instance_storage_account_type {} --image_name {} \
                 --image_type {} --tags '{}'". \
                 format(slave_name, data_engine['slave_size'], data_engine['region'], data_engine['vpc_name'],
@@ -214,7 +212,7 @@
                        data_engine['project_name'], data_engine['instance_storage_account_type'],
                        data_engine['image_name'], data_engine['image_type'], json.dumps(data_engine['slave_tags']))
             try:
-                local("~/scripts/{}.py {}".format('common_create_instance', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
@@ -226,5 +224,5 @@
             except:
                 print("The slave instance {} hasn't been created.".format(slave_name))
         AzureActions.remove_instance(data_engine['resource_group_name'], data_engine['master_node_name'])
-        dlab.fab.append_result("Failed to create slave instances.", str(err))
+        datalab.fab.append_result("Failed to create slave instances.", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/dataengine_start.py b/infrastructure-provisioning/src/general/scripts/azure/dataengine_start.py
index 308912f..2f100fd 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/dataengine_start.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/dataengine_start.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
+import sys
 import traceback
-import uuid
-from fabric.api import *
+import subprocess
+from fabric import *
 
 
 def start_data_engine(resource_group_name, cluster_name):
@@ -42,7 +42,7 @@
                     AzureActions.start_instance(resource_group_name, vm.name)
                     print("Instance {} has been started".format(vm.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to start dataengine", str(err))
+        datalab.fab.append_result("Failed to start dataengine", str(err))
         sys.exit(1)
 
 
@@ -54,8 +54,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    AzureMeta = dlab.meta_lib.AzureMeta()
-    AzureActions = dlab.actions_lib.AzureActions()
+    AzureMeta = datalab.meta_lib.AzureMeta()
+    AzureActions = datalab.actions_lib.AzureActions()
     print('Generating infrastructure names and tags')
     data_engine = dict()
     if 'exploratory_name' in os.environ:
@@ -100,10 +100,10 @@
             .format(os.environ['conf_os_user'], data_engine['notebook_ip'], data_engine['keyfile'],
                     data_engine['computational_ip'])
         try:
-            local("~/scripts/{}.py {}".format('update_inactivity_on_start', params))
+            subprocess.run("~/scripts/{}.py {}".format('update_inactivity_on_start', params), shell=True, check=True)
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to update last activity time.", str(err))
+            datalab.fab.append_result("Failed to update last activity time.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -115,5 +115,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/dataengine_stop.py b/infrastructure-provisioning/src/general/scripts/azure/dataengine_stop.py
index 963c555..9db2c9b 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/dataengine_stop.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/dataengine_stop.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,14 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
+import sys
 import traceback
-import uuid
 
 
 def stop_data_engine(resource_group_name, cluster_name):
@@ -41,7 +40,7 @@
                     AzureActions.stop_instance(resource_group_name, vm.name)
                     print("Instance {} has been stopped".format(vm.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to stop dataengine", str(err))
+        datalab.fab.append_result("Failed to stop dataengine", str(err))
         sys.exit(1)
 
 
@@ -53,8 +52,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    AzureMeta = dlab.meta_lib.AzureMeta()
-    AzureActions = dlab.actions_lib.AzureActions()
+    AzureMeta = datalab.meta_lib.AzureMeta()
+    AzureActions = datalab.actions_lib.AzureActions()
     print('Generating infrastructure names and tags')
     data_engine = dict()
     if 'exploratory_name' in os.environ:
@@ -81,7 +80,7 @@
             stop_data_engine(data_engine['resource_group_name'], data_engine['cluster_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to stop Data Engine.", str(err))
+            datalab.fab.append_result("Failed to stop Data Engine.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -93,5 +92,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/dataengine_terminate.py b/infrastructure-provisioning/src/general/scripts/azure/dataengine_terminate.py
index 1363eb8..7cec539 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/dataengine_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/dataengine_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,14 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
+import sys
 import traceback
-import uuid
 
 
 def terminate_data_engine(resource_group_name, notebook_name, os_user, key_path, cluster_name):
@@ -41,14 +40,14 @@
                     AzureActions.remove_instance(resource_group_name, vm.name)
                     print("Instance {} has been terminated".format(vm.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate dataengine", str(err))
+        datalab.fab.append_result("Failed to terminate dataengine", str(err))
         sys.exit(1)
 
     print("Removing Data Engine kernels from notebook")
     try:
         AzureActions.remove_dataengine_kernels(resource_group_name, notebook_name, os_user, key_path, cluster_name)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove dataengine kernels from notebook", str(err))
+        datalab.fab.append_result("Failed to remove dataengine kernels from notebook", str(err))
         sys.exit(1)
 
 
@@ -60,8 +59,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    AzureMeta = dlab.meta_lib.AzureMeta()
-    AzureActions = dlab.actions_lib.AzureActions()
+    AzureMeta = datalab.meta_lib.AzureMeta()
+    AzureActions = datalab.actions_lib.AzureActions()
     print('Generating infrastructure names and tags')
     data_engine = dict()
     if 'exploratory_name' in os.environ:
@@ -93,7 +92,7 @@
                                   os.environ['conf_os_user'], data_engine['key_path'], data_engine['cluster_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate Data Engine.", str(err))
+            datalab.fab.append_result("Failed to terminate Data Engine.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -105,5 +104,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/deeplearning_configure.py b/infrastructure-provisioning/src/general/scripts/azure/deeplearning_configure.py
index 9c8f24c..be91e28 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/deeplearning_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/deeplearning_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -41,8 +41,8 @@
                         filename=local_log_filepath)
 
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = os.environ['exploratory_name']
@@ -92,7 +92,7 @@
         notebook_config['security_group_name'] = '{}-{}-{}-nb-sg'.format(notebook_config['service_base_name'],
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['tags'] = {"Name": notebook_config['instance_name'],
                                    "SBN": notebook_config['service_base_name'],
                                    "User": notebook_config['user_name'],
@@ -129,24 +129,24 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DataLab SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem",
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab-user'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab-user'.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -157,14 +157,14 @@
         additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -174,14 +174,14 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -190,15 +190,15 @@
         logging.info('[INSTALLING PREREQUISITES TO DEEPLEARNING NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO DEEPLEARNING NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".format(
-            instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['azure_region'],
+            instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['azure_region'],
             edge_instance_private_hostname)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -210,20 +210,20 @@
                  "--scala_version {4} --spark_version {5} " \
                  "--hadoop_version {6} --region {7} " \
                  "--r_mirror {8} --ip_address {9} --exploratory_name {10} --edge_ip {11}" \
-                 .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
-                         os.environ['notebook_jupyter_version'], os.environ['notebook_scala_version'],
-                         os.environ['notebook_spark_version'], os.environ['notebook_hadoop_version'],
-                         os.environ['azure_region'], os.environ['notebook_r_mirror'],
-                         notebook_config['ip_address'], notebook_config['exploratory_name'], edge_hostname)
+            .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
+                    os.environ['notebook_jupyter_version'], os.environ['notebook_scala_version'],
+                    os.environ['notebook_spark_version'], os.environ['notebook_hadoop_version'],
+                    os.environ['azure_region'], os.environ['notebook_r_mirror'],
+                    notebook_config['ip_address'], notebook_config['exploratory_name'], edge_hostname)
         try:
-            local("~/scripts/{}.py {}".format('configure_deep_learning_node', params))
-            dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
+            subprocess.run("~/scripts/{}.py {}".format('configure_deep_learning_node', params), shell=True, check=True)
+            datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                   os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure Deep Learning node.", str(err))
+        datalab.fab.append_result("Failed to configure Deep Learning node.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -231,31 +231,31 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --resource_group_name {} --notebook_name {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['resource_group_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -265,15 +265,15 @@
             image = AzureMeta.get_image(notebook_config['resource_group_name'], notebook_config['expected_image_name'])
             if image == '':
                 print("Looks like it's first time we configure notebook server. Creating image.")
-                dlab.actions_lib.prepare_vm_for_image(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                      keyfile_name)
+                datalab.actions_lib.prepare_vm_for_image(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                         keyfile_name)
                 AzureActions.create_image_from_instance(notebook_config['resource_group_name'],
                                                         notebook_config['instance_name'],
                                                         os.environ['azure_region'],
                                                         notebook_config['expected_image_name'],
                                                         json.dumps(notebook_config['image_tags']))
                 print("Image was successfully created.")
-                local("~/scripts/{}.py".format('common_prepare_notebook'))
+                subprocess.run("~/scripts/{}.py".format('common_prepare_notebook'), shell=True, check=True)
                 instance_running = False
                 while not instance_running:
                     if AzureMeta.get_instance_status(notebook_config['resource_group_name'],
@@ -281,17 +281,17 @@
                         instance_running = True
                 instance_hostname = AzureMeta.get_private_ip_address(notebook_config['resource_group_name'],
                                                                        notebook_config['instance_name'])
-                dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                    keyfile_name)
-                dlab.fab.set_git_proxy(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name,
-                                      'http://{}:3128'.format(edge_instance_private_hostname))
+                datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                       keyfile_name)
+                datalab.fab.set_git_proxy(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name,
+                                          'http://{}:3128'.format(edge_instance_private_hostname))
                 additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
                 params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
                     .format(instance_hostname, notebook_config['instance_name'], keyfile_name,
-                            json.dumps(additional_config), notebook_config['dlab_ssh_user'])
-                local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+                            json.dumps(additional_config), notebook_config['datalab_ssh_user'])
+                subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
             sys.exit(1)
 
@@ -310,17 +310,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_private_hostname,
                     keyfile_name,
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'jupyter',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -348,7 +348,7 @@
         print("Tensor Board URL: {}".format(tensorboard_ip_url))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"ip": ip_address,
@@ -360,8 +360,8 @@
                    "exploratory_url": [
                    {"description": "Jupyter",
                     "url": jupyter_notebook_access_url},
-                   {"description": "TensorBoard",
-                    "url": tensorboard_access_url},
+                   #{"description": "TensorBoard",
+                   # "url": tensorboard_access_url},
                    {"description": "Ungit",
                     "url": jupyter_ungit_access_url}#,
                    #{"description": "Jupyter (via tunnel)",
@@ -373,6 +373,6 @@
                ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information.", str(err))
+        datalab.fab.append_result("Failed to generate output information.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/edge_configure.py b/infrastructure-provisioning/src/general/scripts/azure/edge_configure.py
index 997d38f..b7ca24e 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/edge_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/edge_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,17 +21,17 @@
 #
 # ******************************************************************************
 
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import time
-import os
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
 import logging
+import os
+import sys
 import traceback
 import uuid
-from fabric.api import *
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -62,10 +62,10 @@
 
     try:
         print('Generating infrastructure names and tags')
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         edge_conf = dict()
-        edge_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
+        edge_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
             os.environ['conf_service_base_name'][:20], '-', True)
         edge_conf['resource_group_name'] = os.environ['azure_resource_group_name']
         edge_conf['key_name'] = os.environ['conf_key_name']
@@ -107,7 +107,7 @@
         edge_conf['slave_security_group_name'] = '{}-{}-{}-de-slave-sg'.format(edge_conf['service_base_name'],
                                                                                edge_conf['project_name'],
                                                                                edge_conf['endpoint_name'])
-        edge_conf['dlab_ssh_user'] = os.environ['conf_os_user']
+        edge_conf['datalab_ssh_user'] = os.environ['conf_os_user']
         edge_conf['keyfile_name'] = "{}{}.pem".format(os.environ['conf_key_dir'], edge_conf['key_name'])
         edge_conf['private_subnet_cidr'] = AzureMeta.get_subnet(edge_conf['resource_group_name'],
                                                                 edge_conf['vpc_name'],
@@ -138,7 +138,7 @@
             edge_conf['step_cert_sans'] = ''
 
     except Exception as err:
-        dlab.fab.append_result("Failed to generate infrastructure names", str(err))
+        datalab.fab.append_result("Failed to generate infrastructure names", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -150,19 +150,19 @@
             edge_conf['initial_user'] = 'ec2-user'
             edge_conf['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             edge_conf['instance_hostname'], os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem",
-            edge_conf['initial_user'], edge_conf['dlab_ssh_user'], edge_conf['sudo_group'])
+            edge_conf['initial_user'], edge_conf['datalab_ssh_user'], edge_conf['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -170,15 +170,15 @@
         print('[INSTALLING PREREQUISITES]')
         logging.info('[INSTALLING PREREQUISITES]')
         params = "--hostname {} --keyfile {} --user {} --region {}".format(
-            edge_conf['instance_hostname'], edge_conf['keyfile_name'], edge_conf['dlab_ssh_user'],
+            edge_conf['instance_hostname'], edge_conf['keyfile_name'], edge_conf['datalab_ssh_user'],
             os.environ['azure_region'])
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -196,14 +196,14 @@
                              "allowed_ip_cidr": ['0.0.0.0/0']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             edge_conf['instance_hostname'], edge_conf['keyfile_name'], json.dumps(additional_config),
-            edge_conf['dlab_ssh_user'])
+            edge_conf['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('configure_http_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_http_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing http proxy.", str(err))
+        datalab.fab.append_result("Failed installing http proxy.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -215,14 +215,14 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             edge_conf['instance_hostname'], edge_conf['keyfile_name'], json.dumps(additional_config),
-            edge_conf['dlab_ssh_user'])
+            edge_conf['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key. Excpeption: " + str(err))
+        datalab.fab.append_result("Failed installing users key. Excpeption: " + str(err))
         clear_resources()
         sys.exit(1)
 
@@ -232,30 +232,34 @@
         edge_conf['keycloak_client_secret'] = str(uuid.uuid4())
         params = "--hostname {} --keyfile {} --user {} --keycloak_client_id {} --keycloak_client_secret {} " \
                  "--step_cert_sans '{}'".format(
-                  edge_conf['instance_hostname'], edge_conf['keyfile_name'], edge_conf['dlab_ssh_user'],
-                  edge_conf['service_base_name'] + '-' + edge_conf['project_name'] + '-' + edge_conf['endpoint_name'],
-                  edge_conf['keycloak_client_secret'], edge_conf['step_cert_sans'])
+            edge_conf['instance_hostname'], edge_conf['keyfile_name'], edge_conf['datalab_ssh_user'],
+            edge_conf['service_base_name'] + '-' + edge_conf['project_name'] + '-' + edge_conf['endpoint_name'],
+            edge_conf['keycloak_client_secret'], edge_conf['step_cert_sans'])
 
         try:
-            local("~/scripts/{}.py {}".format('configure_nginx_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_nginx_reverse_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
+        if os.environ['conf_letsencrypt_enabled'] == 'true' and 'conf_letsencrypt_domain_name' in os.environ:
+            edge_conf['edge_hostname'] = '{}.{}'.format(edge_conf['project_name'], os.environ['conf_letsencrypt_domain_name'])
+        else:
+            edge_conf['edge_hostname'] = "''"
         keycloak_params = "--service_base_name {} --keycloak_auth_server_url {} --keycloak_realm_name {} " \
                           "--keycloak_user {} --keycloak_user_password {} --keycloak_client_secret {} " \
-                          "--edge_public_ip {} --project_name {} --endpoint_name {} ".format(
+                          "--edge_public_ip {} --project_name {} --endpoint_name {} --hostname {} ".format(
                            edge_conf['service_base_name'], os.environ['keycloak_auth_server_url'],
                            os.environ['keycloak_realm_name'], os.environ['keycloak_user'],
                            os.environ['keycloak_user_password'],
                            edge_conf['keycloak_client_secret'], edge_conf['instance_hostname'], edge_conf['project_name'],
-                           edge_conf['endpoint_name'])
+                           edge_conf['endpoint_name'], edge_conf['edge_hostname'])
         try:
-            local("~/scripts/{}.py {}".format('configure_keycloak', keycloak_params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_keycloak', keycloak_params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing Nginx reverse proxy. Excpeption: " + str(err))
+        datalab.fab.append_result("Failed installing Nginx reverse proxy. Excpeption: " + str(err))
         clear_resources()
         sys.exit(1)
 
@@ -304,7 +308,7 @@
                        "instance_id": edge_conf['instance_name'],
                        "full_edge_conf": edge_conf,
                        "project_name": edge_conf['project_name'],
-                       "@class": "com.epam.dlab.dto.azure.edge.EdgeInfoAzure",
+                       "@class": "com.epam.datalab.dto.azure.edge.EdgeInfoAzure",
                        "Action": "Create new EDGE server"}
             else:
                 res = {"hostname": edge_conf['instance_dns_name'],
@@ -328,11 +332,11 @@
                        "instance_id": edge_conf['instance_name'],
                        "full_edge_conf": edge_conf,
                        "project_name": edge_conf['project_name'],
-                       "@class": "com.epam.dlab.dto.azure.edge.EdgeInfoAzure",
+                       "@class": "com.epam.datalab.dto.azure.edge.EdgeInfoAzure",
                        "Action": "Create new EDGE server"}
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
+        datalab.fab.append_result("Error with writing results.", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/edge_prepare.py b/infrastructure-provisioning/src/general/scripts/azure/edge_prepare.py
index 9dc1b01..528c8ab 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/edge_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/edge_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,16 +22,18 @@
 # ******************************************************************************
 
 import json
-from dlab.fab import *
-from dlab.meta_lib import *
-import sys, time, os
-from dlab.actions_lib import *
+import os
+import sys
 import traceback
+import subprocess
 from Crypto.PublicKey import RSA
-
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 if __name__ == "__main__":
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/edge/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
@@ -110,7 +112,7 @@
             format(edge_conf['resource_group_name'], edge_conf['vpc_name'], edge_conf['region'], edge_conf['vpc_cidr'],
                    edge_conf['private_subnet_name'], edge_conf['private_subnet_prefix'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_subnet', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_subnet', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -390,7 +392,7 @@
             format(edge_conf['resource_group_name'], edge_conf['edge_security_group_name'], edge_conf['region'],
                    json.dumps(edge_conf['instance_tags']), json.dumps(edge_list_rules))
         try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
         except Exception as err:
             AzureActions().remove_subnet(edge_conf['resource_group_name'], edge_conf['vpc_name'],
                                          edge_conf['private_subnet_name'])
@@ -493,7 +495,7 @@
             format(edge_conf['resource_group_name'], edge_conf['notebook_security_group_name'], edge_conf['region'],
                    json.dumps(edge_conf['instance_tags']), json.dumps(notebook_list_rules))
         try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -599,7 +601,7 @@
             edge_conf['resource_group_name'], edge_conf['master_security_group_name'], edge_conf['region'],
             json.dumps(edge_conf['instance_tags']), json.dumps(cluster_list_rules))
         try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -625,7 +627,7 @@
             edge_conf['resource_group_name'], edge_conf['slave_security_group_name'], edge_conf['region'],
             json.dumps(edge_conf['instance_tags']), json.dumps(cluster_list_rules))
         try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -654,7 +656,7 @@
             format(edge_conf['edge_container_name'], json.dumps(edge_conf['storage_account_tags']),
                    edge_conf['resource_group_name'], edge_conf['region'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_storage_account', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_storage_account', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -683,7 +685,7 @@
                        edge_conf['datalake_user_directory_name'], edge_conf['azure_ad_user_name'],
                        edge_conf['service_base_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_create_datalake_directory', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_create_datalake_directory', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
@@ -722,7 +724,7 @@
         print('[CREATE EDGE INSTANCE]')
         params = "--instance_name {} --instance_size {} --region {} --vpc_name {} --network_interface_name {} \
             --security_group_name {} --subnet_name {} --service_base_name {} --resource_group_name {} \
-            --dlab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
+            --datalab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
             --instance_type {} --user_name {} --instance_storage_account_type {} --image_name {} --tags '{}'".\
             format(edge_conf['instance_name'], os.environ['azure_edge_instance_size'], edge_conf['region'],
                    edge_conf['vpc_name'], edge_conf['network_interface_name'], edge_conf['edge_security_group_name'],
@@ -731,7 +733,7 @@
                    edge_conf['primary_disk_size'], 'edge', edge_conf['user_name'], edge_conf['instance_storage_account_type'],
                    edge_conf['image_name'], json.dumps(edge_conf['instance_tags']))
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/azure/edge_start.py b/infrastructure-provisioning/src/general/scripts/azure/edge_start.py
index 04e57ae..2f9f2ba 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/edge_start.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/edge_start.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,13 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import logging
-import sys
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-
+import logging
+import os
+import sys
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -39,8 +38,8 @@
                         filename=local_log_filepath)
 
     print('Generating infrastructure names and tags')
-    AzureMeta = dlab.meta_lib.AzureMeta()
-    AzureActions = dlab.actions_lib.AzureActions()
+    AzureMeta = datalab.meta_lib.AzureMeta()
+    AzureActions = datalab.actions_lib.AzureActions()
     edge_conf = dict()
     edge_conf['service_base_name'] = os.environ['conf_service_base_name']
     edge_conf['resource_group_name'] = os.environ['azure_resource_group_name']
@@ -56,7 +55,7 @@
     try:
         AzureActions.start_instance(edge_conf['resource_group_name'], edge_conf['instance_name'])
     except Exception as err:
-        dlab.fab.append_result("Failed to start edge.", str(err))
+        datalab.fab.append_result("Failed to start edge.", str(err))
         sys.exit(1)
 
     try:
@@ -79,6 +78,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
-
diff --git a/infrastructure-provisioning/src/general/scripts/azure/edge_status.py b/infrastructure-provisioning/src/general/scripts/azure/edge_status.py
index 1b3fd15..6f41654 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/edge_status.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/edge_status.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,15 @@
 #
 # ******************************************************************************
 
-
-import json
-import sys
-import time
-import os
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import logging
-from fabric.api import *
+import os
+import sys
 import traceback
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
@@ -52,10 +49,10 @@
         params = '--resource_group_name {} --list_resources "{}"'.format(edge_conf['resource_group_name'],
                                                                          os.environ['edge_list_resources'])
         try:
-            local("~/scripts/{}.py {}".format('common_collect_data', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_collect_data', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to collect necessary information.", str(err))
+        datalab.fab.append_result("Failed to collect necessary information.", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/edge_stop.py b/infrastructure-provisioning/src/general/scripts/azure/edge_stop.py
index dfc4cba..d2bbf5c 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/edge_stop.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/edge_stop.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -9,9 +9,9 @@
 # to you under the Apache License, Version 2.0 (the
 # "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
-# 
+#
 #   http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
 # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -20,14 +20,14 @@
 # under the License.
 #
 # ******************************************************************************
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
+import json
 import logging
 import os
 import sys
-import json
-
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -38,8 +38,8 @@
                         filename=local_log_filepath)
 
     print('Generating infrastructure names and tags')
-    AzureMeta = dlab.meta_lib.AzureMeta()
-    AzureActions = dlab.actions_lib.AzureActions()
+    AzureMeta = datalab.meta_lib.AzureMeta()
+    AzureActions = datalab.actions_lib.AzureActions()
     edge_conf = dict()
     edge_conf['service_base_name'] = os.environ['conf_service_base_name']
     edge_conf['resource_group_name'] = os.environ['azure_resource_group_name']
@@ -53,7 +53,7 @@
     try:
         AzureActions.stop_instance(edge_conf['resource_group_name'], edge_conf['instance_name'])
     except Exception as err:
-        dlab.fab.append_result("Failed to stop edge.", str(err))
+        datalab.fab.append_result("Failed to stop edge.", str(err))
         sys.exit(1)
 
     try:
@@ -63,6 +63,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
-
diff --git a/infrastructure-provisioning/src/general/scripts/azure/edge_terminate.py b/infrastructure-provisioning/src/general/scripts/azure/edge_terminate.py
index a61c75d..f7c470a 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/edge_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/edge_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,13 @@
 #
 # ******************************************************************************
 
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import time
-import os
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
 import logging
+import os
+import sys
 import traceback
 
 
@@ -43,7 +42,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate instance", str(err))
+        datalab.fab.append_result("Failed to terminate instance", str(err))
         sys.exit(1)
 
     print("Removing network interfaces")
@@ -56,7 +55,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove network interfaces", str(err))
+        datalab.fab.append_result("Failed to remove network interfaces", str(err))
         sys.exit(1)
 
     print("Removing static public IPs")
@@ -69,7 +68,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove static IPs", str(err))
+        datalab.fab.append_result("Failed to remove static IPs", str(err))
         sys.exit(1)
 
     print("Removing disks")
@@ -82,7 +81,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove disks", str(err))
+        datalab.fab.append_result("Failed to remove disks", str(err))
         sys.exit(1)
 
     print("Removing storage account")
@@ -95,7 +94,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove storage accounts", str(err))
+        datalab.fab.append_result("Failed to remove storage accounts", str(err))
         sys.exit(1)
 
     print("Deleting Data Lake Store directory")
@@ -108,7 +107,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove Data Lake", str(err))
+        datalab.fab.append_result("Failed to remove Data Lake", str(err))
         sys.exit(1)
 
     print("Removing security groups")
@@ -121,7 +120,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove security groups", str(err))
+        datalab.fab.append_result("Failed to remove security groups", str(err))
         sys.exit(1)
 
     print("Removing private subnet")
@@ -129,7 +128,7 @@
         AzureActions.remove_subnet(resource_group_name, vpc_name, subnet_name)
         print("Private subnet {} has been terminated".format(subnet_name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove subnet", str(err))
+        datalab.fab.append_result("Failed to remove subnet", str(err))
         sys.exit(1)
 
 
@@ -142,8 +141,8 @@
                         filename=local_log_filepath)
 
     print('Generating infrastructure names and tags')
-    AzureMeta = dlab.meta_lib.AzureMeta()
-    AzureActions = dlab.actions_lib.AzureActions()
+    AzureMeta = datalab.meta_lib.AzureMeta()
+    AzureActions = datalab.actions_lib.AzureActions()
     edge_conf = dict()
     edge_conf['service_base_name'] = os.environ['conf_service_base_name']
     edge_conf['resource_group_name'] = os.environ['azure_resource_group_name']
@@ -166,7 +165,7 @@
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate edge.", str(err))
+        datalab.fab.append_result("Failed to terminate edge.", str(err))
         sys.exit(1)
 
     try:
@@ -177,5 +176,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/jupyter_configure.py b/infrastructure-provisioning/src/general/scripts/azure/jupyter_configure.py
index 49f9872..2e939b9 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/jupyter_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/jupyter_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -40,8 +40,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = os.environ['exploratory_name']
@@ -91,7 +91,7 @@
         notebook_config['security_group_name'] = '{}-{}-{}-nb-sg'.format(notebook_config['service_base_name'],
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['tags'] = {"Name": notebook_config['instance_name'],
                                    "SBN": notebook_config['service_base_name'],
                                    "User": notebook_config['user_name'],
@@ -128,24 +128,24 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem",
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab-user'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab-user'.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -156,14 +156,14 @@
         additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -171,16 +171,16 @@
     try:
         logging.info('[INSTALLING PREREQUISITES TO JUPYTER NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO JUPYTER NOTEBOOK INSTANCE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['azure_region'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['azure_region'],
                    edge_instance_private_hostname)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -195,18 +195,18 @@
                  "--ip_address {8} --exploratory_name {9} --edge_ip {10}".\
             format(instance_hostname, keyfile_name,
                    os.environ['azure_region'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], notebook_config['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], notebook_config['datalab_ssh_user'],
                    os.environ['notebook_scala_version'], os.environ['notebook_r_mirror'],
                    notebook_config['ip_address'], notebook_config['exploratory_name'], edge_hostname)
         try:
-            local("~/scripts/{}.py {}".format('configure_jupyter_node', params))
-            dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
+            subprocess.run("~/scripts/{}.py {}".format('configure_jupyter_node', params), shell=True, check=True)
+            datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                   os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure jupyter.", str(err))
+        datalab.fab.append_result("Failed to configure jupyter.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -216,14 +216,14 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -231,32 +231,32 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            # local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            # subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --resource_group_name {} --notebook_name {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['resource_group_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -267,15 +267,15 @@
                                         notebook_config['expected_image_name'])
             if image == '':
                 print("Looks like it's first time we configure notebook server. Creating image.")
-                dlab.actions_lib.prepare_vm_for_image(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                      keyfile_name)
+                datalab.actions_lib.prepare_vm_for_image(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                         keyfile_name)
                 AzureActions.create_image_from_instance(notebook_config['resource_group_name'],
                                                         notebook_config['instance_name'],
                                                         os.environ['azure_region'],
                                                         notebook_config['expected_image_name'],
                                                         json.dumps(notebook_config['image_tags']))
                 print("Image was successfully created.")
-                local("~/scripts/{}.py".format('common_prepare_notebook'))
+                subprocess.run("~/scripts/{}.py".format('common_prepare_notebook'), shell=True, check=True)
                 instance_running = False
                 while not instance_running:
                     if AzureMeta.get_instance_status(notebook_config['resource_group_name'],
@@ -283,17 +283,17 @@
                         instance_running = True
                 instance_hostname = AzureMeta.get_private_ip_address(notebook_config['resource_group_name'],
                                                                      notebook_config['instance_name'])
-                dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                    keyfile_name)
-                dlab.fab.set_git_proxy(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name,
-                                       'http://{}:3128'.format(edge_instance_private_hostname))
+                datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                       keyfile_name)
+                datalab.fab.set_git_proxy(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name,
+                                          'http://{}:3128'.format(edge_instance_private_hostname))
                 additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
                 params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
                     .format(instance_hostname, notebook_config['instance_name'], keyfile_name,
-                            json.dumps(additional_config), notebook_config['dlab_ssh_user'])
-                local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+                            json.dumps(additional_config), notebook_config['datalab_ssh_user'])
+                subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
             sys.exit(1)
 
@@ -312,17 +312,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_private_hostname,
                     keyfile_name,
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'jupyter',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -347,7 +347,7 @@
         print("Jupyter URL: {}".format(jupyter_ip_url))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"ip": ip_address,
@@ -368,6 +368,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information", str(err))
+        datalab.fab.append_result("Failed to generate output information", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/jupyterlab_configure.py b/infrastructure-provisioning/src/general/scripts/azure/jupyterlab_configure.py
index 4c44bbd..8c694e1 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/jupyterlab_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/jupyterlab_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
-from fabric.api import *
+import sys
 import traceback
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -40,8 +40,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = os.environ['exploratory_name']
@@ -91,7 +91,7 @@
         notebook_config['security_group_name'] = '{}-{}-{}-nb-sg'.format(notebook_config['service_base_name'],
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['tags'] = {"Name": notebook_config['instance_name'],
                                    "SBN": notebook_config['service_base_name'],
                                    "User": notebook_config['user_name'],
@@ -128,24 +128,24 @@
             initial_user = 'ec2-user'
             sudo_group = 'wheel'
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
-        params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format\
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
+        params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format \
             (instance_hostname, os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem", initial_user,
-             notebook_config['dlab_ssh_user'], sudo_group)
+             notebook_config['datalab_ssh_user'], sudo_group)
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab-user'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab-user'.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -156,14 +156,14 @@
         additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -171,16 +171,16 @@
     try:
         logging.info('[INSTALLING PREREQUISITES TO JUPYTER NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO JUPYTER NOTEBOOK INSTANCE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['azure_region'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['azure_region'],
                    edge_instance_private_hostname)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -195,13 +195,13 @@
                  "--ip_address {8} --exploratory_name {9} --edge_ip {10}".\
             format(instance_hostname, keyfile_name,
                    os.environ['azure_region'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], notebook_config['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], notebook_config['datalab_ssh_user'],
                    os.environ['notebook_scala_version'], os.environ['notebook_r_mirror'],
                    notebook_config['ip_address'], notebook_config['exploratory_name'], edge_hostname)
         try:
-            local("~/scripts/{}.py {}".format('configure_jupyterlab_node', params))
-            dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
+            subprocess.run("~/scripts/{}.py {}".format('configure_jupyterlab_node', params), shell=True, check=True)
+            datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                   os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
         except:
             traceback.print_exc()
             raise Exception
@@ -215,14 +215,14 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -230,15 +230,15 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            # local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            # subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -248,15 +248,15 @@
             image = AzureMeta.get_image(notebook_config['resource_group_name'], notebook_config['expected_image_name'])
             if image == '':
                 print("Looks like it's first time we configure notebook server. Creating image.")
-                dlab.actions_lib.prepare_vm_for_image(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                      keyfile_name)
+                datalab.actions_lib.prepare_vm_for_image(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                         keyfile_name)
                 AzureActions.create_image_from_instance(notebook_config['resource_group_name'],
-                                                          notebook_config['instance_name'],
-                                                          os.environ['azure_region'],
-                                                          notebook_config['expected_image_name'],
-                                                          json.dumps(notebook_config['image_tags']))
+                                                        notebook_config['instance_name'],
+                                                        os.environ['azure_region'],
+                                                        notebook_config['expected_image_name'],
+                                                        json.dumps(notebook_config['image_tags']))
                 print("Image was successfully created.")
-                local("~/scripts/{}.py".format('common_prepare_notebook'))
+                subprocess.run("~/scripts/{}.py".format('common_prepare_notebook'), shell=True, check=True)
                 instance_running = False
                 while not instance_running:
                     if AzureMeta.get_instance_status(notebook_config['resource_group_name'],
@@ -264,17 +264,17 @@
                         instance_running = True
                 instance_hostname = AzureMeta.get_private_ip_address(notebook_config['resource_group_name'],
                                                                      notebook_config['instance_name'])
-                dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                    keyfile_name)
-                dlab.fab.set_git_proxy(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name,
-                                       'http://{}:3128'.format(edge_instance_private_hostname))
+                datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                       keyfile_name)
+                datalab.fab.set_git_proxy(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name,
+                                          'http://{}:3128'.format(edge_instance_private_hostname))
                 additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
                 params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
                     .format(instance_hostname, notebook_config['instance_name'], keyfile_name,
-                            json.dumps(additional_config), notebook_config['dlab_ssh_user'])
-                local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+                            json.dumps(additional_config), notebook_config['datalab_ssh_user'])
+                subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except Exception as err:
-            dlab.fab.append_result("Failed creating image from notebook.", str(err))
+            datalab.fab.append_result("Failed creating image from notebook.", str(err))
             AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
             sys.exit(1)
 
@@ -293,17 +293,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_private_hostname,
                     keyfile_name,
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'jupyter',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -315,14 +315,14 @@
                  "--os_user {} ". \
             format(instance_hostname,
                    keyfile_name,
-                   notebook_config['dlab_ssh_user'])
+                   notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/configure_proxy_for_docker.py {}".format(params))
+            subprocess.run("~/scripts/configure_proxy_for_docker.py {}".format(params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy for docker.", str(err))
+        datalab.fab.append_result("Failed to configure proxy for docker.", str(err))
         GCPActions().remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -335,14 +335,14 @@
                  "--os_user {} ". \
             format(instance_hostname,
                    keyfile_name,
-                   notebook_config['dlab_ssh_user'])
+                   notebook_config['datalab_ssh_user'])
         try:
-           local("~/scripts/jupyterlab_container_start.py {}".format(params))
+           subprocess.run("~/scripts/jupyterlab_container_start.py {}".format(params), shell=True, check=True)
         except:
              traceback.print_exc()
              raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to start Jupyter container.", str(err))
+        datalab.fab.append_result("Failed to start Jupyter container.", str(err))
         GCPActions().remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -367,7 +367,7 @@
         print("Jupyter URL: {}".format(jupyter_ip_url))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"ip": ip_address,
@@ -388,6 +388,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information", str(err))
+        datalab.fab.append_result("Failed to generate output information", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/project_prepare.py b/infrastructure-provisioning/src/general/scripts/azure/project_prepare.py
index e2d481d..29fce72 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/project_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/project_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,19 +21,17 @@
 #
 # ******************************************************************************
 
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import time
-import os
-import re
-import traceback
-from Crypto.PublicKey import RSA
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
 import logging
-from fabric.api import *
-
+import os
+import sys
+import traceback
+import subprocess
+from Crypto.PublicKey import RSA
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -45,10 +43,10 @@
 
     try:
         print('Generating infrastructure names and tags')
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         project_conf = dict()
-        project_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
+        project_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
             os.environ['conf_service_base_name'][:20], '-', True)
         project_conf['project_name'] = (os.environ['project_name'])
         project_conf['project_tag'] = project_conf['project_name']
@@ -101,7 +99,7 @@
                                                                                    project_conf['endpoint_name'])
         ssh_key_path = os.environ['conf_key_dir'] + os.environ['conf_key_name'] + '.pem'
         key = RSA.importKey(open(ssh_key_path, 'rb').read())
-        project_conf['public_ssh_key'] = key.publickey().exportKey("OpenSSH")
+        project_conf['public_ssh_key'] = key.publickey().exportKey("OpenSSH").decode('UTF-8')
         project_conf['instance_storage_account_type'] = 'Premium_LRS'
         project_conf['image_name'] = os.environ['azure_{}_image_name'.format(os.environ['conf_os_family'])]
         project_conf['instance_tags'] = {"Name": project_conf['instance_name'],
@@ -133,8 +131,8 @@
         try:
             project_conf['user_key'] = os.environ['key']
             try:
-                local('echo "{0}" >> {1}{2}.pub'.format(project_conf['user_key'], os.environ['conf_key_dir'],
-                                                        project_conf['project_name']))
+                subprocess.run('echo "{0}" >> {1}{2}.pub'.format(project_conf['user_key'], os.environ['conf_key_dir'],
+                                                        project_conf['project_name']), shell=True, check=True)
             except:
                 print("ADMINSs PUBLIC KEY DOES NOT INSTALLED")
         except KeyError:
@@ -145,7 +143,8 @@
             project_conf, sort_keys=True, indent=4, separators=(',', ': '))))
         logging.info(json.dumps(project_conf))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        traceback.print_exc()
         sys.exit(1)
 
     try:
@@ -155,7 +154,7 @@
             format(project_conf['resource_group_name'], project_conf['vpc_name'], project_conf['region'],
                    project_conf['vpc_cidr'], project_conf['private_subnet_name'], project_conf['private_subnet_prefix'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_subnet', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_subnet', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -165,7 +164,7 @@
                                        project_conf['private_subnet_name'])
         except:
             print("Subnet hasn't been created.")
-        dlab.fab.append_result("Failed to create subnet.", str(err))
+        datalab.fab.append_result("Failed to create subnet.", str(err))
         sys.exit(1)
 
     project_conf['private_subnet_cidr'] = AzureMeta.get_subnet(project_conf['resource_group_name'],
@@ -174,291 +173,332 @@
     print('NEW SUBNET CIDR CREATED: {}'.format(project_conf['private_subnet_cidr']))
 
     try:
-        logging.info('[CREATE SECURITY GROUP FOR EDGE NODE]')
-        print('[CREATE SECURITY GROUP FOR EDGE]')
-        edge_list_rules = [
-            {
-                "name": "in-1",
-                "protocol": "*",
-                "source_port_range": "*",
-                "destination_port_range": "*",
-                "source_address_prefix": project_conf['private_subnet_cidr'],
-                "destination_address_prefix": "*",
-                "access": "Allow",
-                "priority": 100,
-                "direction": "Inbound"
-            },
-            {
-                "name": "in-2",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "22",
-                "source_address_prefix": "*",
-                "destination_address_prefix": "*",
-                "access": "Allow",
-                "priority": 110,
-                "direction": "Inbound"
-            },
-            {
-                "name": "in-3",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "3128",
-                "source_address_prefix": "*",
-                "destination_address_prefix": "*",
-                "access": "Allow",
-                "priority": 120,
-                "direction": "Inbound"
-            },
-            {
-                "name": "in-4",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "80",
-                "source_address_prefix": "*",
-                "destination_address_prefix": "*",
-                "access": "Allow",
-                "priority": 130,
-                "direction": "Inbound"
-            },
-            {
-                "name": "in-5",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "443",
-                "source_address_prefix": "*",
-                "destination_address_prefix": "*",
-                "access": "Allow",
-                "priority": 140,
-                "direction": "Inbound"
-            },
-            {
-                "name": "out-1",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "22",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 100,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-2",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "8888",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 110,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-3",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "8080",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 120,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-4",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "8787",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 130,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-5",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "6006",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 140,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-6",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "20888",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 150,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-7",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "8088",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 160,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-8",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "18080",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 170,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-9",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "50070",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 180,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-10",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "8085",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 190,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-11",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "8081",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 200,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-12",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "4040-4140",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 210,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-13",
-                "protocol": "Udp",
-                "source_port_range": "*",
-                "destination_port_range": "53",
-                "source_address_prefix": '*',
-                "destination_address_prefix": "*",
-                "access": "Allow",
-                "priority": 220,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-14",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "80",
-                "source_address_prefix": '*',
-                "destination_address_prefix": "*",
-                "access": "Allow",
-                "priority": 230,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-15",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "443",
-                "source_address_prefix": '*',
-                "destination_address_prefix": "*",
-                "access": "Allow",
-                "priority": 240,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-16",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "389",
-                "source_address_prefix": '*',
-                "destination_address_prefix": "*",
-                "access": "Allow",
-                "priority": 250,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-17",
-                "protocol": "Tcp",
-                "source_port_range": "*",
-                "destination_port_range": "8042",
-                "source_address_prefix": "*",
-                "destination_address_prefix": project_conf['private_subnet_cidr'],
-                "access": "Allow",
-                "priority": 260,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-18",
-                "protocol": "Udp",
-                "source_port_range": "*",
-                "destination_port_range": "123",
-                "source_address_prefix": "*",
-                "destination_address_prefix": "*",
-                "access": "Allow",
-                "priority": 270,
-                "direction": "Outbound"
-            },
-            {
-                "name": "out-19",
-                "protocol": "*",
-                "source_port_range": "*",
-                "destination_port_range": "*",
-                "source_address_prefix": "*",
-                "destination_address_prefix": "*",
-                "access": "Deny",
-                "priority": 300,
-                "direction": "Outbound"
-            }
-        ]
-        params = "--resource_group_name {} --security_group_name {} --region {} --tags '{}' --list_rules '{}'". \
-            format(project_conf['resource_group_name'], project_conf['edge_security_group_name'],
-                   project_conf['region'], json.dumps(project_conf['instance_tags']), json.dumps(edge_list_rules))
-        try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
-        except Exception as err:
-            AzureActions.remove_subnet(project_conf['resource_group_name'], project_conf['vpc_name'],
-                                       project_conf['private_subnet_name'])
+        if 'azure_edge_security_group_name' in os.environ:
+            logging.info('Security group predefined, adding new rule with endpoint IP')
+            print('Security group predefined, adding new rule with endpoint IP')
+            if project_conf['endpoint_name'] == 'local':
+                endpoint_ip = AzureMeta.get_instance_public_ip_address(project_conf['resource_group_name'],
+                                                          '{}-ssn'.format(project_conf['service_base_name']))
+            else:
+                endpoint_ip = AzureMeta.get_instance_public_ip_address(project_conf['resource_group_name'],
+                                                         '{}-{}-endpoint'.format(project_conf['service_base_name'], project_conf['endpoint_name']))
+            priority = 110
+            priorities = list()
+            rules_list = AzureMeta.get_security_group(project_conf['resource_group_name'], os.environ['azure_edge_security_group_name'])
+            for rule in rules_list.as_dict()['security_rules']:
+                priorities.append(rule['priority'])
+            while priority in priorities:
+                priority += 10
+            edge_list_rules = [
+                {
+                    "name": '{}-{}-{}-rule'.format(project_conf['service_base_name'],
+                                                 project_conf['project_name'],
+                                                 project_conf['endpoint_tag']),
+                    "protocol": "*",
+                    "source_port_range": "*",
+                    "destination_port_range": "*",
+                    "source_address_prefix": endpoint_ip,
+                    "destination_address_prefix": "*",
+                    "access": "Allow",
+                    "priority": priority,
+                    "direction": "Inbound"
+                }
+            ]
+            params = "--resource_group_name {} --security_group_name {} --region {} --tags '{}' --list_rules '{}'". \
+                format(project_conf['resource_group_name'], os.environ['azure_edge_security_group_name'],
+                       project_conf['region'], json.dumps({"product": "datalab"}), json.dumps(edge_list_rules))
             try:
-                AzureActions.remove_security_group(project_conf['resource_group_name'],
-                                                   project_conf['edge_security_group_name'])
-            except:
-                print("Edge Security group hasn't been created.")
-            traceback.print_exc()
-            dlab.fab.append_result("Failed creating security group for edge node.", str(err))
-            raise Exception
+                subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
+            except Exception as err:
+                AzureActions.remove_subnet(project_conf['resource_group_name'], project_conf['vpc_name'],
+                                           project_conf['private_subnet_name'])
+        else:
+            logging.info('[CREATE SECURITY GROUP FOR EDGE NODE]')
+            print('[CREATE SECURITY GROUP FOR EDGE]')
+            edge_list_rules = [
+                {
+                    "name": "in-1",
+                    "protocol": "*",
+                    "source_port_range": "*",
+                    "destination_port_range": "*",
+                    "source_address_prefix": project_conf['private_subnet_cidr'],
+                    "destination_address_prefix": "*",
+                    "access": "Allow",
+                    "priority": 100,
+                    "direction": "Inbound"
+                },
+                {
+                    "name": "in-2",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "22",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": "*",
+                    "access": "Allow",
+                    "priority": 110,
+                    "direction": "Inbound"
+                },
+                {
+                    "name": "in-3",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "3128",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": "*",
+                    "access": "Allow",
+                    "priority": 120,
+                    "direction": "Inbound"
+                },
+                {
+                    "name": "in-4",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "80",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": "*",
+                    "access": "Allow",
+                    "priority": 130,
+                    "direction": "Inbound"
+                },
+                {
+                    "name": "in-5",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "443",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": "*",
+                    "access": "Allow",
+                    "priority": 140,
+                    "direction": "Inbound"
+                },
+                {
+                    "name": "out-1",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "22",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 100,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-2",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "8888",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 110,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-3",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "8080",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 120,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-4",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "8787",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 130,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-5",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "6006",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 140,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-6",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "20888",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 150,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-7",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "8088",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 160,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-8",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "18080",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 170,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-9",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "50070",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 180,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-10",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "8085",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 190,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-11",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "8081",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 200,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-12",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "4040-4140",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 210,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-13",
+                    "protocol": "Udp",
+                    "source_port_range": "*",
+                    "destination_port_range": "53",
+                    "source_address_prefix": '*',
+                    "destination_address_prefix": "*",
+                    "access": "Allow",
+                    "priority": 220,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-14",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "80",
+                    "source_address_prefix": '*',
+                    "destination_address_prefix": "*",
+                    "access": "Allow",
+                    "priority": 230,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-15",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "443",
+                    "source_address_prefix": '*',
+                    "destination_address_prefix": "*",
+                    "access": "Allow",
+                    "priority": 240,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-16",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "389",
+                    "source_address_prefix": '*',
+                    "destination_address_prefix": "*",
+                    "access": "Allow",
+                    "priority": 250,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-17",
+                    "protocol": "Tcp",
+                    "source_port_range": "*",
+                    "destination_port_range": "8042",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": project_conf['private_subnet_cidr'],
+                    "access": "Allow",
+                    "priority": 260,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-18",
+                    "protocol": "Udp",
+                    "source_port_range": "*",
+                    "destination_port_range": "123",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": "*",
+                    "access": "Allow",
+                    "priority": 270,
+                    "direction": "Outbound"
+                },
+                {
+                    "name": "out-19",
+                    "protocol": "*",
+                    "source_port_range": "*",
+                    "destination_port_range": "*",
+                    "source_address_prefix": "*",
+                    "destination_address_prefix": "*",
+                    "access": "Deny",
+                    "priority": 300,
+                    "direction": "Outbound"
+                }
+            ]
+            params = "--resource_group_name {} --security_group_name {} --region {} --tags '{}' --list_rules '{}'". \
+                format(project_conf['resource_group_name'], project_conf['edge_security_group_name'],
+                       project_conf['region'], json.dumps(project_conf['instance_tags']), json.dumps(edge_list_rules))
+            try:
+                subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
+            except Exception as err:
+                AzureActions.remove_subnet(project_conf['resource_group_name'], project_conf['vpc_name'],
+                                           project_conf['private_subnet_name'])
+                try:
+                    AzureActions.remove_security_group(project_conf['resource_group_name'],
+                                                       project_conf['edge_security_group_name'])
+                except:
+                    print("Edge Security group hasn't been created.")
+                traceback.print_exc()
+                datalab.fab.append_result("Failed creating security group for edge node.", str(err))
+                raise Exception
     except:
+        traceback.print_exc()
         sys.exit(1)
 
     try:
@@ -551,15 +591,16 @@
             format(project_conf['resource_group_name'], project_conf['notebook_security_group_name'],
                    project_conf['region'], json.dumps(project_conf['instance_tags']), json.dumps(notebook_list_rules))
         try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating security group for private subnet.", str(err))
+        datalab.fab.append_result("Failed creating security group for private subnet.", str(err))
         AzureActions.remove_subnet(project_conf['resource_group_name'], project_conf['vpc_name'],
                                    project_conf['private_subnet_name'])
-        AzureActions.remove_security_group(project_conf['resource_group_name'],
+        if 'azure_edge_security_group_name' not in os.environ:
+            AzureActions.remove_security_group(project_conf['resource_group_name'],
                                            project_conf['edge_security_group_name'])
         try:
             AzureActions.remove_security_group(project_conf['resource_group_name'],
@@ -658,14 +699,15 @@
             project_conf['resource_group_name'], project_conf['master_security_group_name'], project_conf['region'],
             json.dumps(project_conf['instance_tags']), json.dumps(cluster_list_rules))
         try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         AzureActions.remove_subnet(project_conf['resource_group_name'], project_conf['vpc_name'],
                                    project_conf['private_subnet_name'])
-        AzureActions.remove_security_group(project_conf['resource_group_name'],
+        if 'azure_edge_security_group_name' not in os.environ:
+            AzureActions.remove_security_group(project_conf['resource_group_name'],
                                            project_conf['edge_security_group_name'])
         AzureActions.remove_security_group(project_conf['resource_group_name'],
                                            project_conf['notebook_security_group_name'])
@@ -674,7 +716,7 @@
                                                project_conf['master_security_group_name'])
         except:
             print("Master Security group hasn't been created.")
-        dlab.fab.append_result("Failed to create Security groups. Exception:" + str(err))
+        datalab.fab.append_result("Failed to create Security groups. Exception:" + str(err))
         sys.exit(1)
 
     logging.info('[CREATING SECURITY GROUPS FOR SLAVE NODES]')
@@ -684,14 +726,15 @@
             project_conf['resource_group_name'], project_conf['slave_security_group_name'], project_conf['region'],
             json.dumps(project_conf['instance_tags']), json.dumps(cluster_list_rules))
         try:
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         AzureActions.remove_subnet(project_conf['resource_group_name'], project_conf['vpc_name'],
                                    project_conf['private_subnet_name'])
-        AzureActions.remove_security_group(project_conf['resource_group_name'],
+        if 'azure_edge_security_group_name' not in os.environ:
+            AzureActions.remove_security_group(project_conf['resource_group_name'],
                                            project_conf['edge_security_group_name'])
         AzureActions.remove_security_group(project_conf['resource_group_name'],
                                            project_conf['notebook_security_group_name'])
@@ -702,7 +745,7 @@
                                                project_conf['slave_security_group_name'])
         except:
             print("Slave Security group hasn't been created.")
-        dlab.fab.append_result("Failed to create Security groups. Exception:" + str(err))
+        datalab.fab.append_result("Failed to create Security groups. Exception:" + str(err))
         sys.exit(1)
 
     try:
@@ -711,12 +754,13 @@
         params = "--container_name {} --account_tags '{}' --resource_group_name {} --region {}". \
             format(project_conf['shared_container_name'], json.dumps(project_conf['shared_storage_account_tags']),
                    project_conf['resource_group_name'], project_conf['region'])
-        local("~/scripts/{}.py {}".format('common_create_storage_account', params))
+        subprocess.run("~/scripts/{}.py {}".format('common_create_storage_account', params), shell=True, check=True)
     except Exception as err:
-        dlab.fab.append_result("Failed to create storage account.", str(err))
+        datalab.fab.append_result("Failed to create storage account.", str(err))
         AzureActions.remove_subnet(project_conf['resource_group_name'], project_conf['vpc_name'],
                                    project_conf['private_subnet_name'])
-        AzureActions.remove_security_group(project_conf['resource_group_name'],
+        if 'azure_edge_security_group_name' not in os.environ:
+            AzureActions.remove_security_group(project_conf['resource_group_name'],
                                            project_conf['edge_security_group_name'])
         AzureActions.remove_security_group(project_conf['resource_group_name'],
                                            project_conf['notebook_security_group_name'])
@@ -737,15 +781,16 @@
             format(project_conf['edge_container_name'], json.dumps(project_conf['storage_account_tags']),
                    project_conf['resource_group_name'], project_conf['region'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_storage_account', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_storage_account', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create storage account.", str(err))
+        datalab.fab.append_result("Failed to create storage account.", str(err))
         AzureActions.remove_subnet(project_conf['resource_group_name'], project_conf['vpc_name'],
                                    project_conf['private_subnet_name'])
-        AzureActions.remove_security_group(project_conf['resource_group_name'],
+        if 'azure_edge_security_group_name' not in os.environ:
+            AzureActions.remove_security_group(project_conf['resource_group_name'],
                                            project_conf['edge_security_group_name'])
         AzureActions.remove_security_group(project_conf['resource_group_name'],
                                            project_conf['notebook_security_group_name'])
@@ -771,15 +816,16 @@
                                                      project_conf['azure_ad_user_name'],
                                                      project_conf['service_base_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_create_datalake_directory', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_create_datalake_directory', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
         except Exception as err:
-            dlab.fab.append_result("Failed to create Data Lake Store directory.", str(err))
+            datalab.fab.append_result("Failed to create Data Lake Store directory.", str(err))
             AzureActions.remove_subnet(project_conf['resource_group_name'], project_conf['vpc_name'],
                                        project_conf['private_subnet_name'])
-            AzureActions.remove_security_group(project_conf['resource_group_name'],
+            if 'azure_edge_security_group_name' not in os.environ:
+                AzureActions.remove_security_group(project_conf['resource_group_name'],
                                                project_conf['edge_security_group_name'])
             AzureActions.remove_security_group(project_conf['resource_group_name'],
                                                project_conf['notebook_security_group_name'])
@@ -811,9 +857,11 @@
     try:
         logging.info('[CREATE EDGE INSTANCE]')
         print('[CREATE EDGE INSTANCE]')
+        if 'azure_edge_security_group_name' in os.environ:
+            project_conf['edge_security_group_name'] = os.environ['azure_edge_security_group_name']
         params = "--instance_name {} --instance_size {} --region {} --vpc_name {} --network_interface_name {} \
             --security_group_name {} --subnet_name {} --service_base_name {} --resource_group_name {} \
-            --dlab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
+            --datalab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
             --instance_type {} --project_name {} --instance_storage_account_type {} --image_name {} --tags '{}'".\
             format(project_conf['instance_name'], os.environ['azure_edge_instance_size'], project_conf['region'],
                    project_conf['vpc_name'], project_conf['network_interface_name'],
@@ -824,7 +872,7 @@
                    project_conf['instance_storage_account_type'],
                    project_conf['image_name'], json.dumps(project_conf['instance_tags']))
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -835,7 +883,8 @@
             print("The instance hasn't been created.")
         AzureActions.remove_subnet(project_conf['resource_group_name'], project_conf['vpc_name'],
                                    project_conf['private_subnet_name'])
-        AzureActions.remove_security_group(project_conf['resource_group_name'],
+        if 'azure_edge_security_group_name' not in os.environ:
+            AzureActions.remove_security_group(project_conf['resource_group_name'],
                                            project_conf['edge_security_group_name'])
         AzureActions.remove_security_group(project_conf['resource_group_name'],
                                            project_conf['notebook_security_group_name'])
@@ -853,5 +902,5 @@
                 if project_conf['datalake_store_name'] == datalake.tags["Name"]:
                     AzureActions.remove_datalake_directory(datalake.name,
                                                            project_conf['datalake_user_directory_name'])
-        dlab.fab.append_result("Failed to create instance. Exception:" + str(err))
+        datalab.fab.append_result("Failed to create instance. Exception:" + str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/project_terminate.py b/infrastructure-provisioning/src/general/scripts/azure/project_terminate.py
index 765959f..cfe04db 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/project_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/project_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,19 +21,18 @@
 #
 # ******************************************************************************
 
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
 import logging
-import sys
-import time
 import os
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
 import requests
+import sys
 import traceback
 
 
-def terminate_edge_node(resource_group_name, service_base_name, project_tag, subnet_name, vpc_name):
+def terminate_edge_node(resource_group_name, service_base_name, project_tag, subnet_name, vpc_name, endpoint_name):
     print("Terminating EDGE, notebook and dataengine virtual machines")
     try:
         for vm in AzureMeta.compute_client.virtual_machines.list(resource_group_name):
@@ -44,7 +43,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate edge instance.", str(err))
+        datalab.fab.append_result("Failed to terminate edge instance.", str(err))
         sys.exit(1)
 
     print("Removing network interfaces")
@@ -57,7 +56,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove network interfaces.", str(err))
+        datalab.fab.append_result("Failed to remove network interfaces.", str(err))
         sys.exit(1)
 
     print("Removing static public IPs")
@@ -70,7 +69,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove static IP addresses.", str(err))
+        datalab.fab.append_result("Failed to remove static IP addresses.", str(err))
         sys.exit(1)
 
     print("Removing disks")
@@ -83,7 +82,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove volumes.", str(err))
+        datalab.fab.append_result("Failed to remove volumes.", str(err))
         sys.exit(1)
 
     print("Removing storage account")
@@ -96,7 +95,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove storage accounts.", str(err))
+        datalab.fab.append_result("Failed to remove storage accounts.", str(err))
         sys.exit(1)
 
     print("Deleting Data Lake Store directory")
@@ -109,22 +108,28 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove Data Lake.", str(err))
+        datalab.fab.append_result("Failed to remove Data Lake.", str(err))
         sys.exit(1)
 
     print("Removing project specific images")
     try:
         for image in AzureMeta.list_images():
-            if service_base_name == image.tags["SBN"] and 'project_tag' in image.tags \
-                    and project_tag == image.tags["project_tag"]:
+            if service_base_name == image.tags["SBN"] and project_tag == image.tags["project_tag"] \
+                    and endpoint_name == image.tags["endpoint_tag"]:
                 AzureActions.remove_image(resource_group_name, image.name)
                 print("Image {} has been removed".format(image.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove images", str(err))
+        datalab.fab.append_result("Failed to remove images", str(err))
         sys.exit(1)
 
     print("Removing security groups")
     try:
+        if 'azure_edge_security_group_name' in os.environ:
+            AzureActions.remove_security_rules(os.environ['azure_edge_security_group_name'],
+                                               resource_group_name,
+                                               '{}-{}-{}-rule'.format(project_conf['service_base_name'],
+                                                                      project_conf['project_name'],
+                                                                      project_conf['endpoint_name']))
         for sg in AzureMeta.network_client.network_security_groups.list(resource_group_name):
             try:
                 if project_tag == sg.tags["project_tag"]:
@@ -133,7 +138,7 @@
             except:
                 pass
     except Exception as err:
-        dlab.fab.append_result("Failed to remove security groups.", str(err))
+        datalab.fab.append_result("Failed to remove security groups.", str(err))
         sys.exit(1)
 
     print("Removing private subnet")
@@ -141,7 +146,7 @@
         AzureActions.remove_subnet(resource_group_name, vpc_name, subnet_name)
         print("Private subnet {} has been terminated".format(subnet_name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove subnets.", str(err))
+        datalab.fab.append_result("Failed to remove subnets.", str(err))
         sys.exit(1)
 
 
@@ -154,8 +159,8 @@
                         filename=local_log_filepath)
 
     print('Generating infrastructure names and tags')
-    AzureMeta = dlab.meta_lib.AzureMeta()
-    AzureActions = dlab.actions_lib.AzureActions()
+    AzureMeta = datalab.meta_lib.AzureMeta()
+    AzureActions = datalab.actions_lib.AzureActions()
     project_conf = dict()
     project_conf['service_base_name'] = os.environ['conf_service_base_name']
     project_conf['resource_group_name'] = os.environ['azure_resource_group_name']
@@ -174,10 +179,10 @@
         try:
             terminate_edge_node(project_conf['resource_group_name'], project_conf['service_base_name'],
                                 project_conf['project_tag'], project_conf['private_subnet_name'],
-                                project_conf['vpc_name'])
+                                project_conf['vpc_name'], project_conf['endpoint_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate edge.", str(err))
+            datalab.fab.append_result("Failed to terminate edge.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -228,5 +233,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/rstudio_change_pass.py b/infrastructure-provisioning/src/general/scripts/azure/rstudio_change_pass.py
index cbc97c4..57a3aa5 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/rstudio_change_pass.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/rstudio_change_pass.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,11 +21,10 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
 import argparse
-from dlab.fab import *
 import sys
-
+from datalab.fab import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -34,16 +33,15 @@
 parser.add_argument('--rstudio_pass', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = '{}@{}'.format(args.os_user, args.hostname)
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     print("Setting password for Rstudio user.")
     try:
-        sudo('echo "{0}:{1}" | chpasswd'.format(args.os_user, args.rstudio_pass))
+        conn.sudo('''bash -c 'echo "{0}:{1}" | chpasswd' '''.format(args.os_user, args.rstudio_pass))
+        conn.close()
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/rstudio_configure.py b/infrastructure-provisioning/src/general/scripts/azure/rstudio_configure.py
index 8487238..4ed3ad7 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/rstudio_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/rstudio_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -41,8 +41,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = os.environ['exploratory_name']
@@ -92,7 +92,7 @@
         notebook_config['security_group_name'] = '{}-{}-{}-nb-sg'.format(notebook_config['service_base_name'],
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['tags'] = {"Name": notebook_config['instance_name'],
                                    "SBN": notebook_config['service_base_name'],
                                    "User": notebook_config['user_name'],
@@ -121,7 +121,7 @@
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
         edge_hostname = AzureMeta.get_private_ip_address(notebook_config['resource_group_name'],
                                                          edge_instance_name)
-        notebook_config['rstudio_pass'] = dlab.fab.id_generator()
+        notebook_config['rstudio_pass'] = datalab.fab.id_generator()
         if os.environ['conf_os_family'] == 'debian':
             notebook_config['initial_user'] = 'ubuntu'
             notebook_config['sudo_group'] = 'sudo'
@@ -129,24 +129,24 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem",
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -157,14 +157,14 @@
         additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -172,16 +172,16 @@
     try:
         logging.info('[INSTALLING PREREQUISITES TO R_STUDIO NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO R_STUDIO NOTEBOOK INSTANCE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['azure_region'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['azure_region'],
                    edge_instance_private_hostname)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -195,18 +195,18 @@
                  "--r_mirror {6} --ip_address {7} --exploratory_name {8} --edge_ip {9} " \
             .format(instance_hostname, keyfile_name,
                     os.environ['azure_region'], notebook_config['rstudio_pass'],
-                    os.environ['notebook_rstudio_version'], notebook_config['dlab_ssh_user'],
+                    os.environ['notebook_rstudio_version'], notebook_config['datalab_ssh_user'],
                     os.environ['notebook_r_mirror'], notebook_config['ip_address'],
                     notebook_config['exploratory_name'], edge_hostname)
         try:
-            local("~/scripts/{}.py {}".format('configure_rstudio_node', params))
-            dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                               os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
+            subprocess.run("~/scripts/{}.py {}".format('configure_rstudio_node', params), shell=True, check=True)
+            datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                   os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure rstudio.", str(err))
+        datalab.fab.append_result("Failed to configure rstudio.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -216,14 +216,14 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -231,31 +231,31 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --resource_group_name {} --notebook_name {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['resource_group_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -266,15 +266,15 @@
                                         notebook_config['expected_image_name'])
             if image == '':
                 print("Looks like it's first time we configure notebook server. Creating image.")
-                dlab.actions_lib.prepare_vm_for_image(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                      keyfile_name)
+                datalab.actions_lib.prepare_vm_for_image(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                         keyfile_name)
                 AzureActions.create_image_from_instance(notebook_config['resource_group_name'],
                                                         notebook_config['instance_name'],
                                                         os.environ['azure_region'],
                                                         notebook_config['expected_image_name'],
                                                         json.dumps(notebook_config['image_tags']))
                 print("Image was successfully created.")
-                local("~/scripts/{}.py".format('common_prepare_notebook'))
+                subprocess.run("~/scripts/{}.py".format('common_prepare_notebook'), shell=True, check=True)
                 instance_running = False
                 while not instance_running:
                     if AzureMeta.get_instance_status(notebook_config['resource_group_name'],
@@ -282,17 +282,17 @@
                         instance_running = True
                 instance_hostname = AzureMeta.get_private_ip_address(notebook_config['resource_group_name'],
                                                                      notebook_config['instance_name'])
-                dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                    keyfile_name)
-                dlab.fab.set_git_proxy(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name,
-                                       'http://{}:3128'.format(edge_instance_private_hostname))
+                datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                       keyfile_name)
+                datalab.fab.set_git_proxy(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name,
+                                          'http://{}:3128'.format(edge_instance_private_hostname))
                 additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
                 params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
                     .format(instance_hostname, notebook_config['instance_name'], keyfile_name,
-                            json.dumps(additional_config), notebook_config['dlab_ssh_user'])
-                local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+                            json.dumps(additional_config), notebook_config['datalab_ssh_user'])
+                subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
             sys.exit(1)
 
@@ -311,17 +311,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_private_hostname,
                     keyfile_name,
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'rstudio',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -344,11 +344,11 @@
         print("User key name: {}".format(notebook_config['user_keyname']))
         print("SG name: {}".format(notebook_config['security_group_name']))
         print("Rstudio URL: {}".format(rstudio_ip_url))
-        print("Rstudio user: {}".format(notebook_config['dlab_ssh_user']))
+        print("Rstudio user: {}".format(notebook_config['datalab_ssh_user']))
         print("Rstudio pass: {}".format(notebook_config['rstudio_pass']))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"ip": ip_address,
@@ -361,16 +361,16 @@
                        {"description": "RStudio",
                         "url": rstudio_notebook_access_url},
                        {"description": "Ungit",
-                        "url": rstudio_ungit_access_url}#,
-                       #{"description": "RStudio (via tunnel)",
+                        "url": rstudio_ungit_access_url}  # ,
+                       # {"description": "RStudio (via tunnel)",
                        # "url": rstudio_ip_url},
-                       #{"description": "Ungit (via tunnel)",
+                       # {"description": "Ungit (via tunnel)",
                        # "url": ungit_ip_url}
                    ],
-                   "exploratory_user": notebook_config['dlab_ssh_user'],
+                   "exploratory_user": notebook_config['datalab_ssh_user'],
                    "exploratory_pass": notebook_config['rstudio_pass']}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information", str(err))
+        datalab.fab.append_result("Failed to generate output information", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/ssn_configure.py b/infrastructure-provisioning/src/general/scripts/azure/ssn_configure.py
index dbfd10d..3809db5 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/ssn_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/ssn_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import sys
-import os
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-from fabric.api import *
-import dlab.ssn_lib
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
 import logging
+import os
+import sys
 import traceback
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}.log".format(os.environ['conf_resource'], os.environ['request_id'])
@@ -56,17 +56,17 @@
 
 
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         ssn_conf = dict()
         ssn_conf['instance'] = 'ssn'
-        
+
         logging.info('[DERIVING NAMES]')
         print('[DERIVING NAMES]')
 
         ssn_conf['billing_enabled'] = True
         # We need to cut service_base_name to 20 symbols do to the Azure Name length limitation
-        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
+        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
             os.environ['conf_service_base_name'][:20], '-', True)
         # Check azure predefined resources
         ssn_conf['resource_group_name'] = os.environ.get('azure_resource_group_name',
@@ -82,7 +82,7 @@
         ssn_conf['datalake_shared_directory_name'] = '{}-shared-folder'.format(ssn_conf['service_base_name'])
         ssn_conf['instance_name'] = '{}-ssn'.format(ssn_conf['service_base_name'])
         ssn_conf['ssh_key_path'] = '{}{}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        ssn_conf['dlab_ssh_user'] = os.environ['conf_os_user']
+        ssn_conf['datalab_ssh_user'] = os.environ['conf_os_user']
         ssn_conf['instance_dns_name'] = 'host-{}.{}.cloudapp.azure.com'.format(ssn_conf['instance_name'],
                                                                                ssn_conf['region'])
         if os.environ['conf_network_type'] == 'private':
@@ -128,36 +128,37 @@
             ssn_conf['initial_user'] = 'ec2-user'
             ssn_conf['sudo_group'] = 'wheel'
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         clear_resources()
         sys.exit(1)
 
     try:
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
-        params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format\
-            (ssn_conf['instance_host'], ssn_conf['ssh_key_path'], ssn_conf['initial_user'], ssn_conf['dlab_ssh_user'],
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
+        params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format \
+            (ssn_conf['instance_host'], ssn_conf['ssh_key_path'], ssn_conf['initial_user'],
+             ssn_conf['datalab_ssh_user'],
              ssn_conf['sudo_group'])
-        local("~/scripts/{}.py {}".format('create_ssh_user', params))
+        subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         clear_resources()
-        dlab.fab.append_result("Failed creating ssh user 'dlab-user'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab-user'.", str(err))
         sys.exit(1)
 
     try:
         logging.info('[INSTALLING PREREQUISITES TO SSN INSTANCE]')
         print('[INSTALLING PREREQUISITES TO SSN INSTANCE]')
-        params = "--hostname {} --keyfile {} --pip_packages 'backoff argparse fabric==1.14.0 pymongo pyyaml " \
-                 "pycrypto azure==2.0.0' --user {} --region {}".format(ssn_conf['instance_host'],
+        params = "--hostname {} --keyfile {} --pip_packages 'backoff bcrypt==3.1.7 argparse fabric==1.14.0 pymongo pyyaml " \
+                 "pycryptodome azure==2.0.0' --user {} --region {}".format(ssn_conf['instance_host'],
                                                                        ssn_conf['ssh_key_path'],
-                                                                       ssn_conf['dlab_ssh_user'],
+                                                                       ssn_conf['datalab_ssh_user'],
                                                                        ssn_conf['region'])
-        local("~/scripts/{}.py {}".format('install_prerequisites', params))
+        subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         clear_resources()
-        dlab.fab.append_result("Failed installing software: pip, packages.", str(err))
+        datalab.fab.append_result("Failed installing software: pip, packages.", str(err))
         sys.exit(1)
 
     try:
@@ -167,16 +168,16 @@
                              "service_base_name": ssn_conf['service_base_name'],
                              "security_group_id": ssn_conf['security_group_name'], "vpc_id": ssn_conf['vpc_name'],
                              "subnet_id": ssn_conf['subnet_name'], "admin_key": os.environ['conf_key_name']}
-        params = "--hostname {} --keyfile {} --additional_config '{}' --os_user {} --dlab_path {} " \
+        params = "--hostname {} --keyfile {} --additional_config '{}' --os_user {} --datalab_path {} " \
                  "--tag_resource_id {} --step_cert_sans '{}'". \
             format(ssn_conf['instance_host'], ssn_conf['ssh_key_path'], json.dumps(additional_config),
-                   ssn_conf['dlab_ssh_user'], os.environ['ssn_dlab_path'], ssn_conf['service_base_name'],
+                   ssn_conf['datalab_ssh_user'], os.environ['ssn_datalab_path'], ssn_conf['service_base_name'],
                    ssn_conf['step_cert_sans'])
-        local("~/scripts/{}.py {}".format('configure_ssn_node', params))
+        subprocess.run("~/scripts/{}.py {}".format('configure_ssn_node', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         clear_resources()
-        dlab.fab.append_result("Failed configuring ssn.", str(err))
+        datalab.fab.append_result("Failed configuring ssn.", str(err))
         sys.exit(1)
 
     try:
@@ -192,22 +193,22 @@
                              {"name": "tensor", "tag": "latest"},
                              {"name": "deeplearning", "tag": "latest"},
                              {"name": "dataengine", "tag": "latest"}]
-        params = "--hostname {} --keyfile {} --additional_config '{}' --os_family {} --os_user {} --dlab_path {} " \
+        params = "--hostname {} --keyfile {} --additional_config '{}' --os_family {} --os_user {} --datalab_path {} " \
                  "--cloud_provider {} --region {}".format(ssn_conf['instance_host'], ssn_conf['ssh_key_path'],
                                                           json.dumps(additional_config), os.environ['conf_os_family'],
-                                                          ssn_conf['dlab_ssh_user'], os.environ['ssn_dlab_path'],
+                                                          ssn_conf['datalab_ssh_user'], os.environ['ssn_datalab_path'],
                                                           os.environ['conf_cloud_provider'], ssn_conf['region'])
-        local("~/scripts/{}.py {}".format('configure_docker', params))
+        subprocess.run("~/scripts/{}.py {}".format('configure_docker', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         clear_resources()
-        dlab.fab.append_result("Unable to configure docker.", str(err))
+        datalab.fab.append_result("Unable to configure docker.", str(err))
         sys.exit(1)
 
     try:
         logging.info('[CONFIGURE SSN INSTANCE UI]')
         print('[CONFIGURE SSN INSTANCE UI]')
-        ssn_conf['azure_auth_path'] = '/home/{}/keys/azure_auth.json'.format(ssn_conf['dlab_ssh_user'])
+        ssn_conf['azure_auth_path'] = '/home/{}/keys/azure_auth.json'.format(ssn_conf['datalab_ssh_user'])
         ssn_conf['ldap_login'] = 'false'
 
         cloud_params = [
@@ -329,7 +330,7 @@
             },
             {
                 'key': "AZURE_AUTH_FILE_PATH",
-                'value': ""
+                'value': ssn_conf['azure_auth_path']
             }
         ]
 
@@ -359,6 +360,62 @@
                     'key': 'STEP_CA_URL',
                     'value': os.environ['conf_stepcerts_ca_url']
                 })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_ENABLED',
+                    'value': 'false'
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_DOMAIN_NAME',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_EMAIL',
+                    'value': ''
+                })
+        elif os.environ['conf_letsencrypt_enabled'] == 'true':
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_ENABLED',
+                    'value': os.environ['conf_letsencrypt_enabled']
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_DOMAIN_NAME',
+                    'value': os.environ['conf_letsencrypt_domain_name']
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_EMAIL',
+                    'value': os.environ['conf_letsencrypt_email']
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_CERTS_ENABLED',
+                    'value': 'false'
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_ROOT_CA',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_KID_ID',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_KID_PASSWORD',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_CA_URL',
+                    'value': ''
+                })
         else:
             cloud_params.append(
                 {
@@ -385,6 +442,21 @@
                     'key': 'STEP_CA_URL',
                     'value': ''
                 })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_ENABLED',
+                    'value': 'false'
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_DOMAIN_NAME',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_EMAIL',
+                    'value': ''
+                })
 
         if os.environ['azure_datalake_enable'] == 'false':
             cloud_params.append(
@@ -420,26 +492,28 @@
             for datalake in AzureMeta.list_datalakes(ssn_conf['resource_group_name']):
                 if ssn_conf['datalake_store_name'] == datalake.tags["Name"]:
                     datalake_store_name = datalake.name
-        params = "--hostname {} --keyfile {} --dlab_path {} --os_user {} --os_family {} --request_id {} \
+        params = "--hostname {} --keyfile {} --datalab_path {} --os_user {} --os_family {} --request_id {} \
                  --resource {} --service_base_name {} --cloud_provider {} --billing_enabled {} --authentication_file {} \
                  --offer_number {} --currency {} --locale {} --region_info {}  --ldap_login {} --tenant_id {} \
                  --application_id {} --datalake_store_name {} --cloud_params '{}' --subscription_id {}  \
                  --validate_permission_scope {} --default_endpoint_name {} --keycloak_client_id {} \
                  --keycloak_client_secret {} --keycloak_auth_server_url {}". \
-            format(ssn_conf['instnace_ip'], ssn_conf['ssh_key_path'], os.environ['ssn_dlab_path'],
-                   ssn_conf['dlab_ssh_user'], os.environ['conf_os_family'], os.environ['request_id'],
+            format(ssn_conf['instnace_ip'], ssn_conf['ssh_key_path'], os.environ['ssn_datalab_path'],
+                   ssn_conf['datalab_ssh_user'], os.environ['conf_os_family'], os.environ['request_id'],
                    os.environ['conf_resource'], ssn_conf['service_base_name'], os.environ['conf_cloud_provider'],
                    ssn_conf['billing_enabled'], ssn_conf['azure_auth_path'], os.environ['azure_offer_number'],
                    os.environ['azure_currency'], os.environ['azure_locale'], os.environ['azure_region_info'],
-                   ssn_conf['ldap_login'], ssn_conf['tenant_id'], ssn_conf['datalake_application_id'], ssn_conf['datalake_store_name'], json.dumps(cloud_params),
-                   ssn_conf['subscription_id'], os.environ['azure_validate_permission_scope'], ssn_conf['default_endpoint_name'],
+                   ssn_conf['ldap_login'], ssn_conf['tenant_id'], ssn_conf['datalake_application_id'],
+                   ssn_conf['datalake_store_name'], json.dumps(cloud_params),
+                   ssn_conf['subscription_id'], os.environ['azure_validate_permission_scope'],
+                   ssn_conf['default_endpoint_name'],
                    os.environ['keycloak_client_name'], os.environ['keycloak_client_secret'],
                    os.environ['keycloak_auth_server_url'])
-        local("~/scripts/{}.py {}".format('configure_ui', params))
+        subprocess.run("~/scripts/{}.py {}".format('configure_ui', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         clear_resources()
-        dlab.fab.append_result("Unable to configure UI.", str(err))
+        datalab.fab.append_result("Unable to configure UI.", str(err))
         sys.exit(1)
 
     try:
@@ -470,8 +544,8 @@
         jenkins_url_https = "https://{}/jenkins".format(ssn_conf['instance_host'])
         print("Jenkins URL: {}".format(jenkins_url))
         print("Jenkins URL HTTPS: {}".format(jenkins_url_https))
-        print("DLab UI HTTP URL: http://{}".format(ssn_conf['instance_host']))
-        print("DLab UI HTTPS URL: https://{}".format(ssn_conf['instance_host']))
+        print("DataLab UI HTTP URL: http://{}".format(ssn_conf['instance_host']))
+        print("DataLab UI HTTPS URL: https://{}".format(ssn_conf['instance_host']))
 
         try:
             with open('jenkins_creds.txt') as f:
@@ -508,9 +582,9 @@
             f.write(json.dumps(res))
 
         print('Upload response file')
-        params = "--instance_name {} --local_log_filepath {} --os_user {} --instance_hostname {}".\
-            format(ssn_conf['instance_name'], local_log_filepath, ssn_conf['dlab_ssh_user'], ssn_conf['instnace_ip'])
-        local("~/scripts/{}.py {}".format('upload_response_file', params))
+        params = "--instance_name {} --local_log_filepath {} --os_user {} --instance_hostname {}". \
+            format(ssn_conf['instance_name'], local_log_filepath, ssn_conf['datalab_ssh_user'], ssn_conf['instnace_ip'])
+        subprocess.run("~/scripts/{}.py {}".format('upload_response_file', params), shell=True, check=True)
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
+        datalab.fab.append_result("Error with writing results.", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/ssn_create_datalake.py b/infrastructure-provisioning/src/general/scripts/azure/ssn_create_datalake.py
index 53a94e9..471d78c 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/ssn_create_datalake.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/ssn_create_datalake.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -23,11 +23,10 @@
 
 import argparse
 import json
-from dlab.fab import *
-from dlab.actions_lib import *
-from dlab.meta_lib import *
 import sys
-
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--datalake_name', type=str, default='')
@@ -36,7 +35,6 @@
 parser.add_argument('--region', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     try:
         check_datalake = False
diff --git a/infrastructure-provisioning/src/general/scripts/azure/ssn_create_peering.py b/infrastructure-provisioning/src/general/scripts/azure/ssn_create_peering.py
index 6b53174..a827c0a 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/ssn_create_peering.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/ssn_create_peering.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,9 +22,10 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-import sys, time
+import sys
+import time
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--source_resource_group_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/azure/ssn_create_resource_group.py b/infrastructure-provisioning/src/general/scripts/azure/ssn_create_resource_group.py
index 8134096..4463350 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/ssn_create_resource_group.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/ssn_create_resource_group.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,15 +22,14 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--resource_group_name', type=str, default='')
 parser.add_argument('--region', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     if args.resource_group_name != '':
         if AzureMeta().get_resource_group(args.resource_group_name):
diff --git a/infrastructure-provisioning/src/general/scripts/azure/ssn_create_vpc.py b/infrastructure-provisioning/src/general/scripts/azure/ssn_create_vpc.py
index ac7cb18..015bace 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/ssn_create_vpc.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/ssn_create_vpc.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,8 +22,8 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--vpc_name', type=str, default='')
@@ -32,7 +32,6 @@
 parser.add_argument('--vpc_cidr', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     if args.vpc_name != '':
         if AzureMeta().get_vpc(args.resource_group_name, args.vpc_name):
diff --git a/infrastructure-provisioning/src/general/scripts/azure/ssn_prepare.py b/infrastructure-provisioning/src/general/scripts/azure/ssn_prepare.py
index 408f423..38040b6 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/ssn_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/ssn_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,28 +21,27 @@
 #
 # ******************************************************************************
 
-import sys
-import os
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-from fabric.api import *
-from Crypto.PublicKey import RSA
-import dlab.ssn_lib
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
 import logging
+import os
+import sys
 import traceback
-
+import subprocess
+from Crypto.PublicKey import RSA
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}.log".format(os.environ['conf_resource'], os.environ['request_id'])
-    local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
+    local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         ssn_conf = dict()
         ssn_conf['instance'] = 'ssn'
 
@@ -57,7 +56,7 @@
             raise Exception('Not possible to deploy private environment without predefined resource_group_name '
                             'or source_group_name')
         # We need to cut service_base_name to 20 symbols do to the Azure Name length limitation
-        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
+        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
             os.environ['conf_service_base_name'][:20], '-', True)
         # Check azure predefined resources
         ssn_conf['resource_group_name'] = os.environ.get('azure_resource_group_name',
@@ -84,7 +83,7 @@
         ssn_conf['key'] = RSA.importKey(open('{}{}.pem'.format(os.environ['conf_key_dir'],
                                                                os.environ['conf_key_name']), 'rb').read())
         ssn_conf['instance_storage_account_type'] = 'Premium_LRS'
-        ssn_conf['public_ssh_key'] = ssn_conf['key'].publickey().exportKey("OpenSSH")
+        ssn_conf['public_ssh_key'] = ssn_conf['key'].publickey().exportKey("OpenSSH").decode('UTF-8')
         ssn_conf['instance_tags'] = {"Name": ssn_conf['instance_name'],
                                      "SBN": ssn_conf['service_base_name'],
                                      os.environ['conf_billing_tag_key']: os.environ['conf_billing_tag_value']}
@@ -94,11 +93,11 @@
                                            os.environ['conf_billing_tag_key']: os.environ['conf_billing_tag_value']}
         ssn_conf['primary_disk_size'] = '32'
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
 
     if AzureMeta.get_instance(ssn_conf['resource_group_name'], ssn_conf['instance_name']):
-        dlab.fab.append_result("Service base name should be unique and less or equal 20 symbols. Please try again.")
+        datalab.fab.append_result("Service base name should be unique and less or equal 20 symbols. Please try again.")
         sys.exit(1)
 
     try:
@@ -109,10 +108,10 @@
             logging.info('[CREATING RESOURCE GROUP]')
             print("[CREATING RESOURCE GROUP]")
             params = "--resource_group_name {} --region {}".format(ssn_conf['resource_group_name'], ssn_conf['region'])
-            local("~/scripts/{}.py {}".format('ssn_create_resource_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('ssn_create_resource_group', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
-        dlab.fab.append_result("Failed to create Resource Group.", str(err))
+        datalab.fab.append_result("Failed to create Resource Group.", str(err))
         sys.exit(1)
     
     try:
@@ -124,15 +123,15 @@
             print("[CREATING VIRTUAL NETWORK]")
             params = "--resource_group_name {} --vpc_name {} --region {} --vpc_cidr {}".format(
                 ssn_conf['resource_group_name'], ssn_conf['vpc_name'], ssn_conf['region'], ssn_conf['vpc_cidr'])
-            local("~/scripts/{}.py {}".format('ssn_create_vpc', params))
+            subprocess.run("~/scripts/{}.py {}".format('ssn_create_vpc', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
-        dlab.fab.append_result("Failed to create VPC.", str(err))
+        datalab.fab.append_result("Failed to create VPC.", str(err))
         try:
             if 'azure_resource_group_name' not in os.environ:
                 AzureActions.remove_resource_group(ssn_conf['resource_group_name'], ssn_conf['region'])
         except Exception as err:
-            dlab.fab.append_result("Resources hasn't been removed.", str(err))
+            datalab.fab.append_result("Resources hasn't been removed.", str(err))
         sys.exit(1)
   
     try:
@@ -145,10 +144,10 @@
             params = "--resource_group_name {} --vpc_name {} --region {} --vpc_cidr {} --subnet_name {} --prefix {}".\
                 format(ssn_conf['resource_group_name'], ssn_conf['vpc_name'], ssn_conf['region'],
                        ssn_conf['vpc_cidr'], ssn_conf['subnet_name'], ssn_conf['subnet_prefix'])
-            local("~/scripts/{}.py {}".format('common_create_subnet', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_subnet', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
-        dlab.fab.append_result("Failed to create Subnet.", str(err))
+        datalab.fab.append_result("Failed to create Subnet.", str(err))
         try:
             if 'azure_vpc_name' not in os.environ:
                 AzureActions.remove_vpc(ssn_conf['resource_group_name'], ssn_conf['vpc_name'])
@@ -156,7 +155,7 @@
                 AzureActions.remove_resource_group(ssn_conf['resource_group_name'], ssn_conf['region'])
         except Exception as err:
             print("Resources hasn't been removed: {}".format(str(err)))
-            dlab.fab.append_result("Resources hasn't been removed.", str(err))
+            datalab.fab.append_result("Resources hasn't been removed.", str(err))
         sys.exit(1)
     
     try:
@@ -167,7 +166,7 @@
                      "--source_virtual_network_name {} --destination_virtual_network_name {}".format(
                       ssn_conf['source_resource_group_name'], ssn_conf['resource_group_name'],
                       os.environ['azure_source_vpc_name'], ssn_conf['vpc_name'])
-            local("~/scripts/{}.py {}".format('ssn_create_peering', params))
+            subprocess.run("~/scripts/{}.py {}".format('ssn_create_peering', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         try:
@@ -177,8 +176,8 @@
                 AzureActions.remove_resource_group(ssn_conf['resource_group_name'], ssn_conf['region'])
         except Exception as err:
             print("Resources hasn't been removed: " + str(err))
-            dlab.fab.append_result("Resources hasn't been removed.", str(err))
-        dlab.fab.append_result("Failed to create VPC peering.", str(err))
+            datalab.fab.append_result("Resources hasn't been removed.", str(err))
+        datalab.fab.append_result("Failed to create VPC peering.", str(err))
         sys.exit(1)
 
     try:
@@ -237,10 +236,10 @@
             params = "--resource_group_name {} --security_group_name {} --region {} --tags '{}'  --list_rules '{}'".\
                 format(ssn_conf['resource_group_name'], ssn_conf['security_group_name'], ssn_conf['region'],
                        json.dumps(ssn_conf['instance_tags']), json.dumps(list_rules))
-            local("~/scripts/{}.py {}".format('common_create_security_group', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_security_group', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
-        dlab.fab.append_result("Error creating Security group", str(err))
+        datalab.fab.append_result("Error creating Security group", str(err))
         try:
             if 'azure_subnet_name' not in os.environ:
                 AzureActions.remove_subnet(ssn_conf['resource_group_name'], ssn_conf['vpc_name'],
@@ -251,7 +250,7 @@
                 AzureActions.remove_resource_group(ssn_conf['resource_group_name'], ssn_conf['region'])
         except Exception as err:
             print("Resources hasn't been removed: " + str(err))
-            dlab.fab.append_result("Resources hasn't been removed.", str(err))
+            datalab.fab.append_result("Resources hasn't been removed.", str(err))
         sys.exit(1)
 
     if os.environ['azure_datalake_enable'] == 'true':
@@ -262,7 +261,7 @@
                      format(ssn_conf['datalake_store_name'], json.dumps(ssn_conf['datalake_store_tags']),
                             ssn_conf['resource_group_name'], ssn_conf['region'])
             try:
-                local("~/scripts/{}.py {}".format('ssn_create_datalake', params))
+                subprocess.run("~/scripts/{}.py {}".format('ssn_create_datalake', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
@@ -274,13 +273,13 @@
                        ssn_conf['datalake_shared_directory_name'], ssn_conf['service_base_name'],
                        os.environ['azure_ad_group_id'])
             try:
-                local("~/scripts/{}.py {}".format('common_create_datalake_directory', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_create_datalake_directory', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to create Data Lake Store.", str(err))
+            datalab.fab.append_result("Failed to create Data Lake Store.", str(err))
             for datalake in AzureMeta.list_datalakes(ssn_conf['resource_group_name']):
                 if ssn_conf['datalake_store_name'] == datalake.tags["Name"]:
                     AzureActions.delete_datalake_store(ssn_conf['resource_group_name'], datalake.name)
@@ -307,7 +306,7 @@
         print('[CREATE SSN INSTANCE]')
         params = "--instance_name {} --instance_size {} --region {} --vpc_name {} --network_interface_name {} \
             --security_group_name {} --subnet_name {} --service_base_name {} --resource_group_name {} \
-            --dlab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
+            --datalab_ssh_user_name {} --public_ip_name {} --public_key '''{}''' --primary_disk_size {} \
             --instance_type {} --instance_storage_account_type {} --image_name {} --tags '{}'".\
             format(ssn_conf['instance_name'], os.environ['azure_ssn_instance_size'], ssn_conf['region'],
                    ssn_conf['vpc_name'], ssn_conf['network_interface_name'], ssn_conf['security_group_name'],
@@ -315,10 +314,10 @@
                    initial_user, ssn_conf['static_public_ip_name'], ssn_conf['public_ssh_key'],
                    ssn_conf['primary_disk_size'], 'ssn', ssn_conf['instance_storage_account_type'],
                    ssn_conf['ssn_image_name'], json.dumps(ssn_conf['instance_tags']))
-        local("~/scripts/{}.py {}".format('common_create_instance', params))
+        subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
-        dlab.fab.append_result("Failed to create instance.", str(err))
+        datalab.fab.append_result("Failed to create instance.", str(err))
         try:
             AzureActions.remove_instance(ssn_conf['resource_group_name'], ssn_conf['instance_name'])
         except:
diff --git a/infrastructure-provisioning/src/general/scripts/azure/ssn_terminate.py b/infrastructure-provisioning/src/general/scripts/azure/ssn_terminate.py
index c709929..38ebffc 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/ssn_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/ssn_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,97 +21,122 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import dlab.ssn_lib
-import sys
-import os
-from fabric.api import *
-import logging
-import traceback
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
+import datalab.ssn_lib
 import json
+import logging
+import os
+import sys
+import traceback
+from fabric import *
 
 
 def terminate_ssn_node(resource_group_name, service_base_name, vpc_name, region):
     print("Terminating instances")
     try:
         for vm in AzureMeta.compute_client.virtual_machines.list(resource_group_name):
-            if service_base_name == vm.tags["SBN"]:
+            if "SBN" in vm.tags and service_base_name == vm.tags["SBN"]:
                 AzureActions.remove_instance(resource_group_name, vm.name)
                 print("Instance {} has been terminated".format(vm.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate instances", str(err))
+        datalab.fab.append_result("Failed to terminate instances", str(err))
         sys.exit(1)
 
     print("Removing network interfaces")
     try:
         for network_interface in AzureMeta.list_network_interfaces(resource_group_name):
-            if service_base_name == network_interface.tags["SBN"]:
+            if "SBN" in network_interface.tags and service_base_name == network_interface.tags["SBN"]:
                 AzureActions.delete_network_if(resource_group_name, network_interface.name)
                 print("Network interface {} has been removed".format(network_interface.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove network interfaces", str(err))
+        datalab.fab.append_result("Failed to remove network interfaces", str(err))
         sys.exit(1)
 
     print("Removing static public IPs")
     try:
         for static_public_ip in AzureMeta.list_static_ips(resource_group_name):
-            if service_base_name == static_public_ip.tags["SBN"]:
+            if "SBN" in static_public_ip.tags and service_base_name == static_public_ip.tags["SBN"]:
                 AzureActions.delete_static_public_ip(resource_group_name, static_public_ip.name)
                 print("Static public IP {} has been removed".format(static_public_ip.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove static IPs", str(err))
+        datalab.fab.append_result("Failed to remove static IPs", str(err))
         sys.exit(1)
 
     print("Removing disks")
     try:
         for disk in AzureMeta.list_disks(resource_group_name):
-            if service_base_name == disk.tags["SBN"]:
+            if "SBN" in disk.tags and service_base_name == disk.tags["SBN"]:
                 AzureActions.remove_disk(resource_group_name, disk.name)
                 print("Disk {} has been removed".format(disk.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove disks", str(err))
+        datalab.fab.append_result("Failed to remove disks", str(err))
         sys.exit(1)
 
     print("Removing storage accounts")
     try:
         for storage_account in AzureMeta.list_storage_accounts(resource_group_name):
-            if service_base_name == storage_account.tags["SBN"]:
+            if "SBN" in storage_account.tags and service_base_name == storage_account.tags["SBN"]:
                 AzureActions.remove_storage_account(resource_group_name, storage_account.name)
                 print("Storage account {} has been terminated".format(storage_account.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove storage accounts", str(err))
+        datalab.fab.append_result("Failed to remove storage accounts", str(err))
         sys.exit(1)
 
     print("Removing Data Lake Store")
     try:
         for datalake in AzureMeta.list_datalakes(resource_group_name):
-            if service_base_name == datalake.tags["SBN"]:
+            if "SBN" in datalake.tags and service_base_name == datalake.tags["SBN"]:
                 AzureActions.delete_datalake_store(resource_group_name, datalake.name)
                 print("Data Lake Store {} has been terminated".format(datalake.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove Data Lake", str(err))
+        datalab.fab.append_result("Failed to remove Data Lake", str(err))
         sys.exit(1)
 
     print("Removing images")
     try:
         for image in AzureMeta.list_images():
-            if service_base_name == image.tags["SBN"]:
+            if "SBN" in image.tags and service_base_name == image.tags["SBN"]:
                 AzureActions.remove_image(resource_group_name, image.name)
                 print("Image {} has been removed".format(image.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove images", str(err))
+        datalab.fab.append_result("Failed to remove images", str(err))
         sys.exit(1)
 
     print("Removing security groups")
     try:
         for sg in AzureMeta.network_client.network_security_groups.list(resource_group_name):
-            if service_base_name == sg.tags["SBN"]:
+            if "SBN" in sg.tags and service_base_name == sg.tags["SBN"]:
                 AzureActions.remove_security_group(resource_group_name, sg.name)
                 print("Security group {} has been terminated".format(sg.name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove security groups", str(err))
+        datalab.fab.append_result("Failed to remove security groups", str(err))
+        sys.exit(1)
+
+    if 'azure_vpc_name' in os.environ:
+        print("Removing subnets in predefined VPC")
+        try:
+            for subnet in AzureMeta.list_subnets(resource_group_name, os.environ['azure_vpc_name']):
+                subnet_name = str(subnet)[str(subnet).find("'name': '") + 9 : str(subnet).find("', 'etag':")]
+                if service_base_name in subnet_name:
+                    AzureActions.remove_subnet(resource_group_name, os.environ['azure_vpc_name'], subnet_name)
+                    print("Subnet {} has been removed from VPC {}".format(subnet_name, os.environ['azure_vpc_name']))
+        except Exception as err:
+            datalab.fab.append_result("Failed to remove subnets in predefined VPC", str(err))
+            sys.exit(1)
+
+    print("Removing rules in predefined edge security group")
+    try:
+        if 'azure_edge_security_group_name' in os.environ:
+            for rule in AzureMeta.list_security_group_rules(resource_group_name, os.environ['azure_edge_security_group_name']):
+                rule_name = str(rule)[str(rule).find("'name': '") + 9 : str(rule).find("', 'etag':")]
+                if service_base_name in rule_name:
+                    AzureActions.remove_security_rules(os.environ['azure_edge_security_group_name'],
+                                               resource_group_name, rule_name)
+                    print("Rule {} is removed".format(rule_name))
+    except Exception as err:
+        datalab.fab.append_result("Failed to remove rules in predefined edge security group", str(err))
         sys.exit(1)
 
     print("Removing VPC")
@@ -120,16 +145,16 @@
             AzureActions.remove_vpc(resource_group_name, vpc_name)
             print("VPC {} has been terminated".format(vpc_name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove VPC", str(err))
+        datalab.fab.append_result("Failed to remove VPC", str(err))
         sys.exit(1)
 
     print("Removing Resource Group")
     try:
-        if AzureMeta.get_resource_group(resource_group_name):
+        if AzureMeta.get_resource_group(resource_group_name) and resource_group_name == '{}-resource-group'.format(service_base_name):
             AzureActions.remove_resource_group(resource_group_name, region)
-            print("Resource group {} has been terminated".format(vpc_name))
+            print("Resource group {} has been terminated".format(resource_group_name))
     except Exception as err:
-        dlab.fab.append_result("Failed to remove resource group", str(err))
+        datalab.fab.append_result("Failed to remove resource group", str(err))
         sys.exit(1)
 
 
@@ -140,14 +165,14 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    AzureMeta = dlab.meta_lib.AzureMeta()
-    AzureActions = dlab.actions_lib.AzureActions()
+    AzureMeta = datalab.meta_lib.AzureMeta()
+    AzureActions = datalab.actions_lib.AzureActions()
     print('Generating infrastructure names and tags')
     ssn_conf = dict()
-    ssn_conf['service_base_name'] = dlab.fab.replace_multi_symbols(os.environ['conf_service_base_name'][:20],
-                                                                   '-', True)
+    ssn_conf['service_base_name'] = datalab.fab.replace_multi_symbols(os.environ['conf_service_base_name'][:20],
+                                                                      '-', True)
     ssn_conf['resource_group_name'] = os.environ.get(
-            'azure_source_resource_group_name', '{}-resource-group'.format(ssn_conf['service_base_name']))
+        'azure_resource_group_name', '{}-resource-group'.format(ssn_conf['service_base_name']))
     ssn_conf['region'] = os.environ['azure_region']
     ssn_conf['vpc_name'] = os.environ['azure_vpc_name']
 
@@ -161,7 +186,7 @@
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate ssn.", str(err))
+        datalab.fab.append_result("Failed to terminate ssn.", str(err))
         sys.exit(1)
 
     try:
@@ -171,5 +196,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/tensor_configure.py b/infrastructure-provisioning/src/general/scripts/azure/tensor_configure.py
index 914f686..137f355 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/tensor_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/tensor_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,17 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import traceback
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -43,8 +42,8 @@
                         filename=local_log_filepath)
 
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = os.environ['exploratory_name']
@@ -94,7 +93,7 @@
         notebook_config['security_group_name'] = '{}-{}-{}-nb-sg'.format(notebook_config['service_base_name'],
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['tags'] = {"Name": notebook_config['instance_name'],
                                    "SBN": notebook_config['service_base_name'],
                                    "User": notebook_config['user_name'],
@@ -131,24 +130,24 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem",
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -159,14 +158,14 @@
         additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -174,16 +173,16 @@
     try:
         logging.info('[INSTALLING PREREQUISITES TO TENSOR NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO TENSOR NOTEBOOK INSTANCE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['azure_region'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['azure_region'],
                    edge_instance_private_hostname)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -195,17 +194,17 @@
                  "--region {2} --os_user {3} " \
                  "--ip_address {4} --exploratory_name {5} --edge_ip {6}" \
                  .format(instance_hostname, keyfile_name,
-                         os.environ['azure_region'], notebook_config['dlab_ssh_user'],
+                         os.environ['azure_region'], notebook_config['datalab_ssh_user'],
                          notebook_config['ip_address'], notebook_config['exploratory_name'], edge_hostname)
         try:
-            local("~/scripts/{}.py {}".format('configure_tensor_node', params))
-            dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
+            subprocess.run("~/scripts/{}.py {}".format('configure_tensor_node', params), shell=True, check=True)
+            datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                   os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure TensorFlow.", str(err))
+        datalab.fab.append_result("Failed to configure TensorFlow.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -215,14 +214,14 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -230,31 +229,31 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --resource_group_name {} --notebook_name {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['resource_group_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -265,15 +264,15 @@
                                         notebook_config['expected_image_name'])
             if image == '':
                 print("Looks like it's first time we configure notebook server. Creating image.")
-                dlab.actions_lib.prepare_vm_for_image(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                      keyfile_name)
+                datalab.actions_lib.prepare_vm_for_image(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                         keyfile_name)
                 AzureActions.create_image_from_instance(notebook_config['resource_group_name'],
                                                         notebook_config['instance_name'],
                                                         os.environ['azure_region'],
                                                         notebook_config['expected_image_name'],
                                                         json.dumps(notebook_config['image_tags']))
                 print("Image was successfully created.")
-                local("~/scripts/{}.py".format('common_prepare_notebook'))
+                subprocess.run("~/scripts/{}.py".format('common_prepare_notebook'), shell=True, check=True)
                 instance_running = False
                 while not instance_running:
                     if AzureMeta.get_instance_status(notebook_config['resource_group_name'],
@@ -281,17 +280,17 @@
                         instance_running = True
                 instance_hostname = AzureMeta.get_private_ip_address(notebook_config['resource_group_name'],
                                                                      notebook_config['instance_name'])
-                dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                    keyfile_name)
-                dlab.fab.set_git_proxy(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name,
-                                       'http://{}:3128'.format(edge_instance_private_hostname))
+                datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                       keyfile_name)
+                datalab.fab.set_git_proxy(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name,
+                                          'http://{}:3128'.format(edge_instance_private_hostname))
                 additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
                 params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
                     .format(instance_hostname, notebook_config['instance_name'], keyfile_name,
-                            json.dumps(additional_config), notebook_config['dlab_ssh_user'])
-                local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+                            json.dumps(additional_config), notebook_config['datalab_ssh_user'])
+                subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
             sys.exit(1)
 
@@ -310,17 +309,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_private_hostname,
                     keyfile_name,
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'jupyter',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -350,7 +349,7 @@
         print("Jupyter URL: {}".format(jupyter_ip_url))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"ip": ip_address,
@@ -376,6 +375,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information.", str(err))
+        datalab.fab.append_result("Failed to generate output information.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/azure/zeppelin_configure.py b/infrastructure-provisioning/src/general/scripts/azure/zeppelin_configure.py
index 91eb529..b4a29b4 100644
--- a/infrastructure-provisioning/src/general/scripts/azure/zeppelin_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/azure/zeppelin_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,17 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import traceback
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -42,8 +41,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        AzureMeta = dlab.meta_lib.AzureMeta()
-        AzureActions = dlab.actions_lib.AzureActions()
+        AzureMeta = datalab.meta_lib.AzureMeta()
+        AzureActions = datalab.actions_lib.AzureActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = os.environ['exploratory_name']
@@ -93,7 +92,7 @@
         notebook_config['security_group_name'] = '{}-{}-{}-nb-sg'.format(notebook_config['service_base_name'],
                                                                          notebook_config['project_name'],
                                                                          notebook_config['endpoint_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['tags'] = {"Name": notebook_config['instance_name'],
                                    "SBN": notebook_config['service_base_name'],
                                    "User": notebook_config['user_name'],
@@ -130,24 +129,24 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem",
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -158,14 +157,14 @@
         additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result('Unable to configure proxy on zeppelin notebook. Exception: ' + str(err))
+        datalab.fab.append_result('Unable to configure proxy on zeppelin notebook. Exception: ' + str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -174,15 +173,15 @@
         logging.info('[INSTALLING PREREQUISITES TO ZEPPELIN NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO ZEPPELIN NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}" \
-            .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'], os.environ['azure_region'],
+            .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'], os.environ['azure_region'],
                     edge_instance_private_hostname)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -204,21 +203,21 @@
                  "--r_mirror {14} --endpoint_url {15} " \
                  "--ip_address {16} --exploratory_name {17} --edge_ip {18} " \
             .format(instance_hostname, notebook_config['instance_name'], keyfile_name, os.environ['azure_region'],
-                    json.dumps(additional_config), notebook_config['dlab_ssh_user'],
+                    json.dumps(additional_config), notebook_config['datalab_ssh_user'],
                     os.environ['notebook_spark_version'], os.environ['notebook_hadoop_version'],
                     edge_instance_private_hostname, '3128', os.environ['notebook_zeppelin_version'],
                     os.environ['notebook_scala_version'], os.environ['notebook_livy_version'],
                     os.environ['notebook_multiple_clusters'], os.environ['notebook_r_mirror'], 'null',
                     notebook_config['ip_address'], notebook_config['exploratory_name'], edge_hostname)
         try:
-            local("~/scripts/{}.py {}".format('configure_zeppelin_node', params))
-            dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
+            subprocess.run("~/scripts/{}.py {}".format('configure_zeppelin_node', params), shell=True, check=True)
+            datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                   os.environ['conf_key_dir'] + os.environ['conf_key_name'] + ".pem")
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure zeppelin.", str(err))
+        datalab.fab.append_result("Failed to configure zeppelin.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -228,14 +227,14 @@
         additional_config = {"user_keyname": notebook_config['user_keyname'],
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
-            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+            instance_hostname, keyfile_name, json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -243,31 +242,31 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name)
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name)
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
     try:
         logging.info('[POST CONFIGURING PROCESS]')
         print('[POST CONFIGURING PROCESS')
-        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None']:
+        if notebook_config['notebook_image_name'] not in [notebook_config['expected_image_name'], 'None', '']:
             params = "--hostname {} --keyfile {} --os_user {} --resource_group_name {} --notebook_name {}" \
-                .format(instance_hostname, keyfile_name, notebook_config['dlab_ssh_user'],
+                .format(instance_hostname, keyfile_name, notebook_config['datalab_ssh_user'],
                         notebook_config['resource_group_name'], notebook_config['instance_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_remove_remote_kernels', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_remove_remote_kernels', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to post configuring instance.", str(err))
+        datalab.fab.append_result("Failed to post configuring instance.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -278,15 +277,15 @@
                                         notebook_config['expected_image_name'])
             if image == '':
                 print("Looks like it's first time we configure notebook server. Creating image.")
-                dlab.actions_lib.prepare_vm_for_image(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                      keyfile_name)
+                datalab.actions_lib.prepare_vm_for_image(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                         keyfile_name)
                 AzureActions.create_image_from_instance(notebook_config['resource_group_name'],
                                                         notebook_config['instance_name'],
                                                         os.environ['azure_region'],
                                                         notebook_config['expected_image_name'],
                                                         json.dumps(notebook_config['image_tags']))
                 print("Image was successfully created.")
-                local("~/scripts/{}.py".format('common_prepare_notebook'))
+                subprocess.run("~/scripts/{}.py".format('common_prepare_notebook'), shell=True, check=True)
                 instance_running = False
                 while not instance_running:
                     if AzureMeta.get_instance_status(notebook_config['resource_group_name'],
@@ -294,17 +293,17 @@
                         instance_running = True
                 instance_hostname = AzureMeta.get_private_ip_address(notebook_config['resource_group_name'],
                                                                      notebook_config['instance_name'])
-                dlab.actions_lib.remount_azure_disk(True, notebook_config['dlab_ssh_user'], instance_hostname,
-                                                    keyfile_name)
-                dlab.fab.set_git_proxy(notebook_config['dlab_ssh_user'], instance_hostname, keyfile_name,
-                                       'http://{}:3128'.format(edge_instance_private_hostname))
+                datalab.actions_lib.remount_azure_disk(True, notebook_config['datalab_ssh_user'], instance_hostname,
+                                                       keyfile_name)
+                datalab.fab.set_git_proxy(notebook_config['datalab_ssh_user'], instance_hostname, keyfile_name,
+                                          'http://{}:3128'.format(edge_instance_private_hostname))
                 additional_config = {"proxy_host": edge_instance_private_hostname, "proxy_port": "3128"}
                 params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
                     .format(instance_hostname, notebook_config['instance_name'], keyfile_name,
-                            json.dumps(additional_config), notebook_config['dlab_ssh_user'])
-                local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+                            json.dumps(additional_config), notebook_config['datalab_ssh_user'])
+                subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
             sys.exit(1)
 
@@ -323,17 +322,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_private_hostname,
                     keyfile_name,
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'zeppelin',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
 
@@ -358,7 +357,7 @@
         print("Zeppelin URL: {}".format(zeppelin_ip_url))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.
-              format(notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+              format(notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"ip": ip_address,
@@ -379,6 +378,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information.", str(err))
+        datalab.fab.append_result("Failed to generate output information.", str(err))
         AzureActions.remove_instance(notebook_config['resource_group_name'], notebook_config['instance_name'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_collect_data.py b/infrastructure-provisioning/src/general/scripts/gcp/common_collect_data.py
index a2a6bd4..02a3dcb 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_collect_data.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_collect_data.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,16 +22,14 @@
 # ******************************************************************************
 
 import argparse
-import json
-import datetime
-from fabric.api import *
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-from dlab.fab import *
-import traceback
-import sys
 import ast
-
+import json
+import sys
+import traceback
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--list_resources', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_create_bucket.py b/infrastructure-provisioning/src/general/scripts/gcp/common_create_bucket.py
index 1ac223f..061746a 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_create_bucket.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_create_bucket.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -23,17 +23,15 @@
 
 import argparse
 import json
-from dlab.actions_lib import *
-from dlab.meta_lib import *
 import sys
-
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket_name', type=str, default='')
 parser.add_argument('--tags', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     if args.bucket_name:
         if GCPMeta().get_bucket(args.bucket_name):
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_create_firewall.py b/infrastructure-provisioning/src/general/scripts/gcp/common_create_firewall.py
index 0c11dcf..aa126c5 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_create_firewall.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_create_firewall.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,19 +21,16 @@
 #
 # ******************************************************************************
 
-import json
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
+import json
 import sys
-from botocore.exceptions import ClientError
-
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--firewall', type=str)
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     firewall = json.loads(args.firewall)
     if firewall:
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_create_instance.py b/infrastructure-provisioning/src/general/scripts/gcp/common_create_instance.py
index 271b609..b62f882 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_create_instance.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_create_instance.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -23,10 +23,9 @@
 
 import argparse
 import json
-from dlab.actions_lib import *
-from dlab.meta_lib import *
 import sys
-
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--instance_name', type=str, default='')
@@ -40,12 +39,13 @@
 parser.add_argument('--service_account_name', type=str, default='')
 parser.add_argument('--image_name', type=str, default='')
 parser.add_argument('--secondary_image_name', type=str, default='')
-parser.add_argument('--primary_disk_size', type=str, default='12')
+parser.add_argument('--primary_disk_size', type=str, default='20')
 parser.add_argument('--secondary_disk_size', type=str, default='30')
 parser.add_argument('--instance_class', type=str, default='')
 parser.add_argument('--static_ip', type=str, default='')
 parser.add_argument('--labels', type=str, default='{"empty":"string"}')
 parser.add_argument('--gpu_accelerator_type', type=str, default='None')
+parser.add_argument('--gpu_accelerator_count', type=str, default='None')
 parser.add_argument('--network_tag', type=str, default='')
 parser.add_argument('--cluster_name', type=str, default='')
 parser.add_argument('--service_base_name', type=str, default='')
@@ -63,7 +63,8 @@
                                          args.instance_size, args.ssh_key_path, args.initial_user, args.image_name,
                                          args.secondary_image_name, args.service_account_name, args.instance_class,
                                          args.network_tag, json.loads(args.labels), args.static_ip,
-                                         args.primary_disk_size, args.secondary_disk_size, args.gpu_accelerator_type)
+                                         args.primary_disk_size, args.secondary_disk_size, args.gpu_accelerator_type,
+                                         args.gpu_accelerator_count)
     else:
         parser.print_help()
         sys.exit(2)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_create_nat_route.py b/infrastructure-provisioning/src/general/scripts/gcp/common_create_nat_route.py
new file mode 100644
index 0000000..d9a5f0b
--- /dev/null
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_create_nat_route.py
@@ -0,0 +1,54 @@
+#!/usr/bin/python3
+
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+import argparse
+import sys
+from datalab.actions_lib import *
+from datalab.meta_lib import *
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--nat_route_name', type=str)
+parser.add_argument('--vpc', type=str)
+parser.add_argument('--tag', type=str)
+parser.add_argument('--edge_instance', type=str)
+args = parser.parse_args()
+
+if __name__ == "__main__":
+    if GCPMeta().get_route(args.nat_route_name):
+        print("REQUESTED ROUTE {} ALREADY EXISTS".format(args.nat_route_name))
+    else:
+        print("Creating NAT ROUTE {}".format(args.nat_route_name))
+        params = {
+            "destRange": "0.0.0.0/0",
+            "name": args.nat_route_name,
+            "network": args.vpc,
+            "priority": 0,
+            "tags": [
+                args.tag
+            ],
+            "nextHopInstance": args.edge_instance
+        }
+        GCPActions().create_nat_route(params)
+else:
+    parser.print_help()
+    sys.exit(2)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_create_notebook_image.py b/infrastructure-provisioning/src/general/scripts/gcp/common_create_notebook_image.py
new file mode 100644
index 0000000..f7ba4fd
--- /dev/null
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_create_notebook_image.py
@@ -0,0 +1,90 @@
+#!/usr/bin/python3
+
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
+import json
+import os
+import sys
+
+if __name__ == "__main__":
+    try:
+        image_conf = dict()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
+        try:
+            image_conf['exploratory_name'] = (os.environ['exploratory_name']).replace('_', '-').lower()
+        except:
+            image_conf['exploratory_name'] = ''
+        image_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
+            os.environ['conf_service_base_name'][:20], '-', True).lower()
+        image_conf['endpoint_name'] = (os.environ['endpoint_name']).replace('_', '-').lower()
+        image_conf['endpoint_tag'] = image_conf['endpoint_name']
+        image_conf['project_name'] = os.environ['project_name'].lower()
+        image_conf['project_tag'] = image_conf['project_name']
+        image_conf['instance_name'] = os.environ['notebook_instance_name']
+        image_conf['instance_tag'] = '{}-tag'.format(image_conf['service_base_name'])
+        image_conf['application'] = os.environ['application']
+        image_conf['image_name'] = os.environ['notebook_image_name'].replace('_', '-').lower()
+        image_conf['expected_primary_image_name'] = '{}-{}-{}-{}-primary-image-{}'.format(
+            image_conf['service_base_name'], image_conf['project_name'], image_conf['endpoint_name'],
+            os.environ['application'], image_conf['image_name'])
+        image_conf['expected_secondary_image_name'] = '{}-{}-{}-{}-secondary-image-{}'.format(
+            image_conf['service_base_name'], image_conf['project_name'], image_conf['endpoint_name'],
+            os.environ['application'], image_conf['image_name'])
+        image_conf['image_labels'] = {"sbn": image_conf['service_base_name'],
+                                           "endpoint_tag": image_conf['endpoint_tag'],
+                                           "project_tag": image_conf['project_tag'],
+                                           "image": image_conf['image_name'],
+                                           os.environ['conf_billing_tag_key']: os.environ['conf_billing_tag_value']}
+        image_conf['instance_name'] = '{0}-{1}-{2}-nb-{3}'.format(image_conf['service_base_name'],
+                                                                       image_conf['project_name'],
+                                                                       image_conf['endpoint_name'],
+                                                                       image_conf['exploratory_name'])
+        image_conf['zone'] = os.environ['gcp_zone']
+        print('[CREATING IMAGE]')
+        primary_image_id = GCPMeta.get_image_by_name(image_conf['expected_primary_image_name'])
+        if primary_image_id == '':
+            image_id_list = GCPActions.create_image_from_instance_disks(
+                image_conf['expected_primary_image_name'], image_conf['expected_secondary_image_name'],
+                image_conf['instance_name'], image_conf['zone'], image_conf['image_labels'])
+            if image_id_list and image_id_list[0] != '':
+                print("Image of primary disk was successfully created. It's ID is {}".format(image_id_list[0]))
+            else:
+                print("Looks like another image creating operation for your template have been started a "
+                      "moment ago.")
+            if image_id_list and image_id_list[1] != '':
+                print("Image of secondary disk was successfully created. It's ID is {}".format(image_id_list[1]))
+
+            with open("/root/result.json", 'w') as result:
+                res = {"primary_image_name": image_conf['expected_primary_image_name'],
+                       "secondary_image_name": image_conf['expected_secondary_image_name'],
+                       "project_name": image_conf['project_name'],
+                       "application": image_conf['application'],
+                       "status": "created",
+                       "Action": "Create image from notebook"}
+                result.write(json.dumps(res))
+    except Exception as err:
+        datalab.fab.append_result("Failed to create image from notebook", str(err))
+        sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_create_service_account.py b/infrastructure-provisioning/src/general/scripts/gcp/common_create_service_account.py
index ce02d6f..d1e9a55 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_create_service_account.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_create_service_account.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,9 +22,9 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
 import sys
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--service_account_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_create_subnet.py b/infrastructure-provisioning/src/general/scripts/gcp/common_create_subnet.py
index eacf2a1..194e108 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_create_subnet.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_create_subnet.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,13 +22,10 @@
 # ******************************************************************************
 
 import argparse
-import json
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-import sys
-import boto3
 import ipaddress
-
+import sys
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--subnet_name', type=str, default='')
@@ -62,12 +59,12 @@
         sorted_subnets_cidr = sorted(subnets_cidr, key=sortkey)
 
         if not empty_vpc:
-            last_ip = int(ipaddress.IPv4Address(sorted_subnets_cidr[0].split('/')[0].decode("utf-8")))
+            last_ip = int(ipaddress.IPv4Address(sorted_subnets_cidr[0].split('/')[0]))
         else:
-            last_ip = int(ipaddress.IPv4Address(args.vpc_cidr.split('/')[0].decode("utf-8")))
+            last_ip = int(ipaddress.IPv4Address(args.vpc_cidr.split('/')[0]))
         previous_subnet_size = private_subnet_size
         for cidr in sorted_subnets_cidr:
-            first_ip = int(ipaddress.IPv4Address(cidr.split('/')[0].decode("utf-8")))
+            first_ip = int(ipaddress.IPv4Address(cidr.split('/')[0]))
             if first_ip - last_ip < private_subnet_size or previous_subnet_size < private_subnet_size:
                 subnet_size = ipaddress.ip_network(u'{}'.format(cidr)).num_addresses
                 last_ip = first_ip + subnet_size - 1
@@ -75,21 +72,21 @@
             else:
                 break
 
-        dlab_subnet_cidr = ''
+        datalab_subnet_cidr = ''
         if empty_vpc:
-            dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip), args.prefix)
+            datalab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip), args.prefix)
         else:
             if previous_subnet_size < private_subnet_size:
                 while True:
                     try:
-                        dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix)
-                        ipaddress.ip_network(dlab_subnet_cidr.decode('utf-8'))
+                        datalab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix)
+                        ipaddress.ip_network(datalab_subnet_cidr)
                         break
                     except ValueError:
                         last_ip = last_ip + 2
                         continue
             else:
-                dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix)
+                datalab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix)
     else:
         pre_defined_subnet_list = []
         subnet_cidr = args.user_subnets_range.split('-')[0].replace(' ', '')
@@ -111,14 +108,14 @@
             print("There is no available subnet to create. Aborting...")
             sys.exit(1)
         else:
-            dlab_subnet_cidr = available_subnets[0]
+            datalab_subnet_cidr = available_subnets[0]
 
     if args.subnet_name != '':
         if GCPMeta().get_subnet(args.subnet_name, args.region):
             print("REQUESTED SUBNET {} ALREADY EXISTS".format(args.subnet_name))
         else:
             print("Creating Subnet {}".format(args.subnet_name))
-            GCPActions().create_subnet(args.subnet_name, dlab_subnet_cidr, args.vpc_selflink, args.region)
+            GCPActions().create_subnet(args.subnet_name, datalab_subnet_cidr, args.vpc_selflink, args.region)
     else:
         print("Subnet name can't be empty")
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_download_git_certfile.py b/infrastructure-provisioning/src/general/scripts/gcp/common_download_git_certfile.py
index 6ce9448..c2a3644 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_download_git_certfile.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_download_git_certfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,10 +22,9 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-from dlab.actions_lib import *
 import os
-
+from datalab.actions_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--keyfile', type=str, default='')
@@ -33,20 +32,18 @@
 parser.add_argument('--os_user', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env['connection_attempts'] = 100
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
 
     bucket_name = ('{0}-{1}-{2}-bucket'.format(os.environ['conf_service_base_name'], os.environ['project_name'],
                                                os.environ['endpoint_name'])).lower().replace('_', '-')
     gitlab_certfile = os.environ['conf_gitlab_certfile']
     if GCPActions().get_gitlab_cert(bucket_name, gitlab_certfile):
-        put(gitlab_certfile, gitlab_certfile)
-        sudo('chown root:root {}'.format(gitlab_certfile))
+        conn.put(gitlab_certfile, gitlab_certfile)
+        conn.sudo('chown root:root {}'.format(gitlab_certfile))
         print('{} has been downloaded'.format(gitlab_certfile))
     else:
         print('There is no {} to download'.format(gitlab_certfile))
+
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_install_gpu.py b/infrastructure-provisioning/src/general/scripts/gcp/common_install_gpu.py
new file mode 100644
index 0000000..733236d
--- /dev/null
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_install_gpu.py
@@ -0,0 +1,47 @@
+#!/usr/bin/python3
+
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+import argparse
+import os
+import sys
+from datalab.fab import *
+from datalab.notebook_lib import *
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--hostname', type=str, default='')
+parser.add_argument('--keyfile', type=str, default='')
+parser.add_argument('--os_user', type=str, default='')
+args = parser.parse_args()
+
+##############
+# Run script #
+##############
+if __name__ == "__main__":
+    print("Configure connections")
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
+
+    print('Installing GPU drivers')
+    install_nvidia_drivers(args.os_user)
+
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_notebook_configure_dataengine-service.py b/infrastructure-provisioning/src/general/scripts/gcp/common_notebook_configure_dataengine-service.py
index f39c138..a79a4c4 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_notebook_configure_dataengine-service.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_notebook_configure_dataengine-service.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
+import sys
 import traceback
-import uuid
-from fabric.api import *
+import subprocess
+from fabric import *
 
 
 def clear_resources():
@@ -49,8 +49,8 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print('Generating infrastructure names and tags')
     notebook_config = dict()
     notebook_config['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -75,7 +75,7 @@
     else:
         application = os.environ['application']
 
-    additional_tags = os.environ['tags'].replace("': u'", ":").replace("', u'", ",").replace("{u'", "" ).replace(
+    additional_tags = os.environ['tags'].replace("': '", ":").replace("', '", ",").replace("{'", "" ).replace(
         "'}", "").lower()
 
     notebook_config['cluster_labels'] = {
@@ -83,7 +83,7 @@
         "name": notebook_config['cluster_name'],
         "sbn": notebook_config['service_base_name'],
         "notebook_name": os.environ['notebook_instance_name'],
-        "product": "dlab",
+        "product": "datalab",
         "computational_name": (os.environ['computational_name'].replace('_', '-').lower())
     }
 
@@ -107,14 +107,14 @@
                     edge_instance_hostname, '3128', os.environ['notebook_scala_version'], os.environ['application'],
                     os.environ['conf_pypi_mirror'])
         try:
-            local("~/scripts/{}_{}.py {}".format(application, 'install_dataengine-service_kernels', params))
+            subprocess.run("~/scripts/{}_{}.py {}".format(application, 'install_dataengine-service_kernels', params), shell=True, check=True)
             GCPActions.update_dataproc_cluster(notebook_config['cluster_name'], notebook_config['cluster_labels'])
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed installing Dataproc kernels.", str(err))
+        datalab.fab.append_result("Failed installing Dataproc kernels.", str(err))
         sys.exit(1)
 
     try:
@@ -127,12 +127,12 @@
                     notebook_config['key_path'],
                     os.environ['conf_os_user'])
         try:
-            local("~/scripts/{0}.py {1}".format('common_configure_spark', params))
+            subprocess.run("~/scripts/{0}.py {1}".format('common_configure_spark', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure Spark.", str(err))
+        datalab.fab.append_result("Failed to configure Spark.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -144,6 +144,6 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_notebook_configure_dataengine.py b/infrastructure-provisioning/src/general/scripts/gcp/common_notebook_configure_dataengine.py
index 08c4c02..c6e2d7a 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_notebook_configure_dataengine.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_notebook_configure_dataengine.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import logging
 import os
-import uuid
-from fabric.api import *
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 
 def clear_resources():
@@ -49,8 +49,8 @@
                         filename=local_log_filepath)
 
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         # generating variables dictionary
         print('Generating infrastructure names and tags')
         notebook_config = dict()
@@ -76,19 +76,19 @@
         notebook_config['slave_node_name'] = notebook_config['cluster_name'] + '-s'
         notebook_config['notebook_name'] = os.environ['notebook_instance_name']
         notebook_config['key_path'] = '{}/{}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['instance_count'] = int(os.environ['dataengine_instance_count'])
         try:
             notebook_config['spark_master_ip'] = GCPMeta.get_private_ip_address(notebook_config['master_node_name'])
             notebook_config['notebook_ip'] = GCPMeta.get_private_ip_address(notebook_config['notebook_name'])
         except Exception as err:
-            dlab.fab.append_result("Failed to get instance IP address", str(err))
+            datalab.fab.append_result("Failed to get instance IP address", str(err))
             sys.exit(1)
         notebook_config['spark_master_url'] = 'spark://{}:7077'.format(notebook_config['spark_master_ip'])
 
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to generate infrastructure names", str(err))
+        datalab.fab.append_result("Failed to generate infrastructure names", str(err))
         sys.exit(1)
 
     try:
@@ -97,17 +97,17 @@
         params = "--cluster_name {0} --spark_version {1} --hadoop_version {2} --os_user {3} --spark_master {4}" \
                  " --keyfile {5} --notebook_ip {6} --spark_master_ip {7}".\
             format(notebook_config['cluster_name'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], notebook_config['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], notebook_config['datalab_ssh_user'],
                    notebook_config['spark_master_url'], notebook_config['key_path'],
                    notebook_config['notebook_ip'], notebook_config['spark_master_ip'])
         try:
-            local("~/scripts/{}_{}.py {}".format(os.environ['application'], 'install_dataengine_kernels', params))
+            subprocess.run("~/scripts/{}_{}.py {}".format(os.environ['application'], 'install_dataengine_kernels', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed installing Dataengine kernels.", str(err))
+        datalab.fab.append_result("Failed installing Dataengine kernels.", str(err))
         sys.exit(1)
 
     try:
@@ -119,16 +119,16 @@
                  "--cluster_name {3}" \
             .format(notebook_config['notebook_ip'],
                     notebook_config['key_path'],
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     notebook_config['cluster_name'])
         try:
-            local("~/scripts/{0}.py {1}".format('common_configure_spark', params))
+            subprocess.run("~/scripts/{0}.py {1}".format('common_configure_spark', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure Spark.", str(err))
+        datalab.fab.append_result("Failed to configure Spark.", str(err))
         sys.exit(1)
 
     try:
@@ -138,6 +138,6 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_prepare_notebook.py b/infrastructure-provisioning/src/general/scripts/gcp/common_prepare_notebook.py
index c83208b..96d1a3b 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_prepare_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_prepare_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
+import logging
 import os
+import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -41,8 +41,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         print('Generating infrastructure names and tags')
         notebook_config = dict()
         notebook_config['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -61,9 +61,10 @@
             logging.info('ERROR: Edge node is unavailable! Aborting...')
             print('ERROR: Edge node is unavailable! Aborting...')
             ssn_hostname = GCPMeta.get_private_ip_address(notebook_config['service_base_name'] + '-ssn')
-            dlab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_dlab_path'], os.environ['conf_os_user'],
-                                         ssn_hostname)
-            dlab.fab.append_result("Edge node is unavailable")
+            datalab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_datalab_path'],
+                                            os.environ['conf_os_user'],
+                                            ssn_hostname)
+            datalab.fab.append_result("Edge node is unavailable")
             sys.exit(1)
 
         try:
@@ -96,7 +97,7 @@
                                                                        notebook_config['project_name'],
                                                                        notebook_config['endpoint_name'],
                                                                        notebook_config['exploratory_name'])
-        notebook_config['primary_disk_size'] = (lambda x: '30' if x == 'deeplearning' else '12')(
+        notebook_config['primary_disk_size'] = (lambda x: '60' if x == 'deeplearning' else '20')(
             os.environ['application'])
         notebook_config['secondary_disk_size'] = os.environ['notebook_disk_size']
 
@@ -104,31 +105,48 @@
         if notebook_config['shared_image_enabled'] == 'false':
             notebook_config['expected_primary_image_name'] = '{}-{}-{}-{}-primary-image'.format(
                 notebook_config['service_base_name'], notebook_config['project_name'], notebook_config['endpoint_tag'],
-                os.environ['application'])
+                os.environ['application']).lower()
             notebook_config['expected_secondary_image_name'] = '{}-{}-{}-{}-secondary-image'.format(
                 notebook_config['service_base_name'], notebook_config['project_name'], notebook_config['endpoint_tag'],
-                os.environ['application'])
+                os.environ['application']).lower()
         else:
             notebook_config['expected_primary_image_name'] = '{}-{}-{}-primary-image'.format(
-                notebook_config['service_base_name'], notebook_config['endpoint_name'], os.environ['application'])
+                notebook_config['service_base_name'], notebook_config['endpoint_name'], os.environ['application']).lower()
             notebook_config['expected_secondary_image_name'] = '{}-{}-{}-secondary-image'.format(
-                notebook_config['service_base_name'], notebook_config['endpoint_name'], os.environ['application'])
-        notebook_config['notebook_primary_image_name'] = \
-            (lambda x: os.environ['notebook_primary_image_name'] if x != 'None'
-             else notebook_config['expected_primary_image_name'])(str(os.environ.get('notebook_primary_image_name')))
+                notebook_config['service_base_name'], notebook_config['endpoint_name'], os.environ['application']).lower()
+        notebook_config['notebook_primary_image_name'] = (lambda x: '{0}-{1}-{2}-{3}-primary-image-{4}'.format(
+            notebook_config['service_base_name'], notebook_config['project_name'], notebook_config['endpoint_name'],
+            os.environ['application'], os.environ['notebook_image_name'].replace('_', '-').lower()) if (x != 'None' and x != '')
+            else notebook_config['expected_primary_image_name'])(str(os.environ.get('notebook_image_name')))
         print('Searching pre-configured images')
-        notebook_config['primary_image_name'] = GCPMeta.get_image_by_name(
-            notebook_config['expected_primary_image_name'])
+
+        deeplearning_ami = 'false'
+
+        if os.environ['conf_deeplearning_cloud_ami'] == 'true' and os.environ['application'] == 'deeplearning':
+            notebook_config['primary_image_name'] = GCPMeta.get_deeplearning_image_by_family(os.environ['notebook_image_name'])
+            if notebook_config['primary_image_name']:
+                deeplearning_ami = 'true'
+        if deeplearning_ami != 'true':
+            notebook_config['primary_image_name'] = GCPMeta.get_image_by_name(notebook_config['notebook_primary_image_name'])
         if notebook_config['primary_image_name'] == '':
             notebook_config['primary_image_name'] = os.environ['gcp_{}_image_name'.format(os.environ['conf_os_family'])]
         else:
             print('Pre-configured primary image found. Using: {}'.format(
                 notebook_config['primary_image_name'].get('name')))
-            notebook_config['primary_image_name'] = 'global/images/{}'.format(
+            if deeplearning_ami == 'true':
+                notebook_config['primary_image_name'] = 'projects/deeplearning-platform-release/global/images/{}'.format(
+                    notebook_config['primary_image_name'].get('name'))
+            else:
+                notebook_config['primary_image_name'] = 'global/images/{}'.format(
                 notebook_config['primary_image_name'].get('name'))
-
+        notebook_config['notebook_secondary_image_name'] = (lambda x: '{0}-{1}-{2}-{3}-secondary-image-{4}'.format(
+            notebook_config['service_base_name'], notebook_config['project_name'], notebook_config['endpoint_name'],
+            os.environ['application'], os.environ['notebook_image_name'].replace('_', '-').lower()) if (x != 'None' and x != '')
+            else notebook_config['expected_secondary_image_name'])(str(os.environ.get('notebook_image_name')))
+        if notebook_config['notebook_secondary_image_name'][:63].endswith('-'):
+            notebook_config['notebook_secondary_image_name'] = notebook_config['notebook_secondary_image_name'][:63][:-1]
         notebook_config['secondary_image_name'] = GCPMeta.get_image_by_name(
-            notebook_config['expected_secondary_image_name'])
+            notebook_config['notebook_secondary_image_name'][:63])
         if notebook_config['secondary_image_name'] == '':
             notebook_config['secondary_image_name'] = 'None'
         else:
@@ -138,9 +156,14 @@
                 notebook_config['secondary_image_name'].get('name'))
 
         notebook_config['gpu_accelerator_type'] = 'None'
+        notebook_config['gpu_accelerator_count'] = 'None'
 
-        if os.environ['application'] in ('tensor', 'tensor-rstudio', 'deeplearning'):
-            notebook_config['gpu_accelerator_type'] = os.environ['gcp_gpu_accelerator_type']
+        if os.environ['application'] in ('tensor', 'tensor-rstudio', 'deeplearning') or os.environ['gpu_enabled'] == 'True':
+            if os.environ['gpuType'] != '':
+                notebook_config['gpu_accelerator_type'] = os.environ['gpuType']
+                notebook_config['gpu_accelerator_count'] = os.environ['gpuCount']
+            else:
+                notebook_config['gpu_accelerator_type'] = os.environ['gcp_gpu_accelerator_type']
 
         notebook_config['network_tag'] = '{0}-{1}-{2}-ps'.format(notebook_config['service_base_name'],
                                                                  notebook_config['project_name'],
@@ -150,13 +173,14 @@
             data = {"notebook_name": notebook_config['instance_name'], "error": ""}
             json.dump(data, f)
 
-        additional_tags = os.environ['tags'].replace("': u'", ":").replace("', u'", ",").replace("{u'", "" ).replace(
+        print('Additional tags will be added: {}'.format(os.environ['tags']))
+        additional_tags = os.environ['tags'].replace("': '", ":").replace("', '", ",").replace("{'", "" ).replace(
             "'}", "").lower()
 
         print('Additional tags will be added: {}'.format(additional_tags))
         notebook_config['labels'] = {"name": notebook_config['instance_name'],
                                      "sbn": notebook_config['service_base_name'],
-                                     "product": "dlab"
+                                     "product": "datalab"
                                      }
 
         for tag in additional_tags.split(','):
@@ -167,7 +191,7 @@
             if label_value != '':
                 notebook_config['labels'].update({label_key: label_value})
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
     # launching instance for notebook server
     try:
@@ -176,23 +200,23 @@
         params = "--instance_name {0} --region {1} --zone {2} --vpc_name {3} --subnet_name {4} --instance_size {5} " \
                  "--ssh_key_path {6} --initial_user {7} --service_account_name {8} --image_name {9} " \
                  "--secondary_image_name {10} --instance_class {11} --primary_disk_size {12} " \
-                 "--secondary_disk_size {13} --gpu_accelerator_type {14} --network_tag {15} --labels '{16}' " \
-                 "--service_base_name {17}".\
+                 "--secondary_disk_size {13} --gpu_accelerator_type {14} --gpu_accelerator_count {15} --network_tag {16} --labels '{17}' " \
+                 "--service_base_name {18}".\
             format(notebook_config['instance_name'], notebook_config['region'], notebook_config['zone'],
                    notebook_config['vpc_name'], notebook_config['subnet_name'], notebook_config['instance_size'],
                    notebook_config['ssh_key_path'], notebook_config['initial_user'],
                    notebook_config['notebook_service_account_name'], notebook_config['primary_image_name'],
                    notebook_config['secondary_image_name'], 'notebook', notebook_config['primary_disk_size'],
                    notebook_config['secondary_disk_size'], notebook_config['gpu_accelerator_type'],
-                   notebook_config['network_tag'], json.dumps(notebook_config['labels']),
-                   notebook_config['service_base_name'])
+                   notebook_config['gpu_accelerator_count'], notebook_config['network_tag'],
+                   json.dumps(notebook_config['labels']), notebook_config['service_base_name'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create instance.", str(err))
+        datalab.fab.append_result("Failed to create instance.", str(err))
         GCPActions.remove_disk(notebook_config['instance_name'], notebook_config['zone'])
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_put_to_bucket.py b/infrastructure-provisioning/src/general/scripts/gcp/common_put_to_bucket.py
index c182dd4..85a0d0e 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_put_to_bucket.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_put_to_bucket.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,8 +22,8 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
 import sys
+from datalab.actions_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_reupload_key.py b/infrastructure-provisioning/src/general/scripts/gcp/common_reupload_key.py
index aaff46e..0119977 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_reupload_key.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_reupload_key.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -23,11 +23,11 @@
 
 
 import argparse
-from fabric.api import *
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-from dlab.fab import *
-import json
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--conf_resource', type=str, default='')
@@ -46,7 +46,7 @@
         params = "--user {} --hostname {} --keyfile '{}' --additional_config '{}'".format(
             args.os_user, ip, args.keyfile, args.additional_config)
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except Exception as err:
             print('Error: {0}'.format(err))
             sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_start_notebook.py b/infrastructure-provisioning/src/general/scripts/gcp/common_start_notebook.py
index 2d8fc8e..fe45998 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_start_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_start_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import logging
 import os
-import uuid
-import argparse
-from fabric.api import *
-
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -42,8 +40,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print('Generating infrastructure names and tags')
     notebook_config = dict()
     notebook_config['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -58,7 +56,7 @@
             GCPActions.start_instance(notebook_config['notebook_name'], notebook_config['zone'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to start notebook.", str(err))
+            datalab.fab.append_result("Failed to start notebook.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -71,10 +69,10 @@
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
             .format(os.environ['conf_os_user'], notebook_config['notebook_ip'], notebook_config['keyfile'])
         try:
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to setup git credentials.", str(err))
+            datalab.fab.append_result("Failed to setup git credentials.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -85,10 +83,10 @@
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
             .format(os.environ['conf_os_user'], notebook_config['notebook_ip'], notebook_config['keyfile'])
         try:
-            local("~/scripts/{}.py {}".format('update_inactivity_on_start', params))
+            subprocess.run("~/scripts/{}.py {}".format('update_inactivity_on_start', params), shell=True, check=True)
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to update last activity time.", str(err))
+            datalab.fab.append_result("Failed to update last activity time.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -106,5 +104,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_stop_notebook.py b/infrastructure-provisioning/src/general/scripts/gcp/common_stop_notebook.py
index bcd431b..094de05 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_stop_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_stop_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,12 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
-import uuid
-import argparse
 import sys
 
 
@@ -54,7 +51,7 @@
         else:
             print("There are no Dataproc clusters to terminate.")
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate dataproc", str(err))
+        datalab.fab.append_result("Failed to terminate dataproc", str(err))
         sys.exit(1)
 
     print("Stopping data engine cluster")
@@ -71,14 +68,14 @@
             print("There are no data engine clusters to terminate.")
 
     except Exception as err:
-        dlab.fab.append_result("Failed to stop dataengine cluster", str(err))
+        datalab.fab.append_result("Failed to stop dataengine cluster", str(err))
         sys.exit(1)
 
     print("Stopping notebook")
     try:
         GCPActions.stop_instance(instance_name, zone)
     except Exception as err:
-        dlab.fab.append_result("Failed to stop instance", str(err))
+        datalab.fab.append_result("Failed to stop instance", str(err))
         sys.exit(1)
 
 
@@ -91,8 +88,8 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print('Generating infrastructure names and tags')
     notebook_config = dict()
     notebook_config['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -116,7 +113,7 @@
                       notebook_config['project_name'])
     except Exception as err:
         print('Error: {0}'.format(err))
-        dlab.fab.append_result("Failed to stop notebook.", str(err))
+        datalab.fab.append_result("Failed to stop notebook.", str(err))
         sys.exit(1)
 
     try:
@@ -126,5 +123,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_terminate_notebook.py b/infrastructure-provisioning/src/general/scripts/gcp/common_terminate_notebook.py
index 00d39f5..100d49d 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/common_terminate_notebook.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_terminate_notebook.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,14 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import logging
 import os
-import uuid
+import sys
+import traceback
 
 
 def terminate_nb(instance_name, bucket_name, region, zone, user_name):
@@ -48,7 +47,7 @@
         else:
             print("There are no Dataproc clusters to terminate.")
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate dataproc", str(err))
+        datalab.fab.append_result("Failed to terminate dataproc", str(err))
         sys.exit(1)
 
     print("Terminating data engine cluster")
@@ -65,14 +64,14 @@
             print("There are no data engine clusters to terminate.")
 
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate dataengine", str(err))
+        datalab.fab.append_result("Failed to terminate dataengine", str(err))
         sys.exit(1)
 
     print("Terminating notebook")
     try:
         GCPActions.remove_instance(instance_name, zone)
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate instance", str(err))
+        datalab.fab.append_result("Failed to terminate instance", str(err))
         sys.exit(1)
 
 
@@ -84,8 +83,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print('Generating infrastructure names and tags')
     notebook_config = dict()
     notebook_config['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -108,7 +107,7 @@
                          notebook_config['project_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate notebook.", str(err))
+            datalab.fab.append_result("Failed to terminate notebook.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -120,5 +119,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_terminate_notebook_image.py b/infrastructure-provisioning/src/general/scripts/gcp/common_terminate_notebook_image.py
new file mode 100644
index 0000000..a448841
--- /dev/null
+++ b/infrastructure-provisioning/src/general/scripts/gcp/common_terminate_notebook_image.py
@@ -0,0 +1,61 @@
+#!/usr/bin/python3
+
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
+import json
+import os
+import sys
+
+if __name__ == "__main__":
+    try:
+        image_conf = dict()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
+        image_conf['image_name'] = os.environ['notebook_image_name']
+        image_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
+            os.environ['conf_service_base_name'][:20], '-', True)
+        image_conf['endpoint_name'] = (os.environ['endpoint_name']).replace('_', '-').lower()
+        image_conf['endpoint_tag'] = image_conf['endpoint_name']
+        image_conf['project_name'] = os.environ['project_name']
+        image_conf['project_tag'] = os.environ['project_name']
+        image_conf['expected_primary_image_name'] = '{}-{}-{}-{}-primary-image-{}'.format(
+            image_conf['service_base_name'], image_conf['project_name'], image_conf['endpoint_name'],
+            os.environ['application'], image_conf['image_name']).lower()
+        image_conf['expected_secondary_image_name'] = '{}-{}-{}-{}-secondary-image-{}'.format(
+            image_conf['service_base_name'], image_conf['project_name'], image_conf['endpoint_name'],
+            os.environ['application'], image_conf['image_name']).lower()
+        primary_image_id = GCPMeta.get_image_by_name(image_conf['expected_primary_image_name'])
+        if primary_image_id != '':
+            GCPActions.remove_image(notebook_config['expected_primary_image_name'])
+            GCPActions.remove_image(notebook_config['expected_secondary_image_name'])
+            with open("/root/result.json", 'w') as result:
+                res = {"notebook_image_name": image_conf['full_image_name'],
+                       "status": "terminated",
+                       "Action": "Delete existing notebook image"}
+                result.write(json.dumps(res))
+
+    except Exception as err:
+        datalab.fab.append_result("Failed to delete existing notebook image", str(err))
+        sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_configure.py
index 05b9c9b..1773a61 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,18 @@
 #
 # ******************************************************************************
 
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
+import datalab.notebook_lib
 import json
-import time
-from fabric.api import *
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import dlab.notebook_lib
-import traceback
-import sys
-import os
 import logging
 import multiprocessing
+import os
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 
 def configure_dataengine_service(instance, dataproc_conf):
@@ -42,16 +42,16 @@
         logging.info('[CONFIGURE PROXY ON DATAENGINE SERVICE]')
         print('[CONFIGURE PROXY ON DATAENGINE SERVICE]')
         additional_config = {"proxy_host": dataproc_conf['edge_instance_name'], "proxy_port": "3128"}
-        params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
+        params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
             .format(dataproc_conf['instance_ip'], dataproc_conf['cluster_name'], dataproc_conf['key_path'],
-                    json.dumps(additional_config), dataproc_conf['dlab_ssh_user'])
+                    json.dumps(additional_config), dataproc_conf['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         GCPActions.delete_dataproc_cluster(dataproc_conf['cluster_name'], os.environ['gcp_region'])
         sys.exit(1)
 
@@ -59,17 +59,20 @@
         logging.info('[CONFIGURE DATAENGINE SERVICE]')
         print('[CONFIGURE DATAENGINE SERVICE]')
         try:
-            env['connection_attempts'] = 100
-            env.key_filename = "{}".format(dataproc_conf['key_path'])
-            env.host_string = dataproc_conf['dlab_ssh_user'] + '@' + dataproc_conf['instance_ip']
-            dlab.notebook_lib.install_os_pkg(['python-pip', 'python3-pip'])
-            dlab.fab.configure_data_engine_service_pip(dataproc_conf['instance_ip'], dataproc_conf['dlab_ssh_user'],
-                                                       dataproc_conf['key_path'])
+            global conn
+            conn = datalab.fab.init_datalab_connection(dataproc_conf['instance_ip'], dataproc_conf['datalab_ssh_user'], dataproc_conf['key_path'])
+            datalab.fab.configure_data_engine_service_livy(dataproc_conf['instance_ip'],
+                                                           dataproc_conf['datalab_ssh_user'],
+                                                           dataproc_conf['key_path'])
+            datalab.notebook_lib.install_os_pkg([['python3-pip', 'N/A']])
+            datalab.fab.configure_data_engine_service_pip(dataproc_conf['instance_ip'],
+                                                          dataproc_conf['datalab_ssh_user'],
+                                                          dataproc_conf['key_path'])
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure dataengine service.", str(err))
+        datalab.fab.append_result("Failed to configure dataengine service.", str(err))
         GCPActions.delete_dataproc_cluster(dataproc_conf['cluster_name'], os.environ['gcp_region'])
         sys.exit(1)
 
@@ -100,17 +103,17 @@
                  "--additional_info '{}'"\
             .format(dataproc_conf['edge_instance_hostname'],
                     dataproc_conf['key_path'],
-                    dataproc_conf['dlab_ssh_user'],
+                    dataproc_conf['datalab_ssh_user'],
                     'dataengine-service',
                     dataproc_conf['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure reverse proxy.", str(err))
+        datalab.fab.append_result("Failed to configure reverse proxy.", str(err))
         GCPActions.delete_dataproc_cluster(dataproc_conf['cluster_name'], os.environ['gcp_region'])
         sys.exit(1)
 
@@ -123,8 +126,8 @@
                         level=logging.INFO,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         print('Generating infrastructure names and tags')
         dataproc_conf = dict()
         if 'exploratory_name' in os.environ:
@@ -172,11 +175,11 @@
                                                                         dataproc_conf['endpoint_name'])
         dataproc_conf['edge_instance_hostname'] = GCPMeta.get_instance_public_ip_by_name(
             dataproc_conf['edge_instance_name'])
-        dataproc_conf['dlab_ssh_user'] = os.environ['conf_os_user']
+        dataproc_conf['datalab_ssh_user'] = os.environ['conf_os_user']
         dataproc_conf['master_name'] = dataproc_conf['cluster_name'] + '-m'
         dataproc_conf['master_ip'] = GCPMeta.get_private_ip_address(dataproc_conf['master_name'])
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         GCPActions.delete_dataproc_cluster(dataproc_conf['cluster_name'], os.environ['gcp_region'])
         sys.exit(1)
 
@@ -205,7 +208,7 @@
                 raise Exception
     except Exception as err:
         GCPActions.delete_dataproc_cluster(dataproc_conf['cluster_name'], os.environ['gcp_region'])
-        dlab.fab.append_result("Failed to configure Dataengine-service", str(err))
+        datalab.fab.append_result("Failed to configure Dataengine-service", str(err))
         traceback.print_exc()
         raise Exception
 
@@ -242,6 +245,6 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         GCPActions.delete_dataproc_cluster(dataproc_conf['cluster_name'], os.environ['gcp_region'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_create.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_create.py
index 7b9d05a..f63e94c 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_create.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_create.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,16 +22,12 @@
 # ******************************************************************************
 
 
-import boto3
-from botocore.client import Config
 import argparse
-import re
-import time
-import sys
-from fabric.api import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
 import json
+import sys
+from datalab.actions_lib import *
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 # parser.add_argument('--dry_run', action='store_true', help='Print all variables')
@@ -42,14 +38,14 @@
 
 
 def upload_jars_parser(args):
-    if not actions_lib.GCPActions().put_to_bucket(args.bucket, '/root/scripts/dataengine-service_jars_parser.py', 'jars_parser.py'):
+    if not datalab.actions_lib.GCPActions().put_to_bucket(args.bucket, '/root/scripts/dataengine-service_jars_parser.py', 'jars_parser.py'):
         print('Failed to upload jars_parser script')
         raise Exception
 
 
 def build_dataproc_cluster(args, cluster_name):
     print("Will be created cluster: {}".format(json.dumps(params, sort_keys=True, indent=4, separators=(',', ': '))))
-    return actions_lib.GCPActions().create_dataproc_cluster(cluster_name, args.region, params)
+    return datalab.actions_lib.GCPActions().create_dataproc_cluster(cluster_name, args.region, params)
 
 
 def send_parser_job(args, cluster_name, cluster_version):
@@ -61,7 +57,7 @@
     job_body['job']['pysparkJob']['args'][5] = cluster_name
     job_body['job']['pysparkJob']['args'][7] = cluster_version
     job_body['job']['pysparkJob']['args'][9] = os.environ['conf_os_user']
-    actions_lib.GCPActions().submit_dataproc_job(job_body)
+    datalab.actions_lib.GCPActions().submit_dataproc_job(job_body)
 
 
 ##############
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_install_libs.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_install_libs.py
index e6ff9ea..32475e1 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_install_libs.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_install_libs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,25 +21,26 @@
 #
 # ******************************************************************************
 
+import logging
+import multiprocessing
 import os
 import sys
-import logging
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
-import multiprocessing
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 
 def install_libs(instance, data_engine):
-    data_engine['instance_ip'] = meta_lib.GCPMeta().get_private_ip_address(instance)
-    params = '--os_user {} --instance_ip {} --keyfile "{}" --libs "{}"'\
+    data_engine['instance_ip'] = GCPMeta().get_private_ip_address(instance)
+    params = '--os_user {} --instance_ip {} --keyfile "{}" --libs "{}" --dataengine_service True' \
         .format(data_engine['os_user'], data_engine['instance_ip'],
                 data_engine['keyfile'], data_engine['libs'])
     try:
         # Run script to install additional libs
-        local("~/scripts/{}.py {}".format('install_additional_libs', params))
+        subprocess.run("~/scripts/{}.py {}".format('install_additional_libs', params), shell=True, check=True)
     except:
         traceback.print_exc()
         raise Exception
@@ -64,7 +65,7 @@
             data_engine['gcp_project_id'] = os.environ['gcp_project_id']
             data_engine['gcp_region'] = os.environ['gcp_region']
             data_engine['gcp_zone'] = os.environ['gcp_zone']
-            res = meta_lib.GCPMeta().get_list_instances(data_engine['gcp_zone'], data_engine['cluster_name'])
+            res = GCPMeta().get_list_instances(data_engine['gcp_zone'], data_engine['cluster_name'])
             data_engine['cluster_instances'] = [i.get('name') for i in res['items']]
             data_engine['keyfile'] = '{}{}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
             data_engine['libs'] = os.environ['libs']
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_jars_parser.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_jars_parser.py
index c07e515..b00ffc1 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_jars_parser.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_jars_parser.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -37,6 +37,8 @@
 
 if __name__ == "__main__":
     spark_def_path = "/usr/lib/spark/conf/spark-defaults.conf"
+    os.system(
+        'sudo sed -i "s|secure_path.*$|secure_path=\"/opt/conda/default/bin:/opt/conda/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/usr/local/bin\"|g" /etc/sudoers')
 
     os.system('touch /tmp/r_version')
     r_ver = subprocess.check_output("R --version | awk '/version / {print $3}'", shell=True).decode('UTF-8')
@@ -44,7 +46,7 @@
         outfile.write(r_ver)
 
     os.system('touch /tmp/python_version')
-    for v in range(4, 7):
+    for v in range(4, 9):
         python_ver_checker = "python3.{} -V 2>/dev/null".format(v) + " | awk '{print $2}'"
         python_ver = subprocess.check_output(python_ver_checker, shell=True).decode('UTF-8')
         if python_ver != '':
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_key_importer.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_key_importer.py
index c996937..2260e5c 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_key_importer.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_key_importer.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_list_libs.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_list_libs.py
index 65c2082..55af8b5 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_list_libs.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_list_libs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,15 @@
 #
 # ******************************************************************************
 
+import logging
 import os
 import sys
-import logging
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -40,11 +41,12 @@
                         filename=local_log_filepath)
 
     try:
-        logging.info('[GETTING ALL AVAILABLE PACKAGES]')
-        print('[GETTING ALL AVAILABLE PACKAGES]')
+        logging.info('[GETTING AVAILABLE PACKAGES]')
+        print('[GETTING AVAILABLE PACKAGES]')
         data_engine = dict()
         try:
             data_engine['os_user'] = os.environ['conf_os_user']
+            data_engine['group_name'] = os.environ['libCacheKey']
             data_engine['cluster_name'] = os.environ['computational_id']
             data_engine['gcp_project_id'] = os.environ['gcp_project_id']
             data_engine['gcp_region'] = os.environ['gcp_region']
@@ -55,11 +57,11 @@
         except Exception as err:
             append_result("Failed to get parameter.", str(err))
             sys.exit(1)
-        params = "--os_user {} --instance_ip {} --keyfile '{}'" \
-            .format(data_engine['os_user'], data_engine['master_ip'], data_engine['keyfile'])
+        params = "--os_user {} --instance_ip {} --keyfile '{}' --group {}" \
+            .format(data_engine['os_user'], data_engine['master_ip'], data_engine['keyfile'], data_engine['group_name'])
         try:
             # Run script to get available libs
-            local("~/scripts/{}.py {}".format('get_list_available_pkgs', params))
+            subprocess.run("~/scripts/{}.py {}".format('get_list_available_pkgs', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_prepare.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_prepare.py
index 993b8e7..3229525 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,19 +21,18 @@
 #
 # ******************************************************************************
 
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import time
-from fabric.api import *
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
-import sys
-import os
-import uuid
 import logging
+import os
+import sys
+import time
+import traceback
+import subprocess
 from Crypto.PublicKey import RSA
-
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -43,8 +42,8 @@
                         level=logging.INFO,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         print('Generating infrastructure names and tags')
         dataproc_conf = dict()
         if 'exploratory_name' in os.environ:
@@ -81,7 +80,7 @@
                                                                    dataproc_conf['project_name'],
                                                                    dataproc_conf['endpoint_name'])
         dataproc_conf['release_label'] = os.environ['dataproc_version']
-        additional_tags = os.environ['tags'].replace("': u'", ":").replace("', u'", ",").replace("{u'", "").replace(
+        additional_tags = os.environ['tags'].replace("': '", ":").replace("', '", ",").replace("{'", "").replace(
             "'}", "").lower()
 
         dataproc_conf['cluster_labels'] = {
@@ -89,7 +88,7 @@
             "name": dataproc_conf['cluster_name'],
             "sbn": dataproc_conf['service_base_name'],
             "notebook_name": os.environ['notebook_instance_name'],
-            "product": "dlab",
+            "product": "datalab",
             "computational_name": dataproc_conf['computational_name']
         }
 
@@ -111,9 +110,9 @@
         dataproc_conf['edge_instance_hostname'] = '{0}-{1}-{2}-edge'.format(dataproc_conf['service_base_name'],
                                                                             dataproc_conf['project_name'],
                                                                             dataproc_conf['endpoint_name'])
-        dataproc_conf['dlab_ssh_user'] = os.environ['conf_os_user']
+        dataproc_conf['datalab_ssh_user'] = os.environ['conf_os_user']
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary. Exception:" + str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary. Exception:" + str(err))
         sys.exit(1)
 
     edge_status = GCPMeta.get_instance_status(dataproc_conf['edge_instance_hostname'])
@@ -121,9 +120,10 @@
         logging.info('ERROR: Edge node is unavailable! Aborting...')
         print('ERROR: Edge node is unavailable! Aborting...')
         ssn_hostname = GCPMeta.get_private_ip_address(dataproc_conf['service_base_name'] + '-ssn')
-        dlab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_dlab_path'], os.environ['conf_os_user'],
-                                     ssn_hostname)
-        dlab.fab.append_result("Edge node is unavailable")
+        datalab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_datalab_path'],
+                                        os.environ['conf_os_user'],
+                                        ssn_hostname)
+        datalab.fab.append_result("Edge node is unavailable")
         sys.exit(1)
 
     print("Will create exploratory environment with edge node as access point as following: ".format(
@@ -132,15 +132,26 @@
 
     try:
         GCPMeta.dataproc_waiter(dataproc_conf['cluster_labels'])
-        local('touch /response/.dataproc_creating_{}'.format(os.environ['exploratory_name']))
+        subprocess.run('touch /response/.dataproc_creating_{}'.format(os.environ['exploratory_name']), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
-        dlab.fab.append_result("Dataproc waiter fail.", str(err))
+        datalab.fab.append_result("Dataproc waiter fail.", str(err))
         sys.exit(1)
 
-    local("echo Waiting for changes to propagate; sleep 10")
+    subprocess.run("echo Waiting for changes to propagate; sleep 10", shell=True, check=True)
 
-    dataproc_cluster = json.loads(open('/root/templates/dataengine-service_cluster.json').read().decode('utf-8-sig'))
+    if 'master_gpu_count' in os.environ:
+        dataproc_cluster = json.loads(open('/root/templates/dataengine-service_cluster_with_gpu.json').read())
+        dataproc_cluster['config']['masterConfig']['accelerators'][0]['acceleratorCount'] = int(os.environ['master_gpu_count'])
+        dataproc_cluster['config']['masterConfig']['accelerators'][0]['acceleratorTypeUri'] = os.environ['master_gpu_type']
+        dataproc_cluster['config']['workerConfig']['accelerators'][0]['acceleratorCount'] = int(os.environ['slave_gpu_count'])
+        dataproc_cluster['config']['workerConfig']['accelerators'][0]['acceleratorTypeUri'] = os.environ['slave_gpu_type']
+        gpu_driver = 'gs://goog-dataproc-initialization-actions-{}/gpu/install_gpu_driver.sh'.format(dataproc_conf['region'])
+        dataproc_cluster['config']['initializationActions'][0]['executableFile'] = gpu_driver
+
+    else:
+        dataproc_cluster = json.loads(open('/root/templates/dataengine-service_cluster.json').read())
+
     dataproc_cluster['projectId'] = os.environ['gcp_project_id']
     dataproc_cluster['clusterName'] = dataproc_conf['cluster_name']
     dataproc_cluster['labels'] = dataproc_conf['cluster_labels']
@@ -160,9 +171,9 @@
     dataproc_cluster['config']['softwareConfig']['imageVersion'] = dataproc_conf['release_label']
     ssh_user_pubkey = open('{}{}.pub'.format(os.environ['conf_key_dir'], dataproc_conf['project_name'])).read()
     key = RSA.importKey(open(dataproc_conf['key_path'], 'rb').read())
-    ssh_admin_pubkey = key.publickey().exportKey("OpenSSH")
-    dataproc_cluster['config']['gceClusterConfig']['metadata']['ssh-keys'] = '{0}:{1}\n{0}:{2}'.format(
-        dataproc_conf['dlab_ssh_user'], ssh_user_pubkey, ssh_admin_pubkey)
+    ssh_admin_pubkey = key.publickey().exportKey("OpenSSH").decode('UTF-8')
+    dataproc_cluster['config']['gceClusterConfig']['metadata']['ssh-keys'] = '{0}:{1}{0}:{2}'.format(
+        dataproc_conf['datalab_ssh_user'], ssh_user_pubkey, ssh_admin_pubkey)
     dataproc_cluster['config']['gceClusterConfig']['tags'][0] = dataproc_conf['cluster_tag']
     with open('/root/result.json', 'w') as f:
         data = {"hostname": dataproc_conf['cluster_name'], "error": ""}
@@ -176,14 +187,14 @@
                                                                    json.dumps(dataproc_cluster))
 
         try:
-            local("~/scripts/{}.py {}".format('dataengine-service_create', params))
+            subprocess.run("~/scripts/{}.py {}".format('dataengine-service_create', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
 
         keyfile_name = "/root/keys/{}.pem".format(dataproc_conf['key_name'])
-        local('rm /response/.dataproc_creating_{}'.format(os.environ['exploratory_name']))
+        subprocess.run('rm /response/.dataproc_creating_{}'.format(os.environ['exploratory_name']), shell=True, check=True)
     except Exception as err:
-        dlab.fab.append_result("Failed to create Dataproc Cluster.", str(err))
-        local('rm /response/.dataproc_creating_{}'.format(os.environ['exploratory_name']))
+        datalab.fab.append_result("Failed to create Dataproc Cluster.", str(err))
+        subprocess.run('rm /response/.dataproc_creating_{}'.format(os.environ['exploratory_name']), shell=True, check=True)
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_terminate.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_terminate.py
index 3710b1c..f66a67d 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine-service_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,14 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import logging
-import traceback
-import boto3
-import argparse
-import sys
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
+import logging
 import os
+import sys
+import traceback
 
 
 def terminate_dataproc_cluster(notebook_name, dataproc_name, bucket_name, ssh_user, key_path):
@@ -48,7 +46,7 @@
         else:
             print("There are no Dataproc clusters to terminate.")
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate Dataproc cluster.", str(err))
+        datalab.fab.append_result("Failed to terminate Dataproc cluster.", str(err))
         sys.exit(1)
 
 
@@ -61,8 +59,8 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print('Generating infrastructure names and tags')
     dataproc_conf = dict()
     dataproc_conf['service_base_name'] = os.environ['conf_service_base_name']
@@ -88,7 +86,7 @@
                                        dataproc_conf['key_path'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate Dataproc cluster.", str(err))
+            datalab.fab.append_result("Failed to terminate Dataproc cluster.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -102,5 +100,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine_configure.py
index d50e0f0..87e6bb2 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,39 +21,37 @@
 #
 # ******************************************************************************
 
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import time
-from fabric.api import *
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
-import sys
-import os
-import uuid
 import logging
-from Crypto.PublicKey import RSA
 import multiprocessing
+import os
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 
 def configure_slave(slave_number, data_engine):
     slave_name = data_engine['slave_node_name'] + '{}'.format(slave_number + 1)
     slave_hostname = GCPMeta.get_private_ip_address(slave_name)
     try:
-        logging.info('[CREATING DLAB SSH USER ON SLAVE NODE]')
-        print('[CREATING DLAB SSH USER ON SLAVE NODE]')
+        logging.info('[CREATING DATALAB SSH USER ON SLAVE NODE]')
+        print('[CREATING DATALAB SSH USER ON SLAVE NODE]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format \
             (slave_hostname, os.environ['conf_key_dir'] + data_engine['key_name'] + ".pem", initial_user,
-             data_engine['dlab_ssh_user'], sudo_group)
+             data_engine['datalab_ssh_user'], sudo_group)
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to create ssh user on slave.", str(err))
+        datalab.fab.append_result("Failed to create ssh user on slave.", str(err))
         sys.exit(1)
 
     try:
@@ -63,15 +61,15 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             slave_hostname, os.environ['conf_key_dir'] + data_engine['key_name'] + ".pem", json.dumps(
-                additional_config), data_engine['dlab_ssh_user'])
+                additional_config), data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to install ssh user key on slave.", str(err))
+        datalab.fab.append_result("Failed to install ssh user key on slave.", str(err))
         sys.exit(1)
 
     try:
@@ -80,31 +78,31 @@
         additional_config = {"proxy_host": edge_instance_name, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(slave_hostname, slave_name, keyfile_name, json.dumps(additional_config),
-                    data_engine['dlab_ssh_user'])
+                    data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure proxy on slave.", str(err))
+        datalab.fab.append_result("Failed to configure proxy on slave.", str(err))
         sys.exit(1)
 
     try:
         logging.info('[INSTALLING PREREQUISITES ON SLAVE NODE]')
         print('[INSTALLING PREREQUISITES ON SLAVE NODE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
-            format(slave_hostname, keyfile_name, data_engine['dlab_ssh_user'], data_engine['region'],
+            format(slave_hostname, keyfile_name, data_engine['datalab_ssh_user'], data_engine['region'],
                    edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to install prerequisites on slave.", str(err))
+        datalab.fab.append_result("Failed to install prerequisites on slave.", str(err))
         sys.exit(1)
 
     try:
@@ -113,19 +111,35 @@
         params = "--hostname {} --keyfile {} --region {} --spark_version {} --hadoop_version {} --os_user {} " \
                  "--scala_version {} --r_mirror {} --master_ip {} --node_type {}". \
             format(slave_hostname, keyfile_name, data_engine['region'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], data_engine['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], data_engine['datalab_ssh_user'],
                    os.environ['notebook_scala_version'], os.environ['notebook_r_mirror'], master_node_hostname,
                    'slave')
         try:
-            local("~/scripts/{}.py {}".format('configure_dataengine', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_dataengine', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure slave node.", str(err))
+        datalab.fab.append_result("Failed to configure slave node.", str(err))
         sys.exit(1)
 
+    if 'slave_gpu_type' in os.environ:
+        try:
+            print('[INSTALLING GPU DRIVERS ON MASTER NODE]')
+            params = "--hostname {} --keyfile {} --os_user {}".format(
+                slave_hostname, keyfile_name, data_engine['datalab_ssh_user'])
+            try:
+                subprocess.run("~/scripts/{}.py {}".format('common_install_gpu', params), shell=True, check=True)
+            except:
+                datalab.fab.append_result("Failed installing gpu drivers")
+                raise Exception
+
+        except Exception as err:
+            datalab.fab.append_result("Failed to install GPU drivers.", str(err))
+            GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+            sys.exit(1)
+
 
 def clear_resources():
     for i in range(data_engine['instance_count'] - 1):
@@ -143,8 +157,8 @@
                         filename=local_log_filepath)
 
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         print('Generating infrastructure names and tags')
         data_engine = dict()
         data_engine['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -206,28 +220,28 @@
                                                        data_engine['project_name'], data_engine['endpoint_tag'])
         edge_instance_hostname = GCPMeta.get_instance_public_ip_by_name(edge_instance_name)
         edge_instance_private_ip = GCPMeta.get_private_ip_address(edge_instance_name)
-        data_engine['dlab_ssh_user'] = os.environ['conf_os_user']
+        data_engine['datalab_ssh_user'] = os.environ['conf_os_user']
         keyfile_name = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
 
     try:
-        logging.info('[CREATING DLAB SSH USER ON MASTER NODE]')
-        print('[CREATING DLAB SSH USER ON MASTER NODE]')
-        params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format\
+        logging.info('[CREATING DATALAB SSH USER ON MASTER NODE]')
+        print('[CREATING DATALAB SSH USER ON MASTER NODE]')
+        params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format \
             (master_node_hostname, os.environ['conf_key_dir'] + data_engine['key_name'] + ".pem", initial_user,
-             data_engine['dlab_ssh_user'], sudo_group)
+             data_engine['datalab_ssh_user'], sudo_group)
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to create ssh user on master.", str(err))
+        datalab.fab.append_result("Failed to create ssh user on master.", str(err))
         sys.exit(1)
 
     try:
@@ -237,15 +251,15 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             master_node_hostname, os.environ['conf_key_dir'] + data_engine['key_name'] + ".pem",
-            json.dumps(additional_config), data_engine['dlab_ssh_user'])
+            json.dumps(additional_config), data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to install ssh user on master.", str(err))
+        datalab.fab.append_result("Failed to install ssh user on master.", str(err))
         sys.exit(1)
 
     try:
@@ -254,31 +268,31 @@
         additional_config = {"proxy_host": edge_instance_name, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(master_node_hostname, data_engine['master_node_name'], keyfile_name, json.dumps(additional_config),
-                    data_engine['dlab_ssh_user'])
+                    data_engine['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to configure proxy on master.", str(err))
+        datalab.fab.append_result("Failed to configure proxy on master.", str(err))
         sys.exit(1)
 
     try:
         logging.info('[INSTALLING PREREQUISITES ON MASTER NODE]')
         print('[INSTALLING PREREQUISITES ON MASTER NODE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(master_node_hostname, keyfile_name, data_engine['dlab_ssh_user'], data_engine['region'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(master_node_hostname, keyfile_name, data_engine['datalab_ssh_user'], data_engine['region'],
                    edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         clear_resources()
-        dlab.fab.append_result("Failed to install prerequisites on master.", str(err))
+        datalab.fab.append_result("Failed to install prerequisites on master.", str(err))
         sys.exit(1)
 
     try:
@@ -287,19 +301,35 @@
         params = "--hostname {} --keyfile {} --region {} --spark_version {} --hadoop_version {} --os_user {} " \
                  "--scala_version {} --r_mirror {} --master_ip {} --node_type {}".\
             format(master_node_hostname, keyfile_name, data_engine['region'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], data_engine['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], data_engine['datalab_ssh_user'],
                    os.environ['notebook_scala_version'], os.environ['notebook_r_mirror'], master_node_hostname,
                    'master')
         try:
-            local("~/scripts/{}.py {}".format('configure_dataengine', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_dataengine', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure master node", str(err))
+        datalab.fab.append_result("Failed to configure master node", str(err))
         clear_resources()
         sys.exit(1)
 
+    if 'master_gpu_type' in os.environ:
+        try:
+            print('[INSTALLING GPU DRIVERS ON MASTER NODE]')
+            params = "--hostname {} --keyfile {} --os_user {}".format(
+                master_node_hostname, keyfile_name, data_engine['datalab_ssh_user'])
+            try:
+                subprocess.run("~/scripts/{}.py {}".format('common_install_gpu', params), shell=True, check=True)
+            except:
+                datalab.fab.append_result("Failed installing gpu drivers")
+                raise Exception
+
+        except Exception as err:
+            datalab.fab.append_result("Failed to install GPU drivers.", str(err))
+            GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+            sys.exit(1)
+
     try:
         jobs = []
         for slave in range(data_engine['instance_count'] - 1):
@@ -312,7 +342,7 @@
             if job.exitcode != 0:
                 raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure slave nodes", str(err))
+        datalab.fab.append_result("Failed to configure slave nodes", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -337,17 +367,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     keyfile_name,
-                    data_engine['dlab_ssh_user'],
+                    data_engine['datalab_ssh_user'],
                     'spark',
                     data_engine['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure reverse proxy", str(err))
+        datalab.fab.append_result("Failed to configure reverse proxy", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -379,6 +409,6 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine_prepare.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine_prepare.py
index 262868c..96ba448 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import logging
 import os
-import argparse
-from fabric.api import *
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -41,8 +41,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         print('Generating infrastructure names and tags')
         data_engine = dict()
         data_engine['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -53,6 +53,11 @@
         data_engine['endpoint_tag'] = data_engine['endpoint_name']
         data_engine['region'] = os.environ['gcp_region']
         data_engine['zone'] = os.environ['gcp_zone']
+        data_engine['gpu_accelerator_type'] = 'None'
+        data_engine['gpu_master_accelerator_type'] = 'None'
+        data_engine['gpu_master_accelerator_count'] = 'None'
+        data_engine['gpu_slave_accelerator_type'] = 'None'
+        data_engine['gpu_slave_accelerator_count'] = 'None'
 
         edge_status = GCPMeta.get_instance_status('{0}-{1}-{2}-edge'.format(data_engine['service_base_name'],
                                                                             data_engine['project_name'],
@@ -61,9 +66,10 @@
             logging.info('ERROR: Edge node is unavailable! Aborting...')
             print('ERROR: Edge node is unavailable! Aborting...')
             ssn_hostname = GCPMeta.get_private_ip_address(data_engine['service_base_name'] + '-ssn')
-            dlab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_dlab_path'], os.environ['conf_os_user'],
-                                         ssn_hostname)
-            dlab.fab.append_result("Edge node is unavailable")
+            datalab.fab.put_resource_status('edge', 'Unavailable', os.environ['ssn_datalab_path'],
+                                            os.environ['conf_os_user'],
+                                            ssn_hostname)
+            datalab.fab.append_result("Edge node is unavailable")
             sys.exit(1)
 
         try:
@@ -147,24 +153,27 @@
             data = {"hostname": data_engine['cluster_name'], "error": ""}
             json.dump(data, f)
 
-        data_engine['gpu_accelerator_type'] = 'None'
-        if os.environ['application'] in ('tensor', 'tensor-rstudio', 'deeplearning'):
-            data_engine['gpu_accelerator_type'] = os.environ['gcp_gpu_accelerator_type']
+        if 'master_gpu_type' in os.environ:
+            data_engine['gpu_master_accelerator_type'] = os.environ['master_gpu_type']
+            data_engine['gpu_master_accelerator_count'] = os.environ['master_gpu_count']
+            data_engine['gpu_slave_accelerator_type'] = os.environ['slave_gpu_type']
+            data_engine['gpu_slave_accelerator_count'] = os.environ['slave_gpu_count']
+
         data_engine['network_tag'] = '{0}-{1}-{2}-ps'.format(data_engine['service_base_name'],
                                                              data_engine['project_name'], data_engine['endpoint_name'])
-        additional_tags = os.environ['tags'].replace("': u'", ":").replace("', u'", ",").replace("{u'", "").replace(
+        additional_tags = os.environ['tags'].replace("': '", ":").replace("', '", ",").replace("{'", "").replace(
             "'}", "").lower()
 
         data_engine['slave_labels'] = {"name": data_engine['cluster_name'],
                                        "sbn": data_engine['service_base_name'],
                                        "type": "slave",
                                        "notebook_name": data_engine['notebook_name'],
-                                       "product": "dlab"}
+                                       "product": "datalab"}
         data_engine['master_labels'] = {"name": data_engine['cluster_name'],
                                         "sbn": data_engine['service_base_name'],
                                         "type": "master",
                                         "notebook_name": data_engine['notebook_name'],
-                                        "product": "dlab"}
+                                        "product": "datalab"}
 
         for tag in additional_tags.split(','):
             label_key = tag.split(':')[0]
@@ -175,7 +184,7 @@
                 data_engine['slave_labels'].update({label_key: label_value})
                 data_engine['master_labels'].update({label_key: label_value})
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary. Exception:" + str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary. Exception:" + str(err))
         sys.exit(1)
 
     try:
@@ -184,22 +193,22 @@
         params = "--instance_name {0} --region {1} --zone {2} --vpc_name {3} --subnet_name {4} --instance_size {5} " \
                  "--ssh_key_path {6} --initial_user {7} --service_account_name {8} --image_name {9} " \
                  "--secondary_image_name {10} --instance_class {11} --primary_disk_size {12} " \
-                 "--secondary_disk_size {13} --gpu_accelerator_type {14} --network_tag {15} --cluster_name {16} " \
-                 "--labels '{17}' --service_base_name {18}". \
+                 "--secondary_disk_size {13} --gpu_accelerator_type {14} --gpu_accelerator_count {15} --network_tag {16} --cluster_name {17} " \
+                 "--labels '{18}' --service_base_name {19}". \
             format(data_engine['master_node_name'], data_engine['region'], data_engine['zone'], data_engine['vpc_name'],
                    data_engine['subnet_name'], data_engine['master_size'], data_engine['ssh_key_path'], initial_user,
                    data_engine['dataengine_service_account_name'], data_engine['primary_image_name'],
                    data_engine['secondary_image_name'], 'dataengine', data_engine['primary_disk_size'],
-                   data_engine['secondary_disk_size'], data_engine['gpu_accelerator_type'],
-                   data_engine['network_tag'], data_engine['cluster_name'],
+                   data_engine['secondary_disk_size'], data_engine['gpu_master_accelerator_type'],
+                   data_engine['gpu_master_accelerator_count'], data_engine['network_tag'], data_engine['cluster_name'],
                    json.dumps(data_engine['master_labels']), data_engine['service_base_name'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create instance.", str(err))
+        datalab.fab.append_result("Failed to create instance.", str(err))
         GCPActions.remove_instance(data_engine['master_node_name'], data_engine['zone'])
         sys.exit(1)
 
@@ -211,18 +220,19 @@
             params = "--instance_name {0} --region {1} --zone {2} --vpc_name {3} --subnet_name {4} " \
                      "--instance_size {5} --ssh_key_path {6} --initial_user {7} --service_account_name {8} " \
                      "--image_name {9} --secondary_image_name {10} --instance_class {11} --primary_disk_size {12} " \
-                     "--secondary_disk_size {13} --gpu_accelerator_type {14} --network_tag {15} --cluster_name {16} " \
-                     "--labels '{17}' --service_base_name {18}". \
+                     "--secondary_disk_size {13} --gpu_accelerator_type {14} --gpu_accelerator_count {15} --network_tag {16} --cluster_name {17} " \
+                     "--labels '{18}' --service_base_name {19}". \
                 format(slave_name, data_engine['region'], data_engine['zone'],
                        data_engine['vpc_name'], data_engine['subnet_name'], data_engine['slave_size'],
                        data_engine['ssh_key_path'], initial_user, data_engine['dataengine_service_account_name'],
                        data_engine['primary_image_name'], data_engine['secondary_image_name'], 'dataengine',
                        data_engine['primary_disk_size'],
-                       data_engine['secondary_disk_size'], data_engine['gpu_accelerator_type'],
-                       data_engine['network_tag'], data_engine['cluster_name'],
-                       json.dumps(data_engine['slave_labels']), data_engine['service_base_name'])
+                       data_engine['secondary_disk_size'], data_engine['gpu_slave_accelerator_type'],
+                       data_engine['gpu_slave_accelerator_count'], data_engine['network_tag'],
+                       data_engine['cluster_name'], json.dumps(data_engine['slave_labels']),
+                       data_engine['service_base_name'])
             try:
-                local("~/scripts/{}.py {}".format('common_create_instance', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
             except:
                 traceback.print_exc()
                 raise Exception
@@ -234,5 +244,5 @@
             except:
                 print("The slave instance {} hasn't been created.".format(slave_name))
         GCPActions.remove_instance(data_engine['master_node_name'], data_engine['zone'])
-        dlab.fab.append_result("Failed to create slave instances.", str(err))
+        datalab.fab.append_result("Failed to create slave instances.", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine_start.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine_start.py
index ce5af48..7843592 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine_start.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine_start.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import logging
 import os
-import uuid
-from fabric.api import *
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 
 def start_data_engine(zone, cluster_name):
@@ -41,7 +41,7 @@
             for i in instances['items']:
                 GCPActions.start_instance(i['name'], zone)
     except Exception as err:
-        dlab.fab.append_result("Failed to start dataengine", str(err))
+        datalab.fab.append_result("Failed to start dataengine", str(err))
         sys.exit(1)
 
 
@@ -53,8 +53,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print('Generating infrastructure names and tags')
     data_engine = dict()
     if 'exploratory_name' in os.environ:
@@ -81,7 +81,7 @@
             start_data_engine(data_engine['zone'], data_engine['cluster_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to start Data Engine.", str(err))
+            datalab.fab.append_result("Failed to start Data Engine.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -98,10 +98,10 @@
             .format(os.environ['conf_os_user'], data_engine['notebook_ip'], data_engine['keyfile'],
                     data_engine['computational_ip'])
         try:
-            local("~/scripts/{}.py {}".format('update_inactivity_on_start', params))
+            subprocess.run("~/scripts/{}.py {}".format('update_inactivity_on_start', params), shell=True, check=True)
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to update last activity time.", str(err))
+            datalab.fab.append_result("Failed to update last activity time.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -113,5 +113,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
-        sys.exit(1)
\ No newline at end of file
+        datalab.fab.append_result("Error with writing results", str(err))
+        sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine_stop.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine_stop.py
index e370bfb..1a06c2d 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine_stop.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine_stop.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,14 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import logging
 import os
-import uuid
+import sys
+import traceback
 
 
 def stop_data_engine(zone, cluster_name):
@@ -40,7 +39,7 @@
             for i in instances['items']:
                 GCPActions.stop_instance(i['name'], zone)
     except Exception as err:
-        dlab.fab.append_result("Failed to stop dataengine", str(err))
+        datalab.fab.append_result("Failed to stop dataengine", str(err))
         sys.exit(1)
 
 
@@ -52,8 +51,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print('Generating infrastructure names and tags')
     data_engine = dict()
     if 'exploratory_name' in os.environ:
@@ -80,7 +79,7 @@
             stop_data_engine(data_engine['zone'], data_engine['cluster_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to stop Data Engine.", str(err))
+            datalab.fab.append_result("Failed to stop Data Engine.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -91,5 +90,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/dataengine_terminate.py b/infrastructure-provisioning/src/general/scripts/gcp/dataengine_terminate.py
index 6d9adfd..5751014 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/dataengine_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/dataengine_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,14 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import traceback
+import logging
 import os
-import uuid
+import sys
+import traceback
 
 
 def terminate_data_engine(zone, notebook_name, os_user, key_path, cluster_name):
@@ -40,14 +39,14 @@
             for i in instances['items']:
                 GCPActions.remove_instance(i['name'], zone)
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate dataengine", str(err))
+        datalab.fab.append_result("Failed to terminate dataengine", str(err))
         sys.exit(1)
 
     print("Removing Data Engine kernels from notebook")
     try:
-        dlab.actions_lib.remove_dataengine_kernels(notebook_name, os_user, key_path, cluster_name)
+        datalab.actions_lib.remove_dataengine_kernels(notebook_name, os_user, key_path, cluster_name)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove dataengine kernels from notebook", str(err))
+        datalab.fab.append_result("Failed to remove dataengine kernels from notebook", str(err))
         sys.exit(1)
 
 
@@ -59,8 +58,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     # generating variables dictionary
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print('Generating infrastructure names and tags')
     data_engine = dict()
     if 'exploratory_name' in os.environ:
@@ -92,7 +91,7 @@
                                   data_engine['key_path'], data_engine['cluster_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate Data Engine.", str(err))
+            datalab.fab.append_result("Failed to terminate Data Engine.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -104,5 +103,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/deeplearning_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/deeplearning_configure.py
index 238f9b4..3be0192 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/deeplearning_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/deeplearning_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -40,8 +40,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = (os.environ['exploratory_name']).replace('_', '-').lower()
@@ -88,11 +88,11 @@
         edge_instance_hostname = GCPMeta.get_instance_public_ip_by_name(edge_instance_name)
         edge_instance_private_ip = GCPMeta.get_private_ip_address(edge_instance_name)
         notebook_config['ssh_key_path'] = '{0}{1}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['zone'] = os.environ['gcp_zone']
         notebook_config['shared_image_enabled'] = os.environ['conf_shared_image_enabled']
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -104,19 +104,19 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, notebook_config['ssh_key_path'], notebook_config['initial_user'],
-            notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -127,14 +127,14 @@
         additional_config = {"proxy_host": edge_instance_name, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
             .format(instance_hostname, notebook_config['instance_name'], notebook_config['ssh_key_path'],
-                    json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+                    json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -143,15 +143,15 @@
         logging.info('[INSTALLING PREREQUISITES TO DEEPLEARNING NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO DEEPLEARNING NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} --user {} --region {}". \
-            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['dlab_ssh_user'],
+            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['datalab_ssh_user'],
                    os.environ['gcp_region'])
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -163,18 +163,18 @@
                  "--scala_version {} --spark_version {} " \
                  "--hadoop_version {} --region {} " \
                  "--r_mirror {} --exploratory_name {} --edge_ip {}" \
-                 .format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['dlab_ssh_user'],
-                         os.environ['notebook_jupyter_version'], os.environ['notebook_scala_version'],
-                         os.environ['notebook_spark_version'], os.environ['notebook_hadoop_version'],
-                         os.environ['gcp_region'], os.environ['notebook_r_mirror'],
-                         notebook_config['exploratory_name'], edge_instance_private_ip)
+            .format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['datalab_ssh_user'],
+                    os.environ['notebook_jupyter_version'], os.environ['notebook_scala_version'],
+                    os.environ['notebook_spark_version'], os.environ['notebook_hadoop_version'],
+                    os.environ['gcp_region'], os.environ['notebook_r_mirror'],
+                    notebook_config['exploratory_name'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_deep_learning_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_deep_learning_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure Deep Learning node.", str(err))
+        datalab.fab.append_result("Failed to configure Deep Learning node.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -185,14 +185,14 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             instance_hostname, notebook_config['ssh_key_path'], json.dumps(additional_config),
-            notebook_config['dlab_ssh_user'])
+            notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -200,15 +200,15 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
         try:
-            local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -229,7 +229,7 @@
                 if image_id_list and image_id_list[1] != '':
                     print("Image of secondary disk was successfully created. It's ID is {}".format(image_id_list[1]))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
             GCPActions.remove_image(notebook_config['expected_primary_image_name'])
             GCPActions.remove_image(notebook_config['expected_secondary_image_name'])
@@ -250,24 +250,24 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     notebook_config['ssh_key_path'],
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'jupyter',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
     try:
         # generating output information
         ip_address = GCPMeta.get_private_ip_address(notebook_config['instance_name'])
-        tensorboard_url = "http://" + ip_address + ":6006/"
+        #tensorboard_url = "http://" + ip_address + ":6006/"
         jupyter_ip_url = 'http://' + ip_address + ':8888/{}/'.format(notebook_config['exploratory_name'])
         ungit_ip_url = "http://" + ip_address + ":8085/{}-ungit/".format(
             notebook_config['exploratory_name'])
@@ -275,8 +275,8 @@
             notebook_config['exploratory_name'])
         jupyter_ungit_access_url = "https://" + edge_instance_hostname + "/{}-ungit/".format(
             notebook_config['exploratory_name'])
-        tensorboard_access_url = "https://" + edge_instance_hostname + "/{}-tensor/".format(
-            notebook_config['exploratory_name'])
+        #tensorboard_access_url = "https://" + edge_instance_hostname + "/{}-tensor/".format(
+        #    notebook_config['exploratory_name'])
         print('[SUMMARY]')
         logging.info('[SUMMARY]')
         print("Instance name: {}".format(notebook_config['instance_name']))
@@ -284,12 +284,12 @@
         print("Instance type: {}".format(notebook_config['instance_type']))
         print("Key name: {}".format(notebook_config['key_name']))
         print("User key name: {}".format(notebook_config['project_name']))
-        print("TensorBoard URL: {}".format(tensorboard_url))
-        print("TensorBoard log dir: /var/log/tensorboard")
-        print("Jupyter URL: {}".format(jupyter_ip_url))
+        #print("TensorBoard URL: {}".format(tensorboard_url))
+        #print("TensorBoard log dir: /var/log/tensorboard")
+        print("JupyterLab URL: {}".format(jupyter_ip_url))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": ip_address,
@@ -300,10 +300,10 @@
                    "notebook_name": notebook_config['instance_name'],
                    "Action": "Create new notebook server",
                    "exploratory_url": [
-                       {"description": "Jupyter",
+                       {"description": "JupyterLab",
                         "url": jupyter_notebook_access_url},
-                       {"description": "TensorBoard",
-                        "url": tensorboard_access_url},
+                       #{"description": "TensorBoard",
+                       # "url": tensorboard_access_url},
                        {"description": "Ungit",
                         "url": jupyter_ungit_access_url}#,
                        #{"description": "Jupyter (via tunnel)",
@@ -315,6 +315,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information", str(err))
+        datalab.fab.append_result("Failed to generate output information", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/edge_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/edge_configure.py
index 110efb9..7507d59 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/edge_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/edge_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,17 @@
 #
 # ******************************************************************************
 
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import time
-import os
-import traceback
 import logging
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import os
+import sys
+import traceback
 import uuid
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -54,14 +53,15 @@
         GCPActions.remove_firewall(edge_conf['fw_ps_egress_private'])
         GCPActions.remove_firewall(edge_conf['fw_ps_egress_public'])
         GCPActions.remove_service_account(edge_conf['ps_service_account_name'], edge_conf['service_base_name'])
-        GCPActions.remove_role(edge_conf['ps_role_name'])
         GCPActions.remove_service_account(edge_conf['edge_service_account_name'], edge_conf['service_base_name'])
+        GCPActions.remove_role(edge_conf['ps_role_name'])
         GCPActions.remove_role(edge_conf['edge_role_name'])
         GCPActions.remove_subnet(edge_conf['subnet_name'], edge_conf['region'])
 
+
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         print('Generating infrastructure names and tags')
         edge_conf = dict()
         edge_conf['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -89,15 +89,14 @@
                                                                            edge_conf['endpoint_name'])
         edge_conf['edge_unique_index'] = GCPMeta.get_index_by_service_account_name(
             edge_conf['edge_service_account_name'])
-        edge_conf['edge_role_name'] = '{}-{}-{}-edge-role'.format(edge_conf['service_base_name'],
-                                                                  edge_conf['project_name'],
-                                                                  edge_conf['edge_unique_index'])
+        edge_conf['edge_role_name'] = '{}-{}-{}-{}-edge-role'.format(edge_conf['service_base_name'], edge_conf['project_name'],
+                                                                  edge_conf['endpoint_name'], edge_conf['edge_unique_index'])
         edge_conf['ps_service_account_name'] = '{}-{}-{}-ps-sa'.format(edge_conf['service_base_name'],
                                                                        edge_conf['project_name'],
                                                                        edge_conf['endpoint_name'])
         edge_conf['ps_unique_index'] = GCPMeta.get_index_by_service_account_name(edge_conf['ps_service_account_name'])
-        edge_conf['ps_role_name'] = '{}-{}-{}-ps-role'.format(edge_conf['service_base_name'],
-                                                              edge_conf['project_name'], edge_conf['ps_unique_index'])
+        edge_conf['ps_role_name'] = '{}-{}-{}-{}-ps-role'.format(edge_conf['service_base_name'], edge_conf['project_name'],
+                                                                 edge_conf['endpoint_name'], edge_conf['ps_unique_index'])
         edge_conf['instance_name'] = '{0}-{1}-{2}-edge'.format(edge_conf['service_base_name'],
                                                                edge_conf['project_name'], edge_conf['endpoint_name'])
         edge_conf['firewall_name'] = edge_conf['instance_name'] + '{}-sg'.format(edge_conf['instance_name'])
@@ -115,22 +114,22 @@
                                                                           edge_conf['project_name'],
                                                                           edge_conf['endpoint_name'])
         edge_conf['instance_hostname'] = GCPMeta.get_instance_public_ip_by_name(edge_conf['instance_name'])
-        edge_conf['dlab_ssh_user'] = os.environ['conf_os_user']
+        edge_conf['datalab_ssh_user'] = os.environ['conf_os_user']
         edge_conf['private_subnet_cidr'] = GCPMeta.get_subnet(edge_conf['subnet_name'],
-                                                                edge_conf['region'])['ipCidrRange']
+                                                              edge_conf['region'])['ipCidrRange']
         edge_conf['static_ip'] = \
             GCPMeta.get_static_address(edge_conf['region'], edge_conf['static_address_name'])['address']
         edge_conf['private_ip'] = GCPMeta.get_private_ip_address(edge_conf['instance_name'])
         edge_conf['vpc_cidrs'] = [edge_conf['vpc_cidr']]
-        edge_conf['fw_common_name'] = '{}-{}-{}-ps-sg'.format(edge_conf['service_base_name'], edge_conf['project_name'],
+        edge_conf['fw_common_name'] = '{}-{}-{}-ps'.format(edge_conf['service_base_name'], edge_conf['project_name'],
                                                               edge_conf['endpoint_name'])
-        edge_conf['fw_ps_ingress'] = '{}-ingress'.format(edge_conf['fw_common_name'])
-        edge_conf['fw_ps_egress_private'] = '{}-egress-private'.format(edge_conf['fw_common_name'])
-        edge_conf['fw_ps_egress_public'] = '{}-egress-public'.format(edge_conf['fw_common_name'])
-        edge_conf['fw_edge_ingress_public'] = '{}-ingress-public'.format(edge_conf['instance_name'])
-        edge_conf['fw_edge_ingress_internal'] = '{}-ingress-internal'.format(edge_conf['instance_name'])
-        edge_conf['fw_edge_egress_public'] = '{}-egress-public'.format(edge_conf['instance_name'])
-        edge_conf['fw_edge_egress_internal'] = '{}-egress-internal'.format(edge_conf['instance_name'])
+        edge_conf['fw_ps_ingress'] = '{}-sg-ingress'.format(edge_conf['fw_common_name'])
+        edge_conf['fw_ps_egress_private'] = '{}-sg-egress-private'.format(edge_conf['fw_common_name'])
+        edge_conf['fw_ps_egress_public'] = '{}-sg-egress-public'.format(edge_conf['fw_common_name'])
+        edge_conf['fw_edge_ingress_public'] = '{}-sg-ingress-public'.format(edge_conf['instance_name'])
+        edge_conf['fw_edge_ingress_internal'] = '{}-sg-ingress-internal'.format(edge_conf['instance_name'])
+        edge_conf['fw_edge_egress_public'] = '{}-sg-egress-public'.format(edge_conf['instance_name'])
+        edge_conf['fw_edge_egress_internal'] = '{}-sg-egress-internal'.format(edge_conf['instance_name'])
 
         if os.environ['conf_stepcerts_enabled'] == 'true':
             edge_conf['step_cert_sans'] = ' --san {0} --san {1} --san {2}'.format(edge_conf['static_ip'],
@@ -143,7 +142,7 @@
         for cidr in os.environ['conf_allowed_ip_cidr'].split(','):
             edge_conf['allowed_ip_cidr'].append(cidr.replace(' ', ''))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate infrastructure names", str(err))
+        datalab.fab.append_result("Failed to generate infrastructure names", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -155,19 +154,19 @@
             edge_conf['initial_user'] = 'ec2-user'
             edge_conf['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
-                 edge_conf['instance_hostname'], "/root/keys/" + os.environ['conf_key_name'] + ".pem",
-                 edge_conf['initial_user'], edge_conf['dlab_ssh_user'], edge_conf['sudo_group'])
+            edge_conf['instance_hostname'], "/root/keys/" + os.environ['conf_key_name'] + ".pem",
+            edge_conf['initial_user'], edge_conf['datalab_ssh_user'], edge_conf['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -175,15 +174,15 @@
         print('[INSTALLING PREREQUISITES]')
         logging.info('[INSTALLING PREREQUISITES]')
         params = "--hostname {} --keyfile {} --user {} --region {}".format(
-                  edge_conf['instance_hostname'], edge_conf['ssh_key_path'], edge_conf['dlab_ssh_user'],
-                  os.environ['gcp_region'])
+            edge_conf['instance_hostname'], edge_conf['ssh_key_path'], edge_conf['datalab_ssh_user'],
+            os.environ['gcp_region'])
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -201,14 +200,14 @@
                              "allowed_ip_cidr": edge_conf['allowed_ip_cidr']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}" \
                  .format(edge_conf['instance_hostname'], edge_conf['ssh_key_path'], json.dumps(additional_config),
-                         edge_conf['dlab_ssh_user'])
+                         edge_conf['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('configure_http_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_http_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing http proxy.", str(err))
+        datalab.fab.append_result("Failed installing http proxy.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -220,14 +219,14 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             edge_conf['instance_hostname'], edge_conf['ssh_key_path'], json.dumps(additional_config),
-            edge_conf['dlab_ssh_user'])
+            edge_conf['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key. Excpeption: " + str(err))
+        datalab.fab.append_result("Failed installing users key. Excpeption: " + str(err))
         clear_resources()
         sys.exit(1)
 
@@ -237,32 +236,64 @@
         edge_conf['keycloak_client_secret'] = str(uuid.uuid4())
         params = "--hostname {} --keyfile {} --user {} --keycloak_client_id {} --keycloak_client_secret {} " \
                  "--step_cert_sans '{}'".format(edge_conf['instance_hostname'], edge_conf['ssh_key_path'],
-                                                edge_conf['dlab_ssh_user'], '{}-{}-{}'.format(
-                                                                             edge_conf['service_base_name'],
-                                                                             edge_conf['project_name'],
-                                                                             edge_conf['endpoint_name']),
+                                                edge_conf['datalab_ssh_user'], '{}-{}-{}'.format(
+                edge_conf['service_base_name'],
+                edge_conf['project_name'],
+                edge_conf['endpoint_name']),
                                                 edge_conf['keycloak_client_secret'], edge_conf['step_cert_sans'])
 
         try:
-            local("~/scripts/{}.py {}".format('configure_nginx_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_nginx_reverse_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
+
+        if os.environ['conf_letsencrypt_enabled'] == 'true' and 'conf_letsencrypt_domain_name' in os.environ:
+            edge_conf['edge_hostname'] = '{}.{}'.format(edge_conf['project_name'], os.environ['conf_letsencrypt_domain_name'])
+        else:
+            edge_conf['edge_hostname'] = "''"
         keycloak_params = "--service_base_name {} --keycloak_auth_server_url {} --keycloak_realm_name {} " \
                           "--keycloak_user {} --keycloak_user_password {} --keycloak_client_secret {} " \
-                          "--edge_public_ip {} --project_name {} --endpoint_name {} " \
+                          "--edge_public_ip {} --project_name {} --endpoint_name {} --hostname {} " \
             .format(edge_conf['service_base_name'], os.environ['keycloak_auth_server_url'],
                     os.environ['keycloak_realm_name'], os.environ['keycloak_user'],
                     os.environ['keycloak_user_password'],
                     edge_conf['keycloak_client_secret'], edge_conf['instance_hostname'], edge_conf['project_name'],
-                    edge_conf['endpoint_name'])
+                    edge_conf['endpoint_name'], edge_conf['edge_hostname'])
         try:
-            local("~/scripts/{}.py {}".format('configure_keycloak', keycloak_params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_keycloak', keycloak_params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing nginx reverse proxy. Excpeption: " + str(err))
+        datalab.fab.append_result("Failed installing nginx reverse proxy. Excpeption: " + str(err))
+        clear_resources()
+        sys.exit(1)
+
+    try:
+        print('[CONFIGRING EDGE AS NAT]')
+        if os.environ['edge_is_nat'] == 'true':
+            print('Installing nftables')
+            additional_config = {"exploratory_subnet": edge_conf['private_subnet_cidr'],
+                                 "edge_ip": edge_conf['private_ip']}
+            params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
+                edge_conf['instance_hostname'], edge_conf['ssh_key_path'], json.dumps(additional_config),
+                edge_conf['datalab_ssh_user'])
+            try:
+                subprocess.run("~/scripts/{}.py {}".format('configure_nftables', params), shell=True, check=True)
+            except:
+                traceback.print_exc()
+                raise Exception
+    except Exception as err:
+        datalab.fab.append_result("Failed to configure NAT." + str(err))
+        clear_resources()
+        sys.exit(1)
+
+    try:
+        logging.info('[GET AVAILABLE GPU TYPES]')
+        edge_conf['gpu_types'] = GCPMeta.get_list_gpu_types(edge_conf['zone'])
+    except Exception as err:
+        datalab.fab.datalab.fab.append_result("Unable to get available GPU types.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -277,6 +308,7 @@
         print("Bucket name: {}".format(edge_conf['bucket_name']))
         print("Shared bucket name: {}".format(edge_conf['shared_bucket_name']))
         print("Notebook subnet: {}".format(edge_conf['private_subnet_cidr']))
+        print("Available GPU types: {}".format(edge_conf['gpu_types']))
         with open("/root/result.json", 'w') as result:
             res = {"hostname": edge_conf['instance_hostname'],
                    "public_ip": edge_conf['static_ip'],
@@ -290,11 +322,12 @@
                    "notebook_subnet": edge_conf['private_subnet_cidr'],
                    "full_edge_conf": edge_conf,
                    "project_name": edge_conf['project_name'],
-                   "@class": "com.epam.dlab.dto.gcp.edge.EdgeInfoGcp",
+                   "gpu_types": edge_conf['gpu_types'],
+                   "@class": "com.epam.datalab.dto.gcp.edge.EdgeInfoGcp",
                    "Action": "Create new EDGE server"}
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
+        datalab.fab.append_result("Error with writing results.", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/edge_create_static_ip.py b/infrastructure-provisioning/src/general/scripts/gcp/edge_create_static_ip.py
index 8d648d2..0411f7e 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/edge_create_static_ip.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/edge_create_static_ip.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,12 +21,12 @@
 #
 # ******************************************************************************
 
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-import os
 import argparse
+import os
+import sys
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--address_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/edge_start.py b/infrastructure-provisioning/src/general/scripts/gcp/edge_start.py
index 52da1be..eddcfa2 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/edge_start.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/edge_start.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,13 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
+import json
 import logging
 import os
 import sys
-import json
-
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -39,8 +38,8 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print('Generating infrastructure names and tags')
     edge_conf = dict()
     edge_conf['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -59,7 +58,7 @@
     try:
         GCPActions.start_instance(edge_conf['instance_name'], edge_conf['zone'])
     except Exception as err:
-        dlab.fab.append_result("Failed to start edge.", str(err))
+        datalab.fab.append_result("Failed to start edge.", str(err))
         sys.exit(1)
 
     try:
@@ -82,6 +81,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
-
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/edge_status.py b/infrastructure-provisioning/src/general/scripts/gcp/edge_status.py
index 4eb0cc9..d7b2dbb 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/edge_status.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/edge_status.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,32 +22,33 @@
 # ******************************************************************************
 
 
-import json
-from dlab.fab import *
-from dlab.meta_lib import *
-import sys, time, os
-from dlab.actions_lib import *
-
+import os
+import sys
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 if __name__ == "__main__":
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/edge/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
 
-    print('Getting statuses of DLAB resources')
+    print('Getting statuses of DataLab resources')
 
     try:
         logging.info('[COLLECT DATA]')
         print('[COLLECTING DATA]')
         params = '--list_resources "{}"'.format(os.environ['edge_list_resources'])
         try:
-            local("~/scripts/{}.py {}".format('common_collect_data', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_collect_data', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
         print('Error: {0}'.format(err))
-        append_result("Failed to collect information about DLAB resources.", str(err))
-        sys.exit(1)
\ No newline at end of file
+        append_result("Failed to collect information about DataLab resources.", str(err))
+        sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/edge_stop.py b/infrastructure-provisioning/src/general/scripts/gcp/edge_stop.py
index ee15222..e8ac3f3 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/edge_stop.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/edge_stop.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,13 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-import logging
-import sys
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-
+import logging
+import os
+import sys
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -39,8 +38,8 @@
                         filename=local_log_filepath)
 
     print('Generating infrastructure names and tags')
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     edge_conf = dict()
     edge_conf['service_base_name'] = (os.environ['conf_service_base_name'])
     edge_conf['zone'] = os.environ['gcp_zone']
@@ -54,7 +53,7 @@
     try:
         GCPActions.stop_instance(edge_conf['instance_name'], edge_conf['zone'])
     except Exception as err:
-        dlab.fab.append_result("Failed to stop edge.", str(err))
+        datalab.fab.append_result("Failed to stop edge.", str(err))
         sys.exit(1)
 
     try:
@@ -64,5 +63,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/edge_terminate.py b/infrastructure-provisioning/src/general/scripts/gcp/edge_terminate.py
index 8080988..d92b697 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/edge_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/edge_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,14 @@
 #
 # ******************************************************************************
 
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import sys
-import time
-import os
-import traceback
 import logging
+import os
+import sys
+import traceback
 
 
 def terminate_edge_node(user_name, service_base_name, region, zone, project_name, endpoint_name):
@@ -47,7 +46,7 @@
         else:
             print("There are no Dataproc clusters to terminate.")
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate dataproc", str(err))
+        datalab.fab.append_result("Failed to terminate dataproc", str(err))
         sys.exit(1)
 
     print("Terminating EDGE and notebook instances")
@@ -61,7 +60,7 @@
                 if 'user' in i['labels'] and user_name == i['labels']['user']:
                     GCPActions.remove_instance(i['name'], zone)
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate instances", str(err))
+        datalab.fab.append_result("Failed to terminate instances", str(err))
         sys.exit(1)
 
     print("Removing static addresses")
@@ -72,7 +71,7 @@
                 if bool(set(targets) & set([i['name']])):
                     GCPActions.remove_static_address(i['name'], region)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove static IPs", str(err))
+        datalab.fab.append_result("Failed to remove static IPs", str(err))
         sys.exit(1)
 
     print("Removing storage bucket")
@@ -83,7 +82,7 @@
                 if bool(set(targets) & set([i['name']])):
                     GCPActions.remove_bucket(i['name'])
     except Exception as err:
-        dlab.fab.append_result("Failed to remove buckets", str(err))
+        datalab.fab.append_result("Failed to remove buckets", str(err))
         sys.exit(1)
 
     print("Removing firewalls")
@@ -94,7 +93,7 @@
                 if bool(set(targets) & set(i['targetTags'])):
                     GCPActions.remove_firewall(i['name'])
     except Exception as err:
-        dlab.fab.append_result("Failed to remove security groups", str(err))
+        datalab.fab.append_result("Failed to remove security groups", str(err))
         sys.exit(1)
 
     print("Removing Service accounts and roles")
@@ -108,7 +107,7 @@
             if role.startswith(service_base_name):
                 GCPActions.remove_role(role)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove service accounts and roles", str(err))
+        datalab.fab.append_result("Failed to remove service accounts and roles", str(err))
         sys.exit(1)
 
     print("Removing subnets")
@@ -122,7 +121,7 @@
                 if bool(set(targets) & set([i['name']])):
                     GCPActions.remove_subnet(i['name'], region)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove subnets", str(err))
+        datalab.fab.append_result("Failed to remove subnets", str(err))
         sys.exit(1)
 
 
@@ -135,8 +134,8 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print('Generating infrastructure names and tags')
     edge_conf = dict()
     edge_conf['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -155,7 +154,7 @@
                                 edge_conf['endpoint_name'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate edge.", str(err))
+            datalab.fab.append_result("Failed to terminate edge.", str(err))
             raise Exception
     except:
         sys.exit(1)
@@ -168,5 +167,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/jupyter_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/jupyter_configure.py
index 863be19..0ede3eb 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/jupyter_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/jupyter_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -40,8 +40,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = (os.environ['exploratory_name']).replace('_', '-').lower()
@@ -88,11 +88,11 @@
         edge_instance_hostname = GCPMeta.get_instance_public_ip_by_name(edge_instance_name)
         edge_instance_private_ip = GCPMeta.get_private_ip_address(edge_instance_name)
         notebook_config['ssh_key_path'] = '{0}{1}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['zone'] = os.environ['gcp_zone']
         notebook_config['shared_image_enabled'] = os.environ['conf_shared_image_enabled']
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -104,19 +104,19 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, notebook_config['ssh_key_path'], notebook_config['initial_user'],
-            notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -127,14 +127,14 @@
         additional_config = {"proxy_host": edge_instance_name, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(instance_hostname, notebook_config['instance_name'], notebook_config['ssh_key_path'],
-                    json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+                    json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -142,16 +142,16 @@
     try:
         logging.info('[INSTALLING PREREQUISITES TO JUPYTER NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO JUPYTER NOTEBOOK INSTANCE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['dlab_ssh_user'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['datalab_ssh_user'],
                    os.environ['gcp_region'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -167,16 +167,16 @@
                  "--edge_ip {}".\
             format(instance_hostname, notebook_config['ssh_key_path'],
                    os.environ['gcp_region'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], notebook_config['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], notebook_config['datalab_ssh_user'],
                    os.environ['notebook_scala_version'], os.environ['notebook_r_mirror'],
                    notebook_config['exploratory_name'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_jupyter_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_jupyter_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure jupyter.", str(err))
+        datalab.fab.append_result("Failed to configure jupyter.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -187,14 +187,14 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             instance_hostname, notebook_config['ssh_key_path'], json.dumps(additional_config),
-            notebook_config['dlab_ssh_user'])
+            notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -202,15 +202,15 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
         try:
-            local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -231,12 +231,28 @@
                 if image_id_list and image_id_list[1] != '':
                     print("Image of secondary disk was successfully created. It's ID is {}".format(image_id_list[1]))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
             GCPActions.remove_image(notebook_config['expected_primary_image_name'])
             GCPActions.remove_image(notebook_config['expected_secondary_image_name'])
             sys.exit(1)
 
+    if os.environ['gpu_enabled'] == 'True':
+        try:
+            print('[INSTALLING GPU DRIVERS]')
+            params = "--hostname {} --keyfile {} --os_user {}".format(
+                instance_hostname, notebook_config['ssh_key_path'], notebook_config['datalab_ssh_user'])
+            try:
+                subprocess.run("~/scripts/{}.py {}".format('common_install_gpu', params), shell=True, check=True)
+            except:
+                datalab.fab.append_result("Failed installing gpu drivers")
+                raise Exception
+
+        except Exception as err:
+            datalab.fab.append_result("Failed to install GPU drivers.", str(err))
+            GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+            sys.exit(1)
+
     try:
         print('[SETUP EDGE REVERSE PROXY TEMPLATE]')
         logging.info('[SETUP EDGE REVERSE PROXY TEMPLATE]')
@@ -252,17 +268,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     notebook_config['ssh_key_path'],
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'jupyter',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -287,7 +303,7 @@
         print("ReverseProxyNotebook".format(jupyter_notebook_access_url))
         print("ReverseProxyUngit".format(jupyter_ungit_access_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": ip_address,
@@ -308,6 +324,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information", str(err))
+        datalab.fab.append_result("Failed to generate output information", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/jupyter_dataengine-service_create_configs.py b/infrastructure-provisioning/src/general/scripts/gcp/jupyter_dataengine-service_create_configs.py
index 9bc8e37..075e456 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/jupyter_dataengine-service_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/jupyter_dataengine-service_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,20 +21,14 @@
 #
 # ******************************************************************************
 
-import boto3
-from botocore.client import Config
-from fabric.api import *
 import argparse
-import os
 import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -51,6 +45,8 @@
 parser.add_argument('--r_version', type=str, default='')
 parser.add_argument('--r_enabled', type=str, default='')
 parser.add_argument('--scala_version', type=str, default='')
+parser.add_argument('--python_version', type=str, default='')
+parser.add_argument('--master_ip', type=str, default='')
 args = parser.parse_args()
 
 dataproc_dir = '/opt/{}/jars/'.format(args.dataproc_version)
@@ -61,7 +57,7 @@
 
 def r_kernel(args):
     spark_path = '/opt/{}/{}/spark/'.format(args.dataproc_version, args.cluster_name)
-    local('mkdir -p {}/r_{}/'.format(kernels_dir, args.cluster_name))
+    subprocess.run('mkdir -p {}/r_{}/'.format(kernels_dir, args.cluster_name), shell=True, check=True)
     kernel_path = "{}/r_{}/kernel.json".format(kernels_dir, args.cluster_name)
     template_file = "/tmp/r_dataengine-service_template.json"
 
@@ -80,10 +76,10 @@
 
 def toree_kernel(args):
     spark_path = '/opt/{0}/{1}/spark/'.format(args.dataproc_version, args.cluster_name)
-    local('mkdir -p {0}toree_{1}/'.format(kernels_dir, args.cluster_name))
-    local('tar zxvf /tmp/toree_kernel.tar.gz -C {0}toree_{1}/'.format(kernels_dir, args.cluster_name))
-    local('sudo mv {0}toree_{1}/toree-0.2.0-incubating/* {0}toree_{1}/'.format(kernels_dir, args.cluster_name))
-    local('sudo rm -r {0}toree_{1}/toree-0.2.0-incubating'.format(kernels_dir, args.cluster_name))
+    subprocess.run('mkdir -p {0}toree_{1}/'.format(kernels_dir, args.cluster_name), shell=True, check=True)
+    subprocess.run('tar zxvf /tmp/toree_kernel.tar.gz -C {0}toree_{1}/'.format(kernels_dir, args.cluster_name), shell=True, check=True)
+    subprocess.run('sudo mv {0}toree_{1}/toree-0.3.0-incubating/* {0}toree_{1}/'.format(kernels_dir, args.cluster_name), shell=True, check=True)
+    subprocess.run('sudo rm -r {0}toree_{1}/toree-0.3.0-incubating'.format(kernels_dir, args.cluster_name), shell=True, check=True)
     kernel_path = '{0}toree_{1}/kernel.json'.format(kernels_dir, args.cluster_name)
     template_file = "/tmp/toree_dataengine-service_templatev2.json"
     with open(template_file, 'r') as f:
@@ -96,12 +92,10 @@
     text = text.replace('SCALA_VERSION', args.scala_version)
     with open(kernel_path, 'w') as f:
         f.write(text)
-    local('touch /tmp/kernel_var.json')
-    local(
-        "PYJ=`find /opt/" + args.dataproc_version + "/" + args.cluster_name +
-        "/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat " + kernel_path +
-        " | sed 's|PY4J|'$PYJ'|g' > /tmp/kernel_var.json")
-    local('sudo mv /tmp/kernel_var.json ' + kernel_path)
+    subprocess.run('touch /tmp/kernel_var.json', shell=True, check=True)
+    subprocess.run(
+        '''bash -l -c "PYJ=`find /opt/{}/{}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {} | sed 's|PY4J|'$PYJ'|g' > /tmp/kernel_var.json" '''.format(args.dataproc_version, args.cluster_name, kernel_path), shell=True, check=True)
+    subprocess.run('sudo mv /tmp/kernel_var.json ' + kernel_path, shell=True, check=True)
     run_sh_path = kernels_dir + "toree_" + args.cluster_name + "/bin/run.sh"
     template_sh_file = '/tmp/run_template.sh'
     with open(template_sh_file, 'r') as f:
@@ -111,20 +105,47 @@
     with open(run_sh_path, 'w') as f:
         f.write(text)
 
+def install_sparkamagic_kernels(args):
+    try:
+        subprocess.run('sudo jupyter nbextension enable --py --sys-prefix widgetsnbextension')
+        sparkmagic_dir = subprocess.run("sudo pip3 show sparkmagic | grep 'Location: ' | awk '{print $2}'", capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/sparkkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user), shell=True, check=True)
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/pysparkkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user), shell=True, check=True)
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/sparkrkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user), shell=True, check=True)
+        pyspark_kernel_name = 'PySpark (Python-{0} / Spark-{1} ) [{2}]'.format(args.python_version, args.spark_version,
+                                                                         args.cluster_name)
+        subprocess.run('sed -i \'s|PySpark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/pysparkkernel/kernel.json'.format(
+            pyspark_kernel_name, args.os_user), shell=True, check=True)
+        spark_kernel_name = 'Spark (Scala-{0} / Spark-{1} ) [{2}]'.format(args.scala_version, args.spark_version,
+                                                                         args.cluster_name)
+        subprocess.run('sed -i \'s|Spark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkkernel/kernel.json'.format(
+            spark_kernel_name, args.os_user), shell=True, check=True)
+        sparkr_kernel_name = 'SparkR (R-{0} / Spark-{1} ) [{2}]'.format(args.r_version, args.spark_version,
+                                                                            args.cluster_name)
+        subprocess.run('sed -i \'s|SparkR|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkrkernel/kernel.json'.format(
+            sparkr_kernel_name, args.os_user), shell=True, check=True)
+        subprocess.run('mkdir -p /home/' + args.os_user + '/.sparkmagic', shell=True, check=True)
+        subprocess.run('cp -f /tmp/sparkmagic_config_template.json /home/' + args.os_user + '/.sparkmagic/config.json', shell=True, check=True)
+        subprocess.run('sed -i \'s|LIVY_HOST|{0}|g\' /home/{1}/.sparkmagic/config.json'.format(
+                args.master_ip, args.os_user), shell=True, check=True)
+        subprocess.run('sudo chown -R {0}:{0} /home/{0}/.sparkmagic/'.format(args.os_user), shell=True, check=True)
+    except:
+        sys.exit(1)
 
 if __name__ == "__main__":
     if args.dry_run == 'true':
         parser.print_help()
     else:
-        result = prepare(dataproc_dir, yarn_dir)
-        if result == False :
-            actions_lib.GCPActions().jars(args, dataproc_dir)
-        actions_lib.GCPActions().yarn(args, yarn_dir)
-        actions_lib.GCPActions().install_dataproc_spark(args)
-        pyspark_kernel(kernels_dir, args.dataproc_version, args.cluster_name, args.spark_version, args.bucket,
-                       args.user_name, args.region, args.os_user, args.application, args.pip_mirror)
-        toree_kernel(args)
-        if args.r_enabled == 'true':
-            r_kernel(args)
-        actions_lib.GCPActions().spark_defaults(args)
-        configuring_notebook(args.dataproc_version)
+        install_sparkamagic_kernels(args)
+        #result = prepare(dataproc_dir, yarn_dir)
+        #if result == False :
+        #    actions_lib.GCPActions().jars(args, dataproc_dir)
+        #actions_lib.GCPActions().yarn(args, yarn_dir)
+        #actions_lib.GCPActions().install_dataproc_spark(args)
+        #pyspark_kernel(kernels_dir, args.dataproc_version, args.cluster_name, args.spark_version, args.bucket,
+        #               args.user_name, args.region, args.os_user, args.application, args.pip_mirror)
+        #toree_kernel(args)
+        #if args.r_enabled == 'true':
+        #    r_kernel(args)
+        #actions_lib.GCPActions().spark_defaults(args)
+        #configuring_notebook(args.dataproc_version)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/jupyter_install_dataengine-service_kernels.py b/infrastructure-provisioning/src/general/scripts/gcp/jupyter_install_dataengine-service_kernels.py
index cb17668..7fc3ae9 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/jupyter_install_dataengine-service_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/jupyter_install_dataengine-service_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -9,9 +9,9 @@
 # to you under the Apache License, Version 2.0 (the
 # "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
-# 
+#
 #   http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
 # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -22,11 +22,11 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-import boto3
-from dlab.meta_lib import *
-from dlab.actions_lib import *
 import os
+from datalab.actions_lib import *
+from datalab.meta_lib import *
+from datalab.fab import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -46,49 +46,78 @@
 parser.add_argument('--application', type=str, default='')
 args = parser.parse_args()
 
-
 def configure_notebook(args):
     templates_dir = '/root/templates/'
     files_dir = '/root/files/'
     scripts_dir = '/root/scripts/'
-    put(templates_dir + 'pyspark_dataengine-service_template.json', '/tmp/pyspark_dataengine-service_template.json')
-    put(templates_dir + 'r_dataengine-service_template.json', '/tmp/r_dataengine-service_template.json')
-    put(templates_dir + 'toree_dataengine-service_template.json','/tmp/toree_dataengine-service_template.json')
-    put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application), '/tmp/create_configs.py')
-    put(files_dir + 'toree_kernel.tar.gz', '/tmp/toree_kernel.tar.gz')
-    put(templates_dir + 'toree_dataengine-service_templatev2.json', '/tmp/toree_dataengine-service_templatev2.json')
-    put(templates_dir + 'run_template.sh', '/tmp/run_template.sh')
-    sudo('\cp /tmp/create_configs.py /usr/local/bin/create_configs.py')
-    sudo('chmod 755 /usr/local/bin/create_configs.py')
-    sudo('mkdir -p /usr/lib/python2.7/dlab/')
-    run('mkdir -p /tmp/dlab_libs/')
-    local('scp -i {} /usr/lib/python2.7/dlab/* {}:/tmp/dlab_libs/'.format(args.keyfile, env.host_string))
-    run('chmod a+x /tmp/dlab_libs/*')
-    sudo('mv /tmp/dlab_libs/* /usr/lib/python2.7/dlab/')
-    if exists('/usr/lib64'):
-        sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+    datalab.fab.conn.put(templates_dir + 'sparkmagic_config_template.json', '/tmp/sparkmagic_config_template.json')
+    # conn.put(templates_dir + 'pyspark_dataengine-service_template.json', '/tmp/pyspark_dataengine-service_template.json')
+    # conn.put(templates_dir + 'r_dataengine-service_template.json', '/tmp/r_dataengine-service_template.json')
+    # conn.put(templates_dir + 'toree_dataengine-service_template.json','/tmp/toree_dataengine-service_template.json')
+    datalab.fab.conn.put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application), '/tmp/create_configs.py')
+    # conn.put(files_dir + 'toree_kernel.tar.gz', '/tmp/toree_kernel.tar.gz')
+    # conn.put(templates_dir + 'toree_dataengine-service_templatev2.json', '/tmp/toree_dataengine-service_templatev2.json')
+    # conn.put(templates_dir + 'run_template.sh', '/tmp/run_template.sh')
+    datalab.fab.conn.sudo('\cp /tmp/create_configs.py /usr/local/bin/create_configs.py')
+    datalab.fab.conn.sudo('chmod 755 /usr/local/bin/create_configs.py')
+    datalab.fab.conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+    datalab.fab.conn.run('mkdir -p /tmp/datalab_libs/')
+    host_string = args.os_user + "@" + args.notebook_ip
+    datalab.fab.conn.local('scp -i {} /usr/lib/python3.8/datalab/*.py {}:/tmp/datalab_libs/'.format(args.keyfile, host_string))
+    datalab.fab.conn.run('chmod a+x /tmp/datalab_libs/*')
+    datalab.fab.conn.sudo('mv /tmp/datalab_libs/* /usr/lib/python3.8/datalab/')
+    if exists(datalab.fab.conn, '/usr/lib64'):
+        datalab.fab.conn.sudo('mkdir -p /usr/lib64/python3.8')
+        datalab.fab.conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
+
+def install_sparkamagic_kernels(args):
+    try:
+        datalab.fab.conn.sudo('jupyter nbextension enable --py --sys-prefix widgetsnbextension')
+        sparkmagic_dir = datalab.fab.conn.sudo(''' bash -l -c 'pip3 show sparkmagic | grep "Location: "' ''').stdout.rstrip("\n\r").split(' ')[1]
+        datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/sparkkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/pysparkkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/sparkrkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        pyspark_kernel_name = 'PySpark (Python-{0} / Spark-{1} ) [{2}]'.format(args.python_version, args.spark_version,
+                                                                         args.cluster_name)
+        datalab.fab.conn.sudo('sed -i \'s|PySpark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/pysparkkernel/kernel.json'.format(
+            pyspark_kernel_name, args.os_user))
+        spark_kernel_name = 'Spark (Scala-{0} / Spark-{1} ) [{2}]'.format(args.scala_version, args.spark_version,
+                                                                         args.cluster_name)
+        datalab.fab.conn.sudo('sed -i \'s|Spark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkkernel/kernel.json'.format(
+            spark_kernel_name, args.os_user))
+        sparkr_kernel_name = 'SparkR (R-{0} / Spark-{1} ) [{2}]'.format(args.r_version, args.spark_version,
+                                                                            args.cluster_name)
+        datalab.fab.conn.sudo('sed -i \'s|SparkR|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkrkernel/kernel.json'.format(
+            sparkr_kernel_name, args.os_user))
+        datalab.fab.conn.sudo('mkdir -p /home/' + args.os_user + '/.sparkmagic')
+        datalab.fab.conn.sudo('cp -f /tmp/sparkmagic_config_template.json /home/' + args.os_user + '/.sparkmagic/config.json')
+        datalab.fab.conn.sudo('sed -i \'s|LIVY_HOST|{0}|g\' /home/{1}/.sparkmagic/config.json'.format(
+                args.master_ip, args.os_user))
+        datalab.fab.conn.sudo('chown -R {0}:{0} /home/{0}/.sparkmagic/'.format(args.os_user))
+    except:
+        sys.exit(1)
 
 
 if __name__ == "__main__":
     GCPActions().get_from_bucket(args.bucket, '{0}/{1}/scala_version'.format(args.project_name, args.cluster_name),
                                  '/tmp/scala_version')
-    with file('/tmp/scala_version') as f:
+    with open('/tmp/scala_version') as f:
         scala_version = str(f.read()).replace(',', '')
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     configure_notebook(args)
-    spark_version = actions_lib.GCPActions().get_cluster_app_version(args.bucket, args.project_name,
+    args.spark_version = GCPActions().get_cluster_app_version(args.bucket, args.project_name,
                                                                      args.cluster_name, 'spark')
-    hadoop_version = actions_lib.GCPActions().get_cluster_app_version(args.bucket, args.project_name,
+    args.python_version = GCPActions().get_cluster_app_version(args.bucket, args.project_name,
+                                                                     args.cluster_name, 'python')
+    args.hadoop_version = GCPActions().get_cluster_app_version(args.bucket, args.project_name,
                                                                       args.cluster_name, 'hadoop')
-    r_version = actions_lib.GCPActions().get_cluster_app_version(args.bucket, args.project_name,
+    args.r_version = GCPActions().get_cluster_app_version(args.bucket, args.project_name,
                                                                  args.cluster_name, 'r')
-    r_enabled = os.environ['notebook_r_enabled']
-    sudo('echo "[global]" > /etc/pip.conf; echo "proxy = $(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=)" >> /etc/pip.conf')
-    sudo('echo "use_proxy=yes" > ~/.wgetrc; proxy=$(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=); echo "http_proxy=$proxy" >> ~/.wgetrc; echo "https_proxy=$proxy" >> ~/.wgetrc')
-    sudo('unset http_proxy https_proxy; export gcp_project_id="{0}"; export conf_resource="{1}"; /usr/bin/python /usr/local/bin/create_configs.py --bucket {2} --cluster_name {3} --dataproc_version {4} --spark_version {5} --hadoop_version {6} --region {7} --user_name {8} --os_user {9} --pip_mirror {10} --application {11} --r_version {12} --r_enabled {13} --scala_version {14}'
-         .format(os.environ['gcp_project_id'], os.environ['conf_resource'], args.bucket, args.cluster_name,
-                 args.dataproc_version, spark_version, hadoop_version, args.region, args.project_name, args.os_user,
-                 args.pip_mirror, args.application, r_version, r_enabled, scala_version))
+    #r_enabled = os.environ['notebook_r_enabled']
+    master_host = '{}-m'.format(args.cluster_name)
+    args.master_ip = get_instance_private_ip_address(os.environ['gcp_zone'], master_host)
+    #datalab.fab.conn.sudo('''bash -c 'echo "[global]" > /etc/pip.conf; echo "proxy = $(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=)" >> /etc/pip.conf' ''')
+    #datalab.fab.conn.sudo('''bash -c 'echo "use_proxy=yes" > ~/.wgetrc; proxy=$(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=); echo "http_proxy=$proxy" >> ~/.wgetrc; echo "https_proxy=$proxy" >> ~/.wgetrc' ''')
+    #datalab.fab.conn.sudo('''bash -c 'unset http_proxy https_proxy; export gcp_project_id="{0}"; export conf_resource="{1}"; /usr/bin/python3 /usr/local/bin/create_configs.py --bucket {2} --cluster_name {3} --dataproc_version {4} --spark_version {5} --hadoop_version {6} --region {7} --user_name {8} --os_user {9} --pip_mirror {10} --application {11} --r_version {12} --r_enabled {13} --python_version {14}  --master_ip {15} --scala_version {16}' '''.format(os.environ['gcp_project_id'], os.environ['conf_resource'], args.bucket, args.cluster_name, args.dataproc_version, spark_version, hadoop_version, args.region, args.project_name, args.os_user, args.pip_mirror, args.application, r_version, r_enabled, python_version, master_ip, scala_version))
+
+    install_sparkamagic_kernels(args)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/jupyterlab_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/jupyterlab_configure.py
index ee95260..4207257 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/jupyterlab_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/jupyterlab_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -40,8 +40,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = (os.environ['exploratory_name']).replace('_', '-').lower()
@@ -88,11 +88,11 @@
         edge_instance_hostname = GCPMeta.get_instance_public_ip_by_name(edge_instance_name)
         edge_instance_private_ip = GCPMeta.get_private_ip_address(edge_instance_name)
         notebook_config['ssh_key_path'] = '{0}{1}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['zone'] = os.environ['gcp_zone']
         notebook_config['shared_image_enabled'] = os.environ['conf_shared_image_enabled']
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -104,19 +104,19 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, notebook_config['ssh_key_path'], notebook_config['initial_user'],
-            notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -127,14 +127,14 @@
         additional_config = {"proxy_host": edge_instance_name, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(instance_hostname, notebook_config['instance_name'], notebook_config['ssh_key_path'],
-                    json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+                    json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -142,16 +142,16 @@
     try:
         logging.info('[INSTALLING PREREQUISITES TO JUPYTERLAB NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO JUPYTERLAB NOTEBOOK INSTANCE]')
-        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}".\
-            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['dlab_ssh_user'],
+        params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
+            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['datalab_ssh_user'],
                    os.environ['gcp_region'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -166,16 +166,16 @@
                  "--exploratory_name {}".\
             format(instance_hostname, notebook_config['ssh_key_path'], edge_instance_private_ip,
                    os.environ['gcp_region'], os.environ['notebook_spark_version'],
-                   os.environ['notebook_hadoop_version'], notebook_config['dlab_ssh_user'],
+                   os.environ['notebook_hadoop_version'], notebook_config['datalab_ssh_user'],
                    os.environ['notebook_scala_version'], os.environ['notebook_r_mirror'],
-                   notebook_config['exploratory_name'],)
+                   notebook_config['exploratory_name'], )
         try:
-            local("~/scripts/{}.py {}".format('configure_jupyterlab_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_jupyterlab_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure jupyter.", str(err))
+        datalab.fab.append_result("Failed to configure jupyter.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -186,14 +186,14 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             instance_hostname, notebook_config['ssh_key_path'], json.dumps(additional_config),
-            notebook_config['dlab_ssh_user'])
+            notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -201,19 +201,19 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
         try:
-            local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
-    if notebook_config['shared_image_enabled'] == 'true':
+    if notebook_config['image_enabled'] == 'true':
         try:
             print('[CREATING IMAGE]')
             primary_image_id = GCPMeta.get_image_by_name(notebook_config['expected_primary_image_name'])
@@ -230,7 +230,7 @@
                 if image_id_list and image_id_list[1] != '':
                     print("Image of secondary disk was successfully created. It's ID is {}".format(image_id_list[1]))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
             GCPActions.remove_image(notebook_config['expected_primary_image_name'])
             GCPActions.remove_image(notebook_config['expected_secondary_image_name'])
@@ -251,17 +251,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_private_ip,
                     notebook_config['ssh_key_path'],
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'jupyter',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -273,14 +273,14 @@
                  "--os_user {} ". \
             format(instance_hostname,
                    notebook_config['ssh_key_path'],
-                   notebook_config['dlab_ssh_user'])
+                   notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/configure_proxy_for_docker.py {}".format(params))
+            subprocess.run("~/scripts/configure_proxy_for_docker.py {}".format(params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy for docker.", str(err))
+        datalab.fab.append_result("Failed to configure proxy for docker.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -293,14 +293,14 @@
                  "--os_user {} ". \
             format(instance_hostname,
                    notebook_config['ssh_key_path'],
-                   notebook_config['dlab_ssh_user'])
+                   notebook_config['datalab_ssh_user'])
         try:
-           local("~/scripts/jupyterlab_container_start.py {}".format(params))
+           subprocess.run("~/scripts/jupyterlab_container_start.py {}".format(params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to start Jupyter container.", str(err))
+        datalab.fab.append_result("Failed to start Jupyter container.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -325,7 +325,7 @@
         print("ReverseProxyNotebook".format(jupyter_notebook_acces_url))
         print("ReverseProxyUngit".format(jupyter_ungit_acces_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": ip_address,
@@ -346,6 +346,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information", str(err))
+        datalab.fab.append_result("Failed to generate output information", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/project_prepare.py b/infrastructure-provisioning/src/general/scripts/gcp/project_prepare.py
index f9822a0..91b5d32 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/project_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/project_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,17 @@
 #
 # ******************************************************************************
 
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import time
-import os
-import traceback
 import logging
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import os
+import sys
+import traceback
 import uuid
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -42,8 +41,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         print('Generating infrastructure names and tags')
         project_conf = dict()
         project_conf['edge_unique_index'] = str(uuid.uuid4())[:5]
@@ -120,7 +119,7 @@
                                            "sbn": project_conf['service_base_name'],
                                            "project_tag": project_conf['project_tag'],
                                            "endpoint_tag": project_conf['endpoint_tag'],
-                                           "product": "dlab"}
+                                           "product": "datalab"}
         project_conf['tag_name'] = project_conf['service_base_name'] + '-tag'
         project_conf['allowed_ip_cidr'] = os.environ['conf_allowed_ip_cidr']
         if 'conf_user_subnets_range' in os.environ:
@@ -132,8 +131,8 @@
         try:
             project_conf['user_key'] = os.environ['key']
             try:
-                local('echo "{0}" >> {1}{2}.pub'.format(project_conf['user_key'], os.environ['conf_key_dir'],
-                                                        project_conf['project_name']))
+                subprocess.run('echo "{0}" >> {1}{2}.pub'.format(project_conf['user_key'], os.environ['conf_key_dir'],
+                                                        project_conf['project_name']), shell=True, check=True)
             except:
                 print("ADMINSs PUBLIC KEY DOES NOT INSTALLED")
         except KeyError:
@@ -144,7 +143,7 @@
             project_conf, sort_keys=True, indent=4, separators=(',', ': '))))
         logging.info(json.dumps(project_conf))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate infrastructure names", str(err))
+        datalab.fab.append_result("Failed to generate infrastructure names", str(err))
         sys.exit(1)
 
     try:
@@ -155,7 +154,7 @@
                          project_conf['private_subnet_prefix'], project_conf['vpc_cidr'],
                          project_conf['user_subnets_range'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_subnet', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_subnet', params), shell=True, check=True)
             project_conf['private_subnet_cidr'] = GCPMeta.get_subnet(project_conf['private_subnet_name'],
                                                                      project_conf['region'])['ipCidrRange']
         except:
@@ -166,7 +165,7 @@
             GCPActions.remove_subnet(project_conf['private_subnet_name'], project_conf['region'])
         except:
             print("Subnet hasn't been created.")
-        dlab.fab.append_result("Failed to create subnet.", str(err))
+        datalab.fab.append_result("Failed to create subnet.", str(err))
         sys.exit(1)
 
     print('NEW SUBNET CIDR CREATED: {}'.format(project_conf['private_subnet_cidr']))
@@ -179,7 +178,7 @@
             project_conf['edge_unique_index'], project_conf['service_base_name'])
 
         try:
-            local("~/scripts/{}.py {}".format('common_create_service_account', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_service_account', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -191,7 +190,7 @@
         except:
             print("Service account or role hasn't been created")
         GCPActions.remove_subnet(project_conf['private_subnet_name'], project_conf['region'])
-        dlab.fab.append_result("Failed to creating service account and role.", str(err))
+        datalab.fab.append_result("Failed to creating service account and role.", str(err))
         sys.exit(1)
 
     try:
@@ -203,7 +202,7 @@
                   project_conf['ps_roles_path'], project_conf['ps_unique_index'], project_conf['service_base_name'])
 
         try:
-            local("~/scripts/{}.py {}".format('common_create_service_account', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_service_account', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -218,21 +217,27 @@
                                           project_conf['service_base_name'])
         GCPActions.remove_role(project_conf['edge_role_name'])
         GCPActions.remove_subnet(project_conf['private_subnet_name'], project_conf['region'])
-        dlab.fab.append_result("Failed to creating service account and role.", str(err))
+        datalab.fab.append_result("Failed to creating service account and role.", str(err))
         sys.exit(1)
 
     try:
-        pre_defined_firewall = True
         logging.info('[CREATE FIREWALL FOR EDGE NODE]')
         print('[CREATE FIREWALL FOR EDGE NODE]')
         firewall_rules = dict()
         firewall_rules['ingress'] = []
         firewall_rules['egress'] = []
-
         ingress_rule = dict()
+        if os.environ['conf_allowed_ip_cidr'] != '0.0.0.0/0' and project_conf['endpoint_name'] == 'local':
+            ssn_public_ip = GCPMeta.get_instance_public_ip_by_name('{}-ssn'.format(project_conf['service_base_name']))
+            project_conf['allowed_ip_cidr'] = '{}, {}/32'.format(project_conf['allowed_ip_cidr'], ssn_public_ip).split(', ')
+        elif os.environ['conf_allowed_ip_cidr'] != '0.0.0.0/0' and project_conf['endpoint_name'] != 'local':
+            endpoint_public_ip = GCPMeta.get_instance_public_ip_by_name('{}-{}-endpoint'.format(project_conf['service_base_name'], project_conf['endpoint_name']))
+            project_conf['allowed_ip_cidr'] = '{}, {}/32'.format(project_conf['allowed_ip_cidr'], endpoint_public_ip).split(', ')
+        else:
+            project_conf['allowed_ip_cidr'] = [os.environ['conf_allowed_ip_cidr']]
         ingress_rule['name'] = project_conf['fw_edge_ingress_public']
         ingress_rule['targetTags'] = [project_conf['network_tag']]
-        ingress_rule['sourceRanges'] = [project_conf['allowed_ip_cidr']]
+        ingress_rule['sourceRanges'] = project_conf['allowed_ip_cidr']
         rules = [
             {
                 'IPProtocol': 'tcp',
@@ -247,7 +252,13 @@
         ingress_rule = dict()
         ingress_rule['name'] = project_conf['fw_edge_ingress_internal']
         ingress_rule['targetTags'] = [project_conf['network_tag']]
-        ingress_rule['sourceRanges'] = [project_conf['private_subnet_cidr']]
+        if os.environ['gcp_subnet_name']:
+            project_conf['ssn_subnet'] = os.environ['gcp_subnet_name']
+        else:
+            project_conf['ssn_subnet'] = '{}-subnet'.format(project_conf['service_base_name'])
+        ingress_rule['sourceRanges'] = [project_conf['private_subnet_cidr'],
+                                        GCPMeta.get_subnet(project_conf['subnet_name'],
+                                                           project_conf['region'])['ipCidrRange']]
         rules = [
             {
                 'IPProtocol': 'all'
@@ -261,7 +272,7 @@
         egress_rule = dict()
         egress_rule['name'] = project_conf['fw_edge_egress_public']
         egress_rule['targetTags'] = [project_conf['network_tag']]
-        egress_rule['destinationRanges'] = [project_conf['allowed_ip_cidr']]
+        egress_rule['destinationRanges'] = project_conf['allowed_ip_cidr']
         rules = [
             {
                 'IPProtocol': 'udp',
@@ -295,7 +306,7 @@
 
         params = "--firewall '{}'".format(json.dumps(firewall_rules))
         try:
-            local("~/scripts/{}.py {}".format('common_create_firewall', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_firewall', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -305,7 +316,7 @@
         GCPActions.remove_service_account(project_conf['edge_service_account_name'],
                                           project_conf['service_base_name'])
         GCPActions.remove_role(project_conf['edge_role_name'])
-        dlab.fab.append_result("Failed to create firewall for Edge node.", str(err))
+        datalab.fab.append_result("Failed to create firewall for Edge node.", str(err))
         GCPActions.remove_subnet(project_conf['private_subnet_name'], project_conf['region'])
         sys.exit(1)
 
@@ -359,7 +370,7 @@
         egress_rule['targetTags'] = [
             project_conf['ps_firewall_target']
         ]
-        egress_rule['destinationRanges'] = [project_conf['allowed_ip_cidr']]
+        egress_rule['destinationRanges'] = project_conf['allowed_ip_cidr']
         rules = [
             {
                 'IPProtocol': 'tcp',
@@ -373,12 +384,12 @@
 
         params = "--firewall '{}'".format(json.dumps(firewall_rules))
         try:
-            local("~/scripts/{}.py {}".format('common_create_firewall', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_firewall', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create firewall for private subnet.", str(err))
+        datalab.fab.append_result("Failed to create firewall for private subnet.", str(err))
         GCPActions.remove_firewall(project_conf['fw_edge_ingress_public'])
         GCPActions.remove_firewall(project_conf['fw_edge_ingress_internal'])
         GCPActions.remove_firewall(project_conf['fw_edge_egress_public'])
@@ -403,7 +414,7 @@
         params = "--bucket_name {} --tags '{}'".format(project_conf['shared_bucket_name'],
                                                        json.dumps(project_conf['shared_bucket_tags']))
         try:
-            local("~/scripts/{}.py {}".format('common_create_bucket', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_bucket', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -419,12 +430,12 @@
                                                        json.dumps(project_conf['bucket_tags']))
 
         try:
-            local("~/scripts/{}.py {}".format('common_create_bucket', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_bucket', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Unable to create bucket.", str(err))
+        datalab.fab.append_result("Unable to create bucket.", str(err))
         GCPActions.remove_firewall(project_conf['fw_edge_ingress_public'])
         GCPActions.remove_firewall(project_conf['fw_edge_ingress_internal'])
         GCPActions.remove_firewall(project_conf['fw_edge_egress_public'])
@@ -448,7 +459,7 @@
         GCPActions.set_bucket_owner(project_conf['shared_bucket_name'], project_conf['ps_service_account_name'],
                                     project_conf['service_base_name'])
     except Exception as err:
-        dlab.fab.append_result("Failed to set bucket permissions.", str(err))
+        datalab.fab.append_result("Failed to set bucket permissions.", str(err))
         GCPActions.remove_bucket(project_conf['bucket_name'])
         GCPActions.remove_firewall(project_conf['fw_edge_ingress_public'])
         GCPActions.remove_firewall(project_conf['fw_edge_ingress_internal'])
@@ -470,12 +481,12 @@
         print('[CREATING STATIC IP ADDRESS]')
         params = "--address_name {} --region {}".format(project_conf['static_address_name'], project_conf['region'])
         try:
-            local("~/scripts/{}.py {}".format('edge_create_static_ip', params))
+            subprocess.run("~/scripts/{}.py {}".format('edge_create_static_ip', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create static ip.", str(err))
+        datalab.fab.append_result("Failed to create static ip.", str(err))
         try:
             GCPActions.remove_static_address(project_conf['static_address_name'], project_conf['region'])
         except:
@@ -517,12 +528,12 @@
                   'edge', project_conf['static_ip'], project_conf['network_tag'],
                   json.dumps(project_conf['instance_labels']), project_conf['service_base_name'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create instance.", str(err))
+        datalab.fab.append_result("Failed to create instance.", str(err))
         GCPActions.remove_static_address(project_conf['static_address_name'], project_conf['region'])
         GCPActions.remove_bucket(project_conf['bucket_name'])
         GCPActions.remove_firewall(project_conf['fw_edge_ingress_public'])
@@ -539,3 +550,41 @@
         GCPActions.remove_role(project_conf['edge_role_name'])
         GCPActions.remove_subnet(project_conf['private_subnet_name'], project_conf['region'])
         sys.exit(1)
+
+    if os.environ['edge_is_nat'] == 'true':
+        try:
+            logging.info('[CREATE NAT ROUTE]')
+            print('[REATE NAT ROUTE]')
+            nat_route_name = '{0}-{1}-{2}-nat-route'.format(project_conf['service_base_name'],
+                                                                  project_conf['project_name'],
+                                                                  project_conf['endpoint_name'])
+            edge_instance = GCPMeta.get_instance(project_conf['instance_name'])['selfLink']
+            params = "--nat_route_name {} --vpc {} --tag {} --edge_instance {}".format(nat_route_name,
+                                                                                                       project_conf['vpc_selflink'],
+                                                                                                       project_conf['ps_firewall_target'],
+                                                                                                       edge_instance)
+            try:
+                subprocess.run("~/scripts/{}.py {}".format('common_create_nat_route', params), shell=True, check=True)
+            except:
+                traceback.print_exc()
+                raise Exception
+        except Exception as err:
+            datalab.fab.append_result("Failed to create nat route.", str(err))
+            GCPActions.remove_instance(project_conf['instance_name'], project_conf['zone'])
+            GCPActions.remove_static_address(project_conf['static_address_name'], project_conf['region'])
+            GCPActions.remove_bucket(project_conf['bucket_name'])
+            GCPActions.remove_firewall(project_conf['fw_edge_ingress_public'])
+            GCPActions.remove_firewall(project_conf['fw_edge_ingress_internal'])
+            GCPActions.remove_firewall(project_conf['fw_edge_egress_public'])
+            GCPActions.remove_firewall(project_conf['fw_edge_egress_internal'])
+            GCPActions.remove_firewall(project_conf['fw_ps_ingress'])
+            GCPActions.remove_firewall(project_conf['fw_ps_egress_private'])
+            GCPActions.remove_firewall(project_conf['fw_ps_egress_public'])
+            GCPActions.remove_service_account(project_conf['ps_service_account_name'],
+                                              project_conf['service_base_name'])
+            GCPActions.remove_role(project_conf['ps_role_name'])
+            GCPActions.remove_service_account(project_conf['edge_service_account_name'],
+                                              project_conf['service_base_name'])
+            GCPActions.remove_role(project_conf['edge_role_name'])
+            GCPActions.remove_subnet(project_conf['private_subnet_name'], project_conf['region'])
+            sys.exit(1)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/project_terminate.py b/infrastructure-provisioning/src/general/scripts/gcp/project_terminate.py
index 96c021d..7e0dbfc 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/project_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/project_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,15 @@
 #
 # ******************************************************************************
 
+import datalab.actions_lib
+import datalab.fab
+import datalab.meta_lib
 import json
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import sys
-import time
-import os
 import logging
-import traceback
+import os
 import requests
+import sys
+import traceback
 
 
 def terminate_edge_node(endpoint_name, project_name, service_base_name, region, zone):
@@ -48,7 +47,7 @@
         else:
             print("There are no Dataproc clusters to terminate.")
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate dataengine-service", str(err))
+        datalab.fab.append_result("Failed to terminate dataengine-service", str(err))
         sys.exit(1)
 
     print("Terminating EDGE and notebook instances")
@@ -62,7 +61,7 @@
                 if 'project_tag' in i['labels'] and project_name == i['labels']['project_tag']:
                     GCPActions.remove_instance(i['name'], zone)
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate instances", str(err))
+        datalab.fab.append_result("Failed to terminate instances", str(err))
         sys.exit(1)
 
     print("Removing static addresses")
@@ -73,7 +72,7 @@
                 if bool(set(targets) & set([i['name']])):
                     GCPActions.remove_static_address(i['name'], region)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove static addresses", str(err))
+        datalab.fab.append_result("Failed to remove static addresses", str(err))
         sys.exit(1)
 
     print("Removing storage bucket")
@@ -84,12 +83,12 @@
                 if bool(set(targets) & set([i['name']])):
                     GCPActions.remove_bucket(i['name'])
     except Exception as err:
-        dlab.fab.append_result("Failed to remove storage buckets", str(err))
+        datalab.fab.append_result("Failed to remove storage buckets", str(err))
         sys.exit(1)
 
     print("Removing project specific images")
     try:
-        project_image_name_beginning = '{}-{}'.format(service_base_name, project_name)
+        project_image_name_beginning = '{}-{}-{}'.format(service_base_name, project_name, endpoint_name)
         images = GCPMeta.get_list_images(project_image_name_beginning)
         if 'items' in images:
             for i in images['items']:
@@ -106,7 +105,7 @@
                 if bool(set(targets) & set(i['targetTags'])):
                     GCPActions.remove_firewall(i['name'])
     except Exception as err:
-        dlab.fab.append_result("Failed to remove security groups", str(err))
+        datalab.fab.append_result("Failed to remove security groups", str(err))
         sys.exit(1)
 
     print("Removing Service accounts and roles")
@@ -123,7 +122,7 @@
         for role in (set(role_targets) & set(list_roles_names)):
             GCPActions.remove_role(role)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove service accounts and roles", str(err))
+        datalab.fab.append_result("Failed to remove service accounts and roles", str(err))
         sys.exit(1)
 
     print("Removing subnets")
@@ -137,7 +136,17 @@
                 if bool(set(targets) & set([i['name']])):
                     GCPActions.remove_subnet(i['name'], region)
     except Exception as err:
-        dlab.fab.append_result("Failed to remove subnets", str(err))
+        datalab.fab.append_result("Failed to remove subnets", str(err))
+        sys.exit(1)
+
+    print("Removing nat route")
+    try:
+        nat_route_name = '{0}-{1}-{2}-nat-route'.format(service_base_name, project_name, endpoint_name)
+        route = GCPMeta.get_route(nat_route_name)
+        if route:
+            GCPActions.delete_nat_route(nat_route_name)
+    except Exception as err:
+        datalab.fab.append_result("Failed to remove nat route", str(err))
         sys.exit(1)
 
 
@@ -150,8 +159,8 @@
                         filename=local_log_filepath)
 
     # generating variables dictionary
-    GCPMeta = dlab.meta_lib.GCPMeta()
-    GCPActions = dlab.actions_lib.GCPActions()
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print('Generating infrastructure names and tags')
     project_conf = dict()
     project_conf['service_base_name'] = (os.environ['conf_service_base_name'])
@@ -170,7 +179,7 @@
                                 project_conf['region'], project_conf['zone'])
         except Exception as err:
             traceback.print_exc()
-            dlab.fab.append_result("Failed to terminate edge.", str(err))
+            datalab.fab.append_result("Failed to terminate edge.", str(err))
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
@@ -221,5 +230,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/rstudio_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/rstudio_configure.py
index 6ea7a90..8b51ca0 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/rstudio_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/rstudio_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
+import logging
+import os
 import sys
 import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -41,8 +41,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = (os.environ['exploratory_name']).replace('_', '-').lower()
@@ -89,13 +89,13 @@
         edge_instance_hostname = GCPMeta.get_instance_public_ip_by_name(edge_instance_name)
         edge_instance_private_ip = GCPMeta.get_private_ip_address(edge_instance_name)
         notebook_config['ssh_key_path'] = '{0}{1}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['zone'] = os.environ['gcp_zone']
         notebook_config['shared_image_enabled'] = os.environ['conf_shared_image_enabled']
         notebook_config['ip_address'] = GCPMeta.get_private_ip_address(notebook_config['instance_name'])
-        notebook_config['rstudio_pass'] = dlab.fab.id_generator()
+        notebook_config['rstudio_pass'] = datalab.fab.id_generator()
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -107,19 +107,19 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, notebook_config['ssh_key_path'], notebook_config['initial_user'],
-            notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -131,14 +131,14 @@
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
             .format(instance_hostname, notebook_config['instance_name'], notebook_config['ssh_key_path'],
                     json.dumps(additional_config),
-                    notebook_config['dlab_ssh_user'])
+                    notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -147,15 +147,15 @@
         logging.info('[INSTALLING PREREQUISITES TO RSTUDIO NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO RSTUDIO NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
-            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['dlab_ssh_user'],
+            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['datalab_ssh_user'],
                    os.environ['gcp_region'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -169,16 +169,16 @@
                  "--r_mirror {6} --ip_address {7} --exploratory_name {8} --edge_ip {9}" \
             .format(instance_hostname, notebook_config['ssh_key_path'],
                     os.environ['gcp_region'], notebook_config['rstudio_pass'],
-                    os.environ['notebook_rstudio_version'], notebook_config['dlab_ssh_user'],
+                    os.environ['notebook_rstudio_version'], notebook_config['datalab_ssh_user'],
                     os.environ['notebook_r_mirror'], notebook_config['ip_address'],
                     notebook_config['exploratory_name'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_rstudio_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_rstudio_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure RStudio.", str(err))
+        datalab.fab.append_result("Failed to configure RStudio.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -189,14 +189,14 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             instance_hostname, notebook_config['ssh_key_path'], json.dumps(additional_config),
-            notebook_config['dlab_ssh_user'])
+            notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -204,15 +204,15 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
         try:
-            local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
         
@@ -233,7 +233,7 @@
                 if image_id_list and image_id_list[1] != '':
                     print("Image of secondary disk was successfully created. It's ID is {}".format(image_id_list[1]))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
             GCPActions.remove_image(notebook_config['expected_primary_image_name'])
             GCPActions.remove_image(notebook_config['expected_secondary_image_name'])
@@ -254,18 +254,18 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     notebook_config['ssh_key_path'],
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'rstudio',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
         print('Error: {0}'.format(err))
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -286,11 +286,11 @@
         print("Key name: {}".format(notebook_config['key_name']))
         print("User key name: {}".format(os.environ['project_name']))
         print("Rstudio URL: {}".format(rstudio_ip_url))
-        print("Rstudio user: {}".format(notebook_config['dlab_ssh_user']))
+        print("Rstudio user: {}".format(notebook_config['datalab_ssh_user']))
         print("Rstudio pass: {}".format(notebook_config['rstudio_pass']))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": ip_address,
@@ -303,16 +303,16 @@
                        {"description": "RStudio",
                         "url": rstudio_notebook_access_url},
                        {"description": "Ungit",
-                        "url": rstudio_ungit_access_url}#,
-                       #{"description": "RStudio (via tunnel)",
+                        "url": rstudio_ungit_access_url}  # ,
+                       # {"description": "RStudio (via tunnel)",
                        # "url": rstudio_ip_url},
-                       #{"description": "Ungit (via tunnel)",
+                       # {"description": "Ungit (via tunnel)",
                        # "url": ungit_ip_url}
                    ],
-                   "exploratory_user": notebook_config['dlab_ssh_user'],
+                   "exploratory_user": notebook_config['datalab_ssh_user'],
                    "exploratory_pass": notebook_config['rstudio_pass']}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information", str(err))
+        datalab.fab.append_result("Failed to generate output information", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/rstudio_dataengine-service_create_configs.py b/infrastructure-provisioning/src/general/scripts/gcp/rstudio_dataengine-service_create_configs.py
index 2d98ee8..11e5283 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/rstudio_dataengine-service_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/rstudio_dataengine-service_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,20 +21,15 @@
 #
 # ******************************************************************************
 
-import boto3
-from botocore.client import Config
-from fabric.api import *
 import argparse
 import os
 import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -58,28 +53,28 @@
 def configure_rstudio():
     if not os.path.exists('/home/' + args.os_user + '/.ensure_dir/rstudio_dataengine-service_ensured'):
         try:
-            local('echo "export R_LIBS_USER=' + spark_dir + '/R/lib:" >> /home/' + args.os_user + '/.bashrc')
-            local("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron")
-            local('echo \'SPARK_HOME="' + spark_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local('echo \'YARN_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local('echo \'HADOOP_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile")
-            local('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user))
-            local('touch /home/' + args.os_user + '/.ensure_dir/rstudio_dataengine-service_ensured')
+            subprocess.run('echo "export R_LIBS_USER=' + spark_dir + '/R/lib:" >> /home/' + args.os_user + '/.bashrc', shell=True, check=True)
+            subprocess.run("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run('echo \'SPARK_HOME="' + spark_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run('echo \'YARN_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run('echo \'HADOOP_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile", shell=True, check=True)
+            subprocess.run('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user), shell=True, check=True)
+            subprocess.run('touch /home/' + args.os_user + '/.ensure_dir/rstudio_dataengine-service_ensured', shell=True, check=True)
         except Exception as err:
             print('Error: {0}'.format(err))
             sys.exit(1)
     else:
         try:
-            local("sed -i '/R_LIBS_USER/ { s|=\(.*\)|=\\1" + spark_dir + "/R/lib:| }' /home/" + args.os_user + "/.bashrc")
-            local("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile")
-            local('echo \'SPARK_HOME="' + spark_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local('echo \'YARN_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local('echo \'HADOOP_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron')
-            local('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user))
+            subprocess.run("sed -i '/R_LIBS_USER/ { s|=\(.*\)|=\\1" + spark_dir + "/R/lib:| }' /home/" + args.os_user + "/.bashrc", shell=True, check=True)
+            subprocess.run("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile", shell=True, check=True)
+            subprocess.run('echo \'SPARK_HOME="' + spark_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run('echo \'YARN_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run('echo \'HADOOP_CONF_DIR="' + yarn_dir + '"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user), shell=True, check=True)
         except Exception as err:
             print('Error:', str(err))
             sys.exit(1)
@@ -91,9 +86,9 @@
     else:
         result = prepare(dataproc_dir, yarn_dir)
         if result == False :
-            actions_lib.GCPActions().jars(args, dataproc_dir)
-        actions_lib.GCPActions().yarn(args, yarn_dir)
-        actions_lib.GCPActions().install_dataproc_spark(args)
-        actions_lib.GCPActions().spark_defaults(args)
+            datalab.actions_lib.GCPActions().jars(args, dataproc_dir)
+        datalab.actions_lib.GCPActions().yarn(args, yarn_dir)
+        datalab.actions_lib.GCPActions().install_dataproc_spark(args)
+        datalab.actions_lib.GCPActions().spark_defaults(args)
         configuring_notebook(args.dataproc_version)
         configure_rstudio()
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/rstudio_install_dataengine-service_kernels.py b/infrastructure-provisioning/src/general/scripts/gcp/rstudio_install_dataengine-service_kernels.py
index 3267af7..be225cd 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/rstudio_install_dataengine-service_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/rstudio_install_dataengine-service_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,10 +22,12 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-import boto3
-from dlab.meta_lib import *
 import os
+from datalab.actions_lib import *
+from datalab.meta_lib import *
+from fabric import *
+import subprocess
+import time
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -48,28 +50,28 @@
 
 def configure_notebook(args):
     scripts_dir = '/root/scripts/'
-    put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application), '/tmp/create_configs.py')
-    sudo('\cp /tmp/create_configs.py /usr/local/bin/create_configs.py')
-    sudo('chmod 755 /usr/local/bin/create_configs.py')
-    sudo('mkdir -p /usr/lib/python2.7/dlab/')
-    run('mkdir -p /tmp/dlab_libs/')
-    local('scp -i {} /usr/lib/python2.7/dlab/* {}:/tmp/dlab_libs/'.format(args.keyfile, env.host_string))
-    run('chmod a+x /tmp/dlab_libs/*')
-    sudo('mv /tmp/dlab_libs/* /usr/lib/python2.7/dlab/')
-    if exists('/usr/lib64'):
-        sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+    conn.put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application), '/tmp/create_configs.py')
+    conn.sudo('\cp /tmp/create_configs.py /usr/local/bin/create_configs.py')
+    conn.sudo('chmod 755 /usr/local/bin/create_configs.py')
+    conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+    conn.run('mkdir -p /home/{}/datalab_libs/'.format(args.os_user))
+    conn.local('scp -i {0} /usr/lib/python3.8/datalab/*.py {1}@{2}:/home/{1}/datalab_libs/'.format(args.keyfile, args.os_user, args.notebook_ip))
+    conn.run('chmod a+x /home/{}/datalab_libs/*'.format(args.os_user))
+    conn.sudo('mv /home/{}/datalab_libs/* /usr/lib/python3.8/datalab/'.format(args.os_user))
+    conn.sudo('rm -rf /home/{}/datalab_libs/'.format(args.os_user))
+    if exists(conn, '/usr/lib64'):
+        conn.sudo('mkdir -p /usr/lib64/python3.8')
+        conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
 
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     configure_notebook(args)
-    spark_version = actions_lib.GCPActions().get_cluster_app_version(args.bucket, args.project_name, args.cluster_name, 'spark')
-    hadoop_version = actions_lib.GCPActions().get_cluster_app_version(args.bucket, args.project_name, args.cluster_name, 'hadoop')
-    sudo('echo "[global]" > /etc/pip.conf; echo "proxy = $(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=)" >> /etc/pip.conf')
-    sudo('echo "use_proxy=yes" > ~/.wgetrc; proxy=$(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=); echo "http_proxy=$proxy" >> ~/.wgetrc; echo "https_proxy=$proxy" >> ~/.wgetrc')
-    sudo('unset http_proxy https_proxy; export gcp_project_id="{0}"; export conf_resource="{1}"; /usr/bin/python /usr/local/bin/create_configs.py --bucket {2} --cluster_name {3} --dataproc_version {4} --spark_version {5} --hadoop_version {6} --region {7} --user_name {8} --os_user {9} --pip_mirror {10} --application {11}'
+    spark_version = datalab.actions_lib.GCPActions().get_cluster_app_version(args.bucket, args.project_name, args.cluster_name, 'spark')
+    hadoop_version = datalab.actions_lib.GCPActions().get_cluster_app_version(args.bucket, args.project_name, args.cluster_name, 'hadoop')
+    conn.sudo('''bash -l -c 'echo "[global]" > /etc/pip.conf; echo "proxy = $(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=)" >> /etc/pip.conf' ''')
+    conn.sudo('''bash -l -c 'echo "use_proxy=yes" > ~/.wgetrc; proxy=$(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=); echo "http_proxy=$proxy" >> ~/.wgetrc; echo "https_proxy=$proxy" >> ~/.wgetrc' ''')
+    conn.sudo('''bash -l -c 'unset http_proxy https_proxy; export gcp_project_id="{0}"; export conf_resource="{1}"; /usr/bin/python3 /usr/local/bin/create_configs.py --bucket {2} --cluster_name {3} --dataproc_version {4} --spark_version {5} --hadoop_version {6} --region {7} --user_name {8} --os_user {9} --pip_mirror {10} --application {11}' '''
          .format(os.environ['gcp_project_id'], os.environ['conf_resource'], args.bucket, args.cluster_name, args.dataproc_version, spark_version, hadoop_version,
                  args.region, args.project_name, args.os_user, args.pip_mirror, args.application))
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/ssn_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/ssn_configure.py
index dd622d2..6282be4 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/ssn_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/ssn_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,17 @@
 #
 # ******************************************************************************
 
-import sys, os
-from fabric.api import *
-import traceback
-import json
 import argparse
-import dlab.ssn_lib
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
+import json
 import logging
+import os
+import sys
+import traceback
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--ssn_unique_index', type=str, default='')
@@ -45,6 +46,7 @@
 
     def clear_resources():
         GCPActions.remove_instance(ssn_conf['instance_name'], ssn_conf['zone'])
+        GCPActions.remove_static_address(ssn_conf['static_address_name'], ssn_conf['region'])
         GCPActions.remove_service_account(ssn_conf['service_account_name'], ssn_conf['service_base_name'])
         GCPActions.remove_role(ssn_conf['role_name'])
         if not ssn_conf['pre_defined_firewall']:
@@ -55,9 +57,10 @@
         if not ssn_conf['pre_defined_vpc']:
             GCPActions.remove_vpc(ssn_conf['vpc_name'])
 
+
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         logging.info('[DERIVING NAMES]')
         print('[DERIVING NAMES]')
         ssn_conf = dict()
@@ -68,9 +71,10 @@
         ssn_conf['billing_enabled'] = True
 
         ssn_conf['ssn_unique_index'] = args.ssn_unique_index
-        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
+        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
             os.environ['conf_service_base_name'].replace('_', '-').lower()[:20], '-', True)
         ssn_conf['instance_name'] = '{}-ssn'.format(ssn_conf['service_base_name'])
+        ssn_conf['static_address_name'] = '{}-ssn-static-ip'.format(ssn_conf['service_base_name'])
         ssn_conf['role_name'] = '{}-{}-ssn-role'.format(ssn_conf['service_base_name'], ssn_conf['ssn_unique_index'])
         ssn_conf['region'] = os.environ['gcp_region']
         ssn_conf['zone'] = os.environ['gcp_zone']
@@ -103,7 +107,7 @@
         except KeyError:
             ssn_conf['firewall_name'] = '{}-ssn-sg'.format(ssn_conf['service_base_name'])
         ssn_conf['ssh_key_path'] = '{0}{1}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        ssn_conf['dlab_ssh_user'] = os.environ['conf_os_user']
+        ssn_conf['datalab_ssh_user'] = os.environ['conf_os_user']
         ssn_conf['service_account_name'] = '{}-ssn-sa'.format(ssn_conf['service_base_name']).replace('_', '-')
         ssn_conf['image_name'] = os.environ['gcp_{}_image_name'.format(os.environ['conf_os_family'])]
 
@@ -119,7 +123,7 @@
             os.environ['aws_billing_bucket'] = 'None'
             os.environ['aws_report_path'] = 'None'
     except Exception as err:
-        dlab.fab.dlab.fab.append_result("Failed deriving names.", str(err))
+        datalab.fab.datalab.fab.append_result("Failed deriving names.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -127,8 +131,8 @@
         ssn_conf['instance_hostname'] = GCPMeta.get_instance_public_ip_by_name(ssn_conf['instance_name'])
         if os.environ['conf_stepcerts_enabled'] == 'true':
             ssn_conf['step_cert_sans'] = ' --san {0} --san {1}'.format(GCPMeta.get_instance_public_ip_by_name(
-                ssn_conf['instance_name']), dlab.meta_lib.get_instance_private_ip_address('ssn',
-                                                                                          ssn_conf['instance_name']))
+                ssn_conf['instance_name']), datalab.meta_lib.get_instance_private_ip_address('ssn',
+                                                                                             ssn_conf['instance_name']))
         else:
             ssn_conf['step_cert_sans'] = ''
         if os.environ['conf_os_family'] == 'debian':
@@ -138,19 +142,19 @@
             ssn_conf['initial_user'] = 'ec2-user'
             ssn_conf['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             ssn_conf['instance_hostname'], ssn_conf['ssh_key_path'], ssn_conf['initial_user'],
-            ssn_conf['dlab_ssh_user'], ssn_conf['sudo_group'])
+            ssn_conf['datalab_ssh_user'], ssn_conf['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.dlab.fab.append_result("Failed creating ssh user 'dlab-user'.", str(err))
+        datalab.fab.datalab.fab.append_result("Failed creating ssh user 'datalab-user'.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -158,18 +162,18 @@
         logging.info('[INSTALLING PREREQUISITES TO SSN INSTANCE]')
         print('[INSTALLING PREREQUISITES TO SSN INSTANCE]')
         params = "--hostname {} --keyfile {} --pip_packages " \
-                 "'boto3 backoff argparse fabric==1.14.0 awscli pymongo pyyaml " \
-                 "google-api-python-client google-cloud-storage pycrypto' --user {} --region {}". \
+                 "'boto3 bcrypt==3.1.7 backoff argparse fabric awscli pymongo pyyaml " \
+                 "google-api-python-client google-cloud-storage pycryptodome' --user {} --region {}". \
             format(ssn_conf['instance_hostname'], ssn_conf['ssh_key_path'],
-                   ssn_conf['dlab_ssh_user'], ssn_conf['region'])
+                   ssn_conf['datalab_ssh_user'], ssn_conf['region'])
 
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.dlab.fab.append_result("Failed installing software: pip, packages.", str(err))
+        datalab.fab.datalab.fab.append_result("Failed installing software: pip, packages.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -180,19 +184,19 @@
                              "service_base_name": ssn_conf['service_base_name'],
                              "security_group_id": ssn_conf['firewall_name'], "vpc_id": ssn_conf['vpc_name'],
                              "subnet_id": ssn_conf['subnet_name'], "admin_key": os.environ['conf_key_name']}
-        params = "--hostname {} --keyfile {} --additional_config '{}' --os_user {} --dlab_path {} " \
+        params = "--hostname {} --keyfile {} --additional_config '{}' --os_user {} --datalab_path {} " \
                  "--tag_resource_id {} --step_cert_sans '{}'". \
             format(ssn_conf['instance_hostname'], ssn_conf['ssh_key_path'], json.dumps(additional_config),
-                   ssn_conf['dlab_ssh_user'], os.environ['ssn_dlab_path'], ssn_conf['service_base_name'],
+                   ssn_conf['datalab_ssh_user'], os.environ['ssn_datalab_path'], ssn_conf['service_base_name'],
                    ssn_conf['step_cert_sans'])
 
         try:
-            local("~/scripts/{}.py {}".format('configure_ssn_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_ssn_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.dlab.fab.append_result("Failed configuring ssn.", str(err))
+        datalab.fab.datalab.fab.append_result("Failed configuring ssn.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -212,19 +216,19 @@
                              {"name": "deeplearning", "tag": "latest"},
                              {"name": "dataengine", "tag": "latest"},
                              {"name": "dataengine-service", "tag": "latest"}]
-        params = "--hostname {} --keyfile {} --additional_config '{}' --os_family {} --os_user {} --dlab_path {} " \
+        params = "--hostname {} --keyfile {} --additional_config '{}' --os_family {} --os_user {} --datalab_path {} " \
                  "--cloud_provider {} --region {}". \
             format(ssn_conf['instance_hostname'], ssn_conf['ssh_key_path'], json.dumps(additional_config),
-                   os.environ['conf_os_family'], ssn_conf['dlab_ssh_user'], os.environ['ssn_dlab_path'],
+                   os.environ['conf_os_family'], ssn_conf['datalab_ssh_user'], os.environ['ssn_datalab_path'],
                    os.environ['conf_cloud_provider'], ssn_conf['region'])
 
         try:
-            local("~/scripts/{}.py {}".format('configure_docker', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_docker', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.dlab.fab.append_result("Unable to configure docker.", str(err))
+        datalab.fab.datalab.fab.append_result("Unable to configure docker.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -396,6 +400,69 @@
                     'key': 'STEP_CA_URL',
                     'value': os.environ['conf_stepcerts_ca_url']
                 })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_ENABLED',
+                    'value': 'false'
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_DOMAIN_NAME',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_EMAIL',
+                    'value': ''
+                })
+        elif os.environ['conf_letsencrypt_enabled'] == 'true':
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_ENABLED',
+                    'value': os.environ['conf_letsencrypt_enabled']
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_DOMAIN_NAME',
+                    'value': os.environ['conf_letsencrypt_domain_name']
+                })
+            if 'conf_letsencrypt_email' in os.environ:
+                cloud_params.append(
+                    {
+                        'key': 'LETS_ENCRYPT_EMAIL',
+                        'value': os.environ['conf_letsencrypt_email']
+                    })
+            else:
+                cloud_params.append(
+                    {
+                        'key': 'LETS_ENCRYPT_EMAIL',
+                        'value': ''
+                    })
+            cloud_params.append(
+                {
+                    'key': 'STEP_CERTS_ENABLED',
+                    'value': 'false'
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_ROOT_CA',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_KID_ID',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_KID_PASSWORD',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'STEP_CA_URL',
+                    'value': ''
+                })
         else:
             cloud_params.append(
                 {
@@ -422,23 +489,39 @@
                     'key': 'STEP_CA_URL',
                     'value': ''
                 })
-        params = "--hostname {} --keyfile {} --dlab_path {} --os_user {} --os_family {} --billing_enabled {} " \
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_ENABLED',
+                    'value': 'false'
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_DOMAIN_NAME',
+                    'value': ''
+                })
+            cloud_params.append(
+                {
+                    'key': 'LETS_ENCRYPT_EMAIL',
+                    'value': ''
+                })
+        params = "--hostname {} --keyfile {} --datalab_path {} --os_user {} --os_family {} --billing_enabled {} " \
                  "--request_id {} --billing_dataset_name {} \
                  --resource {} --service_base_name {} --cloud_provider {} --default_endpoint_name {} " \
                  "--cloud_params '{}' --keycloak_client_id {} --keycloak_client_secret {} --keycloak_auth_server_url {}". \
-            format(ssn_conf['instance_hostname'], ssn_conf['ssh_key_path'], os.environ['ssn_dlab_path'], ssn_conf['dlab_ssh_user'],
+            format(ssn_conf['instance_hostname'], ssn_conf['ssh_key_path'], os.environ['ssn_datalab_path'],
+                   ssn_conf['datalab_ssh_user'],
                    os.environ['conf_os_family'], ssn_conf['billing_enabled'], os.environ['request_id'],
                    os.environ['billing_dataset_name'], os.environ['conf_resource'],
                    ssn_conf['service_base_name'], os.environ['conf_cloud_provider'], ssn_conf['default_endpoint_name'],
                    json.dumps(cloud_params), os.environ['keycloak_client_name'], os.environ['keycloak_client_secret'],
                    os.environ['keycloak_auth_server_url'])
         try:
-            local("~/scripts/{}.py {}".format('configure_ui', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_ui', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.dlab.fab.append_result("Unable to configure UI.", str(err))
+        datalab.fab.datalab.fab.append_result("Unable to configure UI.", str(err))
         clear_resources()
         sys.exit(1)
 
@@ -460,8 +543,8 @@
         jenkins_url_https = "https://{}/jenkins".format(ssn_conf['instance_hostname'])
         print("Jenkins URL: {}".format(jenkins_url))
         print("Jenkins URL HTTPS: {}".format(jenkins_url_https))
-        print("DLab UI HTTP URL: http://{}".format(ssn_conf['instance_hostname']))
-        print("DLab UI HTTPS URL: https://{}".format(ssn_conf['instance_hostname']))
+        print("DataLab UI HTTP URL: http://{}".format(ssn_conf['instance_hostname']))
+        print("DataLab UI HTTPS URL: https://{}".format(ssn_conf['instance_hostname']))
         try:
             with open('jenkins_creds.txt') as f:
                 print(f.read())
@@ -483,11 +566,11 @@
             f.write(json.dumps(res))
 
         print('Upload response file')
-        params = "--instance_name {} --local_log_filepath {} --os_user {} --instance_hostname {}".\
-            format(ssn_conf['instance_name'], local_log_filepath, ssn_conf['dlab_ssh_user'],
+        params = "--instance_name {} --local_log_filepath {} --os_user {} --instance_hostname {}". \
+            format(ssn_conf['instance_name'], local_log_filepath, ssn_conf['datalab_ssh_user'],
                    ssn_conf['instance_hostname'])
-        local("~/scripts/{}.py {}".format('upload_response_file', params))
+        subprocess.run("~/scripts/{}.py {}".format('upload_response_file', params), shell=True, check=True)
     except Exception as err:
-        dlab.fab.append_result("Error with writing results.", str(err))
+        datalab.fab.append_result("Error with writing results.", str(err))
         clear_resources()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/ssn_create_static_ip.py b/infrastructure-provisioning/src/general/scripts/gcp/ssn_create_static_ip.py
index 67c4071..58bf787 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/ssn_create_static_ip.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/ssn_create_static_ip.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,12 +21,12 @@
 #
 # ******************************************************************************
 
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-import os
 import argparse
+import os
+import sys
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--address_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/ssn_create_vpc.py b/infrastructure-provisioning/src/general/scripts/gcp/ssn_create_vpc.py
index bd2f81d..d6bd97d 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/ssn_create_vpc.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/ssn_create_vpc.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,15 +22,13 @@
 # ******************************************************************************
 
 import argparse
-from dlab.actions_lib import *
-from dlab.meta_lib import *
-
+from datalab.actions_lib import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--vpc_name', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
     if args.vpc_name != '':
         if GCPMeta().get_vpc(args.vpc_name):
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/ssn_finalize.py b/infrastructure-provisioning/src/general/scripts/gcp/ssn_finalize.py
index 9359c84..93761f1 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/ssn_finalize.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/ssn_finalize.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,11 +21,10 @@
 #
 # ******************************************************************************
 
-import boto3
 import argparse
+import boto3
 import sys
-from dlab.ssn_lib import *
-
+from datalab.ssn_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--key_id', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/ssn_prepare.py b/infrastructure-provisioning/src/general/scripts/gcp/ssn_prepare.py
index 8cf209d..f8a269c 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/ssn_prepare.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/ssn_prepare.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,17 @@
 #
 # ******************************************************************************
 
-import sys, os
-from fabric.api import *
-import json
 import argparse
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
+import json
 import logging
+import os
+import sys
 import traceback
-import dlab.ssn_lib
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--ssn_unique_index', type=str, default='')
@@ -43,8 +44,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         ssn_conf = dict()
         ssn_conf['instance'] = 'ssn'
         ssn_conf['pre_defined_vpc'] = False
@@ -53,8 +54,8 @@
         logging.info('[DERIVING NAMES]')
         print('[DERIVING NAMES]')
         ssn_conf['ssn_unique_index'] = args.ssn_unique_index
-        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = dlab.fab.replace_multi_symbols(
-                os.environ['conf_service_base_name'].replace('_', '-').lower()[:20], '-', True)
+        ssn_conf['service_base_name'] = os.environ['conf_service_base_name'] = datalab.fab.replace_multi_symbols(
+            os.environ['conf_service_base_name'].replace('_', '-').lower()[:20], '-', True)
         ssn_conf['region'] = os.environ['gcp_region']
         ssn_conf['zone'] = os.environ['gcp_zone']
         ssn_conf['instance_name'] = '{}-ssn'.format(ssn_conf['service_base_name'])
@@ -77,12 +78,12 @@
                                        os.environ['conf_billing_tag_key']: os.environ['conf_billing_tag_value']}
         ssn_conf['allowed_ip_cidr'] = os.environ['conf_allowed_ip_cidr']
     except Exception as err:
-        dlab.fab.dlab.fab.append_result("Failed to generate variables dictionary.", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary.", str(err))
         sys.exit(1)
 
     if GCPMeta.get_instance(ssn_conf['instance_name']):
-        dlab.fab.dlab.fab.append_result("Service base name should be unique and less or equal 20 symbols. "
-                                        "Please try again.")
+        datalab.fab.append_result("Service base name should be unique and less or equal 20 symbols. "
+                                              "Please try again.")
         sys.exit(1)
 
     try:
@@ -97,13 +98,13 @@
             print('[CREATE VPC]')
             params = "--vpc_name {}".format(ssn_conf['vpc_name'])
             try:
-                local("~/scripts/{}.py {}".format('ssn_create_vpc', params))
+                subprocess.run("~/scripts/{}.py {}".format('ssn_create_vpc', params), shell=True, check=True)
                 os.environ['gcp_vpc_name'] = ssn_conf['vpc_name']
             except:
                 traceback.print_exc()
                 raise Exception
         except Exception as err:
-            dlab.fab.append_result("Failed to create VPC.", str(err))
+            datalab.fab.append_result("Failed to create VPC.", str(err))
             if not ssn_conf['pre_defined_vpc']:
                 try:
                     GCPActions.remove_vpc(ssn_conf['vpc_name'])
@@ -113,7 +114,7 @@
 
     try:
         ssn_conf['vpc_selflink'] = GCPMeta.get_vpc(ssn_conf['vpc_name'])['selfLink']
-        if os.environ['gcp_subnet_name'] == '':
+        if 'gcp_subnet_name' not in os.environ:
             raise KeyError
         else:
             ssn_conf['pre_defined_subnet'] = True
@@ -126,13 +127,13 @@
                 format(ssn_conf['subnet_name'], ssn_conf['region'], ssn_conf['vpc_selflink'], ssn_conf['subnet_prefix'],
                        ssn_conf['vpc_cidr'], True)
             try:
-                local("~/scripts/{}.py {}".format('common_create_subnet', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_create_subnet', params), shell=True, check=True)
                 os.environ['gcp_subnet_name'] = ssn_conf['subnet_name']
             except:
                 traceback.print_exc()
                 raise Exception
         except Exception as err:
-            dlab.fab.append_result("Failed to create Subnet.", str(err))
+            datalab.fab.append_result("Failed to create Subnet.", str(err))
             if not ssn_conf['pre_defined_subnet']:
                 try:
                     GCPActions.remove_subnet(ssn_conf['subnet_name'], ssn_conf['region'])
@@ -153,6 +154,10 @@
         try:
             logging.info('[CREATE FIREWALL]')
             print('[CREATE FIREWALL]')
+            if os.environ['conf_allowed_ip_cidr'] != '0.0.0.0/0':
+                ssn_conf['allowed_ip_cidr'] = ssn_conf['allowed_ip_cidr'].split(', ')
+            else:
+                ssn_conf['allowed_ip_cidr'] = [ssn_conf['allowed_ip_cidr']]
             firewall_rules = dict()
             firewall_rules['ingress'] = []
             firewall_rules['egress'] = []
@@ -160,7 +165,7 @@
             ingress_rule = dict()
             ingress_rule['name'] = '{}-ingress'.format(ssn_conf['firewall_name'])
             ingress_rule['targetTags'] = [ssn_conf['network_tag']]
-            ingress_rule['sourceRanges'] = [ssn_conf['allowed_ip_cidr']]
+            ingress_rule['sourceRanges'] = ssn_conf['allowed_ip_cidr']
             rules = [
                 {
                     'IPProtocol': 'tcp',
@@ -175,7 +180,7 @@
             egress_rule = dict()
             egress_rule['name'] = '{}-egress'.format(ssn_conf['firewall_name'])
             egress_rule['targetTags'] = [ssn_conf['network_tag']]
-            egress_rule['destinationRanges'] = [ssn_conf['allowed_ip_cidr']]
+            egress_rule['destinationRanges'] = ssn_conf['allowed_ip_cidr']
             rules = [
                 {
                     'IPProtocol': 'all',
@@ -188,13 +193,13 @@
 
             params = "--firewall '{}'".format(json.dumps(firewall_rules))
             try:
-                local("~/scripts/{}.py {}".format('common_create_firewall', params))
+                subprocess.run("~/scripts/{}.py {}".format('common_create_firewall', params), shell=True, check=True)
                 os.environ['gcp_firewall_name'] = ssn_conf['firewall_name']
             except:
                 traceback.print_exc()
                 raise Exception
         except Exception as err:
-            dlab.fab.append_result("Failed to create Firewall.", str(err))
+            datalab.fab.append_result("Failed to create Firewall.", str(err))
             if not ssn_conf['pre_defined_subnet']:
                 GCPActions.remove_subnet(ssn_conf['subnet_name'], ssn_conf['region'])
             if not ssn_conf['pre_defined_vpc']:
@@ -209,12 +214,12 @@
                                                   ssn_conf['ssn_policy_path'], ssn_conf['ssn_roles_path'],
                                                   ssn_conf['ssn_unique_index'], ssn_conf['service_base_name'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_service_account', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_service_account', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Unable to create Service account and role.", str(err))
+        datalab.fab.append_result("Unable to create Service account and role.", str(err))
         try:
             GCPActions.remove_service_account(ssn_conf['service_account_name'], ssn_conf['service_base_name'])
             GCPActions.remove_role(ssn_conf['role_name'])
@@ -234,12 +239,12 @@
         print('[CREATING STATIC IP ADDRESS]')
         params = "--address_name {} --region {}".format(ssn_conf['static_address_name'], ssn_conf['region'])
         try:
-            local("~/scripts/{}.py {}".format('ssn_create_static_ip', params))
+            subprocess.run("~/scripts/{}.py {}".format('ssn_create_static_ip', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to create static ip.", str(err))
+        datalab.fab.append_result("Failed to create static ip.", str(err))
         try:
             GCPActions.remove_static_address(ssn_conf['static_address_name'], ssn_conf['region'])
         except:
@@ -279,12 +284,12 @@
                    ssn_conf['static_ip'], ssn_conf['network_tag'], json.dumps(ssn_conf['instance_labels']), '20',
                    ssn_conf['service_base_name'])
         try:
-            local("~/scripts/{}.py {}".format('common_create_instance', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_create_instance', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Unable to create ssn instance.", str(err))
+        datalab.fab.append_result("Unable to create ssn instance.", str(err))
         GCPActions.remove_service_account(ssn_conf['service_account_name'], ssn_conf['service_base_name'])
         GCPActions.remove_role(ssn_conf['role_name'])
         GCPActions.remove_static_address(ssn_conf['static_address_name'], ssn_conf['region'])
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/ssn_terminate.py b/infrastructure-provisioning/src/general/scripts/gcp/ssn_terminate.py
index 3e20a15..efe84cf 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/ssn_terminate.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/ssn_terminate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,14 @@
 #
 # ******************************************************************************
 
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import dlab.ssn_lib
-import sys
-import os
-import logging
+import datalab.ssn_lib
 import json
+import logging
+import os
+import sys
 import traceback
-from fabric.api import *
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}.log".format(os.environ['conf_resource'], os.environ['request_id'])
@@ -41,7 +39,7 @@
     # generating variables dictionary
     print('Generating infrastructure names and tags')
     ssn_conf = dict()
-    ssn_conf['service_base_name'] = dlab.fab.replace_multi_symbols(
+    ssn_conf['service_base_name'] = datalab.fab.replace_multi_symbols(
         os.environ['conf_service_base_name'].replace('_', '-').lower()[:20], '-', True)
     ssn_conf['region'] = os.environ['gcp_region']
     ssn_conf['zone'] = os.environ['gcp_zone']
@@ -61,12 +59,12 @@
         params = "--service_base_name {} --region {} --zone {} --pre_defined_vpc {} --vpc_name {}".format(
             ssn_conf['service_base_name'], ssn_conf['region'], ssn_conf['zone'], pre_defined_vpc, ssn_conf['vpc_name'])
         try:
-            local("~/scripts/{}.py {}".format('ssn_terminate_gcp_resources', params))
+            subprocess.run("~/scripts/{}.py {}".format('ssn_terminate_gcp_resources', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to terminate ssn.", str(err))
+        datalab.fab.append_result("Failed to terminate ssn.", str(err))
         sys.exit(1)
 
     try:
@@ -76,5 +74,5 @@
             print(json.dumps(res))
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Error with writing results", str(err))
+        datalab.fab.append_result("Error with writing results", str(err))
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/ssn_terminate_gcp_resources.py b/infrastructure-provisioning/src/general/scripts/gcp/ssn_terminate_gcp_resources.py
index 32bde01..5464ec3 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/ssn_terminate_gcp_resources.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/ssn_terminate_gcp_resources.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,12 +21,11 @@
 #
 # ******************************************************************************
 
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-import boto3
 import argparse
 import sys
-from dlab.ssn_lib import *
+from datalab.actions_lib import *
+from datalab.meta_lib import *
+from datalab.ssn_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--zone', type=str)
@@ -42,15 +41,17 @@
 ##############
 
 if __name__ == "__main__":
+    GCPMeta = datalab.meta_lib.GCPMeta()
+    GCPActions = datalab.actions_lib.GCPActions()
     print("Terminating Dataengine-service clusters")
     try:
         labels = [
             {'sbn': args.service_base_name}
         ]
-        clusters_list = meta_lib.GCPMeta().get_dataproc_list(labels)
+        clusters_list = GCPMeta.get_dataproc_list(labels)
         if clusters_list:
             for cluster_name in clusters_list:
-                actions_lib.GCPActions().delete_dataproc_cluster(cluster_name, args.region)
+                GCPActions.delete_dataproc_cluster(cluster_name, args.region)
                 print('The Dataproc cluster {} has been terminated successfully'.format(cluster_name))
         else:
             print("There are no Dataproc clusters to terminate.")
@@ -60,84 +61,84 @@
 
     print("Terminating instances")
     try:
-        instances = GCPMeta().get_list_instances(args.zone, args.service_base_name)
+        instances = GCPMeta.get_list_instances(args.zone, args.service_base_name)
         if 'items' in instances:
             for i in instances['items']:
-                GCPActions().remove_instance(i['name'], args.zone)
+                GCPActions.remove_instance(i['name'], args.zone)
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
 
     print("Removing images")
     try:
-        images = GCPMeta().get_list_images(args.service_base_name)
+        images = GCPMeta.get_list_images(args.service_base_name)
         if 'items' in images:
             for i in images['items']:
-                GCPActions().remove_image(i['name'])
+                GCPActions.remove_image(i['name'])
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
 
     print("Removing static addresses")
     try:
-        static_addresses = GCPMeta().get_list_static_addresses(args.region, args.service_base_name)
+        static_addresses = GCPMeta.get_list_static_addresses(args.region, args.service_base_name)
         if 'items' in static_addresses:
             for i in static_addresses['items']:
-                GCPActions().remove_static_address(i['name'], args.region)
+                GCPActions.remove_static_address(i['name'], args.region)
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
 
     print("Removing firewalls")
     try:
-        firewalls = GCPMeta().get_list_firewalls(args.service_base_name)
+        firewalls = GCPMeta.get_list_firewalls(args.service_base_name)
         if 'items' in firewalls:
             for i in firewalls['items']:
-                GCPActions().remove_firewall(i['name'])
+                GCPActions.remove_firewall(i['name'])
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
 
     print("Removing Service accounts and roles")
     try:
-        list_service_accounts = GCPMeta().get_list_service_accounts()
+        list_service_accounts = GCPMeta.get_list_service_accounts()
         for service_account in list_service_accounts:
             if service_account.startswith(args.service_base_name):
-                GCPActions().remove_service_account(service_account, args.service_base_name)
-        list_roles_names = GCPMeta().get_list_roles()
+                GCPActions.remove_service_account(service_account, args.service_base_name)
+        list_roles_names = GCPMeta.get_list_roles()
         for role in list_roles_names:
             if role.startswith(args.service_base_name):
-                GCPActions().remove_role(role)
+                GCPActions.remove_role(role)
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
 
     print("Removing subnets")
     try:
-        list_subnets = GCPMeta().get_list_subnetworks(args.region, '', args.service_base_name)
+        list_subnets = GCPMeta.get_list_subnetworks(args.region, '', args.service_base_name)
         if 'items' in list_subnets:
             vpc_selflink = list_subnets['items'][0]['network']
-            subnets = GCPMeta().get_list_subnetworks(args.region, args.vpc_name, args.service_base_name)
+            subnets = GCPMeta.get_list_subnetworks(args.region, args.vpc_name, args.service_base_name)
             for i in subnets['items']:
-                GCPActions().remove_subnet(i['name'], args.region)
+                GCPActions.remove_subnet(i['name'], args.region)
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
 
     print("Removing s3 buckets")
     try:
-        buckets = GCPMeta().get_list_buckets(args.service_base_name)
+        buckets = GCPMeta.get_list_buckets(args.service_base_name)
         if 'items' in buckets:
             for i in buckets['items']:
-                GCPActions().remove_bucket(i['name'])
+                GCPActions.remove_bucket(i['name'])
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
 
     print("Removing SSN VPC")
-    if args.pre_defined_vpc != 'true':
+    if args.pre_defined_vpc != 'True':
         try:
-            GCPActions().remove_vpc(args.vpc_name)
+            GCPActions.remove_vpc(args.vpc_name)
         except Exception as err:
             print('Error: {0}'.format(err))
             print("No such VPC")
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/superset_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/superset_configure.py
index e43517e..0f57a46 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/superset_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/superset_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,18 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import requests
-import traceback
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
+import requests
+import sys
+import traceback
 import uuid
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
@@ -42,8 +42,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = (os.environ['exploratory_name']).replace('_', '-').lower()
@@ -90,11 +90,11 @@
         edge_instance_hostname = GCPMeta.get_instance_public_ip_by_name(edge_instance_name)
         edge_instance_private_ip = GCPMeta.get_private_ip_address(edge_instance_name)
         notebook_config['ssh_key_path'] = '{0}{1}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['zone'] = os.environ['gcp_zone']
         notebook_config['shared_image_enabled'] = os.environ['conf_shared_image_enabled']
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -106,19 +106,19 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, notebook_config['ssh_key_path'], notebook_config['initial_user'],
-            notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -129,14 +129,14 @@
         additional_config = {"proxy_host": edge_instance_private_ip, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}"\
             .format(instance_hostname, notebook_config['instance_name'], notebook_config['ssh_key_path'],
-                    json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+                    json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -191,10 +191,10 @@
                     headers={"Authorization": "Bearer {}".format(keycloak_token.get("access_token")),
                              "Content-Type": "application/json"})
         except Exception as err:
-            dlab.fab.append_result("Failed to configure keycloak.")
+            datalab.fab.append_result("Failed to configure keycloak.")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure keycloak.", str(err))
+        datalab.fab.append_result("Failed to configure keycloak.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -204,23 +204,23 @@
         print('[CONFIGURE SUPERSET NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} " \
                  "--region {} --os_user {} " \
-                 "--dlab_path {} --keycloak_auth_server_url {} " \
+                 "--datalab_path {} --keycloak_auth_server_url {} " \
                  "--keycloak_realm_name {} --keycloak_client_id {} " \
                  "--keycloak_client_secret {} --edge_instance_private_ip {} " \
                  "--edge_instance_public_ip {} --superset_name {} ".\
             format(instance_hostname, notebook_config['ssh_key_path'],
-                   os.environ['gcp_region'], notebook_config['dlab_ssh_user'],
-                   os.environ['ssn_dlab_path'], os.environ['keycloak_auth_server_url'],
+                   os.environ['gcp_region'], notebook_config['datalab_ssh_user'],
+                   os.environ['ssn_datalab_path'], os.environ['keycloak_auth_server_url'],
                    os.environ['keycloak_realm_name'], keycloak_client_id,
                    keycloak_client_secret, edge_instance_private_ip,
                    edge_instance_hostname, notebook_config['exploratory_name'])
         try:
-            local("~/scripts/{}.py {}".format('configure_superset_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_superset_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure superset.", str(err))
+        datalab.fab.append_result("Failed to configure superset.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -231,14 +231,14 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             instance_hostname, notebook_config['ssh_key_path'], json.dumps(additional_config),
-            notebook_config['dlab_ssh_user'])
+            notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -246,15 +246,15 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
         try:
-            local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -275,7 +275,7 @@
                 if image_id_list and image_id_list[1] != '':
                     print("Image of secondary disk was successfully created. It's ID is {}".format(image_id_list[1]))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
             GCPActions.remove_image(notebook_config['expected_primary_image_name'])
             GCPActions.remove_image(notebook_config['expected_secondary_image_name'])
@@ -296,17 +296,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     notebook_config['ssh_key_path'],
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'superset',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -318,14 +318,14 @@
                  "--os_user {} ". \
             format(instance_hostname,
                    notebook_config['ssh_key_path'],
-                   notebook_config['dlab_ssh_user'])
+                   notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/configure_proxy_for_docker.py {}".format(params))
+            subprocess.run("~/scripts/configure_proxy_for_docker.py {}".format(params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy for docker.", str(err))
+        datalab.fab.append_result("Failed to configure proxy for docker.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -337,14 +337,14 @@
                  "--os_user {} ". \
             format(instance_hostname,
                    notebook_config['ssh_key_path'],
-                   notebook_config['dlab_ssh_user'])
+                   notebook_config['datalab_ssh_user'])
         try:
-           local("~/scripts/superset_start.py {}".format(params))
+           subprocess.run("~/scripts/superset_start.py {}".format(params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to start Superset.", str(err))
+        datalab.fab.append_result("Failed to start Superset.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -368,7 +368,8 @@
         print("ReverseProxyNotebook".format(superset_notebook_acces_url))
         print("ReverseProxyUngit".format(superset_ungit_acces_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.format(notebook_config['key_name'],
-                                                                                           notebook_config['dlab_ssh_user'],
+                                                                                           notebook_config[
+                                                                                               'datalab_ssh_user'],
                                                                                            ip_address))
 
         with open("/root/result.json", 'w') as result:
@@ -386,6 +387,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information", str(err))
+        datalab.fab.append_result("Failed to generate output information", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/tensor-rstudio_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/tensor-rstudio_configure.py
index cef61d1..56ddd56 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/tensor-rstudio_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/tensor-rstudio_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,17 @@
 #
 # ******************************************************************************
 
-import logging
-import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
-import os
 import argparse
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
+import json
+import logging
+import os
+import sys
 import traceback
-from fabric.api import *
+import subprocess
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--uuid', type=str, default='')
@@ -45,8 +46,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = (os.environ['exploratory_name']).replace('_', '-').lower()
@@ -93,12 +94,12 @@
         edge_instance_hostname = GCPMeta.get_instance_public_ip_by_name(edge_instance_name)
         edge_instance_private_ip = GCPMeta.get_private_ip_address(edge_instance_name)
         notebook_config['ssh_key_path'] = '{0}{1}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['zone'] = os.environ['gcp_zone']
         notebook_config['shared_image_enabled'] = os.environ['conf_shared_image_enabled']
-        notebook_config['rstudio_pass'] = dlab.fab.id_generator()
+        notebook_config['rstudio_pass'] = datalab.fab.id_generator()
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -110,19 +111,19 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name']),
-            notebook_config['initial_user'], notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['initial_user'], notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
 
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -133,14 +134,14 @@
         additional_config = {"proxy_host": edge_instance_name, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
             .format(instance_hostname, notebook_config['instance_name'], notebook_config['ssh_key_path'],
-                    json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+                    json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -149,15 +150,15 @@
         logging.info('[INSTALLING PREREQUISITES TO TENSORFLOW-RSTUDIO NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO TENSORFLOW-RSTUDIO NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
-            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['dlab_ssh_user'],
+            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['datalab_ssh_user'],
                    os.environ['gcp_region'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -171,15 +172,15 @@
                  "--r_mirror {} --exploratory_name {} --edge_ip {}" \
             .format(instance_hostname, notebook_config['ssh_key_path'],
                     os.environ['gcp_region'], notebook_config['rstudio_pass'],
-                    os.environ['notebook_rstudio_version'], notebook_config['dlab_ssh_user'],
+                    os.environ['notebook_rstudio_version'], notebook_config['datalab_ssh_user'],
                     os.environ['notebook_r_mirror'], notebook_config['exploratory_name'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_tensor-rstudio_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_tensor-rstudio_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure tensoflow-rstudio.", str(err))
+        datalab.fab.append_result("Failed to configure tensoflow-rstudio.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -190,14 +191,14 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             instance_hostname, notebook_config['ssh_key_path'], json.dumps(additional_config),
-            notebook_config['dlab_ssh_user'])
+            notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -205,15 +206,15 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
         try:
-            local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -234,7 +235,7 @@
                 if image_id_list and image_id_list[1] != '':
                     print("Image of secondary disk was successfully created. It's ID is {}".format(image_id_list[1]))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
             GCPActions.remove_image(notebook_config['expected_primary_image_name'])
             GCPActions.remove_image(notebook_config['expected_secondary_image_name'])
@@ -255,17 +256,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     notebook_config['ssh_key_path'],
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'rstudio',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -291,11 +292,11 @@
         print("TensorBoard URL: {}".format(tensorboard_url))
         print("TensorBoard log dir: /var/log/tensorboard")
         print("Rstudio URL: {}".format(rstudio_ip_url))
-        print("Rstudio user: {}".format(notebook_config['dlab_ssh_user']))
+        print("Rstudio user: {}".format(notebook_config['datalab_ssh_user']))
         print("Rstudio pass: {}".format(notebook_config['rstudio_pass']))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": ip_address,
@@ -311,18 +312,18 @@
                        {"description": "TensorBoard",
                         "url": tensorboard_access_url},
                        {"description": "Ungit",
-                        "url": rstudio_ungit_access_url}#,
-                       #{"description": "Rstudio (via tunnel)",
+                        "url": rstudio_ungit_access_url}  # ,
+                       # {"description": "Rstudio (via tunnel)",
                        # "url": rstudio_ip_url},
-                       #{"description": "TensorBoard (via tunnel)",
+                       # {"description": "TensorBoard (via tunnel)",
                        # "url": tensorboard_url},
-                       #{"description": "Ungit (via tunnel)",
+                       # {"description": "Ungit (via tunnel)",
                        # "url": ungit_ip_url}
                    ],
-                   "exploratory_user": notebook_config['dlab_ssh_user'],
+                   "exploratory_user": notebook_config['datalab_ssh_user'],
                    "exploratory_pass": notebook_config['rstudio_pass']}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information", str(err))
+        datalab.fab.append_result("Failed to generate output information", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/tensor_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/tensor_configure.py
index 613b4a1..9708b3b 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/tensor_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/tensor_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
+import sys
 import traceback
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -41,8 +41,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = (os.environ['exploratory_name']).replace('_', '-').lower()
@@ -89,11 +89,11 @@
         edge_instance_hostname = GCPMeta.get_instance_public_ip_by_name(edge_instance_name)
         edge_instance_private_ip = GCPMeta.get_private_ip_address(edge_instance_name)
         notebook_config['ssh_key_path'] = '{0}{1}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['zone'] = os.environ['gcp_zone']
         notebook_config['shared_image_enabled'] = os.environ['conf_shared_image_enabled']
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -105,18 +105,18 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, notebook_config['ssh_key_path'], notebook_config['initial_user'],
-            notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -127,14 +127,14 @@
         additional_config = {"proxy_host": edge_instance_name, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
             .format(instance_hostname, notebook_config['instance_name'], notebook_config['ssh_key_path'],
-                    json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+                    json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -143,15 +143,31 @@
         logging.info('[INSTALLING PREREQUISITES TO TENSOR NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO TENSOR NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
-            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['dlab_ssh_user'],
+            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['datalab_ssh_user'],
                    os.environ['gcp_region'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
+        sys.exit(1)
+
+    #Installing GPU drivers
+    try:
+        print('[INSTALLING GPU DRIVERS]')
+        params = "--hostname {} --keyfile {} --os_user {}".format(
+            instance_hostname, notebook_config['ssh_key_path'], notebook_config['datalab_ssh_user'])
+        try:
+            subprocess.run("~/scripts/{}.py {}".format('common_install_gpu', params), shell=True, check=True)
+        except:
+            datalab.fab.append_result("Failed installing users key")
+            raise Exception
+
+    except Exception as err:
+        datalab.fab.append_result("Failed to install GPU drivers.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -161,15 +177,15 @@
         print('[CONFIGURE TENSORFLOW NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} --region {} --os_user {} --exploratory_name {} --edge_ip {}" \
                  .format(instance_hostname, notebook_config['ssh_key_path'],
-                         os.environ['gcp_region'], notebook_config['dlab_ssh_user'],
+                         os.environ['gcp_region'], notebook_config['datalab_ssh_user'],
                          notebook_config['exploratory_name'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_tensor_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_tensor_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure TensorFlow.", str(err))
+        datalab.fab.append_result("Failed to configure TensorFlow.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -180,14 +196,14 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             instance_hostname, notebook_config['ssh_key_path'], json.dumps(additional_config),
-            notebook_config['dlab_ssh_user'])
+            notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -195,15 +211,15 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
         try:
-            local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -224,7 +240,7 @@
                 if image_id_list and image_id_list[1] != '':
                     print("Image of secondary disk was successfully created. It's ID is {}".format(image_id_list[1]))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
             GCPActions.remove_image(notebook_config['expected_primary_image_name'])
             GCPActions.remove_image(notebook_config['expected_secondary_image_name'])
@@ -245,17 +261,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     notebook_config['ssh_key_path'],
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'jupyter',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -283,7 +299,7 @@
         print("Jupyter URL: {}".format(jupyter_ip_url))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": ip_address,
@@ -309,6 +325,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information", str(err))
+        datalab.fab.append_result("Failed to generate output information", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_configure.py b/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_configure.py
index d6c4fab..c55f2e4 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_configure.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_configure.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-import logging
+import datalab.fab
+import datalab.actions_lib
+import datalab.meta_lib
 import json
-import sys
-import dlab.fab
-import dlab.actions_lib
-import dlab.meta_lib
+import logging
 import os
+import sys
 import traceback
-from fabric.api import *
-
+import subprocess
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -41,8 +41,8 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        GCPMeta = dlab.meta_lib.GCPMeta()
-        GCPActions = dlab.actions_lib.GCPActions()
+        GCPMeta = datalab.meta_lib.GCPMeta()
+        GCPActions = datalab.actions_lib.GCPActions()
         notebook_config = dict()
         try:
             notebook_config['exploratory_name'] = (os.environ['exploratory_name']).replace('_', '-').lower()
@@ -89,11 +89,11 @@
         edge_instance_hostname = GCPMeta.get_instance_public_ip_by_name(edge_instance_name)
         edge_instance_private_ip = GCPMeta.get_private_ip_address(edge_instance_name)
         notebook_config['ssh_key_path'] = '{0}{1}.pem'.format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-        notebook_config['dlab_ssh_user'] = os.environ['conf_os_user']
+        notebook_config['datalab_ssh_user'] = os.environ['conf_os_user']
         notebook_config['zone'] = os.environ['gcp_zone']
         notebook_config['shared_image_enabled'] = os.environ['conf_shared_image_enabled']
     except Exception as err:
-        dlab.fab.append_result("Failed to generate variables dictionary", str(err))
+        datalab.fab.append_result("Failed to generate variables dictionary", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -105,18 +105,18 @@
             notebook_config['initial_user'] = 'ec2-user'
             notebook_config['sudo_group'] = 'wheel'
 
-        logging.info('[CREATING DLAB SSH USER]')
-        print('[CREATING DLAB SSH USER]')
+        logging.info('[CREATING DATALAB SSH USER]')
+        print('[CREATING DATALAB SSH USER]')
         params = "--hostname {} --keyfile {} --initial_user {} --os_user {} --sudo_group {}".format(
             instance_hostname, notebook_config['ssh_key_path'], notebook_config['initial_user'],
-            notebook_config['dlab_ssh_user'], notebook_config['sudo_group'])
+            notebook_config['datalab_ssh_user'], notebook_config['sudo_group'])
         try:
-            local("~/scripts/{}.py {}".format('create_ssh_user', params))
+            subprocess.run("~/scripts/{}.py {}".format('create_ssh_user', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed creating ssh user 'dlab'.", str(err))
+        datalab.fab.append_result("Failed creating ssh user 'datalab'.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -127,14 +127,14 @@
         additional_config = {"proxy_host": edge_instance_name, "proxy_port": "3128"}
         params = "--hostname {} --instance_name {} --keyfile {} --additional_config '{}' --os_user {}" \
             .format(instance_hostname, notebook_config['instance_name'], notebook_config['ssh_key_path'],
-                    json.dumps(additional_config), notebook_config['dlab_ssh_user'])
+                    json.dumps(additional_config), notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('common_configure_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_proxy', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure proxy.", str(err))
+        datalab.fab.append_result("Failed to configure proxy.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -143,15 +143,15 @@
         logging.info('[INSTALLING PREREQUISITES TO ZEPPELIN NOTEBOOK INSTANCE]')
         print('[INSTALLING PREREQUISITES TO ZEPPELIN NOTEBOOK INSTANCE]')
         params = "--hostname {} --keyfile {} --user {} --region {} --edge_private_ip {}". \
-            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['dlab_ssh_user'],
+            format(instance_hostname, notebook_config['ssh_key_path'], notebook_config['datalab_ssh_user'],
                    os.environ['gcp_region'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('install_prerequisites', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_prerequisites', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing apps: apt & pip.", str(err))
+        datalab.fab.append_result("Failed installing apps: apt & pip.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -174,19 +174,19 @@
                  "--exploratory_name {} " \
                  "--edge_ip {}" \
             .format(instance_hostname, notebook_config['instance_name'], notebook_config['ssh_key_path'],
-                    os.environ['gcp_region'], json.dumps(additional_config), notebook_config['dlab_ssh_user'],
+                    os.environ['gcp_region'], json.dumps(additional_config), notebook_config['datalab_ssh_user'],
                     os.environ['notebook_spark_version'], os.environ['notebook_hadoop_version'], edge_instance_name,
                     '3128', os.environ['notebook_zeppelin_version'], os.environ['notebook_scala_version'],
                     os.environ['notebook_livy_version'], os.environ['notebook_multiple_clusters'],
                     os.environ['notebook_r_mirror'], 'null',
                     notebook_config['exploratory_name'], edge_instance_private_ip)
         try:
-            local("~/scripts/{}.py {}".format('configure_zeppelin_node', params))
+            subprocess.run("~/scripts/{}.py {}".format('configure_zeppelin_node', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to configure zeppelin.", str(err))
+        datalab.fab.append_result("Failed to configure zeppelin.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -197,14 +197,14 @@
                              "user_keydir": os.environ['conf_key_dir']}
         params = "--hostname {} --keyfile {} --additional_config '{}' --user {}".format(
             instance_hostname, notebook_config['ssh_key_path'], json.dumps(additional_config),
-            notebook_config['dlab_ssh_user'])
+            notebook_config['datalab_ssh_user'])
         try:
-            local("~/scripts/{}.py {}".format('install_user_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_user_key', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed installing users key")
+            datalab.fab.append_result("Failed installing users key")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed installing users key.", str(err))
+        datalab.fab.append_result("Failed installing users key.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -212,15 +212,15 @@
         print('[SETUP USER GIT CREDENTIALS]')
         logging.info('[SETUP USER GIT CREDENTIALS]')
         params = '--os_user {} --notebook_ip {} --keyfile "{}"' \
-            .format(notebook_config['dlab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
+            .format(notebook_config['datalab_ssh_user'], instance_hostname, notebook_config['ssh_key_path'])
         try:
-            local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed setup git credentials")
+            datalab.fab.append_result("Failed setup git credentials")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to setup git credentials.", str(err))
+        datalab.fab.append_result("Failed to setup git credentials.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -241,7 +241,7 @@
                 if image_id_list and image_id_list[1] != '':
                     print("Image of secondary disk was successfully created. It's ID is {}".format(image_id_list[1]))
         except Exception as err:
-            dlab.fab.append_result("Failed creating image.", str(err))
+            datalab.fab.append_result("Failed creating image.", str(err))
             GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
             GCPActions.remove_image(notebook_config['expected_primary_image_name'])
             GCPActions.remove_image(notebook_config['expected_secondary_image_name'])
@@ -262,17 +262,17 @@
                  "--additional_info '{}'"\
             .format(edge_instance_hostname,
                     notebook_config['ssh_key_path'],
-                    notebook_config['dlab_ssh_user'],
+                    notebook_config['datalab_ssh_user'],
                     'zeppelin',
                     notebook_config['exploratory_name'],
                     json.dumps(additional_info))
         try:
-            local("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_configure_reverse_proxy', params), shell=True, check=True)
         except:
-            dlab.fab.append_result("Failed edge reverse proxy template")
+            datalab.fab.append_result("Failed edge reverse proxy template")
             raise Exception
     except Exception as err:
-        dlab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
+        datalab.fab.append_result("Failed to set edge reverse proxy template.", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
 
@@ -295,7 +295,7 @@
         print("Zeppelin URL: {}".format(zeppelin_ip_url))
         print("Ungit URL: {}".format(ungit_ip_url))
         print('SSH access (from Edge node, via IP address): ssh -i {0}.pem {1}@{2}'.format(
-            notebook_config['key_name'], notebook_config['dlab_ssh_user'], ip_address))
+            notebook_config['key_name'], notebook_config['datalab_ssh_user'], ip_address))
 
         with open("/root/result.json", 'w') as result:
             res = {"hostname": ip_address,
@@ -316,6 +316,6 @@
                    ]}
             result.write(json.dumps(res))
     except Exception as err:
-        dlab.fab.append_result("Failed to generate output information", str(err))
+        datalab.fab.append_result("Failed to generate output information", str(err))
         GCPActions.remove_instance(notebook_config['instance_name'], notebook_config['zone'])
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_dataengine-service_create_configs.py b/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_dataengine-service_create_configs.py
index bd5c65b..ea33688 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_dataengine-service_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_dataengine-service_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,20 +21,13 @@
 #
 # ******************************************************************************
 
-import boto3
-from botocore.client import Config
-from fabric.api import *
 import argparse
-import os
-import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -61,17 +54,17 @@
 
 
 def install_remote_livy(args):
-    local('sudo chown {0}:{0} -R /opt/zeppelin/'.format(args.os_user))
-    local('sudo service zeppelin-notebook stop')
-    local('sudo -i wget http://archive.cloudera.com/beta/livy/livy-server-{0}.zip -O /opt/{1}/{2}/livy-server-{0}.zip'
-          .format(args.livy_version, args.dataproc_version, args.cluster_name))
-    local('sudo unzip /opt/{0}/{1}/livy-server-{2}.zip -d /opt/{0}/{1}/'.format(args.dataproc_version, args.cluster_name, args.livy_version))
-    local('sudo mv /opt/{0}/{1}/livy-server-{2}/ /opt/{0}/{1}/livy/'.format(args.dataproc_version, args.cluster_name, args.livy_version))
+    subprocess.run('sudo chown {0}:{0} -R /opt/zeppelin/'.format(args.os_user), shell=True, check=True)
+    subprocess.run('sudo service zeppelin-notebook stop', shell=True, check=True)
+    subprocess.run('sudo -i wget http://archive.cloudera.com/beta/livy/livy-server-{0}.zip -O /opt/{1}/{2}/livy-server-{0}.zip'
+          .format(args.livy_version, args.dataproc_version, args.cluster_name), shell=True, check=True)
+    subprocess.run('sudo unzip /opt/{0}/{1}/livy-server-{2}.zip -d /opt/{0}/{1}/'.format(args.dataproc_version, args.cluster_name, args.livy_version), shell=True, check=True)
+    subprocess.run('sudo mv /opt/{0}/{1}/livy-server-{2}/ /opt/{0}/{1}/livy/'.format(args.dataproc_version, args.cluster_name, args.livy_version), shell=True, check=True)
     livy_path = '/opt/{0}/{1}/livy/'.format(args.dataproc_version, args.cluster_name)
-    local('sudo mkdir -p {0}/logs'.format(livy_path))
-    local('sudo mkdir -p /var/run/livy')
-    local('sudo chown {0}:{0} -R /var/run/livy'.format(args.os_user))
-    local('sudo chown {0}:{0} -R {1}'.format(args.os_user, livy_path))
+    subprocess.run('sudo mkdir -p {0}/logs'.format(livy_path), shell=True, check=True)
+    subprocess.run('sudo mkdir -p /var/run/livy', shell=True, check=True)
+    subprocess.run('sudo chown {0}:{0} -R /var/run/livy'.format(args.os_user), shell=True, check=True)
+    subprocess.run('sudo chown {0}:{0} -R {1}'.format(args.os_user, livy_path), shell=True, check=True)
 
 
 if __name__ == "__main__":
@@ -80,14 +73,14 @@
     else:
         result = prepare(dataproc_dir, yarn_dir)
         if result == False :
-            actions_lib.GCPActions().jars(args, dataproc_dir)
-        actions_lib.GCPActions().yarn(args, yarn_dir)
-        actions_lib.GCPActions().install_dataproc_spark(args)
-        actions_lib.GCPActions().spark_defaults(args)
+            datalab.actions_lib.GCPActions().jars(args, dataproc_dir)
+        datalab.actions_lib.GCPActions().yarn(args, yarn_dir)
+        datalab.actions_lib.GCPActions().install_dataproc_spark(args)
+        datalab.actions_lib.GCPActions().spark_defaults(args)
         configuring_notebook(args.dataproc_version)
         if args.multiple_clusters == 'true':
             install_remote_livy(args)
         installing_python(args.region, args.bucket, args.user_name, args.cluster_name, args.application, args.pip_mirror)
-        actions_lib.GCPActions().configure_zeppelin_dataproc_interpreter(args.dataproc_version, args.cluster_name, spark_dir, args.os_user,
+        datalab.actions_lib.GCPActions().configure_zeppelin_dataproc_interpreter(args.dataproc_version, args.cluster_name, spark_dir, args.os_user,
                                                                          yarn_dir, args.bucket, args.user_name, args.multiple_clusters)
         update_zeppelin_interpreters(args.multiple_clusters, args.r_enabled)
diff --git a/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_install_dataengine-service_kernels.py b/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_install_dataengine-service_kernels.py
index be4c8d4..8269b93 100644
--- a/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_install_dataengine-service_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/gcp/zeppelin_install_dataengine-service_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,10 +22,10 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-import boto3
-from dlab.meta_lib import *
 import os
+from datalab.actions_lib import *
+from datalab.meta_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--bucket', type=str, default='')
@@ -50,32 +50,33 @@
     templates_dir = '/root/templates/'
     scripts_dir = '/root/scripts/'
     if os.environ['notebook_multiple_clusters'] == 'true':
-        put(templates_dir + 'dataengine-service_interpreter_livy.json', '/tmp/dataengine-service_interpreter.json')
+        conn.put(templates_dir + 'dataengine-service_interpreter_livy.json', '/tmp/dataengine-service_interpreter.json')
     else:
-        put(templates_dir + 'dataengine-service_interpreter_spark.json', '/tmp/dataengine-service_interpreter.json')
-    put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application), '/tmp/create_configs.py')
-    sudo('\cp /tmp/create_configs.py /usr/local/bin/create_configs.py')
-    sudo('chmod 755 /usr/local/bin/create_configs.py')
-    sudo('mkdir -p /usr/lib/python2.7/dlab/')
-    run('mkdir -p /tmp/dlab_libs/')
-    local('scp -i {} /usr/lib/python2.7/dlab/* {}:/tmp/dlab_libs/'.format(args.keyfile, env.host_string))
-    run('chmod a+x /tmp/dlab_libs/*')
-    sudo('mv /tmp/dlab_libs/* /usr/lib/python2.7/dlab/')
-    if exists('/usr/lib64'):
-        sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+        conn.put(templates_dir + 'dataengine-service_interpreter_spark.json', '/tmp/dataengine-service_interpreter.json')
+    conn.put(scripts_dir + '{}_dataengine-service_create_configs.py'.format(args.application), '/tmp/create_configs.py')
+    conn.sudo('\cp /tmp/create_configs.py /usr/local/bin/create_configs.py')
+    conn.sudo('chmod 755 /usr/local/bin/create_configs.py')
+    conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+    conn.run('mkdir -p /home/{}/datalab_libs/'.format(args.os_user))
+    conn.local('scp -i {0} /usr/lib/python3.8/datalab/*.py {1}@{2}:/home/{1}/datalab_libs/'.format(args.keyfile, args.os_user, args.notebook_ip))
+    conn.run('chmod a+x /home/{}/datalab_libs/*'.format(args.os_user))
+    conn.sudo('mv /home/{}/datalab_libs/* /usr/lib/python3.8/datalab/'.format(args.os_user))
+    conn.sudo('rm -rf /home/{}/datalab_libs/'.format(args.os_user))
+    if exists(conn, '/usr/lib64'):
+        conn.sudo('mkdir -p /usr/lib64/python3.8')
+        conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
 
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     configure_notebook(args)
     r_enabled = os.environ['notebook_r_enabled']
-    spark_version = actions_lib.GCPActions().get_cluster_app_version(args.bucket, args.project_name, args.cluster_name, 'spark')
-    hadoop_version = actions_lib.GCPActions().get_cluster_app_version(args.bucket, args.project_name, args.cluster_name, 'hadoop')
-    sudo('echo "[global]" > /etc/pip.conf; echo "proxy = $(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=)" >> /etc/pip.conf')
-    sudo('echo "use_proxy=yes" > ~/.wgetrc; proxy=$(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=); echo "http_proxy=$proxy" >> ~/.wgetrc; echo "https_proxy=$proxy" >> ~/.wgetrc')
-    sudo('unset http_proxy https_proxy; export gcp_project_id="{0}"; export conf_resource="{1}"; /usr/bin/python /usr/local/bin/create_configs.py --bucket {2} --cluster_name {3} --dataproc_version {4} --spark_version {5} --hadoop_version {6} --region {7} --user_name {8} --os_user {9} --pip_mirror {10} --application {11} --livy_version {12} --multiple_clusters {13} --r_enabled {14}'
-         .format(os.environ['gcp_project_id'], os.environ['conf_resource'], args.bucket, args.cluster_name, args.dataproc_version, spark_version, hadoop_version,
-                 args.region, args.project_name, args.os_user, args.pip_mirror, args.application, os.environ['notebook_livy_version'], os.environ['notebook_multiple_clusters'], r_enabled))
\ No newline at end of file
+    spark_version = datalab.actions_lib.GCPActions().get_cluster_app_version(args.bucket, args.project_name, args.cluster_name, 'spark')
+    hadoop_version = datalab.actions_lib.GCPActions().get_cluster_app_version(args.bucket, args.project_name, args.cluster_name, 'hadoop')
+    conn.sudo('''bash -l -c 'echo "[global]" > /etc/pip.conf; echo "proxy = $(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=)" >> /etc/pip.conf' ''')
+    conn.sudo('''bash -l -c 'echo "use_proxy=yes" > ~/.wgetrc; proxy=$(cat /etc/profile | grep proxy | head -n1 | cut -f2 -d=); echo "http_proxy=$proxy" >> ~/.wgetrc; echo "https_proxy=$proxy" >> ~/.wgetrc' ''')
+    conn.sudo('''bash -l -c 'unset http_proxy https_proxy; export gcp_project_id="{0}"; export conf_resource="{1}"; /usr/bin/python3 /usr/local/bin/create_configs.py --bucket {2} --cluster_name {3} --dataproc_version {4} --spark_version {5} --hadoop_version {6} --region {7} --user_name {8} --os_user {9} --pip_mirror {10} --application {11} --livy_version {12} --multiple_clusters {13} --r_enabled {14}' '''
+        .format(os.environ['gcp_project_id'], os.environ['conf_resource'], args.bucket, args.cluster_name, args.dataproc_version,
+                spark_version, hadoop_version, args.region, args.project_name, args.os_user, args.pip_mirror, args.application,
+                os.environ['notebook_livy_version'], os.environ['notebook_multiple_clusters'], r_enabled))
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/os/check_inactivity.py b/infrastructure-provisioning/src/general/scripts/os/check_inactivity.py
index f6f4ea0..51b3e4a 100644
--- a/infrastructure-provisioning/src/general/scripts/os/check_inactivity.py
+++ b/infrastructure-provisioning/src/general/scripts/os/check_inactivity.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,12 @@
 #
 # ******************************************************************************
 
-import sys
 import argparse
-from dlab.notebook_lib import *
-from dlab.fab import *
-from dlab.actions_lib import *
-from fabric.api import *
 import json
-import os
-
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--os_user', type=str, default='')
@@ -41,9 +38,8 @@
 
 
 if __name__ == "__main__":
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = '{}@{}'.format(args.os_user, args.instance_ip)
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.instance_ip, args.os_user, args.keyfile)
 
     inactivity_dir = '/opt/inactivity/'
     if args.resource_type == 'dataengine':
@@ -52,11 +48,13 @@
     else:
         inactivity_file = 'local_inactivity'
 
-    if exists('{}{}'.format(inactivity_dir, inactivity_file)):
-        timestamp = sudo('cat {}{}'.format(inactivity_dir, inactivity_file))
+    if exists(conn, '{}{}'.format(inactivity_dir, inactivity_file)):
+        timestamp = conn.sudo('cat {}{}'.format(inactivity_dir, inactivity_file)).stdout.replace('\n','')
     else:
         timestamp = '0000000000'
 
 
     with open('/root/result.json', 'w') as outfile:
         json.dump(timestamp, outfile)
+
+    conn.close()
diff --git a/infrastructure-provisioning/src/general/scripts/os/common_clean_instance.py b/infrastructure-provisioning/src/general/scripts/os/common_clean_instance.py
index ef8f4f8..6b24356 100644
--- a/infrastructure-provisioning/src/general/scripts/os/common_clean_instance.py
+++ b/infrastructure-provisioning/src/general/scripts/os/common_clean_instance.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,11 +21,11 @@
 #
 # ******************************************************************************
 
+import argparse
 import os
 import sys
-import argparse
-from fabric.api import *
-from dlab.notebook_lib import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -37,16 +37,16 @@
 
 def general_clean():
     try:
-        sudo('systemctl stop ungit')
-        sudo('systemctl stop inactive.timer')
-        sudo('rm -f /etc/systemd/system/inactive.service')
-        sudo('rm -f /etc/systemd/system/inactive.timer')
-        sudo('rm -rf /opt/inactivity')
-        sudo('npm -g uninstall ungit')
-        sudo('rm -f /etc/systemd/system/ungit.service')
-        sudo('systemctl daemon-reload')
+        conn.sudo('systemctl stop ungit')
+        conn.sudo('systemctl stop inactive.timer')
+        conn.sudo('rm -f /etc/systemd/system/inactive.service')
+        conn.sudo('rm -f /etc/systemd/system/inactive.timer')
+        conn.sudo('rm -rf /opt/inactivity')
+        conn.sudo('npm -g uninstall ungit')
+        conn.sudo('rm -f /etc/systemd/system/ungit.service')
+        conn.sudo('systemctl daemon-reload')
         remove_os_pkg(['nodejs', 'npm'])
-        sudo('sed -i "/spark.*.memory/d" /opt/spark/conf/spark-defaults.conf')
+        conn.sudo('sed -i "/spark.*.memory/d" /opt/spark/conf/spark-defaults.conf')
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
@@ -54,16 +54,15 @@
 
 def clean_jupyter():
     try:
-        sudo('systemctl stop jupyter-notebook')
-        sudo('pip2 uninstall -y notebook jupyter')
-        sudo('pip3.5 uninstall -y notebook jupyter')
-        sudo('rm -rf /usr/local/share/jupyter/')
-        sudo('rm -rf /home/{}/.jupyter/'.format(args.os_user))
-        sudo('rm -rf /home/{}/.ipython/'.format(args.os_user))
-        sudo('rm -rf /home/{}/.ipynb_checkpoints/'.format(args.os_user))
-        sudo('rm -rf /home/{}/.local/share/jupyter/'.format(args.os_user))
-        sudo('rm -f /etc/systemd/system/jupyter-notebook.service')
-        sudo('systemctl daemon-reload')
+        conn.sudo('systemctl stop jupyter-notebook')
+        conn.sudo('pip3 uninstall -y notebook jupyter')
+        conn.sudo('rm -rf /usr/local/share/jupyter/')
+        conn.sudo('rm -rf /home/{}/.jupyter/'.format(args.os_user))
+        conn.sudo('rm -rf /home/{}/.ipython/'.format(args.os_user))
+        conn.sudo('rm -rf /home/{}/.ipynb_checkpoints/'.format(args.os_user))
+        conn.sudo('rm -rf /home/{}/.local/share/jupyter/'.format(args.os_user))
+        conn.sudo('rm -f /etc/systemd/system/jupyter-notebook.service')
+        conn.sudo('systemctl daemon-reload')
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
@@ -71,14 +70,14 @@
 
 def clean_zeppelin():
     try:
-        sudo('systemctl stop zeppelin-notebook')
-        sudo('rm -rf /opt/zeppelin* /var/log/zeppelin /var/run/zeppelin')
+        conn.sudo('systemctl stop zeppelin-notebook')
+        conn.sudo('rm -rf /opt/zeppelin* /var/log/zeppelin /var/run/zeppelin')
         if os.environ['notebook_multiple_clusters'] == 'true':
-            sudo('systemctl stop livy-server')
-            sudo('rm -rf /opt/livy* /var/run/livy')
-            sudo('rm -f /etc/systemd/system/livy-server.service')
-        sudo('rm -f /etc/systemd/system/zeppelin-notebook.service')
-        sudo('systemctl daemon-reload')
+            conn.sudo('systemctl stop livy-server')
+            conn.sudo('rm -rf /opt/livy* /var/run/livy')
+            conn.sudo('rm -f /etc/systemd/system/livy-server.service')
+        conn.sudo('rm -f /etc/systemd/system/zeppelin-notebook.service')
+        conn.sudo('systemctl daemon-reload')
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
@@ -87,8 +86,8 @@
 def clean_rstudio():
     try:
         remove_os_pkg(['rstudio-server'])
-        sudo('rm -f /home/{}/.Rprofile'.format(args.os_user))
-        sudo('rm -f /home/{}/.Renviron'.format(args.os_user))
+        conn.sudo('rm -f /home/{}/.Rprofile'.format(args.os_user))
+        conn.sudo('rm -f /home/{}/.Renviron'.format(args.os_user))
     except Exception as err:
         print('Error:', str(err))
         sys.exit(1)
@@ -97,9 +96,9 @@
 def clean_tensor():
     try:
         clean_jupyter()
-        sudo('systemctl stop tensorboard')
-        sudo('systemctl disable tensorboard')
-        sudo('systemctl daemon-reload')
+        conn.sudo('systemctl stop tensorboard')
+        conn.sudo('systemctl disable tensorboard')
+        conn.sudo('systemctl daemon-reload')
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
@@ -108,9 +107,9 @@
 def clean_tensor_rstudio():
     try:
         clean_rstudio()
-        sudo('systemctl stop tensorboard')
-        sudo('systemctl disable tensorboard')
-        sudo('systemctl daemon-reload')
+        conn.sudo('systemctl stop tensorboard')
+        conn.sudo('systemctl disable tensorboard')
+        conn.sudo('systemctl daemon-reload')
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
@@ -118,9 +117,8 @@
 
 if __name__ == "__main__":
     print('Configure connections')
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     if os.environ['conf_cloud_provider'] == 'azure':
         de_master_name = '{}-{}-{}-de-{}-m'.format(
@@ -156,5 +154,5 @@
                 clean_tensor_rstudio()
     else:
         print('Found default ami, do not make clean')
-
+    #conn.close()
     sys.exit(0)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/os/common_configure_proxy.py b/infrastructure-provisioning/src/general/scripts/os/common_configure_proxy.py
index 21bd691..604a23a 100644
--- a/infrastructure-provisioning/src/general/scripts/os/common_configure_proxy.py
+++ b/infrastructure-provisioning/src/general/scripts/os/common_configure_proxy.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,12 +21,11 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
 import argparse
 import json
-import sys
-from dlab.notebook_lib import *
+from datalab.notebook_lib import *
+from datalab.fab import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -42,12 +41,11 @@
 ##############
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
     deeper_config = json.loads(args.additional_config)
 
     print("Enabling proxy for notebook server for repositories access.")
-    enable_proxy(deeper_config['proxy_host'], deeper_config['proxy_port'])
+    datalab.notebook_lib.enable_proxy(deeper_config['proxy_host'], deeper_config['proxy_port'])
 
-
+    conn.close()
diff --git a/infrastructure-provisioning/src/general/scripts/os/common_configure_reverse_proxy.py b/infrastructure-provisioning/src/general/scripts/os/common_configure_reverse_proxy.py
index 41454d2..38ea331 100644
--- a/infrastructure-provisioning/src/general/scripts/os/common_configure_reverse_proxy.py
+++ b/infrastructure-provisioning/src/general/scripts/os/common_configure_reverse_proxy.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -24,9 +24,11 @@
 import argparse
 import json
 import sys
-from fabric.api import *
+from datalab.fab import *
+from datalab.meta_lib import get_instance_private_ip_address
+from fabric import *
 from jinja2 import Environment, FileSystemLoader
-from dlab.meta_lib import get_instance_private_ip_address
+from datalab.fab import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--edge_hostname', type=str, default='')
@@ -103,11 +105,11 @@
         sys.exit(1)
 
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.edge_hostname
-    put('/tmp/{}.conf'.format(conf_file_name), '/etc/nginx/locations', use_sudo=True)
-    sudo('service nginx reload')
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.edge_hostname, args.os_user, args.keyfile)
+    conn.put('/tmp/{}.conf'.format(conf_file_name), '/tmp/{}.conf'.format(conf_file_name))
+    conn.sudo('cp -f /tmp/{}.conf /usr/local/openresty/nginx/conf/locations'.format(conf_file_name))
+    conn.sudo('service openresty reload')
 
-
+    conn.close()
 
diff --git a/infrastructure-provisioning/src/general/scripts/os/common_configure_spark.py b/infrastructure-provisioning/src/general/scripts/os/common_configure_spark.py
index fa15496..47f7b78 100644
--- a/infrastructure-provisioning/src/general/scripts/os/common_configure_spark.py
+++ b/infrastructure-provisioning/src/general/scripts/os/common_configure_spark.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,14 @@
 #
 # ******************************************************************************
 
+import argparse
+import ast
 import os
 import sys
 import time
-import ast
-import argparse
-from dlab.fab import *
-from fabric.api import *
-from dlab.notebook_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -42,10 +42,10 @@
 def update_spark_defaults_conf(spark_conf):
     try:
         timestamp = time.strftime("%a, %d %b %Y %H:%M:%S %Z", time.gmtime())
-        configs = sudo('find /opt/ /etc/ /usr/lib/ -name spark-defaults.conf -type f').split('\r\n')
+        configs = conn.sudo('find /opt/ /etc/ /usr/lib/ -name spark-defaults.conf -type f').stdout.split('\n')
         for conf in filter(None, configs):
-            sudo('''sed -i '/^# Updated/d' {0}'''.format(conf))
-            sudo('''echo "# Updated by DLab at {0} >> {1}'''.format(timestamp, conf))
+            conn.sudo('''sed -i '/^# Updated/d' {0}'''.format(conf))
+            conn.sudo('''echo "# Updated by DATALAB at {0} >> {1}'''.format(timestamp, conf))
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
@@ -53,27 +53,28 @@
 
 def add_custom_spark_properties(cluster_name):
     try:
-        dlab_header = sudo('cat /tmp/{0}/notebook_spark-defaults_local.conf | grep "^#"'.format(cluster_name))
-        spark_configurations = ast.literal_eval(os.environ['spark_configurations'])
-        new_spark_defaults = list()
-        spark_defaults = sudo('cat /opt/{0}/spark/conf/spark-defaults.conf'.format(cluster_name))
-        current_spark_properties = spark_defaults.split('\n')
-        for param in current_spark_properties:
-            if param.split(' ')[0] != '#':
-                for config in spark_configurations:
-                    if config['Classification'] == 'spark-defaults':
-                        for property in config['Properties']:
-                            if property == param.split(' ')[0]:
-                                param = property + ' ' + config['Properties'][property]
-                            else:
-                                new_spark_defaults.append(property + ' ' + config['Properties'][property])
-                new_spark_defaults.append(param)
-        new_spark_defaults = set(new_spark_defaults)
-        sudo("echo '{0}' > /opt/{1}/spark/conf/spark-defaults.conf".format(dlab_header, cluster_name))
-        for prop in new_spark_defaults:
-            prop = prop.rstrip()
-            sudo('echo "{0}" >> /opt/{1}/spark/conf/spark-defaults.conf'.format(prop, cluster_name))
-        sudo('sed -i "/^\s*$/d" /opt/{0}/spark/conf/spark-defaults.conf'.format(cluster_name))
+        if os.path.exists('/opt/{0}'.format(cluster_name)):
+            datalab_header = conn.sudo('cat /tmp/{0}/notebook_spark-defaults_local.conf | grep "^#"'.format(cluster_name)).stdout
+            spark_configurations = ast.literal_eval(os.environ['spark_configurations'])
+            new_spark_defaults = list()
+            spark_defaults = conn.sudo('cat /opt/{0}/spark/conf/spark-defaults.conf'.format(cluster_name)).stdout
+            current_spark_properties = spark_defaults.split('\n')
+            for param in current_spark_properties:
+                if param.split(' ')[0] != '#':
+                    for config in spark_configurations:
+                        if config['Classification'] == 'spark-defaults':
+                            for property in config['Properties']:
+                                if property == param.split(' ')[0]:
+                                    param = property + ' ' + config['Properties'][property]
+                                else:
+                                    new_spark_defaults.append(property + ' ' + config['Properties'][property])
+                    new_spark_defaults.append(param)
+            new_spark_defaults = set(new_spark_defaults)
+            conn.sudo("echo '{0}' > /opt/{1}/spark/conf/spark-defaults.conf".format(datalab_header, cluster_name))
+            for prop in new_spark_defaults:
+                prop = prop.rstrip()
+                conn.sudo('echo "{0}" >> /opt/{1}/spark/conf/spark-defaults.conf'.format(prop, cluster_name))
+            conn.sudo('sed -i "/^\s*$/d" /opt/{0}/spark/conf/spark-defaults.conf'.format(cluster_name))
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
@@ -81,9 +82,8 @@
 
 if __name__ == "__main__":
     print('Configure connections')
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     if (args.spark_conf != ''):
         update_spark_defaults_conf(args.spark_conf)
@@ -92,3 +92,5 @@
 
     if 'spark_configurations' in os.environ:
         add_custom_spark_properties(args.cluster_name)
+
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/os/configure_proxy_for_docker.py b/infrastructure-provisioning/src/general/scripts/os/configure_proxy_for_docker.py
index dc1094a..a233750 100644
--- a/infrastructure-provisioning/src/general/scripts/os/configure_proxy_for_docker.py
+++ b/infrastructure-provisioning/src/general/scripts/os/configure_proxy_for_docker.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,10 +21,10 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-import sys
 import argparse
-
+import sys
+from fabric import *
+from datalab.fab import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -37,24 +37,25 @@
 
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
     print("Configuring proxy for docker")
     try:
-        sudo('mkdir -p /etc/systemd/system/docker.service.d')
-        sudo('touch {}'.format(http_file))
-        sudo('echo -e \'[Service] \nEnvironment=\"HTTP_PROXY=\'$http_proxy\'\"\' > {}'.format(http_file))
-        sudo('touch {}'.format(https_file))
-        sudo('echo -e \'[Service] \nEnvironment=\"HTTPS_PROXY=\'$http_proxy\'\"\' > {}'.format(https_file))
-        sudo('mkdir /home/{}/.docker'.format(args.os_user))
-        sudo('touch /home/{}/.docker/config.json'.format(args.os_user))
-        sudo(
-            'echo -e \'{\n "proxies":\n {\n   "default":\n   {\n     "httpProxy":"\'$http_proxy\'",\n     "httpsProxy":"\'$http_proxy\'"\n   }\n }\n}\' > /home/dlab-user/.docker/config.json')
-        sudo('usermod -a -G docker ' + args.os_user)
-        sudo('update-rc.d docker defaults')
-        sudo('update-rc.d docker enable')
-        sudo('systemctl restart docker')
+        conn.sudo('mkdir -p /etc/systemd/system/docker.service.d')
+        conn.sudo('touch {}'.format(http_file))
+        conn.sudo('''bash -l -c 'echo -e \'[Service] \nEnvironment=\"HTTP_PROXY=\'$http_proxy\'\"\' > {}' '''.format(http_file))
+        conn.sudo('touch {}'.format(https_file))
+        conn.sudo('''bash -l -c 'echo -e \'[Service] \nEnvironment=\"HTTPS_PROXY=\'$http_proxy\'\"\' > {}' '''.format(https_file))
+        conn.sudo('mkdir /home/{}/.docker'.format(args.os_user))
+        conn.sudo('touch /home/{}/.docker/config.json'.format(args.os_user))
+        http_proxy = conn.sudo('''bash -l -c 'echo $http_proxy' ''').stdout.replace('\n','')
+        conn.sudo('''echo -e '{\n "proxies":\n {\n   "default":\n   {\n     "httpProxy":"'''+http_proxy+'''",\n     "httpsProxy":"'''+http_proxy+'''"\n   }\n }\n}'  > /tmp/docker_config.json''')
+        conn.sudo('cp /tmp/docker_config.json /home/{}/.docker/config.json'.format(args.os_user))
+        conn.sudo('usermod -a -G docker ' + args.os_user)
+        conn.sudo('update-rc.d docker defaults')
+        conn.sudo('update-rc.d docker enable')
+        conn.sudo('systemctl restart docker')
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/os/dataengine_install_libs.py b/infrastructure-provisioning/src/general/scripts/os/dataengine_install_libs.py
index f8729f1..05f4885 100644
--- a/infrastructure-provisioning/src/general/scripts/os/dataengine_install_libs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/dataengine_install_libs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,27 +21,28 @@
 #
 # ******************************************************************************
 
+import logging
+import multiprocessing
 import os
 import sys
-import logging
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
-import multiprocessing
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 
 def install_libs_on_slaves(slave, data_engine):
     slave_name = data_engine['slave_node_name'] + '{}'.format(slave + 1)
     data_engine['slave_ip'] = get_instance_private_ip_address(
         data_engine['tag_name'], slave_name)
-    params = '--os_user {} --instance_ip {} --keyfile "{}" --libs "{}"'\
+    params = '--os_user {} --instance_ip {} --keyfile "{}" --libs "{}"' \
         .format(data_engine['os_user'], data_engine['slave_ip'],
                 data_engine['keyfile'], data_engine['libs'])
     try:
         # Run script to install additional libs
-        local("~/scripts/{}.py {}".format('install_additional_libs', params))
+        subprocess.run("~/scripts/{}.py {}".format('install_additional_libs', params), shell=True, check=True)
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
@@ -80,7 +81,7 @@
                     data_engine['keyfile'], data_engine['libs'])
         try:
             # Run script to install additional libs
-            local("~/scripts/{}.py {}".format('install_additional_libs', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_additional_libs', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/os/dataengine_list_libs.py b/infrastructure-provisioning/src/general/scripts/os/dataengine_list_libs.py
index 9f2b18b..2580279 100644
--- a/infrastructure-provisioning/src/general/scripts/os/dataengine_list_libs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/dataengine_list_libs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,15 @@
 #
 # ******************************************************************************
 
+import logging
 import os
 import sys
-import logging
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -40,12 +41,13 @@
                         filename=local_log_filepath)
 
     try:
-        logging.info('[GETTING ALL AVAILABLE PACKAGES]')
-        print('[GETTING ALL AVAILABLE PACKAGES]')
+        logging.info('[GETTING AVAILABLE PACKAGES]')
+        print('[GETTING AVAILABLE PACKAGES]')
         data_engine = dict()
         try:
             data_engine['os_user'] = os.environ['conf_os_user']
             data_engine['service_base_name'] = os.environ['conf_service_base_name']
+            data_engine['group_name'] = os.environ['libCacheKey']
             data_engine['tag_name'] = data_engine['service_base_name'] + '-tag'
             data_engine['cluster_name'] = os.environ['computational_id']
             data_engine['master_node_name'] = data_engine['cluster_name'] + '-m'
@@ -56,11 +58,11 @@
             print('Error: {0}'.format(err))
             append_result("Failed to get parameter.", str(err))
             sys.exit(1)
-        params = "--os_user {} --instance_ip {} --keyfile '{}'" \
-            .format(data_engine['os_user'], data_engine['master_ip'], data_engine['keyfile'])
+        params = "--os_user {} --instance_ip {} --keyfile '{}' --group {}" \
+            .format(data_engine['os_user'], data_engine['master_ip'], data_engine['keyfile'], data_engine['group_name'])
         try:
             # Run script to get available libs
-            local("~/scripts/{}.py {}".format('get_list_available_pkgs', params))
+            subprocess.run("~/scripts/{}.py {}".format('get_list_available_pkgs', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/os/dataengine_reconfigure_spark.py b/infrastructure-provisioning/src/general/scripts/os/dataengine_reconfigure_spark.py
index 425b12b..41e07b4 100644
--- a/infrastructure-provisioning/src/general/scripts/os/dataengine_reconfigure_spark.py
+++ b/infrastructure-provisioning/src/general/scripts/os/dataengine_reconfigure_spark.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,17 +21,17 @@
 #
 # ******************************************************************************
 
+import json
+import logging
+import multiprocessing
 import os
 import sys
-import logging
 import traceback
-import json
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
-import multiprocessing
-
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
+import subprocess
 
 def install_libs_on_slaves(slave, data_engine):
     slave_name = data_engine['slave_node_name'] + '{}'.format(slave + 1)
@@ -41,7 +41,7 @@
         .format(data_engine['os_user'], data_engine['slave_ip'], data_engine['keyfile'])
     try:
         # Run script to install additional libs
-        local("~/scripts/{}.py {}".format('reconfigure_spark', params))
+        subprocess.run("~/scripts/{}.py {}".format('reconfigure_spark', params), shell=True, check=True)
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
@@ -81,7 +81,7 @@
             .format(data_engine['os_user'], data_engine['master_ip'], data_engine['keyfile'])
         try:
             # Run script to install additional libs
-            local("~/scripts/{}.py {}".format('reconfigure_spark', params))
+            subprocess.run("~/scripts/{}.py {}".format('reconfigure_spark', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
@@ -105,7 +105,7 @@
                                             data_engine['cluster_name'])
         try:
             # Run script to get available libs
-            local("~/scripts/{}.py {}".format('reconfigure_spark', params))
+            subprocess.run("~/scripts/{}.py {}".format('reconfigure_spark', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/os/deeplearning_dataengine_create_configs.py b/infrastructure-provisioning/src/general/scripts/os/deeplearning_dataengine_create_configs.py
index cc65bc5..7dabd3b 100644
--- a/infrastructure-provisioning/src/general/scripts/os/deeplearning_dataengine_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/deeplearning_dataengine_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,14 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
 import argparse
-import os
 import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -52,14 +48,14 @@
 
 spark_version = args.spark_version
 hadoop_version = args.hadoop_version
-scala_link = "http://www.scala-lang.org/files/archive/"
+scala_link = "https://www.scala-lang.org/files/archive/"
 spark_link = "https://archive.apache.org/dist/spark/spark-" + spark_version + "/spark-" + spark_version + \
              "-bin-hadoop" + hadoop_version + ".tgz"
 
 
 def pyspark_kernel(args):
     spark_path = '/opt/' + args.cluster_name + '/spark/'
-    local('mkdir -p ' + kernels_dir + 'pyspark_' + args.cluster_name + '/')
+    subprocess.run('mkdir -p ' + kernels_dir + 'pyspark_' + args.cluster_name + '/', shell=True, check=True)
     kernel_path = kernels_dir + "pyspark_" + args.cluster_name + "/kernel.json"
     template_file = "/tmp/{}/pyspark_dataengine_template.json".format(args.cluster_name)
     with open(template_file, 'r') as f:
@@ -67,19 +63,19 @@
     text = text.replace('CLUSTER_NAME', args.cluster_name)
     text = text.replace('SPARK_VERSION', 'Spark-' + spark_version)
     text = text.replace('SPARK_PATH', spark_path)
-    text = text.replace('PYTHON_SHORT_VERSION', '2.7')
-    text = text.replace('PYTHON_FULL_VERSION', '2.7')
+    text = text.replace('PYTHON_SHORT_VERSION', '3.8')
+    text = text.replace('PYTHON_FULL_VERSION', '3.8')
     text = text.replace('MASTER', args.spark_master)
-    text = text.replace('PYTHON_PATH', '/usr/bin/python2.7')
+    text = text.replace('PYTHON_PATH', '/usr/bin/python3.8')
     with open(kernel_path, 'w') as f:
         f.write(text)
-    local('touch /tmp/{}/kernel_var.json'.format(args.cluster_name))
-    local(
-        "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json".
-        format(args.cluster_name, kernel_path, args.os_user))
-    local('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path)
+    subprocess.run('touch /tmp/{}/kernel_var.json'.format(args.cluster_name), shell=True, check=True)
+    subprocess.run(
+        '''bash -l -c "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json" '''.
+        format(args.cluster_name, kernel_path, args.os_user), shell=True, check=True)
+    subprocess.run('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path, shell=True, check=True)
 
-    local('mkdir -p ' + kernels_dir + 'py3spark_' + args.cluster_name + '/')
+    subprocess.run('mkdir -p ' + kernels_dir + 'py3spark_' + args.cluster_name + '/', shell=True, check=True)
     kernel_path = kernels_dir + "py3spark_" + args.cluster_name + "/kernel.json"
     template_file = "/tmp/{}/pyspark_dataengine_template.json".format(args.cluster_name)
     with open(template_file, 'r') as f:
@@ -88,26 +84,57 @@
     text = text.replace('SPARK_VERSION', 'Spark-' + spark_version)
     text = text.replace('SPARK_PATH', spark_path)
     text = text.replace('MASTER', args.spark_master)
-    text = text.replace('PYTHON_SHORT_VERSION', '3.5')
-    text = text.replace('PYTHON_FULL_VERSION', '3.5')
-    text = text.replace('PYTHON_PATH', '/usr/bin/python3.5')
+    text = text.replace('PYTHON_SHORT_VERSION', '3.8')
+    text = text.replace('PYTHON_FULL_VERSION', '3.8')
+    text = text.replace('PYTHON_PATH', '/usr/bin/python3.8')
     with open(kernel_path, 'w') as f:
         f.write(text)
-    local('touch /tmp/{}/kernel_var.json'.format(args.cluster_name))
-    local(
-        "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json".
-        format(args.cluster_name, kernel_path, args.os_user))
-    local('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path)
+    subprocess.run('touch /tmp/{}/kernel_var.json'.format(args.cluster_name), shell=True, check=True)
+    subprocess.run(
+        '''bash -l -c "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json" '''.
+        format(args.cluster_name, kernel_path, args.os_user), shell=True, check=True)
+    subprocess.run('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path, shell=True, check=True)
 
+def install_sparkamagic_kernels(args):
+    try:
+        subprocess.run('sudo jupyter nbextension enable --py --sys-prefix widgetsnbextension', shell=True, check=True)
+        sparkmagic_dir = subprocess.run("sudo pip3 show sparkmagic | grep 'Location: ' | awk '{print $2}'", capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/sparkkernel --user'.format(sparkmagic_dir), shell=True, check=True)
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/pysparkkernel --user'.format(sparkmagic_dir), shell=True, check=True)
+
+        pyspark_kernel_name = 'PySpark (Python-{2} / Spark-{0} ) [{1}]'.format(args.spark_version,
+                                                                         args.cluster_name, os.environ['notebook_python_venv_version'][:3])
+        subprocess.run('sed -i \'s|PySpark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/pysparkkernel/kernel.json'.format(
+            pyspark_kernel_name, args.os_user), shell=True, check=True)
+        scala_version = subprocess.run('spark-submit --version 2>&1 | grep -o -P "Scala version \K.{0,7}"', capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+        spark_kernel_name = 'Spark (Scala-{0} / Spark-{1} ) [{2}]'.format(scala_version, args.spark_version,
+                                                                         args.cluster_name)
+        subprocess.run('sed -i \'s|Spark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkkernel/kernel.json'.format(
+            spark_kernel_name, args.os_user), shell=True, check=True)
+
+        subprocess.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/pysparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/pysparkkernel_{1}'.format(args.os_user, args.cluster_name), shell=True, check=True)
+        subprocess.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/sparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/sparkkernel_{1}'.format(args.os_user, args.cluster_name), shell=True, check=True)
+
+        subprocess.run('mkdir -p /home/' + args.os_user + '/.sparkmagic', shell=True, check=True)
+        subprocess.run('cp -f /tmp/sparkmagic_config_template.json /home/' + args.os_user + '/.sparkmagic/config.json', shell=True, check=True)
+        spark_master_ip = args.spark_master.split('//')[1].split(':')[0]
+        subprocess.run('sed -i \'s|LIVY_HOST|{0}|g\' /home/{1}/.sparkmagic/config.json'.format(
+                spark_master_ip, args.os_user), shell=True, check=True)
+        subprocess.run('sudo chown -R {0}:{0} /home/{0}/.sparkmagic/'.format(args.os_user), shell=True, check=True)
+    except:
+        sys.exit(1)
 
 if __name__ == "__main__":
     if args.dry_run == 'true':
         parser.print_help()
     else:
-        dataengine_dir_prepare('/opt/{}/'.format(args.cluster_name))
-        install_dataengine_spark(args.cluster_name, spark_link, spark_version, hadoop_version, cluster_dir, args.os_user,
-                                 args.datalake_enabled)
-        ensure_dataengine_tensorflow_jars(local_jars_dir)
-        configure_dataengine_spark(args.cluster_name, local_jars_dir, cluster_dir, args.datalake_enabled,
-                                   args.spark_configurations)
-        pyspark_kernel(args)
+        install_sparkamagic_kernels(args)
+        #dataengine_dir_prepare('/opt/{}/'.format(args.cluster_name))
+        #install_dataengine_spark(args.cluster_name, spark_link, spark_version, hadoop_version, cluster_dir, args.os_user,
+        #                         args.datalake_enabled)
+        #ensure_dataengine_tensorflow_jars(local_jars_dir)
+        #configure_dataengine_spark(args.cluster_name, local_jars_dir, cluster_dir, args.datalake_enabled,
+        #                           args.spark_configurations)
+        #pyspark_kernel(args)
diff --git a/infrastructure-provisioning/src/general/scripts/os/deeplearning_install_dataengine_kernels.py b/infrastructure-provisioning/src/general/scripts/os/deeplearning_install_dataengine_kernels.py
index c01a907..eb4a8a2 100644
--- a/infrastructure-provisioning/src/general/scripts/os/deeplearning_install_dataengine_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/os/deeplearning_install_dataengine_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,11 +22,12 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-from fabric.contrib.files import exists
-from dlab.meta_lib import *
 import os
-from dlab.fab import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -44,43 +45,46 @@
 def configure_notebook(keyfile, hoststring):
     templates_dir = '/root/templates/'
     scripts_dir = '/root/scripts/'
-    run('mkdir -p /tmp/{}/'.format(args.cluster_name))
-    if not exists('/tmp/deeplearning_dataengine_create_configs.py'):
-        put(scripts_dir + 'deeplearning_dataengine_create_configs.py',
+    conn.run('mkdir -p /tmp/{}/'.format(args.cluster_name))
+    conn.put(templates_dir + 'sparkmagic_config_template.json', '/tmp/sparkmagic_config_template.json')
+    if not exists(conn,'/tmp/deeplearning_dataengine_create_configs.py'):
+        conn.put(scripts_dir + 'deeplearning_dataengine_create_configs.py',
             '/tmp/deeplearning_dataengine_create_configs.py')
-    put(templates_dir + 'pyspark_dataengine_template.json', '/tmp/{}/pyspark_dataengine_template.json'.format(args.cluster_name))
-    put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
+    # conn.put(templates_dir + 'pyspark_dataengine_template.json', '/tmp/{}/pyspark_dataengine_template.json'.format(args.cluster_name))
+    # conn.put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
     spark_master_ip = args.spark_master.split('//')[1].split(':')[0]
-    spark_memory = get_spark_memory(True, args.os_user, spark_master_ip, keyfile)
-    run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory, args.cluster_name))
-    if not exists('/usr/local/bin/deeplearning_dataengine_create_configs.py'):
-        put(scripts_dir + 'deeplearning_dataengine_create_configs.py', '/usr/local/bin/deeplearning_dataengine_create_configs.py', use_sudo=True)
-        sudo('chmod 755 /usr/local/bin/deeplearning_dataengine_create_configs.py')
-    if not exists('/usr/lib/python2.7/dlab/'):
-        sudo('mkdir -p /usr/lib/python2.7/dlab/')
-        put('/usr/lib/python2.7/dlab/*', '/usr/lib/python2.7/dlab/', use_sudo=True)
-        sudo('chmod a+x /usr/lib/python2.7/dlab/*')
-        if exists('/usr/lib64'):
-            sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+    # spark_memory = get_spark_memory(True, args.os_user, spark_master_ip, keyfile)
+    # conn.run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory, args.cluster_name))
+    if not exists(conn,'/usr/local/bin/deeplearning_dataengine_create_configs.py'):
+        conn.put(scripts_dir + 'deeplearning_dataengine_create_configs.py', '/tmp/deeplearning_dataengine_create_configs.py')
+        conn.sudo('cp /tmp/deeplearning_dataengine_create_configs.py /usr/local/bin/deeplearning_dataengine_create_configs.py')
+        conn.sudo('chmod 755 /usr/local/bin/deeplearning_dataengine_create_configs.py')
+    if not exists(conn,'/usr/lib/python3.8/datalab/'):
+        conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+        conn.local('cd  /usr/lib/python3.8/datalab/; tar -zcvf /tmp/datalab.tar.gz *')
+        conn.put('/tmp/datalab.tar.gz', '/tmp/datalab.tar.gz')
+        conn.sudo('tar -zxvf /tmp/datalab.tar.gz -C /usr/lib/python3.8/datalab/')
+        conn.sudo('chmod a+x /usr/lib/python3.8/datalab/*')
+        if exists(conn, '/usr/lib64'):
+            conn.sudo('mkdir -p /usr/lib64/python3.8')
+            conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
 
 def create_inactivity_log(master_ip, hoststring):
     reworked_ip = master_ip.replace('.', '-')
-    sudo("date +%s > /opt/inactivity/{}_inactivity".format(reworked_ip))
+    conn.sudo('''bash -l -c "date +%s > /opt/inactivity/{}_inactivity" '''.format(reworked_ip))
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     try:
         region = os.environ['aws_region']
     except:
         region = ''
-    configure_notebook(args.keyfile, env.host_string)
-    create_inactivity_log(args.spark_master_ip, env.host_string)
+    configure_notebook(args.keyfile, args.notebook_ip)
+    create_inactivity_log(args.spark_master_ip, args.notebook_ip)
     if 'spark_configurations' not in os.environ:
         os.environ['spark_configurations'] = '[]'
-    sudo('/usr/bin/python /usr/local/bin/deeplearning_dataengine_create_configs.py '
+    conn.sudo('/usr/bin/python3 /usr/local/bin/deeplearning_dataengine_create_configs.py '
          '--cluster_name {} --spark_version {} --hadoop_version {} --os_user {} --spark_master {} --region {} '
          '--datalake_enabled {} --spark_configurations "{}"'.format(args.cluster_name, args.spark_version,
                                                                   args.hadoop_version, args.os_user,  args.spark_master,
diff --git a/infrastructure-provisioning/src/general/scripts/os/get_list_available_pkgs.py b/infrastructure-provisioning/src/general/scripts/os/get_list_available_pkgs.py
index 48d22a1..8e33b20 100644
--- a/infrastructure-provisioning/src/general/scripts/os/get_list_available_pkgs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/get_list_available_pkgs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,19 +21,20 @@
 #
 # ******************************************************************************
 
-import sys
 import argparse
-from dlab.notebook_lib import *
-from dlab.fab import *
-from fabric.api import *
 import json
-import xmlrpclib
-
+import sys
+import time
+import xmlrpc.client
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--os_user', type=str, default='')
 parser.add_argument('--instance_ip', type=str, default='')
 parser.add_argument('--keyfile', type=str, default='')
+parser.add_argument('--group', type=str, default='')
 args = parser.parse_args()
 
 
@@ -41,7 +42,7 @@
     try:
         for _ in range(100):
             pip_pkgs = dict()
-            client = xmlrpclib.ServerProxy('https://pypi.python.org/pypi')
+            client = xmlrpc.client.ServerProxy('https://pypi.python.org/pypi')
             raw_pkgs = client.browse(["Programming Language :: Python :: " + version + ""])
             all_pkgs = [i[0] for i in raw_pkgs]
             if len(all_pkgs) != 0:
@@ -49,7 +50,7 @@
                     pip_pkgs[pkg] = "N/A"
                 return pip_pkgs
             else:
-                local('sleep 5')
+                time.sleep(5)
                 continue
     except Exception as err:
         print('Error: {0}'.format(err))
@@ -59,7 +60,7 @@
 def get_uncategorised_pip_pkgs(all_pkgs_pip2, all_pkgs_pip3):
     try:
         pip_pkgs = dict()
-        client = xmlrpclib.ServerProxy('https://pypi.python.org/pypi')
+        client = xmlrpc.client.ServerProxy('https://pypi.python.org/pypi')
         raw_pkgs = client.list_packages()
         all_pkgs_other = []
         for pkg in raw_pkgs:
@@ -74,22 +75,22 @@
 
 
 if __name__ == "__main__":
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = '{}@{}'.format(args.os_user, args.instance_ip)
-
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.instance_ip, args.os_user, args.keyfile)
     all_pkgs = dict()
-    all_pkgs['os_pkg'] = get_available_os_pkgs()
-    all_pkgs['java'] = {}
-
-    if os.environ['application'] in ('jupyter', 'jupyterlab', 'zeppelin', 'deeplearning', 'tensor', 'tensor-rstudio', 'rstudio'):
+    if args.group == 'os_pkg':
+        all_pkgs['os_pkg'] = get_available_os_pkgs()
+    elif args.group == 'java':
+        all_pkgs['java'] = {}
+    #elif args.group == 'pip2':
+        #all_pkgs['pip2'] = get_available_pip_pkgs("2.7")
+    elif args.group == 'pip3':
+        all_pkgs['pip3'] = get_available_pip_pkgs("3.8")
+    elif args.group == 'others':
         all_pkgs['pip2'] = get_available_pip_pkgs("2.7")
-        all_pkgs['pip3'] = get_available_pip_pkgs("3.5")
+        all_pkgs['pip3'] = get_available_pip_pkgs("3.8")
         all_pkgs['others'] = get_uncategorised_pip_pkgs(all_pkgs['pip2'], all_pkgs['pip3'])
-
-    if (os.environ['application'] in ('jupyter', 'jupyterlab', 'zeppelin')
-        and os.environ['notebook_r_enabled'] == 'true')\
-            or os.environ['application'] in ('rstudio', 'tensor-rstudio'):
+    elif args.group == 'r_pkg':
         all_pkgs['r_pkg'] = get_available_r_pkgs()
 
     # Writing response file & json file with all pkgs
@@ -99,3 +100,5 @@
 
     with open("/root/all_pkgs.json", 'w') as result:
         result.write(json.dumps(all_pkgs))
+
+    conn.close()
diff --git a/infrastructure-provisioning/src/general/scripts/os/git_pre_commit.py b/infrastructure-provisioning/src/general/scripts/os/git_pre_commit.py
index 9987820..3af98aa 100644
--- a/infrastructure-provisioning/src/general/scripts/os/git_pre_commit.py
+++ b/infrastructure-provisioning/src/general/scripts/os/git_pre_commit.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -30,7 +30,7 @@
 url = subprocess.check_output(["git", "config", "--local", "remote.origin.url"])
 
 for host in data.keys():
-    if host in url:
+    if host in str(url):
         if os.environ['GIT_AUTHOR_NAME'] != data[host][0] or os.environ['GIT_AUTHOR_EMAIL'] != data[host][1]:
             subprocess.check_output(["git", "config", "--local", "user.name", data[host][0]])
             subprocess.check_output(["git", "config", "--local", "user.email", data[host][1]])
diff --git a/infrastructure-provisioning/src/general/scripts/os/install_additional_libs.py b/infrastructure-provisioning/src/general/scripts/os/install_additional_libs.py
index b3a787f..c3661e4 100644
--- a/infrastructure-provisioning/src/general/scripts/os/install_additional_libs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/install_additional_libs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,28 +22,25 @@
 # ******************************************************************************
 
 import argparse
-import sys
-from dlab.notebook_lib import *
-from dlab.fab import *
-from fabric.api import *
-import json
 import ast
-
+import json
+import sys
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--keyfile', type=str, default='')
 parser.add_argument('--instance_ip', type=str, default='')
 parser.add_argument('--os_user', type=str, default='')
 parser.add_argument('--libs', type=str, default='')
+parser.add_argument('--dataengine_service', type=bool, default=False)
 args = parser.parse_args()
 
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.instance_ip)
-    env['connection_attempts'] = 100
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.instance_ip, args.os_user, args.keyfile)
 
     print('Installing libraries: {}'.format(args.libs))
     general_status = list()
@@ -59,7 +56,8 @@
                     [data[row]['name'].split(':')[0], data[row]['name'].split(':')[1],
                      data[row]['version'], data[row]['override']])
             else:
-                pkgs['libraries'][data[row]['group']].append(data[row]['name'])
+                pkgs['libraries'][data[row]['group']].append(
+                    [data[row]['name'], data[row]['version']])
     except Exception as err:
         print('Error: {0}'.format(err))
         append_result("Failed to parse libs list.", str(err))
@@ -79,29 +77,25 @@
     except KeyError:
         pass
 
-    try:
-        print('Installing pip2 packages: {}'.format(pkgs['libraries']['pip2']))
-        status = install_pip_pkg(pkgs['libraries']['pip2'], 'pip2', 'pip2')
-        general_status = general_status + status
-    except KeyError:
-        pass
+    #try:
+        #print('Installing pip2 packages: {}'.format(pkgs['libraries']['pip2']))
+        #status = install_pip_pkg(pkgs['libraries']['pip2'], 'pip2', 'pip2', args.dataengine_service)
+        #general_status = general_status + status
+    #except KeyError:
+        #pass
 
     try:
         print('Installing pip3 packages: {}'.format(pkgs['libraries']['pip3']))
-        status = install_pip_pkg(pkgs['libraries']['pip3'], 'pip3', 'pip3')
+        status = install_pip_pkg(pkgs['libraries']['pip3'], 'pip3', 'pip3', args.dataengine_service)
         general_status = general_status + status
     except KeyError:
         pass
 
     try:
-        print('Installing other packages: {}'.format(pkgs['libraries']['others']))
+        print('Installing other packages (only tries pip3): {}'.format(pkgs['libraries']['others']))
         for pkg in pkgs['libraries']['others']:
-            status_pip2 = install_pip_pkg([pkg], 'pip2', 'others')
-            status_pip3 = install_pip_pkg([pkg], 'pip3', 'others')
-            if status_pip2[0]['status'] == 'installed':
-                general_status = general_status + status_pip2
-            else:
-                general_status = general_status + status_pip3
+            status_pip3 = install_pip_pkg([pkg], 'pip3', 'others', args.dataengine_service)
+            general_status = general_status + status_pip3
     except KeyError:
         pass
 
@@ -114,7 +108,7 @@
             general_status = general_status + status
         except KeyError:
             pass
-
+    conn.close()
     with open("/root/result.json", 'w') as result:
         res = {"Action": "Install additional libs",
                "Libs": general_status}
diff --git a/infrastructure-provisioning/src/general/scripts/os/ipynb_output_filter.py b/infrastructure-provisioning/src/general/scripts/os/ipynb_output_filter.py
index 20587d7..6ca06c0 100644
--- a/infrastructure-provisioning/src/general/scripts/os/ipynb_output_filter.py
+++ b/infrastructure-provisioning/src/general/scripts/os/ipynb_output_filter.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
diff --git a/infrastructure-provisioning/src/general/scripts/os/jupyter_dataengine_create_configs.py b/infrastructure-provisioning/src/general/scripts/os/jupyter_dataengine_create_configs.py
index 60a3246..94f7475 100644
--- a/infrastructure-provisioning/src/general/scripts/os/jupyter_dataengine_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/jupyter_dataengine_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,14 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
 import argparse
-import os
 import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -53,17 +49,17 @@
 
 spark_version = args.spark_version
 hadoop_version = args.hadoop_version
-scala_link = "http://www.scala-lang.org/files/archive/"
+scala_link = "https://www.scala-lang.org/files/archive/"
 spark_link = "https://archive.apache.org/dist/spark/spark-" + spark_version + "/spark-" + spark_version + \
              "-bin-hadoop" + hadoop_version + ".tgz"
 
 
 def r_kernel(args):
     spark_path = '/opt/{}/spark/'.format(args.cluster_name)
-    local('mkdir -p {}/r_{}/'.format(kernels_dir, args.cluster_name))
+    subprocess.run('mkdir -p {}/r_{}/'.format(kernels_dir, args.cluster_name), shell=True, check=True)
     kernel_path = "{}/r_{}/kernel.json".format(kernels_dir, args.cluster_name)
     template_file = "/tmp/{}/r_dataengine_template.json".format(args.cluster_name)
-    r_version = local("R --version | awk '/version / {print $3}'", capture = True)
+    r_version = subprocess.run("R --version | awk '/version / {print $3}'", capture_output = True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
 
     with open(template_file, 'r') as f:
         text = f.read()
@@ -79,11 +75,11 @@
 
 def toree_kernel(args):
     spark_path = '/opt/' + args.cluster_name + '/spark/'
-    scala_version = local('spark-submit --version 2>&1 | grep -o -P "Scala version \K.{0,7}"', capture=True)
-    local('mkdir -p ' + kernels_dir + 'toree_' + args.cluster_name + '/')
-    local('tar zxvf /tmp/{}/toree_kernel.tar.gz -C '.format(args.cluster_name) + kernels_dir + 'toree_' + args.cluster_name + '/')
-    local('sudo mv {0}toree_{1}/toree-0.2.0-incubating/* {0}toree_{1}/'.format(kernels_dir, args.cluster_name))
-    local('sudo rm -r {0}toree_{1}/toree-0.2.0-incubating'.format(kernels_dir, args.cluster_name))
+    scala_version = subprocess.run('spark-submit --version 2>&1 | grep -o -P "Scala version \K.{0,7}"', capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+    subprocess.run('mkdir -p ' + kernels_dir + 'toree_' + args.cluster_name + '/', shell=True, check=True)
+    subprocess.run('tar zxvf /tmp/{}/toree_kernel.tar.gz -C '.format(args.cluster_name) + kernels_dir + 'toree_' + args.cluster_name + '/', shell=True, check=True)
+    subprocess.run('sudo mv {0}toree_{1}/toree-0.3.0-incubating/* {0}toree_{1}/'.format(kernels_dir, args.cluster_name), shell=True, check=True)
+    subprocess.run('sudo rm -r {0}toree_{1}/toree-0.3.0-incubating'.format(kernels_dir, args.cluster_name), shell=True, check=True)
     kernel_path = kernels_dir + "toree_" + args.cluster_name + "/kernel.json"
     template_file = "/tmp/{}/toree_dataengine_template.json".format(args.cluster_name)
     with open(template_file, 'r') as f:
@@ -96,12 +92,10 @@
     text = text.replace('SCALA_VERSION', scala_version)
     with open(kernel_path, 'w') as f:
         f.write(text)
-    local('touch /tmp/{}/kernel_var.json'.format(args.cluster_name))
-    local(
-        "PYJ=`find /opt/" + args.cluster_name +
-        "/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat " + kernel_path +
-        " | sed 's|PY4J|'$PYJ'|g' > /tmp/{}/kernel_var.json".format(args.cluster_name))
-    local('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path)
+    subprocess.run('touch /tmp/{}/kernel_var.json'.format(args.cluster_name), shell=True, check=True)
+    subprocess.run(
+        '''bash -l -c "PYJ=`find /opt/{}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {} | sed 's|PY4J|'$PYJ'|g' > /tmp/{}/kernel_var.json" '''.format(args.cluster_name, kernel_path, args.cluster_name), shell=True, check=True)
+    subprocess.run('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path, shell=True, check=True)
     run_sh_path = kernels_dir + "toree_" + args.cluster_name + "/bin/run.sh"
     template_sh_file = '/tmp/{}/run_template.sh'.format(args.cluster_name)
     with open(template_sh_file, 'r') as f:
@@ -114,7 +108,7 @@
 
 def pyspark_kernel(args):
     spark_path = '/opt/' + args.cluster_name + '/spark/'
-    local('mkdir -p ' + kernels_dir + 'pyspark_' + args.cluster_name + '/')
+    subprocess.run('mkdir -p ' + kernels_dir + 'pyspark_' + args.cluster_name + '/', shell=True, check=True)
     kernel_path = kernels_dir + "pyspark_" + args.cluster_name + "/kernel.json"
     template_file = "/tmp/{}/pyspark_dataengine_template.json".format(args.cluster_name)
     with open(template_file, 'r') as f:
@@ -122,19 +116,19 @@
     text = text.replace('CLUSTER_NAME', args.cluster_name)
     text = text.replace('SPARK_VERSION', 'Spark-' + spark_version)
     text = text.replace('SPARK_PATH', spark_path)
-    text = text.replace('PYTHON_SHORT_VERSION', '2.7')
-    text = text.replace('PYTHON_FULL_VERSION', '2.7')
+    text = text.replace('PYTHON_SHORT_VERSION', '3.8')
+    text = text.replace('PYTHON_FULL_VERSION', '3.8')
     text = text.replace('MASTER', args.spark_master)
-    text = text.replace('PYTHON_PATH', '/usr/bin/python2.7')
+    text = text.replace('PYTHON_PATH', '/usr/bin/python3.8')
     with open(kernel_path, 'w') as f:
         f.write(text)
-    local('touch /tmp/{}/kernel_var.json'.format(args.cluster_name))
-    local(
-        "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json".
-        format(args.cluster_name, kernel_path, args.os_user))
-    local('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path)
+    subprocess.run('touch /tmp/{}/kernel_var.json'.format(args.cluster_name), shell=True, check=True)
+    subprocess.run(
+        '''bash -l -c "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json" '''.
+        format(args.cluster_name, kernel_path, args.os_user), shell=True, check=True)
+    subprocess.run('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path, shell=True, check=True)
 
-    local('mkdir -p ' + kernels_dir + 'py3spark_' + args.cluster_name + '/')
+    subprocess.run('mkdir -p ' + kernels_dir + 'py3spark_' + args.cluster_name + '/', shell=True, check=True)
     kernel_path = kernels_dir + "py3spark_" + args.cluster_name + "/kernel.json"
     template_file = "/tmp/{}/pyspark_dataengine_template.json".format(args.cluster_name)
     with open(template_file, 'r') as f:
@@ -143,28 +137,65 @@
     text = text.replace('SPARK_VERSION', 'Spark-' + spark_version)
     text = text.replace('SPARK_PATH', spark_path)
     text = text.replace('MASTER', args.spark_master)
-    text = text.replace('PYTHON_SHORT_VERSION', '3.5')
-    text = text.replace('PYTHON_FULL_VERSION', '3.5')
-    text = text.replace('PYTHON_PATH', '/usr/bin/python3.5')
+    text = text.replace('PYTHON_SHORT_VERSION', '3.8')
+    text = text.replace('PYTHON_FULL_VERSION', '3.8')
+    text = text.replace('PYTHON_PATH', '/usr/bin/python3.8')
     with open(kernel_path, 'w') as f:
         f.write(text)
-    local('touch /tmp/{}/kernel_var.json'.format(args.cluster_name))
-    local(
-        "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json".
-        format(args.cluster_name, kernel_path, args.os_user))
-    local('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path)
+    subprocess.run('touch /tmp/{}/kernel_var.json'.format(args.cluster_name), shell=True, check=True)
+    subprocess.run(
+        '''bash -l -c "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json" '''.
+        format(args.cluster_name, kernel_path, args.os_user), shell=True, check=True)
+    subprocess.run('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path, shell=True, check=True)
+
+def install_sparkamagic_kernels(args):
+    try:
+        subprocess.run('sudo jupyter nbextension enable --py --sys-prefix widgetsnbextension', shell=True, check=True)
+        sparkmagic_dir = subprocess.run("sudo pip3 show sparkmagic | grep 'Location: ' | awk '{print $2}'", capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/sparkkernel --user'.format(sparkmagic_dir), shell=True, check=True)
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/pysparkkernel --user'.format(sparkmagic_dir), shell=True, check=True)
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/sparkrkernel --user'.format(sparkmagic_dir), shell=True, check=True)
+        pyspark_kernel_name = 'PySpark (Python-{2} / Spark-{0} ) [{1}]'.format(args.spark_version,
+                                                                         args.cluster_name, os.environ['notebook_python_venv_version'][:3])
+        subprocess.run('sed -i \'s|PySpark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/pysparkkernel/kernel.json'.format(
+            pyspark_kernel_name, args.os_user), shell=True, check=True)
+        scala_version = subprocess.run('spark-submit --version 2>&1 | grep -o -P "Scala version \K.{0,7}"', capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+        spark_kernel_name = 'Spark (Scala-{0} / Spark-{1} ) [{2}]'.format(scala_version, args.spark_version,
+                                                                         args.cluster_name)
+        subprocess.run('sed -i \'s|Spark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkkernel/kernel.json'.format(
+            spark_kernel_name, args.os_user), shell=True, check=True)
+        r_version = subprocess.run("R --version | awk '/version / {print $3}'", capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+        sparkr_kernel_name = 'SparkR (R-{0} / Spark-{1} ) [{2}]'.format(str(r_version), args.spark_version,
+                                                                            args.cluster_name)
+        subprocess.run('sed -i \'s|SparkR|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkrkernel/kernel.json'.format(
+            sparkr_kernel_name, args.os_user), shell=True, check=True)
+        subprocess.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/pysparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/pysparkkernel_{1}'.format(args.os_user, args.cluster_name), shell=True, check=True)
+        subprocess.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/sparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/sparkkernel_{1}'.format(args.os_user, args.cluster_name), shell=True, check=True)
+        subprocess.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/sparkrkernel '
+              '/home/{0}/.local/share/jupyter/kernels/sparkrkernel_{1}'.format(args.os_user, args.cluster_name), shell=True, check=True)
+        subprocess.run('mkdir -p /home/' + args.os_user + '/.sparkmagic', shell=True, check=True)
+        subprocess.run('cp -f /tmp/sparkmagic_config_template.json /home/' + args.os_user + '/.sparkmagic/config.json', shell=True, check=True)
+        spark_master_ip = args.spark_master.split('//')[1].split(':')[0]
+        subprocess.run('sed -i \'s|LIVY_HOST|{0}|g\' /home/{1}/.sparkmagic/config.json'.format(
+                spark_master_ip, args.os_user), shell=True, check=True)
+        subprocess.run('sudo chown -R {0}:{0} /home/{0}/.sparkmagic/'.format(args.os_user), shell=True, check=True)
+    except:
+        sys.exit(1)
 
 
 if __name__ == "__main__":
     if args.dry_run == 'true':
         parser.print_help()
     else:
-        dataengine_dir_prepare('/opt/{}/'.format(args.cluster_name))
-        install_dataengine_spark(args.cluster_name, spark_link, spark_version, hadoop_version, cluster_dir, args.os_user,
-                                 args.datalake_enabled)
-        configure_dataengine_spark(args.cluster_name, local_jars_dir, cluster_dir, args.datalake_enabled,
-                                   args.spark_configurations)
-        pyspark_kernel(args)
-        toree_kernel(args)
-        if args.r_enabled == 'true':
-            r_kernel(args)
+        install_sparkamagic_kernels(args)
+        #dataengine_dir_prepare('/opt/{}/'.format(args.cluster_name))
+        #install_dataengine_spark(args.cluster_name, spark_link, spark_version, hadoop_version, cluster_dir, args.os_user,
+        #                         args.datalake_enabled)
+        #configure_dataengine_spark(args.cluster_name, local_jars_dir, cluster_dir, args.datalake_enabled,
+        #                           args.spark_configurations)
+        #pyspark_kernel(args)
+        #toree_kernel(args)
+        #if args.r_enabled == 'true':
+        #    r_kernel(args)
diff --git a/infrastructure-provisioning/src/general/scripts/os/jupyter_install_dataengine_kernels.py b/infrastructure-provisioning/src/general/scripts/os/jupyter_install_dataengine_kernels.py
index 9b984af..8fbc014 100644
--- a/infrastructure-provisioning/src/general/scripts/os/jupyter_install_dataengine_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/os/jupyter_install_dataengine_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,11 +22,12 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-from fabric.contrib.files import exists
-from dlab.meta_lib import *
-from dlab.fab import *
 import os
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -41,40 +42,80 @@
 args = parser.parse_args()
 
 
-def configure_notebook(keyfile, hoststring):
+def configure_notebook(keyfile):
     templates_dir = '/root/templates/'
     files_dir = '/root/files/'
     scripts_dir = '/root/scripts/'
-    run('mkdir -p /tmp/{}/'.format(args.cluster_name))
-    put(templates_dir + 'pyspark_dataengine_template.json', '/tmp/{}/pyspark_dataengine_template.json'.format(args.cluster_name))
-    put(templates_dir + 'r_dataengine_template.json', '/tmp/{}/r_dataengine_template.json'.format(args.cluster_name))
-    put(templates_dir + 'toree_dataengine_template.json','/tmp/{}/toree_dataengine_template.json'.format(args.cluster_name))
-    put(files_dir + 'toree_kernel.tar.gz', '/tmp/{}/toree_kernel.tar.gz'.format(args.cluster_name))
-    put(templates_dir + 'toree_dataengine_template.json', '/tmp/{}/toree_dataengine_template.json'.format(args.cluster_name))
-    put(templates_dir + 'run_template.sh', '/tmp/{}/run_template.sh'.format(args.cluster_name))
-    put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
+    datalab.fab.conn.run('mkdir -p /tmp/{}/'.format(args.cluster_name))
+    datalab.fab.conn.put(templates_dir + 'sparkmagic_config_template.json', '/tmp/sparkmagic_config_template.json')
+    #put(templates_dir + 'pyspark_dataengine_template.json', '/tmp/{}/pyspark_dataengine_template.json'.format(args.cluster_name))
+    #put(templates_dir + 'r_dataengine_template.json', '/tmp/{}/r_dataengine_template.json'.format(args.cluster_name))
+    #put(templates_dir + 'toree_dataengine_template.json','/tmp/{}/toree_dataengine_template.json'.format(args.cluster_name))
+    # conn.put(files_dir + 'toree_kernel.tar.gz', '/tmp/{}/toree_kernel.tar.gz'.format(args.cluster_name))
+    # conn.put(templates_dir + 'toree_dataengine_template.json', '/tmp/{}/toree_dataengine_template.json'.format(args.cluster_name))
+    # conn.put(templates_dir + 'run_template.sh', '/tmp/{}/run_template.sh'.format(args.cluster_name))
+    datalab.fab.conn.put(templates_dir + 'notebook_spark-defaults_local.conf',
+        '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
     spark_master_ip = args.spark_master.split('//')[1].split(':')[0]
-    spark_memory = get_spark_memory(True, args.os_user, spark_master_ip, keyfile)
-    run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory, args.cluster_name))
-    if not exists('/usr/local/bin/jupyter_dataengine_create_configs.py'):
-        put(scripts_dir + 'jupyter_dataengine_create_configs.py', '/usr/local/bin/jupyter_dataengine_create_configs.py', use_sudo=True)
-        sudo('chmod 755 /usr/local/bin/jupyter_dataengine_create_configs.py')
-    if not exists('/usr/lib/python2.7/dlab/'):
-        sudo('mkdir -p /usr/lib/python2.7/dlab/')
-        put('/usr/lib/python2.7/dlab/*', '/usr/lib/python2.7/dlab/', use_sudo=True)
-        sudo('chmod a+x /usr/lib/python2.7/dlab/*')
-        if exists('/usr/lib64'):
-            sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+    # spark_memory = get_spark_memory(True, args.os_user, spark_master_ip, keyfile)
+    # conn.run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory, args.cluster_name))
+    if not exists(datalab.fab.conn,'/usr/local/bin/jupyter_dataengine_create_configs.py'):
+        datalab.fab.conn.put(scripts_dir + 'jupyter_dataengine_create_configs.py', '/tmp/jupyter_dataengine_create_configs.py')
+        datalab.fab.conn.sudo('cp -f /tmp/jupyter_dataengine_create_configs.py /usr/local/bin/jupyter_dataengine_create_configs.py')
+        datalab.fab.conn.sudo('chmod 755 /usr/local/bin/jupyter_dataengine_create_configs.py')
+    if not exists(datalab.fab.conn,'/usr/lib/python3.8/datalab/'):
+        datalab.fab.conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+        datalab.fab.conn.local('cd  /usr/lib/python3.8/datalab/; tar -zcvf /tmp/datalab.tar.gz *')
+        datalab.fab.conn.put('/tmp/datalab.tar.gz', '/tmp/datalab.tar.gz')
+        datalab.fab.conn.sudo('tar -zxvf /tmp/datalab.tar.gz -C /usr/lib/python3.8/datalab/')
+        datalab.fab.conn.sudo('chmod a+x /usr/lib/python3.8/datalab/*')
+        if exists(datalab.fab.conn, '/usr/lib64'):
+            datalab.fab.conn.sudo('mkdir -p /usr/lib64/python3.8')
+            datalab.fab.conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
 
-def create_inactivity_log(master_ip, hoststring):
+def install_sparkamagic_kernels(args):
+    try:
+        datalab.fab.conn.sudo('sudo jupyter nbextension enable --py --sys-prefix widgetsnbextension')
+        sparkmagic_dir = datalab.fab.conn.sudo(''' bash -l -c 'pip3 show sparkmagic | grep "Location: "' ''').stdout.rstrip("\n\r").split(' ')[1]
+        datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/sparkkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/pysparkkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/sparkrkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        pyspark_kernel_name = 'PySpark (Python-{2} / Spark-{0} ) [{1}]'.format(args.spark_version,
+                                                                         args.cluster_name, os.environ['notebook_python_venv_version'][:3])
+        datalab.fab.conn.sudo('sed -i \'s|PySpark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/pysparkkernel/kernel.json'.format(
+            pyspark_kernel_name, args.os_user))
+        scala_version = datalab.fab.conn.sudo('''bash -l -c 'spark-submit --version 2>&1 | grep -o -P "Scala version \K.{0,7}"' ''').stdout.rstrip("\n\r")
+        spark_kernel_name = 'Spark (Scala-{0} / Spark-{1} ) [{2}]'.format(scala_version, args.spark_version,
+                                                                         args.cluster_name)
+        datalab.fab.conn.sudo('sed -i \'s|Spark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkkernel/kernel.json'.format(
+            spark_kernel_name, args.os_user))
+        r_version = datalab.fab.conn.sudo(''' bash -l -c 'R --version | grep -o -P "R version \K.{0,5}"' ''').stdout.rstrip("\n\r")
+        sparkr_kernel_name = 'SparkR (R-{0} / Spark-{1} ) [{2}]'.format(r_version, args.spark_version,
+                                                                            args.cluster_name)
+        datalab.fab.conn.sudo('sed -i \'s|SparkR|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkrkernel/kernel.json'.format(
+            sparkr_kernel_name, args.os_user))
+        datalab.fab.conn.sudo('sudo mv -f /home/{0}/.local/share/jupyter/kernels/pysparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/pysparkkernel_{1}'.format(args.os_user, args.cluster_name))
+        datalab.fab.conn.sudo('sudo mv -f /home/{0}/.local/share/jupyter/kernels/sparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/sparkkernel_{1}'.format(args.os_user, args.cluster_name))
+        datalab.fab.conn.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/sparkrkernel '
+              '/home/{0}/.local/share/jupyter/kernels/sparkrkernel_{1}'.format(args.os_user, args.cluster_name))
+        datalab.fab.conn.sudo('mkdir -p /home/' + args.os_user + '/.sparkmagic')
+        datalab.fab.conn.sudo('cp -f /tmp/sparkmagic_config_template.json /home/' + args.os_user + '/.sparkmagic/config.json')
+        spark_master_ip = args.spark_master.split('//')[1].split(':')[0]
+        datalab.fab.conn.sudo('sed -i \'s|LIVY_HOST|{0}|g\' /home/{1}/.sparkmagic/config.json'.format(
+                spark_master_ip, args.os_user))
+        datalab.fab.conn.sudo('sudo chown -R {0}:{0} /home/{0}/.sparkmagic/'.format(args.os_user))
+    except Exception as err:
+        print(err)
+        sys.exit(1)
+
+def create_inactivity_log(master_ip):
     reworked_ip = master_ip.replace('.', '-')
-    sudo("date +%s > /opt/inactivity/{}_inactivity".format(reworked_ip))
+    datalab.fab.conn.sudo('''bash -l -c "date +%s > /opt/inactivity/{}_inactivity" '''.format(reworked_ip))
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     try:
         region = os.environ['aws_region']
     except:
@@ -82,11 +123,13 @@
     r_enabled = os.environ['notebook_r_enabled']
     if 'spark_configurations' not in os.environ:
         os.environ['spark_configurations'] = '[]'
-    configure_notebook(args.keyfile, env.host_string)
-    create_inactivity_log(args.spark_master_ip, env.host_string)
-    sudo('/usr/bin/python /usr/local/bin/jupyter_dataengine_create_configs.py '
-         '--cluster_name {} --spark_version {} --hadoop_version {} --os_user {} \
-         --spark_master {} --region {} --datalake_enabled {} --r_enabled {} --spark_configurations "{}"'.
-         format(args.cluster_name, args.spark_version, args.hadoop_version, args.os_user, args.spark_master,
-                region, args.datalake_enabled, r_enabled, os.environ['spark_configurations']))
+    configure_notebook(args.keyfile)
+    install_sparkamagic_kernels(args)
+    create_inactivity_log(args.spark_master_ip)
+
+    #datalab.fab.conn.sudo('/usr/bin/python3 /usr/local/bin/jupyter_dataengine_create_configs.py '
+    #     '--cluster_name {} --spark_version {} --hadoop_version {} --os_user {} \
+    #     --spark_master {} --datalake_enabled {} --r_enabled {} --spark_configurations "{}"'.
+    #     format(args.cluster_name, args.spark_version, args.hadoop_version, args.os_user, args.spark_master,
+    #            args.datalake_enabled, r_enabled, os.environ['spark_configurations']))
 
diff --git a/infrastructure-provisioning/src/general/scripts/os/jupyterlab_container_start.py b/infrastructure-provisioning/src/general/scripts/os/jupyterlab_container_start.py
index c4ff97b..a7e50b1 100644
--- a/infrastructure-provisioning/src/general/scripts/os/jupyterlab_container_start.py
+++ b/infrastructure-provisioning/src/general/scripts/os/jupyterlab_container_start.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,10 +22,10 @@
 # ******************************************************************************
 
 import sys
-import os
-from dlab.notebook_lib import *
-from dlab.fab import *
-from fabric.api import *
+import argparse
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -37,12 +37,11 @@
 
 def start_jupyterlab_container(jupyterlab_dir):
     try:
-        with cd('{}'.format(jupyterlab_dir)):
-            run('docker build --file Dockerfile_jupyterlab -t jupyter-lab .'.format(args.os_user))
-            container_id = run('docker ps | awk \'NR==2{print $1}\'')
-            if container_id != '':
-                run('docker stop ' + container_id)
-            run('docker run -d --restart unless-stopped -p 8888:8888 \
+        conn.run('cd {0} && docker build --network=host --file Dockerfile_jupyterlab -t jupyter-lab .'.format(jupyterlab_dir, args.os_user))
+        container_id = conn.run('docker ps | awk \'NR==2{print $1}\'').stdout.replace('\n','')
+        if container_id != '':
+            conn.run('docker stop ' + container_id)
+        conn.run('docker run -d --restart unless-stopped -p 8888:8888 \
                      -v /home/{0}:/opt/legion/repository \
                      -v /home/{0}/.ssh/:/home/{0}/.ssh/ \
                      jupyter-lab:latest'.format(args.os_user))
@@ -50,13 +49,12 @@
 
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
     print("Starting Jupyter container")
     try:
         start_jupyterlab_container(jupyterlab_dir)
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
-
+    conn.close()
diff --git a/infrastructure-provisioning/src/general/scripts/os/manage_git_creds.py b/infrastructure-provisioning/src/general/scripts/os/manage_git_creds.py
index 7010e5f..e8be6fb 100644
--- a/infrastructure-provisioning/src/general/scripts/os/manage_git_creds.py
+++ b/infrastructure-provisioning/src/general/scripts/os/manage_git_creds.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,14 +22,13 @@
 # ******************************************************************************
 
 import argparse
-import sys
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from fabric.api import *
 import ast
 import os
-
+import sys
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--keyfile', type=str, default='')
@@ -37,24 +36,20 @@
 parser.add_argument('--os_user', type=str, default='')
 args = parser.parse_args()
 
-
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env['connection_attempts'] = 100
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
 
     gitlab_certfile = os.environ['conf_gitlab_certfile']
-    if exists('/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
+    if exists(conn, '/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
         install_gitlab_cert(args.os_user, gitlab_certfile)
 
     git_creds = dict()
     try:
-        if exists('/home/{}/.netrc'.format(args.os_user)):
-            run('rm .netrc')
-        if exists('/home/{}/.gitcreds'.format(args.os_user)):
-            run('rm .gitcreds')
+        if exists(conn, '/home/{}/.netrc'.format(args.os_user)):
+            conn.run('rm .netrc')
+        if exists(conn, '/home/{}/.gitcreds'.format(args.os_user)):
+            conn.run('rm .gitcreds')
         git_creds = os.environ['git_creds']
     except KeyError as err:
         print('Error: {0}'.format(err))
@@ -78,16 +73,18 @@
         with open("new_netrc", "w+") as f:
             for conf in sorted(new_config, reverse=True):
                 f.writelines(conf + "\n")
-        put('new_netrc', '/home/{}/.netrc'.format(args.os_user))
+        conn.put('new_netrc', '/home/{}/.netrc'.format(args.os_user))
 
         creds = dict()
         with open("new_gitcreds", 'w') as gitcreds:
             for i in range(len(data)):
                 creds.update({data[i]['hostname']: [data[i]['username'], data[i]['email']]})
             gitcreds.write(json.dumps(creds))
-        put('new_gitcreds', '/home/{}/.gitcreds'.format(args.os_user))
+        conn.put('new_gitcreds', '/home/{}/.gitcreds'.format(args.os_user))
 
     except Exception as err:
         print('Error: {0}'.format(err))
         append_result("Failed to add host/login/(password/token) to config.", str(err))
         sys.exit(1)
+
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/os/notebook_git_creds.py b/infrastructure-provisioning/src/general/scripts/os/notebook_git_creds.py
index eaf9ea5..bb2b974 100644
--- a/infrastructure-provisioning/src/general/scripts/os/notebook_git_creds.py
+++ b/infrastructure-provisioning/src/general/scripts/os/notebook_git_creds.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,15 @@
 #
 # ******************************************************************************
 
+import logging
 import os
 import sys
-import logging
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -54,8 +55,8 @@
             .format(notebook_config['os_user'], notebook_config['notebook_ip'], notebook_config['keyfile'])
         try:
             # Run script to manage git credentials
-            local("~/scripts/{}.py {}".format('common_download_git_certfile', params))
-            local("~/scripts/{}.py {}".format('manage_git_creds', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_download_git_certfile', params), shell=True, check=True)
+            subprocess.run("~/scripts/{}.py {}".format('manage_git_creds', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/os/notebook_inactivity_check.py b/infrastructure-provisioning/src/general/scripts/os/notebook_inactivity_check.py
index 5e51179..6784b81 100644
--- a/infrastructure-provisioning/src/general/scripts/os/notebook_inactivity_check.py
+++ b/infrastructure-provisioning/src/general/scripts/os/notebook_inactivity_check.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,15 +22,16 @@
 # ******************************************************************************
 
 
-import json
-from dlab.fab import *
-from dlab.meta_lib import *
-import sys, time, os
-from dlab.actions_lib import *
-
+import os
+import sys
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 if __name__ == "__main__":
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'], os.environ['request_id'])
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/project/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
@@ -63,7 +64,7 @@
             .format(notebook_config['os_user'], notebook_config['notebook_ip'], notebook_config['keyfile'], notebook_config['resource_type'], notebook_config['dataengine_ip'])
         try:
             # Run script to get available libs
-            local("~/scripts/{}.py {}".format('check_inactivity', params))
+            subprocess.run("~/scripts/{}.py {}".format('check_inactivity', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/os/notebook_install_libs.py b/infrastructure-provisioning/src/general/scripts/os/notebook_install_libs.py
index b56157a..50b9609 100644
--- a/infrastructure-provisioning/src/general/scripts/os/notebook_install_libs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/notebook_install_libs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,15 @@
 #
 # ******************************************************************************
 
+import logging
 import os
 import sys
-import logging
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
-
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -62,7 +62,7 @@
                     notebook_config['keyfile'], notebook_config['libs'])
         try:
             # Run script to install additional libs
-            local("~/scripts/{}.py {}".format('install_additional_libs', params))
+            subprocess.run("~/scripts/{}.py {}".format('install_additional_libs', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/os/notebook_list_libs.py b/infrastructure-provisioning/src/general/scripts/os/notebook_list_libs.py
index 820c818..e6e989e 100644
--- a/infrastructure-provisioning/src/general/scripts/os/notebook_list_libs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/notebook_list_libs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,15 @@
 #
 # ******************************************************************************
 
+import logging
 import os
 import sys
-import logging
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -40,11 +41,12 @@
                         filename=local_log_filepath)
 
     try:
-        logging.info('[GETTING ALL AVAILABLE PACKAGES]')
-        print('[GETTING ALL AVAILABLE PACKAGES]')
+        logging.info('[GETTING AVAILABLE PACKAGES]')
+        print('[GETTING AVAILABLE PACKAGES]')
         notebook_config = dict()
         try:
             notebook_config['notebook_name'] = os.environ['notebook_instance_name']
+            notebook_config['group_name'] = os.environ['libCacheKey']
             notebook_config['os_user'] = os.environ['conf_os_user']
             notebook_config['service_base_name'] = os.environ['conf_service_base_name'].lower()
             notebook_config['tag_name'] = notebook_config['service_base_name'] + '-tag'
@@ -55,11 +57,11 @@
             print('Error: {0}'.format(err))
             append_result("Failed to get parameter.", str(err))
             sys.exit(1)
-        params = "--os_user {} --instance_ip {} --keyfile '{}'" \
-            .format(notebook_config['os_user'], notebook_config['notebook_ip'], notebook_config['keyfile'])
+        params = "--os_user {} --instance_ip {} --keyfile '{}' --group {}" \
+            .format(notebook_config['os_user'], notebook_config['notebook_ip'], notebook_config['keyfile'], notebook_config['group_name'])
         try:
             # Run script to get available libs
-            local("~/scripts/{}.py {}".format('get_list_available_pkgs', params))
+            subprocess.run("~/scripts/{}.py {}".format('get_list_available_pkgs', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/os/notebook_reconfigure_dataengine_spark.py b/infrastructure-provisioning/src/general/scripts/os/notebook_reconfigure_dataengine_spark.py
index 9d9ac00..a342692 100644
--- a/infrastructure-provisioning/src/general/scripts/os/notebook_reconfigure_dataengine_spark.py
+++ b/infrastructure-provisioning/src/general/scripts/os/notebook_reconfigure_dataengine_spark.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,17 +22,12 @@
 # ******************************************************************************
 
 
-from fabric.api import *
 import argparse
-import os
-import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/general/scripts/os/notebook_reconfigure_spark.py b/infrastructure-provisioning/src/general/scripts/os/notebook_reconfigure_spark.py
index 8bc607c..596d4d8 100644
--- a/infrastructure-provisioning/src/general/scripts/os/notebook_reconfigure_spark.py
+++ b/infrastructure-provisioning/src/general/scripts/os/notebook_reconfigure_spark.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,16 @@
 #
 # ******************************************************************************
 
-import os
-import sys
 import json
 import logging
+import os
+import sys
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 if __name__ == "__main__":
     instance_class = 'notebook'
@@ -60,7 +61,7 @@
             .format(notebook_config['os_user'], notebook_config['notebook_ip'], notebook_config['keyfile'])
         try:
             # Run script to get available libs
-            local("~/scripts/{}.py {}".format('reconfigure_spark', params))
+            subprocess.run("~/scripts/{}.py {}".format('reconfigure_spark', params), shell=True, check=True)
         except:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/general/scripts/os/reconfigure_spark.py b/infrastructure-provisioning/src/general/scripts/os/reconfigure_spark.py
index 9be3147..dfa2157 100644
--- a/infrastructure-provisioning/src/general/scripts/os/reconfigure_spark.py
+++ b/infrastructure-provisioning/src/general/scripts/os/reconfigure_spark.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,12 @@
 #
 # ******************************************************************************
 
-import sys
 import argparse
-from dlab.notebook_lib import *
-from dlab.fab import *
-from dlab.actions_lib import *
-from fabric.api import *
-import json
 import os
-
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--os_user', type=str, default='')
@@ -42,9 +39,8 @@
 
 
 if __name__ == "__main__":
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = '{}@{}'.format(args.os_user, args.instance_ip)
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.instance_ip, args.os_user, args.keyfile)
 
     jars_dir = '/opt/jars/'
     templates_dir = '/root/templates/'
@@ -55,14 +51,14 @@
     if args.spark_type == 'local':
         configure_local_spark(jars_dir, templates_dir, memory_type)
     elif args.spark_type == 'dataengine':
-        if not exists('/usr/local/bin/notebook_reconfigure_dataengine_spark.py'):
-            put('/root/scripts/notebook_reconfigure_dataengine_spark.py',
+        if not exists(conn,'/usr/local/bin/notebook_reconfigure_dataengine_spark.py'):
+            conn.put('/root/scripts/notebook_reconfigure_dataengine_spark.py',
                 '/tmp/notebook_reconfigure_dataengine_spark.py')
-            sudo('mv /tmp/notebook_reconfigure_dataengine_spark.py '
+            conn.sudo('mv /tmp/notebook_reconfigure_dataengine_spark.py '
                  '/usr/local/bin/notebook_reconfigure_dataengine_spark.py')
-        sudo('mkdir -p /tmp/{}'.format(args.cluster_name))
-        put('{}notebook_spark-defaults_local.conf'.format(templates_dir),
-            '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name), use_sudo=True)
+        conn.sudo('mkdir -p /tmp/{}'.format(args.cluster_name))
+        conn.put('{}notebook_spark-defaults_local.conf'.format(templates_dir),
+            '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
         cluster_dir = '/opt/' + args.cluster_name + '/'
         if 'azure_datalake_enable' in os.environ:
             datalake_enabled = os.environ['azure_datalake_enable']
@@ -70,6 +66,7 @@
             datalake_enabled = 'false'
         if 'spark_configurations' not in os.environ:
             os.environ['spark_configurations'] = '[]'
-        sudo('/usr/bin/python /usr/local/bin/notebook_reconfigure_dataengine_spark.py --cluster_name {0} '
+        conn.sudo('/usr/bin/python3 /usr/local/bin/notebook_reconfigure_dataengine_spark.py --cluster_name {0} '
              '--jars_dir {1} --cluster_dir {2} --datalake_enabled {3} --spark_configurations "{4}"'.format(
               args.cluster_name, jars_dir, cluster_dir, datalake_enabled, os.environ['spark_configurations']))
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/scripts/os/rstudio_dataengine_create_configs.py b/infrastructure-provisioning/src/general/scripts/os/rstudio_dataengine_create_configs.py
index 2d8d524..c7e0017 100644
--- a/infrastructure-provisioning/src/general/scripts/os/rstudio_dataengine_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/rstudio_dataengine_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,19 +21,15 @@
 #
 # ******************************************************************************
 
-from botocore.client import Config
-from fabric.api import *
 import argparse
 import os
 import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -57,30 +53,30 @@
 def configure_rstudio():
     if not os.path.exists('/home/' + args.os_user + '/.ensure_dir/rstudio_dataengine_ensured'):
         try:
-            local('echo "export R_LIBS_USER=' + cluster_dir + 'spark/R/lib:" >> /home/' + args.os_user + '/.bashrc')
-            local("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local('echo \'SPARK_HOME="' + cluster_dir + 'spark/"\' >> /home/' + args.os_user + '/.Renviron')
-            local("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile")
-            local('echo \'master="' + args.spark_master + '" # Cluster - "' + args.cluster_name + '" \' >> /home/' +
-                  args.os_user + '/.Rprofile')
-            local('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user))
-            local('touch /home/' + args.os_user + '/.ensure_dir/rstudio_dataengine_ensured')
+            subprocess.run('echo "export R_LIBS_USER=' + cluster_dir + 'spark/R/lib:" >> /home/' + args.os_user + '/.bashrc', shell=True, check=True)
+            subprocess.run("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run('echo \'SPARK_HOME="' + cluster_dir + 'spark/"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile", shell=True, check=True)
+            subprocess.run('echo \'master="' + args.spark_master + '" # Cluster - "' + args.cluster_name + '" \' >> /home/' +
+                  args.os_user + '/.Rprofile', shell=True, check=True)
+            subprocess.run('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user), shell=True, check=True)
+            subprocess.run('touch /home/' + args.os_user + '/.ensure_dir/rstudio_dataengine_ensured', shell=True, check=True)
         except Exception as err:
             print('Error: {0}'.format(err))
             sys.exit(1)
     else:
         try:
-            local("sed -i '/R_LIBS_USER/ { s|=\(.*\)|=\\1" + cluster_dir + "spark/R/lib:| }' /home/" + args.os_user + "/.bashrc")
-            local("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local('echo \'SPARK_HOME="' + cluster_dir + 'spark/"\' >> /home/' + args.os_user + '/.Renviron')
-            local("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile")
-            local('echo \'master="' + args.spark_master + '" # Cluster - "' + args.cluster_name + '" \' >> /home/' +
-                  args.os_user + '/.Rprofile')
-            local('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user))
+            subprocess.run("sed -i '/R_LIBS_USER/ { s|=\(.*\)|=\\1" + cluster_dir + "spark/R/lib:| }' /home/" + args.os_user + "/.bashrc", shell=True, check=True)
+            subprocess.run("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run('echo \'SPARK_HOME="' + cluster_dir + 'spark/"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile", shell=True, check=True)
+            subprocess.run('echo \'master="' + args.spark_master + '" # Cluster - "' + args.cluster_name + '" \' >> /home/' +
+                  args.os_user + '/.Rprofile', shell=True, check=True)
+            subprocess.run('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user), shell=True, check=True)
         except Exception as err:
             print('Error: {0}'.format(err))
             sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/os/rstudio_install_dataengine_kernels.py b/infrastructure-provisioning/src/general/scripts/os/rstudio_install_dataengine_kernels.py
index ef071c3..112264f 100644
--- a/infrastructure-provisioning/src/general/scripts/os/rstudio_install_dataengine_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/os/rstudio_install_dataengine_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,11 +22,12 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-from fabric.contrib.files import exists
-from dlab.meta_lib import *
 import os
-from dlab.fab import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -44,39 +45,43 @@
 def configure_notebook(keyfile, hoststring):
     scripts_dir = '/root/scripts/'
     templates_dir = '/root/templates/'
-    run('mkdir -p /tmp/{}/'.format(args.cluster_name))
-    put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
+    conn.run('mkdir -p /tmp/{}/'.format(args.cluster_name))
+    conn.put(templates_dir + 'notebook_spark-defaults_local.conf',
+        '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
     spark_master_ip = args.spark_master.split('//')[1].split(':')[0]
     spark_memory = get_spark_memory(True, args.os_user, spark_master_ip, keyfile)
-    run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory, args.cluster_name))
-    if not exists('/usr/local/bin/rstudio_dataengine_create_configs.py'):
-        put(scripts_dir + 'rstudio_dataengine_create_configs.py', '/usr/local/bin/rstudio_dataengine_create_configs.py', use_sudo=True)
-        sudo('chmod 755 /usr/local/bin/rstudio_dataengine_create_configs.py')
-    if not exists('/usr/lib/python2.7/dlab/'):
-        sudo('mkdir -p /usr/lib/python2.7/dlab/')
-        put('/usr/lib/python2.7/dlab/*', '/usr/lib/python2.7/dlab/', use_sudo=True)
-        sudo('chmod a+x /usr/lib/python2.7/dlab/*')
-        if exists('/usr/lib64'):
-            sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+    conn.run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory,
+                                                                                                  args.cluster_name))
+    if not exists(conn,'/usr/local/bin/rstudio_dataengine_create_configs.py'):
+        conn.put(scripts_dir + 'rstudio_dataengine_create_configs.py', '/tmp/rstudio_dataengine_create_configs.py')
+        conn.sudo('cp -f /tmp/rstudio_dataengine_create_configs.py /usr/local/bin/rstudio_dataengine_create_configs.py')
+        conn.sudo('chmod 755 /usr/local/bin/rstudio_dataengine_create_configs.py')
+    if not exists(conn,'/usr/lib/python3.8/datalab/'):
+        conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+        conn.local('cd  /usr/lib/python3.8/datalab/; tar -zcvf /tmp/datalab.tar.gz *')
+        conn.put('/tmp/datalab.tar.gz', '/tmp/datalab.tar.gz')
+        conn.sudo('tar -zxvf /tmp/datalab.tar.gz -C /usr/lib/python3.8/datalab/')
+        conn.sudo('chmod a+x /usr/lib/python3.8/datalab/*')
+        if exists(conn, '/usr/lib64'):
+            conn.sudo('mkdir -p /usr/lib64/python3.8')
+            conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
 
 def create_inactivity_log(master_ip, hoststring):
     reworked_ip = master_ip.replace('.', '-')
-    sudo("date +%s > /opt/inactivity/{}_inactivity".format(reworked_ip))
+    conn.sudo('''bash -l -c "date +%s > /opt/inactivity/{}_inactivity" '''.format(reworked_ip))
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     try:
         region = os.environ['aws_region']
     except:
         region = ''
     if 'spark_configurations' not in os.environ:
         os.environ['spark_configurations'] = '[]'
-    configure_notebook(args.keyfile, env.host_string)
-    create_inactivity_log(args.spark_master_ip, env.host_string)
-    sudo('/usr/bin/python /usr/local/bin/rstudio_dataengine_create_configs.py '
+    configure_notebook(args.keyfile, args.notebook_ip)
+    create_inactivity_log(args.spark_master_ip, args.notebook_ip)
+    conn.sudo('/usr/bin/python3 /usr/local/bin/rstudio_dataengine_create_configs.py '
          '--cluster_name {} --spark_version {} --hadoop_version {} --os_user {} --spark_master {} --region {} '
          '--datalake_enabled {} --spark_configurations "{}"'.
          format(args.cluster_name, args.spark_version, args.hadoop_version, args.os_user, args.spark_master, region,
diff --git a/infrastructure-provisioning/src/general/scripts/os/superset_start.py b/infrastructure-provisioning/src/general/scripts/os/superset_start.py
index 33bbc9c..9f976ae 100644
--- a/infrastructure-provisioning/src/general/scripts/os/superset_start.py
+++ b/infrastructure-provisioning/src/general/scripts/os/superset_start.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,11 +21,11 @@
 #
 # ******************************************************************************
 
+import argparse
 import sys
-import os
-from dlab.notebook_lib import *
-from dlab.fab import *
-from fabric.api import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -37,21 +37,19 @@
 
 def start_superset(superset_dir):
     try:
-        with cd('{}'.format(superset_dir)):
-            sudo('docker-compose run --rm superset ./docker-init.sh')
-        sudo('cp /opt/dlab/templates/superset-notebook.service /tmp/')
-        sudo('sed -i \'s/OS_USER/{}/g\' /tmp/superset-notebook.service'.format(args.os_user))
-        sudo('cp /tmp/superset-notebook.service /etc/systemd/system/')
-        sudo('systemctl daemon-reload')
-        sudo('systemctl enable superset-notebook')
-        sudo('systemctl start superset-notebook')
+        conn.sudo('''bash -c 'cd {} && docker-compose run --rm superset ./docker-init.sh' '''.format(superset_dir))
+        conn.sudo('cp /opt/datalab/templates/superset-notebook.service /tmp/')
+        conn.sudo('sed -i \'s/OS_USER/{}/g\' /tmp/superset-notebook.service'.format(args.os_user))
+        conn.sudo('cp /tmp/superset-notebook.service /etc/systemd/system/')
+        conn.sudo('systemctl daemon-reload')
+        conn.sudo('systemctl enable superset-notebook')
+        conn.sudo('systemctl start superset-notebook')
     except: sys.exit(1)
 
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
     print("Starting Superset")
     try:
         start_superset(superset_dir)
@@ -59,3 +57,4 @@
         print('Error: {0}'.format(err))
         sys.exit(1)
 
+    conn.close()
diff --git a/infrastructure-provisioning/src/general/scripts/os/tensor-rstudio_dataengine_create_configs.py b/infrastructure-provisioning/src/general/scripts/os/tensor-rstudio_dataengine_create_configs.py
index 48ec248..c8965b6 100644
--- a/infrastructure-provisioning/src/general/scripts/os/tensor-rstudio_dataengine_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/tensor-rstudio_dataengine_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,19 +21,14 @@
 #
 # ******************************************************************************
 
-from botocore.client import Config
-from fabric.api import *
 import argparse
 import os
 import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -57,30 +52,30 @@
 def configure_rstudio():
     if not os.path.exists('/home/' + args.os_user + '/.ensure_dir/rstudio_dataengine_ensured'):
         try:
-            local('echo "export R_LIBS_USER=' + cluster_dir + 'spark/R/lib:" >> /home/' + args.os_user + '/.bashrc')
-            local("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local('echo \'SPARK_HOME="' + cluster_dir + 'spark/"\' >> /home/' + args.os_user + '/.Renviron')
-            local("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile")
-            local('echo \'master="' + args.spark_master + '" # Cluster - "' + args.cluster_name + '" \' >> /home/' +
-                  args.os_user + '/.Rprofile')
-            local('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user))
-            local('touch /home/' + args.os_user + '/.ensure_dir/rstudio_dataengine_ensured')
+            subprocess.run('echo "export R_LIBS_USER=' + cluster_dir + 'spark/R/lib:" >> /home/' + args.os_user + '/.bashrc', shell=True, check=True)
+            subprocess.run("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run('echo \'SPARK_HOME="' + cluster_dir + 'spark/"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile", shell=True, check=True)
+            subprocess.run('echo \'master="' + args.spark_master + '" # Cluster - "' + args.cluster_name + '" \' >> /home/' +
+                  args.os_user + '/.Rprofile', shell=True, check=True)
+            subprocess.run('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user), shell=True, check=True)
+            subprocess.run('touch /home/' + args.os_user + '/.ensure_dir/rstudio_dataengine_ensured', shell=True, check=True)
         except Exception as err:
             print('Error: {0}'.format(err))
             sys.exit(1)
     else:
         try:
-            local("sed -i '/R_LIBS_USER/ { s|=\(.*\)|=\\1" + cluster_dir + "spark/R/lib:| }' /home/" + args.os_user + "/.bashrc")
-            local("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron")
-            local('echo \'SPARK_HOME="' + cluster_dir + 'spark/"\' >> /home/' + args.os_user + '/.Renviron')
-            local("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile")
-            local('echo \'master="' + args.spark_master + '" # Cluster - "' + args.cluster_name + '" \' >> /home/' +
-                  args.os_user + '/.Rprofile')
-            local('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user))
+            subprocess.run("sed -i '/R_LIBS_USER/ { s|=\(.*\)|=\\1" + cluster_dir + "spark/R/lib:| }' /home/" + args.os_user + "/.bashrc", shell=True, check=True)
+            subprocess.run("sed -i 's/^SPARK_HOME/#SPARK_HOME/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^YARN_CONF_DIR/#YARN_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run("sed -i 's/^HADOOP_CONF_DIR/#HADOOP_CONF_DIR/' /home/" + args.os_user + "/.Renviron", shell=True, check=True)
+            subprocess.run('echo \'SPARK_HOME="' + cluster_dir + 'spark/"\' >> /home/' + args.os_user + '/.Renviron', shell=True, check=True)
+            subprocess.run("sed -i 's/^master/#master/' /home/" + args.os_user + "/.Rprofile", shell=True, check=True)
+            subprocess.run('echo \'master="' + args.spark_master + '" # Cluster - "' + args.cluster_name + '" \' >> /home/' +
+                  args.os_user + '/.Rprofile', shell=True, check=True)
+            subprocess.run('''R -e "source('/home/{}/.Rprofile')"'''.format(args.os_user), shell=True, check=True)
         except Exception as err:
             print('Error: {0}'.format(err))
             sys.exit(1)
diff --git a/infrastructure-provisioning/src/general/scripts/os/tensor-rstudio_install_dataengine_kernels.py b/infrastructure-provisioning/src/general/scripts/os/tensor-rstudio_install_dataengine_kernels.py
index dd466c5..34ef317 100644
--- a/infrastructure-provisioning/src/general/scripts/os/tensor-rstudio_install_dataengine_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/os/tensor-rstudio_install_dataengine_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,11 +22,12 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-from fabric.contrib.files import exists
-from dlab.meta_lib import *
 import os
-from dlab.fab import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -44,39 +45,45 @@
 def configure_notebook(keyfile, hoststring):
     scripts_dir = '/root/scripts/'
     templates_dir = '/root/templates/'
-    run('mkdir -p /tmp/{}/'.format(args.cluster_name))
-    put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
+    conn.run('mkdir -p /tmp/{}/'.format(args.cluster_name))
+    conn.put(templates_dir + 'notebook_spark-defaults_local.conf',
+        '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
     spark_master_ip = args.spark_master.split('//')[1].split(':')[0]
     spark_memory = get_spark_memory(True, args.os_user, spark_master_ip, keyfile)
-    run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory, args.cluster_name))
-    if not exists('/usr/local/bin/tensor-rstudio_dataengine_create_configs.py'):
-        put(scripts_dir + 'tensor-rstudio_dataengine_create_configs.py', '/usr/local/bin/tensor-rstudio_dataengine_create_configs.py', use_sudo=True)
-        sudo('chmod 755 /usr/local/bin/tensor-rstudio_dataengine_create_configs.py')
-    if not exists('/usr/lib/python2.7/dlab/'):
-        sudo('mkdir -p /usr/lib/python2.7/dlab/')
-        put('/usr/lib/python2.7/dlab/*', '/usr/lib/python2.7/dlab/', use_sudo=True)
-        sudo('chmod a+x /usr/lib/python2.7/dlab/*')
-        if exists('/usr/lib64'):
-            sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+    conn.run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory,
+                                                                                                  args.cluster_name))
+    if not exists(conn,'/usr/local/bin/tensor-rstudio_dataengine_create_configs.py'):
+        conn.put(scripts_dir + 'tensor-rstudio_dataengine_create_configs.py',
+            '/tmp/tensor-rstudio_dataengine_create_configs.py')
+        conn.sudo('cp /tmp/tensor-rstudio_dataengine_create_configs.py '
+                  '/usr/local/bin/tensor-rstudio_dataengine_create_configs.py')
+        conn.sudo('chmod 755 /usr/local/bin/tensor-rstudio_dataengine_create_configs.py')
+    if not exists(conn,'/usr/lib/python3.8/datalab/'):
+        conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+        conn.local('cd  /usr/lib/python3.8/datalab/; tar -zcvf /tmp/datalab.tar.gz *')
+        conn.put('/tmp/datalab.tar.gz', '/tmp/datalab.tar.gz')
+        conn.sudo('tar -zxvf /tmp/datalab.tar.gz -C /usr/lib/python3.8/datalab/')
+        conn.sudo('chmod a+x /usr/lib/python3.8/datalab/*')
+        if exists(conn, '/usr/lib64'):
+            conn.sudo('mkdir -p /usr/lib64/python3.8')
+            conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
 
 def create_inactivity_log(master_ip, hoststring):
     reworked_ip = master_ip.replace('.', '-')
-    sudo("date +%s > /opt/inactivity/{}_inactivity".format(reworked_ip))
+    conn.sudo('''bash -l -c "date +%s > /opt/inactivity/{}_inactivity" '''.format(reworked_ip))
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     try:
         region = os.environ['aws_region']
     except:
         region = ''
     if 'spark_configurations' not in os.environ:
         os.environ['spark_configurations'] = '[]'
-    configure_notebook(args.keyfile, env.host_string)
-    create_inactivity_log(args.spark_master_ip, env.host_string)
-    sudo('/usr/bin/python /usr/local/bin/tensor-rstudio_dataengine_create_configs.py '
+    configure_notebook(args.keyfile, args.notebook_ip)
+    create_inactivity_log(args.spark_master_ip, args.notebook_ip)
+    conn.sudo('/usr/bin/python3 /usr/local/bin/tensor-rstudio_dataengine_create_configs.py '
          '--cluster_name {} --spark_version {} --hadoop_version {} --os_user {} --spark_master {} --region {} '
          '--datalake_enabled {} --spark_configurations "{}"'.
          format(args.cluster_name, args.spark_version, args.hadoop_version, args.os_user, args.spark_master, region,
diff --git a/infrastructure-provisioning/src/general/scripts/os/tensor_dataengine_create_configs.py b/infrastructure-provisioning/src/general/scripts/os/tensor_dataengine_create_configs.py
index b26a713..7e77efe 100644
--- a/infrastructure-provisioning/src/general/scripts/os/tensor_dataengine_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/tensor_dataengine_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,18 +21,13 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
 import argparse
-import os
 import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -52,14 +47,14 @@
 
 spark_version = args.spark_version
 hadoop_version = args.hadoop_version
-scala_link = "http://www.scala-lang.org/files/archive/"
+scala_link = "https://www.scala-lang.org/files/archive/"
 spark_link = "https://archive.apache.org/dist/spark/spark-" + spark_version + "/spark-" + spark_version + \
              "-bin-hadoop" + hadoop_version + ".tgz"
 
 
 def pyspark_kernel(args):
     spark_path = '/opt/' + args.cluster_name + '/spark/'
-    local('mkdir -p ' + kernels_dir + 'pyspark_' + args.cluster_name + '/')
+    subprocess.run('mkdir -p ' + kernels_dir + 'pyspark_' + args.cluster_name + '/', shell=True, check=True)
     kernel_path = kernels_dir + "pyspark_" + args.cluster_name + "/kernel.json"
     template_file = "/tmp/{}/pyspark_dataengine_template.json".format(args.cluster_name)
     with open(template_file, 'r') as f:
@@ -67,19 +62,19 @@
     text = text.replace('CLUSTER_NAME', args.cluster_name)
     text = text.replace('SPARK_VERSION', 'Spark-' + spark_version)
     text = text.replace('SPARK_PATH', spark_path)
-    text = text.replace('PYTHON_SHORT_VERSION', '2.7')
-    text = text.replace('PYTHON_FULL_VERSION', '2.7')
+    text = text.replace('PYTHON_SHORT_VERSION', '3.8')
+    text = text.replace('PYTHON_FULL_VERSION', '3.8')
     text = text.replace('MASTER', args.spark_master)
-    text = text.replace('PYTHON_PATH', '/usr/bin/python2.7')
+    text = text.replace('PYTHON_PATH', '/usr/bin/python3.8')
     with open(kernel_path, 'w') as f:
         f.write(text)
-    local('touch /tmp/{}/kernel_var.json'.format(args.cluster_name))
-    local(
-        "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json".
-        format(args.cluster_name, kernel_path, args.os_user))
-    local('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path)
+    subprocess.run('touch /tmp/{}/kernel_var.json'.format(args.cluster_name), shell=True, check=True)
+    subprocess.run(
+        '''bash -l -c "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json" '''.
+        format(args.cluster_name, kernel_path, args.os_user), shell=True, check=True)
+    subprocess.run('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path, shell=True, check=True)
 
-    local('mkdir -p ' + kernels_dir + 'py3spark_' + args.cluster_name + '/')
+    subprocess.run('mkdir -p ' + kernels_dir + 'py3spark_' + args.cluster_name + '/', shell=True, check=True)
     kernel_path = kernels_dir + "py3spark_" + args.cluster_name + "/kernel.json"
     template_file = "/tmp/{}/pyspark_dataengine_template.json".format(args.cluster_name)
     with open(template_file, 'r') as f:
@@ -88,26 +83,57 @@
     text = text.replace('SPARK_VERSION', 'Spark-' + spark_version)
     text = text.replace('SPARK_PATH', spark_path)
     text = text.replace('MASTER', args.spark_master)
-    text = text.replace('PYTHON_SHORT_VERSION', '3.5')
-    text = text.replace('PYTHON_FULL_VERSION', '3.5')
-    text = text.replace('PYTHON_PATH', '/usr/bin/python3.5')
+    text = text.replace('PYTHON_SHORT_VERSION', '3.8')
+    text = text.replace('PYTHON_FULL_VERSION', '3.8')
+    text = text.replace('PYTHON_PATH', '/usr/bin/python3.8')
     with open(kernel_path, 'w') as f:
         f.write(text)
-    local('touch /tmp/{}/kernel_var.json'.format(args.cluster_name))
-    local(
-        "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json".
-        format(args.cluster_name, kernel_path, args.os_user))
-    local('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path)
+    subprocess.run('touch /tmp/{}/kernel_var.json'.format(args.cluster_name), shell=True, check=True)
+    subprocess.run(
+        '''bash -l -c "PYJ=`find /opt/{0}/spark/ -name '*py4j*.zip' | tr '\\n' ':' | sed 's|:$||g'`; cat {1} | sed 's|PY4J|'$PYJ'|g' | sed \'/PYTHONPATH\"\:/s|\(.*\)\"|\\1/home/{2}/caffe/python:/home/{2}/pytorch/build:\"|\' > /tmp/{0}/kernel_var.json" '''.
+        format(args.cluster_name, kernel_path, args.os_user), shell=True, check=True)
+    subprocess.run('sudo mv /tmp/{}/kernel_var.json '.format(args.cluster_name) + kernel_path, shell=True, check=True)
 
+def install_sparkamagic_kernels(args):
+    try:
+        subprocess.run('sudo jupyter nbextension enable --py --sys-prefix widgetsnbextension', shell=True, check=True)
+        sparkmagic_dir = subprocess.run("sudo pip3 show sparkmagic | grep 'Location: ' | awk '{print $2}'", capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/sparkkernel --user'.format(sparkmagic_dir), shell=True, check=True)
+        subprocess.run('sudo jupyter-kernelspec install {}/sparkmagic/kernels/pysparkkernel --user'.format(sparkmagic_dir), shell=True, check=True)
+
+        pyspark_kernel_name = 'PySpark (Python-{2} / Spark-{0} ) [{1}]'.format(args.spark_version,
+                                                                         args.cluster_name, os.environ['notebook_python_venv_version'][:3])
+        subprocess.run('sed -i \'s|PySpark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/pysparkkernel/kernel.json'.format(
+            pyspark_kernel_name, args.os_user), shell=True, check=True)
+        scala_version = subprocess.run('spark-submit --version 2>&1 | grep -o -P "Scala version \K.{0,7}"', capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
+        spark_kernel_name = 'Spark (Scala-{0} / Spark-{1} ) [{2}]'.format(scala_version, args.spark_version,
+                                                                         args.cluster_name)
+        subprocess.run('sed -i \'s|Spark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkkernel/kernel.json'.format(
+            spark_kernel_name, args.os_user), shell=True, check=True)
+
+        subprocess.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/pysparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/pysparkkernel_{1}'.format(args.os_user, args.cluster_name), shell=True, check=True)
+        subprocess.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/sparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/sparkkernel_{1}'.format(args.os_user, args.cluster_name), shell=True, check=True)
+
+        subprocess.run('mkdir -p /home/' + args.os_user + '/.sparkmagic', shell=True, check=True)
+        subprocess.run('cp -f /tmp/sparkmagic_config_template.json /home/' + args.os_user + '/.sparkmagic/config.json', shell=True, check=True)
+        spark_master_ip = args.spark_master.split('//')[1].split(':')[0]
+        subprocess.run('sed -i \'s|LIVY_HOST|{0}|g\' /home/{1}/.sparkmagic/config.json'.format(
+                spark_master_ip, args.os_user), shell=True, check=True)
+        subprocess.run('sudo chown -R {0}:{0} /home/{0}/.sparkmagic/'.format(args.os_user), shell=True, check=True)
+    except:
+        sys.exit(1)
 
 if __name__ == "__main__":
     if args.dry_run == 'true':
         parser.print_help()
     else:
-        dataengine_dir_prepare('/opt/{}/'.format(args.cluster_name))
-        install_dataengine_spark(args.cluster_name, spark_link, spark_version, hadoop_version, cluster_dir, args.os_user,
-                                 args.datalake_enabled)
-        ensure_dataengine_tensorflow_jars(local_jars_dir)
-        configure_dataengine_spark(args.cluster_name, local_jars_dir, cluster_dir, args.datalake_enabled,
-                                   args.spark_configurations)
-        pyspark_kernel(args)
+        install_sparkamagic_kernels(args)
+        #dataengine_dir_prepare('/opt/{}/'.format(args.cluster_name))
+        #install_dataengine_spark(args.cluster_name, spark_link, spark_version, hadoop_version, cluster_dir, args.os_user,
+        #                         args.datalake_enabled)
+        #ensure_dataengine_tensorflow_jars(local_jars_dir)
+        #configure_dataengine_spark(args.cluster_name, local_jars_dir, cluster_dir, args.datalake_enabled,
+        #                           args.spark_configurations)
+        #pyspark_kernel(args)
diff --git a/infrastructure-provisioning/src/general/scripts/os/tensor_install_dataengine_kernels.py b/infrastructure-provisioning/src/general/scripts/os/tensor_install_dataengine_kernels.py
index 40024ac..e6d27aa 100644
--- a/infrastructure-provisioning/src/general/scripts/os/tensor_install_dataengine_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/os/tensor_install_dataengine_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,11 +22,12 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-from fabric.contrib.files import exists
-from dlab.meta_lib import *
 import os
-from dlab.fab import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -44,41 +45,82 @@
 def configure_notebook(keyfile, hoststring):
     templates_dir = '/root/templates/'
     scripts_dir = '/root/scripts/'
-    run('mkdir -p /tmp/{}/'.format(args.cluster_name))
-    put(templates_dir + 'pyspark_dataengine_template.json', '/tmp/{}/pyspark_dataengine_template.json'.format(args.cluster_name))
-    put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
+    conn.run('mkdir -p /tmp/{}/'.format(args.cluster_name))
+    conn.put(templates_dir + 'sparkmagic_config_template.json', '/tmp/sparkmagic_config_template.json')
+    # conn.put(templates_dir + 'pyspark_dataengine_template.json', '/tmp/{}/pyspark_dataengine_template.json'.format(args.cluster_name))
+    # conn.put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
     spark_master_ip = args.spark_master.split('//')[1].split(':')[0]
-    spark_memory = get_spark_memory(True, args.os_user, spark_master_ip, keyfile)
-    run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory, args.cluster_name))
-    if not exists('/usr/local/bin/tensor_dataengine_create_configs.py'):
-        put(scripts_dir + 'tensor_dataengine_create_configs.py', '/usr/local/bin/tensor_dataengine_create_configs.py', use_sudo=True)
-        sudo('chmod 755 /usr/local/bin/tensor_dataengine_create_configs.py')
-    if not exists('/usr/lib/python2.7/dlab/'):
-        sudo('mkdir -p /usr/lib/python2.7/dlab/')
-        put('/usr/lib/python2.7/dlab/*', '/usr/lib/python2.7/dlab/', use_sudo=True)
-        sudo('chmod a+x /usr/lib/python2.7/dlab/*')
-        if exists('/usr/lib64'):
-            sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+    # spark_memory = get_spark_memory(True, args.os_user, spark_master_ip, keyfile)
+    # conn.run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory, args.cluster_name))
+    if not exists(conn,'/usr/local/bin/tensor_dataengine_create_configs.py'):
+        conn.put(scripts_dir + 'tensor_dataengine_create_configs.py', '/tmp/tensor_dataengine_create_configs.py')
+        conn.sudo('cp -f /tmp/tensor_dataengine_create_configs.py /usr/local/bin/tensor_dataengine_create_configs.py')
+        conn.sudo('chmod 755 /usr/local/bin/tensor_dataengine_create_configs.py')
+    if not exists(conn,'/usr/lib/python3.8/datalab/'):
+        conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+        conn.local('cd  /usr/lib/python3.8/datalab/; tar -zcvf /tmp/datalab.tar.gz *')
+        conn.put('/tmp/datalab.tar.gz', '/tmp/datalab.tar.gz')
+        conn.sudo('tar -zxvf /tmp/datalab.tar.gz -C /usr/lib/python3.8/datalab/')
+        conn.sudo('chmod a+x /usr/lib/python3.8/datalab/*')
+        if exists(conn, '/usr/lib64'):
+            conn.sudo('mkdir -p /usr/lib64/python3.8')
+            conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
+
+def install_sparkamagic_kernels(args):
+    try:
+        datalab.fab.conn.sudo('sudo jupyter nbextension enable --py --sys-prefix widgetsnbextension')
+        sparkmagic_dir = datalab.fab.conn.sudo(''' bash -l -c 'pip3 show sparkmagic | grep "Location: "' ''').stdout.rstrip("\n\r").split(' ')[1]
+        datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/sparkkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/pysparkkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        #datalab.fab.conn.sudo('jupyter-kernelspec install {}/sparkmagic/kernels/sparkrkernel --prefix=/home/{}/.local/'.format(sparkmagic_dir, args.os_user))
+        pyspark_kernel_name = 'PySpark (Python-{2} / Spark-{0} ) [{1}]'.format(args.spark_version,
+                                                                         args.cluster_name, os.environ['notebook_python_venv_version'][:3])
+        datalab.fab.conn.sudo('sed -i \'s|PySpark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/pysparkkernel/kernel.json'.format(
+            pyspark_kernel_name, args.os_user))
+        scala_version = datalab.fab.conn.sudo('''bash -l -c 'spark-submit --version 2>&1 | grep -o -P "Scala version \K.{0,7}"' ''').stdout.rstrip("\n\r")
+        spark_kernel_name = 'Spark (Scala-{0} / Spark-{1} ) [{2}]'.format(scala_version, args.spark_version,
+                                                                         args.cluster_name)
+        datalab.fab.conn.sudo('sed -i \'s|Spark|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkkernel/kernel.json'.format(
+            spark_kernel_name, args.os_user))
+        #r_version = datalab.fab.conn.sudo(''' bash -l -c 'R --version | grep -o -P "R version \K.{0,5}"' ''').stdout.rstrip("\n\r")
+        #sparkr_kernel_name = 'SparkR (R-{0} / Spark-{1} ) [{2}]'.format(r_version, args.spark_version,
+        #                                                                    args.cluster_name)
+        #datalab.fab.conn.sudo('sed -i \'s|SparkR|{0}|g\' /home/{1}/.local/share/jupyter/kernels/sparkrkernel/kernel.json'.format(
+        #    sparkr_kernel_name, args.os_user))
+        datalab.fab.conn.sudo('sudo mv -f /home/{0}/.local/share/jupyter/kernels/pysparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/pysparkkernel_{1}'.format(args.os_user, args.cluster_name))
+        datalab.fab.conn.sudo('sudo mv -f /home/{0}/.local/share/jupyter/kernels/sparkkernel '
+              '/home/{0}/.local/share/jupyter/kernels/sparkkernel_{1}'.format(args.os_user, args.cluster_name))
+        #datalab.fab.conn.run('sudo mv -f /home/{0}/.local/share/jupyter/kernels/sparkrkernel '
+        #      '/home/{0}/.local/share/jupyter/kernels/sparkrkernel_{1}'.format(args.os_user, args.cluster_name))
+        datalab.fab.conn.sudo('mkdir -p /home/' + args.os_user + '/.sparkmagic')
+        datalab.fab.conn.sudo('cp -f /tmp/sparkmagic_config_template.json /home/' + args.os_user + '/.sparkmagic/config.json')
+        spark_master_ip = args.spark_master.split('//')[1].split(':')[0]
+        datalab.fab.conn.sudo('sed -i \'s|LIVY_HOST|{0}|g\' /home/{1}/.sparkmagic/config.json'.format(
+                spark_master_ip, args.os_user))
+        datalab.fab.conn.sudo('sudo chown -R {0}:{0} /home/{0}/.sparkmagic/'.format(args.os_user))
+    except Exception as err:
+        print(err)
+        sys.exit(1)
 
 def create_inactivity_log(master_ip, hoststring):
     reworked_ip = master_ip.replace('.', '-')
-    sudo("date +%s > /opt/inactivity/{}_inactivity".format(reworked_ip))
+    conn.sudo('''bash -l -c "date +%s > /opt/inactivity/{}_inactivity" '''.format(reworked_ip))
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     try:
         region = os.environ['aws_region']
     except:
         region = ''
     if 'spark_configurations' not in os.environ:
         os.environ['spark_configurations'] = '[]'
-    configure_notebook(args.keyfile, env.host_string)
-    create_inactivity_log(args.spark_master_ip, env.host_string)
-    sudo('/usr/bin/python /usr/local/bin/tensor_dataengine_create_configs.py '
-         '--cluster_name {} --spark_version {} --hadoop_version {} --os_user {} --spark_master {} --region {} '
-         '--datalake_enabled {} --spark_configurations "{}"'.
-         format(args.cluster_name, args.spark_version, args.hadoop_version, args.os_user, args.spark_master, region,
-                args.datalake_enabled, os.environ['spark_configurations']))
+    configure_notebook(args.keyfile, args.notebook_ip)
+    install_sparkamagic_kernels(args)
+    create_inactivity_log(args.spark_master_ip, args.notebook_ip)
+    #conn.sudo('/usr/bin/python3 /usr/local/bin/tensor_dataengine_create_configs.py '
+    #     '--cluster_name {} --spark_version {} --hadoop_version {} --os_user {} --spark_master {} --region {} '
+    #     '--datalake_enabled {} --spark_configurations "{}"'.
+    #     format(args.cluster_name, args.spark_version, args.hadoop_version, args.os_user, args.spark_master, region,
+    #            args.datalake_enabled, os.environ['spark_configurations']))
diff --git a/infrastructure-provisioning/src/general/scripts/os/update_inactivity_on_start.py b/infrastructure-provisioning/src/general/scripts/os/update_inactivity_on_start.py
index 6d496c7..6a02f2d 100644
--- a/infrastructure-provisioning/src/general/scripts/os/update_inactivity_on_start.py
+++ b/infrastructure-provisioning/src/general/scripts/os/update_inactivity_on_start.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,11 +22,10 @@
 # ******************************************************************************
 
 import argparse
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from fabric.api import *
-
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--keyfile', type=str, default='')
@@ -37,15 +36,14 @@
 
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env['connection_attempts'] = 100
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
 
     if args.cluster_ip == "none":
         kernel = 'local'
     else:
         kernel = args.cluster_ip.replace('.', '-')
 
-    sudo("date +%s > /opt/inactivity/{}_inactivity".format(kernel))
+    conn.sudo('''bash -c -l "date +%s > /opt/inactivity/{}_inactivity" '''.format(kernel))
+
+    conn.close()
diff --git a/infrastructure-provisioning/src/general/scripts/os/zeppelin_dataengine_create_configs.py b/infrastructure-provisioning/src/general/scripts/os/zeppelin_dataengine_create_configs.py
index 7e7cfc2..7f424eb 100644
--- a/infrastructure-provisioning/src/general/scripts/os/zeppelin_dataengine_create_configs.py
+++ b/infrastructure-provisioning/src/general/scripts/os/zeppelin_dataengine_create_configs.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,19 +21,15 @@
 #
 # ******************************************************************************
 
-from botocore.client import Config
-from fabric.api import *
 import argparse
 import os
 import sys
-import time
-from fabric.api import lcd
-from fabric.contrib.files import exists
-from fabvenv import virtualenv
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
-from dlab.common_lib import *
+import subprocess
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -66,38 +62,38 @@
         default_port = 8998
         livy_port = ''
         livy_path = '/opt/' + cluster_name + '/livy/'
-        local('echo \"Configuring Data Engine path for Zeppelin\"')
-        local('sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/' + cluster_name +
-              '\/spark/\" /opt/zeppelin/conf/zeppelin-env.sh')
-        local('sudo chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin/')
-        local('sudo systemctl daemon-reload')
-        local('sudo service zeppelin-notebook stop')
-        local('sudo service zeppelin-notebook start')
+        subprocess.run('echo \"Configuring Data Engine path for Zeppelin\"', shell=True, check=True)
+        subprocess.run('sed -i \"s/^export SPARK_HOME.*/export SPARK_HOME=\/opt\/' + cluster_name +
+              '\/spark/\" /opt/zeppelin/conf/zeppelin-env.sh', shell=True, check=True)
+        subprocess.run('sudo chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin/', shell=True, check=True)
+        subprocess.run('sudo systemctl daemon-reload', shell=True, check=True)
+        subprocess.run('sudo service zeppelin-notebook stop', shell=True, check=True)
+        subprocess.run('sudo service zeppelin-notebook start', shell=True, check=True)
         while not zeppelin_restarted:
-            local('sleep 5')
-            result = local('sudo bash -c "nmap -p 8080 localhost | grep closed > /dev/null" ; echo $?', capture=True)
+            subprocess.run('sleep 5', shell=True, check=True)
+            result = subprocess.run('sudo bash -c "nmap -p 8080 localhost | grep closed > /dev/null" ; echo $?', capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
             result = result[:1]
             if result == '1':
                 zeppelin_restarted = True
-        local('sleep 5')
-        local('echo \"Configuring Data Engine spark interpreter for Zeppelin\"')
+        subprocess.run('sleep 5', shell=True, check=True)
+        subprocess.run('echo \"Configuring Data Engine spark interpreter for Zeppelin\"', shell=True, check=True)
         if multiple_clusters == 'true':
             while not port_number_found:
-                port_free = local('sudo bash -c "nmap -p ' + str(default_port) +
-                                  ' localhost | grep closed > /dev/null" ; echo $?', capture=True)
+                port_free = subprocess.run('sudo bash -c "nmap -p ' + str(default_port) +
+                                  ' localhost | grep closed > /dev/null" ; echo $?', capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r")
                 port_free = port_free[:1]
                 if port_free == '0':
                     livy_port = default_port
                     port_number_found = True
                 else:
                     default_port += 1
-            local('sudo echo "livy.server.port = ' + str(livy_port) + '" >> ' + livy_path + 'conf/livy.conf')
-            local('sudo echo "livy.spark.master = ' + spark_master + '" >> ' + livy_path + 'conf/livy.conf')
+            subprocess.run('sudo echo "livy.server.port = ' + str(livy_port) + '" >> ' + livy_path + 'conf/livy.conf', shell=True, check=True)
+            subprocess.run('sudo echo "livy.spark.master = ' + spark_master + '" >> ' + livy_path + 'conf/livy.conf', shell=True, check=True)
             if os.path.exists(livy_path + 'conf/spark-blacklist.conf'):
-                local('sudo sed -i "s/^/#/g" ' + livy_path + 'conf/spark-blacklist.conf')
-            local(''' sudo echo "export SPARK_HOME=''' + cluster_dir + '''spark/" >> ''' + livy_path + '''conf/livy-env.sh''')
-            local(''' sudo echo "export PYSPARK3_PYTHON=python3.5" >> ''' +
-                  livy_path + '''conf/livy-env.sh''')
+                subprocess.run('sudo sed -i "s/^/#/g" ' + livy_path + 'conf/spark-blacklist.conf', shell=True, check=True)
+            subprocess.run(''' sudo echo "export SPARK_HOME=''' + cluster_dir + '''spark/" >> ''' + livy_path + '''conf/livy-env.sh''', shell=True, check=True)
+            subprocess.run(''' sudo echo "export PYSPARK3_PYTHON=python3.8" >> ''' +
+                  livy_path + '''conf/livy-env.sh''', shell=True, check=True)
             template_file = "/tmp/{}/dataengine_interpreter.json".format(args.cluster_name)
             fr = open(template_file, 'r+')
             text = fr.read()
@@ -110,24 +106,24 @@
             fw.close()
             for _ in range(5):
                 try:
-                    local("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
-                          "@/tmp/{}/dataengine_interpreter.json http://localhost:8080/api/interpreter/setting".format(args.cluster_name))
+                    subprocess.run("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
+                          "@/tmp/{}/dataengine_interpreter.json http://localhost:8080/api/interpreter/setting".format(args.cluster_name), shell=True, check=True)
                     break
                 except:
-                    local('sleep 5')
-            local('sudo cp /opt/livy-server-cluster.service /etc/systemd/system/livy-server-' + str(livy_port) +
-                  '.service')
-            local("sudo sed -i 's|OS_USER|" + os_user + "|' /etc/systemd/system/livy-server-" + str(livy_port) +
-                  '.service')
-            local("sudo sed -i 's|LIVY_PATH|" + livy_path + "|' /etc/systemd/system/livy-server-" + str(livy_port)
-                  + '.service')
-            local('sudo chmod 644 /etc/systemd/system/livy-server-' + str(livy_port) + '.service')
-            local("sudo systemctl daemon-reload")
-            local("sudo systemctl enable livy-server-" + str(livy_port))
-            local('sudo systemctl start livy-server-' + str(livy_port))
+                    subprocess.run('sleep 5', shell=True, check=True)
+            subprocess.run('sudo cp /opt/livy-server-cluster.service /etc/systemd/system/livy-server-' + str(livy_port) +
+                  '.service', shell=True, check=True)
+            subprocess.run("sudo sed -i 's|OS_USER|" + os_user + "|' /etc/systemd/system/livy-server-" + str(livy_port) +
+                  '.service', shell=True, check=True)
+            subprocess.run("sudo sed -i 's|LIVY_PATH|" + livy_path + "|' /etc/systemd/system/livy-server-" + str(livy_port)
+                  + '.service', shell=True, check=True)
+            subprocess.run('sudo chmod 644 /etc/systemd/system/livy-server-' + str(livy_port) + '.service', shell=True, check=True)
+            subprocess.run("sudo systemctl daemon-reload", shell=True, check=True)
+            subprocess.run("sudo systemctl enable livy-server-" + str(livy_port), shell=True, check=True)
+            subprocess.run('sudo systemctl start livy-server-' + str(livy_port), shell=True, check=True)
         else:
             template_file = "/tmp/{}/dataengine_interpreter.json".format(args.cluster_name)
-            p_versions = ["2", "3.5"]
+            p_versions = ["2", "3.8"]
             for p_version in p_versions:
                 fr = open(template_file, 'r+')
                 text = fr.read()
@@ -142,32 +138,32 @@
                 fw.close()
                 for _ in range(5):
                     try:
-                        local("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
+                        subprocess.run("curl --noproxy localhost -H 'Content-Type: application/json' -X POST -d " +
                               "@/tmp/dataengine_spark_py" + p_version +
-                              "_interpreter.json http://localhost:8080/api/interpreter/setting")
+                              "_interpreter.json http://localhost:8080/api/interpreter/setting", shell=True, check=True)
                         break
                     except:
-                        local('sleep 5')
-        local('touch /home/' + os_user + '/.ensure_dir/dataengine_' + cluster_name + '_interpreter_ensured')
+                        subprocess.run('sleep 5', shell=True, check=True)
+        subprocess.run('touch /home/' + os_user + '/.ensure_dir/dataengine_' + cluster_name + '_interpreter_ensured', shell=True, check=True)
     except Exception as err:
         print('Error: {0}'.format(err))
         sys.exit(1)
 
 
 def install_remote_livy(args):
-    local('sudo chown ' + args.os_user + ':' + args.os_user + ' -R /opt/zeppelin/')
-    local('sudo service zeppelin-notebook stop')
-    local('sudo -i wget http://archive.cloudera.com/beta/livy/livy-server-' + args.livy_version + '.zip -O /opt/' +
-          args.cluster_name + '/livy-server-' + args.livy_version + '.zip')
-    local('sudo unzip /opt/' + args.cluster_name + '/livy-server-' + args.livy_version + '.zip -d /opt/' +
-          args.cluster_name + '/')
-    local('sudo mv /opt/' + args.cluster_name + '/livy-server-' + args.livy_version + '/ /opt/' + args.cluster_name +
-          '/livy/')
+    subprocess.run('sudo chown ' + args.os_user + ':' + args.os_user + ' -R /opt/zeppelin/', shell=True, check=True)
+    subprocess.run('sudo service zeppelin-notebook stop', shell=True, check=True)
+    subprocess.run('sudo -i wget http://archive.cloudera.com/beta/livy/livy-server-' + args.livy_version + '.zip -O /opt/' +
+          args.cluster_name + '/livy-server-' + args.livy_version + '.zip', shell=True, check=True)
+    subprocess.run('sudo unzip /opt/' + args.cluster_name + '/livy-server-' + args.livy_version + '.zip -d /opt/' +
+          args.cluster_name + '/', shell=True, check=True)
+    subprocess.run('sudo mv /opt/' + args.cluster_name + '/livy-server-' + args.livy_version + '/ /opt/' + args.cluster_name +
+          '/livy/', shell=True, check=True)
     livy_path = '/opt/' + args.cluster_name + '/livy/'
-    local('sudo mkdir -p ' + livy_path + '/logs')
-    local('sudo mkdir -p /var/run/livy')
-    local('sudo chown ' + args.os_user + ':' + args.os_user + ' -R /var/run/livy')
-    local('sudo chown ' + args.os_user + ':' + args.os_user + ' -R ' + livy_path)
+    subprocess.run('sudo mkdir -p ' + livy_path + '/logs', shell=True, check=True)
+    subprocess.run('sudo mkdir -p /var/run/livy', shell=True, check=True)
+    subprocess.run('sudo chown ' + args.os_user + ':' + args.os_user + ' -R /var/run/livy', shell=True, check=True)
+    subprocess.run('sudo chown ' + args.os_user + ':' + args.os_user + ' -R ' + livy_path, shell=True, check=True)
 
 
 if __name__ == "__main__":
diff --git a/infrastructure-provisioning/src/general/scripts/os/zeppelin_install_dataengine_kernels.py b/infrastructure-provisioning/src/general/scripts/os/zeppelin_install_dataengine_kernels.py
index 7d851cd..643cf8f 100644
--- a/infrastructure-provisioning/src/general/scripts/os/zeppelin_install_dataengine_kernels.py
+++ b/infrastructure-provisioning/src/general/scripts/os/zeppelin_install_dataengine_kernels.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,12 +22,12 @@
 # ******************************************************************************
 
 import argparse
-from fabric.api import *
-from fabric.contrib.files import exists
-from dlab.meta_lib import *
 import os
-from fabric.contrib.files import exists
-from dlab.fab import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cluster_name', type=str, default='')
@@ -45,46 +45,52 @@
 def configure_notebook(keyfile, hoststring):
     templates_dir = '/root/templates/'
     scripts_dir = '/root/scripts/'
-    run('mkdir -p /tmp/{}/'.format(args.cluster_name))
+    conn.run('mkdir -p /tmp/{}/'.format(args.cluster_name))
     if os.environ['notebook_multiple_clusters'] == 'true':
-        put(templates_dir + 'dataengine_interpreter_livy.json', '/tmp/{}/dataengine_interpreter.json'.format(args.cluster_name))
+        conn.put(templates_dir + 'dataengine_interpreter_livy.json', '/tmp/{}/dataengine_interpreter.json'.format(args.cluster_name))
     else:
-        put(templates_dir + 'dataengine_interpreter_spark.json', '/tmp/{}/dataengine_interpreter.json'.format(args.cluster_name))
-    put(templates_dir + 'notebook_spark-defaults_local.conf', '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
+        conn.put(templates_dir + 'dataengine_interpreter_spark.json',
+            '/tmp/{}/dataengine_interpreter.json'.format(args.cluster_name))
+    conn.put(templates_dir + 'notebook_spark-defaults_local.conf',
+        '/tmp/{}/notebook_spark-defaults_local.conf'.format(args.cluster_name))
     spark_master_ip = args.spark_master.split('//')[1].split(':')[0]
     spark_memory = get_spark_memory(True, args.os_user, spark_master_ip, keyfile)
-    run('sed -i "s|EXECUTOR_MEMORY|{}m|g " /tmp/{}/dataengine_interpreter.json'.format(spark_memory, args.cluster_name))
-    run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory, args.cluster_name))
-    if not exists('/usr/local/bin/zeppelin_dataengine_create_configs.py'):
-        put(scripts_dir + 'zeppelin_dataengine_create_configs.py', '/usr/local/bin/zeppelin_dataengine_create_configs.py', use_sudo=True)
-        sudo('chmod 755 /usr/local/bin/zeppelin_dataengine_create_configs.py')
-    if not exists('/usr/lib/python2.7/dlab/'):
-        sudo('mkdir -p /usr/lib/python2.7/dlab/')
-        put('/usr/lib/python2.7/dlab/*', '/usr/lib/python2.7/dlab/', use_sudo=True)
-        sudo('chmod a+x /usr/lib/python2.7/dlab/*')
-        if exists('/usr/lib64'):
-            sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+    conn.run('sed -i "s|EXECUTOR_MEMORY|{}m|g " /tmp/{}/dataengine_interpreter.json'.format(spark_memory, args.cluster_name))
+    conn.run('echo "spark.executor.memory {0}m" >> /tmp/{1}/notebook_spark-defaults_local.conf'.format(spark_memory,
+                                                                                                  args.cluster_name))
+    if not exists(conn,'/usr/local/bin/zeppelin_dataengine_create_configs.py'):
+        conn.put(scripts_dir + 'zeppelin_dataengine_create_configs.py',
+            '/tmp/zeppelin_dataengine_create_configs.py')
+        conn.sudo('cp /tmp/zeppelin_dataengine_create_configs.py /usr/local/bin/zeppelin_dataengine_create_configs.py')
+        conn.sudo('chmod 755 /usr/local/bin/zeppelin_dataengine_create_configs.py')
+    if not exists(conn,'/usr/lib/python3.8/datalab/'):
+        conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+        conn.local('cd  /usr/lib/python3.8/datalab/; tar -zcvf /tmp/datalab.tar.gz *')
+        conn.put('/tmp/datalab.tar.gz', '/tmp/datalab.tar.gz')
+        conn.sudo('tar -zxvf /tmp/datalab.tar.gz -C /usr/lib/python3.8/datalab/')
+        conn.sudo('chmod a+x /usr/lib/python3.8/datalab/*')
+        if exists(conn, '/usr/lib64'):
+            conn.sudo('mkdir -p /usr/lib64/python3.8')
+            conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
 
 def create_inactivity_log(master_ip, hoststring):
     reworked_ip = master_ip.replace('.', '-')
-    sudo("date +%s > /opt/inactivity/{}_inactivity".format(reworked_ip))
+    conn.sudo('''bash -l -c "date +%s > /opt/inactivity/{}_inactivity" '''.format(reworked_ip))
 
 if __name__ == "__main__":
-    env.hosts = "{}".format(args.notebook_ip)
-    env.user = args.os_user
-    env.key_filename = "{}".format(args.keyfile)
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.notebook_ip, args.os_user, args.keyfile)
     try:
         region = os.environ['aws_region']
     except:
         region = ''
     if 'spark_configurations' not in os.environ:
         os.environ['spark_configurations'] = '[]'
-    configure_notebook(args.keyfile, env.host_string)
-    create_inactivity_log(args.spark_master_ip, env.host_string)
+    configure_notebook(args.keyfile, args.notebook_ip)
+    create_inactivity_log(args.spark_master_ip, args.notebook_ip)
     livy_version = os.environ['notebook_livy_version']
     r_enabled = os.environ['notebook_r_enabled']
-    sudo('/usr/bin/python /usr/local/bin/zeppelin_dataengine_create_configs.py '
+    conn.sudo('/usr/bin/python3 /usr/local/bin/zeppelin_dataengine_create_configs.py '
          '--cluster_name {} --spark_version {} --hadoop_version {} --os_user {} --spark_master {} --keyfile {} \
          --notebook_ip {} --livy_version {} --multiple_clusters {} --region {} --datalake_enabled {} '
          '--r_enabled {} --spark_configurations "{}"'.
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_data_engine/config.xml
index dd58f62..8c993b3 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_data_engine/config.xml
@@ -93,9 +93,23 @@
     <builders>
         <hudson.tasks.Shell>
             <command>rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_data_engine/template_prepare.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/ADMS/&apos;${Master_Node_Shape}&apos;/g&apos; | sed &apos;s/ADSS/&apos;${Slave_Node_Shape}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/NIN/&apos;${Notebook_image_name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-dataengine --action create;
+                sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+                /var/lib/jenkins/jobs/create_data_engine/template_prepare.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+                | sed &apos;s/ADMS/&apos;${Master_Node_Shape}&apos;/g&apos; | sed &apos;s/ADSS/&apos;${Slave_Node_Shape}&apos;/g&apos;
+                | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos;
+                | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos;
+                | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/NIN/&apos;${Notebook_image_name}&apos;/g&apos; |
+                sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+                /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/dataengine:/logs/dataengine
+                docker.datalab-dataengine --action create;
                 rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_data_engine/template_configure.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sudo docker run -i -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-${notebook_app} --action configure;
+                sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+                /var/lib/jenkins/jobs/create_data_engine/template_configure.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+                | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos;
+                | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos;
+                | sed "s|SPC|${Spark_configurations}|g" | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+                /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/dataengine:/logs/dataengine
+                docker.datalab-${notebook_app} --action configure;
             </command>
         </hudson.tasks.Shell>
     </builders>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_dataengine-service/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_dataengine-service/config.xml
index 4d99338..30070de 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_dataengine-service/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_dataengine-service/config.xml
@@ -184,28 +184,34 @@
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
 sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_dataengine-service/template_prepare.json | \
-sed &apos;s/SPI/&apos;${slave_spot_instance}&apos;/g&apos; | \
-sed &apos;s/SISPP/&apos;${slave_instance_spot_pct_price}&apos;/g&apos; | \
-sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/ESR/&apos;${Service_role}&apos;/g&apos; | \
-sed &apos;s/EE2R/&apos;${EMR_EC2_role}&apos;/g&apos; | sed &apos;s/EVER/&apos;${Release_label}&apos;/g&apos; | \
-sed &apos;s/EMIT/&apos;${Master_node_size}&apos;/g&apos; | sed &apos;s/ESMT/&apos;${Slave_node_size}&apos;/g&apos; | \
-sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos; | sed &apos;s/ETIM/&apos;${Timeout}&apos;/g&apos; | \
-sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed &apos;s/NVPCID/&apos;${aws_notebook_vpc_id}&apos;/g&apos; | \
-sed &apos;s/EXN/&apos;${exploratory_name}&apos;/g&apos; | sed &apos;s/CON/&apos;${computational_name}&apos;/g&apos; | \
-sudo docker run -i -e &quot;conf_tag_resource_id=user:tag&quot; -e &quot;configurations=$configurations&quot; \
--v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response \
--v /var/opt/dlab/log/dataengine-service:/logs/dataengine-service \
-docker.dlab-dataengine-service --action create;
+          sed &apos;s/SPI/&apos;${slave_spot_instance}&apos;/g&apos; | \
+          sed &apos;s/SISPP/&apos;${slave_instance_spot_pct_price}&apos;/g&apos; | \
+          sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/ESR/&apos;${Service_role}&apos;/g&apos; | \
+          sed &apos;s/EE2R/&apos;${EMR_EC2_role}&apos;/g&apos; | sed &apos;s/EVER/&apos;${Release_label}&apos;/g&apos; |
+          \
+          sed &apos;s/EMIT/&apos;${Master_node_size}&apos;/g&apos; | sed &apos;s/ESMT/&apos;${Slave_node_size}&apos;/g&apos;
+          | \
+          sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos; | sed &apos;s/ETIM/&apos;${Timeout}&apos;/g&apos; | \
+          sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed &apos;s/NVPCID/&apos;${aws_notebook_vpc_id}&apos;/g&apos;
+          | \
+          sed &apos;s/EXN/&apos;${exploratory_name}&apos;/g&apos; | sed &apos;s/CON/&apos;${computational_name}&apos;/g&apos;
+          | \
+          sudo docker run -i -e &quot;conf_tag_resource_id=user:tag&quot; -e &quot;configurations=$configurations&quot;
+          \
+          -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response \
+          -v /var/opt/datalab/log/dataengine-service:/logs/dataengine-service \
+          docker.datalab-dataengine-service --action create;
 
-rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_dataengine-service/template_configure.json | \
-sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EVER/&apos;${Release_label}&apos;/g&apos; | \
-sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | \
-sudo docker run -i -e &quot;conf_tag_resource_id=user:tag&quot; \
--v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response \
--v /var/opt/dlab/log/dataengine-service:/logs/dataengine-service \
-docker.dlab-${notebook_app} --action configure;
-        </command>
+          rand=`openssl rand -hex 10`;
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/create_dataengine-service/template_configure.json | \
+          sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EVER/&apos;${Release_label}&apos;/g&apos; | \
+          sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | \
+          sudo docker run -i -e &quot;conf_tag_resource_id=user:tag&quot; \
+          -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response \
+          -v /var/opt/datalab/log/dataengine-service:/logs/dataengine-service \
+          docker.datalab-${notebook_app} --action configure;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_edge_node/config.xml
index 8dcab89..e8a6a35 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_edge_node/config.xml
@@ -67,7 +67,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_edge_node/template.json  | sed &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/CIU/&apos;${IAM_user}&apos;/g&apos; | sed &apos;s/EIS/&apos;${instance_shape}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/edge:/logs/edge docker.dlab-edge --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_edge_node/template.json | sed &apos;s/UN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/CIU/&apos;${IAM_user}&apos;/g&apos; | sed &apos;s/EIS/&apos;${instance_shape}&apos;/g&apos; |
+          sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/edge:/logs/edge docker.datalab-edge --action $Action
+          ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_notebook_image/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_notebook_image/config.xml
index 05a6135..94d0375 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_notebook_image/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_notebook_image/config.xml
@@ -77,7 +77,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_notebook_image/template.json  | sed &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/IMN/&apos;${Image_name}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_instance_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_notebook_image/template.json | sed
+          &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/IMN/&apos;${Image_name}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_instance_name}&apos;/g&apos;
+          | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v
+          /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_notebook_server/config.xml
index dac6f79..abacbb1 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/create_notebook_server/config.xml
@@ -119,7 +119,13 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`; creds=$git_creds;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_notebook_server/template.json | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NIT/&apos;${instance_shape}&apos;/g&apos; | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/IMAGE/&apos;${Image_name}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook  docker.dlab-${notebook_app} --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_notebook_server/template.json | sed
+          &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NIT/&apos;${instance_shape}&apos;/g&apos; | sed
+          &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/IMAGE/&apos;${Image_name}&apos;/g&apos; | sed
+          "s|SPC|${Spark_configurations}|g" | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -e
+          "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine-service_install_additional_libs/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine-service_install_additional_libs/config.xml
index d467eb0..5c9c4b3 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine-service_install_additional_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine-service_install_additional_libs/config.xml
@@ -61,11 +61,10 @@
             [
               {"group": "os_pkg", "name": "nmap"},
               {"group": "os_pkg", "name": "htop"},
-              {"group": "pip2", "name": "requests"},
               {"group": "pip3", "name": "configparser"},
               {"group": "r_pkg", "name": "rmarkdown"},
             ]
-            Types: for OS - os_pkg, for Python - pip2/pip3, for R - r_pkg
+            Types: for OS - os_pkg, for Python - pip3, for R - r_pkg
             NOTE: You need to escape each double quote.
             For Example: {\"group\": \"os_pkg\", \"name\": \"htop\"}
           </description>
@@ -84,8 +83,14 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine-service_install_additional_libs/template.json | sed &apos;s/COF/&apos;${os_family}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sed &apos;s/ECN/&apos;${Cluster_name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -e "libs=$Libs" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine-service:/logs/dataengine-service  docker.dlab-dataengine-service --action $Action;
-            </command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine-service_install_additional_libs/template.json | sed &apos;s/COF/&apos;${os_family}&apos;/g&apos;
+          | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sed
+          &apos;s/ECN/&apos;${Cluster_name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -e
+          "libs=$Libs" -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/dataengine-service:/logs/dataengine-service docker.datalab-dataengine-service --action
+          $Action;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine-service_list_available_libs/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine-service_list_available_libs/config.xml
index e11ef7e..bf2f4ae 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine-service_list_available_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine-service_list_available_libs/config.xml
@@ -66,7 +66,12 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine-service_list_available_libs/template.json | sed &apos;s/ECN/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine-service:/logs/dataengine-service docker.dlab-dataengine-service --action $Action
+      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine-service_list_available_libs/template.json | sed &apos;s/ECN/&apos;${Cluster_name}&apos;/g&apos;
+          | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sudo
+          docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/dataengine-service:/logs/dataengine-service docker.datalab-dataengine-service --action
+          $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_install_additional_libs/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_install_additional_libs/config.xml
index 1f21650..abc6599 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_install_additional_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_install_additional_libs/config.xml
@@ -61,11 +61,10 @@
             [
               {"group": "os_pkg", "name": "nmap"},
               {"group": "os_pkg", "name": "htop"},
-              {"group": "pip2", "name": "requests"},
               {"group": "pip3", "name": "configparser"},
               {"group": "r_pkg", "name": "rmarkdown"},
             ]
-            Types: for OS - os_pkg, for Python - pip2/pip3, for R - r_pkg
+            Types: for OS - os_pkg, for Python - pip3, for R - r_pkg
             NOTE: You need to escape each double quote.
             For Example: {\"group\": \"os_pkg\", \"name\": \"htop\"}
           </description>
@@ -84,8 +83,13 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine_install_additional_libs/template.json | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -e "libs=$Libs" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-dataengine --action $Action;
-            </command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine_install_additional_libs/template.json | sed &apos;s/APP/&apos;${application}&apos;/g&apos;
+          | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; |
+          sudo docker run -i -e "conf_tag_resource_id=CTUN" -e "libs=$Libs" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/dataengine:/logs/dataengine
+          docker.datalab-dataengine --action $Action;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_list_available_libs/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_list_available_libs/config.xml
index 0fff3c6..b2567e8 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_list_available_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_list_available_libs/config.xml
@@ -66,7 +66,11 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine docker.dlab-dataengine --action $Action
+      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${application}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/dataengine:/logs/dataengine docker.datalab-dataengine --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_reconfigure_spark/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_reconfigure_spark/config.xml
index cbc592e..4655e3e 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_reconfigure_spark/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/dataengine_reconfigure_spark/config.xml
@@ -77,8 +77,13 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine_reconfigure_spark/template.json | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-dataengine --action $Action;
-            </command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine_reconfigure_spark/template.json |
+          sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; |
+          sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed
+          "s|SPC|${Spark_configurations}|g" | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v
+          /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/dataengine:/logs/dataengine docker.datalab-dataengine --action $Action;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/gitlab_server/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/gitlab_server/config.xml
index 88b9e75..ccbbf33 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/gitlab_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/gitlab_server/config.xml
@@ -90,22 +90,23 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>DLAB_PATH=&quot;/opt/dlab&quot;
-GITLAB_CONFIG_FILE=&quot;$DLAB_PATH/tmp/gitlab/gitlab.ini&quot;
-if [ ! -f $DLAB_PATH/tmp/gitlab/gitlab.ini.bak ]; then
-        sudo cp $GITLAB_CONFIG_FILE $DLAB_PATH/tmp/gitlab/gitlab.ini.bak
-fi
-sudo cp $DLAB_PATH/tmp/gitlab/gitlab.ini.bak $GITLAB_CONFIG_FILE
+        <command>DATALAB_PATH=&quot;/opt/datalab&quot;
+            GITLAB_CONFIG_FILE=&quot;$DATALAB_PATH/tmp/gitlab/gitlab.ini&quot;
+            if [ ! -f $DATALAB_PATH/tmp/gitlab/gitlab.ini.bak ]; then
+            sudo cp $GITLAB_CONFIG_FILE $DATALAB_PATH/tmp/gitlab/gitlab.ini.bak
+            fi
+            sudo cp $DATALAB_PATH/tmp/gitlab/gitlab.ini.bak $GITLAB_CONFIG_FILE
 
-sudo sed -i &quot;s/AWS_REGION/$Region/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/AWS_SUBNET_ID/$subnet_id/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/AWS_SG_IDS/$sg_ids/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/LDAP_HOST/$ldap_host/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/LDAP_USER/$ldap_user/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/LDAP_PASS/$ldap_pass/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/GITLAB_ROOT_PASSWORD/$root_password/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/AWS_REGION/$Region/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/AWS_SUBNET_ID/$subnet_id/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/AWS_SG_IDS/$sg_ids/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/LDAP_HOST/$ldap_host/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/LDAP_USER/$ldap_user/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/LDAP_PASS/$ldap_pass/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/GITLAB_ROOT_PASSWORD/$root_password/g&quot; $GITLAB_CONFIG_FILE
 
-sudo /usr/bin/python $DLAB_PATH/tmp/gitlab/gitlab_deploy.py --action $Action</command>
+            sudo /usr/bin/python3 $DATALAB_PATH/tmp/gitlab/gitlab_deploy.py --action $Action
+        </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/manage_git_credentials/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/manage_git_credentials/config.xml
index 119138c..86b4d21 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/manage_git_credentials/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/manage_git_credentials/config.xml
@@ -88,8 +88,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>
-        rand=`openssl rand -hex 10`; creds=$git_creds;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/manage_git_credentials/template.json | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -e &quot;conf_tag_resource_id=CTUN&quot; -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook  docker.dlab-${notebook_app} --action $Action
+          rand=`openssl rand -hex 10`; creds=$git_creds;
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/manage_git_credentials/template.json | sed
+          &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed
+          &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -e &quot;conf_tag_resource_id=CTUN&quot;
+          -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_install_additional_libs/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_install_additional_libs/config.xml
index 0fb3bc3..719035d 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_install_additional_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_install_additional_libs/config.xml
@@ -65,11 +65,10 @@
             [
               {"group": "os_pkg", "name": "nmap"},
               {"group": "os_pkg", "name": "htop"},
-              {"group": "pip2", "name": "requests"},
               {"group": "pip3", "name": "configparser"},
               {"group": "r_pkg", "name": "rmarkdown"},
             ]
-            Types: for OS - os_pkg, for Python - pip2/pip3, for R - r_pkg
+            Types: for OS - os_pkg, for Python - pip3, for R - r_pkg
             NOTE: You need to escape each double quote.
             For Example: {\"group\": \"os_pkg\", \"name\": \"htop\"}
           </description>
@@ -87,7 +86,10 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; echo $rand; sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -e "conf_resource=notebook" -e "request_id=$rand" -e "edge_user_name=$Username" -e "notebook_instance_name=$Notebook_Name" -e "libs=$Libs" -e "application=$notebook_app" docker.dlab-$notebook_app --action $Action
+      <command>rand=`openssl rand -hex 10`; echo $rand; sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -e "conf_resource=notebook" -e "request_id=$rand" -e
+          "edge_user_name=$Username" -e "notebook_instance_name=$Notebook_Name" -e "libs=$Libs" -e
+          "application=$notebook_app" docker.datalab-$notebook_app --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_list_available_libs/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_list_available_libs/config.xml
index 6c88458..5fed64e 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_list_available_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_list_available_libs/config.xml
@@ -71,7 +71,11 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/notebook_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action
+      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/notebook_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_reconfigure_spark/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_reconfigure_spark/config.xml
index 48f3669..f456917 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_reconfigure_spark/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/notebook_reconfigure_spark/config.xml
@@ -76,7 +76,12 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/notebook_reconfigure_spark/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action
+      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/notebook_reconfigure_spark/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; |
+          sed "s|SPC|${Spark_configurations}|g" | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/notebook:/logs/notebook
+          docker.datalab-${notebook_app} --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/recreate_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/recreate_edge_node/config.xml
index 2fd4aa4..aa19668 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/recreate_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/recreate_edge_node/config.xml
@@ -72,7 +72,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/recreate_edge_node/template.json | sed &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/CIU/&apos;${IAM_user}&apos;/g&apos; | sed &apos;s/EEI/&apos;${elastic_ip}&apos;/g&apos; | sed &apos;s/EIS/&apos;${instance_shape}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/edge:/logs/edge docker.dlab-edge --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/recreate_edge_node/template.json | sed
+          &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/CIU/&apos;${IAM_user}&apos;/g&apos; | sed &apos;s/EEI/&apos;${elastic_ip}&apos;/g&apos;
+          | sed &apos;s/EIS/&apos;${instance_shape}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v
+          /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/edge:/logs/edge docker.datalab-edge --action $Action ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/reupload_ssh_key/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/reupload_ssh_key/config.xml
index a63b0e0..49711ac 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/reupload_ssh_key/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/reupload_ssh_key/config.xml
@@ -72,7 +72,10 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-echo &apos;{&quot;edge_user_name&quot;:&quot;&apos;${edge_user_name}&apos;&quot;,&quot;conf_service_base_name&quot;:&quot;&apos;${conf_service_base_name}&apos;&quot;,&quot;conf_os_family&quot;:&quot;&apos;${conf_os_family}&apos;&quot;,&quot;resource_id&quot;:&quot;&apos;${instance_id}&apos;&quot;}&apos; | sudo docker run -i -e &quot;conf_key_name=BDCC-DSS-POC&quot; -e &quot;conf_resource=edge&quot; -e &quot;request_id=${rand}&quot; -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/edge:/logs/edge docker.dlab-edge --action reupload_key
+          echo &apos;{&quot;edge_user_name&quot;:&quot;&apos;${edge_user_name}&apos;&quot;,&quot;conf_service_base_name&quot;:&quot;&apos;${conf_service_base_name}&apos;&quot;,&quot;conf_os_family&quot;:&quot;&apos;${conf_os_family}&apos;&quot;,&quot;resource_id&quot;:&quot;&apos;${instance_id}&apos;&quot;}&apos;
+          | sudo docker run -i -e &quot;conf_key_name=BDCC-DSS-POC&quot; -e &quot;conf_resource=edge&quot; -e &quot;request_id=${rand}&quot;
+          -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/edge:/logs/edge docker.datalab-edge --action reupload_key
 </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_data_engine/config.xml
index 8a91540..8363b8e 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_data_engine/config.xml
@@ -66,7 +66,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-dataengine --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+          | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          docker.datalab-dataengine --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_edge_node/config.xml
index db86eba..4a76355 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_edge_node/config.xml
@@ -53,7 +53,10 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-edge --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response docker.datalab-edge --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_notebook_server/config.xml
index b2fd398..ba6a405 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/start_notebook_server/config.xml
@@ -88,8 +88,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>
-        rand=`openssl rand -hex 10`; creds=$git_creds;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_notebook_server/template.json | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -e &quot;conf_tag_resource_id=user:tag&quot; -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-${notebook_app} --action $Action
+          rand=`openssl rand -hex 10`; creds=$git_creds;
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_notebook_server/template.json | sed
+          &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed
+          &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -e &quot;conf_tag_resource_id=user:tag&quot; -v
+          /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response docker.datalab-${notebook_app}
+          --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_data_engine/config.xml
index 98f1af9..2716689 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_data_engine/config.xml
@@ -66,7 +66,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-dataengine --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+          | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          docker.datalab-dataengine --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_edge_node/config.xml
index 12f84ff..7f2c221 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_edge_node/config.xml
@@ -53,7 +53,10 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-edge --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response docker.datalab-edge --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_notebook_server/config.xml
index f0ad86a..906d0ca 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/stop_notebook_server/config.xml
@@ -72,7 +72,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_notebook_server/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; |  sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-${notebook_app} --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_notebook_server/template.json | sed
+          &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo
+          docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response docker.datalab-${notebook_app} --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_data_engine/config.xml
index 17c152b..db4a1fb 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_data_engine/config.xml
@@ -63,7 +63,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-dataengine --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_data_engine/template.json | sed
+          &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed
+          &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response docker.datalab-dataengine --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_dataengine-service/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_dataengine-service/config.xml
index 550ec41..7d6c74b 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_dataengine-service/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_dataengine-service/config.xml
@@ -63,7 +63,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_dataengine-service/template.json | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/ECN/&apos;${emr_name}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine-service:/logs/dataengine-service docker.dlab-dataengine-service --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_dataengine-service/template.json |
+          sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/ECN/&apos;${emr_name}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos;
+          | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/dataengine-service:/logs/dataengine-service
+          docker.datalab-dataengine-service --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_edge_node/config.xml
index 94c1a9c..1f247f9 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_edge_node/config.xml
@@ -53,7 +53,10 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_edge_node/template.json | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-edge --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_edge_node/template.json | sed
+          &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v
+          /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response docker.datalab-edge --action $Action ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_notebook_image/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_notebook_image/config.xml
index 5f970ed..444a88c 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_notebook_image/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_notebook_image/config.xml
@@ -72,7 +72,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_notebook_image/template.json | sed &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/IMN/&apos;${Full_image_name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_notebook_image/template.json | sed
+          &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/IMN/&apos;${Full_image_name}&apos;/g&apos; | sudo
+          docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/notebook:/logs/notebook
+          docker.datalab-${notebook_app} --action $Action ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_notebook_server/config.xml
index 2ca3d7f..d6b726a 100644
--- a/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/aws/jenkins_jobs/terminate_notebook_server/config.xml
@@ -72,7 +72,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_notebook_server/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-${notebook_app} --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_notebook_server/template.json |
+          sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo
+          docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response docker.datalab-${notebook_app} --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_data_engine/config.xml
index 18ce8b2..fc4c620 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_data_engine/config.xml
@@ -101,9 +101,25 @@
     <builders>
         <hudson.tasks.Shell>
             <command>rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_data_engine/template_prepare.json | sed &apos;s/ACI/&apos;${Client_ID}&apos;/g&apos; | sed &apos;s/AURT/&apos;${User_Refresh_Token}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/ADMS/&apos;${Master_Node_Shape}&apos;/g&apos; | sed &apos;s/ADSS/&apos;${Slave_Node_Shape}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/NIN/&apos;${Notebook_image_name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-dataengine --action create;
+                sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+                /var/lib/jenkins/jobs/create_data_engine/template_prepare.json | sed &apos;s/ACI/&apos;${Client_ID}&apos;/g&apos;
+                | sed &apos;s/AURT/&apos;${User_Refresh_Token}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+                | sed &apos;s/ADMS/&apos;${Master_Node_Shape}&apos;/g&apos; | sed &apos;s/ADSS/&apos;${Slave_Node_Shape}&apos;/g&apos;
+                | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos;
+                | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos;
+                | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/NIN/&apos;${Notebook_image_name}&apos;/g&apos; |
+                sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+                /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/dataengine:/logs/dataengine
+                docker.datalab-dataengine --action create;
                 rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_data_engine/template_configure.json | sed &apos;s/ACI/&apos;${Client_ID}&apos;/g&apos; | sed &apos;s/AURT/&apos;${User_Refresh_Token}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-${notebook_app} --action configure;
+                sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+                /var/lib/jenkins/jobs/create_data_engine/template_configure.json | sed &apos;s/ACI/&apos;${Client_ID}&apos;/g&apos;
+                | sed &apos;s/AURT/&apos;${User_Refresh_Token}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+                | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos;
+                | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed
+                &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sudo docker run -i -v
+                /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+                /var/opt/datalab/log/dataengine:/logs/dataengine docker.datalab-${notebook_app} --action configure;
             </command>
         </hudson.tasks.Shell>
     </builders>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_edge_node/config.xml
index 4f89868..14bab01 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_edge_node/config.xml
@@ -67,7 +67,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_edge_node/template.json | sed &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EIS/&apos;${instance_shape}&apos;/g&apos; | sed &apos;s/AUI/&apos;${Ad_User_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/edge:/logs/edge docker.dlab-edge --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_edge_node/template.json | sed &apos;s/UN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/EIS/&apos;${instance_shape}&apos;/g&apos; | sed &apos;s/AUI/&apos;${Ad_User_Name}&apos;/g&apos;
+          | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/edge:/logs/edge docker.datalab-edge --action $Action ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_image/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_image/config.xml
index f7a2715..784f9e1 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_image/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_image/config.xml
@@ -77,7 +77,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_notebook_image/template.json  | sed &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/IMN/&apos;${Image_name}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_instance_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_notebook_image/template.json | sed
+          &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/IMN/&apos;${Image_name}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_instance_name}&apos;/g&apos;
+          | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v
+          /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_server/config.xml
index 1c3967e..5e6fe56 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/create_notebook_server/config.xml
@@ -117,7 +117,14 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`; creds=$git_creds;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_notebook_server/template.json | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NIT/&apos;${instance_shape}&apos;/g&apos; | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/ACI/&apos;${Client_ID}&apos;/g&apos; | sed &apos;s/AURT/&apos;${User_Refresh_Token}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/IMAGE/&apos;${Image_name}&apos;/g&apos; | sed &apos;s/VPC/&apos;${vpc_name}&apos;/g&apos; | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook  docker.dlab-${notebook_app} --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_notebook_server/template.json | sed
+          &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NIT/&apos;${instance_shape}&apos;/g&apos; | sed
+          &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/ACI/&apos;${Client_ID}&apos;/g&apos; | sed &apos;s/AURT/&apos;${User_Refresh_Token}&apos;/g&apos;
+          | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/IMAGE/&apos;${Image_name}&apos;/g&apos; | sed &apos;s/VPC/&apos;${vpc_name}&apos;/g&apos;
+          | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/notebook:/logs/notebook
+          docker.datalab-${notebook_app} --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_install_additional_libs/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_install_additional_libs/config.xml
index 1f21650..abc6599 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_install_additional_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_install_additional_libs/config.xml
@@ -61,11 +61,10 @@
             [
               {"group": "os_pkg", "name": "nmap"},
               {"group": "os_pkg", "name": "htop"},
-              {"group": "pip2", "name": "requests"},
               {"group": "pip3", "name": "configparser"},
               {"group": "r_pkg", "name": "rmarkdown"},
             ]
-            Types: for OS - os_pkg, for Python - pip2/pip3, for R - r_pkg
+            Types: for OS - os_pkg, for Python - pip3, for R - r_pkg
             NOTE: You need to escape each double quote.
             For Example: {\"group\": \"os_pkg\", \"name\": \"htop\"}
           </description>
@@ -84,8 +83,13 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine_install_additional_libs/template.json | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -e "libs=$Libs" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-dataengine --action $Action;
-            </command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine_install_additional_libs/template.json | sed &apos;s/APP/&apos;${application}&apos;/g&apos;
+          | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; |
+          sudo docker run -i -e "conf_tag_resource_id=CTUN" -e "libs=$Libs" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/dataengine:/logs/dataengine
+          docker.datalab-dataengine --action $Action;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_list_available_libs/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_list_available_libs/config.xml
index 4f25357..977a559 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_list_available_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_list_available_libs/config.xml
@@ -66,7 +66,11 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-dataengine --action $Action
+      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${application}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-dataengine --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_reconfigure_spark/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_reconfigure_spark/config.xml
index 5a51b79..e74c097 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_reconfigure_spark/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/dataengine_reconfigure_spark/config.xml
@@ -77,8 +77,13 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine_install_additional_libs/template.json | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-dataengine --action $Action;
-            </command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine_install_additional_libs/template.json | sed &apos;s/APP/&apos;${application}&apos;/g&apos;
+          | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos;
+          | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sudo docker run
+          -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          -v /var/opt/datalab/log/dataengine:/logs/dataengine docker.datalab-dataengine --action $Action;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/manage_git_credentials/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/manage_git_credentials/config.xml
index 4a5717d..17796b0 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/manage_git_credentials/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/manage_git_credentials/config.xml
@@ -88,8 +88,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>
-        rand=`openssl rand -hex 10`; creds=$git_creds;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/manage_git_credentials/template.json | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook  docker.dlab-${notebook_app} --action $Action
+          rand=`openssl rand -hex 10`; creds=$git_creds;
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/manage_git_credentials/template.json | sed
+          &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed
+          &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -v
+          /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_install_additional_libs/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_install_additional_libs/config.xml
index 1afc1e5..719035d 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_install_additional_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_install_additional_libs/config.xml
@@ -65,11 +65,10 @@
             [
               {"group": "os_pkg", "name": "nmap"},
               {"group": "os_pkg", "name": "htop"},
-              {"group": "pip2", "name": "requests"},
               {"group": "pip3", "name": "configparser"},
               {"group": "r_pkg", "name": "rmarkdown"},
             ]
-            Types: for OS - os_pkg, for Python - pip2/pip3, for R - r_pkg
+            Types: for OS - os_pkg, for Python - pip3, for R - r_pkg
             NOTE: You need to escape each double quote.
             For Example: {\"group\": \"os_pkg\", \"name\": \"htop\"}
           </description>
@@ -87,7 +86,10 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; echo $rand; sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -e "conf_resource=notebook" -e "request_id=$rand"  -e "edge_user_name=$Username"  -e "notebook_instance_name=$Notebook_Name"  -e "libs=$Libs" -e "application=$notebook_app" docker.dlab-$notebook_app --action $Action
+      <command>rand=`openssl rand -hex 10`; echo $rand; sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -e "conf_resource=notebook" -e "request_id=$rand" -e
+          "edge_user_name=$Username" -e "notebook_instance_name=$Notebook_Name" -e "libs=$Libs" -e
+          "application=$notebook_app" docker.datalab-$notebook_app --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_list_available_libs/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_list_available_libs/config.xml
index 9a5da7d..5449371 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_list_available_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_list_available_libs/config.xml
@@ -70,7 +70,11 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/notebook_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action
+      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/notebook_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_reconfigure_spark/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_reconfigure_spark/config.xml
index 2f9a65a..80bac79 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_reconfigure_spark/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/notebook_reconfigure_spark/config.xml
@@ -75,7 +75,12 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/notebook_reconfigure_spark/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action
+      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/notebook_reconfigure_spark/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; |
+          sed "s|SPC|${Spark_configurations}|g" | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/notebook:/logs/notebook
+          docker.datalab-${notebook_app} --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/recreate_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/recreate_edge_node/config.xml
index 6a97dc5..c14649d 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/recreate_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/recreate_edge_node/config.xml
@@ -67,7 +67,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/recreate_edge_node/template.json | sed &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EIS/&apos;${instance_shape}&apos;/g&apos; | sed &apos;s/AUI/&apos;${Ad_User_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/edge:/logs/edge docker.dlab-edge --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/recreate_edge_node/template.json | sed
+          &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EIS/&apos;${instance_shape}&apos;/g&apos; | sed
+          &apos;s/AUI/&apos;${Ad_User_Name}&apos;/g&apos; | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/edge:/logs/edge docker.datalab-edge --action $Action
+          ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_data_engine/config.xml
index 5544510..32db042 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_data_engine/config.xml
@@ -66,7 +66,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EXN/&apos;${Exploratory_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-dataengine --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+          | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EXN/&apos;${Exploratory_Name}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          docker.datalab-dataengine --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_edge_node/config.xml
index 07c72f9..ffaec38 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_edge_node/config.xml
@@ -53,7 +53,10 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-edge --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          docker.datalab-edge --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_notebook_server/config.xml
index 1344e62..c159c56 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/start_notebook_server/config.xml
@@ -93,8 +93,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>
-        rand=`openssl rand -hex 10`; creds=$git_creds;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_notebook_server/template.json | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/AURT/&apos;${User_Refresh_Token}&apos;/g&apos; | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-${notebook_app} --action $Action
+          rand=`openssl rand -hex 10`; creds=$git_creds;
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_notebook_server/template.json | sed
+          &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed
+          &apos;s/AURT/&apos;${User_Refresh_Token}&apos;/g&apos; | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i
+          -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response docker.datalab-${notebook_app}
+          --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_data_engine/config.xml
index 9b45c81..1a0ee57 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_data_engine/config.xml
@@ -66,7 +66,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EXN/&apos;${Exploratory_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-dataengine --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+          | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EXN/&apos;${Exploratory_Name}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          docker.datalab-dataengine --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_edge_node/config.xml
index 37c74cd..24e2992 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_edge_node/config.xml
@@ -53,7 +53,10 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-edge --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          docker.datalab-edge --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_notebook_server/config.xml
index 3611b2f..e08ae91 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/stop_notebook_server/config.xml
@@ -72,7 +72,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_notebook_server/template.json |  sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; |  sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-${notebook_app} --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_notebook_server/template.json | sed
+          &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo
+          docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          docker.datalab-${notebook_app} --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_data_engine/config.xml
index 17c152b..db4a1fb 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_data_engine/config.xml
@@ -63,7 +63,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-dataengine --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_data_engine/template.json | sed
+          &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed
+          &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response docker.datalab-dataengine --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_edge_node/config.xml
index fb5970e..8ab5bf8 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_edge_node/config.xml
@@ -53,7 +53,10 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_edge_node/template.json | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-edge --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_edge_node/template.json | sed
+          &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response docker.datalab-edge --action $Action ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_image/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_image/config.xml
index 5fa3342..361f805 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_image/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_image/config.xml
@@ -72,7 +72,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_notebook_image/template.json | sed &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/IMN/&apos;${Full_image_name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_notebook_image/template.json | sed
+          &apos;s/UN/&apos;${Username}&apos;/g&apos; | sed &apos;s/IMN/&apos;${Full_image_name}&apos;/g&apos; | sudo
+          docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/notebook:/logs/notebook
+          docker.datalab-${notebook_app} --action $Action ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_server/config.xml
index 57e4c1b..9a43b60 100644
--- a/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/azure/jenkins_jobs/terminate_notebook_server/config.xml
@@ -72,7 +72,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_notebook_server/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; |  sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-${notebook_app} --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_notebook_server/template.json |
+          sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo
+          docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          docker.datalab-${notebook_app} --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_cluster.json b/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_cluster.json
index 9f8367d..98f2300 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_cluster.json
+++ b/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_cluster.json
@@ -20,7 +20,7 @@
             "numInstances": "NUM_MASTERS",
             "machineTypeUri": "MASTER_INSTANCE",
             "diskConfig": {
-                "bootDiskSizeGb": 30,
+                "bootDiskSizeGb": 35,
                 "numLocalSsds": 0
             }
         },
@@ -28,7 +28,7 @@
             "numInstances": "NUM_SLAVES",
             "machineTypeUri": "SLAVE_INSTANCE",
             "diskConfig": {
-                "bootDiskSizeGb": 30,
+                "bootDiskSizeGb": 35,
                 "numLocalSsds": 0
             }
         },
diff --git a/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_cluster_with_gpu.json b/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_cluster_with_gpu.json
new file mode 100644
index 0000000..2cf9ef7
--- /dev/null
+++ b/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_cluster_with_gpu.json
@@ -0,0 +1,60 @@
+{
+    "projectId": "PROJECT_ID",
+    "clusterName": "CLUSTER_NAME",
+    "labels": "CLUSTER_LABEL",
+    "config": {
+        "configBucket": "CLUSTER_BUCKET",
+        "gceClusterConfig": {
+            "zoneUri": "CLUSTER_ZONE",
+            "subnetworkUri": "CLUSTER_SUBNET",
+            "internalIpOnly": "true",
+            "serviceAccount": "SERVICE_ACCOUNT",
+            "metadata": {
+                "ssh-keys": "SSH_USER:SSH_PUBKEY"
+            },
+            "tags": [
+                "CLUSTER_TAG"
+            ]
+        },
+        "masterConfig": {
+            "numInstances": "NUM_MASTERS",
+            "machineTypeUri": "MASTER_INSTANCE",
+            "diskConfig": {
+                "bootDiskSizeGb": 35,
+                "numLocalSsds": 0
+            },
+            "accelerators": [
+                {
+                    "acceleratorCount": "NUM_MASTERS_GPU_CORES",
+                    "acceleratorTypeUri": "MASTER_GPU_TYPE"
+                }
+            ]
+        },
+        "workerConfig": {
+            "numInstances": "NUM_SLAVES",
+            "machineTypeUri": "SLAVE_INSTANCE",
+            "diskConfig": {
+                "bootDiskSizeGb": 35,
+                "numLocalSsds": 0
+            },
+            "accelerators": [
+                {
+                    "acceleratorCount": "NUM_SLAVESS_GPU_CORES",
+                    "acceleratorTypeUri": "SLAVE_GPU_TYPE"
+                }
+            ]
+        },
+        "secondaryWorkerConfig": {
+            "numInstances": "NUM_SLAVES",
+            "isPreemptible": "true"
+        },
+        "softwareConfig": {
+            "imageVersion": "IMAGE_VERSION"
+        },
+        "initializationActions": [
+            {
+                "executableFile": "GPU_DRIVER"
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_livy-env.sh b/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_livy-env.sh
new file mode 100644
index 0000000..1d6166a
--- /dev/null
+++ b/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_livy-env.sh
@@ -0,0 +1,26 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+export SPARK_HOME=/usr/lib/spark
+export SPARK_CONF_DIR=/etc/spark/conf
+export HADOOP_CONF_DIR=/etc/hadoop/conf
+export LIVY_LOG_DIR=/var/log/livy
+export PYSPARK_PYTHON=/opt/conda/default/bin/python
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_livy.service b/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_livy.service
new file mode 100644
index 0000000..6969582
--- /dev/null
+++ b/infrastructure-provisioning/src/general/templates/gcp/dataengine-service_livy.service
@@ -0,0 +1,35 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+[Unit]
+Description=Apache Livy service
+After=network.target
+
+[Service]
+Group=root
+User=root
+Type=forking
+ExecStart=/usr/local/lib/livy/bin/livy-server start
+ExecStop=/usr/local/lib/livy/bin/livy-server stop
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/templates/gcp/interpreter_spark.json b/infrastructure-provisioning/src/general/templates/gcp/interpreter_spark.json
index 17e979d..1e503dd 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/interpreter_spark.json
+++ b/infrastructure-provisioning/src/general/templates/gcp/interpreter_spark.json
@@ -1,112 +1,5 @@
 {
   "interpreterSettings": {
-    "2C6RJRBD1": {
-      "id": "2C6RJRBD1",
-      "name": "local_interpreter_python2",
-      "group": "spark",
-      "properties": {
-        "zeppelin.spark.printREPLOutput": {
-            "propertyName": "zeppelin.spark.printREPLOutput",
-            "value": "true",
-            "description": "Print REPL output",
-            "type": "checkbox"
-          },
-        "zeppelin.dep.additionalRemoteRepository": {
-            "envName": "ZEPPELIN_DEP_ADDITIONALREMOTEREPOSITORY",
-            "propertyName": "zeppelin.dep.additionalRemoteRepository",
-            "value": "spark-packages,http://dl.bintray.com/spark-packages/maven,false;",
-            "description": "",
-            "type": "string"
-          },
-        "zeppelin.spark.sql.stacktrace": {
-            "envName": "ZEPPELIN_SPARK_SQL_STACKTRACE",
-            "propertyName": "zeppelin.spark.sql.stacktrace",
-            "value": "false",
-            "description": "",
-            "type": "checkbox"
-          },
-        "zeppelin.spark.importImplicit":{
-            "envName": "ZEPPELIN_SPARK_IMPORTIMPLICIT",
-            "propertyName": "zeppelin.spark.importImplicit",
-            "value": "true",
-            "description": "",
-            "type": "checkbox"
-          },
-        "zeppelin.spark.concurrentSQL": {
-            "envName": "ZEPPELIN_SPARK_CONCURRENTSQL",
-            "propertyName": "zeppelin.spark.concurrentSQL",
-            "value": "false",
-            "description": "",
-            "type": "checkbox"
-          },
-        "zeppelin.spark.useHiveContext": {
-            "envName": "ZEPPELIN_SPARK_USEHIVECONTEXT",
-            "propertyName": "zeppelin.spark.useHiveContext",
-            "value": "true",
-            "description": "Use HiveContext instead of SQLContext if it is true.",
-            "type": "checkbox"
-          },
-        "zeppelin.pyspark.python": {
-            "envName": "ZEPPELIN_PYSPARK_PYTHON",
-            "propertyName": "zeppelin.pyspark.python",
-            "value": "python",
-            "description": "",
-            "type": "string"
-          },
-        "zeppelin.dep.localrepo": {
-            "envName": "ZEPPELIN_DEP_LOCALREPO",
-            "propertyName": "zeppelin.dep.localrepo",
-            "value": "local-repo",
-            "description": "",
-            "type": "string"
-          },
-        "zeppelin.spark.maxResult": {
-            "envName": "ZEPPELIN_SPARK_MAXRESULT",
-            "propertyName": "zeppelin.spark.maxResult",
-            "value": "1000",
-            "description": "Max number of Spark SQL result to display.",
-            "type": "number"
-          },
-        "master":{
-            "envName": "Master",
-            "propertyName": "spark.master",
-            "value": "local[*]",
-            "description": "Spark master uri. ex) spark://masterhost:7077",
-            "type": "string"
-          },
-        "spark.app.name": {
-            "envName": "SPARK_APP_NAME",
-            "propertyName": "spark.app.name",
-            "value": "Zeppelin",
-            "description": "The name of spark application.",
-            "type": "string"
-          },
-        "spark.driver.memory": {
-              "envName": "MEMORY_DRIVER",
-              "propertyName": "spark.driver.memory",
-              "value": "DRIVER_MEMORY",
-              "description": "",
-              "type": "string"
-          }
-      },
-      "interpreterGroup": [
-        {
-          "class": "org.apache.zeppelin.spark.SparkInterpreter",
-          "name": "spark"
-        },
-        {
-          "class": "org.apache.zeppelin.spark.PySparkInterpreter",
-          "name": "pyspark"
-        }
-      ],
-      "dependencies": [],
-      "option": {
-        "remote": true,
-        "perNoteSession": false,
-        "perNoteProcess": false,
-        "isExistingProcess": false
-      }
-    },
     "2C6RJRBD2": {
       "id": "2C6RJRBD2",
       "name": "local_interpreter_python3",
@@ -201,6 +94,13 @@
               "value": "DRIVER_MEMORY",
               "description": "",
               "type": "string"
+          },
+        "spark.pyspark.python": {
+              "envName": "PYSPARK_PYTHON",
+              "propertyName": "spark.pyspark.python",
+              "value": "PYTHON_VENV_PATH",
+              "description": "",
+              "type": "string"
           }
       },
       "interpreterGroup": [
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_data_engine/config.xml
index 60fba5c..8b1c3c6 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_data_engine/config.xml
@@ -86,9 +86,22 @@
     <builders>
         <hudson.tasks.Shell>
             <command>rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_data_engine/template_prepare.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/GDMS/&apos;${Master_Node_Size}&apos;/g&apos; | sed &apos;s/GDSS/&apos;${Slave_Node_Size}&apos;/g&apos; |   sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-dataengine --action create;
+                sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+                /var/lib/jenkins/jobs/create_data_engine/template_prepare.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+                | sed &apos;s/GDMS/&apos;${Master_Node_Size}&apos;/g&apos; | sed &apos;s/GDSS/&apos;${Slave_Node_Size}&apos;/g&apos;
+                | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos;
+                | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed
+                &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v
+                /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+                /var/opt/datalab/log/dataengine:/logs/dataengine docker.datalab-dataengine --action create;
                 rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_data_engine/template_configure.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sudo docker run -i -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-${notebook_app} --action configure;
+                sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+                /var/lib/jenkins/jobs/create_data_engine/template_configure.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+                | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sed &apos;s/EIC/&apos;${Nodes_Count}&apos;/g&apos;
+                | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos;
+                | sed "s|SPC|${Spark_configurations}|g" | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+                /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/dataengine:/logs/dataengine
+                docker.datalab-${notebook_app} --action configure;
             </command>
         </hudson.tasks.Shell>
     </builders>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_dataengine-service/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_dataengine-service/config.xml
index a1d2393..325ba74 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_dataengine-service/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_dataengine-service/config.xml
@@ -112,9 +112,26 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_dataengine-service/template_prepare.json | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EXN/&apos;${exploratory_name}&apos;/g&apos; | sed &apos;s/CON/&apos;${computational_name}&apos;/g&apos; | sed &apos;s/IMC/&apos;${master_count}&apos;/g&apos; | sed &apos;s/ISC/&apos;${slave_count}&apos;/g&apos; | sed &apos;s/IPC/&apos;${preemptible_count}&apos;/g&apos; | sed &apos;s/DVER/&apos;${dataproc_version}&apos;/g&apos; | sed &apos;s/MIT/&apos;${master_instance_type}&apos;/g&apos; | sed &apos;s/SIT/&apos;${slave_instance_type}&apos;/g&apos; | sed &apos;s/NIN/&apos;${notebook_instance_name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine-service:/logs/dataengine-service  docker.dlab-dataengine-service --action create;
-rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_dataengine-service/template_configure.json | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/DVER/&apos;${dataproc_version}&apos;/g&apos; |  sed &apos;s/NIN/&apos;${notebook_instance_name}&apos;/g&apos; | sed &apos;s/EXN/&apos;${exploratory_name}&apos;/g&apos; | sed &apos;s/CON/&apos;${computational_name}&apos;/g&apos; |  sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine-service:/logs/dataengine-service  docker.dlab-${notebook_app} --action configure;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/create_dataengine-service/template_prepare.json | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/EXN/&apos;${exploratory_name}&apos;/g&apos; | sed &apos;s/CON/&apos;${computational_name}&apos;/g&apos;
+          | sed &apos;s/IMC/&apos;${master_count}&apos;/g&apos; | sed &apos;s/ISC/&apos;${slave_count}&apos;/g&apos; |
+          sed &apos;s/IPC/&apos;${preemptible_count}&apos;/g&apos; | sed &apos;s/DVER/&apos;${dataproc_version}&apos;/g&apos;
+          | sed &apos;s/MIT/&apos;${master_instance_type}&apos;/g&apos; | sed &apos;s/SIT/&apos;${slave_instance_type}&apos;/g&apos;
+          | sed &apos;s/NIN/&apos;${notebook_instance_name}&apos;/g&apos; | sudo docker run -i -v
+          /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/dataengine-service:/logs/dataengine-service docker.datalab-dataengine-service --action
+          create;
+          rand=`openssl rand -hex 10`;
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/create_dataengine-service/template_configure.json | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/DVER/&apos;${dataproc_version}&apos;/g&apos; | sed &apos;s/NIN/&apos;${notebook_instance_name}&apos;/g&apos;
+          | sed &apos;s/EXN/&apos;${exploratory_name}&apos;/g&apos; | sed &apos;s/CON/&apos;${computational_name}&apos;/g&apos;
+          | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -v
+          /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/dataengine-service:/logs/dataengine-service docker.datalab-${notebook_app} --action
+          configure;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_edge_node/config.xml
index 8ad0577..61d5448 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_edge_node/config.xml
@@ -62,7 +62,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_edge_node/template.json | sed &apos;s/UN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/edge:/logs/edge docker.dlab-edge --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_edge_node/template.json | sed &apos;s/UN/&apos;${Username}&apos;/g&apos;
+          | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/edge:/logs/edge docker.datalab-edge --action $Action
+          ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_notebook_server/config.xml
index e194549..24094b6 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/create_notebook_server/config.xml
@@ -112,7 +112,13 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`; creds=$git_creds;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_notebook_server/template.json | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/EXN/&apos;${exploratory_name}&apos;/g&apos; | sed &apos;s/NIT/&apos;${instance_shape}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; |  sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook  docker.dlab-${notebook_app} --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_notebook_server/template.json | sed
+          &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/EXN/&apos;${exploratory_name}&apos;/g&apos; |
+          sed &apos;s/NIT/&apos;${instance_shape}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v
+          /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine-service_install_additional_libs/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine-service_install_additional_libs/config.xml
index 3fe2b65..5ddce0c 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine-service_install_additional_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine-service_install_additional_libs/config.xml
@@ -65,11 +65,10 @@
             [
               {"group": "os_pkg", "name": "nmap"},
               {"group": "os_pkg", "name": "htop"},
-              {"group": "pip2", "name": "requests"},
               {"group": "pip3", "name": "configparser"},
               {"group": "r_pkg", "name": "rmarkdown"},
             ]
-            Types: for OS - os_pkg, for Python - pip2/pip3, for R - r_pkg
+            Types: for OS - os_pkg, for Python - pip3, for R - r_pkg
             NOTE: You need to escape each double quote.
             For Example: {\"group\": \"os_pkg\", \"name\": \"htop\"}
           </description>
@@ -87,7 +86,12 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; echo $rand; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine-service_install_additional_libs/template.json | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/ECN/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -e "libs=$Libs" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine-service:/logs/dataengine-service  docker.dlab-dataengine-service --action $Action;
+      <command>rand=`openssl rand -hex 10`; echo $rand; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine-service_install_additional_libs/template.json | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos;
+          | sed &apos;s/ECN/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sudo
+          docker run -i -e "conf_tag_resource_id=CTUN" -e "libs=$Libs" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/dataengine-service:/logs/dataengine-service
+          docker.datalab-dataengine-service --action $Action;
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine-service_list_available_libs/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine-service_list_available_libs/config.xml
index 2272981..7572891 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine-service_list_available_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine-service_list_available_libs/config.xml
@@ -70,7 +70,12 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine-service_list_available_libs/template.json | sed &apos;s/ECN/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine-service:/logs/dataengine-service docker.dlab-dataengine-service --action $Action
+      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine-service_list_available_libs/template.json | sed &apos;s/ECN/&apos;${Cluster_name}&apos;/g&apos;
+          | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo
+          docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/dataengine-service:/logs/dataengine-service docker.datalab-dataengine-service --action
+          $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_install_additional_libs/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_install_additional_libs/config.xml
index 1f21650..abc6599 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_install_additional_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_install_additional_libs/config.xml
@@ -61,11 +61,10 @@
             [
               {"group": "os_pkg", "name": "nmap"},
               {"group": "os_pkg", "name": "htop"},
-              {"group": "pip2", "name": "requests"},
               {"group": "pip3", "name": "configparser"},
               {"group": "r_pkg", "name": "rmarkdown"},
             ]
-            Types: for OS - os_pkg, for Python - pip2/pip3, for R - r_pkg
+            Types: for OS - os_pkg, for Python - pip3, for R - r_pkg
             NOTE: You need to escape each double quote.
             For Example: {\"group\": \"os_pkg\", \"name\": \"htop\"}
           </description>
@@ -84,8 +83,13 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine_install_additional_libs/template.json | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -e "libs=$Libs" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-dataengine --action $Action;
-            </command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine_install_additional_libs/template.json | sed &apos;s/APP/&apos;${application}&apos;/g&apos;
+          | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; |
+          sudo docker run -i -e "conf_tag_resource_id=CTUN" -e "libs=$Libs" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/dataengine:/logs/dataengine
+          docker.datalab-dataengine --action $Action;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_list_available_libs/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_list_available_libs/config.xml
index 4f25357..977a559 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_list_available_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_list_available_libs/config.xml
@@ -66,7 +66,11 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-dataengine --action $Action
+      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/APP/&apos;${application}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-dataengine --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_reconfigure_spark/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_reconfigure_spark/config.xml
index 5f08b2e..c8ceb71 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_reconfigure_spark/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/dataengine_reconfigure_spark/config.xml
@@ -77,8 +77,13 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-                sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/dataengine_install_additional_libs/template.json | sed &apos;s/APP/&apos;${application}&apos;/g&apos; | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine:/logs/dataengine  docker.dlab-dataengine --action $Action;
-            </command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/dataengine_install_additional_libs/template.json | sed &apos;s/APP/&apos;${application}&apos;/g&apos;
+          | sed &apos;s/NNM/&apos;${Notebook_name}&apos;/g&apos; | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+          | sed "s|SPC|${Spark_configurations}|g" | sed &apos;s/EUN/&apos;${User_name}&apos;/g&apos; | sudo docker run
+          -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          -v /var/opt/datalab/log/dataengine:/logs/dataengine docker.datalab-dataengine --action $Action;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/gitlab_server/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/gitlab_server/config.xml
index 88b9e75..ccbbf33 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/gitlab_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/gitlab_server/config.xml
@@ -90,22 +90,23 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>DLAB_PATH=&quot;/opt/dlab&quot;
-GITLAB_CONFIG_FILE=&quot;$DLAB_PATH/tmp/gitlab/gitlab.ini&quot;
-if [ ! -f $DLAB_PATH/tmp/gitlab/gitlab.ini.bak ]; then
-        sudo cp $GITLAB_CONFIG_FILE $DLAB_PATH/tmp/gitlab/gitlab.ini.bak
-fi
-sudo cp $DLAB_PATH/tmp/gitlab/gitlab.ini.bak $GITLAB_CONFIG_FILE
+        <command>DATALAB_PATH=&quot;/opt/datalab&quot;
+            GITLAB_CONFIG_FILE=&quot;$DATALAB_PATH/tmp/gitlab/gitlab.ini&quot;
+            if [ ! -f $DATALAB_PATH/tmp/gitlab/gitlab.ini.bak ]; then
+            sudo cp $GITLAB_CONFIG_FILE $DATALAB_PATH/tmp/gitlab/gitlab.ini.bak
+            fi
+            sudo cp $DATALAB_PATH/tmp/gitlab/gitlab.ini.bak $GITLAB_CONFIG_FILE
 
-sudo sed -i &quot;s/AWS_REGION/$Region/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/AWS_SUBNET_ID/$subnet_id/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/AWS_SG_IDS/$sg_ids/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/LDAP_HOST/$ldap_host/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/LDAP_USER/$ldap_user/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/LDAP_PASS/$ldap_pass/g&quot; $GITLAB_CONFIG_FILE
-sudo sed -i &quot;s/GITLAB_ROOT_PASSWORD/$root_password/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/AWS_REGION/$Region/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/AWS_SUBNET_ID/$subnet_id/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/AWS_SG_IDS/$sg_ids/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/LDAP_HOST/$ldap_host/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/LDAP_USER/$ldap_user/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/LDAP_PASS/$ldap_pass/g&quot; $GITLAB_CONFIG_FILE
+            sudo sed -i &quot;s/GITLAB_ROOT_PASSWORD/$root_password/g&quot; $GITLAB_CONFIG_FILE
 
-sudo /usr/bin/python $DLAB_PATH/tmp/gitlab/gitlab_deploy.py --action $Action</command>
+            sudo /usr/bin/python3 $DATALAB_PATH/tmp/gitlab/gitlab_deploy.py --action $Action
+        </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/manage_git_credentials/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/manage_git_credentials/config.xml
index 77696c4..cacb4bb 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/manage_git_credentials/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/manage_git_credentials/config.xml
@@ -88,8 +88,12 @@
   <builders>
     <hudson.tasks.Shell>
       <command>
-        rand=`openssl rand -hex 10`; creds=$git_creds;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/manage_git_credentials/template.json | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -e &quot;conf_tag_resource_id=CTUN&quot; -v /home/dlab-user/keys:/root/keys  -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook  docker.dlab-${notebook_app} --action $Action
+          rand=`openssl rand -hex 10`; creds=$git_creds;
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/manage_git_credentials/template.json | sed
+          &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed
+          &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -e &quot;conf_tag_resource_id=CTUN&quot;
+          -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_install_additional_libs/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_install_additional_libs/config.xml
index 0fb3bc3..719035d 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_install_additional_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_install_additional_libs/config.xml
@@ -65,11 +65,10 @@
             [
               {"group": "os_pkg", "name": "nmap"},
               {"group": "os_pkg", "name": "htop"},
-              {"group": "pip2", "name": "requests"},
               {"group": "pip3", "name": "configparser"},
               {"group": "r_pkg", "name": "rmarkdown"},
             ]
-            Types: for OS - os_pkg, for Python - pip2/pip3, for R - r_pkg
+            Types: for OS - os_pkg, for Python - pip3, for R - r_pkg
             NOTE: You need to escape each double quote.
             For Example: {\"group\": \"os_pkg\", \"name\": \"htop\"}
           </description>
@@ -87,7 +86,10 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; echo $rand; sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -e "conf_resource=notebook" -e "request_id=$rand" -e "edge_user_name=$Username" -e "notebook_instance_name=$Notebook_Name" -e "libs=$Libs" -e "application=$notebook_app" docker.dlab-$notebook_app --action $Action
+      <command>rand=`openssl rand -hex 10`; echo $rand; sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -e "conf_resource=notebook" -e "request_id=$rand" -e
+          "edge_user_name=$Username" -e "notebook_instance_name=$Notebook_Name" -e "libs=$Libs" -e
+          "application=$notebook_app" docker.datalab-$notebook_app --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_list_available_libs/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_list_available_libs/config.xml
index 9a5da7d..5449371 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_list_available_libs/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_list_available_libs/config.xml
@@ -70,7 +70,11 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/notebook_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action
+      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/notebook_list_available_libs/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_reconfigure_spark/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_reconfigure_spark/config.xml
index 42f3332..547b2e1 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_reconfigure_spark/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/notebook_reconfigure_spark/config.xml
@@ -75,7 +75,12 @@
   <concurrentBuild>false</concurrentBuild>
   <builders>
     <hudson.tasks.Shell>
-      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/notebook_reconfigure_spark/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; | sed "s|SPC|${Spark_configurations}|g" | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action
+      <command>rand=`openssl rand -hex 10`; sed &apos;s/RID/&apos;${rand}&apos;/g&apos;
+          /var/lib/jenkins/jobs/notebook_reconfigure_spark/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/APP/&apos;${notebook_app}&apos;/g&apos; |
+          sed "s|SPC|${Spark_configurations}|g" | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/notebook:/logs/notebook
+          docker.datalab-${notebook_app} --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/recreate_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/recreate_edge_node/config.xml
index 40b3acf..cbeaac0 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/recreate_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/recreate_edge_node/config.xml
@@ -62,7 +62,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_edge_node/template.json | sed &apos;s/UN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/edge:/logs/edge docker.dlab-edge --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/create_edge_node/template.json | sed &apos;s/UN/&apos;${Username}&apos;/g&apos;
+          | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response -v /var/opt/datalab/log/edge:/logs/edge docker.datalab-edge --action $Action
+          ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_data_engine/config.xml
index 5544510..32db042 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_data_engine/config.xml
@@ -66,7 +66,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EXN/&apos;${Exploratory_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-dataengine --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+          | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EXN/&apos;${Exploratory_Name}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          docker.datalab-dataengine --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_edge_node/config.xml
index db86eba..4a76355 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_edge_node/config.xml
@@ -53,7 +53,10 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-edge --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response docker.datalab-edge --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_notebook_server/config.xml
index 60ee866..b88d7cb 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/start_notebook_server/config.xml
@@ -88,8 +88,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>
-        rand=`openssl rand -hex 10`; creds=$git_creds;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_notebook_server/template.json | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-${notebook_app} --action $Action
+          rand=`openssl rand -hex 10`; creds=$git_creds;
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/start_notebook_server/template.json | sed
+          &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed
+          &quot;s/GIT/${creds}/g&quot; | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response docker.datalab-${notebook_app} --action $Action
       </command>
     </hudson.tasks.Shell>
   </builders>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_data_engine/config.xml
index 9b45c81..1a0ee57 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_data_engine/config.xml
@@ -66,7 +66,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EXN/&apos;${Exploratory_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-dataengine --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos;
+          | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/EXN/&apos;${Exploratory_Name}&apos;/g&apos; |
+          sudo docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response
+          docker.datalab-dataengine --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_edge_node/config.xml
index 12f84ff..7f2c221 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_edge_node/config.xml
@@ -53,7 +53,10 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-edge --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_edge_node/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos;
+          | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response docker.datalab-edge --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_notebook_server/config.xml
index 471cf0f..ed1e8aa 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/stop_notebook_server/config.xml
@@ -73,7 +73,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_notebook_server/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; |  sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/stop_notebook_server/template.json | sed
+          &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo
+          docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_data_engine/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_data_engine/config.xml
index 17c152b..db4a1fb 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_data_engine/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_data_engine/config.xml
@@ -63,7 +63,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_data_engine/template.json | sed &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-dataengine --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_data_engine/template.json | sed
+          &apos;s/CNAM/&apos;${Cluster_name}&apos;/g&apos; | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed
+          &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -v /home/datalab-user/keys:/root/keys -v
+          /opt/datalab/tmp/result:/response docker.datalab-dataengine --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_dataengine-service/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_dataengine-service/config.xml
index 56b81d7..8618e35 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_dataengine-service/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_dataengine-service/config.xml
@@ -63,7 +63,13 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_dataengine-service/template.json | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/DCN/&apos;${dataproc_cluster_name}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -e &quot;conf_tag_resource_id=${Service_base_name}&quot; -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/dataengine-service:/logs/dataengine-service docker.dlab-dataengine-service --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_dataengine-service/template.json |
+          sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/DCN/&apos;${dataproc_cluster_name}&apos;/g&apos;
+          | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -e &quot;conf_tag_resource_id=${Service_base_name}&quot;
+          -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/dataengine-service:/logs/dataengine-service docker.datalab-dataengine-service --action
+          $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_edge_node/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_edge_node/config.xml
index 94c1a9c..1f247f9 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_edge_node/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_edge_node/config.xml
@@ -53,7 +53,10 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_edge_node/template.json | sed &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response  docker.dlab-edge --action $Action ;</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_edge_node/template.json | sed
+          &apos;s/EUN/&apos;${Username}&apos;/g&apos; | sudo docker run -i -e "conf_tag_resource_id=CTUN" -v
+          /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response docker.datalab-edge --action $Action ;
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_notebook_server/config.xml b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_notebook_server/config.xml
index 2d23585..7d206ad 100644
--- a/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_notebook_server/config.xml
+++ b/infrastructure-provisioning/src/general/templates/gcp/jenkins_jobs/terminate_notebook_server/config.xml
@@ -72,7 +72,11 @@
   <builders>
     <hudson.tasks.Shell>
       <command>rand=`openssl rand -hex 10`;
-sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_notebook_server/template.json | sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo docker run -i -v /home/dlab-user/keys:/root/keys -v /opt/dlab/tmp/result:/response -v /var/opt/dlab/log/notebook:/logs/notebook docker.dlab-${notebook_app} --action $Action</command>
+          sed &apos;s/RID/&apos;${rand}&apos;/g&apos; /var/lib/jenkins/jobs/terminate_notebook_server/template.json |
+          sed &apos;s/NUN/&apos;${Username}&apos;/g&apos; | sed &apos;s/NIN/&apos;${Notebook_Name}&apos;/g&apos; | sudo
+          docker run -i -v /home/datalab-user/keys:/root/keys -v /opt/datalab/tmp/result:/response -v
+          /var/opt/datalab/log/notebook:/logs/notebook docker.datalab-${notebook_app} --action $Action
+      </command>
     </hudson.tasks.Shell>
   </builders>
   <publishers/>
diff --git a/infrastructure-provisioning/src/general/templates/os/debian/livy.service b/infrastructure-provisioning/src/general/templates/os/debian/livy.service
new file mode 100644
index 0000000..a37f1f8
--- /dev/null
+++ b/infrastructure-provisioning/src/general/templates/os/debian/livy.service
@@ -0,0 +1,35 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+[Unit]
+Description=Apache Livy service
+After=network.target
+
+[Service]
+Group=OS_USER
+User=OS_USER
+Type=forking
+ExecStart=/opt/livy/bin/livy-server start
+ExecStop=/opt/livy/bin/livy-server stop
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/templates/os/debian/spark-master.service b/infrastructure-provisioning/src/general/templates/os/debian/spark-master.service
index 070560d..31fc7f6 100644
--- a/infrastructure-provisioning/src/general/templates/os/debian/spark-master.service
+++ b/infrastructure-provisioning/src/general/templates/os/debian/spark-master.service
@@ -26,7 +26,7 @@
 After=network-online.target
 
 [Service]
-User=dlab-user
+User=datalab-user
 Type=forking
 ExecStart=/opt/spark/sbin/start-all.sh
 ExecStop=/opt/spark/sbin/stop-all.sh
diff --git a/infrastructure-provisioning/src/general/templates/os/debian/spark-slave.service b/infrastructure-provisioning/src/general/templates/os/debian/spark-slave.service
index d4f6662..1bb56ac 100644
--- a/infrastructure-provisioning/src/general/templates/os/debian/spark-slave.service
+++ b/infrastructure-provisioning/src/general/templates/os/debian/spark-slave.service
@@ -26,7 +26,7 @@
 After=network-online.target
 
 [Service]
-User=dlab-user
+User=datalab-user
 Type=forking
 ExecStart=/opt/spark/sbin/start-slave.sh MASTER
 ExecStop=/opt/spark/sbin/stop-slave.sh
diff --git a/infrastructure-provisioning/src/general/templates/os/livy-env.sh b/infrastructure-provisioning/src/general/templates/os/livy-env.sh
new file mode 100644
index 0000000..38dfc4d
--- /dev/null
+++ b/infrastructure-provisioning/src/general/templates/os/livy-env.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# LIVY ENVIRONMENT VARIABLES
+#
+export SPARK_HOME=/opt/spark
+export SPARK_CONF_DIR=/opt/spark/conf
+export LIVY_LOG_DIR=/var/log/livy
+export PYSPARK_PYTHON=python3
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/templates/os/py3spark_local_template.json b/infrastructure-provisioning/src/general/templates/os/py3spark_local_template.json
index 969228e..428524d 100644
--- a/infrastructure-provisioning/src/general/templates/os/py3spark_local_template.json
+++ b/infrastructure-provisioning/src/general/templates/os/py3spark_local_template.json
@@ -1,18 +1,20 @@
 {
  "argv": [
-  "/usr/bin/python3.5",
+  "PYTHON_VENV_PATH",
   "-m",
   "ipykernel",
   "-f",
   "{connection_file}"
  ],
  "language": "python",
- "display_name": "Local PySpark (Python-3.5 / Spark-SP_VER )",
+ "display_name": "Local PySpark (Python-PYTHON_VENV_VERSION / Spark-SP_VER )",
  "env": {
-  "PYSPARK_PYTHON": "python3.5",
+  "PYSPARK_PYTHON": "pythonPYTHON_VENV_SHORT_VERSION",
   "SPARK_HOME": "/opt/spark/",
   "PYTHONPATH": "PY4J:/opt/spark/python/:",
   "PYTHONSTARTUP": "/opt/spark/python/pyspark/shell.py",
   "PYSPARK_SUBMIT_ARGS": "--name LocalPySpark pyspark-shell"
  }
-}
\ No newline at end of file
+}
+
+
diff --git a/infrastructure-provisioning/src/general/templates/os/pyspark_local_template.json b/infrastructure-provisioning/src/general/templates/os/pyspark_local_template.json
index 56b0090..1001f0f 100644
--- a/infrastructure-provisioning/src/general/templates/os/pyspark_local_template.json
+++ b/infrastructure-provisioning/src/general/templates/os/pyspark_local_template.json
@@ -1,15 +1,15 @@
 {
  "argv": [
-  "/usr/bin/python2.7",
+  "/usr/bin/python3.8",
   "-m",
   "ipykernel",
   "-f",
   "{connection_file}"
  ],
  "language": "python",
- "display_name": "Local PySpark (Python-2.7 / Spark-SP_VER )",
+ "display_name": "Local PySpark (Python-3.8 / Spark-SP_VER )",
  "env": {
-  "PYSPARK_PYTHON": "python2.7",
+  "PYSPARK_PYTHON": "python3.8",
   "SPARK_HOME": "/opt/spark/",
   "PYTHONPATH": "PY4J:/opt/spark/python/:",
   "PYTHONSTARTUP": "/opt/spark/python/pyspark/shell.py",
diff --git a/infrastructure-provisioning/src/general/templates/os/redhat/spark-master.service b/infrastructure-provisioning/src/general/templates/os/redhat/spark-master.service
index 070560d..31fc7f6 100644
--- a/infrastructure-provisioning/src/general/templates/os/redhat/spark-master.service
+++ b/infrastructure-provisioning/src/general/templates/os/redhat/spark-master.service
@@ -26,7 +26,7 @@
 After=network-online.target
 
 [Service]
-User=dlab-user
+User=datalab-user
 Type=forking
 ExecStart=/opt/spark/sbin/start-all.sh
 ExecStop=/opt/spark/sbin/stop-all.sh
diff --git a/infrastructure-provisioning/src/general/templates/os/redhat/spark-slave.service b/infrastructure-provisioning/src/general/templates/os/redhat/spark-slave.service
index d4f6662..1bb56ac 100644
--- a/infrastructure-provisioning/src/general/templates/os/redhat/spark-slave.service
+++ b/infrastructure-provisioning/src/general/templates/os/redhat/spark-slave.service
@@ -26,7 +26,7 @@
 After=network-online.target
 
 [Service]
-User=dlab-user
+User=datalab-user
 Type=forking
 ExecStart=/opt/spark/sbin/start-slave.sh MASTER
 ExecStop=/opt/spark/sbin/stop-slave.sh
diff --git a/infrastructure-provisioning/src/general/templates/os/renew_certificates.sh b/infrastructure-provisioning/src/general/templates/os/renew_certificates.sh
index ff3e46d..fb94eb5 100644
--- a/infrastructure-provisioning/src/general/templates/os/renew_certificates.sh
+++ b/infrastructure-provisioning/src/general/templates/os/renew_certificates.sh
@@ -21,7 +21,7 @@
 #
 # ******************************************************************************
 
-KEYSTORE_PASS=$(cat /opt/dlab/conf/CONF_FILE.yml  | grep '<#assign KEY_STORE_PASSWORD' | awk -F  '\"' '{print $2}')
+KEYSTORE_PASS=$(cat /opt/datalab/conf/CONF_FILE.yml  | grep '<#assign KEY_STORE_PASSWORD' | awk -F  '\"' '{print $2}')
 
 # Removing old certificates
 keytool -delete -alias RESOURCE_TYPE -keystore /home/OS_USER/keys/RESOURCE_TYPE.keystore.jks -storepass "${KEYSTORE_PASS}"
@@ -30,13 +30,13 @@
 keytool -delete -alias RESOURCE_TYPE -keystore JAVA_HOME/lib/security/cacerts -storepass changeit
 
 # Importing new certificates to keystore
-openssl pkcs12 -export -in /etc/ssl/certs/dlab.crt -inkey /etc/ssl/certs/dlab.key -name RESOURCE_TYPE -out /home/OS_USER/keys/RESOURCE_TYPE.p12 -password pass:${KEYSTORE_PASS}
+openssl pkcs12 -export -in /etc/ssl/certs/datalab.crt -inkey /etc/ssl/certs/datalab.key -name RESOURCE_TYPE -out /home/OS_USER/keys/RESOURCE_TYPE.p12 -password pass:${KEYSTORE_PASS}
 keytool -importkeystore -srckeystore /home/OS_USER/keys/RESOURCE_TYPE.p12 -srcstoretype PKCS12 -alias RESOURCE_TYPE -destkeystore /home/OS_USER/keys/RESOURCE_TYPE.keystore.jks -deststorepass "${KEYSTORE_PASS}" -srcstorepass "${KEYSTORE_PASS}"
 keytool -keystore /home/OS_USER/keys/RESOURCE_TYPE.keystore.jks -alias step-ca -import -file  /etc/ssl/certs/root_ca.crt  -deststorepass "${KEYSTORE_PASS}" -noprompt
 
 
 # Adding new certificates
-keytool -importcert -trustcacerts -alias RESOURCE_TYPE -file /etc/ssl/certs/dlab.crt -noprompt -storepass changeit -keystore JAVA_HOME/lib/security/cacerts
+keytool -importcert -trustcacerts -alias RESOURCE_TYPE -file /etc/ssl/certs/datalab.crt -noprompt -storepass changeit -keystore JAVA_HOME/lib/security/cacerts
 keytool -importcert -trustcacerts -alias step-ca -file /etc/ssl/certs/root_ca.crt -noprompt -storepass changeit -keystore JAVA_HOME/lib/security/cacerts
 
 # Restarting service
diff --git a/infrastructure-provisioning/src/general/templates/os/sparkmagic_config_template.json b/infrastructure-provisioning/src/general/templates/os/sparkmagic_config_template.json
new file mode 100644
index 0000000..e6fa8ef
--- /dev/null
+++ b/infrastructure-provisioning/src/general/templates/os/sparkmagic_config_template.json
@@ -0,0 +1,20 @@
+{
+  "kernel_python_credentials" : {
+    "username": "",
+    "password": "",
+    "url": "http://LIVY_HOST:8998",
+    "auth": "None"
+  },
+  "kernel_scala_credentials" : {
+    "username": "",
+    "password": "",
+    "url": "http://LIVY_HOST:8998",
+    "auth": "None"
+  },
+  "kernel_r_credentials": {
+    "username": "",
+    "password": "",
+    "url": "http://LIVY_HOST:8998",
+    "auth": "None"
+  }
+}
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/general/templates/os/tensorboard.service b/infrastructure-provisioning/src/general/templates/os/tensorboard.service
index a4a1d68..c6ecaaf 100644
--- a/infrastructure-provisioning/src/general/templates/os/tensorboard.service
+++ b/infrastructure-provisioning/src/general/templates/os/tensorboard.service
@@ -25,7 +25,7 @@
 [Service]
 Type=simple
 PIDFile=/var/run/tensorboard.pid
-ExecStart=/bin/bash -c "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64; tensorboard --logdir=/var/log/tensorboard --port 6006"
+ExecStart=/bin/bash -l -c "VENV_ACTIVATION && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/cudnn/lib64:/usr/local/cuda/lib64; tensorboard --logdir=/var/log/tensorboard --host 0.0.0.0 --port 6006"
 ExecStop=/bin/bash -c "for i in $(ps aux | grep 'tensorboard' | grep -v grep | awk '{print $2}'); do kill -9 $i; done"
 User=OS_USR
 Group=OS_USR
diff --git a/infrastructure-provisioning/src/jupyter/fabfile.py b/infrastructure-provisioning/src/jupyter/fabfile.py
index 7b3f23d..2dd2cd0 100644
--- a/infrastructure-provisioning/src/jupyter/fabfile.py
+++ b/infrastructure-provisioning/src/jupyter/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,18 +22,20 @@
 # ******************************************************************************
 
 import logging
-import json
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
 import os
+import sys
 import uuid
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 
 # Main function for provisioning notebook server
-def run():
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
+@task
+def run(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
@@ -44,7 +46,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('common_prepare_notebook', params))
+        subprocess.run("~/scripts/{}.py {}".format('common_prepare_notebook', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing Notebook node.", str(err))
@@ -52,7 +54,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('jupyter_configure', params))
+        subprocess.run("~/scripts/{}.py {}".format('jupyter_configure', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Notebook node.", str(err))
@@ -60,14 +62,15 @@
 
 
 # Main function for terminating exploratory environment
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed terminating Notebook node.", str(err))
@@ -75,14 +78,15 @@
 
 
 # Main function for stopping notebook server
-def stop():
+@task
+def stop(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_stop_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_stop_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed stopping Notebook node.", str(err))
@@ -90,7 +94,8 @@
 
 
 # Main function for starting notebook server
-def start():
+@task
+def start(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -98,7 +103,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_start_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_start_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed starting Notebook node.", str(err))
@@ -106,7 +111,8 @@
 
 
 # Main function for configuring notebook server after deploying DataEngine service
-def configure():
+@task
+def configure(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -115,9 +121,9 @@
 
     try:
         if os.environ['conf_resource'] == 'dataengine-service':
-            local("~/scripts/{}.py".format('common_notebook_configure_dataengine-service'))
+            subprocess.run("~/scripts/{}.py".format('common_notebook_configure_dataengine-service'), shell=True, check=True)
         elif os.environ['conf_resource'] == 'dataengine':
-            local("~/scripts/{}.py".format('common_notebook_configure_dataengine'))
+            subprocess.run("~/scripts/{}.py".format('common_notebook_configure_dataengine'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring analytical tool on Notebook node.", str(err))
@@ -125,7 +131,8 @@
 
 
 # Main function for installing additional libraries for notebook
-def install_libs():
+@task
+def install_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -134,7 +141,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_install_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_install_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed installing additional libs for Notebook node.", str(err))
@@ -142,7 +149,8 @@
 
 
 # Main function for get available libraries for notebook
-def list_libs():
+@task
+def list_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -151,7 +159,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_list_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_list_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed get available libraries for notebook node.", str(err))
@@ -159,7 +167,8 @@
 
 
 # Main function for manage git credentials on notebook
-def git_creds():
+@task
+def git_creds(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -168,7 +177,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_git_creds'))
+        subprocess.run("~/scripts/{}.py".format('notebook_git_creds'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to manage git credentials for notebook node.", str(err))
@@ -176,7 +185,8 @@
 
 
 # Main function for creating image from notebook
-def create_image():
+@task
+def create_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -185,7 +195,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_create_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_create_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -193,7 +203,8 @@
 
 
 # Main function for deleting existing notebook image
-def terminate_image():
+@task
+def terminate_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -202,7 +213,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -210,7 +221,8 @@
 
 
 # Main function for reconfiguring Spark for notebook
-def reconfigure_spark():
+@task
+def reconfigure_spark(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -219,14 +231,15 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_reconfigure_spark'))
+        subprocess.run("~/scripts/{}.py".format('notebook_reconfigure_spark'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to reconfigure Spark for Notebook node.", str(err))
         sys.exit(1)
 
 # Main function for checking inactivity status
-def check_inactivity():
+@task
+def check_inactivity(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -235,7 +248,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_inactivity_check'))
+        subprocess.run("~/scripts/{}.py".format('notebook_inactivity_check'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to check inactivity status.", str(err))
diff --git a/infrastructure-provisioning/src/jupyter/scripts/configure_jupyter_node.py b/infrastructure-provisioning/src/jupyter/scripts/configure_jupyter_node.py
index 94ad123..76c5fbf 100644
--- a/infrastructure-provisioning/src/jupyter/scripts/configure_jupyter_node.py
+++ b/infrastructure-provisioning/src/jupyter/scripts/configure_jupyter_node.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,12 +22,11 @@
 # ******************************************************************************
 
 import argparse
-import json
-import sys
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
 import os
+import sys
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -46,14 +45,15 @@
 spark_version = args.spark_version
 hadoop_version = args.hadoop_version
 jupyter_version = os.environ['notebook_jupyter_version']
-scala_link = "http://www.scala-lang.org/files/archive/"
+python_venv_version = os.environ['notebook_python_venv_version']
+scala_link = "https://www.scala-lang.org/files/archive/"
 if args.region == 'cn-north-1':
     spark_link = "http://mirrors.hust.edu.cn/apache/spark/spark-" + spark_version + "/spark-" + spark_version + \
                  "-bin-hadoop" + hadoop_version + ".tgz"
 else:
     spark_link = "https://archive.apache.org/dist/spark/spark-" + spark_version + "/spark-" + spark_version + \
                  "-bin-hadoop" + hadoop_version + ".tgz"
-
+python_venv_path = '/opt/python/python{0}/bin/python{1}'.format(python_venv_version, python_venv_version[:3])
 pyspark_local_path_dir = '/home/' + args.os_user + '/.local/share/jupyter/kernels/pyspark_local/'
 py3spark_local_path_dir = '/home/' + args.os_user + '/.local/share/jupyter/kernels/py3spark_local/'
 jupyter_conf_file = '/home/' + args.os_user + '/.local/share/jupyter/jupyter_notebook_config.py'
@@ -63,8 +63,8 @@
 templates_dir = '/root/templates/'
 files_dir = '/root/files/'
 local_spark_path = '/opt/spark/'
-toree_link = 'http://archive.apache.org/dist/incubator/toree/0.2.0-incubating/toree-pip/toree-0.2.0.tar.gz'
-r_libs = ['R6', 'pbdZMQ', 'RCurl', 'devtools', 'reshape2', 'caTools', 'rJava', 'ggplot2']
+toree_link = 'https://dist.apache.org/repos/dist/dev/incubator/toree/0.5.0-incubating-rc1/toree-pip/toree-0.5.0.tar.gz'
+r_libs = ['R6', 'pbdZMQ={}'.format(os.environ['notebook_pbdzmq_version']), 'RCurl', 'reshape2', 'caTools={}'.format(os.environ['notebook_catools_version']), 'rJava', 'ggplot2']
 gitlab_certfile = os.environ['conf_gitlab_certfile']
 
 
@@ -73,15 +73,14 @@
 ##############
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     # PREPARE DISK
     print("Prepare .ensure directory")
     try:
-        if not exists('/home/' + args.os_user + '/.ensure_dir'):
-            sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
+        if not exists(conn,'/home/' + args.os_user + '/.ensure_dir'):
+            conn.sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
     except:
         sys.exit(1)
     print("Mount additional volume")
@@ -95,11 +94,13 @@
     if os.environ['notebook_r_enabled'] == 'true':
         print("Installing R")
         ensure_r(args.os_user, r_libs, args.region, args.r_mirror)
-    print("Install Python 2 modules")
-    ensure_python2_libraries(args.os_user)
     print("Install Python 3 modules")
     ensure_python3_libraries(args.os_user)
 
+    # INSTALL PYTHON IN VIRTUALENV
+    print("Configure Python Virtualenv")
+    ensure_python_venv(python_venv_version)
+
     # INSTALL JUPYTER NOTEBOOK
     print("Install Jupyter")
     configure_jupyter(args.os_user, jupyter_conf_file, templates_dir, jupyter_version, args.exploratory_name)
@@ -107,17 +108,19 @@
     # INSTALL SPARK AND CLOUD STORAGE JARS FOR SPARK
     print("Install local Spark")
     ensure_local_spark(args.os_user, spark_link, spark_version, hadoop_version, local_spark_path)
-    local_spark_scala_version = sudo('spark-submit --version 2>&1 | grep -o -P "Scala version \K.{0,7}"')
+    local_spark_scala_version = conn.run(
+        'export PATH=$PATH:' + local_spark_path + 'bin/; spark-submit --version 2>&1 | grep -o -P "Scala version \K.{0,7}"').stdout.replace(
+        '\n', '')
     print("Install storage jars")
     ensure_local_jars(args.os_user, jars_dir)
     print("Configure local Spark")
     configure_local_spark(jars_dir, templates_dir)
 
     # INSTALL JUPYTER KERNELS
-    print("Install pyspark local kernel for Jupyter")
-    ensure_pyspark_local_kernel(args.os_user, pyspark_local_path_dir, templates_dir, spark_version)
+    #print("Install pyspark local kernel for Jupyter")
+    #ensure_pyspark_local_kernel(args.os_user, pyspark_local_path_dir, templates_dir, spark_version)
     print("Install py3spark local kernel for Jupyter")
-    ensure_py3spark_local_kernel(args.os_user, py3spark_local_path_dir, templates_dir, spark_version)
+    ensure_py3spark_local_kernel(args.os_user, py3spark_local_path_dir, templates_dir, spark_version, python_venv_path, python_venv_version)
     print("Install Toree-Scala kernel for Jupyter")
     ensure_toree_local_kernel(args.os_user, toree_link, scala_kernel_path, files_dir, local_spark_scala_version, spark_version)
     if os.environ['notebook_r_enabled'] == 'true':
@@ -129,7 +132,7 @@
     install_nodejs(args.os_user)
     print("Install ungit")
     install_ungit(args.os_user, args.exploratory_name, args.edge_ip)
-    if exists('/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
+    if exists(conn, '/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
         install_gitlab_cert(args.os_user, gitlab_certfile)
 
     # INSTALL INACTIVITY CHECKER
@@ -149,6 +152,7 @@
     #POST INSTALLATION PROCESS
     print("Updating pyOpenSSL library")
     update_pyopenssl_lib(args.os_user)
+    print("Removing unexisting kernels")
+    remove_unexisting_kernel(args.os_user)
 
-
-
+    conn.close()
diff --git a/infrastructure-provisioning/src/jupyterlab/fabfile.py b/infrastructure-provisioning/src/jupyterlab/fabfile.py
index 110981c..e2e7fc7 100644
--- a/infrastructure-provisioning/src/jupyterlab/fabfile.py
+++ b/infrastructure-provisioning/src/jupyterlab/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,18 +22,20 @@
 # ******************************************************************************
 
 import logging
-import json
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
 import os
+import sys
 import uuid
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 
 # Main function for provisioning notebook server
-def run():
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
+@task
+def run(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
@@ -44,7 +46,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('common_prepare_notebook', params))
+        subprocess.run("~/scripts/{}.py {}".format('common_prepare_notebook', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing Notebook node.", str(err))
@@ -52,7 +54,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('jupyterlab_configure', params))
+        subprocess.run("~/scripts/{}.py {}".format('jupyterlab_configure', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Notebook node.", str(err))
@@ -60,14 +62,15 @@
 
 
 # Main function for terminating exploratory environment
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed terminating Notebook node.", str(err))
@@ -75,14 +78,15 @@
 
 
 # Main function for stopping notebook server
-def stop():
+@task
+def stop(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_stop_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_stop_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed stopping Notebook node.", str(err))
@@ -90,7 +94,8 @@
 
 
 # Main function for starting notebook server
-def start():
+@task
+def start(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -98,7 +103,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_start_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_start_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed starting Notebook node.", str(err))
@@ -106,7 +111,8 @@
 
 
 # Main function for configuring notebook server after deploying DataEngine service
-def configure():
+@task
+def configure(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -115,9 +121,9 @@
 
     try:
         if os.environ['conf_resource'] == 'dataengine-service':
-            local("~/scripts/{}.py".format('common_notebook_configure_dataengine-service'))
+            subprocess.run("~/scripts/{}.py".format('common_notebook_configure_dataengine-service'), shell=True, check=True)
         elif os.environ['conf_resource'] == 'dataengine':
-            local("~/scripts/{}.py".format('common_notebook_configure_dataengine'))
+            subprocess.run("~/scripts/{}.py".format('common_notebook_configure_dataengine'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring analytical tool on Notebook node.", str(err))
@@ -125,7 +131,8 @@
 
 
 # Main function for installing additional libraries for notebook
-def install_libs():
+@task
+def install_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -134,7 +141,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_install_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_install_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed installing additional libs for Notebook node.", str(err))
@@ -142,7 +149,8 @@
 
 
 # Main function for get available libraries for notebook
-def list_libs():
+@task
+def list_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -151,7 +159,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_list_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_list_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed get available libraries for notebook node.", str(err))
@@ -159,7 +167,8 @@
 
 
 # Main function for manage git credentials on notebook
-def git_creds():
+@task
+def git_creds(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -168,7 +177,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_git_creds'))
+        subprocess.run("~/scripts/{}.py".format('notebook_git_creds'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to manage git credentials for notebook node.", str(err))
@@ -176,7 +185,8 @@
 
 
 # Main function for creating image from notebook
-def create_image():
+@task
+def create_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -185,7 +195,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_create_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_create_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -193,7 +203,8 @@
 
 
 # Main function for deleting existing notebook image
-def terminate_image():
+@task
+def terminate_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -202,7 +213,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -210,7 +221,8 @@
 
 
 # Main function for reconfiguring Spark for notebook
-def reconfigure_spark():
+@task
+def reconfigure_spark(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -219,7 +231,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_reconfigure_spark'))
+        subprocess.run("~/scripts/{}.py".format('notebook_reconfigure_spark'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to reconfigure Spark for Notebook node.", str(err))
diff --git a/infrastructure-provisioning/src/jupyterlab/scripts/configure_jupyterlab_node.py b/infrastructure-provisioning/src/jupyterlab/scripts/configure_jupyterlab_node.py
index 1486ff3..928f868 100644
--- a/infrastructure-provisioning/src/jupyterlab/scripts/configure_jupyterlab_node.py
+++ b/infrastructure-provisioning/src/jupyterlab/scripts/configure_jupyterlab_node.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,12 +22,11 @@
 # ******************************************************************************
 
 import argparse
-import json
-import sys
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
 import os
+import sys
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -46,7 +45,7 @@
 spark_version = args.spark_version
 hadoop_version = args.hadoop_version
 jupyter_version = os.environ['notebook_jupyter_version']
-scala_link = "http://www.scala-lang.org/files/archive/"
+scala_link = "https://www.scala-lang.org/files/archive/"
 if args.region == 'cn-north-1':
     spark_link = "http://mirrors.hust.edu.cn/apache/spark/spark-" + spark_version + "/spark-" + spark_version + \
                  "-bin-hadoop" + hadoop_version + ".tgz"
@@ -71,8 +70,8 @@
 templates_dir = '/root/templates/'
 files_dir = '/root/files/'
 local_spark_path = '/opt/spark/'
-toree_link = 'http://archive.apache.org/dist/incubator/toree/0.2.0-incubating/toree-pip/toree-0.2.0.tar.gz'
-r_libs = ['R6', 'pbdZMQ', 'RCurl', 'devtools', 'reshape2', 'caTools', 'rJava', 'ggplot2']
+toree_link = 'http://archive.apache.org/dist/incubator/toree/0.3.0-incubating/toree-pip/toree-0.3.0.tar.gz'
+r_libs = ['R6', 'pbdZMQ={}'.format(os.environ['notebook_pbdzmq_version']), 'RCurl', 'reshape2', 'caTools={}'.format(os.environ['notebook_catools_version']), 'rJava', 'ggplot2']
 gitlab_certfile = os.environ['conf_gitlab_certfile']
 
 
@@ -81,15 +80,14 @@
 ##############
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     # PREPARE DISK
     print("Prepare .ensure directory")
     try:
-        if not exists('/home/' + args.os_user + '/.ensure_dir'):
-            sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
+        if not exists(conn,'/home/' + args.os_user + '/.ensure_dir'):
+            conn.sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
     except:
         sys.exit(1)
     print("Mount additional volume")
@@ -108,9 +106,11 @@
     install_nodejs(args.os_user)
     print("Install ungit")
     install_ungit(args.os_user, args.exploratory_name, args.edge_ip)
-    if exists('/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
+    if exists(conn, '/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
         install_gitlab_cert(args.os_user, gitlab_certfile)
 
     # INSTALL INACTIVITY CHECKER
     print("Install inactivity checker")
-    install_inactivity_checker(args.os_user, args.ip_address)
\ No newline at end of file
+    install_inactivity_checker(args.os_user, args.ip_address)
+
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/project/fabfile.py b/infrastructure-provisioning/src/project/fabfile.py
index 385704e..27a02d1 100644
--- a/infrastructure-provisioning/src/project/fabfile.py
+++ b/infrastructure-provisioning/src/project/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,39 +21,40 @@
 #
 # ******************************************************************************
 
-import json
-from fabric.api import *
 import logging
-import sys
 import os
-from dlab.fab import *
+import sys
 import traceback
+from datalab.fab import *
+from fabric import *
+import subprocess
 
-
-def run():
+@task
+def run(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
-                                            os.environ['request_id'])
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/project/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('project_prepare'))
+        subprocess.run("~/scripts/{}.py".format('project_prepare'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing Project.", str(err))
         sys.exit(1)
 
     try:
-        local("~/scripts/{}.py".format('edge_configure'))
+        subprocess.run("~/scripts/{}.py".format('edge_configure'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Edge node.", str(err))
         sys.exit(1)
 
 # Main function for terminating EDGE node and exploratory environment if exists
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/project/" + local_log_filename
@@ -61,8 +62,31 @@
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('project_terminate'))
+        subprocess.run("~/scripts/{}.py".format('project_terminate'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed terminating Edge node.", str(err))
+        sys.exit(1)
+
+# Main function for EDGE node creation if it was terminated or failed
+@task
+def recreate(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'],  os.environ['project_name'], os.environ['request_id'])
+    local_log_filepath = "/logs/edge/" + local_log_filename
+    logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
+                        level=logging.DEBUG,
+                        filename=local_log_filepath)
+
+    try:
+        subprocess.run("~/scripts/{}.py".format('project_prepare'), shell=True, check=True)
+    except Exception as err:
+        traceback.print_exc()
+        append_result("Failed preparing Edge node.", str(err))
+        sys.exit(1)
+
+    try:
+        subprocess.run("~/scripts/{}.py".format('edge_configure'), shell=True, check=True)
+    except Exception as err:
+        traceback.print_exc()
+        append_result("Failed configuring Edge node.", str(err))
         sys.exit(1)
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/project/scripts/configure_http_proxy.py b/infrastructure-provisioning/src/project/scripts/configure_http_proxy.py
index bad50ad..a692145 100644
--- a/infrastructure-provisioning/src/project/scripts/configure_http_proxy.py
+++ b/infrastructure-provisioning/src/project/scripts/configure_http_proxy.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,12 +21,12 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
-from dlab.edge_lib import configure_http_proxy_server
 import argparse
 import json
 import sys
+from datalab.edge_lib import configure_http_proxy_server
+from fabric import *
+from datalab.fab import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -41,12 +41,13 @@
 if __name__ == "__main__":
     print("Configure connections")
     try:
-        env['connection_attempts'] = 100
-        env.key_filename = [args.keyfile]
-        env.host_string = '{}@{}'.format(args.user, args.hostname)
+        global conn
+        conn = datalab.fab.init_datalab_connection(args.hostname, args.user, args.keyfile)
         deeper_config = json.loads(args.additional_config)
     except:
         sys.exit(2)
 
     print("Installing proxy for notebooks.")
     configure_http_proxy_server(deeper_config)
+
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/project/scripts/configure_keycloak.py b/infrastructure-provisioning/src/project/scripts/configure_keycloak.py
index 80e7501..11850c7 100644
--- a/infrastructure-provisioning/src/project/scripts/configure_keycloak.py
+++ b/infrastructure-provisioning/src/project/scripts/configure_keycloak.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,13 @@
 #
 # ******************************************************************************
 
-import logging
-import json
-import sys
-import requests
 import argparse
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-import os
+import logging
+import requests
+import uuid
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--service_base_name', type=str, default='')
diff --git a/infrastructure-provisioning/src/project/scripts/configure_nftables.py b/infrastructure-provisioning/src/project/scripts/configure_nftables.py
new file mode 100644
index 0000000..b3c24a9
--- /dev/null
+++ b/infrastructure-provisioning/src/project/scripts/configure_nftables.py
@@ -0,0 +1,52 @@
+#!/usr/bin/python3
+
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+import argparse
+import json
+import sys
+from datalab.edge_lib import configure_nftables
+from fabric import *
+from datalab.fab import *
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--hostname', type=str, default='')
+parser.add_argument('--keyfile', type=str, default='')
+parser.add_argument('--user', type=str, default='')
+parser.add_argument('--additional_config', type=str, default='{"empty":"string"}')
+args = parser.parse_args()
+
+##############
+# Run script #
+##############
+if __name__ == "__main__":
+    print("Configure connections")
+    try:
+        global conn
+        conn = datalab.fab.init_datalab_connection(args.hostname, args.user, args.keyfile)
+        deeper_config = json.loads(args.additional_config)
+    except:
+        sys.exit(2)
+
+    print("Configuring nftables on edge node.")
+    configure_nftables(deeper_config)
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/project/scripts/configure_nginx_reverse_proxy.py b/infrastructure-provisioning/src/project/scripts/configure_nginx_reverse_proxy.py
index a4f0825..8baa5ce 100644
--- a/infrastructure-provisioning/src/project/scripts/configure_nginx_reverse_proxy.py
+++ b/infrastructure-provisioning/src/project/scripts/configure_nginx_reverse_proxy.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,13 +21,14 @@
 #
 # ******************************************************************************
 
-import logging
-from fabric.api import *
 import argparse
-import sys
+import logging
 import os
-from dlab.common_lib import ensure_step
-from dlab.edge_lib import install_nginx_lua
+import sys
+from datalab.common_lib import ensure_step
+from datalab.edge_lib import install_nginx_lua
+from fabric import *
+from datalab.fab import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -49,9 +50,8 @@
 
     print("Configure connections")
     try:
-        env['connection_attempts'] = 100
-        env.key_filename = [args.keyfile]
-        env.host_string = '{}@{}'.format(args.user, args.hostname)
+        global conn
+        conn = datalab.fab.init_datalab_connection(args.hostname, args.user, args.keyfile)
     except Exception as err:
         print("Failed establish connection. Excpeption: " + str(err))
         sys.exit(1)
@@ -71,3 +71,4 @@
         print("Failed install nginx reverse proxy: " + str(err))
         sys.exit(1)
 
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/project/scripts/reupload_ssh_key.py b/infrastructure-provisioning/src/project/scripts/reupload_ssh_key.py
index b853af5..4f8483b 100644
--- a/infrastructure-provisioning/src/project/scripts/reupload_ssh_key.py
+++ b/infrastructure-provisioning/src/project/scripts/reupload_ssh_key.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,15 +21,15 @@
 #
 # ******************************************************************************
 
+import logging
 import os
 import sys
-import logging
 import traceback
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
-from fabric.api import *
-import multiprocessing
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
+from fabric import *
 
 if __name__ == "__main__":
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
@@ -58,7 +58,7 @@
                 os.environ['conf_resource'], reupload_config['resource_id'],
                 reupload_config['os_user'],  reupload_config['keyfile'],
                 json.dumps(reupload_config['additional_config']))
-            local("~/scripts/{}.py {}".format('common_reupload_key', params))
+            subprocess.run("~/scripts/{}.py {}".format('common_reupload_key', params), shell=True, check=True)
         except Exception as err:
             traceback.print_exc()
             raise Exception
diff --git a/infrastructure-provisioning/src/project/templates/conf.d/proxy.conf b/infrastructure-provisioning/src/project/templates/conf.d/proxy.conf
index a58147f..c9ce32b 100644
--- a/infrastructure-provisioning/src/project/templates/conf.d/proxy.conf
+++ b/infrastructure-provisioning/src/project/templates/conf.d/proxy.conf
@@ -34,8 +34,8 @@
     # SSL section
     proxy_buffering off;
     ssl on;
-    ssl_certificate /etc/ssl/certs/dlab.crt;
-    ssl_certificate_key /etc/ssl/certs/dlab.key;
+    ssl_certificate /etc/ssl/certs/datalab.crt;
+    ssl_certificate_key /etc/ssl/certs/datalab.key;
     ssl_session_timeout 5m;
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
     ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
diff --git a/infrastructure-provisioning/src/project/templates/nftables.conf b/infrastructure-provisioning/src/project/templates/nftables.conf
new file mode 100644
index 0000000..39ac40b
--- /dev/null
+++ b/infrastructure-provisioning/src/project/templates/nftables.conf
@@ -0,0 +1,43 @@
+#!/usr/sbin/nft -f
+
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+flush ruleset
+
+table inet filter {
+        chain input {
+                type filter hook input priority 0;
+        }
+        chain forward {
+                type filter hook forward priority 0;
+        }
+        chain output {
+                type filter hook output priority 0;
+        }
+}
+
+table ip nat {
+        chain postrouting {
+                type nat hook postrouting priority 100; policy accept;
+                ip saddr SUBNET_CIDR oif "INTERFACE" snat to EDGE_IP
+        }
+}
diff --git a/infrastructure-provisioning/src/project/templates/nginx.conf b/infrastructure-provisioning/src/project/templates/nginx.conf
index d012375..698e25d 100644
--- a/infrastructure-provisioning/src/project/templates/nginx.conf
+++ b/infrastructure-provisioning/src/project/templates/nginx.conf
@@ -19,25 +19,29 @@
 #
 # ******************************************************************************
 user nginx;
-worker_processes 1;
-error_log /var/log/nginx/error.log;
-pid /run/nginx.pid;
+worker_processes  1;
 
-load_module /etc/nginx/modules/ndk_http_module.so;
-load_module /etc/nginx/modules/ngx_http_lua_module.so;
+error_log  logs/error.log;
+error_log  logs/error.log  notice;
+error_log  logs/error.log  info;
 
-include /usr/share/nginx/modules/*.conf;
+pid        logs/nginx.pid;
+
 
 events {
-    worker_connections 1024;
+    worker_connections  1024;
 }
 
+
 http {
+    include       mime.types;
+    default_type  application/octet-stream;
+
     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';
 
-    access_log  /var/log/nginx/access.log  main;
+    access_log  logs/access.log  main;
 
     sendfile            on;
     tcp_nopush          on;
@@ -50,11 +54,6 @@
     resolver 8.8.8.8;
     resolver_timeout 10s;
 
-    include             /etc/nginx/mime.types;
-    default_type        application/octet-stream;
-
-    lua_shared_dict discovery 1m;
-    lua_shared_dict jwks 1m;
-
-    include /etc/nginx/conf.d/*.conf;
+    include /usr/local/openresty/nginx/conf/conf.d/*.conf;
 }
+
diff --git a/infrastructure-provisioning/src/project/templates/squid.conf b/infrastructure-provisioning/src/project/templates/squid.conf
index 0129e00..9d45c44 100644
--- a/infrastructure-provisioning/src/project/templates/squid.conf
+++ b/infrastructure-provisioning/src/project/templates/squid.conf
@@ -21,7 +21,7 @@
 
 auth_param basic program LDAP_AUTH_PATH -b "LDAP_DN" -D "LDAP_SERVICE_USERNAME,LDAP_DN" -w LDAP_SERVICE_PASSWORD -f uid=%s LDAP_HOST
 
-acl DLab_user_src_subnet src PROXY_SUBNET
+acl DataLab_user_src_subnet src PROXY_SUBNET
 VPC_CIDRS
 ALLOWED_CIDRS
 
@@ -45,7 +45,7 @@
 http_access deny !Safe_ports
 http_access allow localhost manager
 http_access deny manager
-http_access allow DLab_user_src_subnet
+http_access allow DataLab_user_src_subnet
 http_access allow AllowedCIDRS ldap-auth
 http_access allow localhost
 http_access deny all
diff --git a/infrastructure-provisioning/src/rstudio/fabfile.py b/infrastructure-provisioning/src/rstudio/fabfile.py
index 35ef372..62bca6e 100644
--- a/infrastructure-provisioning/src/rstudio/fabfile.py
+++ b/infrastructure-provisioning/src/rstudio/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,18 +22,20 @@
 # ******************************************************************************
 
 import logging
-import json
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
 import os
+import sys
 import uuid
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 
 # Main function for provisioning notebook server
-def run():
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
+@task
+def run(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
@@ -44,7 +46,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('common_prepare_notebook', params))
+        subprocess.run("~/scripts/{}.py {}".format('common_prepare_notebook', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing Notebook node.", str(err))
@@ -52,7 +54,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('rstudio_configure', params))
+        subprocess.run("~/scripts/{}.py {}".format('rstudio_configure', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Notebook node.", str(err))
@@ -60,14 +62,15 @@
 
 
 # Main function for terminating exploratory environment
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed terminating Notebook node.", str(err))
@@ -75,14 +78,15 @@
 
 
 # Main function for stopping notebook server
-def stop():
+@task
+def stop(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_stop_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_stop_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed stopping Notebook node.", str(err))
@@ -90,7 +94,8 @@
 
 
 # Main function for starting notebook server
-def start():
+@task
+def start(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -98,7 +103,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_start_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_start_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed starting Notebook node.", str(err))
@@ -106,7 +111,8 @@
 
 
 # Main function for configuring notebook server after deploying DataEngine service
-def configure():
+@task
+def configure(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -115,16 +121,17 @@
 
     try:
         if os.environ['conf_resource'] == 'dataengine-service':
-            local("~/scripts/{}.py".format('common_notebook_configure_dataengine-service'))
+            subprocess.run("~/scripts/{}.py".format('common_notebook_configure_dataengine-service'), shell=True, check=True)
         elif os.environ['conf_resource'] == 'dataengine':
-            local("~/scripts/{}.py".format('common_notebook_configure_dataengine'))
+            subprocess.run("~/scripts/{}.py".format('common_notebook_configure_dataengine'), shell=True, check=True)
     except Exception as err:
         append_result("Failed configuring analytical tool on Notebook node.", str(err))
         sys.exit(1)
 
 
 # Main function for installing additional libraries for notebook
-def install_libs():
+@task
+def install_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -133,7 +140,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_install_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_install_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed installing additional libs for Notebook node.", str(err))
@@ -141,7 +148,8 @@
 
 
 # Main function for get available libraries for notebook
-def list_libs():
+@task
+def list_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -150,7 +158,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_list_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_list_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed get available libraries for notebook node.", str(err))
@@ -158,7 +166,8 @@
 
 
 # Main function for manage git credentials on notebook
-def git_creds():
+@task
+def git_creds(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -167,7 +176,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_git_creds'))
+        subprocess.run("~/scripts/{}.py".format('notebook_git_creds'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to manage git credentials for notebook node.", str(err))
@@ -175,7 +184,8 @@
 
 
 # Main function for creating image from notebook
-def create_image():
+@task
+def create_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -184,7 +194,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_create_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_create_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -192,7 +202,8 @@
 
 
 # Main function for deleting existing notebook image
-def terminate_image():
+@task
+def terminate_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -201,7 +212,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -209,7 +220,8 @@
 
 
 # Main function for reconfiguring Spark for notebook
-def reconfigure_spark():
+@task
+def reconfigure_spark(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -218,14 +230,15 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_reconfigure_spark'))
+        subprocess.run("~/scripts/{}.py".format('notebook_reconfigure_spark'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to reconfigure Spark for Notebook node.", str(err))
         sys.exit(1)
 
 # Main function for checking inactivity status
-def check_inactivity():
+@task
+def check_inactivity(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -234,7 +247,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_inactivity_check'))
+        subprocess.run("~/scripts/{}.py".format('notebook_inactivity_check'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to check inactivity status.", str(err))
diff --git a/infrastructure-provisioning/src/rstudio/scripts/configure_rstudio_node.py b/infrastructure-provisioning/src/rstudio/scripts/configure_rstudio_node.py
index 34fb007..df84c99 100644
--- a/infrastructure-provisioning/src/rstudio/scripts/configure_rstudio_node.py
+++ b/infrastructure-provisioning/src/rstudio/scripts/configure_rstudio_node.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-from dlab.actions_lib import *
-from dlab.common_lib import *
-from dlab.notebook_lib import *
-from dlab.fab import *
-from fabric.api import *
-from fabric.contrib.files import exists
 import argparse
-import json
-import sys
 import os
+import sys
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -47,6 +47,8 @@
 
 spark_version = os.environ['notebook_spark_version']
 hadoop_version = os.environ['notebook_hadoop_version']
+python_venv_version = os.environ['notebook_python_venv_version']
+python_venv_path = '/opt/python/python{0}/bin/python{1}'.format(python_venv_version, python_venv_version[:3])
 if args.region == 'cn-north-1':
     spark_link = "http://mirrors.hust.edu.cn/apache/spark/spark-" + spark_version + "/spark-" + spark_version + \
                  "-bin-hadoop" + hadoop_version + ".tgz"
@@ -57,8 +59,8 @@
 jars_dir = '/opt/jars/'
 templates_dir = '/root/templates/'
 files_dir = '/root/files/'
-r_libs = ['R6', 'pbdZMQ', 'RCurl', 'devtools', 'reshape2', 'caTools', 'rJava', 'ggplot2', 'evaluate', 'formatR', 'yaml',
-          'Rcpp', 'rmarkdown', 'base64enc', 'tibble']
+r_libs = ['R6', 'pbdZMQ={}'.format(os.environ['notebook_pbdzmq_version']), 'RCurl', 'reshape2', 'caTools={}'.format(os.environ['notebook_catools_version']), 'rJava', 'ggplot2', 'evaluate', 'formatR', 'yaml',
+          'Rcpp', 'rmarkdown', 'base64enc', 'tibble', 'sparklyr']
 gitlab_certfile = os.environ['conf_gitlab_certfile']
 
 
@@ -67,15 +69,14 @@
 ##############
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     # PREPARE DISK
     print("Prepare .ensure directory")
     try:
-        if not exists('/home/' + args.os_user + '/.ensure_dir'):
-            sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
+        if not exists(conn,'/home/' + args.os_user + '/.ensure_dir'):
+            conn.sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
     except:
         sys.exit(1)
     print("Mount additional volume")
@@ -86,14 +87,16 @@
     ensure_jre_jdk(args.os_user)
     print("Install R")
     ensure_r(args.os_user, r_libs, args.region, args.r_mirror)
-    print("Install Python 2 modules")
-    ensure_python2_libraries(args.os_user)
     print("Install Python 3 modules")
     ensure_python3_libraries(args.os_user)
 
+    # INSTALL PYTHON IN VIRTUALENV
+    print("Configure Python Virtualenv")
+    ensure_python_venv(python_venv_version)
+
     # INSTALL RSTUDIO
     print("Install RStudio")
-    install_rstudio(args.os_user, local_spark_path, args.rstudio_pass, args.rstudio_version)
+    install_rstudio(args.os_user, local_spark_path, args.rstudio_pass, args.rstudio_version, python_venv_version)
 
     # INSTALL SPARK AND CLOUD STORAGE JARS FOR SPARK
     print("Install local Spark")
@@ -108,7 +111,7 @@
     install_nodejs(args.os_user)
     print("Install Ungit")
     install_ungit(args.os_user, args.exploratory_name, args.edge_ip)
-    if exists('/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
+    if exists(conn, '/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
         install_gitlab_cert(args.os_user, gitlab_certfile)
 
     # INSTALL INACTIVITY CHECKER
@@ -117,4 +120,6 @@
 
     #POST INSTALLATION PROCESS
     print("Updating pyOpenSSL library")
-    update_pyopenssl_lib(args.os_user)
\ No newline at end of file
+    update_pyopenssl_lib(args.os_user)
+
+    conn.close()
diff --git a/infrastructure-provisioning/src/ssn/fabfile.py b/infrastructure-provisioning/src/ssn/fabfile.py
index 29c3cc5..79243cd 100644
--- a/infrastructure-provisioning/src/ssn/fabfile.py
+++ b/infrastructure-provisioning/src/ssn/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,17 +21,16 @@
 #
 # ******************************************************************************
 
-import json
 import logging
 import os
 import sys
-from fabric.api import *
-from dlab.fab import *
 import traceback
 import uuid
+from datalab.fab import *
+from fabric import *
 
-
-def run():
+@task
+def run(ctx):
     local_log_filename = "{}_{}.log".format(os.environ['conf_resource'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -40,21 +39,21 @@
     ssn_config = dict()
     ssn_config['ssn_unique_index'] = str(uuid.uuid4())[:5]
     try:
-        local("~/scripts/{}.py --ssn_unique_index {}".format('ssn_prepare', ssn_config['ssn_unique_index']))
+        subprocess.run("~/scripts/{}.py --ssn_unique_index {}".format('ssn_prepare', ssn_config['ssn_unique_index']), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing SSN node.", str(err))
         sys.exit(1)
 
     try:
-        local("~/scripts/{}.py --ssn_unique_index {}".format('ssn_configure', ssn_config['ssn_unique_index']))
+        subprocess.run("~/scripts/{}.py --ssn_unique_index {}".format('ssn_configure', ssn_config['ssn_unique_index']), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring SSN node.", str(err))
         sys.exit(1)
 
-
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}.log".format(os.environ['conf_resource'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -62,7 +61,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('ssn_terminate'))
+        subprocess.run("~/scripts/{}.py".format('ssn_terminate'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed terminating SSN node.", str(err))
diff --git a/infrastructure-provisioning/src/ssn/files/aws/mongo_roles.json b/infrastructure-provisioning/src/ssn/files/aws/mongo_roles.json
index 54d2cd6..fe0fc80 100644
--- a/infrastructure-provisioning/src/ssn/files/aws/mongo_roles.json
+++ b/infrastructure-provisioning/src/ssn/files/aws/mongo_roles.json
@@ -93,7 +93,7 @@
     "_id": "nbCreateDeeplearning",
     "description": "Create Notebook Deep Learning",
     "exploratories": [
-      "docker.dlab-deeplearning"
+      "docker.datalab-deeplearning"
     ],
     "groups": [
       "$anyuser"
@@ -103,7 +103,7 @@
     "_id": "nbCreateJupyter",
     "description": "Create Notebook Jupyter",
     "exploratories": [
-      "docker.dlab-jupyter"
+      "docker.datalab-jupyter"
     ],
     "groups": [
       "$anyuser"
@@ -113,7 +113,7 @@
     "_id": "nbCreateJupyterLab",
     "description": "Create Notebook JupyterLab",
     "exploratories": [
-      "docker.dlab-jupyterlab"
+      "docker.datalab-jupyterlab"
     ],
     "groups": [
       "$anyuser"
@@ -123,7 +123,7 @@
     "_id": "nbCreateRstudio",
     "description": "Create Notebook RStudio",
     "exploratories": [
-      "docker.dlab-rstudio"
+      "docker.datalab-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -133,7 +133,7 @@
     "_id": "nbCreateTensor",
     "description": "Create Notebook Jupyter with TensorFlow",
     "exploratories": [
-      "docker.dlab-tensor"
+      "docker.datalab-tensor"
     ],
     "groups": [
       "$anyuser"
@@ -143,7 +143,7 @@
     "_id": "nbCreateZeppelin",
     "description": "Create Notebook Apache Zeppelin",
     "exploratories": [
-      "docker.dlab-zeppelin"
+      "docker.datalab-zeppelin"
     ],
     "groups": [
       "$anyuser"
@@ -153,7 +153,7 @@
     "_id": "nbCreateTensorRstudio",
     "description": "Create Notebook RStudio with TensorFlow",
     "exploratories": [
-      "docker.dlab-tensor-rstudio"
+      "docker.datalab-tensor-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -163,7 +163,7 @@
     "_id": "nbCreateDataEngine",
     "description": "Create Data Engine",
     "computationals": [
-      "docker.dlab-dataengine"
+      "docker.datalab-dataengine"
     ],
     "groups": [
       "$anyuser"
@@ -173,7 +173,7 @@
     "_id": "nbCreateDataEngineService",
     "description": "Create Data Engine Service",
     "computationals": [
-      "docker.dlab-dataengine-service"
+      "docker.datalab-dataengine-service"
     ],
     "groups": [
       "$anyuser"
diff --git a/infrastructure-provisioning/src/ssn/files/azure/mongo_roles.json b/infrastructure-provisioning/src/ssn/files/azure/mongo_roles.json
index 305c46b..8da2754 100644
--- a/infrastructure-provisioning/src/ssn/files/azure/mongo_roles.json
+++ b/infrastructure-provisioning/src/ssn/files/azure/mongo_roles.json
@@ -83,7 +83,7 @@
     "_id": "nbCreateDeeplearning",
     "description": "Create Notebook Deep Learning",
     "exploratories": [
-      "docker.dlab-deeplearning"
+      "docker.datalab-deeplearning"
     ],
     "groups": [
       "$anyuser"
@@ -93,7 +93,7 @@
     "_id": "nbCreateJupyter",
     "description": "Create Notebook Jupyter",
     "exploratories": [
-      "docker.dlab-jupyter"
+      "docker.datalab-jupyter"
     ],
     "groups": [
       "$anyuser"
@@ -103,7 +103,7 @@
     "_id": "nbCreateRstudio",
     "description": "Create Notebook RStudio",
     "exploratories": [
-      "docker.dlab-rstudio"
+      "docker.datalab-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -113,7 +113,7 @@
     "_id": "nbCreateTensor",
     "description": "Create Notebook Jupyter with TensorFlow",
     "exploratories": [
-      "docker.dlab-tensor"
+      "docker.datalab-tensor"
     ],
     "groups": [
       "$anyuser"
@@ -123,7 +123,7 @@
     "_id": "nbCreateZeppelin",
     "description": "Create Notebook Apache Zeppelin",
     "exploratories": [
-      "docker.dlab-zeppelin"
+      "docker.datalab-zeppelin"
     ],
     "groups": [
       "$anyuser"
@@ -133,7 +133,7 @@
     "_id": "nbCreateDataEngine",
     "description": "Create Data Engine",
     "computationals": [
-      "docker.dlab-dataengine"
+      "docker.datalab-dataengine"
     ],
     "groups": [
       "$anyuser"
diff --git a/infrastructure-provisioning/src/ssn/files/gcp/mongo_roles.json b/infrastructure-provisioning/src/ssn/files/gcp/mongo_roles.json
index 43d12e3..badb966 100644
--- a/infrastructure-provisioning/src/ssn/files/gcp/mongo_roles.json
+++ b/infrastructure-provisioning/src/ssn/files/gcp/mongo_roles.json
@@ -73,7 +73,7 @@
     "_id": "nbCreateDeeplearning",
     "description": "Create Notebook Deep Learning",
     "exploratories": [
-      "docker.dlab-deeplearning"
+      "docker.datalab-deeplearning"
     ],
     "groups": [
       "$anyuser"
@@ -83,7 +83,7 @@
     "_id": "nbCreateJupyter",
     "description": "Create Notebook Jupyter",
     "exploratories": [
-      "docker.dlab-jupyter"
+      "docker.datalab-jupyter"
     ],
     "groups": [
       "$anyuser"
@@ -93,7 +93,7 @@
     "_id": "nbCreateJupyterLab",
     "description": "Create Notebook JupyterLab",
     "exploratories": [
-      "docker.dlab-jupyterlab"
+      "docker.datalab-jupyterlab"
     ],
     "groups": [
       "$anyuser"
@@ -103,7 +103,7 @@
     "_id": "nbCreateSuperset",
     "description": "Create Notebook Superset",
     "exploratories": [
-      "docker.dlab-superset"
+      "docker.datalab-superset"
     ],
     "groups": [
       "$anyuser"
@@ -113,7 +113,7 @@
     "_id": "nbCreateRstudio",
     "description": "Create Notebook RStudio",
     "exploratories": [
-      "docker.dlab-rstudio"
+      "docker.datalab-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -123,7 +123,7 @@
     "_id": "nbCreateTensor",
     "description": "Create Notebook Jupyter with TensorFlow",
     "exploratories": [
-      "docker.dlab-tensor"
+      "docker.datalab-tensor"
     ],
     "groups": [
       "$anyuser"
@@ -133,7 +133,7 @@
     "_id": "nbCreateTensorRstudio",
     "description": "Create Notebook RStudio with TensorFlow",
     "exploratories": [
-      "docker.dlab-tensor-rstudio"
+      "docker.datalab-tensor-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -143,7 +143,7 @@
     "_id": "nbCreateZeppelin",
     "description": "Create Notebook Apache Zeppelin",
     "exploratories": [
-      "docker.dlab-zeppelin"
+      "docker.datalab-zeppelin"
     ],
     "groups": [
       "$anyuser"
@@ -153,7 +153,7 @@
     "_id": "nbCreateDataEngine",
     "description": "Create Data Engine",
     "computationals": [
-      "docker.dlab-dataengine"
+      "docker.datalab-dataengine"
     ],
     "groups": [
       "$anyuser"
@@ -163,7 +163,7 @@
     "_id": "nbCreateDataEngineService",
     "description": "Create Data Engine Service",
     "computationals": [
-      "docker.dlab-dataengine-service"
+      "docker.datalab-dataengine-service"
     ],
     "groups": [
       "$anyuser"
diff --git a/infrastructure-provisioning/src/ssn/scripts/backup.py b/infrastructure-provisioning/src/ssn/scripts/backup.py
index 9792349..dc6d91c 100644
--- a/infrastructure-provisioning/src/ssn/scripts/backup.py
+++ b/infrastructure-provisioning/src/ssn/scripts/backup.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,42 +21,50 @@
 #
 # ******************************************************************************
 
-from time import gmtime, strftime
-from fabric.api import *
 import argparse
-import yaml
 import json
-import sys
 import os
+import sys
+import yaml
+from fabric import *
+from time import gmtime, strftime
+import subprocess
 
-parser = argparse.ArgumentParser(description="Backup script for DLab configs, keys, certs, jars, database & logs")
-parser.add_argument('--user', type=str, default='dlab-user', help='System username')
-parser.add_argument('--dlab_path', type=str, default='/opt/dlab/', help='Path to DLab. Default: /opt/dlab/')
-parser.add_argument('--configs', type=str, default='skip', help='Comma separated names of config files, like "security.yml", etc. Default: skip. Also available: all')
-parser.add_argument('--keys', type=str, default='skip', help='Comma separated names of keys, like "user_name.pub". Default: skip. Also available: all')
-parser.add_argument('--certs', type=str, default='skip', help='Comma separated names of SSL certificates and keys, like "dlab.crt", etc. Default: skip. Also available: all')
-parser.add_argument('--jars', type=str, default='skip', help='Comma separated names of jar application, like "self-service" (without .jar), etc. Default: skip. Also available: all')
-parser.add_argument('--db', action='store_true', default=False, help='Mongo DB. Key without arguments. Default: disable')
-parser.add_argument('--logs', action='store_true', default=False, help='All logs (include docker). Key without arguments. Default: disable')
+parser = argparse.ArgumentParser(description="Backup script for DataLab configs, keys, certs, jars, database & logs")
+parser.add_argument('--user', type=str, default='datalab-user', help='System username')
+parser.add_argument('--datalab_path', type=str, default='/opt/datalab/', help='Path to DataLab. Default: /opt/datalab/')
+parser.add_argument('--configs', type=str, default='skip',
+                    help='Comma separated names of config files, like "security.yml", etc. Default: skip. Also available: all')
+parser.add_argument('--keys', type=str, default='skip',
+                    help='Comma separated names of keys, like "user_name.pub". Default: skip. Also available: all')
+parser.add_argument('--certs', type=str, default='skip',
+                    help='Comma separated names of SSL certificates and keys, like "datalab.crt", etc. Default: skip. Also available: all')
+parser.add_argument('--jars', type=str, default='skip',
+                    help='Comma separated names of jar application, like "self-service" (without .jar), etc. Default: skip. Also available: all')
+parser.add_argument('--db', action='store_true', default=False,
+                    help='Mongo DB. Key without arguments. Default: disable')
+parser.add_argument('--logs', action='store_true', default=False,
+                    help='All logs (include docker). Key without arguments. Default: disable')
 parser.add_argument('--request_id', type=str, default='', help='Uniq request ID for response and backup')
-parser.add_argument('--result_path', type=str, default='/opt/dlab/tmp/result', help='Path to store backup and response files')
+parser.add_argument('--result_path', type=str, default='/opt/datalab/tmp/result',
+                    help='Path to store backup and response files')
 args = parser.parse_args()
 
 
 def backup_prepare():
     try:
-        local('mkdir {}'.format(temp_folder))
+        subprocess.run('mkdir {}'.format(temp_folder), shell=True, check=True)
         if args.configs != 'skip':
-            local('mkdir -p {0}conf'.format(temp_folder))
+            subprocess.run('mkdir -p {0}conf'.format(temp_folder), shell=True, check=True)
         if args.keys != 'skip':
-            local('mkdir -p {}keys'.format(temp_folder))
+            subprocess.run('mkdir -p {}keys'.format(temp_folder), shell=True, check=True)
         if args.certs != 'skip':
-            local('mkdir -p {}certs'.format(temp_folder))
+            subprocess.run('mkdir -p {}certs'.format(temp_folder), shell=True, check=True)
         if args.jars != 'skip':
-            local('mkdir -p {}jars'.format(temp_folder))
+            subprocess.run('mkdir -p {}jars'.format(temp_folder), shell=True, check=True)
         if args.logs:
-            local('mkdir -p {}logs'.format(temp_folder))
-            local('mkdir -p {}logs/docker'.format(temp_folder))
+            subprocess.run('mkdir -p {}logs'.format(temp_folder), shell=True, check=True)
+            subprocess.run('mkdir -p {}logs/docker'.format(temp_folder), shell=True, check=True)
     except Exception as err:
         append_result(error='Failed to create temp folder. {}'.format(str(err)))
         sys.exit(1)
@@ -68,10 +76,11 @@
         if args.configs == 'skip':
             print('Skipped config backup.')
         elif args.configs == 'all':
-            local("find {0}{2} -name '*yml' -exec cp {3} {1}{2} \;".format(args.dlab_path, temp_folder, conf_folder, "{}"))
+            subprocess.run("find {0}{2} -name '*yml' -exec cp {3} {1}{2} \;".format(args.datalab_path, temp_folder, conf_folder,
+                                                                           "{}"), shell=True, check=True)
         else:
             for conf_file in args.configs.split(','):
-                local('cp {0}{2}{3} {1}{2}'.format(args.dlab_path, temp_folder, conf_folder, conf_file))
+                subprocess.run('cp {0}{2}{3} {1}{2}'.format(args.datalab_path, temp_folder, conf_folder, conf_file), shell=True, check=True)
     except:
         append_result(error='Backup configs failed.')
         sys.exit(1)
@@ -83,10 +92,10 @@
         if args.keys == 'skip':
             print('Skipped keys backup.')
         elif args.keys == 'all':
-            local('cp {0}* {1}keys'.format(keys_folder, temp_folder))
+            subprocess.run('cp {0}* {1}keys'.format(keys_folder, temp_folder), shell=True, check=True)
         else:
             for key_file in args.keys.split(','):
-                local('cp {0}{1} {2}keys'.format(keys_folder, key_file, temp_folder))
+                subprocess.run('cp {0}{1} {2}keys'.format(keys_folder, key_file, temp_folder), shell=True, check=True)
     except:
         append_result(error='Backup keys failed.')
         sys.exit(1)
@@ -99,12 +108,12 @@
             print('Skipped certs backup.')
         elif args.certs == 'all':
             for cert in all_certs:
-                local('sudo cp {0}{1} {2}certs'.format(certs_folder, cert, temp_folder))
-                local('sudo chown {0}:{0} {1}certs/{2} '.format(os_user, temp_folder, cert))
+                subprocess.run('sudo cp {0}{1} {2}certs'.format(certs_folder, cert, temp_folder), shell=True, check=True)
+                subprocess.run('sudo chown {0}:{0} {1}certs/{2} '.format(os_user, temp_folder, cert), shell=True, check=True)
         else:
             for cert in args.certs.split(','):
-                local('cp {0}{1} {2}certs'.format(certs_folder, cert, temp_folder))
-                local('sudo chown {0}:{0} {1}certs/{2} '.format(os_user, temp_folder, cert))
+                subprocess.run('cp {0}{1} {2}certs'.format(certs_folder, cert, temp_folder), shell=True, check=True)
+                subprocess.run('sudo chown {0}:{0} {1}certs/{2} '.format(os_user, temp_folder, cert), shell=True, check=True)
     except:
         append_result(error='Backup certs failed.')
         sys.exit(1)
@@ -116,12 +125,12 @@
         if args.jars == 'skip':
             print('Skipped jars backup.')
         elif args.jars == 'all':
-            for root, dirs, files in os.walk('{0}{1}'.format(args.dlab_path, jars_folder)):
+            for root, dirs, files in os.walk('{0}{1}'.format(args.datalab_path, jars_folder)):
                 for service in dirs:
-                    local('cp -RP {0}{1}{2}* {3}jars'.format(args.dlab_path, jars_folder, service, temp_folder))
+                    subprocess.run('cp -RP {0}{1}{2}* {3}jars'.format(args.datalab_path, jars_folder, service, temp_folder), shell=True, check=True)
         else:
             for service in args.jars.split(','):
-                local('cp -RP {0}{1}{2}* {3}jars'.format(args.dlab_path, jars_folder, service, temp_folder))
+                subprocess.run('cp -RP {0}{1}{2}* {3}jars'.format(args.datalab_path, jars_folder, service, temp_folder), shell=True, check=True)
     except:
         append_result(error='Backup jars failed.')
         sys.exit(1)
@@ -131,12 +140,12 @@
     try:
         print('Backup db: {}'.format(args.db))
         if args.db:
-            ssn_conf = open('{0}{1}ssn.yml'.format(args.dlab_path, conf_folder)).read()
+            ssn_conf = open('{0}{1}ssn.yml'.format(args.datalab_path, conf_folder)).read()
             data = yaml.load('mongo{}'.format(ssn_conf.split('mongo')[-1]))
             with settings(hide('running')):
-                local("mongodump --host {0} --port {1} --username {2} --password '{3}' --db={4} --archive={5}mongo.db" \
+                subprocess.run("mongodump --host {0} --port {1} --username {2} --password '{3}' --db={4} --archive={5}mongo.db" \
                     .format(data['mongo']['host'], data['mongo']['port'], data['mongo']['username'],
-                            data['mongo']['password'], data['mongo']['database'], temp_folder))
+                            data['mongo']['password'], data['mongo']['database'], temp_folder), shell=True, check=True)
     except:
         append_result(error='Backup db failed.')
         sys.exit(1)
@@ -146,11 +155,12 @@
     try:
         print('Backup logs: {}'.format(args.logs))
         if args.logs:
-            print('Backup dlab logs')
-            local('cp -R {0}* {1}logs'.format(dlab_logs_folder, temp_folder))
+            print('Backup DataLab logs')
+            subprocess.run('cp -R {0}* {1}logs'.format(datalab_logs_folder, temp_folder), shell=True, check=True)
             print('Backup docker logs')
-            local("sudo find {0} -name '*log' -exec cp {2} {1}logs/docker \;".format(docker_logs_folder, temp_folder, "{}"))
-            local('sudo chown -R {0}:{0} {1}logs/docker'.format(os_user, temp_folder))
+            subprocess.run("sudo find {0} -name '*log' -exec cp {2} {1}logs/docker \;".format(docker_logs_folder, temp_folder,
+                                                                                     "{}"), shell=True, check=True)
+            subprocess.run('sudo chown -R {0}:{0} {1}logs/docker'.format(os_user, temp_folder), shell=True, check=True)
     except:
         append_result(error='Backup logs failed.')
         print('Backup logs failed.')
@@ -160,7 +170,7 @@
 def backup_finalize():
     try:
         print('Compressing all files to archive...')
-        local('cd {0} && tar -zcf {1} .'.format(temp_folder, dest_file))
+        subprocess.run('cd {0} && tar -zcf {1} .'.format(temp_folder, dest_file), shell=True, check=True)
     except Exception as err:
         append_result(error='Compressing backup failed. {}'.format(str(err)))
         sys.exit(1)
@@ -168,7 +178,7 @@
     try:
         print('Clear temp folder...')
         if temp_folder != '/':
-            local('rm -rf {}'.format(temp_folder))
+            subprocess.run('rm -rf {}'.format(temp_folder), shell=True, check=True)
     except Exception as err:
         append_result(error='Clear temp folder failed. {}'.format(str(err)))
         sys.exit(1)
@@ -191,13 +201,13 @@
 if __name__ == "__main__":
     backup_time = strftime('%d_%b_%Y_%H-%M-%S', gmtime())
     os_user = args.user
-    temp_folder = '/tmp/dlab_backup-{}/'.format(backup_time)
+    temp_folder = '/tmp/datalab_backup-{}/'.format(backup_time)
     conf_folder = 'conf/'
     keys_folder = '/home/{}/keys/'.format(os_user)
     certs_folder = '/etc/ssl/certs/'
-    all_certs = ['dhparam.pem', 'dlab.crt', 'dlab.key']
+    all_certs = ['dhparam.pem', 'datalab.crt', 'datalab.key']
     jars_folder = 'webapp/lib/'
-    dlab_logs_folder = '/var/log/dlab/'
+    datalab_logs_folder = '/var/log/datalab/'
     docker_logs_folder = '/var/lib/docker/containers/'
     dest_result = '{0}/backup_{1}.json'.format(args.result_path, args.request_id)
     dest_file = '{0}/backup_{1}.tar.gz'.format(args.result_path, args.request_id)
diff --git a/infrastructure-provisioning/src/ssn/scripts/configure_billing.py b/infrastructure-provisioning/src/ssn/scripts/configure_billing.py
index 1df44cc..f3357a5 100644
--- a/infrastructure-provisioning/src/ssn/scripts/configure_billing.py
+++ b/infrastructure-provisioning/src/ssn/scripts/configure_billing.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -21,22 +21,22 @@
 # ******************************************************************************
 
 
-from fabric.api import *
-import yaml, json, sys
 import argparse
-import os
+import sys
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--cloud_provider', type=str,
-                    help='Where DLab should be deployed. Available options: aws, azure')
-parser.add_argument('--infrastructure_tag', type=str, help='unique name for DLab environment')
+                    help='Where DataLab should be deployed. Available options: aws, azure')
+parser.add_argument('--infrastructure_tag', type=str, help='unique name for DataLab environment')
 parser.add_argument('--access_key_id', default='', type=str, help='AWS Access Key ID')
 parser.add_argument('--secret_access_key', default='', type=str, help='AWS Secret Access Key')
 parser.add_argument('--tag_resource_id', type=str, default='user:tag', help='The name of user tag')
-parser.add_argument('--billing_tag', type=str, default='dlab', help='Billing tag')
+parser.add_argument('--billing_tag', type=str, default='datalab', help='Billing tag')
 parser.add_argument('--account_id', type=str, help='The ID of ASW linked account')
 parser.add_argument('--billing_bucket', type=str, help='The name of bucket')
-parser.add_argument('--aws_job_enabled', type=str, default='false', help='Billing format. Available options: true (aws), false(epam)')
+parser.add_argument('--aws_job_enabled', type=str, default='false',
+                    help='Billing format. Available options: true (aws), false(epam)')
 parser.add_argument('--report_path', type=str, default='', help='The path to report folder')
 parser.add_argument('--client_id', type=str, default='', help='Azure client ID')
 parser.add_argument('--client_secret', type=str, default='', help='Azure client secret')
@@ -48,21 +48,30 @@
 parser.add_argument('--locale', type=str, default='', help='Azure locale')
 parser.add_argument('--region_info', type=str, default='', help='Azure region info')
 parser.add_argument('--mongo_password', type=str, help='The password for Mongo DB')
-parser.add_argument('--dlab_dir', type=str, help='The path to dlab dir')
-parser.add_argument('--dlab_id', type=str, default='resource_tags_user_user_tag', help='Column name in report file that contains dlab id tag')
-parser.add_argument('--usage_date', type=str, default='line_item_usage_start_date', help='Column name in report file that contains usage date tag')
-parser.add_argument('--product', type=str, default='product_product_name', help='Column name in report file that contains product name tag')
-parser.add_argument('--usage_type', type=str, default='line_item_usage_type', help='Column name in report file that contains usage type tag')
-parser.add_argument('--usage', type=str, default='line_item_usage_amount', help='Column name in report file that contains usage tag')
-parser.add_argument('--cost', type=str, default='line_item_blended_cost', help='Column name in report file that contains cost tag')
-parser.add_argument('--resource_id', type=str, default='line_item_resource_id', help='Column name in report file that contains dlab resource id tag')
-parser.add_argument('--tags', type=str, default='line_item_operation,line_item_line_item_description', help='Column name in report file that contains tags')
-parser.add_argument('--billing_dataset_name', type=str, default='', help='Name of gcp billing dataset (in big query service')
+parser.add_argument('--datalab_dir', type=str, help='The path to DataLab dir')
+parser.add_argument('--datalab_id', type=str, default='resource_tags_user_user_tag',
+                    help='Column name in report file that contains DataLab id tag')
+parser.add_argument('--usage_date', type=str, default='line_item_usage_start_date',
+                    help='Column name in report file that contains usage date tag')
+parser.add_argument('--product', type=str, default='product_product_name',
+                    help='Column name in report file that contains product name tag')
+parser.add_argument('--usage_type', type=str, default='line_item_usage_type',
+                    help='Column name in report file that contains usage type tag')
+parser.add_argument('--usage', type=str, default='line_item_usage_amount',
+                    help='Column name in report file that contains usage tag')
+parser.add_argument('--cost', type=str, default='line_item_blended_cost',
+                    help='Column name in report file that contains cost tag')
+parser.add_argument('--resource_id', type=str, default='line_item_resource_id',
+                    help='Column name in report file that contains DataLab resource id tag')
+parser.add_argument('--tags', type=str, default='line_item_operation,line_item_line_item_description',
+                    help='Column name in report file that contains tags')
+parser.add_argument('--billing_dataset_name', type=str, default='',
+                    help='Name of gcp billing dataset (in big query service')
 
 parser.add_argument('--mongo_host', type=str, default='localhost', help='Mongo DB host')
 parser.add_argument('--mongo_port', type=str, default='27017', help='Mongo DB port')
 parser.add_argument('--service_base_name', type=str, help='Service Base Name')
-parser.add_argument('--os_user', type=str, help='Dlab user')
+parser.add_argument('--os_user', type=str, help='DataLab user')
 parser.add_argument('--keystore_password', type=str, help='Keystore password')
 parser.add_argument('--keycloak_client_id', type=str, help='Keycloak client id')
 parser.add_argument('--keycloak_client_secret', type=str, help='Keycloak client secret')
@@ -90,7 +99,7 @@
             config_orig = config_orig.replace('SECRET_ACCESS_KEY', args.secret_access_key)
             config_orig = config_orig.replace('CONF_BILLING_TAG', args.billing_tag)
             config_orig = config_orig.replace('SERVICE_BASE_NAME', args.service_base_name)
-            config_orig = config_orig.replace('DLAB_ID', args.dlab_id)
+            config_orig = config_orig.replace('DATALAB_ID', args.datalab_id)
             config_orig = config_orig.replace('USAGE_DATE', args.usage_date)
             config_orig = config_orig.replace('PRODUCT', args.product)
             config_orig = config_orig.replace('USAGE_TYPE', args.usage_type)
@@ -180,10 +189,10 @@
     # Check cloud provider
     # Access to the bucket without credentials?
     try:
-        yml_billing(args.dlab_dir + 'conf/billing.yml')
+        yml_billing(args.datalab_dir + 'conf/billing.yml')
         if args.cloud_provider == 'aws':
-            yml_billing_app(args.dlab_dir + 'conf/billing_app.yml')
-        yml_self_service(args.dlab_dir + 'conf/self-service.yml')
+            yml_billing_app(args.datalab_dir + 'conf/billing_app.yml')
+        yml_self_service(args.datalab_dir + 'conf/self-service.yml')
     except:
         print('Error configure billing')
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/ssn/scripts/configure_conf_file.py b/infrastructure-provisioning/src/ssn/scripts/configure_conf_file.py
index 5cc301b..dbcd025 100644
--- a/infrastructure-provisioning/src/ssn/scripts/configure_conf_file.py
+++ b/infrastructure-provisioning/src/ssn/scripts/configure_conf_file.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -21,15 +21,14 @@
 # ******************************************************************************
 
 
-from fabric.api import *
-import sys
+import configparser
 import argparse
-import os
 import json
-import ConfigParser
+import sys
+from fabric import *
 
 parser = argparse.ArgumentParser()
-parser.add_argument('--dlab_dir', type=str, default='')
+parser.add_argument('--datalab_dir', type=str, default='')
 parser.add_argument('--variables_list', type=str, default='')
 args = parser.parse_args()
 
@@ -38,7 +37,8 @@
     try:
         variables_list = json.loads(args.variables_list)
         conf_list = []
-        conf_file = open('{}sources/infrastructure-provisioning/src/general/conf/dlab.ini'.format(args.dlab_dir), 'r')
+        conf_file = open('{}sources/infrastructure-provisioning/src/general/conf/datalab.ini'.format(args.datalab_dir),
+                         'r')
         for line in conf_file:
             conf_list.append(line)
 
@@ -46,11 +46,11 @@
             if line[0:2] == '# ':
                 conf_list[conf_list.index(line)] = line.replace('# ', '')
 
-        with open('/tmp/dlab.ini.modified', 'w') as conf_file_modified:
+        with open('/tmp/datalab.ini.modified', 'w') as conf_file_modified:
             conf_file_modified.writelines(conf_list)
 
-        config = ConfigParser.RawConfigParser()
-        config.read('/tmp/dlab.ini.modified')
+        config = configparser.RawConfigParser()
+        config.read('/tmp/datalab.ini.modified')
         for section in config.sections():
             options = config.options(section)
             for option in options:
@@ -61,7 +61,8 @@
                     print('Such variable doesn`t exist!')
                     config.remove_option(section, option)
 
-        with open('{}sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(args.dlab_dir), 'w') as conf_file_final:
+        with open('{}sources/infrastructure-provisioning/src/general/conf/overwrite.ini'.format(args.datalab_dir),
+                  'w') as conf_file_final:
             config.write(conf_file_final)
     except Exception as error:
         print('Error with modifying conf files:')
diff --git a/infrastructure-provisioning/src/ssn/scripts/configure_docker.py b/infrastructure-provisioning/src/ssn/scripts/configure_docker.py
index 727f97e..aa20a68 100644
--- a/infrastructure-provisioning/src/ssn/scripts/configure_docker.py
+++ b/infrastructure-provisioning/src/ssn/scripts/configure_docker.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,13 +21,13 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
 import argparse
 import json
-import sys
-from dlab.ssn_lib import *
 import os
+import sys
 import time
+from datalab.ssn_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -35,10 +35,12 @@
 parser.add_argument('--additional_config', type=str, default='{"empty":"string"}')
 parser.add_argument('--os_family', type=str, default='')
 parser.add_argument('--os_user', type=str, default='')
-parser.add_argument('--dlab_path', type=str, default='')
+parser.add_argument('--datalab_path', type=str, default='')
 parser.add_argument('--cloud_provider', type=str, default='')
 parser.add_argument('--resource', type=str, default='')
 parser.add_argument('--region', type=str, default='')
+parser.add_argument('--odahu_image', type=str, default='')
+parser.add_argument('--gcr_creds', type=str, default='')
 args = parser.parse_args()
 
 
@@ -46,64 +48,92 @@
     if os.environ['conf_duo_vpc_enable'] == 'true':
         os.environ['conf_vpc2_cidr'] = get_cidr_by_vpc(os.environ['aws_vpc2_id'])
     variables_list = {}
+    host_string = '{}@{}'.format(args.os_user, args.hostname)
     for os_var in os.environ:
         if "'" not in os.environ[os_var] and os_var != 'aws_access_key' and os_var != 'aws_secret_access_key':
             variables_list[os_var] = os.environ[os_var]
-    local('scp -r -i {} /project_tree/* {}:{}sources/'.format(args.keyfile, env.host_string, args.dlab_path))
-    local('scp -i {} /root/scripts/configure_conf_file.py {}:/tmp/configure_conf_file.py'.format(args.keyfile,
-                                                                                                 env.host_string))
-    sudo("python /tmp/configure_conf_file.py --dlab_dir {} --variables_list '{}'".format(
-        args.dlab_path, json.dumps(variables_list)))
+    conn.local('scp -r -i {} /project_tree/* {}:{}sources/'.format(args.keyfile, host_string, args.datalab_path))
+    conn.local('scp -i {} /root/scripts/configure_conf_file.py {}:/tmp/configure_conf_file.py'.format(args.keyfile,
+                                                                                                 host_string))
+    conn.sudo("python3 /tmp/configure_conf_file.py --datalab_dir {} --variables_list '{}'".format(
+        args.datalab_path, json.dumps(variables_list)))
 
 
 def download_toree():
-    toree_path = '/opt/dlab/sources/infrastructure-provisioning/src/general/files/os/'
-    tarball_link = 'https://archive.apache.org/dist/incubator/toree/0.2.0-incubating/toree/toree-0.2.0-incubating-bin.tar.gz'
-    jar_link = 'https://repo1.maven.org/maven2/org/apache/toree/toree-assembly/0.2.0-incubating/toree-assembly-0.2.0-incubating.jar'
+    toree_path = '/opt/datalab/sources/infrastructure-provisioning/src/general/files/os/'
+    tarball_link = 'https://dist.apache.org/repos/dist/dev/incubator/toree/0.5.0-incubating-rc1/toree/toree-0.5.0-incubating-bin.tar.gz'
     try:
-        run('wget {}'.format(tarball_link))
-        run('wget {}'.format(jar_link))
-        run('mv toree-0.2.0-incubating-bin.tar.gz {}toree_kernel.tar.gz'.format(toree_path))
-        run('mv toree-assembly-0.2.0-incubating.jar {}toree-assembly-0.2.0.jar'.format(toree_path))
+        conn.run('wget {}'.format(tarball_link))
+        conn.run('tar -xzf toree-0.5.0-incubating-bin.tar.gz')
+        conn.run('mv toree-0.5.0-incubating-bin.tar.gz {}toree_kernel.tar.gz'.format(toree_path))
+        conn.run('mv ./toree-0.5.0-incubating/lib/toree-assembly-0.5.0-incubating.jar {}toree-assembly-0.5.0.jar'.format(toree_path))
     except Exception as err:
         traceback.print_exc()
         print('Failed to download toree: ', str(err))
         sys.exit(1)
 
 
-def add_china_repository(dlab_path):
-    with cd('{}sources/infrastructure-provisioning/src/base/'.format(dlab_path)):
-        sudo('sed -i "/pip install/s/$/ -i https\:\/\/{0}\/simple --trusted-host {0} --timeout 60000/g" '
-             'Dockerfile'.format(os.environ['conf_pypi_mirror']))
-        sudo('sed -i "/pip install/s/jupyter/ipython==5.0.0 jupyter==1.0.0/g" Dockerfile')
-        sudo('sed -i "22i COPY general/files/os/debian/sources.list /etc/apt/sources.list" Dockerfile')
+def add_china_repository(datalab_path):
+    conn.sudo('''bash -c 'cd {1}sources/infrastructure-provisioning/src/base/ && sed -i "/pip install/s/$/ -i https\:\/\/{0}\/simple --trusted-host {0} --timeout 60000/g" Dockerfile' '''.format(os.environ['conf_pypi_mirror'], datalab_path))
+    conn.sudo('''bash -c 'cd {}sources/infrastructure-provisioning/src/base/ && sed -i "/pip install/s/jupyter/ipython==5.0.0 jupyter==1.0.0/g" Dockerfile' '''.format(datalab_path))
+    conn.sudo('''bash -c 'cd {}sources/infrastructure-provisioning/src/base/ && sed -i "22i COPY general/files/os/debian/sources.list /etc/apt/sources.list" Dockerfile' '''.format(datalab_path))
 
+def login_in_gcr(os_user, gcr_creds, odahu_image, datalab_path, cloud_provider):
+    if gcr_creds != '':
+        try:
+            if os.environ['conf_cloud_provider'] != 'gcp':
+                try:
+                    conn.sudo('echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt '
+                          'cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list')
+                    conn.sudo('apt-get -y install apt-transport-https ca-certificates gnupg')
+                    conn.sudo('curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -')
+                    conn.sudo('apt-get update')
+                    conn.sudo('apt-get -y install google-cloud-sdk')
+                except Exception as err:
+                    traceback.print_exc()
+                    print('Failed to install gcloud: ', str(err))
+                    sys.exit(1)
+            try:
+                host_string = '{}@{}'.format(args.os_user, args.hostname)
+                with open('/tmp/config', 'w') as f:
+                    f.write(base64.b64decode(gcr_creds))
+                conn.local('scp -i {} /tmp/config {}:/tmp/config'.format(args.keyfile, host_string, os_user))
+                conn.sudo('mkdir /home/{}/.docker'.format(os_user))
+                conn.sudo('cp /tmp/config /home/{}/.docker/config.json'.format(os_user))
+                conn.sudo('sed -i "s|ODAHU_IMAGE|{}|" {}sources/infrastructure-provisioning/src/general/files/{}/odahu_Dockerfile'
+                     .format(odahu_image, datalab_path, cloud_provider))
+            except Exception as err:
+                traceback.print_exc()
+                print('Failed to prepare odahu image: ', str(err))
+                sys.exit(1)
+        except Exception as err:
+            traceback.print_exc()
+            print('Failed to prepare odahu image: ', str(err))
+            sys.exit(1)
 
-def build_docker_images(image_list, region, dlab_path):
+def build_docker_images(image_list, region, datalab_path):
     try:
+        host_string = '{}@{}'.format(args.os_user, args.hostname)
         if os.environ['conf_cloud_provider'] == 'azure':
-            local('scp -i {} /root/azure_auth.json {}:{}sources/infrastructure-provisioning/src/base/'
-                  'azure_auth.json'.format(args.keyfile, env.host_string, args.dlab_path))
-            sudo('cp {0}sources/infrastructure-provisioning/src/base/azure_auth.json '
-                 '/home/{1}/keys/azure_auth.json'.format(args.dlab_path, args.os_user))
+            conn.local('scp -i {} /root/azure_auth.json {}:{}sources/infrastructure-provisioning/src/base/'
+                  'azure_auth.json'.format(args.keyfile, host_string, args.datalab_path))
+            conn.sudo('cp {0}sources/infrastructure-provisioning/src/base/azure_auth.json '
+                 '/home/{1}/keys/azure_auth.json'.format(args.datalab_path, args.os_user))
         if region == 'cn-north-1':
-            add_china_repository(dlab_path)
+            add_china_repository(datalab_path)
         for image in image_list:
             name = image['name']
             tag = image['tag']
-            sudo('cd {0}sources/infrastructure-provisioning/src/; cp general/files/{1}/{2}_description.json '
-                 '{2}/description.json'.format(args.dlab_path, args.cloud_provider, name))
+            conn.sudo('cp {0}sources/infrastructure-provisioning/src/general/files/{1}/{2}_description.json '
+                 '{0}sources/infrastructure-provisioning/src/{2}/description.json'.format(args.datalab_path, args.cloud_provider, name))
             if name == 'base':
-                sudo("cd {4}sources/infrastructure-provisioning/src/; docker build --build-arg OS={2} "
-                     "--build-arg SRC_PATH="" --file general/files/{3}/{0}_Dockerfile "
-                     "-t docker.dlab-{0}:{1} .".format(name, tag, args.os_family, args.cloud_provider, args.dlab_path))
+                conn.sudo("bash -c 'cd {4}sources/infrastructure-provisioning/src/; docker build --build-arg OS={2} "
+                          "--build-arg SRC_PATH=\"\" --file general/files/{3}/{0}_Dockerfile -t docker.datalab-{0}:{1} "
+                          ".'".format(name, tag, args.os_family, args.cloud_provider, args.datalab_path))
             else:
-                sudo("cd {4}sources/infrastructure-provisioning/src/; docker build --build-arg OS={2} "
-                     "--file general/files/{3}/{0}_Dockerfile -t docker.dlab-{0}:{1} .".format(name, tag,
-                                                                                               args.os_family,
-                                                                                               args.cloud_provider,
-                                                                                               args.dlab_path))
-        sudo('rm -f {}sources/infrastructure-provisioning/src/base/azure_auth.json'.format(args.dlab_path))
+                conn.sudo("bash -c 'cd {4}sources/infrastructure-provisioning/src/; docker build --build-arg OS={2} "
+                          "--file general/files/{3}/{0}_Dockerfile -t docker.datalab-{0}:{1} .'".format(name, tag, args.os_family, args.cloud_provider, args.datalab_path))
+        conn.sudo('rm -f {}sources/infrastructure-provisioning/src/base/azure_auth.json'.format(args.datalab_path))
         return True
     except:
         return False
@@ -112,42 +142,49 @@
 def configure_guacamole():
     try:
         mysql_pass = id_generator()
-        sudo('docker run --name guacd --restart unless-stopped -d -p 4822:4822 guacamole/guacd')
-        sudo('docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > initdb.sql')
-        sudo('mkdir /tmp/scripts')
-        sudo('cp initdb.sql /tmp/scripts')
-        sudo('mkdir /opt/mysql')
-        sudo('docker run --name guac-mysql --restart unless-stopped -v /tmp/scripts:/tmp/scripts '\
+        conn.sudo('docker run --name guacd --restart unless-stopped -d -p 4822:4822 guacamole/guacd')
+        conn.sudo('docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > initdb.sql')
+        conn.sudo('mkdir /tmp/scripts')
+        conn.sudo('cp initdb.sql /tmp/scripts')
+        conn.sudo('mkdir /opt/mysql')
+        conn.sudo('docker run --name guac-mysql --restart unless-stopped -v /tmp/scripts:/tmp/scripts '\
              ' -v /opt/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD={} -d mysql:latest'.format(mysql_pass))
         time.sleep(180)
-        sudo('touch /opt/mysql/dock-query.sql')
-        sudo("""echo "CREATE DATABASE guacamole; CREATE USER 'guacamole' IDENTIFIED BY '{}';"""\
-             """ GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole.* TO 'guacamole';" > /opt/mysql/dock-query.sql"""\
+        conn.sudo('touch /opt/mysql/dock-query.sql')
+        conn.sudo('''bash -c "echo \\"CREATE DATABASE guacamole; CREATE USER 'guacamole' IDENTIFIED BY '{}';''' \
+             ''' GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole.* TO 'guacamole';\\" > /opt/mysql/dock-query.sql"''' \
              .format(mysql_pass))
-        sudo('docker exec -i guac-mysql /bin/bash -c "mysql -u root -p{} < /var/lib/mysql/dock-query.sql"'\
+        conn.sudo('docker exec -i guac-mysql /bin/bash -c "mysql -u root -p{} < /var/lib/mysql/dock-query.sql"' \
              .format(mysql_pass))
-        sudo('docker exec -i guac-mysql /bin/bash -c "cat /tmp/scripts/initdb.sql | mysql -u root -p{} guacamole"'\
+        conn.sudo('docker exec -i guac-mysql /bin/bash -c "cat /tmp/scripts/initdb.sql | mysql -u root -p{} guacamole"' \
              .format(mysql_pass))
-        sudo("docker run --name guacamole --restart unless-stopped --link guacd:guacd --link guac-mysql:mysql"\
-             " -e MYSQL_DATABASE='guacamole' -e MYSQL_USER='guacamole' -e MYSQL_PASSWORD='{}'"\
+        conn.sudo("docker run --name guacamole --restart unless-stopped --link guacd:guacd --link guac-mysql:mysql" \
+             " -e MYSQL_DATABASE='guacamole' -e MYSQL_USER='guacamole' -e MYSQL_PASSWORD='{}'" \
              " -d -p 8080:8080 guacamole/guacamole".format(mysql_pass))
-        #create cronjob for run containers on reboot
-        sudo('mkdir /opt/dlab/cron')
-        sudo('touch /opt/dlab/cron/mysql.sh')
-        sudo('chmod 755 /opt/dlab/cron/mysql.sh')
-        sudo('echo "docker start guacd" >> /opt/dlab/cron/mysql.sh')
-        sudo('echo "docker start guac-mysql" >> /opt/dlab/cron/mysql.sh')
-        sudo('echo "docker rm guacamole" >> /opt/dlab/cron/mysql.sh')
-        sudo("""echo "docker run --name guacamole --restart unless-stopped --link guacd:guacd --link guac-mysql:mysql"""\
-             """ -e MYSQL_DATABASE='guacamole' -e MYSQL_USER='guacamole' -e MYSQL_PASSWORD='{}' -d"""\
-             """ -p 8080:8080 guacamole/guacamole" >> /opt/dlab/cron/mysql.sh""".format(mysql_pass))
-        sudo('(crontab -l 2>/dev/null; echo "@reboot sh /opt/dlab/cron/mysql.sh") | crontab -')
+        # create cronjob for run containers on reboot
+        conn.sudo('mkdir /opt/datalab/cron')
+        conn.sudo('touch /opt/datalab/cron/mysql.sh')
+        conn.sudo('chmod 755 /opt/datalab/cron/mysql.sh')
+        conn.sudo('bash -c "echo \"docker start guacd\" >> /opt/datalab/cron/mysql.sh"')
+        conn.sudo('bash -c "echo \"docker start guac-mysql\" >> /opt/datalab/cron/mysql.sh"')
+        conn.sudo('bash -c "echo \"docker rm guacamole\" >> /opt/datalab/cron/mysql.sh"')
+        conn.sudo('''bash -c "echo \\"docker run --name guacamole --restart unless-stopped --link guacd:guacd --link ''' \
+                  '''guac-mysql:mysql -e MYSQL_DATABASE='guacamole' -e MYSQL_USER='guacamole' -e MYSQL_PASSWORD='{}' '''\
+                  '''-d -p 8080:8080 guacamole/guacamole\\" >> /opt/datalab/cron/mysql.sh"'''.format(mysql_pass))
+        conn.sudo("bash -c '(crontab -l 2>/dev/null; echo \"@reboot sh /opt/datalab/cron/mysql.sh\") | crontab -'")
         return True
     except Exception as err:
         traceback.print_exc()
         print('Failed to configure guacamole: ', str(err))
         return False
 
+def status_container_removal_cron():
+    try:
+        conn.sudo('bash -c \'echo "*/15 * * * * datalab-user docker container prune -f --filter until=50m --filter label=edge_status" >> /etc/crontab\'')
+    except Exception as err:
+        traceback.print_exc()
+        print('Failed to create admin status container removal cron: ', str(err))
+        sys.exit(1)
 
 ##############
 # Run script #
@@ -155,9 +192,8 @@
 if __name__ == "__main__":
     print("Configure connections")
     try:
-        env['connection_attempts'] = 100
-        env.key_filename = [args.keyfile]
-        env.host_string = args.os_user + '@' + args.hostname
+        global conn
+        conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
         deeper_config = json.loads(args.additional_config)
     except:
         sys.exit(2)
@@ -173,12 +209,15 @@
     download_toree()
 
     print("Installing docker daemon")
-    if not ensure_docker_daemon(args.dlab_path, args.os_user, args.region):
+    if not ensure_docker_daemon(args.datalab_path, args.os_user, args.region):
         sys.exit(1)
 
-    print("Building dlab images")
+    print("Login in Google Container Registry")
+    login_in_gcr(args.os_user, args.gcr_creds, args.odahu_image, args.datalab_path, args.cloud_provider)
+
+    print("Building Datalab images")
     count = 0
-    while not build_docker_images(deeper_config, args.region, args.dlab_path) and count < 5:
+    while not build_docker_images(deeper_config, args.region, args.datalab_path) and count < 5:
         count += 1
         time.sleep(5)
 
@@ -186,4 +225,8 @@
     if not configure_guacamole():
         sys.exit(1)
 
+    print("Adding cron to remove edge status containers")
+    status_container_removal_cron()
+
+    conn.close()
     sys.exit(0)
diff --git a/infrastructure-provisioning/src/ssn/scripts/configure_gitlab.py b/infrastructure-provisioning/src/ssn/scripts/configure_gitlab.py
index 15e24f1..59e70e1 100644
--- a/infrastructure-provisioning/src/ssn/scripts/configure_gitlab.py
+++ b/infrastructure-provisioning/src/ssn/scripts/configure_gitlab.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -21,11 +21,13 @@
 # ******************************************************************************
 
 
-from fabric.api import *
 import argparse
 import json
-import sys
 import os
+import sys
+import subprocess
+from fabric import *
+from datalab.fab import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--keyfile', type=str, default='')
@@ -44,59 +46,57 @@
         initial_user = 'ec2-user'
         sudo_group = 'wheel'
 
-    env.hosts = '{}'.format(args.instance_ip)
-    env['connection_attempts'] = 100
-    env.key_filename = args.keyfile
-    env.user = initial_user
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.instance_ip, initial_user, args.keyfile)
 
     try:
-        sudo('useradd -m -G {1} -s /bin/bash {0}'.format(os_user, sudo_group))
-        sudo('echo "{} ALL = NOPASSWD:ALL" >> /etc/sudoers'.format(os_user))
-        sudo('mkdir /home/{}/.ssh'.format(os_user))
-        sudo('chown -R {0}:{0} /home/{1}/.ssh/'.format(initial_user, os_user))
-        sudo('cat /home/{0}/.ssh/authorized_keys > /home/{1}/.ssh/authorized_keys'.format(initial_user, os_user))
-        sudo('chown -R {0}:{0} /home/{0}/.ssh/'.format(os_user))
-        sudo('chmod 700 /home/{0}/.ssh'.format(os_user))
-        sudo('chmod 600 /home/{0}/.ssh/authorized_keys'.format(os_user))
-        sudo('touch /home/{}/.ssh_user_ensured'.format(initial_user))
+        conn.sudo('useradd -m -G {1} -s /bin/bash {0}'.format(os_user, sudo_group))
+        conn.sudo('echo "{} ALL = NOPASSWD:ALL" >> /etc/sudoers'.format(os_user))
+        conn.sudo('mkdir /home/{}/.ssh'.format(os_user))
+        conn.sudo('chown -R {0}:{0} /home/{1}/.ssh/'.format(initial_user, os_user))
+        conn.sudo('cat /home/{0}/.ssh/authorized_keys > /home/{1}/.ssh/authorized_keys'.format(initial_user, os_user))
+        conn.sudo('chown -R {0}:{0} /home/{0}/.ssh/'.format(os_user))
+        conn.sudo('chmod 700 /home/{0}/.ssh'.format(os_user))
+        conn.sudo('chmod 600 /home/{0}/.ssh/authorized_keys'.format(os_user))
+        conn.sudo('touch /home/{}/.ssh_user_ensured'.format(initial_user))
     except Exception as err:
         print('Failed to install gitlab.{}'.format(str(err)))
         sys.exit(1)
-
+    conn.close()
 
 def prepare_config():
     try:
-        with lcd('{}tmp/gitlab'.format(os.environ['conf_dlab_path'])):
-            if os.path.exists('{}tmp/gitlab/gitlab.rb.bak'.format(os.environ['conf_dlab_path'])):
-                local('cp gitlab.rb.bak gitlab.rb')
+        with lcd('{}tmp/gitlab'.format(os.environ['conf_datalab_path'])):
+            if os.path.exists('{}tmp/gitlab/gitlab.rb.bak'.format(os.environ['conf_datalab_path'])):
+                subprocess.run('cp gitlab.rb.bak gitlab.rb', shell=True, check=True)
             else:
-                local('cp gitlab.rb gitlab.rb.bak')
+                subprocess.run('cp gitlab.rb gitlab.rb.bak', shell=True, check=True)
             if json.loads(os.environ['gitlab_ssl_enabled']):
-                local('sed -i "s,EXTERNAL_URL,https://{}:443,g" gitlab.rb'.format(os.environ['instance_hostname']))
-                local('sed -i "s/.*NGINX_ENABLED/nginx[\'enable\'] = true/g" gitlab.rb')
-                local('sed -i "s,.*NGINX_SSL_CERTIFICATE_KEY,nginx[\'ssl_certificate_key\'] = \'{}\',g" gitlab.rb'.format(
-                    os.environ['gitlab_ssl_certificate_key']))
-                local('sed -i "s,.*NGINX_SSL_CERTIFICATE,nginx[\'ssl_certificate\'] = \'{}\',g" gitlab.rb'.format(
-                    os.environ['gitlab_ssl_certificate']))
-                local('sed -i "s,.*NGINX_SSL_DHPARAMS.*,nginx[\'ssl_dhparam\'] = \'{}\',g" gitlab.rb'.format(
+                subprocess.run('sed -i "s,EXTERNAL_URL,https://{}:443,g" gitlab.rb'.format(os.environ['instance_hostname']), shell=True, check=True)
+                subprocess.run('sed -i "s/.*NGINX_ENABLED/nginx[\'enable\'] = true/g" gitlab.rb', shell=True, check=True)
+                subprocess.run(
+                    'sed -i "s,.*NGINX_SSL_CERTIFICATE_KEY,nginx[\'ssl_certificate_key\'] = \'{}\',g" gitlab.rb'.format(
+                        os.environ['gitlab_ssl_certificate_key']), shell=True, check=True)
+                subprocess.run('sed -i "s,.*NGINX_SSL_CERTIFICATE,nginx[\'ssl_certificate\'] = \'{}\',g" gitlab.rb'.format(
+                    os.environ['gitlab_ssl_certificate']), shell=True, check=True)
+                subprocess.run('sed -i "s,.*NGINX_SSL_DHPARAMS.*,nginx[\'ssl_dhparam\'] = \'{}\',g" gitlab.rb'.format(
                     os.environ['gitlab_ssl_dhparams']))
                 if json.loads(os.environ['gitlab_https_redirect_enabled']):
-                    local('sed -i "s,.*NGINX_REDIRECT_TO_HTTPS,nginx[\'redirect_http_to_https\'] = true,g" gitlab.rb')
-                    local('sed -i "s,.*NGINX_REDIRECT_PORT,nginx[\'redirect_http_to_https_port\'] = 80,g" gitlab.rb')
+                    subprocess.run('sed -i "s,.*NGINX_REDIRECT_TO_HTTPS,nginx[\'redirect_http_to_https\'] = true,g" gitlab.rb', shell=True, check=True)
+                    subprocess.run('sed -i "s,.*NGINX_REDIRECT_PORT,nginx[\'redirect_http_to_https_port\'] = 80,g" gitlab.rb', shell=True, check=True)
             else:
-                local('sed -i "s,EXTERNAL_URL,http://{},g" gitlab.rb'.format(os.environ['instance_hostname']))
+                subprocess.run('sed -i "s,EXTERNAL_URL,http://{},g" gitlab.rb'.format(os.environ['instance_hostname']), shell=True, check=True)
 
-            local('sed -i "s/LDAP_HOST/{}/g" gitlab.rb'.format(os.environ['ldap_hostname']))
-            local('sed -i "s/LDAP_PORT/{}/g" gitlab.rb'.format(os.environ['ldap_port']))
-            local('sed -i "s/LDAP_UID/{}/g" gitlab.rb'.format(os.environ['ldap_uid']))
-            local('sed -i "s/LDAP_BIND_DN/{}/g" gitlab.rb'.format(os.environ['ldap_bind_dn']))
-            local("sed -i 's/LDAP_PASSWORD/{}/g' gitlab.rb".format(os.environ['ldap_password']))
-            local('sed -i "s/LDAP_BASE/{}/g" gitlab.rb'.format(os.environ['ldap_base']))
-            local("sed -i 's/LDAP_ATTR_USERNAME/{}/g' gitlab.rb".format(os.environ['ldap_attr_username']))
-            local("sed -i 's/LDAP_ATTR_EMAIL/{}/g' gitlab.rb".format(os.environ['ldap_attr_email']))
+            subprocess.run('sed -i "s/LDAP_HOST/{}/g" gitlab.rb'.format(os.environ['ldap_hostname']), shell=True, check=True)
+            subprocess.run('sed -i "s/LDAP_PORT/{}/g" gitlab.rb'.format(os.environ['ldap_port']), shell=True, check=True)
+            subprocess.run('sed -i "s/LDAP_UID/{}/g" gitlab.rb'.format(os.environ['ldap_uid']), shell=True, check=True)
+            subprocess.run('sed -i "s/LDAP_BIND_DN/{}/g" gitlab.rb'.format(os.environ['ldap_bind_dn']), shell=True, check=True)
+            subprocess.run("sed -i 's/LDAP_PASSWORD/{}/g' gitlab.rb".format(os.environ['ldap_password']), shell=True, check=True)
+            subprocess.run('sed -i "s/LDAP_BASE/{}/g" gitlab.rb'.format(os.environ['ldap_base']), shell=True, check=True)
+            subprocess.run("sed -i 's/LDAP_ATTR_USERNAME/{}/g' gitlab.rb".format(os.environ['ldap_attr_username']), shell=True, check=True)
+            subprocess.run("sed -i 's/LDAP_ATTR_EMAIL/{}/g' gitlab.rb".format(os.environ['ldap_attr_email']), shell=True, check=True)
 
-            local("sed -i 's/GITLAB_ROOT_PASSWORD/{}/g' gitlab.rb".format(os.environ['gitlab_root_password']))
+            subprocess.run("sed -i 's/GITLAB_ROOT_PASSWORD/{}/g' gitlab.rb".format(os.environ['gitlab_root_password']), shell=True, check=True)
         print('Initial config is ready.')
     except Exception as err:
         print('Failed to install gitlab.{}'.format(str(err)))
@@ -107,31 +107,32 @@
     try:
         print('Installing gitlab...')
         if os.environ['conf_os_family'] == 'debian':
-            sudo('curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash')
-            sudo('apt install gitlab-ce -y')
+            conn.sudo('curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash')
+            conn.sudo('apt install gitlab-ce -y')
         elif os.environ['conf_os_family'] == 'redhat':
-            sudo('curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash')
-            sudo('yum install gitlab-ce -y')
+            conn.sudo('curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash')
+            conn.sudo('yum install gitlab-ce -y')
         else:
             print('Failed to install gitlab.')
             raise Exception
 
-        with lcd('{}tmp/gitlab'.format(os.environ['conf_dlab_path'])):
-            put('gitlab.rb', '/tmp/gitlab.rb')
-            local('rm gitlab.rb')
-        sudo('rm /etc/gitlab/gitlab.rb')
-        sudo('mv /tmp/gitlab.rb /etc/gitlab/gitlab.rb')
+        with lcd('{}tmp/gitlab'.format(os.environ['conf_datalab_path'])):
+            conn.put('gitlab.rb', '/tmp/gitlab.rb')
+            subprocess.run('rm gitlab.rb', shell=True, check=True)
+        conn.sudo('rm /etc/gitlab/gitlab.rb')
+        conn.sudo('mv /tmp/gitlab.rb /etc/gitlab/gitlab.rb')
 
         if json.loads(os.environ['gitlab_ssl_enabled']):
-            sudo('mkdir -p /etc/gitlab/ssl')
-            sudo('openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout {0} \
-                    -out {1} -subj "/C=US/ST=US/L=US/O=dlab/CN={2}"'.format(os.environ['gitlab_ssl_certificate_key'],
-                                                                            os.environ['gitlab_ssl_certificate'],
-                                                                            os.environ['instance_hostname']))
-            sudo('openssl dhparam -out {} 2048'.format(os.environ['gitlab_ssl_dhparams']))
-            get('{}'.format(os.environ['gitlab_ssl_certificate']), '{}tmp/gitlab'.format(os.environ['conf_dlab_path']))
+            conn.sudo('mkdir -p /etc/gitlab/ssl')
+            conn.sudo('openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout {0} \
+                    -out {1} -subj "/C=US/ST=US/L=US/O=datalab/CN={2}"'.format(os.environ['gitlab_ssl_certificate_key'],
+                                                                               os.environ['gitlab_ssl_certificate'],
+                                                                               os.environ['instance_hostname']))
+            conn.sudo('openssl dhparam -out {} 2048'.format(os.environ['gitlab_ssl_dhparams']))
+            get('{}'.format(os.environ['gitlab_ssl_certificate']),
+                '{}tmp/gitlab'.format(os.environ['conf_datalab_path']))
 
-        sudo('gitlab-ctl reconfigure')
+        conn.sudo('gitlab-ctl reconfigure')
     except Exception as err:
         print('Failed to install gitlab.{}'.format(str(err)))
         sys.exit(1)
@@ -146,16 +147,16 @@
             proto = 'http'
 
         with settings(hide('everything')):
-            raw = run('curl -k --request POST "{0}://localhost/api/v4/session?login=root&password={1}"'
-                    .format(proto, os.environ['gitlab_root_password']))
+            raw = conn.run('curl -k --request POST "{0}://localhost/api/v4/session?login=root&password={1}"'
+                    .format(proto, os.environ['gitlab_root_password'])).stdout.replace('\n','')
             data = json.loads(raw)
             if not json.loads(os.environ['gitlab_signup_enabled']):
                 print('Disabling signup...')
-                run('curl -k --request PUT "{0}://localhost/api/v4/application/settings?private_token={1}&sudo=root&signup_enabled=false"'
+                conn.run('curl -k --request PUT "{0}://localhost/api/v4/application/settings?private_token={1}&sudo=root&signup_enabled=false"'
                     .format(proto, data['private_token']))
             if not json.loads(os.environ['gitlab_public_repos']):
                 print('Disabling public repos...')
-                run('curl -k --request PUT "{0}://localhost/api/v4/application/settings?private_token={1}&sudo=root&restricted_visibility_levels=public"'
+                conn.run('curl -k --request PUT "{0}://localhost/api/v4/application/settings?private_token={1}&sudo=root&restricted_visibility_levels=public"'
                     .format(proto, data['private_token']))
     except Exception as err:
         print("Failed to connect to GitLab via API..{}".format(str(err)))
@@ -178,21 +179,19 @@
     for key in data:
         print('{0}: {1}'.format(key, data[key]))
 
-    with open('{}tmp/result/gitlab.json'.format(os.environ['conf_dlab_path']), 'w') as result:
+    with open('{}tmp/result/gitlab.json'.format(os.environ['conf_datalab_path']), 'w') as result:
         result.write(json.dumps(data))
 
 
 if __name__ == "__main__":
     create_user(os.environ['conf_os_user'])
 
-    env.hosts = '{}'.format(args.instance_ip)
-    env['connection_attempts'] = 100
-    env.key_filename = args.keyfile
-    env.user = os.environ['conf_os_user']
-    env.host_string = env.user + "@" + env.hosts
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.instance_ip, os.environ['conf_os_user'], args.keyfile)
 
     prepare_config()
     install_gitlab()
     configure_gitlab()
 
-    summary()
\ No newline at end of file
+    summary()
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/ssn/scripts/configure_mongo.py b/infrastructure-provisioning/src/ssn/scripts/configure_mongo.py
index 1d93fda..f78dfc3 100644
--- a/infrastructure-provisioning/src/ssn/scripts/configure_mongo.py
+++ b/infrastructure-provisioning/src/ssn/scripts/configure_mongo.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,19 +21,20 @@
 #
 # ******************************************************************************
 
-from pymongo import MongoClient
-import yaml, json, sys
+import argparse
+import json
 import subprocess
 import time
-import argparse
-from dlab.fab import *
+import yaml
+from datalab.fab import *
+from pymongo import MongoClient
 
 path = "/etc/mongod.conf"
 outfile = "/etc/mongo_params.yml"
 
 parser = argparse.ArgumentParser()
-parser.add_argument('--dlab_path', type=str, default='')
-#parser.add_argument('--mongo_parameters', type=str, default='')
+parser.add_argument('--datalab_path', type=str, default='')
+# parser.add_argument('--mongo_parameters', type=str, default='')
 args = parser.parse_args()
 
 
@@ -82,15 +83,15 @@
         command = ['service', 'mongod', 'start']
         subprocess.call(command, shell=False)
         time.sleep(5)
-        client.dlabdb.add_user('admin', mongo_passwd, roles=[{'role':'userAdminAnyDatabase','db':'admin'}])
-        client.dlabdb.command('grantRolesToUser', "admin", roles=["readWrite"])
+        client.datalabdb.add_user('admin', mongo_passwd, roles=[{'role': 'userAdminAnyDatabase', 'db': 'admin'}])
+        client.datalabdb.command('grantRolesToUser', "admin", roles=["readWrite"])
         # set_mongo_parameters(client, mongo_parameters)
-        with open(args.dlab_path + 'tmp/local_endpoint.json', 'r') as data:
+        with open(args.datalab_path + 'tmp/local_endpoint.json', 'r') as data:
             json_data = json.load(data)
         for i in json_data:
-            client.dlabdb.endpoints.insert_one(i)
-        # client.dlabdb.security.create_index("expireAt", expireAfterSeconds=7200)
-        if add_2_yml_config(path,'security','authorization','enabled'):
+            client.datalabdb.endpoints.insert_one(i)
+        # client.datalabdb.security.create_index("expireAt", expireAfterSeconds=7200)
+        if add_2_yml_config(path, 'security', 'authorization', 'enabled'):
             command = ['service', 'mongod', 'restart']
             subprocess.call(command, shell=False)
     except:
diff --git a/infrastructure-provisioning/src/ssn/scripts/configure_ssn_node.py b/infrastructure-provisioning/src/ssn/scripts/configure_ssn_node.py
index 42a6a09..5f02d83 100644
--- a/infrastructure-provisioning/src/ssn/scripts/configure_ssn_node.py
+++ b/infrastructure-provisioning/src/ssn/scripts/configure_ssn_node.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,22 +21,22 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
 import argparse
 import json
-import sys
 import os
-from dlab.ssn_lib import *
-from dlab.common_lib import *
-from dlab.fab import *
+import sys
 import traceback
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.ssn_lib import *
+from fabric import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
 parser.add_argument('--keyfile', type=str, default='')
 parser.add_argument('--additional_config', type=str, default='{"empty":"string"}')
 parser.add_argument('--os_user', type=str, default='')
-parser.add_argument('--dlab_path', type=str, default='')
+parser.add_argument('--datalab_path', type=str, default='')
 parser.add_argument('--tag_resource_id', type=str, default='')
 parser.add_argument('--step_cert_sans', type=str, default='')
 args = parser.parse_args()
@@ -44,78 +44,83 @@
 
 def set_hostname(subdomain, hosted_zone_name):
     try:
-        sudo('hostnamectl set-hostname {0}.{1}'.format(subdomain, hosted_zone_name))
+        conn.sudo('hostnamectl set-hostname {0}.{1}'.format(subdomain, hosted_zone_name))
     except Exception as err:
         traceback.print_exc()
         print('Failed to set hostname: ', str(err))
         sys.exit(1)
 
+def set_resolve():
+    try:
+        conn.sudo('ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf')
+    except Exception as err:
+        traceback.print_exc()
+        print('Failed to set resolve: ', str(err))
+        sys.exit(1)
 
 def cp_key(keyfile, host_string, os_user):
     try:
         key_name=keyfile.split("/")
-        sudo('mkdir -p /home/' + os_user + '/keys')
-        sudo('chown -R ' + os_user + ':' + os_user + ' /home/' + os_user + '/keys')
-        local('scp -r -q -i {0} {0} {1}:/home/{3}/keys/{2}'.format(keyfile, host_string, key_name[-1], os_user))
-        sudo('chmod 600 /home/' + os_user + '/keys/*.pem')
+        conn.sudo('mkdir -p /home/' + os_user + '/keys')
+        conn.sudo('chown -R ' + os_user + ':' + os_user + ' /home/' + os_user + '/keys')
+        conn.local('scp -r -q -i {0} {0} {1}:/home/{3}/keys/{2}'.format(keyfile, host_string, key_name[-1], os_user))
+        conn.sudo('chmod 600 /home/' + os_user + '/keys/*.pem')
     except Exception as err:
         traceback.print_exc()
         print('Failed to copy key: ', str(err))
         sys.exit(1)
 
 
-def cp_backup_scripts(dlab_path):
+def cp_backup_scripts(datalab_path):
     try:
-        with cd(dlab_path + "tmp/"):
-            put('/root/scripts/backup.py', "backup.py")
-            put('/root/scripts/restore.py', "restore.py")
-            run('chmod +x backup.py restore.py')
+        conn.put('/root/scripts/backup.py', datalab_path + "tmp/backup.py")
+        conn.put('/root/scripts/restore.py', datalab_path + "tmp/restore.py")
+        conn.run('chmod +x {0}tmp/backup.py {0}tmp/restore.py'.format(datalab_path))
     except Exception as err:
         traceback.print_exc()
         print('Failed to copy backup scripts: ', str(err))
         sys.exit(1)
 
 
-def cp_gitlab_scripts(dlab_path):
+def cp_gitlab_scripts(datalab_path):
     try:
-        if not exists('{}tmp/gitlab'.format(dlab_path)):
-            run('mkdir -p {}tmp/gitlab'.format(dlab_path))
-        with cd('{}tmp/gitlab'.format(dlab_path)):
-            put('/root/scripts/gitlab_deploy.py', 'gitlab_deploy.py')
-            put('/root/scripts/configure_gitlab.py', 'configure_gitlab.py')
-            run('chmod +x gitlab_deploy.py configure_gitlab.py')
-            put('/root/templates/gitlab.rb', 'gitlab.rb')
-            put('/root/templates/gitlab.ini', 'gitlab.ini')
-            run('sed -i "s/CONF_OS_USER/{}/g" gitlab.ini'.format(os.environ['conf_os_user']))
-            run('sed -i "s/CONF_OS_FAMILY/{}/g" gitlab.ini'.format(os.environ['conf_os_family']))
-            run('sed -i "s/CONF_KEY_NAME/{}/g" gitlab.ini'.format(os.environ['conf_key_name']))
-            run('sed -i "s,CONF_DLAB_PATH,{},g" gitlab.ini'.format(dlab_path))
-            run('sed -i "s/SERVICE_BASE_NAME/{}/g" gitlab.ini'.format(os.environ['conf_service_base_name']))
+        if not exists(conn,'{}tmp/gitlab'.format(datalab_path)):
+            conn.run('mkdir -p {}tmp/gitlab'.format(datalab_path))
+        conn.put('/root/scripts/gitlab_deploy.py', '{}tmp/gitlab/gitlab_deploy.py'.format(datalab_path))
+        conn.put('/root/scripts/configure_gitlab.py', '{}tmp/gitlab/configure_gitlab.py'.format(datalab_path))
+        conn.run('cd {}tmp/gitlab && chmod +x gitlab_deploy.py configure_gitlab.py'.format(datalab_path))
+        conn.put('/root/templates/gitlab.rb', '{}tmp/gitlab/gitlab.rb'.format(datalab_path))
+        conn.put('/root/templates/gitlab.ini', '{}tmp/gitlab/gitlab.ini'.format(datalab_path))
+        conn.run('cd {}tmp/gitlab && sed -i "s/CONF_OS_USER/{}/g" gitlab.ini'.format(datalab_path, os.environ['conf_os_user']))
+        conn.run('cd {}tmp/gitlab && sed -i "s/CONF_OS_FAMILY/{}/g" gitlab.ini'.format(datalab_path, os.environ['conf_os_family']))
+        conn.run('cd {}tmp/gitlab && sed -i "s/CONF_KEY_NAME/{}/g" gitlab.ini'.format(datalab_path, os.environ['conf_key_name']))
+        conn.run('cd {}tmp/gitlab && sed -i "s,CONF_DATALAB_PATH,{},g" gitlab.ini'.format(datalab_path, datalab_path))
+        conn.run('cd {}tmp/gitlab && sed -i "s/SERVICE_BASE_NAME/{}/g" gitlab.ini'.format(datalab_path, os.environ['conf_service_base_name']))
     except Exception as err:
         traceback.print_exc()
         print('Failed to copy gitlab scripts: ', str(err))
         sys.exit(1)
 
 
-def creating_service_directories(dlab_path, os_user):
+def creating_service_directories(datalab_path, os_user):
     try:
-        if not exists(dlab_path):
-            sudo('mkdir -p ' + dlab_path)
-            sudo('mkdir -p ' + dlab_path + 'conf')
-            sudo('mkdir -p ' + dlab_path + 'webapp/static')
-            sudo('mkdir -p ' + dlab_path + 'template')
-            sudo('mkdir -p ' + dlab_path + 'tmp')
-            sudo('mkdir -p ' + dlab_path + 'tmp/result')
-            sudo('mkdir -p ' + dlab_path + 'sources')
-            sudo('mkdir -p /var/opt/dlab/log/ssn')
-            sudo('mkdir -p /var/opt/dlab/log/edge')
-            sudo('mkdir -p /var/opt/dlab/log/notebook')
-            sudo('mkdir -p /var/opt/dlab/log/dataengine-service')
-            sudo('mkdir -p /var/opt/dlab/log/dataengine')
-            sudo('ln -s ' + dlab_path + 'conf /etc/opt/dlab')
-            sudo('ln -s /var/opt/dlab/log /var/log/dlab')
-            sudo('chown -R ' + os_user + ':' + os_user + ' /var/opt/dlab/log')
-            sudo('chown -R ' + os_user + ':' + os_user + ' ' + dlab_path)
+        if not exists(conn,datalab_path):
+            conn.sudo('mkdir -p ' + datalab_path)
+            conn.sudo('mkdir -p ' + datalab_path + 'conf')
+            conn.sudo('mkdir -p ' + datalab_path + 'webapp/static')
+            conn.sudo('mkdir -p ' + datalab_path + 'template')
+            conn.sudo('mkdir -p ' + datalab_path + 'tmp')
+            conn.sudo('mkdir -p ' + datalab_path + 'tmp/result')
+            conn.sudo('mkdir -p ' + datalab_path + 'sources')
+            conn.sudo('mkdir -p /var/opt/datalab/log/ssn')
+            conn.sudo('mkdir -p /var/opt/datalab/log/edge')
+            conn.sudo('mkdir -p /var/opt/datalab/log/notebook')
+            conn.sudo('mkdir -p /var/opt/datalab/log/dataengine-service')
+            conn.sudo('mkdir -p /var/opt/datalab/log/dataengine')
+            conn.sudo('ln -s ' + datalab_path + 'conf /etc/opt/datalab')
+            conn.sudo('ln -s /var/opt/datalab/log /var/log/datalab')
+            conn.sudo('chown -R ' + os_user + ':' + os_user + ' /var/opt/datalab/log')
+            conn.sudo('chown -R ' + os_user + ':' + os_user + ' ' + datalab_path)
     except Exception as err:
         traceback.print_exc()
         print('Failed to create service directories: ', str(err))
@@ -125,65 +130,65 @@
 def configure_ssl_certs(hostname, custom_ssl_cert):
     try:
         if custom_ssl_cert:
-            put('/root/certs/dlab.crt', 'dlab.crt')
-            put('/root/certs/dlab.key', 'dlab.key')
-            sudo('mv dlab.crt /etc/ssl/certs/dlab.crt')
-            sudo('mv dlab.key /etc/ssl/certs/dlab.key')
+            conn.put('/root/certs/datalab.crt', 'datalab.crt')
+            conn.put('/root/certs/datalab.key', 'datalab.key')
+            conn.sudo('mv datalab.crt /etc/ssl/certs/datalab.crt')
+            conn.sudo('mv datalab.key /etc/ssl/certs/datalab.key')
         else:
             if os.environ['conf_stepcerts_enabled'] == 'true':
                 ensure_step(args.os_user)
-                sudo('mkdir -p /home/{0}/keys'.format(args.os_user))
-                sudo('''bash -c 'echo "{0}" | base64 --decode > /etc/ssl/certs/root_ca.crt' '''.format(
+                conn.sudo('mkdir -p /home/{0}/keys'.format(args.os_user))
+                conn.sudo('''bash -c 'echo "{0}" | base64 --decode > /etc/ssl/certs/root_ca.crt' '''.format(
                      os.environ['conf_stepcerts_root_ca']))
-                fingerprint = sudo('step certificate fingerprint /etc/ssl/certs/root_ca.crt')
-                sudo('step ca bootstrap --fingerprint {0} --ca-url "{1}"'.format(fingerprint,
+                fingerprint = conn.sudo('step certificate fingerprint /etc/ssl/certs/root_ca.crt').stdout.replace('\n', '')
+                conn.sudo('step ca bootstrap --fingerprint {0} --ca-url "{1}"'.format(fingerprint,
                                                                                  os.environ['conf_stepcerts_ca_url']))
-                sudo('echo "{0}" > /home/{1}/keys/provisioner_password'.format(
+                conn.sudo('''bash -c 'echo "{0}" > /home/{1}/keys/provisioner_password' '''.format(
                      os.environ['conf_stepcerts_kid_password'], args.os_user))
                 sans = "--san localhost --san 127.0.0.1 {0}".format(args.step_cert_sans)
                 cn = hostname
-                sudo('step ca token {3} --kid {0} --ca-url "{1}" --root /etc/ssl/certs/root_ca.crt '
+                conn.sudo('step ca token {3} --kid {0} --ca-url "{1}" --root /etc/ssl/certs/root_ca.crt '
                      '--password-file /home/{2}/keys/provisioner_password {4} --output-file /tmp/step_token'.format(
                               os.environ['conf_stepcerts_kid'], os.environ['conf_stepcerts_ca_url'],
                               args.os_user, cn, sans))
-                token = sudo('cat /tmp/step_token')
-                sudo('step ca certificate "{0}" /etc/ssl/certs/dlab.crt /etc/ssl/certs/dlab.key '
+                token = conn.sudo('cat /tmp/step_token').stdout
+                conn.sudo('step ca certificate "{0}" /etc/ssl/certs/datalab.crt /etc/ssl/certs/datalab.key '
                      '--token "{1}" --kty=RSA --size 2048 --provisioner {2} '.format(cn, token,
                                                                                      os.environ['conf_stepcerts_kid']))
-                sudo('touch /var/log/renew_certificates.log')
-                put('/root/templates/renew_certificates.sh', '/tmp/renew_certificates.sh')
-                sudo('mv /tmp/renew_certificates.sh /usr/local/bin/')
-                sudo('chmod +x /usr/local/bin/renew_certificates.sh')
-                sudo('sed -i "s/OS_USER/{0}/g" /usr/local/bin/renew_certificates.sh'.format(args.os_user))
-                sudo('sed -i "s|JAVA_HOME|{0}|g" /usr/local/bin/renew_certificates.sh'.format(find_java_path_remote()))
-                sudo('sed -i "s|RESOURCE_TYPE|ssn|g" /usr/local/bin/renew_certificates.sh')
-                sudo('sed -i "s|CONF_FILE|ssn|g" /usr/local/bin/renew_certificates.sh')
-                put('/root/templates/manage_step_certs.sh', '/usr/local/bin/manage_step_certs.sh', use_sudo=True)
-                sudo('chmod +x /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_ROOT_CERT_PATH|/etc/ssl/certs/root_ca.crt|g" '
+                conn.sudo('touch /var/log/renew_certificates.log')
+                conn.put('/root/templates/renew_certificates.sh', '/tmp/renew_certificates.sh')
+                conn.sudo('mv /tmp/renew_certificates.sh /usr/local/bin/')
+                conn.sudo('chmod +x /usr/local/bin/renew_certificates.sh')
+                conn.sudo('sed -i "s/OS_USER/{0}/g" /usr/local/bin/renew_certificates.sh'.format(args.os_user))
+                conn.sudo('sed -i "s|JAVA_HOME|{0}|g" /usr/local/bin/renew_certificates.sh'.format(find_java_path_remote()))
+                conn.sudo('sed -i "s|RESOURCE_TYPE|ssn|g" /usr/local/bin/renew_certificates.sh')
+                conn.sudo('sed -i "s|CONF_FILE|ssn|g" /usr/local/bin/renew_certificates.sh')
+                conn.put('/root/templates/manage_step_certs.sh', '/tmp/manage_step_certs.sh')
+                conn.sudo('cp /tmp/manage_step_certs.sh /usr/local/bin/manage_step_certs.sh')
+                conn.sudo('chmod +x /usr/local/bin/manage_step_certs.sh')
+                conn.sudo('sed -i "s|STEP_ROOT_CERT_PATH|/etc/ssl/certs/root_ca.crt|g" '
                      '/usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_CERT_PATH|/etc/ssl/certs/dlab.crt|g" /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_KEY_PATH|/etc/ssl/certs/dlab.key|g" /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|STEP_CA_URL|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
+                conn.sudo('sed -i "s|STEP_CERT_PATH|/etc/ssl/certs/datalab.crt|g" /usr/local/bin/manage_step_certs.sh')
+                conn.sudo('sed -i "s|STEP_KEY_PATH|/etc/ssl/certs/datalab.key|g" /usr/local/bin/manage_step_certs.sh')
+                conn.sudo('sed -i "s|STEP_CA_URL|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
                     os.environ['conf_stepcerts_ca_url']))
-                sudo('sed -i "s|RESOURCE_TYPE|ssn|g" /usr/local/bin/manage_step_certs.sh')
-                sudo('sed -i "s|SANS|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(sans))
-                sudo('sed -i "s|CN|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(cn))
-                sudo('sed -i "s|KID|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
+                conn.sudo('sed -i "s|RESOURCE_TYPE|ssn|g" /usr/local/bin/manage_step_certs.sh')
+                conn.sudo('sed -i "s|SANS|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(sans))
+                conn.sudo('sed -i "s|CN|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(cn))
+                conn.sudo('sed -i "s|KID|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(
                     os.environ['conf_stepcerts_kid']))
-                sudo('sed -i "s|STEP_PROVISIONER_PASSWORD_PATH|/home/{0}/keys/provisioner_password|g" '
+                conn.sudo('sed -i "s|STEP_PROVISIONER_PASSWORD_PATH|/home/{0}/keys/provisioner_password|g" '
                      '/usr/local/bin/manage_step_certs.sh'.format(args.os_user))
-                sudo('bash -c \'echo "0 * * * * root /usr/local/bin/manage_step_certs.sh >> '
+                conn.sudo('bash -c \'echo "0 * * * * root /usr/local/bin/manage_step_certs.sh >> '
                      '/var/log/renew_certificates.log 2>&1" >> /etc/crontab \'')
-                put('/root/templates/step-cert-manager.service', '/etc/systemd/system/step-cert-manager.service',
-                    use_sudo=True)
-                sudo('systemctl daemon-reload')
-                sudo('systemctl enable step-cert-manager.service')
-
+                conn.put('/root/templates/step-cert-manager.service', '/tmp/step-cert-manager.service')
+                conn.sudo('cp /tmp/step-cert-manager.service /etc/systemd/system/step-cert-manager.service')
+                conn.sudo('systemctl daemon-reload')
+                conn.sudo('systemctl enable step-cert-manager.service')
             else:
-                sudo('openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/dlab.key \
-                     -out /etc/ssl/certs/dlab.crt -subj "/C=US/ST=US/L=US/O=dlab/CN={}"'.format(hostname))
-        sudo('openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048')
+                conn.sudo('openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/certs/datalab.key \
+                     -out /etc/ssl/certs/datalab.crt -subj "/C=US/ST=US/L=US/O=datalab/CN={}"'.format(hostname))
+        conn.sudo('openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048')
     except Exception as err:
         traceback.print_exc()
         print('Failed to configure SSL certificates: ', str(err))
@@ -191,9 +196,9 @@
 
 def docker_build_script():
     try:
-        put('/root/scripts/docker_build.py', 'docker_build')
-        sudo('chmod +x docker_build')
-        sudo('mv docker_build /usr/bin/docker-build')
+        conn.put('/root/scripts/docker_build.py', 'docker_build')
+        conn.sudo('chmod +x docker_build')
+        conn.sudo('mv docker_build /usr/bin/docker-build')
     except Exception as err:
         traceback.print_exc()
         print('Failed to configure docker_build script: ', str(err))
@@ -207,9 +212,9 @@
 if __name__ == "__main__":
     print("Configure connections")
     try:
-        env['connection_attempts'] = 100
-        env.key_filename = [args.keyfile]
-        env.host_string = args.os_user + '@' + args.hostname
+        global conn
+        conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
+        host_string = args.os_user + '@' + args.hostname
         deeper_config = json.loads(args.additional_config)
     except:
         sys.exit(2)
@@ -218,13 +223,16 @@
     else:
         domain_created = False
 
-    if os.path.exists('/root/certs/dlab.crt') and os.path.exists('/root/certs/dlab.key'):
+    if os.path.exists('/root/certs/datalab.crt') and os.path.exists('/root/certs/datalab.key'):
         custom_ssl_cert = True
     else:
         custom_ssl_cert = False
 
+    print('Setting resolve DNS configuration')
+    set_resolve()
+
     print("Creating service directories.")
-    creating_service_directories(args.dlab_path, args.os_user)
+    creating_service_directories(args.datalab_path, args.os_user)
 
     if domain_created:
         print("Setting hostname")
@@ -232,7 +240,7 @@
         args.hostname = "{0}.{1}".format(os.environ['ssn_subdomain'], os.environ['ssn_hosted_zone_name'])
 
     print("Installing nginx as frontend.")
-    ensure_nginx(args.dlab_path)
+    ensure_nginx(args.datalab_path)
 
     print("Installing Java")
     ensure_java(args.os_user)
@@ -241,25 +249,36 @@
     configure_ssl_certs(args.hostname, custom_ssl_cert)
 
     print("Configuring nginx.")
-    configure_nginx(deeper_config, args.dlab_path, args.hostname)
+    configure_nginx(deeper_config, args.datalab_path, args.hostname)
 
-    print("Installing jenkins.")
-    ensure_jenkins(args.dlab_path)
+    if os.environ['conf_letsencrypt_enabled'] == 'true':
+        print("Configuring letsencrypt certificates.")
+        install_certbot(os.environ['conf_os_family'])
+        if 'conf_letsencrypt_email' in os.environ:
+            run_certbot(os.environ['conf_letsencrypt_domain_name'], 'ssn', os.environ['conf_letsencrypt_email'])
+        else:
+            run_certbot(os.environ['conf_letsencrypt_domain_name'], 'ssn')
+        configure_nginx_LE(os.environ['conf_letsencrypt_domain_name'], 'ssn')
 
-    print("Configuring jenkins.")
-    configure_jenkins(args.dlab_path, args.os_user, deeper_config, args.tag_resource_id)
+    # print("Installing jenkins.")
+    # ensure_jenkins(args.datalab_path)
+
+    # print("Configuring jenkins.")
+    #configure_jenkins(args.datalab_path, args.os_user, deeper_config, args.tag_resource_id)
 
     print("Copying key")
-    cp_key(args.keyfile, env.host_string, args.os_user)
+    cp_key(args.keyfile, host_string, args.os_user)
 
     print("Copying backup scripts")
-    cp_backup_scripts(args.dlab_path)
+    cp_backup_scripts(args.datalab_path)
 
     print("Copying gitlab scripts & files")
-    cp_gitlab_scripts(args.dlab_path)
+    cp_gitlab_scripts(args.datalab_path)
 
     print("Ensuring safest ssh ciphers")
     ensure_ciphers()
 
     print("Configuring docker_build script")
-    docker_build_script()
\ No newline at end of file
+    docker_build_script()
+
+    conn.close()
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/ssn/scripts/configure_ui.py b/infrastructure-provisioning/src/ssn/scripts/configure_ui.py
index 2e3cd85..7a35f90 100644
--- a/infrastructure-provisioning/src/ssn/scripts/configure_ui.py
+++ b/infrastructure-provisioning/src/ssn/scripts/configure_ui.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,22 +21,24 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
-import logging
 import argparse
 import json
-import sys
+import logging
 import os
+import sys
 import traceback
-from dlab.ssn_lib import *
-from dlab.fab import *
+import subprocess
+from datalab.fab import *
+from datalab.ssn_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
 parser.add_argument('--keyfile', type=str, default='')
 parser.add_argument('--additional_config', type=str, default='{"empty":"string"}')
-parser.add_argument('--dlab_path', type=str, default='')
+parser.add_argument('--datalab_path', type=str, default='')
 parser.add_argument('--os_user', type=str, default='')
 parser.add_argument('--cloud_provider', type=str, default='')
 parser.add_argument('--os_family', type=str, default='')
@@ -64,7 +66,7 @@
 parser.add_argument('--datalake_store_name', type=str, default=None)
 parser.add_argument('--validate_permission_scope', type=str, default=None)
 parser.add_argument('--cloud_params', type=str, default='')
-parser.add_argument('--dlab_id', type=str, default=None)
+parser.add_argument('--datalab_id', type=str, default=None)
 parser.add_argument('--usage_date', type=str, default=None)
 parser.add_argument('--product', type=str, default=None)
 parser.add_argument('--usage_type', type=str, default=None)
@@ -77,8 +79,8 @@
 parser.add_argument('--keycloak_auth_server_url', type=str, default=None)
 args = parser.parse_args()
 
-dlab_conf_dir = args.dlab_path + 'conf/'
-web_path = args.dlab_path + 'webapp/'
+datalab_conf_dir = args.datalab_path + 'conf/'
+web_path = args.datalab_path + 'webapp/'
 local_log_filename = "{}_UI.log".format(args.request_id)
 local_log_filepath = "/logs/" + args.resource + "/" + local_log_filename
 logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -90,13 +92,14 @@
 
 def copy_ssn_libraries():
     try:
-        sudo('mkdir -p /usr/lib/python2.7/dlab/')
-        run('mkdir -p /tmp/dlab_libs/')
-        local('scp -i {} /usr/lib/python2.7/dlab/* {}:/tmp/dlab_libs/'.format(args.keyfile, env.host_string))
-        run('chmod a+x /tmp/dlab_libs/*')
-        sudo('mv /tmp/dlab_libs/* /usr/lib/python2.7/dlab/')
-        if exists('/usr/lib64'):
-            sudo('ln -fs /usr/lib/python2.7/dlab /usr/lib64/python2.7/dlab')
+        conn.sudo('mkdir -p /usr/lib/python3.8/datalab/')
+        conn.run('mkdir -p /tmp/datalab_libs/')
+        subprocess.run('scp -i {} /usr/lib/python3.8/datalab/*.py {}:/tmp/datalab_libs/'.format(args.keyfile, host_string), shell=True, check=True)
+        conn.run('chmod a+x /tmp/datalab_libs/*')
+        conn.sudo('mv /tmp/datalab_libs/* /usr/lib/python3.8/datalab/')
+        if exists(conn, '/usr/lib64'):
+            conn.sudo('mkdir -p /usr/lib64/python3.8')
+            conn.sudo('ln -fs /usr/lib/python3.8/datalab /usr/lib64/python3.8/datalab')
     except Exception as err:
         traceback.print_exc()
         print('Failed to copy ssn libraries: ', str(err))
@@ -105,36 +108,37 @@
 
 def configure_mongo(mongo_passwd, default_endpoint_name):
     try:
-        if not exists("/lib/systemd/system/mongod.service"):
+        if not exists(conn,"/lib/systemd/system/mongod.service"):
             if os.environ['conf_os_family'] == 'debian':
-                local('sed -i "s/MONGO_USR/mongodb/g" /root/templates/mongod.service_template')
+                subprocess.run('sed -i "s/MONGO_USR/mongodb/g" /root/templates/mongod.service_template', shell=True, check=True)
             elif os.environ['conf_os_family'] == 'redhat':
-                local('sed -i "s/MONGO_USR/mongod/g" /root/templates/mongod.service_template')
-            local('scp -i {} /root/templates/mongod.service_template {}:/tmp/mongod.service'.format(args.keyfile,
-                                                                                                    env.host_string))
-            sudo('mv /tmp/mongod.service /lib/systemd/system/mongod.service')
-            sudo('systemctl daemon-reload')
-            sudo('systemctl enable mongod.service')
-        local('sed -i "s|PASSWORD|{}|g" /root/scripts/resource_status.py'.format(mongo_passwd))
-        local('scp -i {} /root/scripts/resource_status.py {}:/tmp/resource_status.py'.format(args.keyfile,
-                                                                                             env.host_string))
-        sudo('mv /tmp/resource_status.py ' + os.environ['ssn_dlab_path'] + 'tmp/')
-        local('sed -i "s|PASSWORD|{}|g" /root/scripts/configure_mongo.py'.format(mongo_passwd))
-        local('scp -i {} /root/scripts/configure_mongo.py {}:/tmp/configure_mongo.py'.format(args.keyfile,
-                                                                                             env.host_string))
-        sudo('mv /tmp/configure_mongo.py ' + args.dlab_path + 'tmp/')
-        local('scp -i {} /root/files/{}/mongo_roles.json {}:/tmp/mongo_roles.json'.format(args.keyfile,
+                subprocess.run('sed -i "s/MONGO_USR/mongod/g" /root/templates/mongod.service_template', shell=True, check=True)
+            subprocess.run('scp -i {} /root/templates/mongod.service_template {}:/tmp/mongod.service'.format(args.keyfile,
+                                                                                                    host_string), shell=True, check=True)
+            conn.sudo('mv /tmp/mongod.service /lib/systemd/system/mongod.service')
+            conn.sudo('systemctl daemon-reload')
+            conn.sudo('systemctl enable mongod.service')
+        subprocess.run('sed -i "s|PASSWORD|{}|g" /root/scripts/resource_status.py'.format(mongo_passwd), shell=True, check=True)
+        subprocess.run('scp -i {} /root/scripts/resource_status.py {}:/tmp/resource_status.py'.format(args.keyfile,
+                                                                                             host_string), shell=True, check=True)
+        conn.sudo('mv /tmp/resource_status.py ' + os.environ['ssn_datalab_path'] + 'tmp/')
+        subprocess.run('sed -i "s|PASSWORD|{}|g" /root/scripts/configure_mongo.py'.format(mongo_passwd), shell=True, check=True)
+        subprocess.run('scp -i {} /root/scripts/configure_mongo.py {}:/tmp/configure_mongo.py'.format(args.keyfile,
+                                                                                             host_string), shell=True, check=True)
+        conn.sudo('mv /tmp/configure_mongo.py ' + args.datalab_path + 'tmp/')
+        subprocess.run('scp -i {} /root/files/{}/mongo_roles.json {}:/tmp/mongo_roles.json'.format(args.keyfile,
                                                                                           args.cloud_provider,
-                                                                                          env.host_string))
-        local('scp -i {} /root/files/local_endpoint.json {}:/tmp/local_endpoint.json'.format(args.keyfile,
-                                                                                             env.host_string))
-        sudo('mv /tmp/mongo_roles.json ' + args.dlab_path + 'tmp/')
-        sudo('sed -i "s|DEF_ENDPOINT_NAME|{0}|g" /tmp/local_endpoint.json'.format(default_endpoint_name))
-        sudo('sed -i "s|CLOUD_PROVIDER|{0}|g" /tmp/local_endpoint.json'.format(
+                                                                                          host_string), shell=True, check=True)
+        subprocess.run('scp -i {} /root/files/local_endpoint.json {}:/tmp/local_endpoint.json'.format(args.keyfile,
+                                                                                             host_string), shell=True, check=True)
+        conn.sudo('mv /tmp/mongo_roles.json ' + args.datalab_path + 'tmp/')
+        conn.sudo('sed -i "s|DEF_ENDPOINT_NAME|{0}|g" /tmp/local_endpoint.json'.format(default_endpoint_name))
+        conn.sudo('sed -i "s|CLOUD_PROVIDER|{0}|g" /tmp/local_endpoint.json'.format(
             os.environ['conf_cloud_provider'].upper()))
-        sudo('mv /tmp/local_endpoint.json ' + args.dlab_path + 'tmp/')
-        sudo("python " + args.dlab_path + "tmp/configure_mongo.py --dlab_path {} ".format(
-            args.dlab_path))
+        conn.sudo('mv /tmp/local_endpoint.json ' + args.datalab_path + 'tmp/')
+        conn.sudo('pip3 install -U six==1.15.0 patchwork')
+        conn.sudo("python3 " + args.datalab_path + "tmp/configure_mongo.py --datalab_path {} ".format(
+            args.datalab_path))
     except Exception as err:
         traceback.print_exc()
         print('Failed to configure MongoDB: ', str(err))
@@ -144,50 +148,67 @@
 def build_ui():
     try:
         # Building Front-end
-        with cd(args.dlab_path + '/sources/services/self-service/src/main/resources/webapp/'):
-            sudo('sed -i "s|CLOUD_PROVIDER|{}|g" src/dictionary/global.dictionary.ts'.format(args.cloud_provider))
+        conn.sudo('sed -i "s|CLOUD_PROVIDER|{}|g" ' + args.datalab_path + 'sources/services/self-service/src/main/resources/webapp/src/dictionary/global.dictionary.ts'.format(args.cloud_provider))
 
-            if args.cloud_provider == 'azure' and os.environ['azure_datalake_enable'] == 'true':
-                sudo('sed -i "s|\'use_ldap\': true|{}|g" src/dictionary/azure.dictionary.ts'.format(
-                     '\'use_ldap\': false'))
+        if args.cloud_provider == 'azure' and os.environ['azure_datalake_enable'] == 'true':
+            conn.sudo('sed -i "s|\'use_ldap\': true|{}|g" ' + args.datalab_path + 'sources/services/self-service/src/main/resources/webapp/src/dictionary/azure.dictionary.ts'.format(
+                    '\'use_ldap\': false'))
 
-            sudo('echo "N" | npm install')
-            manage_npm_pkg('run build.prod')
-            sudo('sudo chown -R {} {}/*'.format(args.os_user, args.dlab_path))
+        conn.sudo('bash -c "cd {}sources/services/self-service/src/main/resources/webapp/ && echo "N" | npm install"'.format(args.datalab_path))
+        manage_npm_pkg('bash -c "cd {}sources/services/self-service/src/main/resources/webapp/ && npm run build.prod"'.format(args.datalab_path))
+        conn.sudo('sudo chown -R {} {}/*'.format(args.os_user, args.datalab_path))
 
         # Building Back-end
-        with cd(args.dlab_path + '/sources/'):
-            sudo('/opt/maven/bin/mvn -P{} -DskipTests package'.format(args.cloud_provider))
-
-        sudo('mkdir -p {}/webapp/'.format(args.dlab_path))
+        if 'conf_repository_user' in os.environ and 'conf_repository_pass' in os.environ and 'conf_repository_address' in os.environ:
+            conn.sudo(
+                'wget -P {0}sources/services/provisioning-service/target/  --user={1} --password={2} {3}/repository/packages/{4}/provisioning-service-{4}.jar --no-check-certificate'
+                     .format(args.datalab_path, os.environ['conf_repository_user'], os.environ['conf_repository_pass'], os.environ['conf_repository_address'], os.environ['conf_release_tag']))
+            conn.sudo(
+                'wget -P {0}sources/services/self-service/target/  --user={1} --password={2} {3}/repository/packages/{4}/self-service-{4}.jar --no-check-certificate'
+                .format(args.datalab_path, os.environ['conf_repository_user'], os.environ['conf_repository_pass'],
+                        os.environ['conf_repository_address'], os.environ['conf_release_tag']))
+            conn.sudo(
+                'wget -P {0}sources/services/billing-{4}/target/  --user={1} --password={2} {3}/repository/packages/{5}/billing-{4}-{5}.jar --no-check-certificate'
+                .format(args.datalab_path, os.environ['conf_repository_user'], os.environ['conf_repository_pass'],
+                        os.environ['conf_repository_address'], args.cloud_provider, os.environ['conf_release_tag']))
+        else:
+            try:
+                conn.sudo('bash -c "cd {}sources/ && /opt/maven/bin/mvn -P{} -DskipTests package 2>&1 > /tmp/maven.log"'.format(args.datalab_path, args.cloud_provider))
+            except:
+                conn.run('if ! grep -w -E "(ERROR)" /tmp/maven.log > /tmp/maven_error.log; then echo "no_error" > /tmp/maven_error.log;fi')
+                conn.run('cat /tmp/maven_error.log')
+                print('Failed to build Back-end: ', str(err))
+                sys.exit(1)
+        conn.sudo('mkdir -p {}webapp/'.format(args.datalab_path))
         for service in ['self-service', 'provisioning-service', 'billing']:
-            sudo('mkdir -p {}/webapp/{}/lib/'.format(args.dlab_path, service))
-            sudo('mkdir -p {}/webapp/{}/conf/'.format(args.dlab_path, service))
-        sudo('cp {0}/sources/services/self-service/self-service.yml {0}/webapp/self-service/conf/'.format(
-            args.dlab_path))
-        sudo('cp {0}/sources/services/self-service/target/self-service-*.jar {0}/webapp/self-service/lib/'.format(
-            args.dlab_path))
-        sudo('cp {0}/sources/services/provisioning-service/provisioning.yml {0}/webapp/provisioning-service/conf/'.format(
-            args.dlab_path))
-        sudo('cp {0}/sources/services/provisioning-service/target/provisioning-service-*.jar '
-             '{0}/webapp/provisioning-service/lib/'.format(args.dlab_path))
+            conn.sudo('mkdir -p {}webapp/{}/lib/'.format(args.datalab_path, service))
+            conn.sudo('mkdir -p {}webapp/{}/conf/'.format(args.datalab_path, service))
+        conn.sudo('cp {0}sources/services/self-service/self-service.yml {0}webapp/self-service/conf/'.format(
+            args.datalab_path))
+        conn.sudo('cp {0}sources/services/self-service/target/self-service-*.jar {0}webapp/self-service/lib/'.format(
+            args.datalab_path))
+        conn.sudo(
+            'cp {0}sources/services/provisioning-service/provisioning.yml {0}webapp/provisioning-service/conf/'.format(
+                args.datalab_path))
+        conn.sudo('cp {0}sources/services/provisioning-service/target/provisioning-service-*.jar '
+             '{0}webapp/provisioning-service/lib/'.format(args.datalab_path))
 
         if args.cloud_provider == 'azure':
-            sudo('cp {0}/sources/services/billing-azure/billing.yml {0}/webapp/billing/conf/'.format(args.dlab_path))
-            sudo('cp {0}/sources/services/billing-azure/target/billing-azure*.jar {0}/webapp/billing/lib/'.format(
-                args.dlab_path))
+            conn.sudo('cp {0}sources/services/billing-azure/billing.yml {0}webapp/billing/conf/'.format(args.datalab_path))
+            conn.sudo('cp {0}sources/services/billing-azure/target/billing-azure*.jar {0}webapp/billing/lib/'.format(
+                args.datalab_path))
         elif args.cloud_provider == 'aws':
-            sudo('cp {0}/sources/services/billing-aws/billing.yml {0}/webapp/billing/conf/'.format(args.dlab_path))
-            sudo('cp {0}/sources/services/billing-aws/src/main/resources/application.yml '
-                 '{0}/webapp/billing/conf/billing_app.yml'.format(args.dlab_path))
-            sudo(
-                'cp {0}/sources/services/billing-aws/target/billing-aws*.jar {0}/webapp/billing/lib/'.format(
-                    args.dlab_path))
+            conn.sudo('cp {0}sources/services/billing-aws/billing.yml {0}webapp/billing/conf/'.format(args.datalab_path))
+            conn.sudo('cp {0}sources/services/billing-aws/src/main/resources/application.yml '
+                 '{0}webapp/billing/conf/billing_app.yml'.format(args.datalab_path))
+            conn.sudo(
+                'cp {0}sources/services/billing-aws/target/billing-aws*.jar {0}webapp/billing/lib/'.format(
+                    args.datalab_path))
         elif args.cloud_provider == 'gcp':
-            sudo('cp {0}/sources/services/billing-gcp/billing.yml {0}/webapp/billing/conf/'.format(args.dlab_path))
-            sudo(
-                'cp {0}/sources/services/billing-gcp/target/billing-gcp*.jar {0}/webapp/billing/lib/'.format(
-                    args.dlab_path))
+            conn.sudo('cp {0}sources/services/billing-gcp/billing.yml {0}webapp/billing/conf/'.format(args.datalab_path))
+            conn.sudo(
+                'cp {0}sources/services/billing-gcp/target/billing-gcp*.jar {0}webapp/billing/lib/'.format(
+                    args.datalab_path))
     except Exception as err:
         traceback.print_exc()
         print('Failed to build UI: ', str(err))
@@ -200,14 +221,14 @@
 if __name__ == "__main__":
     print("Configure connections")
     try:
-        env['connection_attempts'] = 100
-        env.key_filename = [args.keyfile]
-        env.host_string = args.os_user + '@' + args.hostname
+        global conn
+        conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
+        host_string = args.os_user + '@' + args.hostname
         deeper_config = json.loads(args.additional_config)
     except:
         sys.exit(2)
 
-    print("Copying DLab libraries to SSN")
+    print("Copying DataLab libraries to SSN")
     copy_ssn_libraries()
 
     print("Installing Supervisor")
@@ -219,8 +240,8 @@
     print("Configuring MongoDB")
     configure_mongo(mongo_passwd, args.default_endpoint_name)
 
-    sudo('echo DLAB_CONF_DIR={} >> /etc/profile'.format(dlab_conf_dir))
-    sudo('echo export DLAB_CONF_DIR >> /etc/profile')
+    conn.sudo('bash -c "echo DATALAB_CONF_DIR={} >> /etc/profile"'.format(datalab_conf_dir))
+    conn.sudo('bash -c "echo export DATALAB_CONF_DIR >> /etc/profile"')
 
     print("Installing build dependencies for UI")
     install_build_dep()
@@ -229,13 +250,15 @@
     build_ui()
 
     print("Starting Self-Service(UI)")
-    start_ss(args.keyfile, env.host_string, dlab_conf_dir, web_path,
+    start_ss(args.keyfile, host_string, datalab_conf_dir, web_path,
              args.os_user, mongo_passwd, keystore_passwd, args.cloud_provider,
              args.service_base_name, args.tag_resource_id, args.billing_tag, args.account_id,
-             args.billing_bucket, args.aws_job_enabled, args.dlab_path, args.billing_enabled, args.cloud_params,
+             args.billing_bucket, args.aws_job_enabled, args.datalab_path, args.billing_enabled, args.cloud_params,
              args.authentication_file, args.offer_number, args.currency, args.locale,
              args.region_info, args.ldap_login, args.tenant_id, args.application_id,
              args.hostname, args.datalake_store_name, args.subscription_id, args.validate_permission_scope,
-             args.dlab_id, args.usage_date, args.product, args.usage_type,
+             args.datalab_id, args.usage_date, args.product, args.usage_type,
              args.usage, args.cost, args.resource_id, args.tags, args.billing_dataset_name, args.keycloak_client_id,
              args.keycloak_client_secret, args.keycloak_auth_server_url)
+
+    conn.close()
diff --git a/infrastructure-provisioning/src/ssn/scripts/docker_build.py b/infrastructure-provisioning/src/ssn/scripts/docker_build.py
index ac4fee5..f0ddafe 100644
--- a/infrastructure-provisioning/src/ssn/scripts/docker_build.py
+++ b/infrastructure-provisioning/src/ssn/scripts/docker_build.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,21 +22,22 @@
 # ******************************************************************************
 
 
-from os.path import exists
-from fabric.api import *
 import sys
-import os
 import traceback
+import subprocess
+from fabric import *
+from os.path import exists
+from os import path
 
-src_path = '/opt/dlab/sources/infrastructure-provisioning/src/'
+src_path = '/opt/datalab/sources/infrastructure-provisioning/src/'
 if sys.argv[1] == 'all':
     node = [
-            'edge',
-            'project',
-            'jupyter',
-            'jupyterlab',
-            'rstudio',
-            'zeppelin',
+        'edge',
+        'project',
+        'jupyter',
+        'jupyterlab',
+        'rstudio',
+        'zeppelin',
             'tensor',
             'tensor-rstudio',
             'deeplearning',
@@ -49,26 +50,29 @@
 
 def image_build(src_path, node):
     try:
-        if local("cat /etc/lsb-release | grep DISTRIB_ID | awk -F '=' '{print $2}'", capture=True).stdout == 'Ubuntu':
+        if subprocess.run("cat /etc/lsb-release | grep DISTRIB_ID | awk -F '=' '{print $2}'", capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r") == 'Ubuntu':
             os_family = 'debian'
         else:
             os_family = 'redhat'
-        if local("uname -r | awk -F '-' '{print $3}'", capture=True).stdout == 'aws':
+        if subprocess.run("uname -r | awk -F '-' '{print $3}'", capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r") == 'aws':
             cloud_provider = 'aws'
-        elif local("uname -r | awk -F '-' '{print $3}'", capture=True).stdout == 'azure':
+        elif subprocess.run("uname -r | awk -F '-' '{print $3}'", capture_output=True, shell=True, check=True).stdout.decode('UTF-8').rstrip("\n\r") == 'azure':
             cloud_provider = 'azure'
-            if not exists('{}base/azure_auth.json'.format(src_path)):
-                local('cp /home/dlab-user/keys/azure_auth.json {}base/azure_auth.json'.format(src_path))
+            if not path.exists('{}base/azure_auth.json'.format(src_path)):
+                subprocess.run('cp /home/datalab-user/keys/azure_auth.json {}base/azure_auth.json'.format(src_path), shell=True, check=True)
         else:
             cloud_provider = 'gcp'
-        with lcd(src_path):
-            local('docker build --build-arg OS={0} --build-arg SRC_PATH= --file general/files/{1}/base_Dockerfile -t docker.dlab-base:latest .'.format(os_family, cloud_provider))
-            try:
-                for i in range(len(node)):
-                    local('docker build --build-arg OS={0} --file general/files/{1}/{2}_Dockerfile -t docker.dlab-{2} .'.format(os_family, cloud_provider, node[i]))
-            except Exception as err:
-                print("Failed to build {} image".format(node[i]), str(err))
-                raise Exception
+        subprocess.run('cd {2}; docker build --build-arg OS={0} --build-arg SRC_PATH= --file general/files/{1}/base_Dockerfile -t docker.datalab-base:latest .'.format(
+                    os_family, cloud_provider, src_path), shell=True, check=True)
+        try:
+            for i in range(len(node)):
+                subprocess.run('cp {0}general/files/{1}/{2}_description.json '
+                          '{0}{2}/description.json'.format(src_path, cloud_provider, node[i]), shell=True, check=True)
+                subprocess.run('cd {3}; docker build --build-arg OS={0} --file general/files/{1}/{2}_Dockerfile -t docker.datalab-{2} .'.format(
+                            os_family, cloud_provider, node[i], src_path), shell=True, check=True)
+        except Exception as err:
+            print("Failed to build {} image".format(node[i]), str(err))
+            raise Exception
     except Exception as err:
         traceback.print_exc()
         sys.exit(1)
diff --git a/infrastructure-provisioning/src/ssn/scripts/gitlab_deploy.py b/infrastructure-provisioning/src/ssn/scripts/gitlab_deploy.py
index d6b8dfc..813ea47 100644
--- a/infrastructure-provisioning/src/ssn/scripts/gitlab_deploy.py
+++ b/infrastructure-provisioning/src/ssn/scripts/gitlab_deploy.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -21,11 +21,11 @@
 # ******************************************************************************
 
 
-from ConfigParser import SafeConfigParser
-from fabric.api import *
+from ConfigParser import ConfigParser
+from fabric import *
 import argparse
 import boto3
-from botocore.client import Config
+from botocore.client import Config as botoConfig`
 import sys
 import os
 
@@ -41,7 +41,7 @@
         head, tail = os.path.split(os.path.realpath(__file__))
         for filename in os.listdir(head):
             if filename.endswith('.ini'):
-                config = SafeConfigParser()
+                config = ConfigParser()
                 config.read(os.path.join(head, filename))
                 for section in config.sections():
                     for option in config.options(section):
@@ -55,10 +55,10 @@
 
 def create_instance():
     try:
-        local('mkdir -p ~/.aws')
-        local('touch ~/.aws/config')
-        local('echo "[default]" > ~/.aws/config')
-        local('echo "region = {}" >> ~/.aws/config'.format(os.environ['aws_region']))
+        subprocess.run('mkdir -p ~/.aws', shell=True, check=True)
+        subprocess.run('touch ~/.aws/config', shell=True, check=True)
+        subprocess.run('echo "[default]" > ~/.aws/config', shell=True, check=True)
+        subprocess.run('echo "region = {}" >> ~/.aws/config'.format(os.environ['aws_region']), shell=True, check=True)
         ec2 = boto3.resource('ec2')
         security_groups_ids = []
         ami_id = get_ami_id(os.environ['aws_{}_ami_name'.format(os.environ['conf_os_family'])])
@@ -143,7 +143,7 @@
 
 def put_to_bucket(bucket_name, local_file, destination_file):
     try:
-        s3 = boto3.client('s3', config=Config(signature_version='s3v4'), region_name=os.environ['aws_region'])
+        s3 = boto3.client('s3', config=botoConfig(signature_version='s3v4'), region_name=os.environ['aws_region'])
         with open(local_file, 'rb') as data:
             s3.upload_fileobj(data, bucket_name, destination_file, ExtraArgs={'ServerSideEncryption': 'AES256'})
     except Exception as err:
@@ -208,7 +208,7 @@
 
         # Main script for configure gitlab
         try:
-            local('{0}/{1}.py {2}'.format(head, 'configure_gitlab', params))
+            subprocess.run('{0}/{1}.py {2}'.format(head, 'configure_gitlab', params), shell=True, check=True)
         except Exception as err:
             print('Failed to configure gitlab. {}'.format(str(err)))
             terminate_gitlab()
diff --git a/infrastructure-provisioning/src/ssn/scripts/resource_status.py b/infrastructure-provisioning/src/ssn/scripts/resource_status.py
index ec1c4b3..7146076 100644
--- a/infrastructure-provisioning/src/ssn/scripts/resource_status.py
+++ b/infrastructure-provisioning/src/ssn/scripts/resource_status.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -20,10 +20,10 @@
 #
 # ******************************************************************************
 
-from pymongo import MongoClient
+import argparse
 import sys
 import yaml
-import argparse
+from pymongo import MongoClient
 
 path = "/etc/mongod.conf"
 outfile = "/etc/mongo_params.yml"
@@ -51,8 +51,8 @@
     mongo_ip = read_yml_conf(path, 'net', 'bindIp')
     mongo_port = read_yml_conf(path, 'net', 'port')
     client = MongoClient(mongo_ip + ':' + str(mongo_port))
-    client = MongoClient("mongodb://admin:" + mongo_passwd + "@" + mongo_ip + ':' + str(mongo_port) + "/dlabdb")
-    client.dlabdb.statuses.save({"_id": resource, "value": status})
+    client = MongoClient("mongodb://admin:" + mongo_passwd + "@" + mongo_ip + ':' + str(mongo_port) + "/datalabdb")
+    client.datalabdb.statuses.save({"_id": resource, "value": status})
 
 
 if __name__ == "__main__":
diff --git a/infrastructure-provisioning/src/ssn/scripts/restore.py b/infrastructure-provisioning/src/ssn/scripts/restore.py
index b9e325b..9cb9a98 100644
--- a/infrastructure-provisioning/src/ssn/scripts/restore.py
+++ b/infrastructure-provisioning/src/ssn/scripts/restore.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,22 +21,30 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
 import argparse
 import filecmp
-import yaml
-import sys
 import os
+import sys
+import yaml
+import subprocess
+from fabric import *
 
-parser = argparse.ArgumentParser(description="Restore script for DLab configs, keys, certs, jars & database")
-parser.add_argument('--dlab_path', type=str, default='/opt/dlab/', help='Path to DLab. Default: /opt/dlab/')
-parser.add_argument('--configs', type=str, default='all', help='Comma separated names of config files, like "security.yml", etc. Also available: skip. Default: all')
-parser.add_argument('--keys', type=str, default='all', help='Comma separated names of keys, like "user_name.pub". Also available: skip. Default: all')
-parser.add_argument('--certs', type=str, default='all', help='Comma separated names of SSL certificates and keys, like "dlab.crt", etc. Also available: skip. Default: all')
-parser.add_argument('--jars', type=str, default='skip', help='Comma separated names of jar application, like "self-service", etc. Default: skip')
-parser.add_argument('--db', action='store_true', default=False, help='Mongo DB. Key without arguments. Default: disable')
-parser.add_argument('--file', type=str, default='', required=True, help='Full or relative path to backup file or folder. Required field')
-parser.add_argument('--force', action='store_true', default=False, help='Force mode. Without any questions. Key without arguments. Default: disable')
+parser = argparse.ArgumentParser(description="Restore script for DataLab configs, keys, certs, jars & database")
+parser.add_argument('--datalab_path', type=str, default='/opt/datalab/', help='Path to DataLab. Default: /opt/datalab/')
+parser.add_argument('--configs', type=str, default='all',
+                    help='Comma separated names of config files, like "security.yml", etc. Also available: skip. Default: all')
+parser.add_argument('--keys', type=str, default='all',
+                    help='Comma separated names of keys, like "user_name.pub". Also available: skip. Default: all')
+parser.add_argument('--certs', type=str, default='all',
+                    help='Comma separated names of SSL certificates and keys, like "datalab.crt", etc. Also available: skip. Default: all')
+parser.add_argument('--jars', type=str, default='skip',
+                    help='Comma separated names of jar application, like "self-service", etc. Default: skip')
+parser.add_argument('--db', action='store_true', default=False,
+                    help='Mongo DB. Key without arguments. Default: disable')
+parser.add_argument('--file', type=str, default='', required=True,
+                    help='Full or relative path to backup file or folder. Required field')
+parser.add_argument('--force', action='store_true', default=False,
+                    help='Force mode. Without any questions. Key without arguments. Default: disable')
 args = parser.parse_args()
 
 
@@ -66,15 +74,15 @@
                 print("Use folder path '{}' in --file key".format(temp_folder))
                 raise Exception
             print("Backup acrhive will be unpacked to: {}".format(temp_folder))
-            local("mkdir {}".format(temp_folder))
-            local("tar -xf {0} -C {1}".format(backup_file, temp_folder))
+            subprocess.run("mkdir {}".format(temp_folder), shell=True, check=True)
+            subprocess.run("tar -xf {0} -C {1}".format(backup_file, temp_folder), shell=True, check=True)
         elif os.path.isdir(backup_file):
             temp_folder = backup_file
         else:
             print("Please, specify file or folder. Try --help for more details.")
             raise Exception
         print("Backup acrhive: {} contains following files (exclude logs):".format(backup_file))
-        local("find {} -not -name '*log'".format(temp_folder))
+        subprocess.run("find {} -not -name '*log'".format(temp_folder), shell=True, check=True)
     except Exception as err:
         print("Failed to open backup.{}".format(str(err)))
         sys.exit(1)
@@ -83,14 +91,14 @@
         if ask("Maybe you want to create backup of existing configuration before restoring?"):
             with settings(hide('everything')):
                 print("Creating new backup...")
-                local("python backup.py --configs all --keys all --certs all --jar all --db")
+                subprocess.run("python3 backup.py --configs all --keys all --certs all --jar all --db", shell=True, check=True)
     except:
         print("Failed to create new backup.")
         sys.exit(1)
 
     try:
         if ask("Stop all services before restoring?"):
-            local("sudo supervisorctl stop all")
+            subprocess.run("sudo supervisorctl stop all", shell=True, check=True)
         else:
             raise Exception
     except:
@@ -118,19 +126,19 @@
                 if not os.path.isfile("{0}{1}{2}".format(temp_folder, conf_folder, filename)):
                     print("Config {} are not available in this backup.".format(filename))
                 else:
-                    if os.path.isfile("{0}{1}{2}".format(args.dlab_path, conf_folder, filename)):
+                    if os.path.isfile("{0}{1}{2}".format(args.datalab_path, conf_folder, filename)):
                         backupfile = "{0}{1}{2}".format(temp_folder, conf_folder, filename)
-                        destfile = "{0}{1}{2}".format(args.dlab_path, conf_folder, filename)
+                        destfile = "{0}{1}{2}".format(args.datalab_path, conf_folder, filename)
                         if not filecmp.cmp(backupfile, destfile):
                             if ask("Config {} was changed, rewrite it?".format(filename)):
-                                local("cp -f {0} {1}".format(backupfile, destfile))
+                                subprocess.run("cp -f {0} {1}".format(backupfile, destfile), shell=True, check=True)
                             else:
                                 print("Config {} was skipped.".format(destfile))
                         else:
                             print("Config {} was not changed. Skipped.".format(filename))
                     else:
                         print("Config {} does not exist. Creating.".format(filename))
-                        local("cp {0}{1}{2} {3}{1}{2}".format(temp_folder, conf_folder, filename, args.dlab_path))
+                        subprocess.run("cp {0}{1}{2} {3}{1}{2}".format(temp_folder, conf_folder, filename, args.datalab_path), shell=True, check=True)
     except:
         print("Restore configs failed.")
 
@@ -157,14 +165,14 @@
                         print("Key {} already exist.".format(filename))
                         if not filecmp.cmp("{0}keys/{1}".format(temp_folder, filename), "{0}{1}".format(keys_folder, filename)):
                             if ask("Key {} was changed, rewrite it?".format(filename)):
-                                local("cp -f {0}keys/{2} {1}{2}".format(temp_folder, keys_folder, filename))
+                                subprocess.run("cp -f {0}keys/{2} {1}{2}".format(temp_folder, keys_folder, filename), shell=True, check=True)
                             else:
                                 print("Key {} was skipped.".format(filename))
                         else:
                             print("Key {} was not changed. Skipped.".format(filename))
                     else:
                         print("Key {} does not exist. Creating.".format(filename))
-                        local("cp {0}keys/{2} {1}{2}".format(temp_folder, keys_folder, filename))
+                        subprocess.run("cp {0}keys/{2} {1}{2}".format(temp_folder, keys_folder, filename), shell=True, check=True)
     except:
         print("Restore keys failed.")
 
@@ -191,16 +199,16 @@
                         print("Cert {} already exist.".format(filename))
                         if not filecmp.cmp("{0}certs/{1}".format(temp_folder, filename), "{0}{1}".format(certs_folder, filename)):
                             if ask("Cert {} was changed, rewrite it?".format(filename)):
-                                local("sudo cp -f {0}certs/{2} {1}{2}".format(temp_folder, certs_folder, filename))
-                                local("sudo chown {0}:{0} {1}{2}".format("root", certs_folder, filename))
+                                subprocess.run("sudo cp -f {0}certs/{2} {1}{2}".format(temp_folder, certs_folder, filename), shell=True, check=True)
+                                subprocess.run("sudo chown {0}:{0} {1}{2}".format("root", certs_folder, filename), shell=True, check=True)
                             else:
                                 print("Cert {} was skipped.".format(filename))
                         else:
                             print("Cert {} was not changed. Skipped.".format(filename))
                     else:
                         print("Cert {} does not exist. Creating.".format(filename))
-                        local("sudo cp {0}certs/{2} {1}{2}".format(temp_folder, certs_folder, filename))
-                        local("sudo chown {0}:{0} {1}{2}".format("root", certs_folder, filename))
+                        subprocess.run("sudo cp {0}certs/{2} {1}{2}".format(temp_folder, certs_folder, filename), shell=True, check=True)
+                        subprocess.run("sudo chown {0}:{0} {1}{2}".format("root", certs_folder, filename), shell=True, check=True)
     except:
         print("Restore certs failed.")
 
@@ -225,19 +233,21 @@
                 else:
                     for root, dirs, files in os.walk("{0}jars/{1}".format(temp_folder, service)):
                         for filename in files:
-                            if os.path.isfile("{0}{1}{2}/{3}".format(args.dlab_path, jars_folder, service, filename)):
+                            if os.path.isfile(
+                                    "{0}{1}{2}/{3}".format(args.datalab_path, jars_folder, service, filename)):
                                 backupfile = "{0}jars/{1}/{2}".format(temp_folder, service, filename)
-                                destfile = "{0}{1}{2}/{3}".format(args.dlab_path, jars_folder, service, filename)
+                                destfile = "{0}{1}{2}/{3}".format(args.datalab_path, jars_folder, service, filename)
                                 if not filecmp.cmp(backupfile, destfile):
                                     if ask("Jar {} was changed, rewrite it?".format(filename)):
-                                        local("cp -fP {0} {1}".format(backupfile, destfile))
+                                        subprocess.run("cp -fP {0} {1}".format(backupfile, destfile), shell=True, check=True)
                                     else:
                                         print("Jar {} was skipped.".format(destfile))
                                 else:
                                     print("Jar {} was not changed. Skipped.".format(filename))
                             else:
                                 print("Jar {} does not exist. Creating.".format(filename))
-                                local("cp -P {0}jars/{1}/{2} {3}{4}{1}".format(temp_folder, service, filename, args.dlab_path, jars_folder))
+                                subprocess.run("cp -P {0}jars/{1}/{2} {3}{4}{1}".format(temp_folder, service, filename,
+                                                                               args.datalab_path, jars_folder), shell=True, check=True)
     except:
         print("Restore jars failed.")
 
@@ -251,12 +261,12 @@
                 raise Exception
             else:
                 if ask("Do you want to drop existing database and restore another from backup?"):
-                    ssn_conf = open(args.dlab_path + conf_folder + 'ssn.yml').read()
+                    ssn_conf = open(args.datalab_path + conf_folder + 'ssn.yml').read()
                     data = yaml.load("mongo" + ssn_conf.split("mongo")[-1])
                     print("Restoring database from backup")
-                    local("mongorestore --drop --host {0} --port {1} --archive={2}/mongo.db --username {3} --password '{4}' --authenticationDatabase={5}" \
+                    subprocess.run("mongorestore --drop --host {0} --port {1} --archive={2}/mongo.db --username {3} --password '{4}' --authenticationDatabase={5}" \
                             .format(data['mongo']['host'], data['mongo']['port'], temp_folder,
-                                    data['mongo']['username'], data['mongo']['password'], data['mongo']['database']))
+                                    data['mongo']['username'], data['mongo']['password'], data['mongo']['database']), shell=True, check=True)
         else:
             print("Restore database was skipped.")
     except:
@@ -266,13 +276,13 @@
 def restore_finalize():
     try:
         if ask("Start all services after restoring?"):
-            local("sudo supervisorctl start all")
+            subprocess.run("sudo supervisorctl start all", shell=True, check=True)
     except:
         print("Failed to start all services.")
 
     try:
         if ask("Clean temporary folder {}?".format(temp_folder)) and temp_folder != "/":
-            local("rm -rf {}".format(temp_folder))
+            subprocess.run("rm -rf {}".format(temp_folder), shell=True, check=True)
     except Exception as err:
         print("Clear temp folder failed. {}".format(str(err)))
 
diff --git a/infrastructure-provisioning/src/ssn/scripts/upload_response_file.py b/infrastructure-provisioning/src/ssn/scripts/upload_response_file.py
index c034478..34708c3 100644
--- a/infrastructure-provisioning/src/ssn/scripts/upload_response_file.py
+++ b/infrastructure-provisioning/src/ssn/scripts/upload_response_file.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,11 +21,11 @@
 #
 # ******************************************************************************
 
-import sys
 import argparse
 import logging
-from dlab.ssn_lib import *
-
+import sys
+from datalab.ssn_lib import *
+from datalab.fab import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--instance_name', type=str, default='')
@@ -37,14 +37,16 @@
 
 def upload_response_file(instance_name, local_log_filepath, os_user):
     print('Connect to SSN instance with hostname: {0} and name: {1}'.format(args.instance_hostname, instance_name))
-    env['connection_attempts'] = 100
-    env.key_filename = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
-    env.host_string = '{}@{}'.format(os_user, args.instance_hostname)
+    pkey = "{}{}.pem".format(os.environ['conf_key_dir'], os.environ['conf_key_name'])
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.instance_hostname, os_user, pkey)
     try:
-        put('/root/result.json', '/home/{}/{}.json'.format(os_user, os.environ['request_id']))
-        sudo('mv /home/{}/{}.json {}tmp/result/'.format(os_user, os.environ['request_id'], os.environ['ssn_dlab_path']))
-        put(local_log_filepath, '/home/{}/ssn.log'.format(os_user))
-        sudo('mv /home/{}/ssn.log /var/opt/dlab/log/ssn/'.format(os_user))
+        conn.put('/root/result.json', '/home/{}/{}.json'.format(os_user, os.environ['request_id']))
+        conn.sudo('mv /home/{}/{}.json {}tmp/result/'.format(os_user, os.environ['request_id'],
+                                                        os.environ['ssn_datalab_path']))
+        conn.put(local_log_filepath, '/home/{}/ssn.log'.format(os_user))
+        conn.sudo('mv /home/{}/ssn.log /var/opt/datalab/log/ssn/'.format(os_user))
+        conn.close()
         return True
     except:
         print('Failed to upload response file')
diff --git a/infrastructure-provisioning/src/ssn/templates/gitlab.ini b/infrastructure-provisioning/src/ssn/templates/gitlab.ini
index c72c661..7fd0d62 100644
--- a/infrastructure-provisioning/src/ssn/templates/gitlab.ini
+++ b/infrastructure-provisioning/src/ssn/templates/gitlab.ini
@@ -22,27 +22,27 @@
 #---- List of all GitLab parameters (some parameters already setuped) ----#
 
 [conf]
-### DLAB ssh user name ('dlab-user' by default)
+### DataLab ssh user name ('datalab-user' by default)
 os_user = CONF_OS_USER
-### OS that supported by dlab (debian/redhat)
+### OS that supported by DataLab (debian/redhat)
 os_family = CONF_OS_FAMILY
-### Node name: (has a prefix with service base name, like 'dlab-gitlab')
+### Node name: (has a prefix with service base name, like 'datalab-gitlab')
 node_name = gitlab
 ### Directory on SSN where key is uploaded
 key_dir = /home/CONF_OS_USER/keys/
 ### Admin ssh key name in cloud provider
 key_name = CONF_KEY_NAME
-### System path on SSN instance where dlab already installed
-dlab_path = CONF_DLAB_PATH
+### System path on SSN instance where DataLab already installed
+datalab_path = CONF_DATALAB_PATH
 ### Unique infrastructure name
 service_base_name = SERVICE_BASE_NAME
 
 [aws]
-### Amazon region name for whole dlab/gitlab provisioning
+### Amazon region name for whole DataLab/gitlab provisioning
 region = AWS_REGION
-### Amazon ami name based on debian conf_os_family for all dlab/gitlab instances
+### Amazon ami name based on debian conf_os_family for all DataLab/gitlab instances
 debian_ami_name = ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20160907.1
-### Amazon ami name based on RedHat conf_os_family for all dlab/gitlab instances
+### Amazon ami name based on RedHat conf_os_family for all DataLab/gitlab instances
 redhat_ami_name = RHEL-7.3_HVM_GA-20161026-x86_64-1-Hourly2-GP2
 ### EC2 instance type for GitLab
 instance_type = t2.medium
@@ -61,8 +61,8 @@
 ### If enabled, GitLab will be generate own self-signed certificate
 ssl_enabled = true
 ### Next parameters don't used, if previous parameter is 'false'. Not recommend change it.
-ssl_certificate = /etc/gitlab/ssl/dlab-gitlab.crt
-ssl_certificate_key = /etc/gitlab/ssl/dlab-gitlab.key
+ssl_certificate = /etc/gitlab/ssl/datalab-gitlab.crt
+ssl_certificate_key = /etc/gitlab/ssl/datalab-gitlab.key
 ssl_dhparams = /etc/gitlab/ssl/dhparams.pem
 ### Enable HTTP to HTTPS redirect if SSL enabled.
 https_redirect_enabled = true
diff --git a/infrastructure-provisioning/src/ssn/templates/nginx_proxy.conf b/infrastructure-provisioning/src/ssn/templates/nginx_proxy.conf
index 3a293fc..1fda167 100644
--- a/infrastructure-provisioning/src/ssn/templates/nginx_proxy.conf
+++ b/infrastructure-provisioning/src/ssn/templates/nginx_proxy.conf
@@ -37,8 +37,8 @@
     # SSL section
     proxy_buffering off;
     ssl on;
-    ssl_certificate /etc/ssl/certs/dlab.crt;
-    ssl_certificate_key /etc/ssl/certs/dlab.key;
+    ssl_certificate /etc/ssl/certs/datalab.crt;
+    ssl_certificate_key /etc/ssl/certs/datalab.key;
     ssl_session_timeout 5m;
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
     ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
diff --git a/infrastructure-provisioning/src/ssn/templates/proxy_location_webapp_template.conf b/infrastructure-provisioning/src/ssn/templates/proxy_location_webapp_template.conf
index 2b949e0..38958b4 100644
--- a/infrastructure-provisioning/src/ssn/templates/proxy_location_webapp_template.conf
+++ b/infrastructure-provisioning/src/ssn/templates/proxy_location_webapp_template.conf
@@ -28,5 +28,5 @@
 
       # Fix the "It appears that your reverse proxy set up is broken" error.
       proxy_pass          https://localhost:8443;
-      proxy_read_timeout  90;
+      proxy_read_timeout  1800;
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/src/ssn/templates/ssn.yml b/infrastructure-provisioning/src/ssn/templates/ssn.yml
index 7b18d26..8720ef2 100644
--- a/infrastructure-provisioning/src/ssn/templates/ssn.yml
+++ b/infrastructure-provisioning/src/ssn/templates/ssn.yml
@@ -19,7 +19,7 @@
 #
 # ******************************************************************************
 
-<#assign LOG_ROOT_DIR="/var/opt/dlab/log">
+<#assign LOG_ROOT_DIR="/var/opt/datalab/log">
 <#assign KEYS_DIR="/home/${sys['user.name']}/keys">
 <#assign KEY_STORE_PATH="${KEYS_DIR}/ssn.keystore.jks">
 <#assign KEY_STORE_PASSWORD="KEYSTORE_PASSWORD">
@@ -39,7 +39,7 @@
   port: 27017
   username: admin
   password: MONGO_PASSWORD
-  database: dlabdb
+  database: datalabdb
 
 selfService:
   protocol: https
@@ -62,6 +62,11 @@
     timeout: 3s
     connectionTimeout: 3s
 
+bucketService:
+  jerseyClient:
+    timeout: 50m
+    connectionTimeout: 3s
+
 billingService:
   jerseyClient:
     timeout: 4m
diff --git a/infrastructure-provisioning/src/ssn/templates/ssn_nginx.conf b/infrastructure-provisioning/src/ssn/templates/ssn_nginx.conf
index 74f58db..6d0c8d3 100644
--- a/infrastructure-provisioning/src/ssn/templates/ssn_nginx.conf
+++ b/infrastructure-provisioning/src/ssn/templates/ssn_nginx.conf
@@ -43,7 +43,7 @@
     proxy_buffering     off;
     keepalive_timeout   65;
     types_hash_max_size 2048;
-    client_max_body_size 50M;
+    client_max_body_size 4096M;
 
     include             /etc/nginx/mime.types;
     default_type        application/octet-stream;
@@ -51,4 +51,4 @@
     include /etc/nginx/conf.d/*.conf;
 
 
-}
\ No newline at end of file
+}
diff --git a/infrastructure-provisioning/src/ssn/templates/supervisor_svc.conf b/infrastructure-provisioning/src/ssn/templates/supervisor_svc.conf
index 6093617..05035c8 100644
--- a/infrastructure-provisioning/src/ssn/templates/supervisor_svc.conf
+++ b/infrastructure-provisioning/src/ssn/templates/supervisor_svc.conf
@@ -25,14 +25,14 @@
 port = 127.0.0.1:9001
 
 [program:ui]
-command=java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 self-service/self-service.jar server WEB_CONFself-service.yml
+command=java -Xmx2048M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 self-service/self-service.jar server WEB_CONFself-service.yml
 directory=WEB_APP_DIR
 autorestart=true
 priority=20
 user=OS_USR
 stdout_logfile=/var/log/application/ui.log
 redirect_stderr=true
-environment=DLAB_CONF_DIR="WEB_CONF"
+environment=DATALAB_CONF_DIR="WEB_CONF"
 
 ; [program:secserv]
 ; command=java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 security-service/security-service.jar server WEB_CONFsecurity.yml
@@ -42,17 +42,17 @@
 ; user=OS_USR
 ; stdout_logfile=/var/log/application/security-service.log
 ; redirect_stderr=true
-; environment=DLAB_CONF_DIR="WEB_CONF"
+; environment=DATALAB_CONF_DIR="WEB_CONF"
 
 [program:provserv]
-command=java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 provisioning-service/provisioning-service.jar server WEB_CONFprovisioning.yml
+command=java -Xmx2048M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 provisioning-service/provisioning-service.jar server WEB_CONFprovisioning.yml
 directory=WEB_APP_DIR
 autorestart=true
 priority=20
 user=OS_USR
 stdout_logfile=/var/log/application/provision-service.log
 redirect_stderr=true
-environment=DLAB_CONF_DIR="WEB_CONF"
+environment=DATALAB_CONF_DIR="WEB_CONF"
 
 [program:billing]
 command=java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 billing/billing.jar CONF_PARAMETER_NAMEWEB_CONFbilling.yml
@@ -62,4 +62,4 @@
 user=OS_USR
 stdout_logfile=/var/log/application/billing.log
 redirect_stderr=true
-environment=DLAB_CONF_DIR="WEB_CONF"
+environment=DATALAB_CONF_DIR="WEB_CONF"
diff --git a/infrastructure-provisioning/src/superset/fabfile.py b/infrastructure-provisioning/src/superset/fabfile.py
index ec1e6f0..4a56199 100644
--- a/infrastructure-provisioning/src/superset/fabfile.py
+++ b/infrastructure-provisioning/src/superset/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,18 +22,20 @@
 # ******************************************************************************
 
 import logging
-import json
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
 import os
+import sys
 import uuid
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 
 # Main function for provisioning notebook server
-def run():
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
+@task
+def run(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
@@ -44,7 +46,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('common_prepare_notebook', params))
+        subprocess.run("~/scripts/{}.py {}".format('common_prepare_notebook', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing Notebook node.", str(err))
@@ -52,7 +54,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('superset_configure', params))
+        subprocess.run("~/scripts/{}.py {}".format('superset_configure', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Notebook node.", str(err))
@@ -60,14 +62,15 @@
 
 
 # Main function for terminating exploratory environment
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed terminating Notebook node.", str(err))
@@ -75,14 +78,15 @@
 
 
 # Main function for stopping notebook server
-def stop():
+@task
+def stop(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_stop_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_stop_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed stopping Notebook node.", str(err))
@@ -90,7 +94,8 @@
 
 
 # Main function for starting notebook server
-def start():
+@task
+def start(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -98,14 +103,15 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_start_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_start_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed starting Notebook node.", str(err))
         sys.exit(1)
 
 # Main function for manage git credentials on notebook
-def git_creds():
+@task
+def git_creds(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -114,7 +120,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_git_creds'))
+        subprocess.run("~/scripts/{}.py".format('notebook_git_creds'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to manage git credentials for notebook node.", str(err))
@@ -122,7 +128,8 @@
 
 
 # Main function for creating image from notebook
-def create_image():
+@task
+def create_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -131,7 +138,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_create_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_create_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -139,7 +146,8 @@
 
 
 # Main function for deleting existing notebook image
-def terminate_image():
+@task
+def terminate_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -148,7 +156,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -158,7 +166,8 @@
 # Main function for reconfiguring Spark for notebook
 
 # Main function for checking inactivity status
-def check_inactivity():
+@task
+def check_inactivity(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -167,7 +176,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_inactivity_check'))
+        subprocess.run("~/scripts/{}.py".format('notebook_inactivity_check'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to check inactivity status.", str(err))
diff --git a/infrastructure-provisioning/src/superset/scripts/configure_superset_node.py b/infrastructure-provisioning/src/superset/scripts/configure_superset_node.py
index 7a1a359..5122ab4 100644
--- a/infrastructure-provisioning/src/superset/scripts/configure_superset_node.py
+++ b/infrastructure-provisioning/src/superset/scripts/configure_superset_node.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,19 +22,18 @@
 # ******************************************************************************
 
 import argparse
-import json
-import sys
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
 import os
+import sys
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
 parser.add_argument('--keyfile', type=str, default='')
 parser.add_argument('--region', type=str, default='')
 parser.add_argument('--os_user', type=str, default='')
-parser.add_argument('--dlab_path', type=str, default='')
+parser.add_argument('--datalab_path', type=str, default='')
 parser.add_argument('--keycloak_auth_server_url', type=str, default='')
 parser.add_argument('--keycloak_realm_name', type=str, default='')
 parser.add_argument('--keycloak_client_id', type=str, default='')
@@ -52,15 +51,14 @@
 ##############
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     # PREPARE DISK
     print("Prepare .ensure directory")
     try:
-        if not exists('/home/' + args.os_user + '/.ensure_dir'):
-            sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
+        if not exists(conn,'/home/' + args.os_user + '/.ensure_dir'):
+            conn.sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
     except:
         sys.exit(1)
     #print("Mount additional volume")
@@ -76,7 +74,7 @@
     install_nodejs(args.os_user)
     print("Install ungit")
     install_ungit(args.os_user, args.superset_name, args.edge_instance_private_ip)
-    if exists('/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
+    if exists(conn, '/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
         install_gitlab_cert(args.os_user, gitlab_certfile)
 
         # INSTALL INACTIVITY CHECKER
@@ -89,6 +87,6 @@
                            args.keycloak_client_id, args.keycloak_client_secret, args.edge_instance_private_ip, args.edge_instance_public_ip, args.superset_name)
     except:
         sys.exit(1)
-
+    conn.close()
 
 
diff --git a/infrastructure-provisioning/src/tensor-rstudio/fabfile.py b/infrastructure-provisioning/src/tensor-rstudio/fabfile.py
index f7a1ad9..5ea0c74 100644
--- a/infrastructure-provisioning/src/tensor-rstudio/fabfile.py
+++ b/infrastructure-provisioning/src/tensor-rstudio/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,18 +22,20 @@
 # ******************************************************************************
 
 import logging
-import json
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
 import os
+import sys
 import uuid
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 
 # Main function for provisioning notebook server
-def run():
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
+@task
+def run(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
@@ -44,7 +46,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('common_prepare_notebook', params))
+        subprocess.run("~/scripts/{}.py {}".format('common_prepare_notebook', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing Notebook node.", str(err))
@@ -52,7 +54,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('tensor-rstudio_configure', params))
+        subprocess.run("~/scripts/{}.py {}".format('tensor-rstudio_configure', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Notebook node.", str(err))
@@ -60,14 +62,15 @@
 
 
 # Main function for terminating exploratory environment
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed terminating Notebook node.", str(err))
@@ -75,14 +78,15 @@
 
 
 # Main function for stopping notebook server
-def stop():
+@task
+def stop(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_stop_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_stop_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed stopping Notebook node.", str(err))
@@ -90,7 +94,8 @@
 
 
 # Main function for starting notebook server
-def start():
+@task
+def start(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -98,7 +103,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_start_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_start_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed starting Notebook node.", str(err))
@@ -106,7 +111,8 @@
 
 
 # Main function for configuring notebook server after deploying DataEngine service
-def configure():
+@task
+def configure(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -116,7 +122,7 @@
 
     try:
         if os.environ['conf_resource'] == 'dataengine':
-            local("~/scripts/{}.py".format('common_notebook_configure_dataengine'))
+            subprocess.run("~/scripts/{}.py".format('common_notebook_configure_dataengine'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring dataengine on Notebook node.", str(err))
@@ -124,7 +130,8 @@
 
 
 # Main function for installing additional libraries for notebook
-def install_libs():
+@task
+def install_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -133,7 +140,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_install_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_install_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed installing additional libs for Notebook node.", str(err))
@@ -141,7 +148,8 @@
 
 
 # Main function for get available libraries for notebook
-def list_libs():
+@task
+def list_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -150,7 +158,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_list_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_list_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed get available libraries for notebook node.", str(err))
@@ -158,7 +166,8 @@
 
 
 # Main function for manage git credentials on notebook
-def git_creds():
+@task
+def git_creds(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -167,7 +176,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_git_creds'))
+        subprocess.run("~/scripts/{}.py".format('notebook_git_creds'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to manage git credentials for notebook node.", str(err))
@@ -175,7 +184,8 @@
 
 
 # Main function for creating image from notebook
-def create_image():
+@task
+def create_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -184,7 +194,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_create_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_create_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -192,7 +202,8 @@
 
 
 # Main function for deleting existing notebook image
-def terminate_image():
+@task
+def terminate_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -201,7 +212,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -209,7 +220,8 @@
 
 
 # Main function for reconfiguring Spark for notebook
-def reconfigure_spark():
+@task
+def reconfigure_spark(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -218,14 +230,15 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_reconfigure_spark'))
+        subprocess.run("~/scripts/{}.py".format('notebook_reconfigure_spark'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to reconfigure Spark for Notebook node.", str(err))
         sys.exit(1)
 
 # Main function for checking inactivity status
-def check_inactivity():
+@task
+def check_inactivity(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -234,7 +247,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_inactivity_check'))
+        subprocess.run("~/scripts/{}.py".format('notebook_inactivity_check'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to check inactivity status.", str(err))
diff --git a/infrastructure-provisioning/src/tensor-rstudio/scripts/configure_tensor-rstudio_node.py b/infrastructure-provisioning/src/tensor-rstudio/scripts/configure_tensor-rstudio_node.py
index 93d8b55..e3398a4 100644
--- a/infrastructure-provisioning/src/tensor-rstudio/scripts/configure_tensor-rstudio_node.py
+++ b/infrastructure-provisioning/src/tensor-rstudio/scripts/configure_tensor-rstudio_node.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-from dlab.actions_lib import *
-from dlab.common_lib import *
-from dlab.notebook_lib import *
-from dlab.fab import *
-from fabric.api import *
-from fabric.contrib.files import exists
 import argparse
-import json
-import sys
 import os
+import sys
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -55,6 +55,8 @@
 cuda_file_name = os.environ['notebook_cuda_file_name']
 cudnn_version = os.environ['notebook_cudnn_version']
 cudnn_file_name = os.environ['notebook_cudnn_file_name']
+python_venv_version = os.environ['notebook_python_venv_version']
+python_venv_path = '/opt/python/python{0}/bin/python{1}'.format(python_venv_version, python_venv_version[:3])
 if args.region == 'cn-north-1':
     spark_link = "http://mirrors.hust.edu.cn/apache/spark/spark-" + spark_version + "/spark-" + spark_version + \
                  "-bin-hadoop" + hadoop_version + ".tgz"
@@ -66,7 +68,7 @@
 templates_dir = '/root/templates/'
 files_dir = '/root/files/'
 gitlab_certfile = os.environ['conf_gitlab_certfile']
-r_libs = ['R6', 'pbdZMQ', 'RCurl', 'devtools', 'reshape2', 'caTools', 'rJava', 'ggplot2', 'evaluate', 'formatR', 'yaml',
+r_libs = ['R6', 'pbdZMQ={}'.format(os.environ['notebook_pbdzmq_version']), 'RCurl', 'reshape2', 'caTools={}'.format(os.environ['notebook_catools_version']), 'rJava', 'ggplot2', 'evaluate', 'formatR', 'yaml',
           'Rcpp', 'rmarkdown', 'base64enc', 'tibble', 'tensorflow']
 
 
@@ -75,15 +77,14 @@
 ##############
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     # PREPARE DISK
     print("Prepare .ensure directory")
     try:
-        if not exists('/home/' + args.os_user + '/.ensure_dir'):
-            sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
+        if not exists(conn,'/home/' + args.os_user + '/.ensure_dir'):
+            conn.sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
     except:
         sys.exit(1)
     print("Mount additional volume")
@@ -94,11 +95,13 @@
     ensure_jre_jdk(args.os_user)
     print("Install R")
     ensure_r(args.os_user, r_libs, args.region, args.r_mirror)
-    print("Install Python 2 modules")
-    ensure_python2_libraries(args.os_user)
     print("Install Python 3 modules")
     ensure_python3_libraries(args.os_user)
 
+    # INSTALL PYTHON IN VIRTUALENV
+    print("Configure Python Virtualenv")
+    ensure_python_venv(python_venv_version)
+
     # INSTALL TENSORFLOW AND OTHER DEEP LEARNING LIBRARIES
     print("Install TensorFlow")
     install_tensor(args.os_user, cuda_version, cuda_file_name,
@@ -111,7 +114,7 @@
 
     # INSTALL RSTUDIO
     print("Install RStudio")
-    install_rstudio(args.os_user, local_spark_path, args.rstudio_pass, args.rstudio_version)
+    install_rstudio(args.os_user, local_spark_path, args.rstudio_pass, args.rstudio_version, python_venv_version)
 
     # INSTALL SPARK AND CLOUD STORAGE JARS FOR SPARK
     print("Install local Spark")
@@ -126,7 +129,7 @@
     install_nodejs(args.os_user)
     print("Install Ungit")
     install_ungit(args.os_user, args.exploratory_name, args.edge_ip)
-    if exists('/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
+    if exists(conn, '/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
         install_gitlab_cert(args.os_user, gitlab_certfile)
 
     # INSTALL INACTIVITY CHECKER
@@ -135,4 +138,6 @@
 
     # POST INSTALLATION PROCESS
     print("Updating pyOpenSSL library")
-    update_pyopenssl_lib(args.os_user)
\ No newline at end of file
+    update_pyopenssl_lib(args.os_user)
+
+    conn.close()
diff --git a/infrastructure-provisioning/src/tensor/fabfile.py b/infrastructure-provisioning/src/tensor/fabfile.py
index b183d28..b6d0e16 100644
--- a/infrastructure-provisioning/src/tensor/fabfile.py
+++ b/infrastructure-provisioning/src/tensor/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,18 +22,20 @@
 # ******************************************************************************
 
 import logging
-import json
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
 import os
+import sys
 import uuid
+import subprocess
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 
 # Main function for provisioning notebook server
-def run():
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'], os.environ['request_id'])
+@task
+def run(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
@@ -44,7 +46,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('common_prepare_notebook', params))
+        subprocess.run("~/scripts/{}.py {}".format('common_prepare_notebook', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing Notebook node.", str(err))
@@ -52,7 +54,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('tensor_configure', params))
+        subprocess.run("~/scripts/{}.py {}".format('tensor_configure', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Notebook node.", str(err))
@@ -60,14 +62,15 @@
 
 
 # Main function for terminating exploratory environment
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed terminating Notebook node.", str(err))
@@ -75,14 +78,15 @@
 
 
 # Main function for stopping notebook server
-def stop():
+@task
+def stop(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_stop_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_stop_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed stopping Notebook node.", str(err))
@@ -90,7 +94,8 @@
 
 
 # Main function for starting notebook server
-def start():
+@task
+def start(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -98,7 +103,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_start_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_start_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed starting Notebook node.", str(err))
@@ -106,7 +111,8 @@
 
 
 # Main function for configuring notebook server after deploying DataEngine service
-def configure():
+@task
+def configure(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -116,7 +122,7 @@
 
     try:
         if os.environ['conf_resource'] == 'dataengine':
-            local("~/scripts/{}.py".format('common_notebook_configure_dataengine'))
+            subprocess.run("~/scripts/{}.py".format('common_notebook_configure_dataengine'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring dataengine on Notebook node.", str(err))
@@ -124,7 +130,8 @@
 
 
 # Main function for installing additional libraries for notebook
-def install_libs():
+@task
+def install_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -133,7 +140,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_install_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_install_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed installing additional libs for Notebook node.", str(err))
@@ -141,7 +148,8 @@
 
 
 # Main function for get available libraries for notebook
-def list_libs():
+@task
+def list_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -150,7 +158,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_list_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_list_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed get available libraries for notebook node.", str(err))
@@ -158,7 +166,8 @@
 
 
 # Main function for manage git credentials on notebook
-def git_creds():
+@task
+def git_creds(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -167,7 +176,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_git_creds'))
+        subprocess.run("~/scripts/{}.py".format('notebook_git_creds'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to manage git credentials for notebook node.", str(err))
@@ -175,7 +184,8 @@
 
 
 # Main function for creating image from notebook
-def create_image():
+@task
+def create_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -184,7 +194,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_create_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_create_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -192,7 +202,8 @@
 
 
 # Main function for deleting existing notebook image
-def terminate_image():
+@task
+def terminate_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -201,7 +212,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -209,7 +220,8 @@
 
 
 # Main function for reconfiguring Spark for notebook
-def reconfigure_spark():
+@task
+def reconfigure_spark(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -218,14 +230,15 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_reconfigure_spark'))
+        subprocess.run("~/scripts/{}.py".format('notebook_reconfigure_spark'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to reconfigure Spark for Notebook node.", str(err))
         sys.exit(1)
 
 # Main function for checking inactivity status
-def check_inactivity():
+@task
+def check_inactivity(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['project_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -234,7 +247,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_inactivity_check'))
+        subprocess.run("~/scripts/{}.py".format('notebook_inactivity_check'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to check inactivity status.", str(err))
diff --git a/infrastructure-provisioning/src/tensor/scripts/configure_tensor_node.py b/infrastructure-provisioning/src/tensor/scripts/configure_tensor_node.py
index b595d9e..c9b5e3f 100644
--- a/infrastructure-provisioning/src/tensor/scripts/configure_tensor_node.py
+++ b/infrastructure-provisioning/src/tensor/scripts/configure_tensor_node.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,16 +21,16 @@
 #
 # ******************************************************************************
 
-from dlab.actions_lib import *
-from dlab.common_lib import *
-from dlab.notebook_lib import *
-from dlab.fab import *
-from fabric.api import *
-from fabric.contrib.files import exists
 import argparse
-import json
-import sys
 import os
+import sys
+from datalab.actions_lib import *
+from datalab.common_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -49,6 +49,8 @@
 nvidia_version = os.environ['notebook_nvidia_version']
 theano_version = os.environ['notebook_theano_version']
 keras_version = os.environ['notebook_keras_version']
+python_venv_version = os.environ['notebook_python_venv_version']
+python_venv_path = '/opt/python/python{0}/bin/python{1}'.format(python_venv_version, python_venv_version[:3])
 if args.region == 'cn-north-1':
     spark_link = "http://mirrors.hust.edu.cn/apache/spark/spark-" + spark_version + "/spark-" + spark_version + \
                  "-bin-hadoop" + hadoop_version + ".tgz"
@@ -74,15 +76,14 @@
 ##############
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
 
     # PREPARE DISK
     print("Prepare .ensure directory")
     try:
-        if not exists('/home/' + args.os_user + '/.ensure_dir'):
-            sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
+        if not exists(conn,'/home/' + args.os_user + '/.ensure_dir'):
+            conn.sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
     except:
         sys.exit(1)
     print("Mount additional volume")
@@ -91,11 +92,13 @@
     # INSTALL LANGUAGES
     print("Install Java")
     ensure_jre_jdk(args.os_user)
-    print("Install Python 2 modules")
-    ensure_python2_libraries(args.os_user)
     print("Install Python 3 modules")
     ensure_python3_libraries(args.os_user)
 
+    # INSTALL PYTHON IN VIRTUALENV
+    print("Configure Python Virtualenv")
+    ensure_python_venv(python_venv_version)
+
     # INSTALL TENSORFLOW AND OTHER DEEP LEARNING LIBRARIES
     print("Install TensorFlow")
     install_tensor(args.os_user, cuda_version, cuda_file_name,
@@ -119,17 +122,17 @@
     configure_local_spark(jars_dir, templates_dir)
 
     # INSTALL JUPYTER KERNELS
-    print("Install pyspark local kernel for Jupyter")
-    ensure_pyspark_local_kernel(args.os_user, pyspark_local_path_dir, templates_dir, spark_version)
+    #print("Install pyspark local kernel for Jupyter")
+    #ensure_pyspark_local_kernel(args.os_user, pyspark_local_path_dir, templates_dir, spark_version)
     print("Install py3spark local kernel for Jupyter")
-    ensure_py3spark_local_kernel(args.os_user, py3spark_local_path_dir, templates_dir, spark_version)
+    ensure_py3spark_local_kernel(args.os_user, py3spark_local_path_dir, templates_dir, spark_version, python_venv_path, python_venv_version)
 
     # INSTALL UNGIT
     print("Install nodejs")
     install_nodejs(args.os_user)
     print("Install Ungit")
     install_ungit(args.os_user, args.exploratory_name, args.edge_ip)
-    if exists('/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
+    if exists(conn, '/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
         install_gitlab_cert(args.os_user, gitlab_certfile)
 
     # INSTALL INACTIVITY CHECKER
@@ -144,4 +147,6 @@
     
     #POST INSTALLATION PROCESS
     print("Updating pyOpenSSL library")
-    update_pyopenssl_lib(args.os_user)
\ No newline at end of file
+    update_pyopenssl_lib(args.os_user)
+
+    conn.close()
diff --git a/infrastructure-provisioning/src/zeppelin/fabfile.py b/infrastructure-provisioning/src/zeppelin/fabfile.py
index 5806e45..86bf3e1 100644
--- a/infrastructure-provisioning/src/zeppelin/fabfile.py
+++ b/infrastructure-provisioning/src/zeppelin/fabfile.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -22,18 +22,19 @@
 # ******************************************************************************
 
 import logging
-import json
-import sys
-from dlab.fab import *
-from dlab.meta_lib import *
-from dlab.actions_lib import *
 import os
+import sys
 import uuid
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.meta_lib import *
 
 
 # Main function for provisioning notebook server
-def run():
-    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
+@task
+def run(ctx):
+    local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
+                                               os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
@@ -44,7 +45,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('common_prepare_notebook', params))
+        subprocess.run("~/scripts/{}.py {}".format('common_prepare_notebook', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed preparing Notebook node.", str(err))
@@ -52,7 +53,7 @@
 
     try:
         params = "--uuid {}".format(notebook_config['uuid'])
-        local("~/scripts/{}.py {}".format('zeppelin_configure', params))
+        subprocess.run("~/scripts/{}.py {}".format('zeppelin_configure', params), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring Notebook node.", str(err))
@@ -60,14 +61,15 @@
 
 
 # Main function for terminating exploratory environment
-def terminate():
+@task
+def terminate(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed terminating Notebook node.", str(err))
@@ -75,14 +77,15 @@
 
 
 # Main function for stopping notebook server
-def stop():
+@task
+def stop(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
                         level=logging.DEBUG,
                         filename=local_log_filepath)
     try:
-        local("~/scripts/{}.py".format('common_stop_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_stop_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed stopping Notebook node.", str(err))
@@ -90,7 +93,8 @@
 
 
 # Main function for starting notebook server
-def start():
+@task
+def start(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -98,7 +102,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_start_notebook'))
+        subprocess.run("~/scripts/{}.py".format('common_start_notebook'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed starting Notebook node.", str(err))
@@ -106,7 +110,8 @@
 
 
 # Main function for configuring notebook server after deploying DataEngine service
-def configure():
+@task
+def configure(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'], os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] +  "/" + local_log_filename
     logging.basicConfig(format='%(levelname)-8s [%(asctime)s]  %(message)s',
@@ -115,9 +120,9 @@
 
     try:
         if os.environ['conf_resource'] == 'dataengine-service':
-            local("~/scripts/{}.py".format('common_notebook_configure_dataengine-service'))
+            subprocess.run("~/scripts/{}.py".format('common_notebook_configure_dataengine-service'), shell=True, check=True)
         elif os.environ['conf_resource'] == 'dataengine':
-            local("~/scripts/{}.py".format('common_notebook_configure_dataengine'))
+            subprocess.run("~/scripts/{}.py".format('common_notebook_configure_dataengine'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed configuring analytical tool on Notebook node.", str(err))
@@ -125,7 +130,8 @@
 
 
 # Main function for installing additional libraries for notebook
-def install_libs():
+@task
+def install_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -134,7 +140,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_install_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_install_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed installing additional libs for Notebook node.", str(err))
@@ -142,7 +148,8 @@
 
 
 # Main function for get available libraries for notebook
-def list_libs():
+@task
+def list_libs(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -151,7 +158,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_list_libs'))
+        subprocess.run("~/scripts/{}.py".format('notebook_list_libs'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed get available libraries for notebook node.", str(err))
@@ -159,7 +166,8 @@
 
 
 # Main function for manage git credentials on notebook
-def git_creds():
+@task
+def git_creds(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -168,7 +176,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_git_creds'))
+        subprocess.run("~/scripts/{}.py".format('notebook_git_creds'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to manage git credentials for notebook node.", str(err))
@@ -176,7 +184,8 @@
 
 
 # Main function for creating image from notebook
-def create_image():
+@task
+def create_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -185,7 +194,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_create_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_create_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -193,7 +202,8 @@
 
 
 # Main function for deleting existing notebook image
-def terminate_image():
+@task
+def terminate_image(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -202,7 +212,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('common_terminate_notebook_image'))
+        subprocess.run("~/scripts/{}.py".format('common_terminate_notebook_image'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to create image from notebook node.", str(err))
@@ -210,7 +220,8 @@
 
 
 # Main function for reconfiguring Spark for notebook
-def reconfigure_spark():
+@task
+def reconfigure_spark(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -219,14 +230,15 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_reconfigure_spark'))
+        subprocess.run("~/scripts/{}.py".format('notebook_reconfigure_spark'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to reconfigure Spark for Notebook node.", str(err))
         sys.exit(1)
 
 # Main function for checking inactivity status
-def check_inactivity():
+@task
+def check_inactivity(ctx):
     local_log_filename = "{}_{}_{}.log".format(os.environ['conf_resource'], os.environ['edge_user_name'],
                                                os.environ['request_id'])
     local_log_filepath = "/logs/" + os.environ['conf_resource'] + "/" + local_log_filename
@@ -235,7 +247,7 @@
                         filename=local_log_filepath)
 
     try:
-        local("~/scripts/{}.py".format('notebook_inactivity_check'))
+        subprocess.run("~/scripts/{}.py".format('notebook_inactivity_check'), shell=True, check=True)
     except Exception as err:
         traceback.print_exc()
         append_result("Failed to check inactivity status.", str(err))
diff --git a/infrastructure-provisioning/src/zeppelin/scripts/configure_zeppelin_node.py b/infrastructure-provisioning/src/zeppelin/scripts/configure_zeppelin_node.py
index fda8b1f..fc4202e 100644
--- a/infrastructure-provisioning/src/zeppelin/scripts/configure_zeppelin_node.py
+++ b/infrastructure-provisioning/src/zeppelin/scripts/configure_zeppelin_node.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,17 +21,16 @@
 #
 # ******************************************************************************
 
-from fabric.api import *
-from fabric.contrib.files import exists
 import argparse
 import json
-import random
-import string
-import sys
 import os
-from dlab.notebook_lib import *
-from dlab.actions_lib import *
-from dlab.fab import *
+import sys
+from datalab.actions_lib import *
+from datalab.fab import *
+from datalab.notebook_lib import *
+from fabric import *
+from patchwork.files import exists
+from patchwork import files
 
 parser = argparse.ArgumentParser()
 parser.add_argument('--hostname', type=str, default='')
@@ -57,9 +56,11 @@
 
 spark_version = args.spark_version
 hadoop_version = args.hadoop_version
-scala_link = "http://www.scala-lang.org/files/archive/"
+scala_link = "https://www.scala-lang.org/files/archive/"
 zeppelin_version = args.zeppelin_version
-zeppelin_link = "http://archive.apache.org/dist/zeppelin/zeppelin-" + zeppelin_version + "/zeppelin-" + \
+python_venv_version = os.environ['notebook_python_venv_version']
+python_venv_path = '/opt/python/python{0}/bin/python{1}'.format(python_venv_version, python_venv_version[:3])
+zeppelin_link = "https://archive.apache.org/dist/zeppelin/zeppelin-" + zeppelin_version + "/zeppelin-" + \
                 zeppelin_version + "-bin-netinst.tgz"
 if args.region == 'cn-north-1':
     spark_link = "http://mirrors.hust.edu.cn/apache/spark/spark-" + spark_version + "/spark-" + spark_version + \
@@ -68,123 +69,135 @@
     spark_link = "https://archive.apache.org/dist/spark/spark-" + spark_version + "/spark-" + spark_version + \
                  "-bin-hadoop" + hadoop_version + ".tgz"
 zeppelin_interpreters = "md,python,shell"
-python3_version = "3.4"
+python3_version = "3.8"
 local_spark_path = '/opt/spark/'
 templates_dir = '/root/templates/'
 files_dir = '/root/files/'
 jars_dir = '/opt/jars/'
-r_libs = ['R6', 'pbdZMQ', 'RCurl', 'devtools', 'reshape2', 'caTools', 'rJava', 'ggplot2']
+r_libs = ['R6', 'pbdZMQ={}'.format(os.environ['notebook_pbdzmq_version']), 'RCurl', 'reshape2', 'caTools={}'.format(os.environ['notebook_catools_version']), 'rJava', 'ggplot2']
 r_enabled = os.environ['notebook_r_enabled']
 gitlab_certfile = os.environ['conf_gitlab_certfile']
 
 
 def configure_zeppelin(os_user):
-    if not exists('/home/' + os_user + '/.ensure_dir/zeppelin_ensured'):
+    if not exists(conn,'/home/' + os_user + '/.ensure_dir/zeppelin_ensured'):
         try:
-            sudo('wget ' + zeppelin_link + ' -O /tmp/zeppelin-' + zeppelin_version + '-bin-netinst.tgz')
-            sudo('tar -zxvf /tmp/zeppelin-' + zeppelin_version + '-bin-netinst.tgz -C /opt/')
-            sudo('ln -s /opt/zeppelin-' + zeppelin_version + '-bin-netinst /opt/zeppelin')
-            sudo('cp /opt/zeppelin/conf/zeppelin-env.sh.template /opt/zeppelin/conf/zeppelin-env.sh')
-            sudo('cp /opt/zeppelin/conf/zeppelin-site.xml.template /opt/zeppelin/conf/zeppelin-site.xml')
-            sudo('sed -i \"/# export ZEPPELIN_PID_DIR/c\export ZEPPELIN_PID_DIR=/var/run/zeppelin\" /opt/zeppelin/conf/zeppelin-env.sh')
-            sudo('sed -i \"/# export ZEPPELIN_IDENT_STRING/c\export ZEPPELIN_IDENT_STRING=notebook\" /opt/zeppelin/conf/zeppelin-env.sh')
-            sudo('sed -i \"/# export ZEPPELIN_INTERPRETER_DEP_MVNREPO/c\export ZEPPELIN_INTERPRETER_DEP_MVNREPO=https://repo1.maven.org/maven2\" /opt/zeppelin/conf/zeppelin-env.sh')
-            sudo('sed -i \"/# export SPARK_HOME/c\export SPARK_HOME=\/opt\/spark/\" /opt/zeppelin/conf/zeppelin-env.sh')
-            sudo('sed -i \'s/127.0.0.1/0.0.0.0/g\' /opt/zeppelin/conf/zeppelin-site.xml')
-            sudo('mkdir /var/log/zeppelin')
-            sudo('mkdir /var/run/zeppelin')
-            sudo('ln -s /var/log/zeppelin /opt/zeppelin-' + zeppelin_version + '-bin-netinst/logs')
-            sudo('chown ' + os_user + ':' + os_user + ' -R /var/log/zeppelin')
-            sudo('ln -s /var/run/zeppelin /opt/zeppelin-' + zeppelin_version + '-bin-netinst/run')
-            sudo('chown ' + os_user + ':' + os_user + ' -R /var/run/zeppelin')
-            sudo('/opt/zeppelin/bin/install-interpreter.sh --name ' + zeppelin_interpreters + ' --proxy-url $http_proxy')
-            sudo('chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin-' + zeppelin_version + '-bin-netinst')
-            sudo('cp /opt/zeppelin-' + zeppelin_version + '-bin-netinst/interpreter/md/zeppelin-markdown-*.jar /opt/zeppelin/lib/interpreter/') # necessary when executing paragraph launches java process with "-cp :/opt/zeppelin/lib/interpreter/*:"
-            sudo('cp /opt/zeppelin-' + zeppelin_version + '-bin-netinst/interpreter/shell/zeppelin-shell-*.jar /opt/zeppelin/lib/interpreter/')
-        except:
+            conn.sudo('wget ' + zeppelin_link + ' -O /tmp/zeppelin-' + zeppelin_version + '-bin-netinst.tgz')
+            conn.sudo('tar -zxvf /tmp/zeppelin-' + zeppelin_version + '-bin-netinst.tgz -C /opt/')
+            conn.sudo('ln -s /opt/zeppelin-' + zeppelin_version + '-bin-netinst /opt/zeppelin')
+            conn.sudo('cp /opt/zeppelin/conf/zeppelin-env.sh.template /opt/zeppelin/conf/zeppelin-env.sh')
+            java_home = conn.run("update-alternatives --query java | grep -o \'/.*/java-8.*/jre\'").stdout.splitlines()[0].replace('\n','')
+            conn.sudo('''bash -c "echo 'export JAVA_HOME=\'{}\'' >> /opt/zeppelin/conf/zeppelin-env.sh" '''.format(java_home))
+            conn.sudo('cp /opt/zeppelin/conf/zeppelin-site.xml.template /opt/zeppelin/conf/zeppelin-site.xml')
+            conn.sudo('sed -i \"/# export ZEPPELIN_PID_DIR/c\export ZEPPELIN_PID_DIR=/var/run/zeppelin\" /opt/zeppelin/conf/zeppelin-env.sh')
+            conn.sudo('sed -i \"/# export ZEPPELIN_IDENT_STRING/c\export ZEPPELIN_IDENT_STRING=notebook\" /opt/zeppelin/conf/zeppelin-env.sh')
+            conn.sudo('sed -i \"/# export ZEPPELIN_INTERPRETER_DEP_MVNREPO/c\export ZEPPELIN_INTERPRETER_DEP_MVNREPO=https://repo1.maven.org/maven2\" /opt/zeppelin/conf/zeppelin-env.sh')
+            conn.sudo('sed -i \"/# export SPARK_HOME/c\export SPARK_HOME=\/opt\/spark/\" /opt/zeppelin/conf/zeppelin-env.sh')
+            conn.sudo('sed -i \'s/127.0.0.1/0.0.0.0/g\' /opt/zeppelin/conf/zeppelin-site.xml')
+            conn.sudo('mkdir /var/log/zeppelin')
+            conn.sudo('mkdir /var/run/zeppelin')
+            conn.sudo('ln -s /var/log/zeppelin /opt/zeppelin-' + zeppelin_version + '-bin-netinst/logs')
+            conn.sudo('chown ' + os_user + ':' + os_user + ' -R /var/log/zeppelin')
+            conn.sudo('ln -s /var/run/zeppelin /opt/zeppelin-' + zeppelin_version + '-bin-netinst/run')
+            conn.sudo('chown ' + os_user + ':' + os_user + ' -R /var/run/zeppelin')
+            conn.sudo('''bash -l -c '/opt/zeppelin/bin/install-interpreter.sh --name {} --proxy-url $http_proxy' '''.format(zeppelin_interpreters))
+            conn.sudo('chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin-' + zeppelin_version + '-bin-netinst')
+            conn.sudo('mkdir -p /opt/zeppelin/lib/interpreter/')
+            conn.sudo('cp /opt/zeppelin-' + zeppelin_version + '-bin-netinst/interpreter/md/zeppelin-markdown-*.jar /opt/zeppelin/lib/interpreter/') # necessary when executing paragraph launches java process with "-cp :/opt/zeppelin/lib/interpreter/*:"
+            conn.sudo('cp /opt/zeppelin-' + zeppelin_version + '-bin-netinst/interpreter/shell/zeppelin-shell-*.jar /opt/zeppelin/lib/interpreter/')
+        except Exception as err:
+            print('Error:', str(err))
             sys.exit(1)
         try:
-            put(templates_dir + 'zeppelin-notebook.service', '/tmp/zeppelin-notebook.service')
-            sudo("sed -i 's|OS_USR|" + os_user + "|' /tmp/zeppelin-notebook.service")
-            sudo("chmod 644 /tmp/zeppelin-notebook.service")
-            sudo('cp /tmp/zeppelin-notebook.service /etc/systemd/system/zeppelin-notebook.service')
-            sudo('chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin/')
-            sudo('mkdir -p /mnt/var')
-            sudo('chown ' + os_user + ':' + os_user + ' /mnt/var')
-            sudo("systemctl daemon-reload")
-            sudo("systemctl enable zeppelin-notebook")
-            sudo('echo \"d /var/run/zeppelin 0755 ' + os_user + '\" > /usr/lib/tmpfiles.d/zeppelin.conf')
-            sudo('touch /home/' + os_user + '/.ensure_dir/zeppelin_ensured')
-        except:
+            conn.put(templates_dir + 'zeppelin-notebook.service', '/tmp/zeppelin-notebook.service')
+            conn.sudo("sed -i 's|OS_USR|" + os_user + "|' /tmp/zeppelin-notebook.service")
+            http_proxy = conn.run('''bash -l -c 'echo $http_proxy' ''').stdout.replace('\n','')
+            https_proxy = conn.run('''bash -l -c 'echo $https_proxy' ''').stdout.replace('\n','')
+            conn.sudo('sed -i \'/\[Service\]/ a\Environment=\"HTTP_PROXY={}\"\'  /tmp/zeppelin-notebook.service'.format(
+                http_proxy))
+            conn.sudo('sed -i \'/\[Service\]/ a\Environment=\"HTTPS_PROXY={}\"\'  /tmp/zeppelin-notebook.service'.format(
+                https_proxy))
+            conn.sudo("chmod 644 /tmp/zeppelin-notebook.service")
+            conn.sudo('cp /tmp/zeppelin-notebook.service /etc/systemd/system/zeppelin-notebook.service')
+            conn.sudo('chown ' + os_user + ':' + os_user + ' -R /opt/zeppelin/')
+            conn.sudo('mkdir -p /mnt/var')
+            conn.sudo('chown ' + os_user + ':' + os_user + ' /mnt/var')
+            conn.sudo("systemctl daemon-reload")
+            conn.sudo("systemctl enable zeppelin-notebook")
+            conn.sudo('''bash -l -c 'echo \"d /var/run/zeppelin 0755 {}\" > /usr/lib/tmpfiles.d/zeppelin.conf' '''.format(os_user))
+            conn.sudo('touch /home/' + os_user + '/.ensure_dir/zeppelin_ensured')
+        except Exception as err:
+            print('Error:', str(err))
             sys.exit(1)
 
 
 def configure_local_livy_kernels(args):
-    if not exists('/home/' + args.os_user + '/.ensure_dir/local_livy_kernel_ensured'):
+    if not exists(conn,'/home/' + args.os_user + '/.ensure_dir/local_livy_kernel_ensured'):
         port_number_found = False
         default_port = 8998
         livy_port = ''
-        put(templates_dir + 'interpreter_livy.json', '/tmp/interpreter.json')
-        sudo('sed -i "s|ENDPOINTURL|' + args.endpoint_url + '|g" /tmp/interpreter.json')
-        sudo('sed -i "s|OS_USER|' + args.os_user + '|g" /tmp/interpreter.json')
+        conn.put(templates_dir + 'interpreter_livy.json', '/tmp/interpreter.json')
+        conn.sudo('sed -i "s|ENDPOINTURL|' + args.endpoint_url + '|g" /tmp/interpreter.json')
+        conn.sudo('sed -i "s|OS_USER|' + args.os_user + '|g" /tmp/interpreter.json')
         spark_memory = get_spark_memory()
-        sudo('sed -i "s|DRIVER_MEMORY|{}m|g" /tmp/interpreter.json'.format(spark_memory))
+        conn.sudo('sed -i "s|DRIVER_MEMORY|{}m|g" /tmp/interpreter.json'.format(spark_memory))
         while not port_number_found:
-            port_free = sudo('nmap -p ' + str(default_port) + ' localhost | grep "closed" > /dev/null; echo $?')
+            port_free = conn.sudo('nmap -p ' + str(default_port) + ' localhost | grep "closed" > /dev/null; echo $?').stdout
             port_free = port_free[:1]
             if port_free == '0':
                 livy_port = default_port
                 port_number_found = True
             else:
                 default_port += 1
-        sudo('sed -i "s|LIVY_PORT|' + str(livy_port) + '|g" /tmp/interpreter.json')
+        conn.sudo('sed -i "s|LIVY_PORT|' + str(livy_port) + '|g" /tmp/interpreter.json')
         update_zeppelin_interpreters(args.multiple_clusters, r_enabled, 'local')
-        sudo('cp -f /tmp/interpreter.json /opt/zeppelin/conf/interpreter.json')
-        sudo('echo "livy.server.port = ' + str(livy_port) + '" >> /opt/livy/conf/livy.conf')
-        sudo('''echo "SPARK_HOME='/opt/spark/'" >> /opt/livy/conf/livy-env.sh''')
-        if exists('/opt/livy/conf/spark-blacklist.conf'):
-            sudo('sed -i "s/^/#/g" /opt/livy/conf/spark-blacklist.conf')
-        sudo("systemctl start livy-server")
-        sudo('chown ' + args.os_user + ':' + args.os_user + ' -R /opt/zeppelin/')
-        sudo('touch /home/' + args.os_user + '/.ensure_dir/local_livy_kernel_ensured')
-    sudo("systemctl daemon-reload")
-    sudo("systemctl start zeppelin-notebook")
+        conn.sudo('cp -f /tmp/interpreter.json /opt/zeppelin/conf/interpreter.json')
+        conn.sudo('echo "livy.server.port = ' + str(livy_port) + '" >> /opt/livy/conf/livy.conf')
+        conn.sudo('''echo "SPARK_HOME='/opt/spark/'" >> /opt/livy/conf/livy-env.sh''')
+        if exists(conn, '/opt/livy/conf/spark-blacklist.conf'):
+            conn.sudo('sed -i "s/^/#/g" /opt/livy/conf/spark-blacklist.conf')
+        conn.sudo("systemctl start livy-server")
+        conn.sudo('chown ' + args.os_user + ':' + args.os_user + ' -R /opt/zeppelin/')
+        conn.sudo('touch /home/' + args.os_user + '/.ensure_dir/local_livy_kernel_ensured')
+    conn.sudo("systemctl daemon-reload")
+    conn.sudo("systemctl start zeppelin-notebook")
 
 
-def configure_local_spark_kernels(args):
-    if not exists('/home/' + args.os_user + '/.ensure_dir/local_spark_kernel_ensured'):
-        put(templates_dir + 'interpreter_spark.json', '/tmp/interpreter.json')
-        sudo('sed -i "s|ENDPOINTURL|' + args.endpoint_url + '|g" /tmp/interpreter.json')
-        sudo('sed -i "s|OS_USER|' + args.os_user + '|g" /tmp/interpreter.json')
+def configure_local_spark_kernels(args, python_venv_path):
+    if not exists(conn,'/home/' + args.os_user + '/.ensure_dir/local_spark_kernel_ensured'):
+        conn.put(templates_dir + 'interpreter_spark.json', '/tmp/interpreter.json')
+        conn.sudo('sed -i "s|ENDPOINTURL|' + args.endpoint_url + '|g" /tmp/interpreter.json')
+        conn.sudo('sed -i "s|OS_USER|' + args.os_user + '|g" /tmp/interpreter.json')
         spark_memory = get_spark_memory()
-        sudo('sed -i "s|DRIVER_MEMORY|{}m|g" /tmp/interpreter.json'.format(spark_memory))
+        conn.sudo('sed -i "s|DRIVER_MEMORY|{}m|g" /tmp/interpreter.json'.format(spark_memory))
+        conn.sudo('sed -i "s|PYTHON_VENV_PATH|{}m|g" /tmp/interpreter.json'.format(python_venv_path))
         update_zeppelin_interpreters(args.multiple_clusters, r_enabled, 'local')
-        sudo('cp -f /tmp/interpreter.json /opt/zeppelin/conf/interpreter.json')
-        sudo('chown ' + args.os_user + ':' + args.os_user + ' -R /opt/zeppelin/')
-        sudo('touch /home/' + args.os_user + '/.ensure_dir/local_spark_kernel_ensured')
-    sudo("systemctl daemon-reload")
-    sudo("systemctl start zeppelin-notebook")
+        conn.sudo('cp -f /tmp/interpreter.json /opt/zeppelin/conf/interpreter.json')
+        conn.sudo('chown ' + args.os_user + ':' + args.os_user + ' -R /opt/zeppelin/')
+        conn.sudo('touch /home/' + args.os_user + '/.ensure_dir/local_spark_kernel_ensured')
+    conn.sudo("systemctl daemon-reload")
+    conn.sudo("systemctl start zeppelin-notebook")
 
 
 def install_local_livy(args):
-    if not exists('/home/' + args.os_user + '/.ensure_dir/local_livy_ensured'):
-        sudo('wget http://archive.cloudera.com/beta/livy/livy-server-' + args.livy_version + '.zip -O /opt/livy-server-'
+    if not exists(conn,'/home/' + args.os_user + '/.ensure_dir/local_livy_ensured'):
+        conn.sudo('wget http://archive.cloudera.com/beta/livy/livy-server-' + args.livy_version + '.zip -O /opt/livy-server-'
              + args.livy_version + '.zip')
-        sudo('unzip /opt/livy-server-' + args.livy_version + '.zip -d /opt/')
-        sudo('mv /opt/livy-server-' + args.livy_version + '/ /opt/livy/')
-        sudo('mkdir -p /var/run/livy')
-        sudo('mkdir -p /opt/livy/logs')
-        sudo('chown ' + args.os_user + ':' + args.os_user + ' -R /var/run/livy')
-        sudo('chown ' + args.os_user + ':' + args.os_user + ' -R /opt/livy/')
-        put(templates_dir + 'livy-server-cluster.service', '/tmp/livy-server-cluster.service')
-        sudo('mv /tmp/livy-server-cluster.service /opt/')
-        put(templates_dir + 'livy-server.service', '/tmp/livy-server.service')
-        sudo("sed -i 's|OS_USER|" + args.os_user + "|' /tmp/livy-server.service")
-        sudo("chmod 644 /tmp/livy-server.service")
-        sudo('cp /tmp/livy-server.service /etc/systemd/system/livy-server.service')
-        sudo("systemctl daemon-reload")
-        sudo("systemctl enable livy-server")
-        sudo('touch /home/' + args.os_user + '/.ensure_dir/local_livy_ensured')
+        conn.sudo('unzip /opt/livy-server-' + args.livy_version + '.zip -d /opt/')
+        conn.sudo('mv /opt/livy-server-' + args.livy_version + '/ /opt/livy/')
+        conn.sudo('mkdir -p /var/run/livy')
+        conn.sudo('mkdir -p /opt/livy/logs')
+        conn.sudo('chown ' + args.os_user + ':' + args.os_user + ' -R /var/run/livy')
+        conn.sudo('chown ' + args.os_user + ':' + args.os_user + ' -R /opt/livy/')
+        conn.put(templates_dir + 'livy-server-cluster.service', '/tmp/livy-server-cluster.service')
+        conn.sudo('mv /tmp/livy-server-cluster.service /opt/')
+        conn.put(templates_dir + 'livy-server.service', '/tmp/livy-server.service')
+        conn.sudo("sed -i 's|OS_USER|" + args.os_user + "|' /tmp/livy-server.service")
+        conn.sudo("chmod 644 /tmp/livy-server.service")
+        conn.sudo('cp /tmp/livy-server.service /etc/systemd/system/livy-server.service')
+        conn.sudo("systemctl daemon-reload")
+        conn.sudo("systemctl enable livy-server")
+        conn.sudo('touch /home/' + args.os_user + '/.ensure_dir/local_livy_ensured')
 
 
 ##############
@@ -192,16 +205,15 @@
 ##############
 if __name__ == "__main__":
     print("Configure connections")
-    env['connection_attempts'] = 100
-    env.key_filename = [args.keyfile]
-    env.host_string = args.os_user + '@' + args.hostname
+    global conn
+    conn = datalab.fab.init_datalab_connection(args.hostname, args.os_user, args.keyfile)
     deeper_config = json.loads(args.additional_config)
 
     # PREPARE DISK
     print("Prepare .ensure directory")
     try:
-        if not exists('/home/' + args.os_user + '/.ensure_dir'):
-            sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
+        if not exists(conn,'/home/' + args.os_user + '/.ensure_dir'):
+            conn.sudo('mkdir /home/' + args.os_user + '/.ensure_dir')
     except:
         sys.exit(1)
     print("Mount additional volume")
@@ -215,12 +227,14 @@
     if os.environ['notebook_r_enabled'] == 'true':
         print("Installing R")
         ensure_r(args.os_user, r_libs, args.region, args.r_mirror)
-    print("Install Python 2 modules")
-    ensure_python2_libraries(args.os_user)
     print("Install Python 3 modules")
     ensure_python3_libraries(args.os_user)
-    print("Install Python 3 specific version")
-    ensure_python3_specific_version(python3_version, args.os_user)
+
+    # INSTALL PYTHON IN VIRTUALENV
+    print("Configure Python Virtualenv")
+    ensure_python_venv(python_venv_version)
+    #print("Install Python 3 specific version")
+    #ensure_python3_specific_version(python3_version, args.os_user)
 
     # INSTALL SPARK AND CLOUD STORAGE JARS FOR SPARK
     print("Install local Spark")
@@ -242,17 +256,17 @@
         configure_local_livy_kernels(args)
     else:
         print("Configuring local kernels")
-        configure_local_spark_kernels(args)
+        configure_local_spark_kernels(args, python_venv_path)
 
     # INSTALL UNGIT
     print("Install nodejs")
     install_nodejs(args.os_user)
     print("Install Ungit")
     install_ungit(args.os_user, args.exploratory_name, args.edge_ip)
-    if exists('/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
+    if exists(conn, '/home/{0}/{1}'.format(args.os_user, gitlab_certfile)):
         install_gitlab_cert(args.os_user, gitlab_certfile)
     # COPY PRE-COMMIT SCRIPT TO ZEPPELIN
-    sudo('cp /home/{}/.git/templates/hooks/pre-commit /opt/zeppelin/notebook/.git/hooks/'.format(args.os_user))
+    conn.sudo('cp /home/{}/.git/templates/hooks/pre-commit /opt/zeppelin/notebook/.git/hooks/'.format(args.os_user))
 
     # INSTALL INACTIVITY CHECKER
     print("Install inactivity checker")
@@ -269,4 +283,6 @@
     
     #POST INSTALLATION PROCESS
     print("Updating pyOpenSSL library")
-    update_pyopenssl_lib(args.os_user)
\ No newline at end of file
+    update_pyopenssl_lib(args.os_user)
+
+    conn.close()
diff --git a/infrastructure-provisioning/terraform/aws/computational_resources/main/main.tf b/infrastructure-provisioning/terraform/aws/computational_resources/main/main.tf
index c8bea60..ccb9781 100644
--- a/infrastructure-provisioning/terraform/aws/computational_resources/main/main.tf
+++ b/infrastructure-provisioning/terraform/aws/computational_resources/main/main.tf
@@ -1,33 +1,33 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
 provider "aws" {
   access_key = var.access_key_id
   secret_key = var.secret_access_key
-  region     = var.region
+  region = var.region
 }
 
 module "common" {
-  source        = "../modules/common"
-  sbn           = var.service_base_name
+  source = "../modules/common"
+  sbn = var.service_base_name
   project_name  = var.project_name
   project_tag   = var.project_tag
   endpoint_tag  = var.endpoint_tag
diff --git a/infrastructure-provisioning/terraform/aws/computational_resources/main/variables.tf b/infrastructure-provisioning/terraform/aws/computational_resources/main/variables.tf
index 25f322b..a2587e3 100644
--- a/infrastructure-provisioning/terraform/aws/computational_resources/main/variables.tf
+++ b/infrastructure-provisioning/terraform/aws/computational_resources/main/variables.tf
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/aws/endpoint/main/README.md b/infrastructure-provisioning/terraform/aws/endpoint/main/README.md
new file mode 100644
index 0000000..f2ab96c
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/endpoint/main/README.md
@@ -0,0 +1,18 @@
+# Terraform module for deploying DataLab Endpoint instance
+
+List of variables which should be provided:
+
+| Variable                 | Type   | Description/Value                                                                                                                                   |
+|--------------------------|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------|
+| service\_base\_name      | string | Any infrastructure value (should be unique if multiple SSN’s have been deployed before). Should be same as on ssn                                   |
+| vpc\_id                  | string | ID of AWS VPC if you already have VPC created.                                                                                                      | 
+| vpc\_cidr                | string | CIDR for VPC creation. Conflicts with _vpc\_id_. Default: 172.31.0.0/16                                                                             |
+| subnet\_id               | string | ID of AWS Subnet if you already have subnet created.                                                                                                |
+| subnet\_cidr             | string | CIDR for Subnet creation. Conflicts with _subnet\_id_. Default: 172.31.0.0/24                                                                       |
+| ami                      | string | **Required** ID of EC2 AMI. Default ubuntu 18.04.1 (debian os): "ami-08692d171e3cf02d6" (aws ami: 258751437250/ami-ubuntu-18.04-1.13.0-00-1543963388|
+| key\_name                | string | **Required** Name of EC2 Key pair. (Existed on AWS account)                                                                                         |
+| region                   | string | Name of AWS region. Default: us-west-2                                                                                                              |
+| zone                     | string | Name of AWS zone. Default: a                                                                                                                        |                    
+| endpoint\_volume\_size   | int    | Size of root volume in GB. Default: 30                                                                                                              |
+| network\_type            | string | Type of created network (if network is not existed and require creation) for endpoint. Default: public                                              |
+| endpoint\_instance\_shape| string | Instance shape of Endpoint. Default: t2.medium                                                                                                      |
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/endpoint/main/bucket.tf b/infrastructure-provisioning/terraform/aws/endpoint/main/bucket.tf
index 8a930e0..86f70f0 100644
--- a/infrastructure-provisioning/terraform/aws/endpoint/main/bucket.tf
+++ b/infrastructure-provisioning/terraform/aws/endpoint/main/bucket.tf
@@ -1,33 +1,33 @@
 # *****************************************************************************
- #
- # Licensed to the Apache Software Foundation (ASF) under one
- # or more contributor license agreements.  See the NOTICE file
- # distributed with this work for additional information
- # regarding copyright ownership.  The ASF licenses this file
- # to you under the Apache License, Version 2.0 (the
- # "License"); you may not use this file except in compliance
- # with the License.  You may obtain a copy of the License at
- #
- #   http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing,
- # software distributed under the License is distributed on an
- # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- # KIND, either express or implied.  See the License for the
- # specific language governing permissions and limitations
- # under the License.
- #
- # ******************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
 
- locals {
-   shared_s3_name = "${var.service_base_name}-${var.endpoint_id}-shared-bucket"
- }
+locals {
+  shared_s3_name = "${var.service_base_name}-${var.endpoint_id}-shared-bucket"
+}
 
- resource "aws_s3_bucket" "shared_bucket" {
-   bucket = local.shared_s3_name
-   acl    = "private"
-   tags   = {
-     Name                           = local.shared_s3_name
+resource "aws_s3_bucket" "shared_bucket" {
+  bucket = local.shared_s3_name
+  acl = "private"
+  tags = {
+    Name = local.shared_s3_name
      "${local.additional_tag[0]}"   = local.additional_tag[1]
      "${var.tag_resource_id}"       = "${var.service_base_name}:${local.shared_s3_name}"
      "${var.service_base_name}-tag" = local.shared_s3_name
diff --git a/infrastructure-provisioning/terraform/aws/endpoint/main/network.tf b/infrastructure-provisioning/terraform/aws/endpoint/main/network.tf
index eea071b..1f0f96c 100644
--- a/infrastructure-provisioning/terraform/aws/endpoint/main/network.tf
+++ b/infrastructure-provisioning/terraform/aws/endpoint/main/network.tf
@@ -121,6 +121,13 @@
     cidr_blocks = ["0.0.0.0/0"]
   }
 
+    ingress {
+    from_port   = 3128
+    to_port     = 3128
+    protocol    = "tcp"
+    cidr_blocks = ["0.0.0.0/0"]
+  }
+
   egress {
     from_port   = 0
     to_port     = 0
diff --git a/infrastructure-provisioning/terraform/aws/endpoint/main/variables.tf b/infrastructure-provisioning/terraform/aws/endpoint/main/variables.tf
index 798ddb8..833afeb 100644
--- a/infrastructure-provisioning/terraform/aws/endpoint/main/variables.tf
+++ b/infrastructure-provisioning/terraform/aws/endpoint/main/variables.tf
@@ -75,7 +75,7 @@
 variable "ldap_users_group" {}
 
 variable "additional_tag" {
-  default = "product:dlab"
+  default = "product:datalab"
 }
 
 variable "tag_resource_id" {
diff --git a/infrastructure-provisioning/terraform/aws/project/main/variales.tf b/infrastructure-provisioning/terraform/aws/project/main/variales.tf
new file mode 100644
index 0000000..5af7c76
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/project/main/variales.tf
@@ -0,0 +1,64 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+variable "access_key_id" {}
+
+variable "secret_access_key" {}
+
+variable "service_base_name" {}
+
+variable "project_name" {}
+
+variable "project_tag" {}
+
+variable "endpoint_tag" {}
+
+variable "user_tag" {}
+
+variable "custom_tag" {}
+
+variable "region" {}
+
+variable "zone" {}
+
+variable "vpc_id" {}
+
+variable "subnet_id" {}
+
+variable "nb_cidr" {}
+
+variable "edge_cidr" {}
+
+variable "ami" {}
+
+variable "instance_type" {}
+
+variable "key_name" {}
+
+variable "edge_volume_size" {}
+
+variable "additional_tag" {
+  default = "product:datalab"
+}
+
+variable "tag_resource_id" {
+  default = "user:tag"
+}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/.helmignore b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/.helmignore
new file mode 100644
index 0000000..4976779
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/.helmignore
@@ -0,0 +1,43 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/Chart.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/Chart.yaml
new file mode 100644
index 0000000..a9925e4
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/Chart.yaml
@@ -0,0 +1,26 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+apiVersion: v1
+appVersion: "1.0"
+description: A Helm chart for Kubernetes
+name: datalab-billing
+version: 0.1.0
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/NOTES.txt b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/NOTES.txt
new file mode 100644
index 0000000..7795916
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/NOTES.txt
@@ -0,0 +1,42 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+  {{- range .paths }}
+  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
+  {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "datalab-billing.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "datalab-billing.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "datalab-billing.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "datalab-billing.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:80
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/_helpers.tpl b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/_helpers.tpl
new file mode 100644
index 0000000..e7da47f
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/_helpers.tpl
@@ -0,0 +1,65 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "datalab-billing.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "datalab-billing.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "datalab-billing.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "datalab-billing.labels" -}}
+app.kubernetes.io/name: {{ include "datalab-billing.name" . }}
+helm.sh/chart: {{ include "datalab-billing.chart" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/configmap-billing-conf.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/configmap-billing-conf.yaml
new file mode 100644
index 0000000..6d54bba
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/configmap-billing-conf.yaml
@@ -0,0 +1,105 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "datalab-billing.fullname" . }}-billing-conf
+data:
+  billing.yml: |
+    # Specify the parameters enclosed in angle brackets.
+    # Run the follows command to get help for details of configuration:
+    # java -jar billing-1.0.jar --help conf
+    # java -jar billing-1.0.jar --help {adapter | parser | filter | logappender} [name]
+
+    billingEnabled: true
+
+    host: {{ .Values.billing.mongo.host }}
+    port: {{ .Values.billing.mongo.port }}
+    username: {{ .Values.billing.mongo.username }}
+    password: ${MONGO_DB_PASSWORD}
+    database: {{ .Values.billing.mongo.db_name }}
+
+    scheduler:
+    # Schedule is comma separated values of time in format hh[:mm[:ss]]. hh - in the 24-hour clock, at 8:15PM is 20:15.
+      schedule: 8:40, 8:50, 9:00, 9:10, 9:20, 9:30, 16:00, 16:30, 17:00, 17:30, 18:00, 15:45, 16:45, 17:45, 17:15, 18:15, 18:00, 21:00
+
+    # Adapter for reading source data. Known types: file, s3file
+    adapterIn:
+      - type: s3file
+        bucket: {{ .Values.billing.bucket }}
+        path: {{ .Values.billing.path }}
+        awsJobEnabled: {{ .Values.billing.aws_job_enabled }}
+        accountId: {{ .Values.billing.account_id }}
+        accessKeyId:
+        secretAccessKey:
+
+    # Adapter for writing converted data. Known types: console, file, s3file, mongodb
+    adapterOut:
+      - type: mongodatalab
+        host: {{ .Values.billing.mongo.host }}
+        port: {{ .Values.billing.mongo.port }}
+        username: {{ .Values.billing.mongo.username }}
+        password: ${MONGO_DB_PASSWORD}
+        database: {{ .Values.billing.mongo.db_name }}
+    #    bufferSize: 10000
+        upsert: true
+
+    # Filter for source and converted data.
+    filter:
+      - type: aws
+        currencyCode: USD
+        columndatalabTag: {{ .Values.billing.tag }}
+        serviceBaseName: {{ .Values.billing.service_base_name }}
+
+
+    # Parser of source data to common format.
+    parser:
+      - type: csv
+        headerLineNo: 1
+        skipLines: 1
+        columnMapping: >-
+          datalab_id={{ .Values.billing.datalab_id }};usage_date={{ .Values.billing.usage_date }};product={{ .Values.billing.product }};
+          usage_type={{ .Values.billing.usage_type }};usage={{ .Values.billing.usage }};cost={{ .Values.billing.cost }};
+          resource_id={{ .Values.billing.resource_id }};tags={{ .Values.billing.tags }}
+        aggregate: day
+
+
+    # Logging configuration.
+    logging:
+     # Default logging level
+      level: INFO
+      # Logging levels for appenders.
+      loggers:
+        com.epam: DEBUG
+        org.apache.http: WARN
+        org.mongodb.driver: WARN
+        org.hibernate: WARN
+     # Logging appenders
+      appenders:
+        - type: console
+        - type: file
+          currentLogFilename: /root/billing.log
+          archive: true
+          archivedLogFilenamePattern: /root/billing-%d{yyyy-MM-dd}.log.gz
+          archivedFileCount: 10
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/deployment.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/deployment.yaml
new file mode 100644
index 0000000..3104ff4
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/deployment.yaml
@@ -0,0 +1,86 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "datalab-billing.fullname" . }}
+  labels:
+  {{ include "datalab-billing.labels" . | indent 4 }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: {{ include "datalab-billing.name" . }}
+      app.kubernetes.io/instance: {{ .Release.Name }}
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/name: {{ include "datalab-billing.name" . }}
+        app.kubernetes.io/instance: {{ .Release.Name }}
+    spec:
+    {{- with .Values.imagePullSecrets }}
+    imagePullSecrets:
+      {{- toYaml . | nindent 8 }}
+    {{- end }}
+    containers:
+      - name: {{ .Chart.Name }}
+        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+        imagePullPolicy: {{ .Values.image.pullPolicy }}
+        env:
+          - name: MONGO_DB_PASSWORD
+            valueFrom:
+              secretKeyRef:
+                name: mongo-db-password
+                key: password
+        ports:
+          - name: mongo
+            containerPort: 21017
+            protocol: TCP
+        resources:
+          {{- toYaml .Values.resources | nindent 12 }}
+        volumeMounts:
+          - name: billing-yml
+            mountPath: /root/billing.yml
+            subPath: billing
+            readOnly: true
+    volumes:
+      - name: billing-yml
+        configMap:
+          name: {{ include "datalab-billing.fullname" . }}-billing-conf
+          defaultMode: 0644
+          items:
+            - key: billing.yml
+              path: billing
+    {{- with .Values.nodeSelector }}
+    nodeSelector:
+      {{- toYaml . | nindent 8 }}
+    {{- end }}
+    {{- with .Values.affinity }}
+    affinity:
+      {{- toYaml . | nindent 8 }}
+    {{- end }}
+    {{- with .Values.tolerations }}
+    tolerations:
+      {{- toYaml . | nindent 8 }}
+    {{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/service.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/service.yaml
new file mode 100644
index 0000000..c840f1d
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/templates/service.yaml
@@ -0,0 +1,38 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "datalab-billing.fullname" . }}
+  labels:
+  {{ include "datalab-billing.labels" . | indent 4 }}
+spec:
+  ports:
+    - port: {{ .Values.service.port }}
+      targetPort: 27017
+      protocol: TCP
+  selector:
+    app.kubernetes.io/name: {{ include "datalab-billing.name" . }}
+    app.kubernetes.io/instance: {{ .Release.Name }}
+
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/values.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/values.yaml
new file mode 100644
index 0000000..0d4a5cb
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing-chart/values.yaml
@@ -0,0 +1,76 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+# Default values for datalab-billing.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 1
+
+image:
+  repository: epamdatalab/billing
+  tag: '0.1-aws'
+  # pullPolicy: IfNotPresent
+  pullPolicy: Always
+
+#imagePullSecrets: []
+#nameOverride: ""
+#fullnameOverride: ""
+
+service:
+  type: ClusterIP
+  port: 58334
+
+ingress:
+  enabled: false
+  host: ""
+  annotations:
+  # kubernetes.io/ingress.class: nginx
+  # nginx.ingress.kubernetes.io/ssl-redirect: "false"
+  # kubernetes.io/tls-acme: "true"
+
+  tls: []
+  #  - secretName: chart-example-tls
+  #    hosts:
+  #      - chart-example.local
+labels: {}
+
+billing:
+  mongo:
+    host: ${mongo_service_name}
+    port: ${mongo_port}
+    username: ${mongo_user}
+    db_name: ${mongo_db_name}
+  service_base_name: ${service_base_name}
+  tag_resource_id: ${tag_resource_id}
+  bucket: ${billing_bucket}
+  path: ${billing_bucket_path}
+  aws_job_enabled: ${billing_aws_job_enabled}
+  account_id: ${billing_aws_account_id}
+  tag: ${billing_tag}
+  datalab_id: ${billing_datalab_id}
+  usage_date: ${billing_usage_date}
+  product: ${billing_product}
+  usage_type: ${billing_usage_type}
+  usage: ${billing_usage}
+  cost: ${billing_cost}
+  resource_id: ${billing_resource_id}
+  tags: ${billing_tags}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing.tf
new file mode 100644
index 0000000..9e70827
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-billing.tf
@@ -0,0 +1,59 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+data "template_file" "datalab_billing_values" {
+  template = file("./datalab-billing-chart/values.yaml")
+  vars = {
+    mongo_db_name = var.mongo_dbname
+    mongo_user = var.mongo_db_username
+    mongo_port = var.mongo_service_port
+    mongo_service_name = var.mongo_service_name
+    service_base_name = var.service_base_name
+    tag_resource_id = var.tag_resource_id
+    billing_bucket = var.billing_bucket
+    billing_bucket_path = var.billing_bucket_path
+    billing_aws_job_enabled = var.billing_aws_job_enabled
+    billing_aws_account_id = var.billing_aws_account_id
+    billing_tag = var.billing_tag
+    billing_datalab_id = var.billing_datalab_id
+    billing_usage_date = var.billing_usage_date
+    billing_product = var.billing_product
+    billing_usage_type = var.billing_usage_type
+    billing_usage = var.billing_usage
+    billing_cost = var.billing_cost
+    billing_resource_id = var.billing_resource_id
+    billing_tags = var.billing_tags
+  }
+}
+
+resource "helm_release" "datalab-billing" {
+  name = "datalab-billing"
+  chart = "./datalab-billing-chart"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  depends_on = [
+    helm_release.mongodb,
+    kubernetes_secret.mongo_db_password_secret]
+  wait = true
+
+  values = [
+    data.template_file.datalab_billing_values.rendered
+  ]
+}
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/.helmignore b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/.helmignore
new file mode 100644
index 0000000..4976779
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/.helmignore
@@ -0,0 +1,43 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/Chart.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/Chart.yaml
new file mode 100644
index 0000000..6b0ad3c
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/Chart.yaml
@@ -0,0 +1,26 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+apiVersion: v1
+appVersion: "1.0"
+description: A Helm chart for Kubernetes
+name: datalab-ui
+version: 0.1.0
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/NOTES.txt b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/NOTES.txt
new file mode 100644
index 0000000..6e677c6
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/NOTES.txt
@@ -0,0 +1,42 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+1. Get the application URL by running these commands:
+{{- if .Values.ui.ingress.enabled }}
+{{- range $host := .Values.ui.ingress.hosts }}
+  {{- range .paths }}
+  http{{ if $.Values.ui.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
+  {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.ui.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "datalab-ui.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.ui.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "datalab-ui.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "datalab-ui.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.ui.service.http_port }}
+{{- else if contains "ClusterIP" .Values.ui.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "datalab-ui.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:80
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/_helpers.tpl b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/_helpers.tpl
new file mode 100644
index 0000000..cb09955
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/_helpers.tpl
@@ -0,0 +1,65 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "datalab-ui.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "datalab-ui.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "datalab-ui.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "datalab-ui.labels" -}}
+app.kubernetes.io/name: {{ include "datalab-ui.name" . }}
+helm.sh/chart: {{ include "datalab-ui.chart" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/cert.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/cert.yaml
new file mode 100644
index 0000000..386d2bf
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/cert.yaml
@@ -0,0 +1,64 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+  {{- if not .Values.ui.custom_certs.enabled -}}
+apiVersion: certmanager.k8s.io/v1alpha1
+kind: Certificate
+metadata:
+  name: datalab-ui
+  namespace: {{ .Values.namespace }}
+spec:
+  # The secret name to store the signed certificate
+  secretName: {{ include "datalab-ui.fullname" . }}-tls
+  # Common Name
+  commonName: datalab-kubernetes-cluster
+  # DNS SAN
+  dnsNames:
+    - localhost
+    - {{ .Values.ui.ingress.host }}
+  # IP Address SAN
+  ipAddresses:
+    - "127.0.0.1"
+  # Duration of the certificate
+  duration: 24h
+  # Renew 8 hours before the certificate expiration
+  renewBefore: 8h
+  # The reference to the step issuer
+  issuerRef:
+    group: certmanager.step.sm
+    kind: Issuer
+    name: step-issuer
+  {{- end }}
+---
+  {{- if .Values.ui.custom_certs.enabled -}}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "datalab-ui.fullname" . }}-tls
+  namespace: {{ .Values.namespace }}
+type: kubernetes.io/tls
+data:
+  ca.crt: {{ .Values.ui.custom_certs.ca }}
+  tls.crt: {{ .Values.ui.custom_certs.crt }}
+  tls.key: {{ .Values.ui.custom_certs.key }}
+  {{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/configmap-ui-conf.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/configmap-ui-conf.yaml
new file mode 100644
index 0000000..5ab2abd
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/configmap-ui-conf.yaml
@@ -0,0 +1,235 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "datalab-ui.fullname" . }}-ui-conf
+data:
+  ssn.yml: |
+    <#assign LOG_ROOT_DIR="/var/opt/datalab/log">
+    <#assign KEYS_DIR="/root/keys">
+    <#assign KEY_STORE_PATH="/root/keys/ssn.keystore.jks">
+    <#assign KEY_STORE_PASSWORD="${SSN_KEYSTORE_PASSWORD}">
+    <#assign TRUST_STORE_PATH="/usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts">
+    <#assign TRUST_STORE_PASSWORD="changeit">
+
+    # Available options are aws, azure, gcp
+    <#assign CLOUD_TYPE="aws">
+    cloudProvider: ${CLOUD_TYPE}
+
+    #Switch on/off developer mode here
+    <#assign DEV_MODE="false">
+    devMode: ${DEV_MODE}
+
+    mongo:
+      host: {{ .Values.ui.mongo.host }}
+      port: {{ .Values.ui.mongo.port }}
+      username: {{ .Values.ui.mongo.username }}
+      password: ${MONGO_DB_PASSWORD}
+      database: {{ .Values.ui.mongo.db_name }}
+
+    selfService:
+      protocol: https
+      host: localhost
+      port: {{ .Values.ui.service.https_port }}
+      jerseyClient:
+        timeout: 3s
+        connectionTimeout: 3s
+
+    securityService:
+      protocol: https
+      host: localhost
+      port: 8090
+      jerseyClient:
+        timeout: 20s
+        connectionTimeout: 20s
+
+    provisioningService:
+      jerseyClient:
+        timeout: 3s
+        connectionTimeout: 3s
+
+    # Log out user on inactivity
+    inactiveUserTimeoutMillSec: 7200000
+
+  self-service.yml: |
+    <#include "/root/ssn.yml">
+
+    <#if CLOUD_TYPE == "aws">
+    # Minimum and maximum number of slave EMR instances than could be created
+    minEmrInstanceCount: 2
+    maxEmrInstanceCount: 14
+    # Minimum and maximum percentage cost for slave EMR spot instances biding
+    minEmrSpotInstanceBidPct: 20
+    maxEmrSpotInstanceBidPct: 90
+    </#if>
+
+    <#if CLOUD_TYPE == "gcp">
+    # Maximum length for gcp user name (due to gcp restrictions)
+    maxUserNameLength: 10
+    # Minimum and maximum number of slave Dataproc instances that could be created
+    minInstanceCount: 3
+    maxInstanceCount: 15
+    minDataprocPreemptibleCount: 0
+    gcpOuauth2AuthenticationEnabled: false
+    </#if>
+
+    # Boundaries for Spark cluster creation
+    minSparkInstanceCount: 2
+    maxSparkInstanceCount: 14
+
+    # Timeout for check the status of environment via provisioning service
+    checkEnvStatusTimeout: 5m
+
+    # Restrict access to DataLab features using roles policy
+    rolePolicyEnabled: true
+    # Default access to DataLab features using roles policy
+    roleDefaultAccess: true
+
+    # Set to true to enable the scheduler of billing report.
+    billingSchedulerEnabled: true
+    # Name of configuration file for billing report.
+    <#if DEV_MODE == "true">
+    billingConfFile: ${sys['user.dir']}/../billing/billing.yml
+    <#else>
+    billingConfFile: ${DATALAB_CONF_DIR}/billing.yml
+    </#if>
+
+    <#if CLOUD_TYPE == "azure">
+    azureUseLdap: <LOGIN_USE_LDAP>
+    maxSessionDurabilityMilliseconds: 288000000
+    </#if>
+
+    serviceBaseName: {{ .Values.ui.service_base_name }}
+    os: {{ .Values.ui.os }}
+    server:
+      requestLog:
+        appenders:
+        - type: file
+          currentLogFilename: ${LOG_ROOT_DIR}/ssn/request-selfservice.log
+          archive: true
+          archivedLogFilenamePattern: ${LOG_ROOT_DIR}/ssn/request-selfservice-%d{yyyy-MM-dd}.log.gz
+          archivedFileCount: 10
+      rootPath: "/api"
+      applicationConnectors:
+      - type: http
+        port: {{ .Values.ui.service.http_port }}
+      - type: https
+        port: {{ .Values.ui.service.https_port }}
+        certAlias: ssn
+        validateCerts: false
+        keyStorePath: ${KEY_STORE_PATH}
+        keyStorePassword: ${KEY_STORE_PASSWORD}
+        trustStorePath: ${TRUST_STORE_PATH}
+        trustStorePassword: ${TRUST_STORE_PASSWORD}
+      adminConnectors:
+    #    - type: http
+    #      port: 8081
+      - type: https
+        port: 8444
+        certAlias: ssn
+        validateCerts: false
+        keyStorePath: ${KEY_STORE_PATH}
+        keyStorePassword: ${KEY_STORE_PASSWORD}
+        trustStorePath: ${TRUST_STORE_PATH}
+        trustStorePassword: ${TRUST_STORE_PASSWORD}
+
+    mongoMigrationEnabled: false
+
+    logging:
+      level: INFO
+      loggers:
+        com.epam: TRACE
+        com.novemberain: ERROR
+      appenders:
+      - type: console
+      - type: file
+        currentLogFilename: ${LOG_ROOT_DIR}/ssn/selfservice.log
+        archive: true
+        archivedLogFilenamePattern: ${LOG_ROOT_DIR}/ssn/selfservice-%d{yyyy-MM-dd}.log.gz
+        archivedFileCount: 10
+
+    mavenSearchService:
+      protocol: http
+      host: search.maven.org
+      port: 80
+      jerseyClient:
+        timeout: 5s
+        connectionTimeout: 5s
+
+    schedulers:
+      inactivity:
+        enabled: false
+        cron: "0 0 0/2 ? * * *"
+      startComputationalScheduler:
+        enabled: true
+        cron: "*/20 * * ? * * *"
+      stopComputationalScheduler:
+        enabled: true
+        cron: "*/20 * * ? * * *"
+      startExploratoryScheduler:
+        enabled: true
+        cron: "*/20 * * ? * * *"
+      stopExploratoryScheduler:
+        enabled: true
+        cron: "*/20 * * ? * * *"
+      terminateComputationalScheduler:
+        enabled: true
+        cron: "*/20 * * ? * * *"
+      checkQuoteScheduler:
+        enabled: true
+        cron: "0 0 * ? * * *"
+      checkUserQuoteScheduler:
+        enabled: false
+        cron: "0 0 * ? * * *"
+      checkProjectQuoteScheduler:
+        enabled: true
+        cron: "0 * * ? * * *"
+
+
+    guacamole:
+      connectionProtocol: ssh
+      serverPort: 4822
+      port: 22
+      username: datalab-user
+
+    keycloakConfiguration:
+      redirectUri: {{ .Values.ui.keycloak.redirect_uri }}
+      realm: {{ .Values.ui.keycloak.realm_name }}
+      bearer-only: true
+      auth-server-url: ${KEYCLOAK_AUTH_URL}
+      ssl-required: none
+      register-node-at-startup: true
+      register-node-period: 600
+      resource: {{ .Values.ui.keycloak.client_id }}
+      credentials:
+        secret: ${KEYCLOAK_CLIENT_SECRET}
+
+    jerseyClient:
+      minThreads: 1
+      maxThreads: 128
+      workQueueSize: 8
+      gzipEnabled: true
+      gzipEnabledForRequests: false
+      chunkedEncodingEnabled: true
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/deployment.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/deployment.yaml
new file mode 100644
index 0000000..782e7ca
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/deployment.yaml
@@ -0,0 +1,107 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "datalab-ui.fullname" . }}
+  labels:
+  {{ include "datalab-ui.labels" . | indent 4 }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: {{ include "datalab-ui.name" . }}
+      app.kubernetes.io/instance: {{ .Release.Name }}
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/name: {{ include "datalab-ui.name" . }}
+        app.kubernetes.io/instance: {{ .Release.Name }}
+    spec:
+      containers:
+        - name: {{ .Chart.Name }}
+          image: "{{ .Values.ui.image.repository }}:{{ .Values.ui.image.tag }}"
+          imagePullPolicy: {{ .Values.ui.image.pullPolicy }}
+          env:
+            - name: MONGO_DB_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: mongo-db-password
+                  key: password
+            - name: SSN_KEYSTORE_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: ssn-keystore-password
+                  key: password
+            - name: KEYCLOAK_CLIENT_SECRET
+              valueFrom:
+                secretKeyRef:
+                  name: keycloak-client-secret
+                  key: client_secret
+            - name: KEYCLOAK_AUTH_URL
+              value: {{ .Values.ui.keycloak.auth_server_url }}
+          ports:
+            - name: http
+              containerPort: 80
+              protocol: TCP
+          resources:
+            {{- toYaml .Values.resources | nindent 12 }}
+          volumeMounts:
+            - name: ui-conf
+              mountPath: /root/ssn.yml
+              subPath: ssn
+              readOnly: true
+            - name: ui-conf
+              mountPath: /root/self-service.yml
+              subPath: self-service
+              readOnly: true
+            - mountPath: "/root/step-certs"
+              name: ui-tls
+              readOnly: true
+      volumes:
+        - name: ui-conf
+          configMap:
+            name: {{ include "datalab-ui.fullname" . }}-ui-conf
+            defaultMode: 0644
+            items:
+              - key: ssn.yml
+                path: ssn
+              - key: self-service.yml
+                path: self-service
+        - name: ui-tls
+          secret:
+            secretName: {{ include "datalab-ui.fullname" . }}-tls
+
+      {{- with .Values.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+    {{- with .Values.affinity }}
+    affinity:
+      {{- toYaml . | nindent 8 }}
+    {{- end }}
+    {{- with .Values.tolerations }}
+    tolerations:
+      {{- toYaml . | nindent 8 }}
+    {{- end }}
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/ingress.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/ingress.yaml
new file mode 100644
index 0000000..f12fd29
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/ingress.yaml
@@ -0,0 +1,57 @@
+{{- /*
+  # ******************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+  {{- if .Values.ui.ingress.enabled -}}
+  {{- $fullName := include "datalab-ui.fullname" . -}}
+  {{ $servicePort := .Values.ui.service.http_port }}
+  {{ $host := .Values.ui.ingress.host }}
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+  name: {{ $fullName }}
+  labels:
+  {{ include "datalab-ui.labels" . | indent 4 }}
+annotations:
+  {{- with .Values.ui.ingress.annotations }}
+  {{ toYaml . | indent 4 }}
+  {{- end }}
+spec:
+  {{- if .Values.ui.ingress.tls }}
+tls:
+  {{- range .Values.ui.ingress.tls }}
+- hosts:
+  {{- range .hosts }}
+  - {{ . | quote }}
+  {{- end }}
+  secretName: {{ .secretName }}
+  {{- end }}
+  {{- end }}
+rules:
+  - host: {{ $host }}
+    http:
+      paths:
+        - backend:
+            serviceName: {{ $fullName }}
+            servicePort: {{ $servicePort }}
+          path: /
+  {{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/service.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/service.yaml
new file mode 100644
index 0000000..f5a2949
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/templates/service.yaml
@@ -0,0 +1,43 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "datalab-ui.fullname" . }}
+  labels:
+  {{ include "datalab-ui.labels" . | indent 4 }}
+spec:
+  type: {{ .Values.ui.service.type }}
+  ports:
+    - port: {{ .Values.ui.service.http_port }}
+      targetPort: {{ .Values.ui.service.http_port }}
+      protocol: TCP
+      name: http
+    - port: {{ .Values.ui.service.https_port }}
+      targetPort: {{ .Values.ui.service.https_port }}
+      protocol: TCP
+      name: https
+  selector:
+    app.kubernetes.io/name: {{ include "datalab-ui.name" . }}
+    app.kubernetes.io/instance: {{ .Release.Name }}
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/values.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/values.yaml
new file mode 100644
index 0000000..7996536
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui-chart/values.yaml
@@ -0,0 +1,69 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+# Default values for datalab-ui.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 1
+labels: {}
+namespace: ${namespace}
+
+ui:
+  service_base_name: ${service_base_name}
+  os: ${os}
+  image:
+    repository: epamdatalab/ui
+    tag: '0.1-aws'
+    pullPolicy: Always
+  service:
+    type: ClusterIP
+    #  port: 58443
+    http_port: 58080
+    https_port: 58443
+  ingress:
+    enabled: true
+    host: ${ssn_k8s_alb_dns_name}
+    annotations:
+      kubernetes.io/ingress.class: nginx
+      nginx.ingress.kubernetes.io/ssl-redirect: "true"
+      nginx.ingress.kubernetes.io/proxy-body-size: "50m"
+
+    tls:
+      - secretName: datalab-ui-tls
+        hosts:
+          - ${ssn_k8s_alb_dns_name}
+  mongo:
+    host: ${mongo_service_name}
+    port: ${mongo_port}
+    username: ${mongo_user}
+    db_name: ${mongo_db_name}
+  keycloak:
+    auth_server_url: https://${ssn_k8s_alb_dns_name}/auth
+    redirect_uri: https://${ssn_k8s_alb_dns_name}/
+    realm_name: ${keycloak_realm_name}
+    client_id: ${keycloak_client_id}
+
+  custom_certs:
+    enabled: ${custom_certs_enabled}
+    crt: ${custom_certs_crt}
+    key: ${custom_certs_key}
+    ca: ${step_ca_crt}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui.tf
new file mode 100644
index 0000000..f709107
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/datalab-ui.tf
@@ -0,0 +1,73 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+locals {
+  custom_certs_enabled = lower(var.custom_certs_enabled)
+  custom_cert_name = local.custom_certs_enabled == "true" ? reverse(split("/", var.custom_cert_path))[0] : "None"
+  custom_key_name = local.custom_certs_enabled == "true" ? reverse(split("/", var.custom_key_path))[0] : "None"
+  custom_cert = local.custom_certs_enabled == "true" ? base64encode(file("/tmp/${local.custom_cert_name}")) : "None"
+  custom_key = local.custom_certs_enabled == "true" ? base64encode(file("/tmp/${local.custom_key_name}")) : "None"
+  ui_host = local.custom_certs_enabled == "true" ? var.custom_certs_host : data.kubernetes_service.nginx-service.load_balancer_ingress.0.hostname
+}
+
+data "template_file" "datalab_ui_values" {
+  template = file("./datalab-ui-chart/values.yaml")
+  vars = {
+    mongo_db_name = var.mongo_dbname
+    mongo_user = var.mongo_db_username
+    mongo_port = var.mongo_service_port
+    mongo_service_name = var.mongo_service_name
+    ssn_k8s_alb_dns_name = local.ui_host
+    service_base_name = var.service_base_name
+    os = var.env_os
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+    custom_certs_enabled = local.custom_certs_enabled
+    custom_certs_crt = local.custom_cert
+    custom_certs_key = local.custom_key
+    step_ca_crt = lookup(data.external.step-ca-config-values.result, "rootCa")
+    keycloak_realm_name = var.keycloak_realm_name
+    keycloak_client_id = var.keycloak_client_id
+  }
+}
+
+resource "helm_release" "datalab_ui" {
+  name = "datalab-ui"
+  chart = "./datalab-ui-chart"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  depends_on = [
+    helm_release.mongodb,
+    kubernetes_secret.mongo_db_password_secret,
+    null_resource.step_ca_issuer_delay]
+  wait = true
+
+  values = [
+    data.template_file.datalab_ui_values.rendered
+  ]
+}
+
+data "kubernetes_service" "nginx-service" {
+  metadata {
+    name = "${helm_release.nginx.name}-controller"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  }
+}
+
+
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-billing.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-billing.tf
deleted file mode 100644
index b301723..0000000
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-billing.tf
+++ /dev/null
@@ -1,57 +0,0 @@
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-
-data "template_file" "dlab_billing_values" {
-  template = file("./dlab-billing-chart/values.yaml")
-  vars = {
-    mongo_db_name           = var.mongo_dbname
-    mongo_user              = var.mongo_db_username
-    mongo_port              = var.mongo_service_port
-    mongo_service_name      = var.mongo_service_name
-    service_base_name       = var.service_base_name
-    tag_resource_id         = var.tag_resource_id
-    billing_bucket          = var.billing_bucket
-    billing_bucket_path     = var.billing_bucket_path
-    billing_aws_job_enabled = var.billing_aws_job_enabled
-    billing_aws_account_id  = var.billing_aws_account_id
-    billing_tag             = var.billing_tag
-    billing_dlab_id         = var.billing_dlab_id
-    billing_usage_date      = var.billing_usage_date
-    billing_product         = var.billing_product
-    billing_usage_type      = var.billing_usage_type
-    billing_usage           = var.billing_usage
-    billing_cost            = var.billing_cost
-    billing_resource_id     = var.billing_resource_id
-    billing_tags            = var.billing_tags
-  }
-}
-
-resource "helm_release" "dlab-billing" {
-  name       = "dlab-billing"
-  chart      = "./dlab-billing-chart"
-  namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-  depends_on = [helm_release.mongodb, kubernetes_secret.mongo_db_password_secret]
-  wait = true
-
-  values     = [
-      data.template_file.dlab_billing_values.rendered
-  ]
-}
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/cert.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/cert.yaml
deleted file mode 100644
index 5762e9a..0000000
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/cert.yaml
+++ /dev/null
@@ -1,64 +0,0 @@
-{{- /*
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-*/ -}}
-
-{{- if not .Values.ui.custom_certs.enabled -}}
-apiVersion: certmanager.k8s.io/v1alpha1
-kind: Certificate
-metadata:
-  name: dlab-ui
-  namespace: {{ .Values.namespace }}
-spec:
-  # The secret name to store the signed certificate
-  secretName: {{ include "dlab-ui.fullname" . }}-tls
-  # Common Name
-  commonName: dlab-kubernetes-cluster
-  # DNS SAN
-  dnsNames:
-    - localhost
-    - {{ .Values.ui.ingress.host }}
-  # IP Address SAN
-  ipAddresses:
-    - "127.0.0.1"
-  # Duration of the certificate
-  duration: 24h
-  # Renew 8 hours before the certificate expiration
-  renewBefore: 8h
-  # The reference to the step issuer
-  issuerRef:
-    group: certmanager.step.sm
-    kind: Issuer
-    name: step-issuer
-{{- end }}
----
-{{- if .Values.ui.custom_certs.enabled -}}
-apiVersion: v1
-kind: Secret
-metadata:
-  name: {{ include "dlab-ui.fullname" . }}-tls
-  namespace: {{ .Values.namespace }}
-type: kubernetes.io/tls
-data:
-  ca.crt: {{ .Values.ui.custom_certs.ca }}
-  tls.crt: {{ .Values.ui.custom_certs.crt }}
-  tls.key: {{ .Values.ui.custom_certs.key }}
-{{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/configmap-ui-conf.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/configmap-ui-conf.yaml
deleted file mode 100644
index abc2517..0000000
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/configmap-ui-conf.yaml
+++ /dev/null
@@ -1,235 +0,0 @@
-{{- /*
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-*/ -}}
-
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: {{ include "dlab-ui.fullname" . }}-ui-conf
-data:
-  ssn.yml: |
-    <#assign LOG_ROOT_DIR="/var/opt/dlab/log">
-    <#assign KEYS_DIR="/root/keys">
-    <#assign KEY_STORE_PATH="/root/keys/ssn.keystore.jks">
-    <#assign KEY_STORE_PASSWORD="${SSN_KEYSTORE_PASSWORD}">
-    <#assign TRUST_STORE_PATH="/usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts">
-    <#assign TRUST_STORE_PASSWORD="changeit">
-
-    # Available options are aws, azure, gcp
-    <#assign CLOUD_TYPE="aws">
-    cloudProvider: ${CLOUD_TYPE}
-
-    #Switch on/off developer mode here
-    <#assign DEV_MODE="false">
-    devMode: ${DEV_MODE}
-
-    mongo:
-      host: {{ .Values.ui.mongo.host }}
-      port: {{ .Values.ui.mongo.port }}
-      username: {{ .Values.ui.mongo.username }}
-      password: ${MONGO_DB_PASSWORD}
-      database: {{ .Values.ui.mongo.db_name }}
-
-    selfService:
-      protocol: https
-      host: localhost
-      port: {{ .Values.ui.service.https_port }}
-      jerseyClient:
-        timeout: 3s
-        connectionTimeout: 3s
-
-    securityService:
-      protocol: https
-      host: localhost
-      port: 8090
-      jerseyClient:
-        timeout: 20s
-        connectionTimeout: 20s
-
-    provisioningService:
-      jerseyClient:
-        timeout: 3s
-        connectionTimeout: 3s
-
-    # Log out user on inactivity
-    inactiveUserTimeoutMillSec: 7200000
-
-  self-service.yml: |
-    <#include "/root/ssn.yml">
-
-    <#if CLOUD_TYPE == "aws">
-    # Minimum and maximum number of slave EMR instances than could be created
-    minEmrInstanceCount: 2
-    maxEmrInstanceCount: 14
-    # Minimum and maximum percentage cost for slave EMR spot instances biding
-    minEmrSpotInstanceBidPct: 20
-    maxEmrSpotInstanceBidPct: 90
-    </#if>
-
-    <#if CLOUD_TYPE == "gcp">
-    # Maximum length for gcp user name (due to gcp restrictions)
-    maxUserNameLength: 10
-    # Minimum and maximum number of slave Dataproc instances that could be created
-    minInstanceCount: 3
-    maxInstanceCount: 15
-    minDataprocPreemptibleCount: 0
-    gcpOuauth2AuthenticationEnabled: false
-    </#if>
-
-    # Boundaries for Spark cluster creation
-    minSparkInstanceCount: 2
-    maxSparkInstanceCount: 14
-
-    # Timeout for check the status of environment via provisioning service
-    checkEnvStatusTimeout: 5m
-
-    # Restrict access to DLab features using roles policy
-    rolePolicyEnabled: true
-    # Default access to DLab features using roles policy
-    roleDefaultAccess: true
-
-    # Set to true to enable the scheduler of billing report.
-    billingSchedulerEnabled: true
-    # Name of configuration file for billing report.
-    <#if DEV_MODE == "true">
-    billingConfFile: ${sys['user.dir']}/../billing/billing.yml
-    <#else>
-    billingConfFile: ${DLAB_CONF_DIR}/billing.yml
-    </#if>
-
-    <#if CLOUD_TYPE == "azure">
-    azureUseLdap: <LOGIN_USE_LDAP>
-    maxSessionDurabilityMilliseconds: 288000000
-    </#if>
-
-    serviceBaseName: {{ .Values.ui.service_base_name }}
-    os: {{ .Values.ui.os }}
-    server:
-      requestLog:
-        appenders:
-        - type: file
-          currentLogFilename: ${LOG_ROOT_DIR}/ssn/request-selfservice.log
-          archive: true
-          archivedLogFilenamePattern: ${LOG_ROOT_DIR}/ssn/request-selfservice-%d{yyyy-MM-dd}.log.gz
-          archivedFileCount: 10
-      rootPath: "/api"
-      applicationConnectors:
-      - type: http
-        port: {{ .Values.ui.service.http_port }}
-      - type: https
-        port: {{ .Values.ui.service.https_port }}
-        certAlias: ssn
-        validateCerts: false
-        keyStorePath: ${KEY_STORE_PATH}
-        keyStorePassword: ${KEY_STORE_PASSWORD}
-        trustStorePath: ${TRUST_STORE_PATH}
-        trustStorePassword: ${TRUST_STORE_PASSWORD}
-      adminConnectors:
-    #    - type: http
-    #      port: 8081
-      - type: https
-        port: 8444
-        certAlias: ssn
-        validateCerts: false
-        keyStorePath: ${KEY_STORE_PATH}
-        keyStorePassword: ${KEY_STORE_PASSWORD}
-        trustStorePath: ${TRUST_STORE_PATH}
-        trustStorePassword: ${TRUST_STORE_PASSWORD}
-
-    mongoMigrationEnabled: false
-
-    logging:
-      level: INFO
-      loggers:
-        com.epam: TRACE
-        com.novemberain: ERROR
-      appenders:
-      - type: console
-      - type: file
-        currentLogFilename: ${LOG_ROOT_DIR}/ssn/selfservice.log
-        archive: true
-        archivedLogFilenamePattern: ${LOG_ROOT_DIR}/ssn/selfservice-%d{yyyy-MM-dd}.log.gz
-        archivedFileCount: 10
-
-    mavenSearchService:
-      protocol: http
-      host: search.maven.org
-      port: 80
-      jerseyClient:
-        timeout: 5s
-        connectionTimeout: 5s
-
-    schedulers:
-      inactivity:
-        enabled: false
-        cron: "0 0 0/2 ? * * *"
-      startComputationalScheduler:
-        enabled: true
-        cron: "*/20 * * ? * * *"
-      stopComputationalScheduler:
-        enabled: true
-        cron: "*/20 * * ? * * *"
-      startExploratoryScheduler:
-        enabled: true
-        cron: "*/20 * * ? * * *"
-      stopExploratoryScheduler:
-        enabled: true
-        cron: "*/20 * * ? * * *"
-      terminateComputationalScheduler:
-        enabled: true
-        cron: "*/20 * * ? * * *"
-      checkQuoteScheduler:
-        enabled: true
-        cron: "0 0 * ? * * *"
-      checkUserQuoteScheduler:
-        enabled: false
-        cron: "0 0 * ? * * *"
-      checkProjectQuoteScheduler:
-        enabled: true
-        cron: "0 * * ? * * *"
-
-
-    guacamole:
-      connectionProtocol: ssh
-      serverPort: 4822
-      port: 22
-      username: dlab-user
-
-    keycloakConfiguration:
-      redirectUri: {{ .Values.ui.keycloak.redirect_uri }}
-      realm: {{ .Values.ui.keycloak.realm_name }}
-      bearer-only: true
-      auth-server-url: ${KEYCLOAK_AUTH_URL}
-      ssl-required: none
-      register-node-at-startup: true
-      register-node-period: 600
-      resource: {{ .Values.ui.keycloak.client_id }}
-      credentials:
-        secret: ${KEYCLOAK_CLIENT_SECRET}
-
-    jerseyClient:
-      minThreads: 1
-      maxThreads: 128
-      workQueueSize: 8
-      gzipEnabled: true
-      gzipEnabledForRequests: false
-      chunkedEncodingEnabled: true
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/deployment.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/deployment.yaml
deleted file mode 100644
index 03c469e..0000000
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/deployment.yaml
+++ /dev/null
@@ -1,107 +0,0 @@
-{{- /*
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-*/ -}}
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: {{ include "dlab-ui.fullname" . }}
-  labels:
-{{ include "dlab-ui.labels" . | indent 4 }}
-spec:
-  replicas: {{ .Values.replicaCount }}
-  selector:
-    matchLabels:
-      app.kubernetes.io/name: {{ include "dlab-ui.name" . }}
-      app.kubernetes.io/instance: {{ .Release.Name }}
-  template:
-    metadata:
-      labels:
-        app.kubernetes.io/name: {{ include "dlab-ui.name" . }}
-        app.kubernetes.io/instance: {{ .Release.Name }}
-    spec:
-      containers:
-        - name: {{ .Chart.Name }}
-          image: "{{ .Values.ui.image.repository }}:{{ .Values.ui.image.tag }}"
-          imagePullPolicy: {{ .Values.ui.image.pullPolicy }}
-          env:
-            - name: MONGO_DB_PASSWORD
-              valueFrom:
-                secretKeyRef:
-                  name: mongo-db-password
-                  key: password
-            - name: SSN_KEYSTORE_PASSWORD
-              valueFrom:
-                secretKeyRef:
-                  name: ssn-keystore-password
-                  key: password
-            - name: KEYCLOAK_CLIENT_SECRET
-              valueFrom:
-                secretKeyRef:
-                  name: keycloak-client-secret
-                  key: client_secret
-            - name: KEYCLOAK_AUTH_URL
-              value: {{ .Values.ui.keycloak.auth_server_url }}
-          ports:
-            - name: http
-              containerPort: 80
-              protocol: TCP
-          resources:
-            {{- toYaml .Values.resources | nindent 12 }}
-          volumeMounts:
-            - name: ui-conf
-              mountPath: /root/ssn.yml
-              subPath: ssn
-              readOnly: true
-            - name: ui-conf
-              mountPath: /root/self-service.yml
-              subPath: self-service
-              readOnly: true
-            - mountPath: "/root/step-certs"
-              name: ui-tls
-              readOnly: true
-      volumes:
-        - name: ui-conf
-          configMap:
-            name: {{ include "dlab-ui.fullname" . }}-ui-conf
-            defaultMode: 0644
-            items:
-              - key: ssn.yml
-                path: ssn
-              - key: self-service.yml
-                path: self-service
-        - name: ui-tls
-          secret:
-            secretName: {{ include "dlab-ui.fullname" . }}-tls
-
-      {{- with .Values.nodeSelector }}
-      nodeSelector:
-        {{- toYaml . | nindent 8 }}
-      {{- end }}
-    {{- with .Values.affinity }}
-      affinity:
-        {{- toYaml . | nindent 8 }}
-    {{- end }}
-    {{- with .Values.tolerations }}
-      tolerations:
-        {{- toYaml . | nindent 8 }}
-    {{- end }}
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/service.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/service.yaml
deleted file mode 100644
index 86c35dc..0000000
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/templates/service.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-{{- /*
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-*/ -}}
-
-apiVersion: v1
-kind: Service
-metadata:
-  name: {{ include "dlab-ui.fullname" . }}
-  labels:
-{{ include "dlab-ui.labels" . | indent 4 }}
-spec:
-  type: {{ .Values.ui.service.type }}
-  ports:
-    - port: {{ .Values.ui.service.http_port }}
-      targetPort: {{ .Values.ui.service.http_port }}
-      protocol: TCP
-      name: http
-    - port: {{ .Values.ui.service.https_port }}
-      targetPort: {{ .Values.ui.service.https_port }}
-      protocol: TCP
-      name: https
-  selector:
-    app.kubernetes.io/name: {{ include "dlab-ui.name" . }}
-    app.kubernetes.io/instance: {{ .Release.Name }}
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/values.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/values.yaml
deleted file mode 100644
index 84206dd..0000000
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui-chart/values.yaml
+++ /dev/null
@@ -1,69 +0,0 @@
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-
-# Default values for dlab-ui.
-# This is a YAML-formatted file.
-# Declare variables to be passed into your templates.
-
-replicaCount: 1
-labels: {}
-namespace: ${namespace}
-
-ui:
-  service_base_name: ${service_base_name}
-  os: ${os}
-  image:
-    repository: epamdlab/ui
-    tag: '0.1-aws'
-    pullPolicy: Always
-  service:
-    type: ClusterIP
-    #  port: 58443
-    http_port: 58080
-    https_port: 58443
-  ingress:
-    enabled: true
-    host: ${ssn_k8s_alb_dns_name}
-    annotations:
-      kubernetes.io/ingress.class: nginx
-      nginx.ingress.kubernetes.io/ssl-redirect: "true"
-      nginx.ingress.kubernetes.io/proxy-body-size: "50m"
-
-    tls:
-      - secretName: dlab-ui-tls
-        hosts:
-          - ${ssn_k8s_alb_dns_name}
-  mongo:
-    host: ${mongo_service_name}
-    port: ${mongo_port}
-    username: ${mongo_user}
-    db_name: ${mongo_db_name}
-  keycloak:
-    auth_server_url: https://${ssn_k8s_alb_dns_name}/auth
-    redirect_uri: https://${ssn_k8s_alb_dns_name}/
-    realm_name: ${keycloak_realm_name}
-    client_id: ${keycloak_client_id}
-
-  custom_certs:
-    enabled: ${custom_certs_enabled}
-    crt: ${custom_certs_crt}
-    key: ${custom_certs_key}
-    ca: ${step_ca_crt}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui.tf
deleted file mode 100644
index 87dbf3c..0000000
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/dlab-ui.tf
+++ /dev/null
@@ -1,70 +0,0 @@
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-
-locals {
-    custom_certs_enabled = lower(var.custom_certs_enabled)
-    custom_cert_name     = local.custom_certs_enabled == "true" ? reverse(split("/", var.custom_cert_path))[0] : "None"
-    custom_key_name      = local.custom_certs_enabled == "true" ? reverse(split("/", var.custom_key_path))[0] : "None"
-    custom_cert          = local.custom_certs_enabled == "true" ? base64encode(file("/tmp/${local.custom_cert_name}")) : "None"
-    custom_key           = local.custom_certs_enabled == "true" ? base64encode(file("/tmp/${local.custom_key_name}")) : "None"
-    ui_host              = local.custom_certs_enabled == "true" ? var.custom_certs_host : data.kubernetes_service.nginx-service.load_balancer_ingress.0.hostname
-}
-
-data "template_file" "dlab_ui_values" {
-  template = file("./dlab-ui-chart/values.yaml")
-  vars = {
-      mongo_db_name          = var.mongo_dbname
-      mongo_user             = var.mongo_db_username
-      mongo_port             = var.mongo_service_port
-      mongo_service_name     = var.mongo_service_name
-      ssn_k8s_alb_dns_name   = local.ui_host
-      service_base_name      = var.service_base_name
-      os                     = var.env_os
-      namespace              = kubernetes_namespace.dlab-namespace.metadata[0].name
-      custom_certs_enabled   = local.custom_certs_enabled
-      custom_certs_crt       = local.custom_cert
-      custom_certs_key       = local.custom_key
-      step_ca_crt            = lookup(data.external.step-ca-config-values.result, "rootCa")
-      keycloak_realm_name    = var.keycloak_realm_name
-      keycloak_client_id     = var.keycloak_client_id
-  }
-}
-
-resource "helm_release" "dlab_ui" {
-    name       = "dlab-ui"
-    chart      = "./dlab-ui-chart"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-    depends_on = [helm_release.mongodb, kubernetes_secret.mongo_db_password_secret, null_resource.step_ca_issuer_delay]
-    wait       = true
-
-    values     = [
-        data.template_file.dlab_ui_values.rendered
-    ]
-}
-
-data "kubernetes_service" "nginx-service" {
-    metadata {
-        name      = "${helm_release.nginx.name}-controller"
-        namespace = kubernetes_namespace.dlab-namespace.metadata[0].name
-    }
-}
-
-
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/files/configure_keycloak.sh b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/files/configure_keycloak.sh
index 26662bc..be236c8 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/files/configure_keycloak.sh
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/files/configure_keycloak.sh
@@ -31,13 +31,13 @@
       }
       configure_keycloak () {
           # Create Realm
-          /opt/jboss/keycloak/bin/kcadm.sh create realms -s realm=${keycloak_realm_name} -s enabled=true -s loginTheme=dlab \
+          /opt/jboss/keycloak/bin/kcadm.sh create realms -s realm=${keycloak_realm_name} -s enabled=true -s loginTheme=datalab \
           -s sslRequired=none
           # Get realm ID
-          dlab_realm_id=$(/opt/jboss/keycloak/bin/kcadm.sh get realms/${keycloak_realm_name} | /usr/bin/jq -r '.id')
+          datalab_realm_id=$(/opt/jboss/keycloak/bin/kcadm.sh get realms/${keycloak_realm_name} | /usr/bin/jq -r '.id')
           # Create user federation
-          /opt/jboss/keycloak/bin/kcadm.sh create components -r ${keycloak_realm_name} -s name=dlab-ldap -s providerId=ldap \
-          -s providerType=org.keycloak.storage.UserStorageProvider -s parentId=$dlab_realm_id  -s 'config.priority=["1"]' \
+          /opt/jboss/keycloak/bin/kcadm.sh create components -r ${keycloak_realm_name} -s name=datalab-ldap -s providerId=ldap \
+          -s providerType=org.keycloak.storage.UserStorageProvider -s parentId=$datalab_realm_id  -s 'config.priority=["1"]' \
           -s 'config.fullSyncPeriod=["-1"]' -s 'config.changedSyncPeriod=["-1"]' -s 'config.cachePolicy=["DEFAULT"]' \
           -s config.evictionDay=[] -s config.evictionHour=[] -s config.evictionMinute=[] -s config.maxLifespan=[] -s \
           'config.batchSizeForSync=["1000"]' -s 'config.editMode=["READ_ONLY"]' -s 'config.syncRegistrations=["false"]' \
@@ -50,7 +50,7 @@
           -s 'config.useTruststoreSpi=["ldapsOnly"]' -s 'config.connectionPooling=["true"]' \
           -s 'config.pagination=["true"]' --server http://127.0.0.1:8080/auth
           # Get user federation ID
-          user_f_id=$(/opt/jboss/keycloak/bin/kcadm.sh get components -r ${keycloak_realm_name} --query name=dlab-ldap | /usr/bin/jq -er '.[].id')
+          user_f_id=$(/opt/jboss/keycloak/bin/kcadm.sh get components -r ${keycloak_realm_name} --query name=datalab-ldap | /usr/bin/jq -er '.[].id')
           # Create user federation email mapper
           /opt/jboss/keycloak/bin/kcadm.sh create components -r ${keycloak_realm_name} -s name=uid-attribute-to-email-mapper \
           -s providerId=user-attribute-ldap-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper \
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/files/keycloak_values.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/files/keycloak_values.yaml
index 569e4e7..6d72849 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/files/keycloak_values.yaml
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/files/keycloak_values.yaml
@@ -51,7 +51,7 @@
     tls:
       - hosts:
           - ${ssn_k8s_alb_dns_name}
-        secretName: dlab-ui-tls
+        secretName: datalab-ui-tls
 
   startupScripts:
     mystartup.sh: |
@@ -59,7 +59,7 @@
 
   extraInitContainers: |
     - name: theme-provider
-      image: epamdlab/ui-theme:0.1
+      image: epamdatalab/ui-theme:0.1
       imagePullPolicy: Always
       command:
         - sh
@@ -67,13 +67,13 @@
         - -c
         - |
           echo "Copying theme..."
-          cp -R /dlab/* /theme
+          cp -R /datalab/* /theme
       volumeMounts:
         - name: theme
           mountPath: /theme
   extraVolumeMounts: |
     - name: theme
-      mountPath: /opt/jboss/keycloak/themes/dlab
+      mountPath: /opt/jboss/keycloak/themes/datalab
 
   extraVolumes: |
     - name: theme
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/keycloak.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/keycloak.tf
index a9ffd62..9924ed8 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/keycloak.tf
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/keycloak.tf
@@ -41,7 +41,7 @@
 
 data "template_file" "keycloak_values" {
   template = file("./files/keycloak_values.yaml")
-  vars = {
+  vars     = {
     keycloak_user           = var.keycloak_user
     keycloak_password       = random_string.keycloak_password.result
     ssn_k8s_alb_dns_name    = local.ui_host
@@ -61,14 +61,17 @@
 resource "helm_release" "keycloak" {
   name       = "keycloak"
   repository = data.helm_repository.codecentric.metadata.0.name
-  chart      = "codecentric/keycloak"
-  namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-  wait       = true
+  chart = "codecentric/keycloak"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
   timeout    = 600
 
   values     = [
     data.template_file.keycloak_values.rendered
   ]
-  depends_on = [helm_release.keycloak-mysql, kubernetes_secret.keycloak_password_secret, helm_release.nginx,
-                helm_release.dlab_ui]
+  depends_on = [
+    helm_release.keycloak-mysql,
+    kubernetes_secret.keycloak_password_secret,
+    helm_release.nginx,
+    helm_release.datalab_ui]
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/main.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/main.tf
index 49b9fb2..31f7737 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/main.tf
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/main.tf
@@ -27,7 +27,7 @@
 
 provider "kubernetes" {}
 
-resource "kubernetes_namespace" "dlab-namespace" {
+resource "kubernetes_namespace" "datalab-namespace" {
   metadata {
     annotations = {
       name = var.namespace_name
@@ -50,12 +50,12 @@
   }
 }
 
-resource "kubernetes_storage_class" "dlab-storage-class" {
+resource "kubernetes_storage_class" "datalab-storage-class" {
   metadata {
     name = "aws-ebs"
   }
   storage_provisioner = "kubernetes.io/aws-ebs"
-  reclaim_policy      = "Delete"
+  reclaim_policy = "Delete"
   parameters = {
     type = "gp2"
   }
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/mongo.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/mongo.tf
index 7ec345d..7a6b13b 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/mongo.tf
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/mongo.tf
@@ -34,9 +34,9 @@
 
 resource "helm_release" "mongodb" {
   name       = "mongo-ha"
-  chart      = "stable/mongodb"
-  namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-  wait       = true
+  chart = "stable/mongodb"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
   values     = [
       data.template_file.mongo_values.rendered
   ]
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/mysql.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/mysql.tf
index d55903d..79752c5 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/mysql.tf
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/mysql.tf
@@ -25,17 +25,17 @@
     mysql_root_password = random_string.mysql_root_password.result
     mysql_user          = var.mysql_keycloak_user
     mysql_user_password = random_string.mysql_keycloak_user_password.result
-    mysql_db_name       = var.mysql_keycloak_db_name
-    storage_class       = kubernetes_storage_class.dlab-storage-class.metadata[0].name
-    mysql_disk_size     = var.mysql_disk_size
+    mysql_db_name = var.mysql_keycloak_db_name
+    storage_class = kubernetes_storage_class.datalab-storage-class.metadata[0].name
+    mysql_disk_size = var.mysql_disk_size
   }
 }
 
 resource "helm_release" "keycloak-mysql" {
   name       = "keycloak-mysql"
-  chart      = "stable/mysql"
-  namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-  wait       = true
+  chart = "stable/mysql"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
   values     = [
     data.template_file.keycloak-mysql-values.rendered
   ]
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/nginx.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/nginx.tf
index e03a1a3..1000445 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/nginx.tf
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/nginx.tf
@@ -21,9 +21,9 @@
 
 resource "helm_release" "nginx" {
     name       = "nginx-ingress"
-    chart      = "stable/nginx-ingress"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-    wait       = true
+    chart = "stable/nginx-ingress"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
 
     depends_on = [null_resource.step_ca_delay]
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/secrets.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/secrets.tf
index 5a78c41..47d5edd 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/secrets.tf
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/secrets.tf
@@ -28,8 +28,8 @@
 
 resource "kubernetes_secret" "keycloak_client_secret" {
   metadata {
-    name       = "keycloak-client-secret"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "keycloak-client-secret"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -45,8 +45,8 @@
 
 resource "kubernetes_secret" "keycloak_password_secret" {
   metadata {
-    name       = "keycloak-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "keycloak-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -61,8 +61,8 @@
 
 resource "kubernetes_secret" "mongo_root_password_secret" {
   metadata {
-    name       = "mongo-root-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "mongo-root-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -77,8 +77,8 @@
 
 resource "kubernetes_secret" "mongo_db_password_secret" {
   metadata {
-    name       = "mongo-db-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "mongo-db-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -93,8 +93,8 @@
 
 resource "kubernetes_secret" "mysql_root_password_secret" {
   metadata {
-    name       = "mysql-root-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "mysql-root-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -109,8 +109,8 @@
 
 resource "kubernetes_secret" "mysql_keycloak_user_password_secret" {
   metadata {
-    name       = "mysql-keycloak-user-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "mysql-keycloak-user-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -120,8 +120,8 @@
 
 resource "kubernetes_secret" "ssn_keystore_password" {
   metadata {
-    name       = "ssn-keystore-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "ssn-keystore-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -136,8 +136,8 @@
 
 resource "kubernetes_secret" "step_ca_password_secret" {
   metadata {
-    name       = "step-ca-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "step-ca-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -152,8 +152,8 @@
 
 resource "kubernetes_secret" "step_ca_provisioner_password_secret" {
   metadata {
-    name       = "step-ca-provisioner-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "step-ca-provisioner-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/.helmignore b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/.helmignore
index 2f795d4..e25078a 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/.helmignore
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/.helmignore
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/Chart.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/Chart.yaml
index e9d93e2..d133831 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/Chart.yaml
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/Chart.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/NOTES.txt b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/NOTES.txt
index 43f6544..a446054 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/NOTES.txt
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/NOTES.txt
@@ -1,3 +1,23 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
 
 Thanks for installing Step CA.
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/bootstrap.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/bootstrap.yaml
index 354c144..3e67b22 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/bootstrap.yaml
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/bootstrap.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/ca.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/ca.yaml
index 24ed08e..dde19cc 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/ca.yaml
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/ca.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/configmaps.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/configmaps.yaml
index 1670d9a..dc15383 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/configmaps.yaml
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/configmaps.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/ingress.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/ingress.yaml
index 240bdaf..3404ae7 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/ingress.yaml
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/ingress.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-  # Licensed to the Apache Software Foundation (ASF) under one
-  # or more contributor license agreements.  See the NOTICE file
-  # distributed with this work for additional information
-  # regarding copyright ownership.  The ASF licenses this file
-  # to you under the Apache License, Version 2.0 (the
-  # "License"); you may not use this file except in compliance
-  # with the License.  You may obtain a copy of the License at
+  #  Licensed to the Apache Software Foundation (ASF) under one
+  #  or more contributor license agreements.  See the NOTICE file
+  #  distributed with this work for additional information
+  #  regarding copyright ownership.  The ASF licenses this file
+  #  to you under the Apache License, Version 2.0 (the
+  #  "License"); you may not use this file except in compliance
+  #  with the License.  You may obtain a copy of the License at
   #
-  #   http://www.apache.org/licenses/LICENSE-2.0
+  #  http://www.apache.org/licenses/LICENSE-2.0
   #
-  # Unless required by applicable law or agreed to in writing,
-  # software distributed under the License is distributed on an
-  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  # KIND, either express or implied.  See the License for the
-  # specific language governing permissions and limitations
-  # under the License.
+  #  Unless required by applicable law or agreed to in writing,
+  #  software distributed under the License is distributed on an
+  #  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  #  KIND, either express or implied.  See the License for the
+  #  specific language governing permissions and limitations
+  #  under the License.
   #
   # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/rbac.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/rbac.yaml
index 0534856..ebab8c4 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/rbac.yaml
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/rbac.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/secrets.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/secrets.yaml
index 68d0b8d..64f8b9b 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/secrets.yaml
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/secrets.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/service.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/service.yaml
index dccae38..fb17ab1 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/service.yaml
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/service.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/tests/test-connection.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/tests/test-connection.yaml
index 4fe296d..19375d9 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/tests/test-connection.yaml
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/templates/tests/test-connection.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/values.yaml b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/values.yaml
index 14a3d3d..6223e37 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/values.yaml
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca-chart/values.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
@@ -52,7 +52,7 @@
 # ca contains the certificate authority configuration.
 ca:
   # name is new public key infrastructure (PKI) names.
-  name: dlab-step-ca
+  name: datalab-step-ca
   # address is the HTTP listener address of step-certificates.
   address: :9000
   # dns is the comma separated dns names to use. Leave it empty to use the format:
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca.tf
index 0361fa0..81674f8 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca.tf
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-ca.tf
@@ -22,8 +22,8 @@
 data "template_file" "step_ca_values" {
   template = file("./step-ca-chart/values.yaml")
   vars = {
-    storage_class_name           = kubernetes_storage_class.dlab-storage-class.metadata[0].name
-    ssn_k8s_nlb_dns_name         = var.ssn_k8s_nlb_dns_name
+    storage_class_name = kubernetes_storage_class.datalab-storage-class.metadata[0].name
+    ssn_k8s_nlb_dns_name = var.ssn_k8s_nlb_dns_name
     step_ca_password             = random_string.step_ca_password.result
     step_ca_provisioner_password = random_string.step_ca_provisioner_password.result
   }
@@ -31,9 +31,10 @@
 
 resource "helm_release" "step_ca" {
   name       = "step-certificates"
-  chart      = "./step-ca-chart"
-  namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-  depends_on = [null_resource.cert_manager_delay]
+  chart = "./step-ca-chart"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  depends_on = [
+    null_resource.cert_manager_delay]
   wait       = false
   timeout    = 600
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-issuer.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-issuer.tf
index 8525652..dd71cef 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-issuer.tf
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/step-issuer.tf
@@ -47,8 +47,8 @@
   template = file("./step-ca-issuer-chart/values.yaml")
   vars     = {
     step_ca_url      = "https://${var.ssn_k8s_nlb_dns_name}:443"
-    step_ca_bundle   = lookup(data.external.step-ca-config-values.result, "rootCa")
-    namespace        = kubernetes_namespace.dlab-namespace.metadata[0].name
+    step_ca_bundle = lookup(data.external.step-ca-config-values.result, "rootCa")
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
     step_ca_kid_name = lookup(data.external.step-ca-config-values.result, "kidName")
     step_ca_kid      = lookup(data.external.step-ca-config-values.result, "kid")
   }
diff --git a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/variables.tf b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/variables.tf
index dcc5620..db5a96c 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/variables.tf
+++ b/infrastructure-provisioning/terraform/aws/ssn-helm-charts/main/variables.tf
@@ -20,7 +20,7 @@
 # ******************************************************************************
 
 variable "namespace_name" {
-    default = "dlab"
+    default = "datalab"
 }
 
 variable "ssn_k8s_nlb_dns_name" {
@@ -28,7 +28,7 @@
 }
 
 variable "keycloak_user" {
-    default = "dlab-admin"
+  default = "datalab-admin"
 }
 
 variable "mysql_keycloak_user" {
@@ -80,7 +80,7 @@
 }
 
 variable "mongo_dbname" {
-    default = "dlabdb"
+  default = "datalabdb"
 }
 
 variable "mongo_image_tag" {
@@ -131,11 +131,11 @@
 }
 
 variable "billing_tag" {
-    default = "dlab"
+  default = "datalab"
 }
 
-variable "billing_dlab_id" {
-    default = "resource_tags_user_user_tag"
+variable "billing_datalab_id" {
+  default = "resource_tags_user_user_tag"
 }
 
 variable "billing_usage_date" {
@@ -187,9 +187,9 @@
 }
 
 variable "keycloak_realm_name" {
-  default = "dlab"
+  default = "datalab"
 }
 
 variable "keycloak_client_id" {
-  default = "dlab-ui"
+  default = "datalab-ui"
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/ssn-k8s/main/README.md b/infrastructure-provisioning/terraform/aws/ssn-k8s/main/README.md
new file mode 100644
index 0000000..95f5ed6
--- /dev/null
+++ b/infrastructure-provisioning/terraform/aws/ssn-k8s/main/README.md
@@ -0,0 +1,25 @@
+# Terraform module for deploying DataLab SSN K8S cluster
+
+List of variables which should be provided:
+
+| Variable                 | Type   | Description/Value                                                                                         |
+|--------------------------|--------|-----------------------------------------------------------------------------------------------------------|
+| access\_key\_id          | string | **Required.** AWS Access Key ID.                                                                          |
+| secret\_access\_key      | string | **Required.** AWS Secret Access Key.                                                                      |
+| service\_base\_name      | string | Any infrastructure value (should be unique if multiple SSN’s have been deployed before). Default: datalab-k8s|
+| vpc\_id                  | string | ID of AWS VPC if you already have VPC created.                                                            | 
+| vpc\_cidr                | string | CIDR for VPC creation. Conflicts with _vpc\_id_. Default: 172.31.0.0/16                                   |
+| subnet\_id               | string | ID of AWS Subnet if you already have subnet created.                                                      |
+| subnet\_cidr             | string | CIDR for Subnet creation. Conflicts with _subnet\_id_. Default: 172.31.0.0/24                             |
+| env\_os                  | string | OS type. Available options: debian, redhat. Default: debian                                               |
+| ami                      | string | **Required.** ID of EC2 AMI.                                                                              |
+| key\_name                | string | **Required.** Name of EC2 Key pair.                                                                       |
+| region                   | string | Name of AWS region. Default: us-west-2                                                                    |
+| zone                     | string | Name of AWS zone. Default: a                                                                              |
+| ssn\_k8s\_masters\_count | int    | Count of K8S masters. Default: 3                                                                          |
+| ssn\_k8s\_workers\_count | int    | Count of K8S workers. Default: 2                                                                          |
+| ssn\_root\_volume\_size  | int    | Size of root volume in GB. Default: 30                                                                    |
+| allowed\_cidrs           | list   | CIDR to allow acces to SSN K8S cluster. Default: 0.0.0.0/0                                                |
+| ssn\_k8s\_masters\_shape | string | Shape for SSN K8S masters. Default: t2.medium                                                             |
+| ssn\_k8s\_workers\_shape | string | Shape for SSN K8S workers. Default: t2.medium                                                             |
+| os\_user                 | string | Name of DataLab service user. Default: datalab-user                                                             |
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/aws/ssn-k8s/main/files/masters-user-data.sh b/infrastructure-provisioning/terraform/aws/ssn-k8s/main/files/masters-user-data.sh
index 8617b6f..6a6af5b 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-k8s/main/files/masters-user-data.sh
+++ b/infrastructure-provisioning/terraform/aws/ssn-k8s/main/files/masters-user-data.sh
@@ -34,7 +34,7 @@
 sleep 5
 }
 
-# Creating DLab user
+# Creating DataLab user
 sudo useradd -m -G sudo -s /bin/bash ${k8s_os_user}
 sudo bash -c 'echo "${k8s_os_user} ALL = NOPASSWD:ALL" >> /etc/sudoers'
 sudo mkdir /home/${k8s_os_user}/.ssh
@@ -44,7 +44,7 @@
 sudo chmod 600 /home/${k8s_os_user}/.ssh/authorized_keys
 
 sudo apt-get update
-sudo apt-get install -y python-pip jq unzip
+sudo apt-get install -y python3-pip jq unzip
 sudo apt-get install -y default-jre
 sudo apt-get install -y default-jdk
 sudo pip install -U pip
@@ -143,9 +143,9 @@
 cat <<EOF > /tmp/get_configmap_values.sh
 #!/bin/bash
 
-ROOT_CA=\$(kubectl get -o jsonpath="{.data['root_ca\.crt']}" configmaps/step-certificates-certs -ndlab | base64 | tr -d '\n')
-KID=\$(kubectl get -o jsonpath="{.data['ca\.json']}" configmaps/step-certificates-config -ndlab | jq -r .authority.provisioners[].key.kid)
-KID_NAME=\$(kubectl get -o jsonpath="{.data['ca\.json']}" configmaps/step-certificates-config -ndlab | jq -r .authority.provisioners[].name)
+ROOT_CA=\$(kubectl get -o jsonpath="{.data['root_ca\.crt']}" configmaps/step-certificates-certs -ndatalab | base64 | tr -d '\n')
+KID=\$(kubectl get -o jsonpath="{.data['ca\.json']}" configmaps/step-certificates-config -ndatalab | jq -r .authority.provisioners[].key.kid)
+KID_NAME=\$(kubectl get -o jsonpath="{.data['ca\.json']}" configmaps/step-certificates-config -ndatalab | jq -r .authority.provisioners[].name)
 jq -n --arg rootCa "\$ROOT_CA" --arg kid "\$KID" --arg kidName "\$KID_NAME" '{rootCa: \$rootCa, kid: \$kid, kidName: \$kidName}'
 EOF
 chown ${k8s_os_user}:${k8s_os_user} /tmp/get_configmap_values.sh
diff --git a/infrastructure-provisioning/terraform/aws/ssn-k8s/main/files/workers-user-data.sh b/infrastructure-provisioning/terraform/aws/ssn-k8s/main/files/workers-user-data.sh
index 04a8f57..a53bf03 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-k8s/main/files/workers-user-data.sh
+++ b/infrastructure-provisioning/terraform/aws/ssn-k8s/main/files/workers-user-data.sh
@@ -27,7 +27,7 @@
 sleep 5
 }
 
-# Creating DLab user
+# Creating DataLab user
 sudo useradd -m -G sudo -s /bin/bash ${k8s_os_user}
 sudo bash -c 'echo "${k8s_os_user} ALL = NOPASSWD:ALL" >> /etc/sudoers'
 sudo mkdir /home/${k8s_os_user}/.ssh
@@ -37,7 +37,7 @@
 sudo chmod 600 /home/${k8s_os_user}/.ssh/authorized_keys
 
 sudo apt-get update
-sudo apt-get install -y python-pip
+sudo apt-get install -y python3-pip
 sudo pip install -U pip
 sudo pip install awscli
 
diff --git a/infrastructure-provisioning/terraform/aws/ssn-k8s/main/variables.tf b/infrastructure-provisioning/terraform/aws/ssn-k8s/main/variables.tf
index d2515b2..6e4fa06 100644
--- a/infrastructure-provisioning/terraform/aws/ssn-k8s/main/variables.tf
+++ b/infrastructure-provisioning/terraform/aws/ssn-k8s/main/variables.tf
@@ -45,7 +45,7 @@
   default = ["0.0.0.0/0"]
 }
 variable "os_user" {
-  default = "dlab-user"
+  default = "datalab-user"
 }
 
 variable "project_tag" {
@@ -53,7 +53,7 @@
 }
 
 variable "additional_tag" {
-  default = "product:dlab"
+  default = "product:datalab"
 }
 
 variable "tag_resource_id" {
@@ -62,7 +62,7 @@
 
 // SSN
 variable "service_base_name" {
-  default = "dlab-k8s"
+  default = "datalab-k8s"
 }
 variable "vpc_id" {
   default = ""
diff --git a/infrastructure-provisioning/terraform/azure/endpoint/main/variables.tf b/infrastructure-provisioning/terraform/azure/endpoint/main/variables.tf
index abc7e97..e250793 100644
--- a/infrastructure-provisioning/terraform/azure/endpoint/main/variables.tf
+++ b/infrastructure-provisioning/terraform/azure/endpoint/main/variables.tf
@@ -34,7 +34,7 @@
 variable "endpoint_id" {}
 
 variable "additional_tag" {
-  default = "product:dlab"
+  default = "product:datalab"
 }
 
 variable "vpc_cidr" {}
diff --git a/infrastructure-provisioning/terraform/bin/datalab.py b/infrastructure-provisioning/terraform/bin/datalab.py
new file mode 100644
index 0000000..ff6c9f3
--- /dev/null
+++ b/infrastructure-provisioning/terraform/bin/datalab.py
@@ -0,0 +1,1362 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+import argparse
+import itertools
+import json
+import logging
+import os
+import re
+import shutil
+import subprocess
+import sys
+import time
+from abc import abstractmethod
+from deploy.endpoint_fab import start_deploy
+from fabric import Connection
+from patchwork.transfers import rsync
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+logging.basicConfig(level=logging.INFO, format='%(levelname)s-%(message)s')
+INITIAL_LOCATION = os.path.dirname(os.path.abspath(__file__))
+
+
+class TerraformOutputBase:
+    @property
+    @abstractmethod
+    def output_path(self):
+        pass
+
+    @abstractmethod
+    def write(self, obj):
+        pass
+
+    @abstractmethod
+    def extract(self):
+        pass
+
+
+class LocalStorageOutputProcessor(TerraformOutputBase):
+    output_path = None
+
+    def __init__(self, path):
+        self.output_path = path
+
+    def write(self, obj):
+        """Write json string to local file
+        :param obj: json string
+        """
+        existed_data = {}
+        if os.path.isfile(self.output_path):
+            with open(self.output_path, 'r') as fp:
+                output = fp.read()
+                if len(output):
+                    existed_data = json.loads(output)
+        existed_data.update(obj)
+
+        with open(self.output_path, 'w') as fp:
+            json.dump(existed_data, fp)
+        pass
+
+    def extract(self):
+        """Extract data from local file
+        :return: dict
+        """
+        if os.path.isfile(self.output_path):
+            with open(self.output_path, 'r') as fp:
+                output = fp.read()
+                if len(output):
+                    return json.loads(output)
+
+
+def extract_args(cli_args):
+    args = []
+    for key, value in cli_args.items():
+        if not value:
+            continue
+        if type(value) == list:
+            quoted_list = ['"{}"'.format(item) for item in value]
+            joined_values = ', '.join(quoted_list)
+            value = '[{}]'.format(joined_values)
+        args.append((key, value))
+    return args
+
+
+def get_var_args_string(cli_args):
+    """Convert dict of cli argument into string
+
+    Args:
+        cli_args: dict of cli arguments
+    Returns:
+        str: string of joined key=values
+    """
+    args = extract_args(cli_args)
+    args_hidden = list()
+    args_plain = ["-var '{0}={1}'".format(key, value) for key, value in args]
+    for key, value in args:
+        if key in ["secret_access_key", "access_key_id", "ldap_host", "ldap_user", "ldap_bind_creds", "mongo_password", "mongo_host"]:
+            value = '********'
+        args_hidden.append("-var '{0}={1}'".format(key, value))
+    return [' '.join(args_plain), ' '.join(args_hidden)]
+
+
+def get_args_string(cli_args):
+    """Convert dict of cli argument into string
+
+    Args:
+        cli_args: dict of cli arguments
+    Returns:
+        str: string of joined key=values
+    """
+
+    args = extract_args(cli_args)
+    args = ["{0} {1}".format(key, value) for key, value in args]
+    return ' '.join(args)
+
+
+class ParamsBuilder:
+
+    def __init__(self):
+        self.__params = []
+
+    def add(self, arg_type, name, desc, **kwargs):
+        default_group = ['all_args']
+        if isinstance(kwargs.get('group'), str):
+            default_group.append(kwargs.get('group'))
+        if isinstance(kwargs.get('group'), (list, tuple)):
+            default_group.extend(kwargs.get('group'))
+
+        parameter = {
+            'group': default_group,
+            'name': name,
+            'props': {
+                'help': desc,
+                'type': arg_type,
+                'default': kwargs.get('default'),
+                'choices': kwargs.get('choices'),
+                'nargs': kwargs.get('nargs'),
+                'action': kwargs.get('action'),
+                'required': kwargs.get('required'),
+            }
+        }
+        self.__params.append(parameter)
+        return self
+
+    def add_str(self, name, desc, **kwargs):
+        return self.add(str, name, desc, **kwargs)
+
+    def add_bool(self, name, desc, **kwargs):
+        return self.add(self.str2bool, name, desc, **kwargs)
+
+    def add_int(self, name, desc, **kwargs):
+        return self.add(int, name, desc, **kwargs)
+
+    @staticmethod
+    def str2bool(v):
+        if isinstance(v, bool):
+            return v
+        if v.lower() in ('yes', 'true', 't', 'y', '1'):
+            return True
+        elif v.lower() in ('no', 'false', 'f', 'n', '0'):
+            return False
+        else:
+            raise argparse.ArgumentTypeError('Boolean value expected.')
+
+    def build(self):
+        return self.__params
+
+
+class Console:
+
+    @staticmethod
+    def execute_to_command_line(command):
+        """ Execute cli command
+
+        Args:
+            command: str cli command
+        Returns:
+            str: command result
+        """
+        process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE,
+                                   stderr=subprocess.STDOUT,
+                                   universal_newlines=True)
+
+        while True:
+            nextline = process.stdout.readline()
+            print(nextline)
+            if nextline == '' and process.poll() is not None:
+                break
+            if 'error' in nextline.lower():
+                sys.exit(0)
+
+    @staticmethod
+    def execute(command):
+        """ Execute cli command
+
+        Args:
+            command: str cli command
+        Returns:
+            str: command result
+        """
+        return os.popen(command).read()
+
+    @staticmethod
+    def ssh(ip, name, pkey):
+        attempt = 0
+        while attempt < 12:
+            logging.info('connection attempt {}'.format(attempt))
+            connection = Connection(
+                host=ip,
+                user=name,
+                connect_kwargs={'key_filename': pkey,
+                                'allow_agent': False,
+                                'look_for_keys': False,
+                                })
+            try:
+                connection.run('ls')
+                return connection
+            except Exception as ex:
+                logging.error(ex)
+                attempt += 1
+                time.sleep(10)
+
+
+class TerraformProviderError(Exception):
+    """
+    Raises errors while terraform provision
+    """
+    pass
+
+
+class TerraformProvider:
+
+    def __init__(self, no_color=False):
+        self.no_color = '-no-color' if no_color else ''
+
+    def initialize(self):
+        """Initialize terraform
+
+        Returns:
+             bool: init successful
+        Raises:
+            TerraformProviderError: if initialization was not succeed
+        """
+        logging.info('terraform init')
+        terraform_success_init = 'Terraform has been successfully initialized!'
+        command = 'terraform init {}'.format(self.no_color)
+        terraform_init_result = Console.execute(command)
+        logging.info(terraform_init_result)
+        if terraform_success_init not in terraform_init_result:
+            raise TerraformProviderError(terraform_init_result)
+
+    def validate(self):
+        """Validate terraform
+
+        Returns:
+             bool: validation successful
+        Raises:
+            TerraformProviderError: if validation status was not succeed
+
+        """
+        logging.info('terraform validate')
+        terraform_success_validate = 'Success!'
+        terraform_validate_result = Console.execute(
+            'terraform validate {}'.format(self.no_color))
+        logging.info(terraform_validate_result)
+        if terraform_success_validate not in terraform_validate_result:
+            raise TerraformProviderError(terraform_validate_result)
+
+    def apply(self, tf_params, cli_args):
+        """Run terraform
+
+        Args:
+            tf_params: dict of terraform parameters
+            cli_args: dict of parameters
+        Returns:
+             None
+        """
+        logging.info('terraform apply')
+        args_list = get_var_args_string(cli_args)
+        params_str = get_args_string(tf_params)
+        command = ('terraform apply -auto-approve {} {}'
+                   .format(self.no_color, params_str))
+        logging.info('{} {}'.format(command, args_list[1]))
+        Console.execute_to_command_line('{} {}'.format(command, args_list[0]))
+
+    def destroy(self, tf_params, cli_args, keep_state_file=False):
+        """Destroy terraform
+
+        Args:
+            tf_params: dict of terraform parameters
+            cli_args: dict of parameters
+            keep_state_file: Boolean
+        Returns:
+             None
+        """
+        logging.info('terraform destroy')
+        args_list = get_var_args_string(cli_args)
+        params_str = get_args_string(tf_params)
+        command = ('terraform destroy -auto-approve {} {}'
+                   .format(self.no_color, params_str))
+        logging.info('{} {}'.format(command, args_list[1]))
+        Console.execute_to_command_line('{} {}'.format(command, args_list[0]))
+        if not keep_state_file:
+            state_file = tf_params['-state']
+            state_file_backup = tf_params['-state'] + '.backup'
+            if os.path.isfile(state_file):
+                os.remove(state_file)
+            if os.path.isfile(state_file_backup):
+                os.remove(state_file_backup)
+
+    @staticmethod
+    def output(tf_params, *args):
+        """Get terraform output
+
+        Args:
+            tf_params: dict of terraform parameters
+            *args: list of str parameters
+        Returns:
+            str: terraform output result
+        """
+        params = get_args_string(tf_params)
+        return Console.execute('terraform output {} {}'
+                               .format(params, ' '.join(args)))
+
+
+class AbstractDeployBuilder:
+    def __init__(self):
+
+        args = self.parse_args()
+        self.service_args = args.get('service')
+        self.no_color = self.service_args.get('no_color')
+        state_dir = self.service_args.get('state')
+        if not state_dir:
+            self.output_dir = None
+            self.tf_output = os.path.join(INITIAL_LOCATION, 'output.json')
+            self.tf_params = {}
+        else:
+            if os.path.isdir(state_dir) and os.access(state_dir, os.W_OK):
+                service_name = (args.get(self.terraform_args_group_name)
+                                .get('service_base_name'))
+                self.output_dir = (os.path.join(state_dir, service_name))
+                self.tf_output = os.path.join(self.output_dir, 'output.json')
+                self.tf_params = {
+                    '-state': os.path.join(
+                        self.output_dir, '{}.tfstate'.format(self.name))
+                }
+            else:
+                sys.stdout.write('path doesn\'t exist')
+                sys.exit(1)
+        if self.use_tf_output_file:
+            self.fill_sys_argv_from_file()
+        self.terraform_args = self.parse_args().get(
+            self.terraform_args_group_name)
+
+    @property
+    @abstractmethod
+    def terraform_location(self):
+        """ get Terraform location
+
+        Returns:
+            str: TF script location
+        """
+        raise NotImplementedError
+
+    @property
+    @abstractmethod
+    def name(self):
+        """ get Terraform name
+
+        Returns:
+            str: TF name
+        """
+        raise NotImplementedError
+
+    @property
+    @abstractmethod
+    def terraform_args_group_name(self):
+        """ get Terraform location
+
+        Returns:
+            str: TF script location
+        """
+        raise NotImplementedError
+
+    @property
+    @abstractmethod
+    def cli_args(self):
+        """Get cli arguments
+
+        Returns:
+            dict: dictionary of client arguments
+                  with name as key and props as value
+        """
+        raise NotImplementedError
+
+    @abstractmethod
+    def deploy(self):
+        """Post terraform execution
+
+        Returns:
+            None
+        """
+        raise NotImplementedError
+
+    @property
+    def use_tf_output_file(self):
+        return False
+
+    def apply(self):
+        """Apply terraform"""
+        terraform = TerraformProvider(self.no_color)
+        terraform.apply(self.tf_params, self.terraform_args)
+
+    def destroy(self):
+        """Destory terraform"""
+        terraform = TerraformProvider(self.no_color)
+        terraform.destroy(self.tf_params, self.terraform_args)
+
+    def store_output_to_file(self):
+        """Extract terraform output and store to file"""
+        terraform = TerraformProvider(self.no_color)
+        output = terraform.output(self.tf_params, '-json')
+        output = {key: value.get('value')
+                  for key, value in json.loads(output).items()}
+        output_writer = LocalStorageOutputProcessor(self.tf_output)
+        output_writer.write(output)
+
+    def update_extracted_file_data(self, obj):
+        """
+        :param obj:
+        :return:
+        Override method if you need to modify extracted from file data
+        """
+        pass
+
+    def fill_sys_argv_from_file(self):
+        """Extract data from file and fill sys args"""
+        output_processor = LocalStorageOutputProcessor(self.tf_output)
+        output = output_processor.extract()
+        if output:
+            self.update_extracted_file_data(output)
+            for key, value in output.items():
+                key = '--' + key
+                if key not in sys.argv:
+                    sys.argv.extend([key, value])
+                else:
+                    try:
+                        index = sys.argv.index(key)
+                        sys.argv[index + 1] = value
+                    except:
+                        pass
+
+    def parse_args(self):
+        """Get dict of arguments
+
+        Returns:
+            dict: CLI arguments
+        """
+        parsers = {}
+        args = []
+
+        for arg in self.cli_args:
+            group = arg.get('group')
+            if isinstance(group, (list, tuple)):
+                for item in group:
+                    args.append(dict(arg.copy(), **{'group': item}))
+            else:
+                args.append(arg)
+
+        cli_args = sorted(args, key=lambda x: x.get('group'))
+        args_groups = itertools.groupby(cli_args, lambda x: x.get('group'))
+        for group, args in args_groups:
+            parser = argparse.ArgumentParser()
+            for arg in args:
+                parser.add_argument(arg.get('name'), **arg.get('props'))
+            parsers[group] = parser
+        return {
+            group: vars(parser.parse_known_args()[0])
+            for group, parser in parsers.items()
+        }
+
+    def validate_params(self):
+        params = self.parse_args()[self.terraform_args_group_name]
+        if len(params.get('service_base_name')) > 20:
+            sys.stderr.write('service_base_name length should be less then 20')
+            sys.exit(1)
+        if not re.match("^[a-z0-9\-]+$", params.get('service_base_name')):
+            sys.stderr.write('service_base_name should contain only lowercase '
+                             'alphanumetic characters and hyphens')
+            sys.exit(1)
+
+    def provision(self):
+        """Execute terraform script
+
+        Returns:
+            None
+        Raises:
+            TerraformProviderError: if init or validate fails
+        """
+        self.validate_params()
+        tf_location = self.terraform_location
+        terraform = TerraformProvider(self.no_color)
+        os.chdir(tf_location)
+        try:
+            terraform.initialize()
+            terraform.validate()
+        except TerraformProviderError as ex:
+            raise Exception('Error while provisioning {}'.format(ex))
+
+
+class AWSK8sSourceBuilder(AbstractDeployBuilder):
+
+    def __init__(self):
+        super(AWSK8sSourceBuilder, self).__init__()
+        self._args = self.parse_args()
+        self._ip = None
+        self._user_name = self.args.get(self.terraform_args_group_name).get(
+            'os_user')
+        self._pkey_path = self.args.get('service').get('pkey')
+
+    @property
+    def name(self):
+        return 'ssn-k8s'
+
+    @property
+    def args(self):
+        return self._args
+
+    @property
+    def ip(self):
+        return self._ip
+
+    @ip.setter
+    def ip(self, ip):
+        self._ip = ip
+
+    @property
+    def user_name(self):
+        return self._user_name
+
+    @property
+    def pkey_path(self):
+        return self._pkey_path
+
+    @property
+    def terraform_location(self):
+        tf_dir = os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))
+        return os.path.join(tf_dir, 'aws/ssn-k8s/main')
+
+    @property
+    def terraform_args_group_name(self):
+        return 'k8s'
+
+    def validate_params(self):
+        super(AWSK8sSourceBuilder, self).validate_params()
+        params = self.parse_args()['all_args']
+        if params.get('ssn_k8s_masters_count', 1) < 1:
+            sys.stderr.write('ssn_k8s_masters_count should be greater then 0')
+            sys.exit(1)
+        if params.get('ssn_k8s_workers_count', 3) < 3:
+            sys.stderr.write('ssn_k8s_masters_count should be minimum 3')
+            sys.exit(1)
+        # Temporary condition for Jenkins job
+        if 'endpoint_id' in params and len(params.get('endpoint_id')) > 12:
+            sys.stderr.write('endpoint_id length should be less then 12')
+            sys.exit(1)
+
+    @property
+    def cli_args(self):
+        params = ParamsBuilder()
+        (params
+         .add_bool('--no_color', 'no color console_output', group='service',
+                   default=False)
+         .add_str('--state', 'State file path', group='service')
+         .add_str('--access_key_id', 'AWS Access Key ID', required=True,
+                  group='k8s')
+         .add_str('--allowed_cidrs',
+                  'CIDR to allow acces to SSN K8S cluster.',
+                  default=["0.0.0.0/0"], action='append', group='k8s')
+         .add_str('--ami', 'ID of EC2 AMI.', required=True, group='k8s')
+         .add_str('--env_os', 'OS type.', default='debian',
+                  choices=['debian', 'redhat'], group=('k8s'))
+         .add_str('--key_name', 'Name of EC2 Key pair.', required=True,
+                  group='k8s')
+         .add_str('--os_user', 'Name of DataLab service user.',
+                  default='datalab-user', group='k8s')
+         .add_str('--pkey', 'path to key', required=True, group='service')
+         .add_str('--region', 'Name of AWS region.', default='us-west-2',
+                  group=('k8s'))
+         .add_str('--secret_access_key', 'AWS Secret Access Key',
+                  required=True,
+                  group='k8s')
+         .add_str('--service_base_name',
+                  'Any infrastructure value (should be unique if '
+                  'multiple SSN\'s have been deployed before).',
+                  default='k8s', group=('k8s', 'helm_charts'))
+         .add_int('--ssn_k8s_masters_count', 'Count of K8S masters.',
+                  default=3,
+                  group='k8s')
+         .add_int('--ssn_k8s_workers_count', 'Count of K8S workers', default=2,
+                  group=('k8s', 'helm_charts'))
+         .add_str('--ssn_k8s_masters_shape', 'Shape for SSN K8S masters.',
+                  default='t2.medium', group=('k8s'))
+         .add_str('--ssn_k8s_workers_shape', 'Shape for SSN K8S workers.',
+                  default='t2.medium', group='k8s')
+         .add_int('--ssn_root_volume_size', 'Size of root volume in GB.',
+                  default=30, group='k8s')
+         .add_str('--subnet_cidr_a',
+                  'CIDR for Subnet creation in zone a. Conflicts with  subnet_id_a.',
+                  default='172.31.0.0/24', group='k8s')
+         .add_str('--subnet_cidr_b',
+                  'CIDR for Subnet creation in zone b. Conflicts with  subnet_id_b.',
+                  default='172.31.1.0/24', group='k8s')
+         .add_str('--subnet_cidr_c',
+                  'CIDR for Subnet creation in zone c. Conflicts with  subnet_id_c.',
+                  default='172.31.2.0/24', group='k8s')
+         .add_str('--subnet_id_a',
+                  'ID of AWS Subnet in zone a if you already have subnet created.',
+                  group='k8s')
+         .add_str('--subnet_id_b',
+                  'ID of AWS Subnet in zone b if you already have subnet created.',
+                  group='k8s')
+         .add_str('--subnet_id_c',
+                  'ID of AWS Subnet in zone c if you already have subnet created.',
+                  group='k8s')
+         .add_str('--vpc_cidr', 'CIDR for VPC creation. Conflicts with vpc_id',
+                  default='172.31.0.0/16', group='k8s')
+         .add_str('--vpc_id', 'ID of AWS VPC if you already have VPC created.',
+                  group='k8s')
+         .add_str('--zone', 'Name of AWS zone', default='a',
+                  group=('k8s'))
+         .add_str('--ldap_host', 'ldap host', required=True,
+                  group='helm_charts')
+         .add_str('--ldap_dn', 'ldap dn', required=True,
+                  group='helm_charts')
+         .add_str('--ldap_user', 'ldap user', required=True,
+                  group='helm_charts')
+         .add_str('--ldap_bind_creds', 'ldap bind creds', required=True,
+                  group='helm_charts')
+         .add_str('--ldap_users_group', 'ldap users group', required=True,
+                  group='helm_charts')
+         .add_str('--tag_resource_id', 'Tag resource ID.',
+                  default='user:tag', group=('k8s', 'helm_charts'))
+         .add_str('--additional_tag', 'Additional tag.',
+                  default='product:datalab', group='k8s')
+         .add_str('--billing_bucket', 'Billing bucket name',
+                  group='helm_charts')
+         .add_str('--billing_bucket_path',
+                  'The path to billing reports directory in S3 bucket',
+                  default='',
+                  group='helm_charts')
+         .add_str('--billing_aws_job_enabled',
+                  'Billing format. Available options: true (aws), false(epam)',
+                  default='false',
+                  group='helm_charts')
+         .add_str('--billing_aws_account_id',
+                  'The ID of Amazon account', default='',
+                  group='helm_charts')
+         .add_str('--billing_datalab_id',
+                  'Column name in report file that contains datalab id tag',
+                  default='resource_tags_user_user_tag',
+                  group='helm_charts')
+         .add_str('--billing_usage_date',
+                  'Column name in report file that contains usage date tag',
+                  default='line_item_usage_start_date',
+                  group='helm_charts')
+         .add_str('--billing_product',
+                  'Column name in report file that contains product name tag',
+                  default='product_product_name',
+                  group='helm_charts')
+         .add_str('--billing_usage_type',
+                  'Column name in report file that contains usage type tag',
+                  default='line_item_usage_type',
+                  group='helm_charts')
+         .add_str('--billing_usage',
+                  'Column name in report file that contains usage tag',
+                  default='line_item_usage_amount',
+                  group='helm_charts')
+         .add_str('--billing_cost',
+                  'Column name in report file that contains cost tag',
+                  default='line_item_blended_cost',
+                  group='helm_charts')
+         .add_str('--billing_resource_id',
+                  'Column name in report file that contains datalab resource id tag',
+                  default='line_item_resource_id',
+                  group='helm_charts')
+         .add_str('--billing_tags',
+                  'Column name in report file that contains tags',
+                  default='line_item_operation,line_item_line_item_description',
+                  group='helm_charts')
+         .add_str('--billing_tag', 'Billing tag', default='datalab',
+                  group='helm_charts')
+         .add_bool('--custom_certs_enabled', 'Enable custom certificates',
+                   default=False, group=('service', 'helm_charts'))
+         .add_str('--custom_cert_path', 'custom_cert_path', default='', group=('service', 'helm_charts'))
+         .add_str('--custom_key_path', 'custom_key_path', default='', group=('service', 'helm_charts'))
+         .add_str('--custom_certs_host', 'custom certs host', default='', group='helm_charts')
+         # Tmp for jenkins job
+         .add_str('--endpoint_id', 'Endpoint Id',
+                  default='user:tag', group=())
+         )
+        return params.build()
+
+    def check_k8s_cluster_status(self):
+        """ Check for kubernetes status
+
+        Returns:
+            None
+        Raises:
+            TerraformProviderError: if master or kubeDNS is not running
+
+        """
+        start_time = time.time()
+        while True:
+            with Console.ssh(self.ip, self.user_name, self.pkey_path) as c:
+                k8c_info_status = c.run(
+                    'kubectl cluster-info | '
+                    'sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"') \
+                    .stdout
+
+            kubernetes_success_status = 'Kubernetes master is running'
+            kubernetes_dns_success_status = 'KubeDNS is running'
+
+            kubernetes_succeed = kubernetes_success_status in k8c_info_status
+            kube_dns_succeed = kubernetes_dns_success_status in k8c_info_status
+
+            if kubernetes_succeed and kube_dns_succeed:
+                break
+            if (time.time() - start_time) >= 600:
+                raise TimeoutError
+            time.sleep(60)
+
+    def check_tiller_status(self):
+        """ Check tiller status
+
+        Returns:
+            None
+        Raises:
+            TerraformProviderError: if tiller is not running
+
+        """
+        start_time = time.time()
+
+        with Console.ssh(self.ip, self.user_name, self.pkey_path) as c:
+            while True:
+                tiller_status = c.run(
+                    "kubectl get pods --all-namespaces "
+                    "| grep tiller | awk '{print $4}'").stdout
+                tiller_success_status = 'Running'
+                if tiller_success_status in tiller_status:
+                    break
+                if (time.time() - start_time) >= 1200:
+                    raise TimeoutError
+                time.sleep(60)
+
+    def select_master_ip(self):
+        terraform = TerraformProvider(self.no_color)
+        output = terraform.output(self.tf_params,
+                                  '-json ssn_k8s_masters_ip_addresses')
+        ips = json.loads(output)
+        if not ips:
+            raise TerraformProviderError('no ips')
+        self.ip = ips[0]
+
+    def copy_terraform_to_remote(self):
+        logging.info('transfer terraform dir to remote')
+        tf_dir = os.path.abspath(
+            os.path.join(os.getcwd(), os.path.pardir, os.path.pardir))
+        source = os.path.join(tf_dir, 'ssn-helm-charts')
+        remote_dir = '/home/{}/terraform/'.format(self.user_name)
+        with Console.ssh(self.ip, self.user_name, self.pkey_path) as conn:
+            conn.run('mkdir -p {}'.format(remote_dir))
+            rsync(conn, source, remote_dir, strict_host_keys=False)
+
+    def copy_cert(self):
+        logging.info('transfer certificates to remote')
+        cert_path = self.service_args.get('custom_cert_path')
+        key_path = self.service_args.get('custom_key_path')
+        remote_dir = '/tmp/'  # .format(self.user_name)
+        with Console.ssh(self.ip, self.user_name, self.pkey_path) as conn:
+            conn.run('mkdir -p {}'.format(remote_dir))
+            rsync(conn, cert_path, remote_dir, strict_host_keys=False)
+            rsync(conn, key_path, remote_dir, strict_host_keys=False)
+
+    def run_remote_terraform(self):
+        logging.info('apply helm charts')
+        args = self.parse_args()
+        # dns_name = json.loads(TerraformProvider(self.no_color)
+        #                       .output(self.tf_params,
+        #                               '-json ssn_k8s_alb_dns_name'))
+        nlb_dns_name = json.loads(TerraformProvider(self.no_color)
+                                  .output(self.tf_params,
+                                          '-json ssn_k8s_nlb_dns_name'))
+        logging.info('apply ssn-helm-charts')
+        terraform_args = args.get('helm_charts')
+        args_str = get_var_args_string(terraform_args)
+        with Console.ssh(self.ip, self.user_name, self.pkey_path) as conn:
+            with conn.cd('terraform/ssn-helm-charts/main'):
+                init = conn.run('terraform init').stdout.lower()
+                validate = conn.run('terraform validate').stdout.lower()
+                if 'success' not in init or 'success' not in validate:
+                    raise TerraformProviderError
+                command = ('terraform apply -auto-approve '
+                           '-var \'ssn_k8s_nlb_dns_name={}\''
+                           .format(nlb_dns_name))
+                logging.info('{} {}'.format(command, args_str[1]))
+                conn.run('{} {}'.format(command, args_str[0]))
+                output = ' '.join(conn.run('terraform output -json')
+                                  .stdout.split())
+                self.fill_args_from_dict(json.loads(output))
+
+    def output_terraform_result(self):
+        # dns_name = json.loads(
+        #     TerraformProvider(self.no_color).output(self.tf_params,
+        #                                             '-json nginx_load_balancer_hostname'))
+        ssn_k8s_sg_id = json.loads(
+            TerraformProvider(self.no_color).output(self.tf_params,
+                                                    '-json ssn_k8s_sg_id'))
+        ssn_subnet = json.loads(
+            TerraformProvider(self.no_color).output(self.tf_params,
+                                                    '-json ssn_subnet_id'))
+        ssn_vpc_id = json.loads(
+            TerraformProvider(self.no_color).output(self.tf_params,
+                                                    '-json ssn_vpc_id'))
+
+        logging.info("""
+        DataLab SSN K8S cluster has been deployed successfully!
+        Summary:
+        VPC ID: {}
+        Subnet ID:  {}
+        SG IDs: {}
+        """.format(ssn_vpc_id, ssn_subnet, ssn_k8s_sg_id))
+
+    def fill_args_from_dict(self, output):
+        for key, value in output.items():
+            value = value.get('value')
+            sys.argv.extend(['--' + key, value])
+
+    def fill_remote_terraform_output(self):
+        with Console.ssh(self.ip, self.user_name, self.pkey_path) as conn:
+            with conn.cd('terraform/ssn-helm-charts/main'):
+                output = ' '.join(conn.run('terraform output -json')
+                                  .stdout.split())
+                self.fill_args_from_dict(json.loads(output))
+                output_processor = LocalStorageOutputProcessor(self.tf_output)
+                output = {key: value.get('value')
+                          for key, value in json.loads(output).items()}
+                output_processor.write(output)
+
+    @staticmethod
+    def add_ip_to_known_hosts(ip):
+        attempt = 0
+        while attempt < 10:
+            if len(Console.execute('ssh-keygen -H -F {}'.format(ip))) == 0:
+                Console.execute(
+                    'ssh-keyscan {} >> ~/.ssh/known_hosts'.format(ip))
+                attempt += 1
+            else:
+                break
+
+    def destroy_remote_terraform(self):
+        logging.info('destroy helm charts')
+        with Console.ssh(self.ip, self.user_name, self.pkey_path) as conn:
+            with conn.cd('terraform/ssn-helm-charts/main'):
+                init = conn.run('terraform init').stdout.lower()
+                validate = conn.run('terraform validate').stdout.lower()
+                if 'success' not in init or 'success' not in validate:
+                    raise TerraformProviderError
+                command = 'terraform destroy -auto-approve'
+                logging.info(command)
+                conn.run(command)
+
+    def deploy(self):
+        logging.info('deploy')
+        output = ' '.join(
+            TerraformProvider(self.no_color).output(self.tf_params,
+                                                    '-json').split())
+        self.fill_args_from_dict(json.loads(output))
+        self.select_master_ip()
+        self.add_ip_to_known_hosts(self.ip)
+        self.check_k8s_cluster_status()
+        self.check_tiller_status()
+        self.copy_terraform_to_remote()
+        if self.service_args.get('custom_certs_enabled'):
+            self.copy_cert()
+        self.run_remote_terraform()
+        self.fill_remote_terraform_output()
+        self.output_terraform_result()
+
+    def destroy(self):
+        self.select_master_ip()
+        try:
+            self.destroy_remote_terraform()
+        except:
+            print("Error with destroying helm charts.")
+        super(AWSK8sSourceBuilder, self).destroy()
+        if self.output_dir is not None:
+            shutil.rmtree(self.output_dir)
+        elif os.path.isfile(os.path.join(INITIAL_LOCATION, 'output.json')):
+            os.remove(os.path.join(INITIAL_LOCATION, 'output.json'))
+
+
+class AWSEndpointBuilder(AbstractDeployBuilder):
+
+    def update_extracted_file_data(self, obj):
+        if 'ssn_vpc_id' in obj:
+            obj['vpc_id'] = obj['ssn_vpc_id']
+        if 'ssn_subnet_id' in obj:
+            obj['subnet_id'] = obj['ssn_subnet_id']
+
+    @property
+    def name(self):
+        return 'endpoint'
+
+    @property
+    def use_tf_output_file(self):
+        return True
+
+    @property
+    def terraform_location(self):
+        tf_dir = os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))
+        return os.path.join(tf_dir, 'aws/endpoint/main')
+
+    @property
+    def terraform_args_group_name(self):
+        return 'endpoint'
+
+    def validate_params(self):
+        super(AWSEndpointBuilder, self).validate_params()
+        params = self.parse_args()[self.terraform_args_group_name]
+        if len(params.get('endpoint_id')) > 12:
+            sys.stderr.write('endpoint_id length should be less then 12')
+            sys.exit(1)
+
+    @property
+    def cli_args(self):
+        params = ParamsBuilder()
+        (params
+         .add_bool('--no_color', 'no color console_output', group='service',
+                   default=False)
+         .add_str('--state', 'State file path', group='service')
+         .add_str('--secret_access_key', 'AWS Secret Access Key',
+                  required=True,
+                  group='endpoint')
+         .add_str('--access_key_id', 'AWS Access Key ID', required=True,
+                  group='endpoint')
+         .add_str('--pkey', 'path to key', required=True, group='service')
+         .add_str('--service_base_name',
+                  'Any infrastructure value (should be unique if  multiple '
+                  'SSN\'s have been deployed before). Should be  same as on ssn',
+                  group='endpoint')
+         .add_str('--vpc_id', 'ID of AWS VPC if you already have VPC created.',
+                  group='endpoint')
+         .add_str('--vpc_cidr',
+                  'CIDR for VPC creation. Conflicts with vpc_id.',
+                  default='172.31.0.0/16', group='endpoint')
+         .add_str('--subnet_id',
+                  'ID of Subnet if you already have subnet created.',
+                  group='endpoint')
+         .add_str('--ssn_k8s_sg_id', 'ID of SSN SG.', group='endpoint')
+         .add_str('--subnet_cidr',
+                  'CIDR for Subnet creation. Conflicts with subnet_id.',
+                  default='172.31.0.0/24', group='endpoint')
+         .add_str('--ami', 'ID of AMI.', group='endpoint')
+         .add_str('--key_name', 'Name of EC2 Key pair.', required=True,
+                  group='endpoint')
+         .add_str('--endpoint_id', 'Endpoint id.', required=True,
+                  group='endpoint')
+         .add_str('--region', 'Name of AWS region.', default='us-west-2',
+                  group='endpoint')
+         .add_str('--zone', 'Name of AWS zone.', default='a', group='endpoint')
+         .add_str('--network_type',
+                  'Type of created network (if network is not existed and '
+                  'require creation) for endpoint',
+                  default='public', group='endpoint')
+         .add_str('--endpoint_instance_shape', 'Instance shape of Endpoint.',
+                  default='t2.medium', group='endpoint')
+         .add_int('--endpoint_volume_size', 'Size of root volume in GB.',
+                  default=30, group='endpoint')
+         .add_str('--product', 'Product name.', default='datalab',
+                  group='endpoint')
+         .add_str('--additional_tag', 'Additional tag.',
+                  default='product:datalab', group='endpoint')
+         .add_str('--ldap_host', 'ldap host', required=True,
+                  group='endpoint')
+         .add_str('--ldap_dn', 'ldap dn', required=True,
+                  group='endpoint')
+         .add_str('--ldap_user', 'ldap user', required=True,
+                  group='endpoint')
+         .add_str('--ldap_bind_creds', 'ldap bind creds', required=True,
+                  group='endpoint')
+         .add_str('--ldap_users_group', 'ldap users group', required=True,
+                  group='endpoint')
+         .add_bool('--billing_enable', 'Billing enable', group='endpoint', default=False)
+         .add_str('--mongo_password', 'Mongo database password', group='endpoint')
+         .add_str('--mongo_host', 'Mongo database host', group='endpoint', default='localhost')
+         .add_str('--billing_bucket', 'Billing bucket name', group='endpoint', default='')
+         .add_str('--report_path', 'The path to report folder', group='endpoint', default='')
+         .add_str('--aws_job_enabled', 'Billing format. Available options: true (aws), false(epam)', group='endpoint',
+                  default='false')
+         .add_str('--billing_aws_account_id', 'The ID of ASW linked account', group='endpoint', default='')
+         .add_str('--billing_tag', 'Billing tag', group='endpoint', default='datalab')
+         )
+        return params.build()
+
+    def deploy(self):
+        self.fill_sys_argv_from_file()
+        new_dir = os.path.abspath(
+            os.path.join(os.getcwd(), '../../../bin/deploy'))
+        os.chdir(new_dir)
+        start_deploy()
+
+
+class GCPK8sSourceBuilder(AbstractDeployBuilder):
+
+    # def update_extracted_file_data(self, obj):
+    #     if 'ssn_vpc_id' in obj:
+    #         obj['vpc_id'] = obj['ssn_vpc_id']
+
+    @property
+    def name(self):
+        return 'k8s'
+
+    @property
+    def use_tf_output_file(self):
+        return True
+
+    @property
+    def terraform_location(self):
+        tf_dir = os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))
+        return os.path.join(tf_dir, 'gcp/ssn-gke/main')
+
+    @property
+    def terraform_args_group_name(self):
+        return 'k8s'
+
+    def validate_params(self):
+        super(GCPK8sSourceBuilder, self).validate_params()
+        # params = self.parse_args()[self.terraform_args_group_name]
+        # if len(params.get('endpoint_id')) > 12:
+        #     sys.stderr.write('endpoint_id length should be less then 12')
+        #     sys.exit(1)
+
+    @property
+    def cli_args(self):
+        params = ParamsBuilder()
+        (params
+         .add_bool('--no_color', 'no color console_output', group='service',
+                   default=False)
+         .add_str('--state', 'State file path', group='service')
+         .add_str('--namespace', 'Name of namespace', group='k8s')
+         .add_str('--credentials_file_path', 'Path to creds file', group='k8s', required=True)
+         .add_str('--project_id', 'Project ID', group='k8s', required=True)
+         .add_str('--region', 'Region name', group='k8s', required=True)
+         .add_str('--zone', 'Zone name', group='k8s', required=True)
+         .add_str('--vpc_name', 'VPC name', group='k8s')
+         .add_str('--subnet_name', 'Subnet name', group='k8s')
+         .add_str('--service_base_name', 'Service base name', group='k8s', required=True)
+         .add_str('--subnet_cidr', 'Subnet CIDR', group='k8s')
+         .add_str('--additional_tag', 'Additional tag', group='k8s')
+         .add_str('--ssn_k8s_workers_count', 'Number of workers per zone', group='k8s')
+         .add_str('--gke_cluster_version', 'GKE version', group='k8s')
+         .add_str('--ssn_k8s_workers_shape', 'Workers shape', group='k8s')
+         .add_str('--service_account_iam_roles', 'Array of roles', group='k8s')
+         .add_str('--ssn_k8s_alb_dns_name', 'DNS name', group='k8s')
+         .add_str('--keycloak_user', 'Keycloak user name', group='k8s')
+         .add_str('--mysql_user', 'MySQL user name', group='k8s')
+         .add_str('--mysql_db_name', 'MySQL database name', group='k8s')
+         .add_str('--ldap_usernameAttr', 'LDAP username attr', group='k8s', default='uid')
+         .add_str('--ldap_rdnAttr', 'LDAP rdn attr', group='k8s', default='uid')
+         .add_str('--ldap_uuidAttr', 'LDAP uuid attr', group='k8s', default='uid')
+         .add_str('--ldap_users_group', 'LDAP users group', group='k8s', default='ou=People')
+         .add_str('--ldap_dn', 'LDAP DN', group='k8s', default='dc=example,dc=com')
+         .add_str('--ldap_user', 'LDAP user', group='k8s', default='cn=admin')
+         .add_str('--ldap_bind_creds', 'LDAP user password', group='k8s', required=True)
+         .add_str('--ldap_host', 'LDAP host', group='k8s', required=True)
+         .add_str('--mongo_db_username', 'Mongo user name', group='k8s')
+         .add_str('--mongo_dbname', 'Mongo database name', group='k8s')
+         .add_str('--mongo_image_tag', 'Mongo image tag', group='k8s')
+         .add_str('--mongo_service_port', 'Mongo service port', group='k8s')
+         .add_str('--mongo_node_port', 'Mongo node port', group='k8s')
+         .add_str('--mongo_service_name', 'Mongo service name', group='k8s')
+         .add_str('--env_os', 'Environment Operating system', group='k8s', default='debian')
+         .add_str('--big_query_dataset', 'Big query dataset name for billing', group='k8s', default='test')
+         .add_str('--custom_certs_enabled', 'If custom certs enabled', group='k8s')
+         .add_str('--custom_cert_path', 'Custom cert path', group='k8s')
+         .add_str('--custom_key_path', 'Custom key path', group='k8s')
+         .add_str('--custom_certs_host', 'Custom cert host ', group='k8s')
+         .add_str('--mysql_disk_size', 'MySQL disk size', group='k8s')
+         .add_str('--domain', 'Domain name', group='k8s', required=True)
+         )
+        return params.build()
+
+    def apply(self):
+        terraform = TerraformProvider(self.no_color)
+        gke_params = self.tf_params.copy()
+        helm_charts_params = self.tf_params.copy()
+
+        gke_params['-target'] = 'module.gke_cluster'
+        helm_charts_params['-target'] = 'module.helm_charts'
+
+        terraform.apply(gke_params, self.terraform_args)
+        terraform.apply(helm_charts_params, self.terraform_args)
+
+    def deploy(self):
+        pass
+
+    def destroy(self):
+        terraform = TerraformProvider(self.no_color)
+        gke_params = self.tf_params.copy()
+        helm_charts_params = self.tf_params.copy()
+
+        gke_params['-target'] = 'module.gke_cluster'
+        helm_charts_params['-target'] = 'module.helm_charts'
+
+        terraform.destroy(helm_charts_params, self.terraform_args, True)
+        time.sleep(60)
+        terraform.destroy(gke_params, self.terraform_args)
+
+
+class GCPEndpointBuilder(AbstractDeployBuilder):
+
+    def update_extracted_file_data(self, obj):
+        if 'ssn_vpc_id' in obj:
+            obj['vpc_id'] = obj['ssn_vpc_id']
+
+    @property
+    def name(self):
+        return 'endpoint'
+
+    @property
+    def use_tf_output_file(self):
+        return True
+
+    @property
+    def terraform_location(self):
+        tf_dir = os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))
+        return os.path.join(tf_dir, 'gcp/endpoint/main')
+
+    @property
+    def terraform_args_group_name(self):
+        return 'endpoint'
+
+    def validate_params(self):
+        super(GCPEndpointBuilder, self).validate_params()
+        params = self.parse_args()[self.terraform_args_group_name]
+        if len(params.get('endpoint_id')) > 12:
+            sys.stderr.write('endpoint_id length should be less then 12')
+            sys.exit(1)
+
+    @property
+    def cli_args(self):
+        params = ParamsBuilder()
+        (params
+         .add_bool('--no_color', 'no color console_output', group='service',
+                   default=False)
+         .add_str('--state', 'State file path', group='service')
+         .add_str('--gcp_project_id', 'GCP project ID', required=True, group='endpoint')
+         .add_str('--creds_file', 'Path to crdes file', required=True, group='endpoint')
+         .add_str('--pkey', 'path to key', required=True, group='service')
+         .add_str('--service_base_name', 'Service base name', group='endpoint')
+         .add_str('--vpc_id', 'ID of VPC if you already have VPC created.', group='endpoint')
+         .add_str('--subnet_cidr', 'CIDR for Subnet creation. Conflicts with vpc_id.', default='172.31.0.0/24',
+                  group='endpoint')
+         .add_str('--ssn_subnet', 'ID of AWS Subnet if you already have subnet created.', group='endpoint')
+         .add_str('--subnet_id', 'ID of subnet', group='endpoint')
+         .add_str('--ami', 'ID of EC2 AMI.', group='endpoint')
+         .add_str('--path_to_pub_key', 'Path to public key', required=True, group='endpoint')
+         .add_str('--endpoint_id', 'Endpoint id.', required=True, group='endpoint')
+         .add_str('--region', 'Name of region.', group='endpoint')
+         .add_str('--zone', 'Name of zone.', group='endpoint')
+         .add_str('--endpoint_shape', 'Instance shape of Endpoint.', group='endpoint')
+         .add_str('--endpoint_volume_size', 'Endpoint disk size', group='endpoint')
+         .add_str('--additional_tag', 'Additional tag.', default='product:datalab', group='endpoint')
+         .add_str('--ldap_host', 'ldap host', required=True, group='endpoint')
+         .add_str('--ldap_dn', 'ldap dn', required=True, group='endpoint')
+         .add_str('--ldap_user', 'ldap user', required=True, group='endpoint')
+         .add_str('--ldap_bind_creds', 'ldap bind creds', required=True, group='endpoint')
+         .add_str('--ldap_users_group', 'ldap users group', required=True, group='endpoint')
+         .add_str('--firewall_ing_cidr_range', 'Ingress range', group='endpoint')
+         .add_str('--firewall_eg_cidr_range', 'Egress range', group='endpoint')
+         .add_str('--endpoint_policies', 'Endpoint policies list', group='endpoint')
+         .add_str('--endpoint_roles', 'Endpoint roles list', group='endpoint')
+         .add_str('--bucket_region', 'Bucket region', group='endpoint')
+         .add_bool('--billing_enable', 'Billing enable', group='endpoint', default=False)
+         .add_str('--billing_dataset_name', 'Billing dataset name', group='endpoint')
+         .add_str('--mongo_password', 'Mongo database password', group='endpoint')
+         .add_str('--mongo_host', 'Mongo database host', group='endpoint', default='localhost')
+         )
+        return params.build()
+
+    def deploy(self):
+        self.fill_sys_argv_from_file()
+        new_dir = os.path.abspath(
+            os.path.join(os.getcwd(), '../../../bin/deploy'))
+        os.chdir(new_dir)
+        start_deploy()
+
+
+class AzureEndpointBuilder(AbstractDeployBuilder):
+
+    def update_extracted_file_data(self, obj):
+        if 'ssn_vpc_id' in obj:
+            obj['vpc_id'] = obj['ssn_vpc_id']
+
+    @property
+    def name(self):
+        return 'endpoint'
+
+    @property
+    def use_tf_output_file(self):
+        return True
+
+    @property
+    def terraform_location(self):
+        tf_dir = os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))
+        return os.path.join(tf_dir, 'azure/endpoint/main')
+
+    @property
+    def terraform_args_group_name(self):
+        return 'endpoint'
+
+    def validate_params(self):
+        super(AzureEndpointBuilder, self).validate_params()
+        params = self.parse_args()[self.terraform_args_group_name]
+        if len(params.get('endpoint_id')) > 12:
+            sys.stderr.write('endpoint_id length should be less then 12')
+            sys.exit(1)
+
+    @property
+    def cli_args(self):
+        params = ParamsBuilder()
+        (params
+         .add_bool('--no_color', 'no color console_output', group='service',
+                   default=False)
+         .add_str('--state', 'State file path', group='service')
+         .add_str('--auth_file_path', 'Path to crdes file', required=True, group='endpoint')
+         .add_str('--pkey', 'path to key', required=True, group='service')
+         .add_str('--service_base_name', 'Service base name', group='endpoint')
+         .add_str('--resource_group_name', 'Resource group name', group='endpoint')
+         .add_str('--vpc_id', 'ID of VPC if you already have VPC created.', group='endpoint')
+         .add_str('--vpc_cidr', 'CIDR for VPC creation. Conflicts with vpc_id.', default='172.31.0.0/16',
+                  group='endpoint')
+         .add_str('--subnet_cidr', 'CIDR for Subnet creation. Conflicts with vpc_id.', default='172.31.0.0/24',
+                  group='endpoint')
+         .add_str('--ssn_subnet', 'ID of AWS Subnet if you already have subnet created.', group='endpoint')
+         .add_str('--subnet_id', 'ID of subnet', group='endpoint')
+         .add_str('--ami', 'ID of EC2 AMI.', group='endpoint')
+         .add_str('--key_path', 'Path to public key', required=True, group='endpoint')
+         .add_str('--endpoint_id', 'Endpoint id.', required=True, group='endpoint')
+         .add_str('--region', 'Name of region.', group='endpoint')
+         .add_str('--endpoint_shape', 'Instance shape of Endpoint.', default='Standard_DS2_v2', group='endpoint')
+         .add_str('--endpoint_volume_size', 'Endpoint disk size', default='30', group='endpoint')
+         .add_str('--additional_tag', 'Additional tag.', default='product:datalab', group='endpoint')
+         .add_str('--tenant_id', 'Azure tenant ID', group='endpoint', default='')
+         .add_str('--subscription_id', 'Azure subscription ID', group='endpoint', default='')
+         .add_str('--offer_number', 'Azure offer number', group='endpoint', default='')
+         .add_str('--currency', 'Azure currency for billing', group='endpoint', default='')
+         .add_str('--locale', 'Azure locale', group='endpoint', default='')
+         .add_str('--region_info', 'Azure region info', group='endpoint', default='')
+         .add_str('--mongo_password', 'Mongo database password', group='endpoint')
+         .add_str('--mongo_host', 'Mongo database host', group='endpoint', default='localhost')
+         .add_bool('--billing_enable', 'Billing enable', group='endpoint', default=False)
+         )
+        return params.build()
+
+    def deploy(self):
+        self.fill_sys_argv_from_file()
+        new_dir = os.path.abspath(
+            os.path.join(os.getcwd(), '../../../bin/deploy'))
+        os.chdir(new_dir)
+        start_deploy()
+
+
+class DeployDirector:
+
+    def build(self, action, builder):
+        """ Do build action
+        Args:
+            builder: AbstractDeployBuilder
+        Returns:
+            None
+        """
+        try:
+            builder.provision()
+            if action == 'deploy':
+                builder.apply()
+                builder.store_output_to_file()
+                builder.deploy()
+            if action == 'destroy':
+                builder.destroy()
+
+        except Exception as ex:
+            print(ex)
+
+
+def deploy():
+    actions = {'deploy', 'destroy'}
+
+    sources_targets = {
+        'aws': ['k8s', 'endpoint'],
+        'gcp': ['k8s', 'endpoint'],
+        'azure': ['endpoint']
+    }
+
+    no_args_error = ('usage: ./datalab {} {} {}\n'.format(
+        actions,
+        set(sources_targets.keys()),
+        set(itertools.chain(*sources_targets.values()))))
+    no_source_error = (
+        lambda x: ('usage: ./datalab {} {} {}\n'.format(
+            x,
+            set(sources_targets.keys()),
+            set(itertools.chain(*sources_targets.values())))))
+    no_target_error = (
+        lambda x, y: ('usage: ./datalab {} {} {}\n'.format(
+            x, y, set(itertools.chain(*sources_targets.values())))))
+
+    if len(sys.argv) == 1 or sys.argv[1] not in actions:
+        sys.stderr.write(no_args_error)
+        exit(1)
+    if len(sys.argv) == 2 or sys.argv[2] not in sources_targets:
+        sys.stderr.write(no_source_error(sys.argv[1]))
+        exit(1)
+    if len(sys.argv) == 3 or sys.argv[3] not in sources_targets[sys.argv[2]]:
+        sys.stderr.write(no_target_error(sys.argv[1], sys.argv[2]))
+
+    module, action, source, target = sys.argv[:4]
+    builders_dict = {
+        'aws': {
+            'k8s': AWSK8sSourceBuilder,
+            'endpoint': AWSEndpointBuilder
+        },
+        'gcp': {
+            'k8s': GCPK8sSourceBuilder,
+            'endpoint': GCPEndpointBuilder
+        },
+        'azure': {
+            'endpoint': AzureEndpointBuilder
+        }
+    }
+    builder = builders_dict[source][target]()
+    deploy_director = DeployDirector()
+    deploy_director.build(action, builder)
+
+
+if __name__ == '__main__':
+    deploy()
diff --git a/infrastructure-provisioning/terraform/bin/deploy/billing_app_aws.yml b/infrastructure-provisioning/terraform/bin/deploy/billing_app_aws.yml
index dd33a9e..d523554 100644
--- a/infrastructure-provisioning/terraform/bin/deploy/billing_app_aws.yml
+++ b/infrastructure-provisioning/terraform/bin/deploy/billing_app_aws.yml
@@ -26,7 +26,7 @@
     mongodb:
       username: admin
       password: MONGO_PASSWORD
-      database: dlabdb
+      database: datalabdb
       port: 27017
       host: MONGO_HOST
 
@@ -41,14 +41,14 @@
 server.ssl.key-alias: endpoint
 
 logging:
-  file: /var/opt/dlab/log/ssn/billing.log
+  file: /var/opt/datalab/log/ssn/billing.log
   level:
     com:
       epam: trace
 
 keycloak:
   bearer-only: true
-  realm: dlab
+  realm: datalab
   resource: KEYCLOAK_CLIENT_ID
   credentials.secret: CLIENT_SECRET
   ssl-required: none
diff --git a/infrastructure-provisioning/terraform/bin/deploy/billing_aws.yml b/infrastructure-provisioning/terraform/bin/deploy/billing_aws.yml
index 41add93..adc8195 100644
--- a/infrastructure-provisioning/terraform/bin/deploy/billing_aws.yml
+++ b/infrastructure-provisioning/terraform/bin/deploy/billing_aws.yml
@@ -30,7 +30,7 @@
 port: 27017
 username: admin
 password: MONGO_PASSWORD
-database: dlabdb
+database: datalabdb
 
 # Adapter for reading source data. Known types: file, s3file
 adapterIn:
@@ -44,13 +44,13 @@
 
 # Adapter for writing converted data. Known types: console, file, s3file, mongodb
 adapterOut:
-  - type: mongodlab
+  - type: mongodatalab
     host: MONGO_HOST
     port: 27017
     username: admin
     password: MONGO_PASSWORD
-    database: dlabdb
-#    bufferSize: 10000
+    database: datalabdb
+    #    bufferSize: 10000
     upsert: true
     serviceBaseName: SERVICE_BASE_NAME
 
@@ -58,7 +58,7 @@
 filter:
   - type: aws
     currencyCode: USD
-    columnDlabTag: CONF_BILLING_TAG
+    columnDatalabTag: CONF_BILLING_TAG
     serviceBaseName: SERVICE_BASE_NAME
 
 
@@ -68,7 +68,7 @@
     headerLineNo: 1
     skipLines: 1
     columnMapping: >-
-      dlab_id=DLAB_ID;usage_date=USAGE_DATE;product=PRODUCT;
+      datalab_id=DATALAB_ID;usage_date=USAGE_DATE;product=PRODUCT;
       usage_type=USAGE_TYPE;usage=USAGE;cost=COST;
       resource_id=RESOURCE_ID;tags=TAGS
     aggregate: day
@@ -88,7 +88,7 @@
   appenders:
     #- type: console
     - type: file
-      currentLogFilename: /var/opt/dlab/log/ssn/billing.log
+      currentLogFilename: /var/opt/datalab/log/ssn/billing.log
       archive: true
-      archivedLogFilenamePattern: /var/opt/dlab/log/ssn/billing-%d{yyyy-MM-dd}.log.gz
+      archivedLogFilenamePattern: /var/opt/datalab/log/ssn/billing-%d{yyyy-MM-dd}.log.gz
       archivedFileCount: 10
diff --git a/infrastructure-provisioning/terraform/bin/deploy/billing_azure.yml b/infrastructure-provisioning/terraform/bin/deploy/billing_azure.yml
index 6953d49..ac1ce50 100644
--- a/infrastructure-provisioning/terraform/bin/deploy/billing_azure.yml
+++ b/infrastructure-provisioning/terraform/bin/deploy/billing_azure.yml
@@ -26,7 +26,7 @@
     mongodb:
       username: admin
       password: MONGO_PASSWORD
-      database: dlabdb
+      database: datalabdb
       port: MONGO_PORT
       host: MONGO_HOST
 
@@ -41,20 +41,20 @@
 server.ssl.key-alias: endpoint
 
 logging:
-  file: /var/opt/dlab/log/ssn/billing.log
+  file: /var/opt/datalab/log/ssn/billing.log
   level:
     com:
       epam: trace
 
 keycloak:
   bearer-only: true
-  realm: dlab
+  realm: datalab
   resource: KEYCLOAK_CLIENT_ID
   credentials.secret: KEYCLOAK_CLIENT_SECRET
   ssl-required: none
   auth-server-url: KEYCLOAK_AUTH_SERVER_URL
 
-dlab:
+datalab:
   sbn: SERVICE_BASE_NAME
   billingEnabled: true
   clientId: CLIENT_ID
@@ -74,7 +74,7 @@
     port: MONGO_PORT
     username: admin
     password: MONGO_PASSWORD
-    database: dlabdb
+    database: datalabdb
   ssnStorageAccountTagName: <AZURE_SSN_STORAGE_ACCOUNT_TAG>
   sharedStorageAccountTagName: <AZURE_SHARED_STORAGE_ACCOUNT_TAG>
   datalakeTagName: <AZURE_DATALAKE_TAG>
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/bin/deploy/billing_gcp.yml b/infrastructure-provisioning/terraform/bin/deploy/billing_gcp.yml
index af793ba..454bf0a 100644
--- a/infrastructure-provisioning/terraform/bin/deploy/billing_gcp.yml
+++ b/infrastructure-provisioning/terraform/bin/deploy/billing_gcp.yml
@@ -26,10 +26,10 @@
     mongodb:
       username: admin
       password: MONGO_PASSWORD
-      database: dlabdb
+      database: datalabdb
       port: 27017
       host: MONGO_HOST
-dlab:
+datalab:
   sbn: SERVICE_BASE_NAME
   bigQueryDataset: DATASET_NAME
   cron: 0 0 * * * *
@@ -45,14 +45,14 @@
 server.ssl.key-alias: endpoint
 
 logging:
-  file: /var/opt/dlab/log/ssn/billing.log
+  file: /var/opt/datalab/log/ssn/billing.log
   level:
     com:
       epam: trace
 
 keycloak:
   bearer-only: true
-  realm: dlab
+  realm: datalab
   resource: KEYCLOAK_CLIENT_ID
   credentials.secret: CLIENT_SECRET
   ssl-required: none
diff --git a/infrastructure-provisioning/terraform/bin/deploy/daemon.json b/infrastructure-provisioning/terraform/bin/deploy/daemon.json
new file mode 100644
index 0000000..ed640d5
--- /dev/null
+++ b/infrastructure-provisioning/terraform/bin/deploy/daemon.json
@@ -0,0 +1,4 @@
+{
+  DNS_IP_RESOLVE
+  "insecure-registries": ["REPOSITORY"]
+}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/bin/deploy/endpoint_fab.py b/infrastructure-provisioning/terraform/bin/deploy/endpoint_fab.py
index 47ee469..94ae1f9 100644
--- a/infrastructure-provisioning/terraform/bin/deploy/endpoint_fab.py
+++ b/infrastructure-provisioning/terraform/bin/deploy/endpoint_fab.py
@@ -1,23 +1,19 @@
-# *****************************************************************************
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#    http://www.apache.org/licenses/LICENSE-2.0
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 
 import argparse
 import logging
@@ -28,6 +24,7 @@
 import traceback
 from fabric import Connection
 from patchwork.files import exists
+from patchwork import files
 
 conn = None
 args = None
@@ -85,13 +82,13 @@
 
 
 def ensure_logs_endpoint():
-    log_root_dir = "/var/opt/dlab/log"
+    log_root_dir = "/var/opt/datalab/log"
     supervisor_log_file = "/var/log/application/provision-service.log"
     try:
         if not exists(conn, '/home/' + args.os_user + '/.ensure_dir/logs_ensured'):
-            if not exists(conn, args.dlab_path):
-                conn.sudo("mkdir -p " + args.dlab_path)
-                conn.sudo("chown -R " + args.os_user + ' ' + args.dlab_path)
+            if not exists(conn, args.datalab_path):
+                conn.sudo("mkdir -p " + args.datalab_path)
+                conn.sudo("chown -R " + args.os_user + ' ' + args.datalab_path)
             if not exists(conn, log_root_dir):
                 conn.sudo('mkdir -p ' + log_root_dir + '/provisioning')
                 conn.sudo('touch ' + log_root_dir + '/provisioning/provisioning.log')
@@ -101,7 +98,7 @@
             conn.sudo("chown -R {0} {1}".format(args.os_user, log_root_dir))
             conn.sudo('touch /home/' + args.os_user + '/.ensure_dir/logs_ensured')
     except Exception as err:
-        print('Failed to configure logs and dlab directory: ', str(err))
+        print('Failed to configure logs and datalab directory: ', str(err))
         traceback.print_exc()
         sys.exit(1)
 
@@ -171,7 +168,7 @@
                       '--password-file /home/{2}/keys/provisioner_password {4} --output-file /tmp/step_token'.format(
                                args.step_kid, args.step_ca_url, args.os_user, cn, sans))
             token = conn.sudo('cat /tmp/step_token').stdout.replace('\n', '')
-            conn.sudo('step ca certificate "{0}" /etc/ssl/certs/dlab.crt /etc/ssl/certs/dlab.key '
+            conn.sudo('step ca certificate "{0}" /etc/ssl/certs/datalab.crt /etc/ssl/certs/datalab.key '
                       '--token "{1}" --kty=RSA --size 2048 --provisioner {2} '.format(cn, token, args.step_kid))
             conn.put('./renew_certificates.sh', '/tmp/renew_certificates.sh')
             conn.sudo('mv /tmp/renew_certificates.sh /usr/local/bin/')
@@ -186,8 +183,8 @@
             conn.sudo('chmod +x /usr/local/bin/manage_step_certs.sh')
             conn.sudo('sed -i "s|STEP_ROOT_CERT_PATH|/etc/ssl/certs/root_ca.crt|g" '
                       '/usr/local/bin/manage_step_certs.sh')
-            conn.sudo('sed -i "s|STEP_CERT_PATH|/etc/ssl/certs/dlab.crt|g" /usr/local/bin/manage_step_certs.sh')
-            conn.sudo('sed -i "s|STEP_KEY_PATH|/etc/ssl/certs/dlab.key|g" /usr/local/bin/manage_step_certs.sh')
+            conn.sudo('sed -i "s|STEP_CERT_PATH|/etc/ssl/certs/datalab.crt|g" /usr/local/bin/manage_step_certs.sh')
+            conn.sudo('sed -i "s|STEP_KEY_PATH|/etc/ssl/certs/datalab.key|g" /usr/local/bin/manage_step_certs.sh')
             conn.sudo('sed -i "s|STEP_CA_URL|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(args.step_ca_url))
             conn.sudo('sed -i "s|RESOURCE_TYPE|endpoint|g" /usr/local/bin/manage_step_certs.sh')
             conn.sudo('sed -i "s|SANS|{0}|g" /usr/local/bin/manage_step_certs.sh'.format(sans))
@@ -233,17 +230,17 @@
                       'https://download.docker.com/linux/ubuntu '
                       '$(lsb_release -cs) stable"')
             conn.sudo('apt-get update')
-            conn.sudo('apt-cache policy docker-ce')
+            docker_version = conn.sudo("apt-cache policy docker-ce | grep Candidate | awk '{print $2}'").stdout.replace('\n','')
             conn.sudo('apt-get install -y docker-ce={}'
-                      .format(args.docker_version))
-            if not exists(conn, '{}/tmp'.format(args.dlab_path)):
-                conn.run('mkdir -p {}/tmp'.format(args.dlab_path))
+                      .format(docker_version))
+            if not exists(conn, '{}/tmp'.format(args.datalab_path)):
+                conn.run('mkdir -p {}/tmp'.format(args.datalab_path))
             conn.put('./daemon.json',
-                     '{}/tmp/daemon.json'.format(args.dlab_path))
+                     '{}/tmp/daemon.json'.format(args.datalab_path))
             conn.sudo('sed -i "s|REPOSITORY|{}:{}|g" {}/tmp/daemon.json'
                       .format(args.repository_address,
                               args.repository_port,
-                              args.dlab_path))
+                              args.datalab_path))
             if args.cloud_provider == "aws":
                 dns_ip_resolve = (conn.run("systemd-resolve --status "
                                            "| grep -A 5 'Current Scopes: DNS' "
@@ -251,13 +248,13 @@
                                            "| awk '{print $3}'")
                                   .stdout.rstrip("\n\r"))
                 conn.sudo("sed -i 's|DNS_IP_RESOLVE|\"dns\": [\"{0}\"],|g' {1}/tmp/daemon.json"
-                          .format(dns_ip_resolve, args.dlab_path))
+                          .format(dns_ip_resolve, args.datalab_path))
             elif args.cloud_provider == "gcp" or args.cloud_provider == "azure":
                 dns_ip_resolve = ""
                 conn.sudo('sed -i "s|DNS_IP_RESOLVE||g" {1}/tmp/daemon.json'
-                          .format(dns_ip_resolve, args.dlab_path))
+                          .format(dns_ip_resolve, args.datalab_path))
             conn.sudo('mv {}/tmp/daemon.json /etc/docker'
-                      .format(args.dlab_path))
+                      .format(args.datalab_path))
             conn.sudo('usermod -a -G docker ' + args.os_user)
             conn.sudo('update-rc.d docker defaults')
             conn.sudo('update-rc.d docker enable')
@@ -280,8 +277,8 @@
             conn.sudo('apt-get update')
             conn.sudo('apt-get -y --allow-unauthenticated install mongodb-org')
             conn.sudo('systemctl enable mongod.service')
-            conn.sudo('sudo apt-get -y install python-pip')
-            conn.sudo('pip install -U pymongo pyyaml --no-cache-dir ')
+            conn.sudo('sudo apt-get -y install python3-pip')
+            conn.sudo('pip3 install -U pymongo pyyaml --no-cache-dir ')
             conn.sudo('touch /home/{}/.ensure_dir/mongo_ensured'
                       .format(args.os_user))
         print('[CONFIGURING MONGO DATABASE]')
@@ -296,7 +293,7 @@
             conn.sudo('sed -i "s|PASSWORD|{}|g" /tmp/configure_mongo.py'.format(args.mongo_password))
         if not exists(conn, '/tmp/mongo_roles.json'):
             conn.put('./mongo_files/gcp/mongo_roles.json', '/tmp/mongo_roles.json')
-        conn.sudo('python /tmp/configure_mongo.py')
+        conn.sudo('python3 /tmp/configure_mongo.py')
     except Exception as err:
         logging.error('Failed to install Mongo: ', str(err))
         traceback.print_exc()
@@ -319,16 +316,16 @@
 
 def configure_keystore_endpoint(os_user, endpoint_keystore_password):
     try:
-        conn.sudo('openssl pkcs12 -export -in /etc/ssl/certs/dlab.crt -inkey '
-                  '/etc/ssl/certs/dlab.key -name endpoint -out /home/{0}/keys/endpoint.p12 '
+        conn.sudo('openssl pkcs12 -export -in /etc/ssl/certs/datalab.crt -inkey '
+                  '/etc/ssl/certs/datalab.key -name endpoint -out /home/{0}/keys/endpoint.p12 '
                   '-password pass:{1}'.format(os_user, endpoint_keystore_password))
         conn.sudo('keytool -importkeystore -srckeystore /home/{0}/keys/endpoint.p12 -srcstoretype PKCS12 '
                   '-alias endpoint -destkeystore /home/{0}/keys/endpoint.keystore.jks -deststorepass "{1}" '
                   '-srcstorepass "{1}"'.format(os_user, endpoint_keystore_password))
         conn.sudo('keytool -keystore /home/{0}/keys/endpoint.keystore.jks -alias step-ca -import -file '
                   '/etc/ssl/certs/root_ca.crt  -deststorepass "{1}" -noprompt'.format(
-                   os_user, endpoint_keystore_password))
-        conn.sudo('keytool -importcert -trustcacerts -alias endpoint -file /etc/ssl/certs/dlab.crt -noprompt '
+            os_user, endpoint_keystore_password))
+        conn.sudo('keytool -importcert -trustcacerts -alias endpoint -file /etc/ssl/certs/datalab.crt -noprompt '
                   '-storepass changeit -keystore {0}/lib/security/cacerts'.format(java_home))
         conn.sudo('keytool -importcert -trustcacerts -file /etc/ssl/certs/root_ca.crt -noprompt '
                   '-storepass changeit -keystore {0}/lib/security/cacerts'.format(java_home))
@@ -345,13 +342,13 @@
         if not exists(conn,
                       '/home/{}/.ensure_dir/configure_supervisor_ensured'.format(args.os_user)):
             supervisor_conf = '/etc/supervisor/conf.d/supervisor_svc.conf'
-            if not exists(conn, '{}/tmp'.format(args.dlab_path)):
-                conn.run('mkdir -p {}/tmp'.format(args.dlab_path))
-            conn.put('./supervisor_svc.conf', '{}/tmp/supervisor_svc.conf'.format(args.dlab_path))
-            dlab_conf_dir = '{}/conf/'.format(args.dlab_path)
-            if not exists(conn, dlab_conf_dir):
-                conn.run('mkdir -p {}'.format(dlab_conf_dir))
-            web_path = '{}/webapp'.format(args.dlab_path)
+            if not exists(conn, '{}/tmp'.format(args.datalab_path)):
+                conn.run('mkdir -p {}/tmp'.format(args.datalab_path))
+            conn.put('./supervisor_svc.conf', '{}/tmp/supervisor_svc.conf'.format(args.datalab_path))
+            datalab_conf_dir = '{}/conf/'.format(args.datalab_path)
+            if not exists(conn, datalab_conf_dir):
+                conn.run('mkdir -p {}'.format(datalab_conf_dir))
+            web_path = '{}/webapp'.format(args.datalab_path)
             if not exists(conn, web_path):
                 conn.run('mkdir -p {}'.format(web_path))
             if args.cloud_provider == 'aws':
@@ -362,21 +359,22 @@
                                            'subnet-id'.format(interface)).stdout
                 args.vpc2_id = args.vpc_id
                 args.subnet2_id = args.subnet_id
-                conn.sudo('sed -i "s|CONF_PARAMETER|--spring.config.location={0}billing_app.yml --conf |g" {1}/tmp/supervisor_svc.conf'
-                          .format(dlab_conf_dir, args.dlab_path))
+                conn.sudo(
+                    'sed -i "s|CONF_PARAMETER|--spring.config.location={0}billing_app.yml --conf |g" {1}/tmp/supervisor_svc.conf'
+                    .format(datalab_conf_dir, args.datalab_path))
             elif args.cloud_provider == 'gcp' or args.cloud_provider == 'azure':
                 conn.sudo('sed -i "s|CONF_PARAMETER|--spring.config.location=|g" {}/tmp/supervisor_svc.conf'
-                          .format(args.dlab_path))
+                          .format(args.datalab_path))
             conn.sudo('sed -i "s|OS_USR|{}|g" {}/tmp/supervisor_svc.conf'
-                      .format(args.os_user, args.dlab_path))
+                      .format(args.os_user, args.datalab_path))
             conn.sudo('sed -i "s|WEB_CONF|{}|g" {}/tmp/supervisor_svc.conf'
-                      .format(dlab_conf_dir, args.dlab_path))
+                      .format(datalab_conf_dir, args.datalab_path))
             conn.sudo('sed -i \'s=WEB_APP_DIR={}=\' {}/tmp/supervisor_svc.conf'
-                      .format(web_path, args.dlab_path))
+                      .format(web_path, args.datalab_path))
             conn.sudo('cp {}/tmp/supervisor_svc.conf {}'
-                      .format(args.dlab_path, supervisor_conf))
+                      .format(args.datalab_path, supervisor_conf))
             conn.put('./provisioning.yml', '{}provisioning.yml'
-                     .format(dlab_conf_dir))
+                     .format(datalab_conf_dir))
             if args.resource_group_name == '':
                 args.resource_group_name = '{}-{}-resource-group'.format(args.service_base_name, args.endpoint_id)
             if args.cloud_provider == 'azure':
@@ -573,7 +571,7 @@
             ]
             for param in cloud_properties:
                 conn.sudo('sed -i "s|{0}|{1}|g" {2}provisioning.yml'
-                          .format(param['key'], param['value'], dlab_conf_dir))
+                          .format(param['key'], param['value'], datalab_conf_dir))
 
             conn.sudo('touch /home/{}/.ensure_dir/configure_supervisor_ensured'
                       .format(args.os_user))
@@ -588,23 +586,25 @@
         ensure_file = ('/home/{}/.ensure_dir/backend_jar_ensured'
                        .format(args.os_user))
         if not exists(conn, ensure_file):
-            web_path = '{}/webapp'.format(args.dlab_path)
+            web_path = '{}/webapp'.format(args.datalab_path)
             if not exists(conn, web_path):
                 conn.run('mkdir -p {}'.format(web_path))
-            conn.run('wget -P {}  --user={} --password={} '
-                     'https://{}/repository/packages/provisioning-service-'
-                     '2.2.jar --no-check-certificate'
+            if 'Failed' in conn.run('wget -P {0}  --user={1} --password={2} '
+                     'https://{3}/repository/packages/{4}/provisioning-service-'
+                     '{4}.jar --no-check-certificate 2>&1 | tee /tmp/tee.tmp; if grep -w -i -E  "ERROR|Failed" /tmp/tee.tmp; then echo -e "==============\nFailed jar download.\n=============="; fi'
                      .format(web_path, args.repository_user,
-                             args.repository_pass, args.repository_address))
-            conn.run('mv {0}/provisioning-service-2.2.jar {0}/provisioning-service.jar'
-                     .format(web_path))
-            conn.run('wget -P {}  --user={} --password={} '
-                     'https://{}/repository/packages/billing-{}-'
-                     '2.2.jar --no-check-certificate'
+                             args.repository_pass, args.repository_address, args.release_tag)).stdout:
+                sys.exit(1)
+            conn.run('mv {0}/provisioning-service-{1}.jar {0}/provisioning-service.jar'
+                     .format(web_path, args.release_tag))
+            if 'Failed' in conn.run('wget -P {0}  --user={1} --password={2} '
+                     'https://{3}/repository/packages/{5}/billing-{4}-'
+                     '{5}.jar --no-check-certificate 2>&1 | tee /tmp/tee.tmp; if grep -w -i -E  "ERROR|Failed" /tmp/tee.tmp; then echo -e "==============\nFailed jar download.\n=============="; fi'
                      .format(web_path, args.repository_user,
-                             args.repository_pass, args.repository_address, args.cloud_provider))
-            conn.run('mv {0}/billing-{1}-2.2.jar {0}/billing.jar'
-                     .format(web_path, args.cloud_provider))
+                             args.repository_pass, args.repository_address, args.cloud_provider, args.release_tag)).stdout:
+                sys.exit(1)
+            conn.run('mv {0}/billing-{1}-{2}.jar {0}/billing.jar'
+                     .format(web_path, args.cloud_provider, args.release_tag))
             conn.sudo('touch {}'.format(ensure_file))
     except Exception as err:
         logging.error('Failed to download jar-provisioner: ', str(err))
@@ -623,9 +623,9 @@
 
 def get_sources():
     try:
-        conn.run("git clone https://github.com/apache/incubator-dlab.git {0}/sources".format(args.dlab_path))
+        conn.run("git clone https://github.com/apache/incubator-datalab.git {0}/sources".format(args.datalab_path))
         if args.branch_name != "":
-            conn.run("cd {0}/sources && git checkout {1} && cd".format(args.dlab_path, args.branch_name))
+            conn.run("cd {0}/sources && git checkout {1} && cd".format(args.datalab_path, args.branch_name))
     except Exception as err:
         logging.error('Failed to download sources: ', str(err))
         traceback.print_exc()
@@ -645,17 +645,18 @@
                 'azure': ['base', 'edge', 'project', 'jupyter', 'rstudio', 'zeppelin', 'tensor', 'deeplearning',
                           'dataengine']
             }
-            conn.sudo('docker login -u {} -p {} {}:{}'
+            if 'Failed' in conn.sudo('docker login -u {} -p {} {}:{} 2>&1 | tee /tmp/tee.tmp; if grep -w -i -E  "ERROR" /tmp/tee.tmp; then echo -e "==============\nFailed docker login.\n=============="; fi'
                       .format(args.repository_user,
                               args.repository_pass,
                               args.repository_address,
-                              args.repository_port))
+                              args.repository_port)).stdout:
+                sys.exit(1)
             for image in list_images[args.cloud_provider]:
-                conn.sudo('docker pull {0}:{1}/docker.dlab-{3}-{2}'
+                conn.sudo('docker pull {0}:{1}/docker.datalab-{3}-{2}'
                           .format(args.repository_address, args.repository_port, args.cloud_provider, image))
-                conn.sudo('docker tag {0}:{1}/docker.dlab-{3}-{2} docker.dlab-{3}'
+                conn.sudo('docker tag {0}:{1}/docker.datalab-{3}-{2} docker.datalab-{3}'
                           .format(args.repository_address, args.repository_port, args.cloud_provider, image))
-                conn.sudo('docker rmi {0}:{1}/docker.dlab-{3}-{2}'
+                conn.sudo('docker rmi {0}:{1}/docker.datalab-{3}-{2}'
                           .format(args.repository_address, args.repository_port, args.cloud_provider, image))
             conn.sudo('chown -R {0}:docker /home/{0}/.docker/'
                       .format(args.os_user))
@@ -694,18 +695,18 @@
                   " -e MYSQL_DATABASE='guacamole' -e MYSQL_USER='guacamole' -e MYSQL_PASSWORD='{}'"
                   " -d -p 8080:8080 guacamole/guacamole".format(mysql_pass))
         # create cronjob for run containers on reboot
-        conn.sudo('mkdir -p /opt/dlab/cron')
-        conn.sudo('touch /opt/dlab/cron/mysql.sh')
-        conn.sudo('chmod 755 /opt/dlab/cron/mysql.sh')
-        conn.sudo('chown {0}:{0} //opt/dlab/cron/mysql.sh'.format(args.os_user))
-        conn.sudo('echo "docker start guacd" >> /opt/dlab/cron/mysql.sh')
-        conn.sudo('echo "docker start guac-mysql" >> /opt/dlab/cron/mysql.sh')
-        conn.sudo('echo "docker rm guacamole" >> /opt/dlab/cron/mysql.sh')
-        conn.sudo("""echo "docker run --name guacamole --restart unless-stopped --link guacd:guacd""" 
+        conn.sudo('mkdir -p /opt/datalab/cron')
+        conn.sudo('touch /opt/datalab/cron/mysql.sh')
+        conn.sudo('chmod 755 /opt/datalab/cron/mysql.sh')
+        conn.sudo('chown {0}:{0} //opt/datalab/cron/mysql.sh'.format(args.os_user))
+        conn.sudo('echo "docker start guacd" >> /opt/datalab/cron/mysql.sh')
+        conn.sudo('echo "docker start guac-mysql" >> /opt/datalab/cron/mysql.sh')
+        conn.sudo('echo "docker rm guacamole" >> /opt/datalab/cron/mysql.sh')
+        conn.sudo("""echo "docker run --name guacamole --restart unless-stopped --link guacd:guacd"""
                   """ --link guac-mysql:mysql -e MYSQL_DATABASE='guacamole' -e MYSQL_USER='guacamole' """
                   """-e MYSQL_PASSWORD='{}' -d -p 8080:8080 guacamole/guacamole" >> """
-                  """/opt/dlab/cron/mysql.sh""".format(mysql_pass))
-        conn.sudo('''/bin/bash -c '(crontab -l 2>/dev/null; echo "@reboot sh /opt/dlab/cron/mysql.sh") |''' 
+                  """/opt/datalab/cron/mysql.sh""".format(mysql_pass))
+        conn.sudo('''/bin/bash -c '(crontab -l 2>/dev/null; echo "@reboot sh /opt/datalab/cron/mysql.sh") |'''
                   ''' crontab - ' ''')
     except Exception as err:
         traceback.print_exc()
@@ -716,13 +717,13 @@
     try:
         if args.billing_enable:
             conn.put('./billing_{}.yml'.format(args.cloud_provider), '{}/conf/billing.yml'
-                     .format(args.dlab_path))
-            billing_yml_path = "{}/conf/billing.yml".format(args.dlab_path)
+                     .format(args.datalab_path))
+            billing_yml_path = "{}/conf/billing.yml".format(args.datalab_path)
             if args.cloud_provider == 'aws':
 
                 conn.put('./billing_app_{}.yml'.format(args.cloud_provider), '{}/conf/billing_app.yml'
-                         .format(args.dlab_path))
-                billing_app_yml_path = "{}/conf/billing_app.yml".format(args.dlab_path)
+                         .format(args.datalab_path))
+                billing_app_yml_path = "{}/conf/billing_app.yml".format(args.datalab_path)
                 billing_app_properties = [
                     {
                         'key': "MONGO_HOST",
@@ -808,8 +809,8 @@
                         'value': args.service_base_name
                     },
                     {
-                        'key': "DLAB_ID",
-                        'value': args.billing_dlab_id
+                        'key': "DATALAB_ID",
+                        'value': args.billing_datalab_id
                     },
                     {
                         'key': "USAGE_DATE",
@@ -969,13 +970,13 @@
 def init_args():
     global args
     parser = argparse.ArgumentParser()
-    parser.add_argument('--dlab_path', type=str, default='/opt/dlab')
+    parser.add_argument('--datalab_path', type=str, default='/opt/datalab')
     parser.add_argument('--key_name', type=str, default='', help='Name of admin key without .pem extension')
     parser.add_argument('--endpoint_eip_address', type=str)
     parser.add_argument('--endpoint_id', type=str, default='')
     parser.add_argument('--pkey', type=str, default='')
     parser.add_argument('--hostname', type=str, default='')
-    parser.add_argument('--os_user', type=str, default='dlab-user')
+    parser.add_argument('--os_user', type=str, default='datalab-user')
     parser.add_argument('--cloud_provider', type=str, default='')
     parser.add_argument('--mongo_host', type=str, default='localhost')
     parser.add_argument('--mongo_port', type=str, default='27017')
@@ -987,8 +988,10 @@
     parser.add_argument('--repository_port', type=str, default='')
     parser.add_argument('--repository_user', type=str, default='')
     parser.add_argument('--repository_pass', type=str, default='')
+    parser.add_argument('--release_tag', type=str,
+                        default='2.5')
     parser.add_argument('--docker_version', type=str,
-                        default='18.06.3~ce~3-0~ubuntu')
+                        default='5:20.10.6~3-0~ubuntu-bionic')
     parser.add_argument('--ssn_bucket_name', type=str, default='')
     parser.add_argument('--keycloak_auth_server_url', type=str, default='')
     parser.add_argument('--keycloak_realm_name', type=str, default='')
@@ -1032,7 +1035,7 @@
     parser.add_argument('--image_enabled', type=str, default='true')
     parser.add_argument('--auth_file_path', type=str, default='')
 
-    #Billing parameter
+    # Billing parameter
     parser.add_argument('--billing_enable', type=bool, default=False)
     parser.add_argument('--aws_job_enabled', type=str, default='false')
     parser.add_argument('--billing_bucket', type=str, default='')
@@ -1040,8 +1043,8 @@
     parser.add_argument('--billing_aws_account_id', type=str, default='')
     parser.add_argument('--access_key_id', type=str, default='')
     parser.add_argument('--secret_access_key', type=str, default='')
-    parser.add_argument('--billing_tag', type=str, default='dlab')
-    parser.add_argument('--billing_dlab_id', type=str, default='resource_tags_user_user_tag')
+    parser.add_argument('--billing_tag', type=str, default='datalab')
+    parser.add_argument('--billing_datalab_id', type=str, default='resource_tags_user_user_tag')
     parser.add_argument('--billing_usage_date', type=str, default='line_item_usage_start_date')
     parser.add_argument('--billing_product', type=str, default='product_product_name')
     parser.add_argument('--billing_usage_type', type=str, default='line_item_usage_type')
@@ -1061,18 +1064,27 @@
     parser.add_argument('--ssn_k8s_nlb_dns_name', type=str, default='')
     parser.add_argument('--ssn_k8s_alb_dns_name', type=str, default='')
     # TEMPORARY
-
-    print(parser.parse_known_args())
+    print(parser.parse_known_args()[1])
     args = parser.parse_known_args()[0]
-
+    args_list = list()
+    for key in args.__dict__:
+        value = args.__dict__[key]
+        if key in ["secret_access_key", "keycloak_auth_server_url", "keycloak_realm_name", "keycloak_user_name",
+                   "keycloak_user_password", "keycloak_client_id", "keycloak_client_secret","access_key_id",
+                   "ldap_host", "ldap_user", "ldap_bind_creds", "mongo_password", "mongo_host", "mongo_port",
+                   "repository_address", "repository_port", "repository_user", "repository_pass",
+                   "step_root_ca", "step_kid", "step_kid_password"]:
+            value = '********'
+        args_list.append("{0}={1}".format(key, value))
+    print(args_list)
 
 def update_system():
     conn.sudo('apt-get update')
     conn.sudo('apt-get install -y jq')
 
 
-def init_dlab_connection(ip=None, user=None,
-                         pkey=None):
+def init_datalab_connection(ip=None, user=None,
+                            pkey=None):
     global conn
     if not ip:
         ip = args.hostname
@@ -1083,7 +1095,7 @@
     try:
         conn = Connection(ip, user, connect_kwargs={'key_filename': pkey})
     except Exception as err:
-        logging.error('Failed connect as dlab-user: ', str(err))
+        logging.error('Failed connect as datalab-user: ', str(err))
         traceback.print_exc()
         sys.exit(1)
 
@@ -1103,7 +1115,6 @@
 def start_deploy():
     global args
     init_args()
-    print(args)
     if args.hostname == "":
         args.hostname = args.endpoint_eip_address
     endpoint_keystore_password = id_generator()
@@ -1111,11 +1122,10 @@
     print("Start provisioning of Endpoint.")
     time.sleep(40)
 
-    print(args)
-    logging.info("Creating dlab-user")
+    logging.info("Creating datalab-user")
     create_user()
 
-    init_dlab_connection()
+    init_datalab_connection()
     update_system()
 
     logging.info("Configuring ensure dir")
diff --git a/infrastructure-provisioning/terraform/bin/deploy/mongo_files/configure_mongo.py b/infrastructure-provisioning/terraform/bin/deploy/mongo_files/configure_mongo.py
index 14b89b4..acaf6ef 100644
--- a/infrastructure-provisioning/terraform/bin/deploy/mongo_files/configure_mongo.py
+++ b/infrastructure-provisioning/terraform/bin/deploy/mongo_files/configure_mongo.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 # *****************************************************************************
 #
@@ -21,14 +21,15 @@
 #
 # ******************************************************************************
 
-from pymongo import MongoClient
-import yaml
 import subprocess
 import time
+import yaml
+from pymongo import MongoClient
 
 path = "/etc/mongod.conf"
 outfile = "/etc/mongo_params.yml"
 
+
 def add_2_yml_config(path, section, param, value):
     try:
         try:
@@ -74,12 +75,12 @@
         command = ['service', 'mongod', 'start']
         subprocess.call(command, shell=False)
         time.sleep(5)
-        client.dlabdb.add_user('admin', mongo_passwd, roles=[{'role':'userAdminAnyDatabase','db':'admin'}])
-        client.dlabdb.command('grantRolesToUser', "admin", roles=["readWrite"])
+        client.datalabdb.add_user('admin', mongo_passwd, roles=[{'role': 'userAdminAnyDatabase', 'db': 'admin'}])
+        client.datalabdb.command('grantRolesToUser', "admin", roles=["readWrite"])
         # set_mongo_parameters(client, mongo_parameters)
 
-        # client.dlabdb.security.create_index("expireAt", expireAfterSeconds=7200)
-        if add_2_yml_config(path,'security','authorization','enabled'):
+        # client.datalabdb.security.create_index("expireAt", expireAfterSeconds=7200)
+        if add_2_yml_config(path, 'security', 'authorization', 'enabled'):
             command = ['service', 'mongod', 'restart']
             subprocess.call(command, shell=False)
     except:
diff --git a/infrastructure-provisioning/terraform/bin/deploy/mongo_files/gcp/mongo_roles.json b/infrastructure-provisioning/terraform/bin/deploy/mongo_files/gcp/mongo_roles.json
index 43d12e3..badb966 100644
--- a/infrastructure-provisioning/terraform/bin/deploy/mongo_files/gcp/mongo_roles.json
+++ b/infrastructure-provisioning/terraform/bin/deploy/mongo_files/gcp/mongo_roles.json
@@ -73,7 +73,7 @@
     "_id": "nbCreateDeeplearning",
     "description": "Create Notebook Deep Learning",
     "exploratories": [
-      "docker.dlab-deeplearning"
+      "docker.datalab-deeplearning"
     ],
     "groups": [
       "$anyuser"
@@ -83,7 +83,7 @@
     "_id": "nbCreateJupyter",
     "description": "Create Notebook Jupyter",
     "exploratories": [
-      "docker.dlab-jupyter"
+      "docker.datalab-jupyter"
     ],
     "groups": [
       "$anyuser"
@@ -93,7 +93,7 @@
     "_id": "nbCreateJupyterLab",
     "description": "Create Notebook JupyterLab",
     "exploratories": [
-      "docker.dlab-jupyterlab"
+      "docker.datalab-jupyterlab"
     ],
     "groups": [
       "$anyuser"
@@ -103,7 +103,7 @@
     "_id": "nbCreateSuperset",
     "description": "Create Notebook Superset",
     "exploratories": [
-      "docker.dlab-superset"
+      "docker.datalab-superset"
     ],
     "groups": [
       "$anyuser"
@@ -113,7 +113,7 @@
     "_id": "nbCreateRstudio",
     "description": "Create Notebook RStudio",
     "exploratories": [
-      "docker.dlab-rstudio"
+      "docker.datalab-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -123,7 +123,7 @@
     "_id": "nbCreateTensor",
     "description": "Create Notebook Jupyter with TensorFlow",
     "exploratories": [
-      "docker.dlab-tensor"
+      "docker.datalab-tensor"
     ],
     "groups": [
       "$anyuser"
@@ -133,7 +133,7 @@
     "_id": "nbCreateTensorRstudio",
     "description": "Create Notebook RStudio with TensorFlow",
     "exploratories": [
-      "docker.dlab-tensor-rstudio"
+      "docker.datalab-tensor-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -143,7 +143,7 @@
     "_id": "nbCreateZeppelin",
     "description": "Create Notebook Apache Zeppelin",
     "exploratories": [
-      "docker.dlab-zeppelin"
+      "docker.datalab-zeppelin"
     ],
     "groups": [
       "$anyuser"
@@ -153,7 +153,7 @@
     "_id": "nbCreateDataEngine",
     "description": "Create Data Engine",
     "computationals": [
-      "docker.dlab-dataengine"
+      "docker.datalab-dataengine"
     ],
     "groups": [
       "$anyuser"
@@ -163,7 +163,7 @@
     "_id": "nbCreateDataEngineService",
     "description": "Create Data Engine Service",
     "computationals": [
-      "docker.dlab-dataengine-service"
+      "docker.datalab-dataengine-service"
     ],
     "groups": [
       "$anyuser"
diff --git a/infrastructure-provisioning/terraform/bin/deploy/provisioning.yml b/infrastructure-provisioning/terraform/bin/deploy/provisioning.yml
index abbbadf..cd2b98b 100644
--- a/infrastructure-provisioning/terraform/bin/deploy/provisioning.yml
+++ b/infrastructure-provisioning/terraform/bin/deploy/provisioning.yml
@@ -19,7 +19,7 @@
 #
 # ******************************************************************************
 
-<#assign LOG_ROOT_DIR="/var/opt/dlab/log">
+<#assign LOG_ROOT_DIR="/var/opt/datalab/log">
 <#assign KEYS_DIR="/home/OS_USER/keys">
 <#assign KEY_STORE_PATH="${KEYS_DIR}/endpoint.keystore.jks">
 <#assign KEY_STORE_PASSWORD="KEYSTORE_PASSWORD">
@@ -40,7 +40,7 @@
   port: MONGO_PORT
   username: admin
   password: MONGO_PASSWORD
-  database: dlabdb
+  database: datalabdb
 
 selfService:
   protocol: https
@@ -67,6 +67,11 @@
     timeout: 3s
     connectionTimeout: 3s
 
+bucketService:
+  jerseyClient:
+    timeout: 50m
+    connectionTimeout: 3s
+
 billingService:
   jerseyClient:
     timeout: 4m
@@ -75,21 +80,21 @@
 # Log out user on inactivity
 inactiveUserTimeoutMillSec: 7200000
 
-backupScriptPath: /opt/dlab/tmp/backup.py
-backupDirectory: /opt/dlab/tmp/result
+backupScriptPath: /opt/datalab/tmp/backup.py
+backupDirectory: /opt/datalab/tmp/result
 keyDirectory: ${KEYS_DIR}
-responseDirectory: /opt/dlab/tmp
-handlerDirectory: /opt/dlab/handlers
+responseDirectory: /opt/datalab/tmp
+handlerDirectory: /opt/datalab/handlers
 dockerLogDirectory: ${LOG_ROOT_DIR}
 warmupPollTimeout: 2m
-resourceStatusPollTimeout: 300m
+resourceStatusPollTimeout: 400m
 keyLoaderPollTimeout: 30m
 requestEnvStatusTimeout: 50s
 adminKey: KEYNAME
-edgeImage: docker.dlab-edge
+edgeImage: docker.datalab-edge
 fileLengthCheckDelay: 500ms
 
-<#if CLOUD_TYPE == "aws">
+  <#if CLOUD_TYPE == "aws">
 emrEC2RoleDefault: EMR_EC2_DefaultRole
 emrServiceRoleDefault: EMR_DefaultRole
 </#if>
@@ -145,7 +150,7 @@
       archivedFileCount: 10
 
 keycloakConfiguration:
-  realm: dlab
+  realm: datalab
   bearer-only: true
   auth-server-url: KEYCLOAK_AUTH_SERVER_URL
   ssl-required: none
diff --git a/infrastructure-provisioning/terraform/bin/deploy/renew_certificates.sh b/infrastructure-provisioning/terraform/bin/deploy/renew_certificates.sh
index ff3e46d..fb94eb5 100644
--- a/infrastructure-provisioning/terraform/bin/deploy/renew_certificates.sh
+++ b/infrastructure-provisioning/terraform/bin/deploy/renew_certificates.sh
@@ -21,7 +21,7 @@
 #
 # ******************************************************************************
 
-KEYSTORE_PASS=$(cat /opt/dlab/conf/CONF_FILE.yml  | grep '<#assign KEY_STORE_PASSWORD' | awk -F  '\"' '{print $2}')
+KEYSTORE_PASS=$(cat /opt/datalab/conf/CONF_FILE.yml  | grep '<#assign KEY_STORE_PASSWORD' | awk -F  '\"' '{print $2}')
 
 # Removing old certificates
 keytool -delete -alias RESOURCE_TYPE -keystore /home/OS_USER/keys/RESOURCE_TYPE.keystore.jks -storepass "${KEYSTORE_PASS}"
@@ -30,13 +30,13 @@
 keytool -delete -alias RESOURCE_TYPE -keystore JAVA_HOME/lib/security/cacerts -storepass changeit
 
 # Importing new certificates to keystore
-openssl pkcs12 -export -in /etc/ssl/certs/dlab.crt -inkey /etc/ssl/certs/dlab.key -name RESOURCE_TYPE -out /home/OS_USER/keys/RESOURCE_TYPE.p12 -password pass:${KEYSTORE_PASS}
+openssl pkcs12 -export -in /etc/ssl/certs/datalab.crt -inkey /etc/ssl/certs/datalab.key -name RESOURCE_TYPE -out /home/OS_USER/keys/RESOURCE_TYPE.p12 -password pass:${KEYSTORE_PASS}
 keytool -importkeystore -srckeystore /home/OS_USER/keys/RESOURCE_TYPE.p12 -srcstoretype PKCS12 -alias RESOURCE_TYPE -destkeystore /home/OS_USER/keys/RESOURCE_TYPE.keystore.jks -deststorepass "${KEYSTORE_PASS}" -srcstorepass "${KEYSTORE_PASS}"
 keytool -keystore /home/OS_USER/keys/RESOURCE_TYPE.keystore.jks -alias step-ca -import -file  /etc/ssl/certs/root_ca.crt  -deststorepass "${KEYSTORE_PASS}" -noprompt
 
 
 # Adding new certificates
-keytool -importcert -trustcacerts -alias RESOURCE_TYPE -file /etc/ssl/certs/dlab.crt -noprompt -storepass changeit -keystore JAVA_HOME/lib/security/cacerts
+keytool -importcert -trustcacerts -alias RESOURCE_TYPE -file /etc/ssl/certs/datalab.crt -noprompt -storepass changeit -keystore JAVA_HOME/lib/security/cacerts
 keytool -importcert -trustcacerts -alias step-ca -file /etc/ssl/certs/root_ca.crt -noprompt -storepass changeit -keystore JAVA_HOME/lib/security/cacerts
 
 # Restarting service
diff --git a/infrastructure-provisioning/terraform/bin/deploy/supervisor_svc.conf b/infrastructure-provisioning/terraform/bin/deploy/supervisor_svc.conf
index b170043..53ffc1c 100644
--- a/infrastructure-provisioning/terraform/bin/deploy/supervisor_svc.conf
+++ b/infrastructure-provisioning/terraform/bin/deploy/supervisor_svc.conf
@@ -25,14 +25,14 @@
 port = 127.0.0.1:9001
 
 [program:provserv]
-command=java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 WEB_APP_DIR/provisioning-service.jar server WEB_CONFprovisioning.yml
+command=java -Xmx2048M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 WEB_APP_DIR/provisioning-service.jar server WEB_CONFprovisioning.yml
 directory=WEB_APP_DIR
 autorestart=true
 priority=20
 user=root
 stdout_logfile=/var/log/application/provision-service.log
 redirect_stderr=true
-environment=DLAB_CONF_DIR="WEB_CONF"
+environment=DATALAB_CONF_DIR="WEB_CONF"
 
 [program:billing]
 command=java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 WEB_APP_DIR/billing.jar CONF_PARAMETERWEB_CONFbilling.yml
@@ -42,4 +42,4 @@
 user=root
 stdout_logfile=/var/log/application/billing.log
 redirect_stderr=true
-environment=DLAB_CONF_DIR="WEB_CONF"
\ No newline at end of file
+environment=DATALAB_CONF_DIR="WEB_CONF"
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/bin/dlab.py b/infrastructure-provisioning/terraform/bin/dlab.py
deleted file mode 100644
index 68b8739..0000000
--- a/infrastructure-provisioning/terraform/bin/dlab.py
+++ /dev/null
@@ -1,1362 +0,0 @@
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-
-import argparse
-import itertools
-import json
-import logging
-import os
-import re
-import shutil
-import subprocess
-import sys
-import time
-from abc import abstractmethod
-from deploy.endpoint_fab import start_deploy
-from fabric import Connection
-from patchwork.transfers import rsync
-
-sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
-logging.basicConfig(level=logging.INFO, format='%(levelname)s-%(message)s')
-INITIAL_LOCATION = os.path.dirname(os.path.abspath(__file__))
-
-
-class TerraformOutputBase:
-    @property
-    @abstractmethod
-    def output_path(self):
-        pass
-
-    @abstractmethod
-    def write(self, obj):
-        pass
-
-    @abstractmethod
-    def extract(self):
-        pass
-
-
-class LocalStorageOutputProcessor(TerraformOutputBase):
-    output_path = None
-
-    def __init__(self, path):
-        self.output_path = path
-
-    def write(self, obj):
-        """Write json string to local file
-        :param obj: json string
-        """
-        existed_data = {}
-        if os.path.isfile(self.output_path):
-            with open(self.output_path, 'r') as fp:
-                output = fp.read()
-                if len(output):
-                    existed_data = json.loads(output)
-        existed_data.update(obj)
-
-        with open(self.output_path, 'w') as fp:
-            json.dump(existed_data, fp)
-        pass
-
-    def extract(self):
-        """Extract data from local file
-        :return: dict
-        """
-        if os.path.isfile(self.output_path):
-            with open(self.output_path, 'r') as fp:
-                output = fp.read()
-                if len(output):
-                    return json.loads(output)
-
-
-def extract_args(cli_args):
-    args = []
-    for key, value in cli_args.items():
-        if not value:
-            continue
-        if type(value) == list:
-            quoted_list = ['"{}"'.format(item) for item in value]
-            joined_values = ', '.join(quoted_list)
-            value = '[{}]'.format(joined_values)
-        args.append((key, value))
-    return args
-
-
-def get_var_args_string(cli_args):
-    """Convert dict of cli argument into string
-
-    Args:
-        cli_args: dict of cli arguments
-    Returns:
-        str: string of joined key=values
-    """
-    args = extract_args(cli_args)
-    args = ["-var '{0}={1}'".format(key, value) for key, value in args]
-    return ' '.join(args)
-
-
-def get_args_string(cli_args):
-    """Convert dict of cli argument into string
-
-    Args:
-        cli_args: dict of cli arguments
-    Returns:
-        str: string of joined key=values
-    """
-
-    args = extract_args(cli_args)
-    args = ["{0} {1}".format(key, value) for key, value in args]
-    return ' '.join(args)
-
-
-class ParamsBuilder:
-
-    def __init__(self):
-        self.__params = []
-
-    def add(self, arg_type, name, desc, **kwargs):
-        default_group = ['all_args']
-        if isinstance(kwargs.get('group'), str):
-            default_group.append(kwargs.get('group'))
-        if isinstance(kwargs.get('group'), (list, tuple)):
-            default_group.extend(kwargs.get('group'))
-
-        parameter = {
-            'group': default_group,
-            'name': name,
-            'props': {
-                'help': desc,
-                'type': arg_type,
-                'default': kwargs.get('default'),
-                'choices': kwargs.get('choices'),
-                'nargs': kwargs.get('nargs'),
-                'action': kwargs.get('action'),
-                'required': kwargs.get('required'),
-            }
-        }
-        self.__params.append(parameter)
-        return self
-
-    def add_str(self, name, desc, **kwargs):
-        return self.add(str, name, desc, **kwargs)
-
-    def add_bool(self, name, desc, **kwargs):
-        return self.add(self.str2bool, name, desc, **kwargs)
-
-    def add_int(self, name, desc, **kwargs):
-        return self.add(int, name, desc, **kwargs)
-
-    @staticmethod
-    def str2bool(v):
-        if isinstance(v, bool):
-            return v
-        if v.lower() in ('yes', 'true', 't', 'y', '1'):
-            return True
-        elif v.lower() in ('no', 'false', 'f', 'n', '0'):
-            return False
-        else:
-            raise argparse.ArgumentTypeError('Boolean value expected.')
-
-    def build(self):
-        return self.__params
-
-
-class Console:
-
-    @staticmethod
-    def execute_to_command_line(command):
-        """ Execute cli command
-
-        Args:
-            command: str cli command
-        Returns:
-            str: command result
-        """
-        process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE,
-                                   stderr=subprocess.STDOUT,
-                                   universal_newlines=True)
-
-        while True:
-            nextline = process.stdout.readline()
-            print(nextline)
-            if nextline == '' and process.poll() is not None:
-                break
-            if 'error' in nextline.lower():
-                sys.exit(0)
-
-    @staticmethod
-    def execute(command):
-        """ Execute cli command
-
-        Args:
-            command: str cli command
-        Returns:
-            str: command result
-        """
-        return os.popen(command).read()
-
-    @staticmethod
-    def ssh(ip, name, pkey):
-        attempt = 0
-        while attempt < 12:
-            logging.info('connection attempt {}'.format(attempt))
-            connection = Connection(
-                host=ip,
-                user=name,
-                connect_kwargs={'key_filename': pkey,
-                                'allow_agent': False,
-                                'look_for_keys': False,
-                                })
-            try:
-                connection.run('ls')
-                return connection
-            except Exception as ex:
-                logging.error(ex)
-                attempt += 1
-                time.sleep(10)
-
-
-class TerraformProviderError(Exception):
-    """
-    Raises errors while terraform provision
-    """
-    pass
-
-
-class TerraformProvider:
-
-    def __init__(self, no_color=False):
-        self.no_color = '-no-color' if no_color else ''
-
-    def initialize(self):
-        """Initialize terraform
-
-        Returns:
-             bool: init successful
-        Raises:
-            TerraformProviderError: if initialization was not succeed
-        """
-        logging.info('terraform init')
-        terraform_success_init = 'Terraform has been successfully initialized!'
-        command = 'terraform init {}'.format(self.no_color)
-        terraform_init_result = Console.execute(command)
-        logging.info(terraform_init_result)
-        if terraform_success_init not in terraform_init_result:
-            raise TerraformProviderError(terraform_init_result)
-
-    def validate(self):
-        """Validate terraform
-
-        Returns:
-             bool: validation successful
-        Raises:
-            TerraformProviderError: if validation status was not succeed
-
-        """
-        logging.info('terraform validate')
-        terraform_success_validate = 'Success!'
-        terraform_validate_result = Console.execute(
-            'terraform validate {}'.format(self.no_color))
-        logging.info(terraform_validate_result)
-        if terraform_success_validate not in terraform_validate_result:
-            raise TerraformProviderError(terraform_validate_result)
-
-    def apply(self, tf_params, cli_args):
-        """Run terraform
-
-        Args:
-            tf_params: dict of terraform parameters
-            cli_args: dict of parameters
-        Returns:
-             None
-        """
-        logging.info('terraform apply')
-
-        args_str = get_var_args_string(cli_args)
-        params_str = get_args_string(tf_params)
-        command = ('terraform apply -auto-approve {} {} {}'
-                   .format(self.no_color, params_str, args_str))
-        logging.info(command)
-        Console.execute_to_command_line(command)
-
-    def destroy(self, tf_params, cli_args, keep_state_file=False):
-        """Destroy terraform
-
-        Args:
-            tf_params: dict of terraform parameters
-            cli_args: dict of parameters
-            keep_state_file: Boolean
-        Returns:
-             None
-        """
-        logging.info('terraform destroy')
-        args_str = get_var_args_string(cli_args)
-        params_str = get_args_string(tf_params)
-        command = ('terraform destroy -auto-approve {} {} {}'
-                   .format(self.no_color, params_str, args_str))
-        logging.info(command)
-        Console.execute_to_command_line(command)
-        if not keep_state_file:
-            state_file = tf_params['-state']
-            state_file_backup = tf_params['-state'] + '.backup'
-            if os.path.isfile(state_file):
-                os.remove(state_file)
-            if os.path.isfile(state_file_backup):
-                os.remove(state_file_backup)
-
-    @staticmethod
-    def output(tf_params, *args):
-        """Get terraform output
-
-        Args:
-            tf_params: dict of terraform parameters
-            *args: list of str parameters
-        Returns:
-            str: terraform output result
-        """
-        params = get_args_string(tf_params)
-        return Console.execute('terraform output {} {}'
-                               .format(params, ' '.join(args)))
-
-
-class AbstractDeployBuilder:
-    def __init__(self):
-
-        args = self.parse_args()
-        self.service_args = args.get('service')
-        self.no_color = self.service_args.get('no_color')
-        state_dir = self.service_args.get('state')
-        if not state_dir:
-            self.output_dir = None
-            self.tf_output = os.path.join(INITIAL_LOCATION, 'output.json')
-            self.tf_params = {}
-        else:
-            if os.path.isdir(state_dir) and os.access(state_dir, os.W_OK):
-                service_name = (args.get(self.terraform_args_group_name)
-                                .get('service_base_name'))
-                self.output_dir = (os.path.join(state_dir, service_name))
-                self.tf_output = os.path.join(self.output_dir, 'output.json')
-                self.tf_params = {
-                    '-state': os.path.join(
-                        self.output_dir, '{}.tfstate'.format(self.name))
-                }
-            else:
-                sys.stdout.write('path doesn\'t exist')
-                sys.exit(1)
-        if self.use_tf_output_file:
-            self.fill_sys_argv_from_file()
-        self.terraform_args = self.parse_args().get(
-            self.terraform_args_group_name)
-
-    @property
-    @abstractmethod
-    def terraform_location(self):
-        """ get Terraform location
-
-        Returns:
-            str: TF script location
-        """
-        raise NotImplementedError
-
-    @property
-    @abstractmethod
-    def name(self):
-        """ get Terraform name
-
-        Returns:
-            str: TF name
-        """
-        raise NotImplementedError
-
-    @property
-    @abstractmethod
-    def terraform_args_group_name(self):
-        """ get Terraform location
-
-        Returns:
-            str: TF script location
-        """
-        raise NotImplementedError
-
-    @property
-    @abstractmethod
-    def cli_args(self):
-        """Get cli arguments
-
-        Returns:
-            dict: dictionary of client arguments
-                  with name as key and props as value
-        """
-        raise NotImplementedError
-
-    @abstractmethod
-    def deploy(self):
-        """Post terraform execution
-
-        Returns:
-            None
-        """
-        raise NotImplementedError
-
-    @property
-    def use_tf_output_file(self):
-        return False
-
-    def apply(self):
-        """Apply terraform"""
-        terraform = TerraformProvider(self.no_color)
-        terraform.apply(self.tf_params, self.terraform_args)
-
-    def destroy(self):
-        """Destory terraform"""
-        terraform = TerraformProvider(self.no_color)
-        terraform.destroy(self.tf_params, self.terraform_args)
-
-    def store_output_to_file(self):
-        """Extract terraform output and store to file"""
-        terraform = TerraformProvider(self.no_color)
-        output = terraform.output(self.tf_params, '-json')
-        output = {key: value.get('value')
-                  for key, value in json.loads(output).items()}
-        output_writer = LocalStorageOutputProcessor(self.tf_output)
-        output_writer.write(output)
-
-    def update_extracted_file_data(self, obj):
-        """
-        :param obj:
-        :return:
-        Override method if you need to modify extracted from file data
-        """
-        pass
-
-    def fill_sys_argv_from_file(self):
-        """Extract data from file and fill sys args"""
-        output_processor = LocalStorageOutputProcessor(self.tf_output)
-        output = output_processor.extract()
-        if output:
-            self.update_extracted_file_data(output)
-            for key, value in output.items():
-                key = '--' + key
-                if key not in sys.argv:
-                    sys.argv.extend([key, value])
-                else:
-                    try:
-                        index = sys.argv.index(key)
-                        sys.argv[index + 1] = value
-                    except:
-                        pass
-
-    def parse_args(self):
-        """Get dict of arguments
-
-        Returns:
-            dict: CLI arguments
-        """
-        parsers = {}
-        args = []
-
-        for arg in self.cli_args:
-            group = arg.get('group')
-            if isinstance(group, (list, tuple)):
-                for item in group:
-                    args.append(dict(arg.copy(), **{'group': item}))
-            else:
-                args.append(arg)
-
-        cli_args = sorted(args, key=lambda x: x.get('group'))
-        args_groups = itertools.groupby(cli_args, lambda x: x.get('group'))
-        for group, args in args_groups:
-            parser = argparse.ArgumentParser()
-            for arg in args:
-                parser.add_argument(arg.get('name'), **arg.get('props'))
-            parsers[group] = parser
-        return {
-            group: vars(parser.parse_known_args()[0])
-            for group, parser in parsers.items()
-        }
-
-    def validate_params(self):
-        params = self.parse_args()[self.terraform_args_group_name]
-        if len(params.get('service_base_name')) > 20:
-            sys.stderr.write('service_base_name length should be less then 20')
-            sys.exit(1)
-        if not re.match("^[a-z0-9\-]+$", params.get('service_base_name')):
-            sys.stderr.write('service_base_name should contain only lowercase '
-                             'alphanumetic characters and hyphens')
-            sys.exit(1)
-
-    def provision(self):
-        """Execute terraform script
-
-        Returns:
-            None
-        Raises:
-            TerraformProviderError: if init or validate fails
-        """
-        self.validate_params()
-        tf_location = self.terraform_location
-        terraform = TerraformProvider(self.no_color)
-        os.chdir(tf_location)
-        try:
-            terraform.initialize()
-            terraform.validate()
-        except TerraformProviderError as ex:
-            raise Exception('Error while provisioning {}'.format(ex))
-
-
-class AWSK8sSourceBuilder(AbstractDeployBuilder):
-
-    def __init__(self):
-        super(AWSK8sSourceBuilder, self).__init__()
-        self._args = self.parse_args()
-        self._ip = None
-        self._user_name = self.args.get(self.terraform_args_group_name).get(
-            'os_user')
-        self._pkey_path = self.args.get('service').get('pkey')
-
-    @property
-    def name(self):
-        return 'ssn-k8s'
-
-    @property
-    def args(self):
-        return self._args
-
-    @property
-    def ip(self):
-        return self._ip
-
-    @ip.setter
-    def ip(self, ip):
-        self._ip = ip
-
-    @property
-    def user_name(self):
-        return self._user_name
-
-    @property
-    def pkey_path(self):
-        return self._pkey_path
-
-    @property
-    def terraform_location(self):
-        tf_dir = os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))
-        return os.path.join(tf_dir, 'aws/ssn-k8s/main')
-
-    @property
-    def terraform_args_group_name(self):
-        return 'k8s'
-
-    def validate_params(self):
-        super(AWSK8sSourceBuilder, self).validate_params()
-        params = self.parse_args()['all_args']
-        if params.get('ssn_k8s_masters_count', 1) < 1:
-            sys.stderr.write('ssn_k8s_masters_count should be greater then 0')
-            sys.exit(1)
-        if params.get('ssn_k8s_workers_count', 3) < 3:
-            sys.stderr.write('ssn_k8s_masters_count should be minimum 3')
-            sys.exit(1)
-        # Temporary condition for Jenkins job
-        if 'endpoint_id' in params and len(params.get('endpoint_id')) > 12:
-            sys.stderr.write('endpoint_id length should be less then 12')
-            sys.exit(1)
-
-    @property
-    def cli_args(self):
-        params = ParamsBuilder()
-        (params
-         .add_bool('--no_color', 'no color console_output', group='service',
-                   default=False)
-         .add_str('--state', 'State file path', group='service')
-         .add_str('--access_key_id', 'AWS Access Key ID', required=True,
-                  group='k8s')
-         .add_str('--allowed_cidrs',
-                  'CIDR to allow acces to SSN K8S cluster.',
-                  default=["0.0.0.0/0"], action='append', group='k8s')
-         .add_str('--ami', 'ID of EC2 AMI.', required=True, group='k8s')
-         .add_str('--env_os', 'OS type.', default='debian',
-                  choices=['debian', 'redhat'], group=('k8s'))
-         .add_str('--key_name', 'Name of EC2 Key pair.', required=True,
-                  group='k8s')
-         .add_str('--os_user', 'Name of DLab service user.',
-                  default='dlab-user', group='k8s')
-         .add_str('--pkey', 'path to key', required=True, group='service')
-         .add_str('--region', 'Name of AWS region.', default='us-west-2',
-                  group=('k8s'))
-         .add_str('--secret_access_key', 'AWS Secret Access Key',
-                  required=True,
-                  group='k8s')
-         .add_str('--service_base_name',
-                  'Any infrastructure value (should be unique if '
-                  'multiple SSN\'s have been deployed before).',
-                  default='k8s', group=('k8s', 'helm_charts'))
-         .add_int('--ssn_k8s_masters_count', 'Count of K8S masters.',
-                  default=3,
-                  group='k8s')
-         .add_int('--ssn_k8s_workers_count', 'Count of K8S workers', default=2,
-                  group=('k8s', 'helm_charts'))
-         .add_str('--ssn_k8s_masters_shape', 'Shape for SSN K8S masters.',
-                  default='t2.medium', group=('k8s'))
-         .add_str('--ssn_k8s_workers_shape', 'Shape for SSN K8S workers.',
-                  default='t2.medium', group='k8s')
-         .add_int('--ssn_root_volume_size', 'Size of root volume in GB.',
-                  default=30, group='k8s')
-         .add_str('--subnet_cidr_a',
-                  'CIDR for Subnet creation in zone a. Conflicts with  subnet_id_a.',
-                  default='172.31.0.0/24', group='k8s')
-         .add_str('--subnet_cidr_b',
-                  'CIDR for Subnet creation in zone b. Conflicts with  subnet_id_b.',
-                  default='172.31.1.0/24', group='k8s')
-         .add_str('--subnet_cidr_c',
-                  'CIDR for Subnet creation in zone c. Conflicts with  subnet_id_c.',
-                  default='172.31.2.0/24', group='k8s')
-         .add_str('--subnet_id_a',
-                  'ID of AWS Subnet in zone a if you already have subnet created.',
-                  group='k8s')
-         .add_str('--subnet_id_b',
-                  'ID of AWS Subnet in zone b if you already have subnet created.',
-                  group='k8s')
-         .add_str('--subnet_id_c',
-                  'ID of AWS Subnet in zone c if you already have subnet created.',
-                  group='k8s')
-         .add_str('--vpc_cidr', 'CIDR for VPC creation. Conflicts with vpc_id',
-                  default='172.31.0.0/16', group='k8s')
-         .add_str('--vpc_id', 'ID of AWS VPC if you already have VPC created.',
-                  group='k8s')
-         .add_str('--zone', 'Name of AWS zone', default='a',
-                  group=('k8s'))
-         .add_str('--ldap_host', 'ldap host', required=True,
-                  group='helm_charts')
-         .add_str('--ldap_dn', 'ldap dn', required=True,
-                  group='helm_charts')
-         .add_str('--ldap_user', 'ldap user', required=True,
-                  group='helm_charts')
-         .add_str('--ldap_bind_creds', 'ldap bind creds', required=True,
-                  group='helm_charts')
-         .add_str('--ldap_users_group', 'ldap users group', required=True,
-                  group='helm_charts')
-         .add_str('--tag_resource_id', 'Tag resource ID.',
-                  default='user:tag', group=('k8s', 'helm_charts'))
-         .add_str('--additional_tag', 'Additional tag.',
-                  default='product:dlab', group='k8s')
-         .add_str('--billing_bucket', 'Billing bucket name',
-                  group='helm_charts')
-         .add_str('--billing_bucket_path',
-                  'The path to billing reports directory in S3 bucket',
-                  default='',
-                  group='helm_charts')
-         .add_str('--billing_aws_job_enabled',
-                  'Billing format. Available options: true (aws), false(epam)',
-                  default='false',
-                  group='helm_charts')
-         .add_str('--billing_aws_account_id',
-                  'The ID of Amazon account', default='',
-                  group='helm_charts')
-         .add_str('--billing_dlab_id',
-                  'Column name in report file that contains dlab id tag',
-                  default='resource_tags_user_user_tag',
-                  group='helm_charts')
-         .add_str('--billing_usage_date',
-                  'Column name in report file that contains usage date tag',
-                  default='line_item_usage_start_date',
-                  group='helm_charts')
-         .add_str('--billing_product',
-                  'Column name in report file that contains product name tag',
-                  default='product_product_name',
-                  group='helm_charts')
-         .add_str('--billing_usage_type',
-                  'Column name in report file that contains usage type tag',
-                  default='line_item_usage_type',
-                  group='helm_charts')
-         .add_str('--billing_usage',
-                  'Column name in report file that contains usage tag',
-                  default='line_item_usage_amount',
-                  group='helm_charts')
-         .add_str('--billing_cost',
-                  'Column name in report file that contains cost tag',
-                  default='line_item_blended_cost',
-                  group='helm_charts')
-         .add_str('--billing_resource_id',
-                  'Column name in report file that contains dlab resource id tag',
-                  default='line_item_resource_id',
-                  group='helm_charts')
-         .add_str('--billing_tags',
-                  'Column name in report file that contains tags',
-                  default='line_item_operation,line_item_line_item_description',
-                  group='helm_charts')
-         .add_str('--billing_tag', 'Billing tag', default='dlab',
-                  group='helm_charts')
-         .add_bool('--custom_certs_enabled', 'Enable custom certificates',
-                   default=False, group=('service', 'helm_charts'))
-         .add_str('--custom_cert_path', 'custom_cert_path', default='', group=('service', 'helm_charts'))
-         .add_str('--custom_key_path', 'custom_key_path', default='', group=('service', 'helm_charts'))
-         .add_str('--custom_certs_host', 'custom certs host', default='', group='helm_charts')
-         # Tmp for jenkins job
-         .add_str('--endpoint_id', 'Endpoint Id',
-                  default='user:tag', group=())
-         )
-        return params.build()
-
-    def check_k8s_cluster_status(self):
-        """ Check for kubernetes status
-
-        Returns:
-            None
-        Raises:
-            TerraformProviderError: if master or kubeDNS is not running
-
-        """
-        start_time = time.time()
-        while True:
-            with Console.ssh(self.ip, self.user_name, self.pkey_path) as c:
-                k8c_info_status = c.run(
-                    'kubectl cluster-info | '
-                    'sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"') \
-                    .stdout
-
-            kubernetes_success_status = 'Kubernetes master is running'
-            kubernetes_dns_success_status = 'KubeDNS is running'
-
-            kubernetes_succeed = kubernetes_success_status in k8c_info_status
-            kube_dns_succeed = kubernetes_dns_success_status in k8c_info_status
-
-            if kubernetes_succeed and kube_dns_succeed:
-                break
-            if (time.time() - start_time) >= 600:
-                raise TimeoutError
-            time.sleep(60)
-
-    def check_tiller_status(self):
-        """ Check tiller status
-
-        Returns:
-            None
-        Raises:
-            TerraformProviderError: if tiller is not running
-
-        """
-        start_time = time.time()
-
-        with Console.ssh(self.ip, self.user_name, self.pkey_path) as c:
-            while True:
-                tiller_status = c.run(
-                    "kubectl get pods --all-namespaces "
-                    "| grep tiller | awk '{print $4}'").stdout
-                tiller_success_status = 'Running'
-                if tiller_success_status in tiller_status:
-                    break
-                if (time.time() - start_time) >= 1200:
-                    raise TimeoutError
-                time.sleep(60)
-
-    def select_master_ip(self):
-        terraform = TerraformProvider(self.no_color)
-        output = terraform.output(self.tf_params,
-                                  '-json ssn_k8s_masters_ip_addresses')
-        ips = json.loads(output)
-        if not ips:
-            raise TerraformProviderError('no ips')
-        self.ip = ips[0]
-
-    def copy_terraform_to_remote(self):
-        logging.info('transfer terraform dir to remote')
-        tf_dir = os.path.abspath(
-            os.path.join(os.getcwd(), os.path.pardir, os.path.pardir))
-        source = os.path.join(tf_dir, 'ssn-helm-charts')
-        remote_dir = '/home/{}/terraform/'.format(self.user_name)
-        with Console.ssh(self.ip, self.user_name, self.pkey_path) as conn:
-            conn.run('mkdir -p {}'.format(remote_dir))
-            rsync(conn, source, remote_dir, strict_host_keys=False)
-
-    def copy_cert(self):
-        logging.info('transfer certificates to remote')
-        cert_path = self.service_args.get('custom_cert_path')
-        key_path = self.service_args.get('custom_key_path')
-        remote_dir = '/tmp/' # .format(self.user_name)
-        with Console.ssh(self.ip, self.user_name, self.pkey_path) as conn:
-            conn.run('mkdir -p {}'.format(remote_dir))
-            rsync(conn, cert_path, remote_dir, strict_host_keys=False)
-            rsync(conn, key_path, remote_dir, strict_host_keys=False)
-
-    def run_remote_terraform(self):
-        logging.info('apply helm charts')
-        args = self.parse_args()
-        # dns_name = json.loads(TerraformProvider(self.no_color)
-        #                       .output(self.tf_params,
-        #                               '-json ssn_k8s_alb_dns_name'))
-        nlb_dns_name = json.loads(TerraformProvider(self.no_color)
-                                  .output(self.tf_params,
-                                          '-json ssn_k8s_nlb_dns_name'))
-        logging.info('apply ssn-helm-charts')
-        terraform_args = args.get('helm_charts')
-        args_str = get_var_args_string(terraform_args)
-        with Console.ssh(self.ip, self.user_name, self.pkey_path) as conn:
-            with conn.cd('terraform/ssn-helm-charts/main'):
-                init = conn.run('terraform init').stdout.lower()
-                validate = conn.run('terraform validate').stdout.lower()
-                if 'success' not in init or 'success' not in validate:
-                    raise TerraformProviderError
-                command = ('terraform apply -auto-approve {} '
-                           '-var \'ssn_k8s_nlb_dns_name={}\''
-                           .format(args_str, nlb_dns_name))
-                logging.info(command)
-                conn.run(command)
-                output = ' '.join(conn.run('terraform output -json')
-                                  .stdout.split())
-                self.fill_args_from_dict(json.loads(output))
-
-    def output_terraform_result(self):
-        # dns_name = json.loads(
-        #     TerraformProvider(self.no_color).output(self.tf_params,
-        #                                             '-json nginx_load_balancer_hostname'))
-        ssn_k8s_sg_id = json.loads(
-            TerraformProvider(self.no_color).output(self.tf_params,
-                                                    '-json ssn_k8s_sg_id'))
-        ssn_subnet = json.loads(
-            TerraformProvider(self.no_color).output(self.tf_params,
-                                                    '-json ssn_subnet_id'))
-        ssn_vpc_id = json.loads(
-            TerraformProvider(self.no_color).output(self.tf_params,
-                                                    '-json ssn_vpc_id'))
-
-        logging.info("""
-        DLab SSN K8S cluster has been deployed successfully!
-        Summary:
-        VPC ID: {}
-        Subnet ID:  {}
-        SG IDs: {}
-        """.format(ssn_vpc_id, ssn_subnet, ssn_k8s_sg_id))
-
-    def fill_args_from_dict(self, output):
-        for key, value in output.items():
-            value = value.get('value')
-            sys.argv.extend(['--' + key, value])
-
-    def fill_remote_terraform_output(self):
-        with Console.ssh(self.ip, self.user_name, self.pkey_path) as conn:
-            with conn.cd('terraform/ssn-helm-charts/main'):
-                output = ' '.join(conn.run('terraform output -json')
-                                  .stdout.split())
-                self.fill_args_from_dict(json.loads(output))
-                output_processor = LocalStorageOutputProcessor(self.tf_output)
-                output = {key: value.get('value')
-                          for key, value in json.loads(output).items()}
-                output_processor.write(output)
-
-    @staticmethod
-    def add_ip_to_known_hosts(ip):
-        attempt = 0
-        while attempt < 10:
-            if len(Console.execute('ssh-keygen -H -F {}'.format(ip))) == 0:
-                Console.execute(
-                    'ssh-keyscan {} >> ~/.ssh/known_hosts'.format(ip))
-                attempt += 1
-            else:
-                break
-
-    def destroy_remote_terraform(self):
-        logging.info('destroy helm charts')
-        with Console.ssh(self.ip, self.user_name, self.pkey_path) as conn:
-            with conn.cd('terraform/ssn-helm-charts/main'):
-                init = conn.run('terraform init').stdout.lower()
-                validate = conn.run('terraform validate').stdout.lower()
-                if 'success' not in init or 'success' not in validate:
-                    raise TerraformProviderError
-                command = 'terraform destroy -auto-approve'
-                logging.info(command)
-                conn.run(command)
-
-    def deploy(self):
-        logging.info('deploy')
-        output = ' '.join(
-            TerraformProvider(self.no_color).output(self.tf_params,
-                                                    '-json').split())
-        self.fill_args_from_dict(json.loads(output))
-        self.select_master_ip()
-        self.add_ip_to_known_hosts(self.ip)
-        self.check_k8s_cluster_status()
-        self.check_tiller_status()
-        self.copy_terraform_to_remote()
-        if self.service_args.get('custom_certs_enabled'):
-            self.copy_cert()
-        self.run_remote_terraform()
-        self.fill_remote_terraform_output()
-        self.output_terraform_result()
-
-    def destroy(self):
-        self.select_master_ip()
-        try:
-            self.destroy_remote_terraform()
-        except:
-            print("Error with destroying helm charts.")
-        super(AWSK8sSourceBuilder, self).destroy()
-        if self.output_dir is not None:
-            shutil.rmtree(self.output_dir)
-        elif os.path.isfile(os.path.join(INITIAL_LOCATION, 'output.json')):
-            os.remove(os.path.join(INITIAL_LOCATION, 'output.json'))
-
-
-class AWSEndpointBuilder(AbstractDeployBuilder):
-
-    def update_extracted_file_data(self, obj):
-        if 'ssn_vpc_id' in obj:
-            obj['vpc_id'] = obj['ssn_vpc_id']
-        if 'ssn_subnet_id' in obj:
-            obj['subnet_id'] = obj['ssn_subnet_id']
-
-    @property
-    def name(self):
-        return 'endpoint'
-
-    @property
-    def use_tf_output_file(self):
-        return True
-
-    @property
-    def terraform_location(self):
-        tf_dir = os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))
-        return os.path.join(tf_dir, 'aws/endpoint/main')
-
-    @property
-    def terraform_args_group_name(self):
-        return 'endpoint'
-
-    def validate_params(self):
-        super(AWSEndpointBuilder, self).validate_params()
-        params = self.parse_args()[self.terraform_args_group_name]
-        if len(params.get('endpoint_id')) > 12:
-            sys.stderr.write('endpoint_id length should be less then 12')
-            sys.exit(1)
-
-    @property
-    def cli_args(self):
-        params = ParamsBuilder()
-        (params
-         .add_bool('--no_color', 'no color console_output', group='service',
-                   default=False)
-         .add_str('--state', 'State file path', group='service')
-         .add_str('--secret_access_key', 'AWS Secret Access Key',
-                  required=True,
-                  group='endpoint')
-         .add_str('--access_key_id', 'AWS Access Key ID', required=True,
-                  group='endpoint')
-         .add_str('--pkey', 'path to key', required=True, group='service')
-         .add_str('--service_base_name',
-                  'Any infrastructure value (should be unique if  multiple '
-                  'SSN\'s have been deployed before). Should be  same as on ssn',
-                  group='endpoint')
-         .add_str('--vpc_id', 'ID of AWS VPC if you already have VPC created.',
-                  group='endpoint')
-         .add_str('--vpc_cidr',
-                  'CIDR for VPC creation. Conflicts with vpc_id.',
-                  default='172.31.0.0/16', group='endpoint')
-         .add_str('--subnet_id',
-                  'ID of Subnet if you already have subnet created.',
-                  group='endpoint')
-         .add_str('--ssn_k8s_sg_id', 'ID of SSN SG.', group='endpoint')
-         .add_str('--subnet_cidr',
-                  'CIDR for Subnet creation. Conflicts with subnet_id.',
-                  default='172.31.0.0/24', group='endpoint')
-         .add_str('--ami', 'ID of AMI.', group='endpoint')
-         .add_str('--key_name', 'Name of EC2 Key pair.', required=True,
-                  group='endpoint')
-         .add_str('--endpoint_id', 'Endpoint id.', required=True,
-                  group='endpoint')
-         .add_str('--region', 'Name of AWS region.', default='us-west-2',
-                  group='endpoint')
-         .add_str('--zone', 'Name of AWS zone.', default='a', group='endpoint')
-         .add_str('--network_type',
-                  'Type of created network (if network is not existed and '
-                  'require creation) for endpoint',
-                  default='public', group='endpoint')
-         .add_str('--endpoint_instance_shape', 'Instance shape of Endpoint.',
-                  default='t2.medium', group='endpoint')
-         .add_int('--endpoint_volume_size', 'Size of root volume in GB.',
-                  default=30, group='endpoint')
-         .add_str('--product', 'Product name.', default='dlab',
-                  group='endpoint')
-         .add_str('--additional_tag', 'Additional tag.',
-                  default='product:dlab', group='endpoint')
-         .add_str('--ldap_host', 'ldap host', required=True,
-                  group='endpoint')
-         .add_str('--ldap_dn', 'ldap dn', required=True,
-                  group='endpoint')
-         .add_str('--ldap_user', 'ldap user', required=True,
-                  group='endpoint')
-         .add_str('--ldap_bind_creds', 'ldap bind creds', required=True,
-                  group='endpoint')
-         .add_str('--ldap_users_group', 'ldap users group', required=True,
-                  group='endpoint')
-         .add_bool('--billing_enable', 'Billing enable', group='endpoint', default=False)
-         .add_str('--mongo_password', 'Mongo database password', group='endpoint')
-         .add_str('--mongo_host', 'Mongo database host', group='endpoint', default='localhost')
-         .add_str('--billing_bucket', 'Billing bucket name', group='endpoint', default='')
-         .add_str('--report_path', 'The path to report folder', group='endpoint', default='')
-         .add_str('--aws_job_enabled', 'Billing format. Available options: true (aws), false(epam)', group='endpoint',
-                  default='false')
-         .add_str('--billing_aws_account_id', 'The ID of ASW linked account', group='endpoint', default='')
-         .add_str('--billing_tag', 'Billing tag', group='endpoint', default='dlab')
-         )
-        return params.build()
-
-    def deploy(self):
-        self.fill_sys_argv_from_file()
-        new_dir = os.path.abspath(
-            os.path.join(os.getcwd(), '../../../bin/deploy'))
-        os.chdir(new_dir)
-        start_deploy()
-
-
-class GCPK8sSourceBuilder(AbstractDeployBuilder):
-
-    # def update_extracted_file_data(self, obj):
-    #     if 'ssn_vpc_id' in obj:
-    #         obj['vpc_id'] = obj['ssn_vpc_id']
-
-    @property
-    def name(self):
-        return 'k8s'
-
-    @property
-    def use_tf_output_file(self):
-        return True
-
-    @property
-    def terraform_location(self):
-        tf_dir = os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))
-        return os.path.join(tf_dir, 'gcp/ssn-gke/main')
-
-    @property
-    def terraform_args_group_name(self):
-        return 'k8s'
-
-    def validate_params(self):
-        super(GCPK8sSourceBuilder, self).validate_params()
-        # params = self.parse_args()[self.terraform_args_group_name]
-        # if len(params.get('endpoint_id')) > 12:
-        #     sys.stderr.write('endpoint_id length should be less then 12')
-        #     sys.exit(1)
-
-    @property
-    def cli_args(self):
-        params = ParamsBuilder()
-        (params
-         .add_bool('--no_color', 'no color console_output', group='service',
-                   default=False)
-         .add_str('--state', 'State file path', group='service')
-         .add_str('--namespace', 'Name of namespace', group='k8s')
-         .add_str('--credentials_file_path', 'Path to creds file', group='k8s', required=True)
-         .add_str('--project_id', 'Project ID', group='k8s', required=True)
-         .add_str('--region', 'Region name', group='k8s', required=True)
-         .add_str('--zone', 'Zone name', group='k8s', required=True)
-         .add_str('--vpc_name', 'VPC name', group='k8s')
-         .add_str('--subnet_name', 'Subnet name', group='k8s')
-         .add_str('--service_base_name', 'Service base name', group='k8s', required=True)
-         .add_str('--subnet_cidr', 'Subnet CIDR', group='k8s')
-         .add_str('--additional_tag', 'Additional tag', group='k8s')
-         .add_str('--ssn_k8s_workers_count', 'Number of workers per zone', group='k8s')
-         .add_str('--gke_cluster_version', 'GKE version', group='k8s')
-         .add_str('--ssn_k8s_workers_shape', 'Workers shape', group='k8s')
-         .add_str('--service_account_iam_roles', 'Array of roles', group='k8s')
-         .add_str('--ssn_k8s_alb_dns_name', 'DNS name', group='k8s')
-         .add_str('--keycloak_user', 'Keycloak user name', group='k8s')
-         .add_str('--mysql_user', 'MySQL user name', group='k8s')
-         .add_str('--mysql_db_name', 'MySQL database name', group='k8s')
-         .add_str('--ldap_usernameAttr', 'LDAP username attr', group='k8s', default='uid')
-         .add_str('--ldap_rdnAttr', 'LDAP rdn attr', group='k8s', default='uid')
-         .add_str('--ldap_uuidAttr', 'LDAP uuid attr', group='k8s', default='uid')
-         .add_str('--ldap_users_group', 'LDAP users group', group='k8s', default='ou=People')
-         .add_str('--ldap_dn', 'LDAP DN', group='k8s', default='dc=example,dc=com')
-         .add_str('--ldap_user', 'LDAP user', group='k8s', default='cn=admin')
-         .add_str('--ldap_bind_creds', 'LDAP user password', group='k8s', required=True)
-         .add_str('--ldap_host', 'LDAP host', group='k8s', required=True)
-         .add_str('--mongo_db_username', 'Mongo user name', group='k8s')
-         .add_str('--mongo_dbname', 'Mongo database name', group='k8s')
-         .add_str('--mongo_image_tag', 'Mongo image tag', group='k8s')
-         .add_str('--mongo_service_port', 'Mongo service port', group='k8s')
-         .add_str('--mongo_node_port', 'Mongo node port', group='k8s')
-         .add_str('--mongo_service_name', 'Mongo service name', group='k8s')
-         .add_str('--env_os', 'Environment Operating system', group='k8s', default='debian')
-         .add_str('--big_query_dataset', 'Big query dataset name for billing', group='k8s', default='test')
-         .add_str('--custom_certs_enabled', 'If custom certs enabled', group='k8s')
-         .add_str('--custom_cert_path', 'Custom cert path', group='k8s')
-         .add_str('--custom_key_path', 'Custom key path', group='k8s')
-         .add_str('--custom_certs_host', 'Custom cert host ', group='k8s')
-         .add_str('--mysql_disk_size', 'MySQL disk size', group='k8s')
-         .add_str('--domain', 'Domain name', group='k8s', required=True)
-         )
-        return params.build()
-
-    def apply(self):
-        terraform = TerraformProvider(self.no_color)
-        gke_params = self.tf_params.copy()
-        helm_charts_params = self.tf_params.copy()
-
-        gke_params['-target'] = 'module.gke_cluster'
-        helm_charts_params['-target'] = 'module.helm_charts'
-
-        terraform.apply(gke_params, self.terraform_args)
-        terraform.apply(helm_charts_params, self.terraform_args)
-
-    def deploy(self):
-        pass
-
-    def destroy(self):
-        terraform = TerraformProvider(self.no_color)
-        gke_params = self.tf_params.copy()
-        helm_charts_params = self.tf_params.copy()
-
-        gke_params['-target'] = 'module.gke_cluster'
-        helm_charts_params['-target'] = 'module.helm_charts'
-
-        terraform.destroy(helm_charts_params, self.terraform_args, True)
-        time.sleep(60)
-        terraform.destroy(gke_params, self.terraform_args)
-
-
-class GCPEndpointBuilder(AbstractDeployBuilder):
-
-    def update_extracted_file_data(self, obj):
-        if 'ssn_vpc_id' in obj:
-            obj['vpc_id'] = obj['ssn_vpc_id']
-
-    @property
-    def name(self):
-        return 'endpoint'
-
-    @property
-    def use_tf_output_file(self):
-        return True
-
-    @property
-    def terraform_location(self):
-        tf_dir = os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))
-        return os.path.join(tf_dir, 'gcp/endpoint/main')
-
-    @property
-    def terraform_args_group_name(self):
-        return 'endpoint'
-
-    def validate_params(self):
-        super(GCPEndpointBuilder, self).validate_params()
-        params = self.parse_args()[self.terraform_args_group_name]
-        if len(params.get('endpoint_id')) > 12:
-            sys.stderr.write('endpoint_id length should be less then 12')
-            sys.exit(1)
-
-    @property
-    def cli_args(self):
-        params = ParamsBuilder()
-        (params
-         .add_bool('--no_color', 'no color console_output', group='service',
-                   default=False)
-         .add_str('--state', 'State file path', group='service')
-         .add_str('--gcp_project_id', 'GCP project ID', required=True, group='endpoint')
-         .add_str('--creds_file', 'Path to crdes file', required=True, group='endpoint')
-         .add_str('--pkey', 'path to key', required=True, group='service')
-         .add_str('--service_base_name', 'Service base name', group='endpoint')
-         .add_str('--vpc_id', 'ID of VPC if you already have VPC created.', group='endpoint')
-         .add_str('--subnet_cidr', 'CIDR for Subnet creation. Conflicts with vpc_id.', default='172.31.0.0/24',
-                  group='endpoint')
-         .add_str('--ssn_subnet', 'ID of AWS Subnet if you already have subnet created.', group='endpoint')
-         .add_str('--subnet_id', 'ID of subnet', group='endpoint')
-         .add_str('--ami', 'ID of EC2 AMI.', group='endpoint')
-         .add_str('--path_to_pub_key', 'Path to public key', required=True, group='endpoint')
-         .add_str('--endpoint_id', 'Endpoint id.', required=True, group='endpoint')
-         .add_str('--region', 'Name of region.', group='endpoint')
-         .add_str('--zone', 'Name of zone.', group='endpoint')
-         .add_str('--endpoint_shape', 'Instance shape of Endpoint.', group='endpoint')
-         .add_str('--endpoint_volume_size', 'Endpoint disk size', group='endpoint')
-         .add_str('--additional_tag', 'Additional tag.', default='product:dlab', group='endpoint')
-         .add_str('--ldap_host', 'ldap host', required=True, group='endpoint')
-         .add_str('--ldap_dn', 'ldap dn', required=True, group='endpoint')
-         .add_str('--ldap_user', 'ldap user', required=True, group='endpoint')
-         .add_str('--ldap_bind_creds', 'ldap bind creds', required=True, group='endpoint')
-         .add_str('--ldap_users_group', 'ldap users group', required=True, group='endpoint')
-         .add_str('--firewall_ing_cidr_range', 'Ingress range', group='endpoint')
-         .add_str('--firewall_eg_cidr_range', 'Egress range', group='endpoint')
-         .add_str('--endpoint_policies', 'Endpoint policies list', group='endpoint')
-         .add_str('--endpoint_roles', 'Endpoint roles list', group='endpoint')
-         .add_str('--bucket_region', 'Bucket region', group='endpoint')
-         .add_bool('--billing_enable', 'Billing enable', group='endpoint', default=False)
-         .add_str('--billing_dataset_name', 'Billing dataset name', group='endpoint')
-         .add_str('--mongo_password', 'Mongo database password', group='endpoint')
-         .add_str('--mongo_host', 'Mongo database host', group='endpoint', default='localhost')
-         )
-        return params.build()
-
-    def deploy(self):
-        self.fill_sys_argv_from_file()
-        new_dir = os.path.abspath(
-            os.path.join(os.getcwd(), '../../../bin/deploy'))
-        os.chdir(new_dir)
-        start_deploy()
-
-
-class AzureEndpointBuilder(AbstractDeployBuilder):
-
-    def update_extracted_file_data(self, obj):
-        if 'ssn_vpc_id' in obj:
-            obj['vpc_id'] = obj['ssn_vpc_id']
-
-    @property
-    def name(self):
-        return 'endpoint'
-
-    @property
-    def use_tf_output_file(self):
-        return True
-
-    @property
-    def terraform_location(self):
-        tf_dir = os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))
-        return os.path.join(tf_dir, 'azure/endpoint/main')
-
-    @property
-    def terraform_args_group_name(self):
-        return 'endpoint'
-
-    def validate_params(self):
-        super(AzureEndpointBuilder, self).validate_params()
-        params = self.parse_args()[self.terraform_args_group_name]
-        if len(params.get('endpoint_id')) > 12:
-            sys.stderr.write('endpoint_id length should be less then 12')
-            sys.exit(1)
-
-    @property
-    def cli_args(self):
-        params = ParamsBuilder()
-        (params
-         .add_bool('--no_color', 'no color console_output', group='service',
-                   default=False)
-         .add_str('--state', 'State file path', group='service')
-         .add_str('--auth_file_path', 'Path to crdes file', required=True, group='endpoint')
-         .add_str('--pkey', 'path to key', required=True, group='service')
-         .add_str('--service_base_name', 'Service base name', group='endpoint')
-         .add_str('--resource_group_name', 'Resource group name', group='endpoint')
-         .add_str('--vpc_id', 'ID of VPC if you already have VPC created.', group='endpoint')
-         .add_str('--vpc_cidr', 'CIDR for VPC creation. Conflicts with vpc_id.', default='172.31.0.0/16',
-                  group='endpoint')
-         .add_str('--subnet_cidr', 'CIDR for Subnet creation. Conflicts with vpc_id.', default='172.31.0.0/24',
-                  group='endpoint')
-         .add_str('--ssn_subnet', 'ID of AWS Subnet if you already have subnet created.', group='endpoint')
-         .add_str('--subnet_id', 'ID of subnet', group='endpoint')
-         .add_str('--ami', 'ID of EC2 AMI.', group='endpoint')
-         .add_str('--key_path', 'Path to public key', required=True, group='endpoint')
-         .add_str('--endpoint_id', 'Endpoint id.', required=True, group='endpoint')
-         .add_str('--region', 'Name of region.', group='endpoint')
-         .add_str('--endpoint_shape', 'Instance shape of Endpoint.', default='Standard_DS2_v2', group='endpoint')
-         .add_str('--endpoint_volume_size', 'Endpoint disk size', default='30', group='endpoint')
-         .add_str('--additional_tag', 'Additional tag.', default='product:dlab', group='endpoint')
-         .add_str('--tenant_id', 'Azure tenant ID', group='endpoint', default='')
-         .add_str('--subscription_id', 'Azure subscription ID', group='endpoint', default='')
-         .add_str('--offer_number', 'Azure offer number', group='endpoint', default='')
-         .add_str('--currency', 'Azure currency for billing', group='endpoint', default='')
-         .add_str('--locale', 'Azure locale', group='endpoint', default='')
-         .add_str('--region_info', 'Azure region info', group='endpoint', default='')
-         .add_str('--mongo_password', 'Mongo database password', group='endpoint')
-         .add_str('--mongo_host', 'Mongo database host', group='endpoint', default='localhost')
-         .add_bool('--billing_enable', 'Billing enable', group='endpoint', default=False)
-         )
-        return params.build()
-
-    def deploy(self):
-        self.fill_sys_argv_from_file()
-        new_dir = os.path.abspath(
-            os.path.join(os.getcwd(), '../../../bin/deploy'))
-        os.chdir(new_dir)
-        start_deploy()
-
-
-class DeployDirector:
-
-    def build(self, action, builder):
-        """ Do build action
-        Args:
-            builder: AbstractDeployBuilder
-        Returns:
-            None
-        """
-        try:
-            builder.provision()
-            if action == 'deploy':
-                builder.apply()
-                builder.store_output_to_file()
-                builder.deploy()
-            if action == 'destroy':
-                builder.destroy()
-
-        except Exception as ex:
-            print(ex)
-
-
-def deploy():
-    actions = {'deploy', 'destroy'}
-
-    sources_targets = {
-        'aws': ['k8s', 'endpoint'],
-        'gcp': ['k8s', 'endpoint'],
-        'azure': ['endpoint']
-    }
-
-    no_args_error = ('usage: ./dlab {} {} {}\n'.format(
-        actions,
-        set(sources_targets.keys()),
-        set(itertools.chain(*sources_targets.values()))))
-    no_source_error = (
-        lambda x: ('usage: ./dlab {} {} {}\n'.format(
-            x,
-            set(sources_targets.keys()),
-            set(itertools.chain(*sources_targets.values())))))
-    no_target_error = (
-        lambda x, y: ('usage: ./dlab {} {} {}\n'.format(
-            x, y, set(itertools.chain(*sources_targets.values())))))
-
-    if len(sys.argv) == 1 or sys.argv[1] not in actions:
-        sys.stderr.write(no_args_error)
-        exit(1)
-    if len(sys.argv) == 2 or sys.argv[2] not in sources_targets:
-        sys.stderr.write(no_source_error(sys.argv[1]))
-        exit(1)
-    if len(sys.argv) == 3 or sys.argv[3] not in sources_targets[sys.argv[2]]:
-        sys.stderr.write(no_target_error(sys.argv[1], sys.argv[2]))
-
-    module, action, source, target = sys.argv[:4]
-    builders_dict = {
-        'aws': {
-            'k8s': AWSK8sSourceBuilder,
-            'endpoint': AWSEndpointBuilder
-        },
-        'gcp': {
-            'k8s': GCPK8sSourceBuilder,
-            'endpoint': GCPEndpointBuilder
-        },
-        'azure': {
-            'endpoint': AzureEndpointBuilder
-        }
-    }
-    builder = builders_dict[source][target]()
-    deploy_director = DeployDirector()
-    deploy_director.build(action, builder)
-
-
-if __name__ == '__main__':
-    deploy()
diff --git a/infrastructure-provisioning/terraform/bin/requirements.txt b/infrastructure-provisioning/terraform/bin/requirements.txt
new file mode 100644
index 0000000..a95fbbc
--- /dev/null
+++ b/infrastructure-provisioning/terraform/bin/requirements.txt
@@ -0,0 +1,23 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+fabric==2.4.0
+patchwork==1.0.1
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/bin/terraform-cli.py b/infrastructure-provisioning/terraform/bin/terraform-cli.py
index f8d593b..70bf8a9 100755
--- a/infrastructure-provisioning/terraform/bin/terraform-cli.py
+++ b/infrastructure-provisioning/terraform/bin/terraform-cli.py
@@ -1,25 +1,21 @@
 #!/usr/bin/env python
 
-# *****************************************************************************
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#    http://www.apache.org/licenses/LICENSE-2.0
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 
 import abc
 import argparse
@@ -388,8 +384,8 @@
                   choices=['debian', 'redhat'], group='k8s')
          .add_str('--key_name', 'Name of EC2 Key pair.', required=True,
                   group='k8s')
-         .add_str('--os_user', 'Name of DLab service user.',
-                  default='dlab-user', group='k8s')
+         .add_str('--os_user', 'Name of DataLab service user.',
+                  default='datalab-user', group='k8s')
          .add_str('--pkey', 'path to key', required=True, group='service')
          .add_str('--region', 'Name of AWS region.', default='us-west-2',
                   group='k8s')
@@ -398,7 +394,7 @@
          .add_str('--service_base_name',
                   'Any infrastructure value (should be unique if '
                   'multiple SSN\'s have been deployed before).',
-                  default='dlab-k8s', group='k8s')
+                  default='datalab-k8s', group='k8s')
          .add_int('--ssn_k8s_masters_count', 'Count of K8S masters.', default=3,
                   group='k8s')
          .add_int('--ssn_k8s_workers_count', 'Count of K8S workers', default=2,
@@ -532,15 +528,14 @@
         terraform_args = args.get('helm_charts')
         args_str = get_args_string(terraform_args)
         with Console.ssh(self.ip, self.user_name, self.pkey_path) as conn:
-            with conn.cd('terraform/ssn-helm-charts/main'):
-                conn.run('terraform init')
-                conn.run('terraform validate')
-                conn.run('terraform apply -auto-approve {} '
+            conn.run('cd terraform/ssn-helm-charts/main && terraform init')
+            conn.run('cd terraform/ssn-helm-charts/main && terraform validate')
+            conn.run('cd terraform/ssn-helm-charts/main && terraform apply -auto-approve {} '
                          '-var \'ssn_k8s_alb_dns_name={}\''
                          .format(args_str, dns_name))
-                output = ' '.join(conn.run('terraform output -json')
+            output = ' '.join(conn.run('terraform output -json')
                                   .stdout.split())
-                self.fill_args_from_dict(json.loads(output))
+            self.fill_args_from_dict(json.loads(output))
 
     def output_terraform_result(self):
         dns_name = json.loads(
@@ -554,14 +549,14 @@
         ssn_vpc_id = json.loads(TerraformProvider().output('-json ssn_vpc_id'))
 
         logging.info("""
-        DLab SSN K8S cluster has been deployed successfully!
+        DataLab SSN K8S cluster has been deployed successfully!
         Summary:
         DNS name: {}
         Bucket name: {}
         VPC ID: {}
         Subnet IDs:  {}
         SG IDs: {}
-        DLab UI URL: http://{}
+        DataLab UI URL: http://{}
         """.format(dns_name, ssn_bucket_name, ssn_vpc_id,
                    ', '.join(ssn_subnets), ssn_k8s_sg_id, dns_name))
 
diff --git a/infrastructure-provisioning/terraform/gcp/endpoint/daemon.json b/infrastructure-provisioning/terraform/gcp/endpoint/daemon.json
new file mode 100644
index 0000000..ed640d5
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/endpoint/daemon.json
@@ -0,0 +1,4 @@
+{
+  DNS_IP_RESOLVE
+  "insecure-registries": ["REPOSITORY"]
+}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/endpoint/main/variables.tf b/infrastructure-provisioning/terraform/gcp/endpoint/main/variables.tf
index b1d89ba..aa42396 100644
--- a/infrastructure-provisioning/terraform/gcp/endpoint/main/variables.tf
+++ b/infrastructure-provisioning/terraform/gcp/endpoint/main/variables.tf
@@ -113,7 +113,10 @@
     "compute.projects.setCommonInstanceMetadata",
     "compute.projects.setDefaultServiceAccount",
     "compute.subnetworks.create",
-    "compute.subnetworks.delete"
+    "compute.subnetworks.delete",
+    "compute.routes.create",
+    "compute.routes.delete",
+    "compute.routes.get"
   ]
 }
 
@@ -137,11 +140,11 @@
 }
 
 variable "product" {
-  default = "dlab"
+  default = "datalab"
 }
 
 variable "additional_tag" {
-  default = "product:dlab"
+  default = "product:datalab"
 }
 
 variable "ldap_host" {}
diff --git a/infrastructure-provisioning/terraform/gcp/endpoint/provisioning.py b/infrastructure-provisioning/terraform/gcp/endpoint/provisioning.py
index ac36747..ed83bb6 100644
--- a/infrastructure-provisioning/terraform/gcp/endpoint/provisioning.py
+++ b/infrastructure-provisioning/terraform/gcp/endpoint/provisioning.py
@@ -1,23 +1,19 @@
-# *****************************************************************************
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#    http://www.apache.org/licenses/LICENSE-2.0
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 
 import argparse
 import logging
@@ -26,6 +22,7 @@
 import traceback
 from fabric import Connection
 from patchwork.files import exists
+from patchwork import files
 
 conn = None
 args = None
@@ -83,13 +80,13 @@
 
 
 def ensure_logs_endpoint():
-    log_root_dir = "/var/opt/dlab/log"
+    log_root_dir = "/var/opt/datalab/log"
     supervisor_log_file = "/var/log/application/provision-service.log"
     try:
         if not exists(conn, '/home/' + args.os_user + '/.ensure_dir/logs_ensured'):
-            if not exists(conn, args.dlab_path):
-                conn.sudo("mkdir -p " + args.dlab_path)
-                conn.sudo("chown -R " + args.os_user + ' ' + args.dlab_path)
+            if not exists(conn, args.datalab_path):
+                conn.sudo("mkdir -p " + args.datalab_path)
+                conn.sudo("chown -R " + args.os_user + ' ' + args.datalab_path)
             if not exists(conn, log_root_dir):
                 conn.sudo('mkdir -p ' + log_root_dir + '/provisioning')
                 conn.sudo('touch ' + log_root_dir + '/provisioning/provisioning.log')
@@ -99,7 +96,7 @@
             conn.sudo("chown -R {0} {1}".format(args.os_user, log_root_dir))
             conn.sudo('touch /home/' + args.os_user + '/.ensure_dir/logs_ensured')
     except Exception as err:
-        print('Failed to configure logs and dlab directory: ', str(err))
+        print('Failed to configure logs and DataLab directory: ', str(err))
         traceback.print_exc()
         sys.exit(1)
 
@@ -144,14 +141,14 @@
             conn.sudo('apt-cache policy docker-ce')
             conn.sudo('apt-get install -y docker-ce={}'
                       .format(args.docker_version))
-            if not exists(conn, '{}/tmp'.format(args.dlab_path)):
-                conn.run('mkdir -p {}/tmp'.format(args.dlab_path))
+            if not exists(conn, '{}/tmp'.format(args.datalab_path)):
+                conn.run('mkdir -p {}/tmp'.format(args.datalab_path))
             conn.put('./daemon.json',
-                     '{}/tmp/daemon.json'.format(args.dlab_path))
+                     '{}/tmp/daemon.json'.format(args.datalab_path))
             conn.sudo('sed -i "s|REPOSITORY|{}:{}|g" {}/tmp/daemon.json'
                       .format(args.repository_address,
                               args.repository_port,
-                              args.dlab_path))
+                              args.datalab_path))
             if args.cloud_provider == "aws":
                 dns_ip_resolve = (conn.run("systemd-resolve --status "
                                            "| grep -A 5 'Current Scopes: DNS' "
@@ -159,13 +156,13 @@
                                            "| awk '{print $3}'")
                                   .stdout.rstrip("\n\r"))
                 conn.sudo('sed -i "s|DNS_IP_RESOLVE|\"dns\": [{0}],|g" {1}/tmp/daemon.json'
-                          .format(dns_ip_resolve, args.dlab_path))
+                          .format(dns_ip_resolve, args.datalab_path))
             elif args.cloud_provider == "gcp":
                 dns_ip_resolve = ""
                 conn.sudo('sed -i "s|DNS_IP_RESOLVE||g" {1}/tmp/daemon.json'
-                          .format(dns_ip_resolve, args.dlab_path))
+                          .format(dns_ip_resolve, args.datalab_path))
             conn.sudo('mv {}/tmp/daemon.json /etc/docker'
-                      .format(args.dlab_path))
+                      .format(args.datalab_path))
             conn.sudo('usermod -a -G docker ' + args.os_user)
             conn.sudo('update-rc.d docker defaults')
             conn.sudo('update-rc.d docker enable')
@@ -194,30 +191,30 @@
         if args.cloud_provider == "aws":
             conn.sudo('apt-get install -y awscli')
             if not exists(conn, '/home/' + args.os_user + '/keys/endpoint.keystore.jks'):
-                conn.sudo('aws s3 cp s3://{0}/dlab/certs/endpoint/endpoint.keystore.jks '
+                conn.sudo('aws s3 cp s3://{0}/datalab/certs/endpoint/endpoint.keystore.jks '
                           '/home/{1}/keys/endpoint.keystore.jks'
                           .format(args.ssn_bucket_name, args.os_user))
-            if not exists(conn, '/home/' + args.os_user + '/keys/dlab.crt'):
-                conn.sudo('aws s3 cp s3://{0}/dlab/certs/endpoint/endpoint.crt'
+            if not exists(conn, '/home/' + args.os_user + '/keys/datalab.crt'):
+                conn.sudo('aws s3 cp s3://{0}/datalab/certs/endpoint/endpoint.crt'
                           ' /home/{1}/keys/endpoint.crt'.format(args.ssn_bucket_name, args.os_user))
         #     if not exists(conn, '/home/' + args.os_user + '/keys/ssn.crt'):
         #         conn.sudo('aws s3 cp '
-        #                   's3://{0}/dlab/certs/ssn/ssn.crt /home/{1}/keys/ssn.crt'
+        #                   's3://{0}/datalab/certs/ssn/ssn.crt /home/{1}/keys/ssn.crt'
         #                   .format(args.ssn_bucket_name, args.os_user))
         elif args.cloud_provider == "gcp":
             if not exists(conn, '/home/' + args.os_user + '/keys/endpoint.keystore.jks'):
-                conn.sudo('gsutil -m cp -r gs://{0}/dlab/certs/endpoint/endpoint.keystore.jks '
+                conn.sudo('gsutil -m cp -r gs://{0}/datalab/certs/endpoint/endpoint.keystore.jks '
                           '/home/{1}/keys/'
                           .format(args.ssn_bucket_name, args.os_user))
-            if not exists(conn, '/home/' + args.os_user + '/keys/dlab.crt'):
-                conn.sudo('gsutil -m cp -r gs://{0}/dlab/certs/endpoint/endpoint.crt'
+            if not exists(conn, '/home/' + args.os_user + '/keys/datalab.crt'):
+                conn.sudo('gsutil -m cp -r gs://{0}/datalab/certs/endpoint/endpoint.crt'
                           ' /home/{1}/keys/'.format(args.ssn_bucket_name, args.os_user))
         #     if not exists(conn, '/home/' + args.os_user + '/keys/ssn.crt'):
         #         conn.sudo('gsutil -m cp -r '
-        #                   'gs://{0}/dlab/certs/ssn/ssn.crt /home/{1}/keys/'
+        #                   'gs://{0}/datalab/certs/ssn/ssn.crt /home/{1}/keys/'
         #                   .format(args.ssn_bucket_name, args.os_user))
         if not exists(conn, '/home/' + args.os_user + '/.ensure_dir/cert_imported'):
-            conn.sudo('keytool -importcert -trustcacerts -alias dlab -file /home/{0}/keys/endpoint.crt -noprompt \
+            conn.sudo('keytool -importcert -trustcacerts -alias datalab -file /home/{0}/keys/endpoint.crt -noprompt \
                  -storepass changeit -keystore {1}/lib/security/cacerts'.format(os_user, java_home))
         #     conn.sudo('keytool -importcert -trustcacerts -file /home/{0}/keys/ssn.crt -noprompt \
         #          -storepass changeit -keystore {1}/lib/security/cacerts'.format(os_user, java_home))
@@ -234,100 +231,100 @@
         if not exists(conn,
                       '/home/{}/.ensure_dir/configure_supervisor_ensured'.format(args.os_user)):
             supervisor_conf = '/etc/supervisor/conf.d/supervisor_svc.conf'
-            if not exists(conn, '{}/tmp'.format(args.dlab_path)):
-                conn.run('mkdir -p {}/tmp'.format(args.dlab_path))
+            if not exists(conn, '{}/tmp'.format(args.datalab_path)):
+                conn.run('mkdir -p {}/tmp'.format(args.datalab_path))
             conn.put('./supervisor_svc.conf',
-                     '{}/tmp/supervisor_svc.conf'.format(args.dlab_path))
-            dlab_conf_dir = '{}/conf/'.format(args.dlab_path)
-            if not exists(conn, dlab_conf_dir):
-                conn.run('mkdir -p {}'.format(dlab_conf_dir))
-            web_path = '{}/webapp'.format(args.dlab_path)
+                     '{}/tmp/supervisor_svc.conf'.format(args.datalab_path))
+            datalab_conf_dir = '{}/conf/'.format(args.datalab_path)
+            if not exists(conn, datalab_conf_dir):
+                conn.run('mkdir -p {}'.format(datalab_conf_dir))
+            web_path = '{}/webapp'.format(args.datalab_path)
             if not exists(conn, web_path):
                 conn.run('mkdir -p {}'.format(web_path))
             conn.sudo('sed -i "s|OS_USR|{}|g" {}/tmp/supervisor_svc.conf'
-                      .format(args.os_user, args.dlab_path))
+                      .format(args.os_user, args.datalab_path))
             conn.sudo('sed -i "s|WEB_CONF|{}|g" {}/tmp/supervisor_svc.conf'
-                      .format(dlab_conf_dir, args.dlab_path))
+                      .format(datalab_conf_dir, args.datalab_path))
             conn.sudo('sed -i \'s=WEB_APP_DIR={}=\' {}/tmp/supervisor_svc.conf'
-                      .format(web_path, args.dlab_path))
+                      .format(web_path, args.datalab_path))
             conn.sudo('cp {}/tmp/supervisor_svc.conf {}'
-                      .format(args.dlab_path, supervisor_conf))
+                      .format(args.datalab_path, supervisor_conf))
             conn.put('./provisioning.yml', '{}provisioning.yml'
-                     .format(dlab_conf_dir))
+                     .format(datalab_conf_dir))
             conn.sudo('sed -i "s|KEYNAME|{}|g" {}provisioning.yml'
-                      .format(args.key_name, dlab_conf_dir))
+                      .format(args.key_name, datalab_conf_dir))
             conn.sudo('sed -i "s|KEYSTORE_PASSWORD|{}|g" {}provisioning.yml'
-                      .format(args.endpoint_keystore_password, dlab_conf_dir))
+                      .format(args.endpoint_keystore_password, datalab_conf_dir))
             conn.sudo('sed -i "s|JRE_HOME|{}|g" {}provisioning.yml'
-                      .format(java_home, dlab_conf_dir))
+                      .format(java_home, datalab_conf_dir))
             conn.sudo('sed -i "s|CLOUD_PROVIDER|{}|g" {}provisioning.yml'
-                      .format(args.cloud_provider, dlab_conf_dir))
+                      .format(args.cloud_provider, datalab_conf_dir))
 
             conn.sudo('sed -i "s|MONGO_HOST|{}|g" {}provisioning.yml'
-                      .format(args.mongo_host, dlab_conf_dir))
+                      .format(args.mongo_host, datalab_conf_dir))
             conn.sudo('sed -i "s|MONGO_PORT|{}|g" {}provisioning.yml'
-                      .format(args.mongo_port, dlab_conf_dir))
+                      .format(args.mongo_port, datalab_conf_dir))
             conn.sudo('sed -i "s|SS_HOST|{}|g" {}provisioning.yml'
-                      .format(args.ss_host, dlab_conf_dir))
+                      .format(args.ss_host, datalab_conf_dir))
             conn.sudo('sed -i "s|SS_PORT|{}|g" {}provisioning.yml'
-                      .format(args.ss_port, dlab_conf_dir))
+                      .format(args.ss_port, datalab_conf_dir))
             conn.sudo('sed -i "s|KEYCLOACK_HOST|{}|g" {}provisioning.yml'
-                      .format(args.keycloack_host, dlab_conf_dir))
+                      .format(args.keycloack_host, datalab_conf_dir))
 
             conn.sudo('sed -i "s|CLIENT_SECRET|{}|g" {}provisioning.yml'
-                      .format(args.keycloak_client_secret, dlab_conf_dir))
+                      .format(args.keycloak_client_secret, datalab_conf_dir))
             # conn.sudo('sed -i "s|MONGO_PASSWORD|{}|g" {}provisioning.yml'
-            #           .format(args.mongo_password, dlab_conf_dir))
+            #           .format(args.mongo_password, datalab_conf_dir))
             conn.sudo('sed -i "s|CONF_OS|{}|g" {}provisioning.yml'
-                      .format(args.conf_os, dlab_conf_dir))
+                      .format(args.conf_os, datalab_conf_dir))
             conn.sudo('sed -i "s|SERVICE_BASE_NAME|{}|g" {}provisioning.yml'
-                      .format(args.service_base_name, dlab_conf_dir))
+                      .format(args.service_base_name, datalab_conf_dir))
             conn.sudo('sed -i "s|EDGE_INSTANCE_SIZE|{}|g" {}provisioning.yml'
-                      .format(args.edge_instence_size, dlab_conf_dir))
+                      .format(args.edge_instence_size, datalab_conf_dir))
             conn.sudo('sed -i "s|SUBNET_ID|{}|g" {}provisioning.yml'
-                      .format(args.subnet_id, dlab_conf_dir))
+                      .format(args.subnet_id, datalab_conf_dir))
             conn.sudo('sed -i "s|REGION|{}|g" {}provisioning.yml'
-                      .format(args.region, dlab_conf_dir))
+                      .format(args.region, datalab_conf_dir))
             conn.sudo('sed -i "s|ZONE|{}|g" {}provisioning.yml'
-                      .format(args.zone, dlab_conf_dir))
+                      .format(args.zone, datalab_conf_dir))
             conn.sudo('sed -i "s|TAG_RESOURCE_ID|{}|g" {}provisioning.yml'
-                      .format(args.tag_resource_id, dlab_conf_dir))
+                      .format(args.tag_resource_id, datalab_conf_dir))
             conn.sudo('sed -i "s|SG_IDS|{}|g" {}provisioning.yml'
-                      .format(args.sg_ids, dlab_conf_dir))
+                      .format(args.sg_ids, datalab_conf_dir))
             conn.sudo('sed -i "s|SSN_INSTANCE_SIZE|{}|g" {}provisioning.yml'
-                      .format(args.ssn_instance_size, dlab_conf_dir))
+                      .format(args.ssn_instance_size, datalab_conf_dir))
             conn.sudo('sed -i "s|VPC2_ID|{}|g" {}provisioning.yml'
-                      .format(args.vpc2_id, dlab_conf_dir))
+                      .format(args.vpc2_id, datalab_conf_dir))
             conn.sudo('sed -i "s|SUBNET2_ID|{}|g" {}provisioning.yml'
-                      .format(args.subnet2_id, dlab_conf_dir))
+                      .format(args.subnet2_id, datalab_conf_dir))
             conn.sudo('sed -i "s|CONF_KEY_DIR|{}|g" {}provisioning.yml'
-                      .format(args.conf_key_dir, dlab_conf_dir))
+                      .format(args.conf_key_dir, datalab_conf_dir))
             conn.sudo('sed -i "s|VPC_ID|{}|g" {}provisioning.yml'
-                      .format(args.vpc_id, dlab_conf_dir))
+                      .format(args.vpc_id, datalab_conf_dir))
             conn.sudo('sed -i "s|PEERING_ID|{}|g" {}provisioning.yml'
-                      .format(args.peering_id, dlab_conf_dir))
+                      .format(args.peering_id, datalab_conf_dir))
             conn.sudo('sed -i "s|AZURE_RESOURCE_GROUP_NAME|{}|g" {}provisioning.yml'
-                      .format(args.azure_resource_group_name, dlab_conf_dir))
+                      .format(args.azure_resource_group_name, datalab_conf_dir))
             conn.sudo('sed -i "s|AZURE_SSN_STORAGE_ACCOUNT_TAG|{}|g" {}provisioning.yml'
-                      .format(args.azure_ssn_storage_account_tag, dlab_conf_dir))
+                      .format(args.azure_ssn_storage_account_tag, datalab_conf_dir))
             conn.sudo('sed -i "s|AZURE_SHARED_STORAGE_ACCOUNT_TAG|{}|g" {}provisioning.yml'
-                      .format(args.azure_shared_storage_account_tag, dlab_conf_dir))
+                      .format(args.azure_shared_storage_account_tag, datalab_conf_dir))
             conn.sudo('sed -i "s|AZURE_DATALAKE_TAG|{}|g" {}provisioning.yml'
-                      .format(args.azure_datalake_tag, dlab_conf_dir))
+                      .format(args.azure_datalake_tag, datalab_conf_dir))
             conn.sudo('sed -i "s|AZURE_CLIENT_ID|{}|g" {}provisioning.yml'
-                      .format(args.azure_client_id, dlab_conf_dir))
+                      .format(args.azure_client_id, datalab_conf_dir))
             conn.sudo('sed -i "s|GCP_PROJECT_ID|{}|g" {}provisioning.yml'
-                      .format(args.gcp_project_id, dlab_conf_dir))
+                      .format(args.gcp_project_id, datalab_conf_dir))
             conn.sudo('sed -i "s|LDAP_HOST|{}|g" {}provisioning.yml'
-                      .format(args.ldap_host, dlab_conf_dir))
+                      .format(args.ldap_host, datalab_conf_dir))
             conn.sudo('sed -i "s|LDAP_DN|{}|g" {}provisioning.yml'
-                      .format(args.ldap_dn, dlab_conf_dir))
+                      .format(args.ldap_dn, datalab_conf_dir))
             conn.sudo('sed -i "s|LDAP_OU|{}|g" {}provisioning.yml'
-                      .format(args.ldap_ou, dlab_conf_dir))
+                      .format(args.ldap_ou, datalab_conf_dir))
             conn.sudo('sed -i "s|LDAP_USER_NAME|{}|g" {}provisioning.yml'
-                      .format(args.ldap_user_name, dlab_conf_dir))
+                      .format(args.ldap_user_name, datalab_conf_dir))
             conn.sudo('sed -i "s|LDAP_USER_PASSWORD|{}|g" {}provisioning.yml'
-                      .format(args.ldap_user_password, dlab_conf_dir))
+                      .format(args.ldap_user_password, datalab_conf_dir))
             conn.sudo('touch /home/{}/.ensure_dir/configure_supervisor_ensured'
                       .format(args.os_user))
     except Exception as err:
@@ -341,21 +338,23 @@
         ensure_file = ('/home/{}/.ensure_dir/backend_jar_ensured'
                        .format(args.os_user))
         if not exists(conn, ensure_file):
-            web_path = '{}/webapp'.format(args.dlab_path)
+            web_path = '{}/webapp'.format(args.datalab_path)
             if not exists(conn, web_path):
                 conn.run('mkdir -p {}'.format(web_path))
             if args.cloud_provider == "aws":
-                conn.run('wget -P {}  --user={} --password={} '
+                if 'Failed' in conn.run('wget -P {}  --user={} --password={} '
                          'https://{}/repository/packages/aws/provisioning-service-'
-                         '2.1.jar --no-check-certificate'
+                         '2.1.jar --no-check-certificate 2>&1 | tee /tmp/tee.tmp; if grep -w -i -E  "ERROR|Failed" /tmp/tee.tmp; then echo -e "==============\nFailed jar download.\n=============="; fi'
                          .format(web_path, args.repository_user,
-                                 args.repository_pass, args.repository_address))
+                                 args.repository_pass, args.repository_address)).stdout:
+                    sys.exit(1)
             elif args.cloud_provider == "gcp":
-                conn.run('wget -P {}  --user={} --password={} '
+                if 'Failed' in conn.run('wget -P {}  --user={} --password={} '
                          'https://{}/repository/packages/gcp/provisioning-service-'
-                         '2.1.jar --no-check-certificate'
+                         '2.1.jar --no-check-certificate 2>&1 | tee /tmp/tee.tmp; if grep -w -i -E  "ERROR|Failed" /tmp/tee.tmp; then echo -e "==============\nFailed jar download.\n=============="; fi'
                          .format(web_path, args.repository_user,
-                                 args.repository_pass, args.repository_address))
+                                 args.repository_pass, args.repository_address)).stdout:
+                    sys.exit(1)
             conn.run('mv {0}/*.jar {0}/provisioning-service.jar'
                      .format(web_path))
             conn.sudo('touch {}'.format(ensure_file))
@@ -376,9 +375,9 @@
 
 def get_sources():
     try:
-        conn.run("git clone https://github.com/apache/incubator-dlab.git {0}/sources".format(args.dlab_path))
+        conn.run("git clone https://github.com/apache/incubator-datalab.git {0}/sources".format(args.datalab_path))
         if args.branch_name != "":
-            conn.run("cd {0}/sources && git checkout {1} && cd".format(args.dlab_path, args.branch_name))
+            conn.run("cd {0}/sources && git checkout {1} && cd".format(args.datalab_path, args.branch_name))
     except Exception as err:
         logging.error('Failed to download sources: ', str(err))
         traceback.print_exc()
@@ -390,81 +389,81 @@
         ensure_file = ('/home/{}/.ensure_dir/docker_images_pulled'
                        .format(args.os_user))
         if not exists(conn, ensure_file):
-            conn.sudo('docker login -u {} -p {} {}:{}'
+            conn.sudo('docker login -u {} -p {} {}:{} 2>&1 | tee /tmp/tee.tmp; if grep -w -i -E  "ERROR" /tmp/tee.tmp; then echo -e "==============\nFailed docker login.\n=============="; fi'
                       .format(args.repository_user,
                               args.repository_pass,
                               args.repository_address,
                               args.repository_port))
-            conn.sudo('docker pull {}:{}/docker.dlab-base-{}'
+            conn.sudo('docker pull {}:{}/docker.datalab-base-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker pull {}:{}/docker.dlab-edge-{}'
+            conn.sudo('docker pull {}:{}/docker.datalab-edge-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker pull {}:{}/docker.dlab-project-{}'
+            conn.sudo('docker pull {}:{}/docker.datalab-project-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker pull {}:{}/docker.dlab-jupyter-{}'
+            conn.sudo('docker pull {}:{}/docker.datalab-jupyter-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker pull {}:{}/docker.dlab-rstudio-{}'
+            conn.sudo('docker pull {}:{}/docker.datalab-rstudio-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker pull {}:{}/docker.dlab-zeppelin-{}'
+            conn.sudo('docker pull {}:{}/docker.datalab-zeppelin-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker pull {}:{}/docker.dlab-tensor-{}'
+            conn.sudo('docker pull {}:{}/docker.datalab-tensor-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker pull {}:{}/docker.dlab-tensor-rstudio-{}'
+            conn.sudo('docker pull {}:{}/docker.datalab-tensor-rstudio-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker pull {}:{}/docker.dlab-deeplearning-{}'
+            conn.sudo('docker pull {}:{}/docker.datalab-deeplearning-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker pull {}:{}/docker.dlab-dataengine-service-{}'
+            conn.sudo('docker pull {}:{}/docker.datalab-dataengine-service-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker pull {}:{}/docker.dlab-dataengine-{}'
+            conn.sudo('docker pull {}:{}/docker.datalab-dataengine-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker tag {}:{}/docker.dlab-base-{} docker.dlab-base'
+            conn.sudo('docker tag {}:{}/docker.datalab-base-{} docker.datalab-base'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker tag {}:{}/docker.dlab-edge-{} docker.dlab-edge'
+            conn.sudo('docker tag {}:{}/docker.datalab-edge-{} docker.datalab-edge'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker tag {}:{}/docker.dlab-project-{} docker.dlab-project'
+            conn.sudo('docker tag {}:{}/docker.datalab-project-{} docker.datalab-project'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker tag {}:{}/docker.dlab-jupyter-{} docker.dlab-jupyter'
+            conn.sudo('docker tag {}:{}/docker.datalab-jupyter-{} docker.datalab-jupyter'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker tag {}:{}/docker.dlab-rstudio-{} docker.dlab-rstudio'
+            conn.sudo('docker tag {}:{}/docker.datalab-rstudio-{} docker.datalab-rstudio'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker tag {}:{}/docker.dlab-zeppelin-{} '
-                      'docker.dlab-zeppelin'
+            conn.sudo('docker tag {}:{}/docker.datalab-zeppelin-{} '
+                      'docker.datalab-zeppelin'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker tag {}:{}/docker.dlab-tensor-{} docker.dlab-tensor'
+            conn.sudo('docker tag {}:{}/docker.datalab-tensor-{} docker.datalab-tensor'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker tag {}:{}/docker.dlab-tensor-rstudio-{} '
-                      'docker.dlab-tensor-rstudio'
+            conn.sudo('docker tag {}:{}/docker.datalab-tensor-rstudio-{} '
+                      'docker.datalab-tensor-rstudio'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker tag {}:{}/docker.dlab-deeplearning-{} '
-                      'docker.dlab-deeplearning'
+            conn.sudo('docker tag {}:{}/docker.datalab-deeplearning-{} '
+                      'docker.datalab-deeplearning'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker tag {}:{}/docker.dlab-dataengine-service-{} '
-                      'docker.dlab-dataengine-service'
+            conn.sudo('docker tag {}:{}/docker.datalab-dataengine-service-{} '
+                      'docker.datalab-dataengine-service'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker tag {}:{}/docker.dlab-dataengine-{} '
-                      'docker.dlab-dataengine'
+            conn.sudo('docker tag {}:{}/docker.datalab-dataengine-{} '
+                      'docker.datalab-dataengine'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker rmi {}:{}/docker.dlab-base-{}'
+            conn.sudo('docker rmi {}:{}/docker.datalab-base-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker rmi {}:{}/docker.dlab-edge-{}'
+            conn.sudo('docker rmi {}:{}/docker.datalab-edge-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker rmi {}:{}/docker.dlab-project-{}'
+            conn.sudo('docker rmi {}:{}/docker.datalab-project-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker rmi {}:{}/docker.dlab-jupyter-{}'
+            conn.sudo('docker rmi {}:{}/docker.datalab-jupyter-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker rmi {}:{}/docker.dlab-rstudio-{}'
+            conn.sudo('docker rmi {}:{}/docker.datalab-rstudio-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker rmi {}:{}/docker.dlab-zeppelin-{}'
+            conn.sudo('docker rmi {}:{}/docker.datalab-zeppelin-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker rmi {}:{}/docker.dlab-tensor-{}'
+            conn.sudo('docker rmi {}:{}/docker.datalab-tensor-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker rmi {}:{}/docker.dlab-tensor-rstudio-{}'
+            conn.sudo('docker rmi {}:{}/docker.datalab-tensor-rstudio-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker rmi {}:{}/docker.dlab-deeplearning-{}'
+            conn.sudo('docker rmi {}:{}/docker.datalab-deeplearning-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker rmi {}:{}/docker.dlab-dataengine-service-{}'
+            conn.sudo('docker rmi {}:{}/docker.datalab-dataengine-service-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
-            conn.sudo('docker rmi {}:{}/docker.dlab-dataengine-{}'
+            conn.sudo('docker rmi {}:{}/docker.datalab-dataengine-{}'
                       .format(args.repository_address, args.repository_port, args.cloud_provider))
             conn.sudo('chown -R {0}:docker /home/{0}/.docker/'
                       .format(args.os_user))
@@ -478,12 +477,12 @@
 def init_args():
     global args
     parser = argparse.ArgumentParser()
-    parser.add_argument('--dlab_path', type=str, default='/opt/dlab')
+    parser.add_argument('--datalab_path', type=str, default='/opt/datalab')
     parser.add_argument('--key_name', type=str, default='', help='Name of admin key without .pem extension')
     parser.add_argument('--endpoint_eip_address', type=str)
     parser.add_argument('--pkey', type=str, default='')
     parser.add_argument('--hostname', type=str, default='')
-    parser.add_argument('--os_user', type=str, default='dlab-user')
+    parser.add_argument('--os_user', type=str, default='datalab-user')
     parser.add_argument('--cloud_provider', type=str, default='')
 
     parser.add_argument('--mongo_host', type=str, default='MONGO_HOST')
@@ -498,7 +497,7 @@
     parser.add_argument('--repository_user', type=str, default='')
     parser.add_argument('--repository_pass', type=str, default='')
     parser.add_argument('--docker_version', type=str,
-                        default='18.06.3~ce~3-0~ubuntu')
+                        default='5:20.10.2~3-0~ubuntu-focal')
     parser.add_argument('--ssn_bucket_name', type=str, default='')
     parser.add_argument('--endpoint_keystore_password', type=str, default='')
     parser.add_argument('--keycloak_client_secret', type=str, default='')
@@ -537,8 +536,8 @@
     conn.sudo('apt-get update')
 
 
-def init_dlab_connection(ip=None, user=None,
-                         pkey=None):
+def init_datalab_connection(ip=None, user=None,
+                            pkey=None):
     global conn
     if not ip:
         ip = args.hostname
@@ -549,7 +548,7 @@
     try:
         conn = Connection(ip, user, connect_kwargs={'key_filename': pkey})
     except Exception as err:
-        logging.error('Failed connect as dlab-user: ', str(err))
+        logging.error('Failed connect as datalab-user: ', str(err))
         traceback.print_exc()
         sys.exit(1)
 
@@ -577,10 +576,10 @@
     time.sleep(40)
 
     print(args)
-    logging.info("Creating dlab-user")
+    logging.info("Creating datalab-user")
     create_user()
 
-    init_dlab_connection()
+    init_datalab_connection()
     update_system()
 
     logging.info("Configuring ensure dir")
diff --git a/infrastructure-provisioning/terraform/gcp/endpoint/provisioning.yml b/infrastructure-provisioning/terraform/gcp/endpoint/provisioning.yml
index 6edb057..2353e2f 100644
--- a/infrastructure-provisioning/terraform/gcp/endpoint/provisioning.yml
+++ b/infrastructure-provisioning/terraform/gcp/endpoint/provisioning.yml
@@ -19,7 +19,7 @@
 #
 # ******************************************************************************
 
-<#assign LOG_ROOT_DIR="/var/opt/dlab/log">
+<#assign LOG_ROOT_DIR="/var/opt/datalab/log">
 <#assign KEYS_DIR="/home/${sys['user.name']}/keys">
 <#assign KEY_STORE_PATH="${KEYS_DIR}/endpoint.keystore.jks">
 <#assign KEY_STORE_PASSWORD="KEYSTORE_PASSWORD">
@@ -40,7 +40,7 @@
   port: MONGO_PORT
   username: admin
   password: MONGO_PASSWORD
-  database: dlabdb
+  database: datalabdb
 
 selfService:
   protocol: https
@@ -70,21 +70,21 @@
 # Log out user on inactivity
 inactiveUserTimeoutMillSec: 7200000
 
-backupScriptPath: /opt/dlab/tmp/backup.py
-backupDirectory: /opt/dlab/tmp/result
+backupScriptPath: /opt/datalab/tmp/backup.py
+backupDirectory: /opt/datalab/tmp/result
 keyDirectory: ${KEYS_DIR}
-responseDirectory: /opt/dlab/tmp
-handlerDirectory: /opt/dlab/handlers
+responseDirectory: /opt/datalab/tmp
+handlerDirectory: /opt/datalab/handlers
 dockerLogDirectory: ${LOG_ROOT_DIR}
 warmupPollTimeout: 2m
-resourceStatusPollTimeout: 300m
+resourceStatusPollTimeout: 400m
 keyLoaderPollTimeout: 30m
 requestEnvStatusTimeout: 50s
 adminKey: KEYNAME
-edgeImage: docker.dlab-edge
+edgeImage: docker.datalab-edge
 fileLengthCheckDelay: 500ms
 
-<#if CLOUD_TYPE == "aws">
+  <#if CLOUD_TYPE == "aws">
 emrEC2RoleDefault: EMR_EC2_DefaultRole
 emrServiceRoleDefault: EMR_DefaultRole
 </#if>
@@ -107,7 +107,7 @@
 #    - type: http
     - type: https
       port: 8084
-      certAlias: dlab
+      certAlias: datalab
       validateCerts: true
       keyStorePath: ${KEY_STORE_PATH}
       keyStorePassword: ${KEY_STORE_PASSWORD}
@@ -117,7 +117,7 @@
 #    - type: http
     - type: https
       port: 8085
-      certAlias: dlab
+      certAlias: datalab
       validateCerts: true
       keyStorePath: ${KEY_STORE_PATH}
       keyStorePassword: ${KEY_STORE_PASSWORD}
@@ -140,13 +140,13 @@
       archivedFileCount: 10
 
 keycloakConfiguration:
-  realm: dlab
+  realm: datalab
   bearer-only: true
   auth-server-url: http://KEYCLOACK_HOST/auth
   ssl-required: none
   register-node-at-startup: true
   register-node-period: 600
-  resource: dlab-ui
+  resource: datalab-ui
   credentials:
     secret: CLIENT_SECRET
 
diff --git a/infrastructure-provisioning/terraform/gcp/endpoint/supervisor_svc.conf b/infrastructure-provisioning/terraform/gcp/endpoint/supervisor_svc.conf
new file mode 100644
index 0000000..67cf204
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/endpoint/supervisor_svc.conf
@@ -0,0 +1,35 @@
+; *****************************************************************************
+;
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+;
+; ******************************************************************************
+
+[supervisorctl]
+
+[inet_http_server]
+port = 127.0.0.1:9001
+
+[program:provserv]
+command=java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 WEB_APP_DIR/provisioning-service.jar server WEB_CONFprovisioning.yml
+directory=WEB_APP_DIR
+autorestart=true
+priority=20
+user=OS_USR
+stdout_logfile=/var/log/application/provision-service.log
+redirect_stderr=true
+environment=DATALAB_CONF_DIR="WEB_CONF"
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/main/main.tf b/infrastructure-provisioning/terraform/gcp/main/main.tf
index 4393f59..620fbea 100644
--- a/infrastructure-provisioning/terraform/gcp/main/main.tf
+++ b/infrastructure-provisioning/terraform/gcp/main/main.tf
@@ -1,33 +1,33 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
 provider "google" {
   credentials = "${var.credentials}"
-  project     = "${var.project_name}"
-  region      = "${var.region_var}"
-  zone        = "${var.zone_var}"
+  project = "${var.project_name}"
+  region = "${var.region_var}"
+  zone = "${var.zone_var}"
 }
 
 module "common" {
-  source            = "../modules/common"
+  source = "../modules/common"
   project_tag       = "${var.project_tag}"
   endpoint_tag      = "${var.endpoint_tag}"
   user_tag          = "${var.user_tag}"
diff --git a/infrastructure-provisioning/terraform/gcp/main/variables.tf b/infrastructure-provisioning/terraform/gcp/main/variables.tf
index 3c2feb0..12e7647 100644
--- a/infrastructure-provisioning/terraform/gcp/main/variables.tf
+++ b/infrastructure-provisioning/terraform/gcp/main/variables.tf
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/gcp/modules/common/iam.tf b/infrastructure-provisioning/terraform/gcp/modules/common/iam.tf
index bd65eb9..d409a34 100644
--- a/infrastructure-provisioning/terraform/gcp/modules/common/iam.tf
+++ b/infrastructure-provisioning/terraform/gcp/modules/common/iam.tf
@@ -1,32 +1,32 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
 locals {
   service_name = "${var.project_tag}-ps-sa"
-  role_name    = "${var.project_tag}-ps-role"
+  role_name = "${var.project_tag}-ps-role"
 }
 
 resource "google_service_account" "ps_sa" {
   #Create service account for notebooks and computational resources
-  account_id   = "${var.project_tag}-ps-sa"
+  account_id = "${var.project_tag}-ps-sa"
   display_name = "${var.project_tag}-ps-sa"
 }
 
diff --git a/infrastructure-provisioning/terraform/gcp/modules/common/network.tf b/infrastructure-provisioning/terraform/gcp/modules/common/network.tf
index cf3d294..828c987 100644
--- a/infrastructure-provisioning/terraform/gcp/modules/common/network.tf
+++ b/infrastructure-provisioning/terraform/gcp/modules/common/network.tf
@@ -1,33 +1,33 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
 resource "google_compute_subnetwork" "subnet" {
-  name          = "${var.project_tag}-subnet"
+  name = "${var.project_tag}-subnet"
   ip_cidr_range = "${var.cidr_range}"
-  region        = "${var.region}"
-  network       = "${var.vpc_name}"
+  region = "${var.region}"
+  network = "${var.vpc_name}"
 }
 
 resource "google_compute_firewall" "fw_ingress" {
-  name    = "${var.fw_ingress}"
+  name = "${var.fw_ingress}"
   network = "${var.vpc_name}"
   allow {
     protocol = "all"
diff --git a/infrastructure-provisioning/terraform/gcp/modules/common/variables.tf b/infrastructure-provisioning/terraform/gcp/modules/common/variables.tf
index 448d373..ec812d0 100644
--- a/infrastructure-provisioning/terraform/gcp/modules/common/variables.tf
+++ b/infrastructure-provisioning/terraform/gcp/modules/common/variables.tf
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/gcp/modules/data_engine/instance.tf b/infrastructure-provisioning/terraform/gcp/modules/data_engine/instance.tf
index a185a57..9800a35 100644
--- a/infrastructure-provisioning/terraform/gcp/modules/data_engine/instance.tf
+++ b/infrastructure-provisioning/terraform/gcp/modules/data_engine/instance.tf
@@ -1,33 +1,34 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
 locals {
   notebook_name = "${var.project_tag}-nb-${var.notebook_name}"
-  cluster_name  = "${var.project_tag}-de-${var.notebook_name}-${var.cluster_name}"
+  cluster_name = "${var.project_tag}-de-${var.notebook_name}-${var.cluster_name}"
 }
 
 resource "google_compute_instance" "master" {
-  name         = "${local.cluster_name}-m"
+  name = "${local.cluster_name}-m"
   machine_type = "${var.master_shape}"
-  tags         = ["${var.network_tag}"]
+  tags = [
+    "${var.network_tag}"]
   zone         = "${var.zone_var}"
 
   boot_disk {
diff --git a/infrastructure-provisioning/terraform/gcp/modules/data_engine/variables.tf b/infrastructure-provisioning/terraform/gcp/modules/data_engine/variables.tf
index e950ed1..934df8b 100644
--- a/infrastructure-provisioning/terraform/gcp/modules/data_engine/variables.tf
+++ b/infrastructure-provisioning/terraform/gcp/modules/data_engine/variables.tf
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/gcp/modules/dataproc/instance.tf b/infrastructure-provisioning/terraform/gcp/modules/dataproc/instance.tf
index 1419c56..3f8ec4a 100644
--- a/infrastructure-provisioning/terraform/gcp/modules/dataproc/instance.tf
+++ b/infrastructure-provisioning/terraform/gcp/modules/dataproc/instance.tf
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
@@ -24,40 +24,40 @@
 }
 
 resource "google_dataproc_cluster" "dataproc" {
-    name       = "${local.dataproc_name}"
-    region     = "${var.region}"
-    labels = {
-        computational_name = "${var.cluster_name}"
-        name               = "${local.dataproc_name}"
-        sbn                = "${var.project_tag}"
-        user               = "${var.user_tag}"
+  name = "${local.dataproc_name}"
+  region = "${var.region}"
+  labels = {
+    computational_name = "${var.cluster_name}"
+    name               = "${local.dataproc_name}"
+    sbn                = "${var.project_tag}"
+    user               = "${var.user_tag}"
+  }
+
+  cluster_config {
+
+    master_config {
+      num_instances     = 1
+      machine_type      = "${var.master_shape}"
+      disk_config {
+        boot_disk_size_gb = 30
+      }
     }
 
-    cluster_config {
-
-        master_config {
-            num_instances     = 1
-            machine_type      = "${var.master_shape}"
-            disk_config {
-                boot_disk_size_gb = 30
-            }
-        }
-
-        worker_config {
-            num_instances     = "${var.total_count - 1}"
-            machine_type      = "${var.slave_shape}"
-            disk_config {
-                boot_disk_size_gb = 30
-            }
-        }
-
-        gce_cluster_config {
-            subnetwork = "${var.subnet_name}"
-            tags    = ["${var.network_tag}"]
-        }
-
-        preemptible_worker_config {
-            num_instances = "${var.preemptible_count}"
-        }
+    worker_config {
+      num_instances     = "${var.total_count - 1}"
+      machine_type      = "${var.slave_shape}"
+      disk_config {
+        boot_disk_size_gb = 30
+      }
     }
-  }
\ No newline at end of file
+
+    gce_cluster_config {
+      subnetwork = "${var.subnet_name}"
+      tags    = ["${var.network_tag}"]
+    }
+
+    preemptible_worker_config {
+      num_instances = "${var.preemptible_count}"
+    }
+  }
+}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/modules/dataproc/variables.tf b/infrastructure-provisioning/terraform/gcp/modules/dataproc/variables.tf
index bac08a2..5b850ee 100644
--- a/infrastructure-provisioning/terraform/gcp/modules/dataproc/variables.tf
+++ b/infrastructure-provisioning/terraform/gcp/modules/dataproc/variables.tf
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/gcp/modules/notebook/instance.tf b/infrastructure-provisioning/terraform/gcp/modules/notebook/instance.tf
index e89f69b..725fab6 100644
--- a/infrastructure-provisioning/terraform/gcp/modules/notebook/instance.tf
+++ b/infrastructure-provisioning/terraform/gcp/modules/notebook/instance.tf
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
@@ -27,7 +27,7 @@
   name = "${local.name}-secondary"
   zone = "${var.zone_var}"
   labels = {
-    name    = "${local.name}"
+    name = "${local.name}"
     product = "${var.product}"
     project = "${var.project_tag}"
     user    = "${var.user_tag}"
diff --git a/infrastructure-provisioning/terraform/gcp/modules/notebook/variables.tf b/infrastructure-provisioning/terraform/gcp/modules/notebook/variables.tf
index bf51d34..56635ac 100644
--- a/infrastructure-provisioning/terraform/gcp/modules/notebook/variables.tf
+++ b/infrastructure-provisioning/terraform/gcp/modules/notebook/variables.tf
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/README.md b/infrastructure-provisioning/terraform/gcp/ssn-gke/README.md
new file mode 100644
index 0000000..8e8766f
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/README.md
@@ -0,0 +1,115 @@
+# DataLab GKE Deployment <a name="DataLab_Deployment"></a>
+
+### Preparing environment for DataLab deployment <a name="Env_for_DataLab"></a>
+
+Prerequisites:
+
+- IAM user
+- Service account and JSON auth file for it. In order to get JSON auth file, Key should be created for service account 
+through Google cloud console.
+- Google Cloud Storage JSON API should be enabled
+
+Preparation steps for deployment:
+
+- Create an VM instance with the following settings:
+    - The instance should have access to Internet in order to install required prerequisites
+    - Boot disk OS Image - Ubuntu 18.04
+- Put JSON auth file created through Google cloud console to users home directory
+- Install Terraform v0.12.3:
+```
+sudo su
+apt-get update
+wget https://releases.hashicorp.com/terraform/0.12.3/terraform_0.12.3_linux_amd64.zip
+apt-get install unzip
+unzip terraform_0.12.3_linux_amd64.zip
+chmod +x terraform
+mv terraform /usr/local/bin/
+```
+- Install jq and kubectl:
+```
+apt-get install jq
+snap install kubectl --classic
+```
+- Install Python3.7 and pip libraries:
+```
+add-apt-repository ppa:deadsnakes/ppa
+apt-get install python3.7
+update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
+update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
+update-alternatives --config python3
+apt-get install python3-pip
+pip3 install fabric==2.4.0 patchwork==1.0.1 invoke==1.2.0 cryptography==3.3.1
+```
+- Install Git and clone DataLab repository:
+```
+git clone https://github.com/apache/incubator-datalab.git
+```
+
+### Executing deployment scripts
+
+Deployment of DataLab starts from GKE cluster creating.
+
+To build GKE cluster with DataLab, following steps should be executed:
+
+- Connect to the instance via SSH and run the following commands:
+```
+mkdir /home/ubuntu/datalab-state
+cd incubator-datalab/infrastructure-provisioning/terraform/bin/
+git checkout develop
+```
+- Run python script to create GKE cluster and deploy Helm Charts:
+```
+python3 datalab.py deploy gcp k8s --credentials_file_path /path/to/auth/file.json --project_id gcp_project_id --service_base_name xxxx --region xx-xxxxx --zone xxx-xxxxx-x --big_query_dataset xxxxx --domain domain.com --state /home/ubuntu/datalab-state/ --custom_certs_enabled false --ldap_host ldap_server_host --ldap_user cn=admin --ldap_bind_creds ldap_server_password --ldap_users_group ou=People
+```
+
+List of parameters for GKE cluster creation and Helm Charts deployment:
+
+| Parameter                    | Description/Value                                                                     |
+|------------------------------|---------------------------------------------------------------------------------------|
+| conf\_service\_base\_name    | Any infrastructure value (should be unique)										   |
+| gcp\_region                  | GCP region                                                                            |
+| gcp\_zone                    | GCP zone                                                                              |
+| gcp\_service\_account\_path  | Full path to auth json file                                                           |
+| gcp\_project\_id             | ID of GCP project                                                                     |
+| big\_query\_dataset 	       | Name of GCP billing dataset (BigQuery service)                                        |
+| domain 	                   | Domain name                                                                           |,
+
+After successful DataLab deployment You get output values which are needed for Keycloak configuration and Endpoint deployment, please save them.
+
+Use direct link to Keycloak admin panel, as well as username and password for it. You have to login Keycloak admin panel and create user for DataLab. After that You are able to login into DataLab UI.
+
+To proceed with DataLab resources creation Endpoint should be created.
+
+To create Endpoint following steps should be executed:
+
+- Create private and public key-pair for SSH access to endpoint instance
+```
+cd /home/ubuntu/incubator-datalab/infrastructure-provisioning/terraform/bin/
+```
+- Run python script to create DataLab Endpoint*:
+```
+python3 datalab.py deploy gcp endpoint --gcp_project_id gcp_project_id --creds_file /path/to/auth/file.json --key_name key_name --pkey /path/to/key/key_name.pem --service_base_name xxxx --path_to_pub_key /path/to/key/key_name.pub --endpoint_id yyyy --region xx-xxxxx --zone xxx-xxxxx-x --state /home/ubuntu/datalab-state/ --cloud_provider gcp --repository_user nexus_user --repository_pass nexus_password --repository_address nexus.develop.dlabanalytics.com --repository_port 8083 --vpc_id "vpc_id" --subnet_id "subnet_id" --ssn_ui_host domain.com --keycloak_auth_server_url https://service_base_name.domain.com/auth --keycloak_realm_name realm_name --keycloak_user_name admin_name --keycloak_user_password admin_password --keycloak_client_id client_id --keycloak_client_secret client_secret --step_root_ca "step_ca" --step_kid step_kid --step_kid_password --step_ca_url https://step_ca_url --mongo_password mongo_password --billing_dataset_name xxxxx --billing_enable True --ldap_host ldap_server_host --ldap_dn dc=example,dc=com --ldap_user cn=admin --ldap_bind_creds ldap_server_password --ldap_users_group ou=People
+```
+List of parameters for DataLab Endpoint creation:
+
+| Parameter                    | Description/Value                                                                     |
+|------------------------------|---------------------------------------------------------------------------------------|
+| service\_base\_name          | Unique infrastructure value used for GKE cluster creation  						   |
+| region                       | GCP region                                                                            |
+| zone                         | GCP zone                                                                              |
+| creds\_file                  | Full path to auth json file                                                           |
+| gcp\_project\_id             | ID of GCP project                                                                     |
+| pkey                         | Private SSH key						                            				   |
+| path\_to\_pub                | Path to public SSH key                                                                |
+| endpoint_id                  | Unique infrastructure value (6 characters max)                                        |
+| repository\_*                | Please contact with DataLab team to get repository values                             |
+| keycloak\_*                  | Use keycloak values form GKE cluster creation output                                  |
+| step\_*                      | Use step\_ca values form GKE cluster creation output                                  |
+| mongo\_password              | Use mongo\_password from GKE cluster creation output                                  |
+| billing\_dataset\_name       | Name of GCP billing dataset (BigQuery service)                                        |
+| domain 	                   | Domain name                                                                           |
+
+*You may omit the following parameters (in case of using the same state path input variables are included from GKE createion output): --vpc_id "vpc_id" --subnet_id "subnet_id" --ssn_ui_host domain.com --keycloak_auth_server_url https://keycloak_auth_url --keycloak_realm_name realm_name --keycloak_user_name admin_name --keycloak_user_password admin_password --keycloak_client_id client_id --keycloak_client_secret client_secret --step_root_ca "step_ca" --step_kid step_kid --step_kid_password --step_ca_url https://step_ca_url 
+
+After successful DataLab Endpoint deployment login into DataLab UI and add Endpoint at Environment Management page.
+Use unique Endpoint name (it should be equal endpoint_id used for run endpoint deployment script) for DataLab UI and Endpoint URl in format: https://ip_address:8084/
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/main.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/main.tf
index 6521774..5d8ed9b 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/main.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/main.tf
@@ -20,6 +20,7 @@
 # ******************************************************************************
 
 provider "google" {
+  version     = "3.3.0"
   credentials = file(var.credentials_file_path)
   project     = var.project_id
   region      = var.region
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/.helmignore b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/.helmignore
new file mode 100644
index 0000000..4976779
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/.helmignore
@@ -0,0 +1,43 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/Chart.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/Chart.yaml
new file mode 100644
index 0000000..a9925e4
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/Chart.yaml
@@ -0,0 +1,26 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+apiVersion: v1
+appVersion: "1.0"
+description: A Helm chart for Kubernetes
+name: datalab-billing
+version: 0.1.0
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/NOTES.txt b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/NOTES.txt
new file mode 100644
index 0000000..7795916
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/NOTES.txt
@@ -0,0 +1,42 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+  {{- range .paths }}
+  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
+  {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "datalab-billing.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "datalab-billing.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "datalab-billing.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "datalab-billing.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:80
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/_helpers.tpl b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/_helpers.tpl
new file mode 100644
index 0000000..e7da47f
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/_helpers.tpl
@@ -0,0 +1,65 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "datalab-billing.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "datalab-billing.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "datalab-billing.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "datalab-billing.labels" -}}
+app.kubernetes.io/name: {{ include "datalab-billing.name" . }}
+helm.sh/chart: {{ include "datalab-billing.chart" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/configmap-billing-conf.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/configmap-billing-conf.yaml
new file mode 100644
index 0000000..1eba06a
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/configmap-billing-conf.yaml
@@ -0,0 +1,67 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "datalab-billing.fullname" . }}-billing-conf
+data:
+  billing.yml: |
+    spring:
+      main:
+        allow-bean-definition-overriding: true
+      data:
+        mongodb:
+          username: {{ .Values.billing.mongo.username }}
+          password: ${MONGO_DB_PASSWORD}
+          database: {{ .Values.billing.mongo.db_name }}
+          port: {{ .Values.billing.mongo.port }}
+          host: {{ .Values.billing.mongo.host }}
+    datalab:
+      sbn: {{ .Values.billing.service_base_name }}
+      bigQueryDataset: {{ .Values.billing.big_query_dataset }}
+      cron: 0 0 * * * *
+
+    server:
+      port: 8088
+      servlet:
+        contextPath: /api/billing
+
+    server.ssl.key-store-type: JKS
+    server.ssl.key-store: /root/keys/ssn.keystore.jks
+    server.ssl.key-store-password: ${SSN_KEYSTORE_PASSWORD}
+    server.ssl.key-alias: ssn
+
+    logging:
+      file: /root/billing.log
+      level:
+        com:
+          epam: trace
+
+    keycloak:
+      bearer-only: true
+      realm: {{ .Values.billing.keycloak.realm_name }}
+      resource: {{ .Values.billing.keycloak.client_id }}
+      credentials.secret: ${KEYCLOAK_CLIENT_SECRET}
+      ssl-required: none
+      auth-server-url: ${KEYCLOAK_AUTH_URL}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/deployment.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/deployment.yaml
new file mode 100644
index 0000000..8988aca
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/deployment.yaml
@@ -0,0 +1,85 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "datalab-billing.fullname" . }}
+  labels: {{ include "datalab-billing.labels" . | nindent 4 }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: {{ include "datalab-billing.name" . }}
+      app.kubernetes.io/instance: {{ .Release.Name }}
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/name: {{ include "datalab-billing.name" . }}
+        app.kubernetes.io/instance: {{ .Release.Name }}
+    spec:
+      {{- with .Values.imagePullSecrets }}
+      imagePullSecrets:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      containers:
+        - name: {{ .Chart.Name }}
+          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          env:
+            - name: MONGO_DB_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: mongo-db-password
+                  key: password
+          ports:
+            - name: mongo
+              containerPort: 21017
+              protocol: TCP
+          resources:
+            {{- toYaml .Values.resources | nindent 12 }}
+          volumeMounts:
+            - name: billing-yml
+              mountPath: /root/billing.yml
+              subPath: billing
+              readOnly: true
+      volumes:
+        - name: billing-yml
+          configMap:
+            name: {{ include "datalab-billing.fullname" . }}-billing-conf
+            defaultMode: 0644
+            items:
+              - key: billing.yml
+                path: billing
+      {{- with .Values.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.affinity }}
+    affinity:
+      {{- toYaml . | nindent 8 }}
+    {{- end }}
+    {{- with .Values.tolerations }}
+    tolerations:
+      {{- toYaml . | nindent 8 }}
+    {{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/service.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/service.yaml
new file mode 100644
index 0000000..0d758a6
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/templates/service.yaml
@@ -0,0 +1,37 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "datalab-billing.fullname" . }}
+  labels: {{ include "datalab-billing.labels" . | nindent 4 }}
+spec:
+  ports:
+    - port: {{ .Values.service.port }}
+      targetPort: 27017
+      protocol: TCP
+  selector:
+    app.kubernetes.io/name: {{ include "datalab-billing.name" . }}
+    app.kubernetes.io/instance: {{ .Release.Name }}
+
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/values.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/values.yaml
new file mode 100644
index 0000000..86f3956
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing-chart/values.yaml
@@ -0,0 +1,68 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+# Default values for datalab-billing.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 1
+
+image:
+  repository: epamdlab/billing
+  tag: '0.1-gcp'
+  # pullPolicy: IfNotPresent
+  pullPolicy: Always
+
+#imagePullSecrets: []
+#nameOverride: ""
+#fullnameOverride: ""
+
+service:
+  type: ClusterIP
+  port: 58334
+
+ingress:
+  enabled: false
+  host: ""
+  annotations:
+  # kubernetes.io/ingress.class: nginx
+  # nginx.ingress.kubernetes.io/ssl-redirect: "false"
+  # kubernetes.io/tls-acme: "true"
+
+  tls: []
+  #  - secretName: chart-example-tls
+  #    hosts:
+  #      - chart-example.local
+labels: {}
+
+billing:
+  mongo:
+    host: ${mongo_service_name}
+    port: ${mongo_port}
+    username: ${mongo_user}
+    db_name: ${mongo_db_name}
+  keycloak:
+    auth_server_url: https://${ssn_k8s_alb_dns_name}/auth
+    redirect_uri: https://${ssn_k8s_alb_dns_name}/
+    realm_name: ${keycloak_realm_name}
+    client_id: ${keycloak_client_id}
+  service_base_name: ${service_base_name}
+  big_query_dataset: ${big_query_dataset}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing.tfb b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing.tfb
new file mode 100644
index 0000000..6b33c8c
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-billing.tfb
@@ -0,0 +1,50 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+data "template_file" "datalab_billing_values" {
+  template = file("./modules/helm_charts/datalab-billing-chart/values.yaml")
+  vars = {
+    mongo_db_name = var.mongo_dbname
+    mongo_user = var.mongo_db_username
+    mongo_port = var.mongo_service_port
+    mongo_service_name = var.mongo_service_name
+    ssn_k8s_alb_dns_name = local.ui_host
+    service_base_name = var.service_base_name
+    big_query_dataset = var.big_query_dataset
+    keycloak_realm_name = var.keycloak_realm_name
+    keycloak_client_id = var.keycloak_client_id
+  }
+}
+
+resource "helm_release" "datalab-billing" {
+  name = "datalab-billing"
+  chart = "./modules/helm_charts/datalab-billing-chart"
+  depends_on = [
+    helm_release.mongodb,
+    kubernetes_secret.mongo_db_password_secret,
+    null_resource.cert_manager_delay]
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
+
+  values = [
+    data.template_file.datalab_billing_values.rendered
+  ]
+}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/.helmignore b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/.helmignore
new file mode 100644
index 0000000..4976779
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/.helmignore
@@ -0,0 +1,43 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/Chart.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/Chart.yaml
new file mode 100644
index 0000000..6b0ad3c
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/Chart.yaml
@@ -0,0 +1,26 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+apiVersion: v1
+appVersion: "1.0"
+description: A Helm chart for Kubernetes
+name: datalab-ui
+version: 0.1.0
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/NOTES.txt b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/NOTES.txt
new file mode 100644
index 0000000..6e677c6
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/NOTES.txt
@@ -0,0 +1,42 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+1. Get the application URL by running these commands:
+{{- if .Values.ui.ingress.enabled }}
+{{- range $host := .Values.ui.ingress.hosts }}
+  {{- range .paths }}
+  http{{ if $.Values.ui.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
+  {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.ui.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "datalab-ui.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.ui.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "datalab-ui.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "datalab-ui.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.ui.service.http_port }}
+{{- else if contains "ClusterIP" .Values.ui.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "datalab-ui.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:80
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/_helpers.tpl b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/_helpers.tpl
new file mode 100644
index 0000000..cb09955
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/_helpers.tpl
@@ -0,0 +1,65 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "datalab-ui.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "datalab-ui.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "datalab-ui.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "datalab-ui.labels" -}}
+app.kubernetes.io/name: {{ include "datalab-ui.name" . }}
+helm.sh/chart: {{ include "datalab-ui.chart" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/cert.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/cert.yaml
new file mode 100644
index 0000000..386d2bf
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/cert.yaml
@@ -0,0 +1,64 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+  {{- if not .Values.ui.custom_certs.enabled -}}
+apiVersion: certmanager.k8s.io/v1alpha1
+kind: Certificate
+metadata:
+  name: datalab-ui
+  namespace: {{ .Values.namespace }}
+spec:
+  # The secret name to store the signed certificate
+  secretName: {{ include "datalab-ui.fullname" . }}-tls
+  # Common Name
+  commonName: datalab-kubernetes-cluster
+  # DNS SAN
+  dnsNames:
+    - localhost
+    - {{ .Values.ui.ingress.host }}
+  # IP Address SAN
+  ipAddresses:
+    - "127.0.0.1"
+  # Duration of the certificate
+  duration: 24h
+  # Renew 8 hours before the certificate expiration
+  renewBefore: 8h
+  # The reference to the step issuer
+  issuerRef:
+    group: certmanager.step.sm
+    kind: Issuer
+    name: step-issuer
+  {{- end }}
+---
+  {{- if .Values.ui.custom_certs.enabled -}}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "datalab-ui.fullname" . }}-tls
+  namespace: {{ .Values.namespace }}
+type: kubernetes.io/tls
+data:
+  ca.crt: {{ .Values.ui.custom_certs.ca }}
+  tls.crt: {{ .Values.ui.custom_certs.crt }}
+  tls.key: {{ .Values.ui.custom_certs.key }}
+  {{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/configmap-ui-conf.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/configmap-ui-conf.yaml
new file mode 100644
index 0000000..8627932
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/configmap-ui-conf.yaml
@@ -0,0 +1,252 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "datalab-ui.fullname" . }}-ui-conf
+data:
+  ssn.yml: |
+    <#assign LOG_ROOT_DIR="/var/opt/datalab/log">
+    <#assign KEYS_DIR="/root/keys">
+    <#assign KEY_STORE_PATH="/root/keys/ssn.keystore.jks">
+    <#assign KEY_STORE_PASSWORD="${SSN_KEYSTORE_PASSWORD}">
+    <#assign TRUST_STORE_PATH="/usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts">
+    <#assign TRUST_STORE_PASSWORD="changeit">
+
+    # Available options are aws, azure, gcp
+    <#assign CLOUD_TYPE="gcp">
+    cloudProvider: ${CLOUD_TYPE}
+
+    #Switch on/off developer mode here
+    <#assign DEV_MODE="false">
+    devMode: ${DEV_MODE}
+
+    mongo:
+      host: {{ .Values.ui.mongo.host }}
+      port: {{ .Values.ui.mongo.port }}
+      username: {{ .Values.ui.mongo.username }}
+      password: ${MONGO_DB_PASSWORD}
+      database: {{ .Values.ui.mongo.db_name }}
+
+    selfService:
+      protocol: https
+      host: localhost
+      port: {{ .Values.ui.service.https_port }}
+      jerseyClient:
+        timeout: 3s
+        connectionTimeout: 3s
+
+    securityService:
+      protocol: https
+      host: localhost
+      port: 8090
+      jerseyClient:
+        timeout: 20s
+        connectionTimeout: 20s
+
+    provisioningService:
+      jerseyClient:
+        timeout: 3s
+        connectionTimeout: 3s
+
+    bucketService:
+      jerseyClient:
+        timeout: 50m
+        connectionTimeout: 3s
+
+    billingService:
+      jerseyClient:
+        timeout: 4m
+        connectionTimeout: 3s
+
+    # Log out user on inactivity
+    inactiveUserTimeoutMillSec: 7200000
+
+  self-service.yml: |
+    <#include "/root/ssn.yml">
+
+    # Minimum and maximum number of slave EMR instances than could be created
+    minEmrInstanceCount: 2
+    maxEmrInstanceCount: 14
+    # Minimum and maximum percentage cost for slave EMR spot instances biding
+    minEmrSpotInstanceBidPct: 20
+    maxEmrSpotInstanceBidPct: 90
+
+    # Maximum length for gcp user name (due to gcp restrictions)
+    maxUserNameLength: 10
+    # Minimum and maximum number of slave Dataproc instances that could be created
+    minInstanceCount: 3
+    maxInstanceCount: 15
+    minDataprocPreemptibleCount: 0
+    gcpOuauth2AuthenticationEnabled: false
+
+    # Boundaries for Spark cluster creation
+    minSparkInstanceCount: 2
+    maxSparkInstanceCount: 14
+
+    # Timeout for check the status of environment via provisioning service
+    checkEnvStatusTimeout: 5m
+
+    # Restrict access to DataLab features using roles policy
+    rolePolicyEnabled: true
+    # Default access to DataLab features using roles policy
+    roleDefaultAccess: true
+
+    # Set to true to enable the scheduler of billing report.
+    billingSchedulerEnabled: true
+    billingPort: 8088
+    # Set to true to enable audit
+    auditEnabled: true
+    # Name of configuration file for billing report.
+    <#if DEV_MODE == "true">
+    billingConfFile: ${sys['user.dir']}/../billing/billing.yml
+    <#else>
+    billingConfFile: ${DATALAB_CONF_DIR}/billing.yml
+    </#if>
+
+    <#if CLOUD_TYPE == "azure">
+    azureUseLdap: <LOGIN_USE_LDAP>
+    maxSessionDurabilityMilliseconds: 288000000
+    </#if>
+
+    serviceBaseName: {{ .Values.ui.service_base_name }}
+    os: {{ .Values.ui.os }}
+    server:
+      requestLog:
+        appenders:
+        - type: file
+          currentLogFilename: ${LOG_ROOT_DIR}/ssn/request-selfservice.log
+          archive: true
+          archivedLogFilenamePattern: ${LOG_ROOT_DIR}/ssn/request-selfservice-%d{yyyy-MM-dd}.log.gz
+          archivedFileCount: 10
+      rootPath: "/api"
+      applicationConnectors:
+      - type: http
+        port: {{ .Values.ui.service.http_port }}
+      - type: https
+        port: {{ .Values.ui.service.https_port }}
+        certAlias: ssn
+        validateCerts: false
+        keyStorePath: ${KEY_STORE_PATH}
+        keyStorePassword: ${KEY_STORE_PASSWORD}
+        trustStorePath: ${TRUST_STORE_PATH}
+        trustStorePassword: ${TRUST_STORE_PASSWORD}
+      adminConnectors:
+    #    - type: http
+    #      port: 8081
+      - type: https
+        port: 8444
+        certAlias: ssn
+        validateCerts: false
+        keyStorePath: ${KEY_STORE_PATH}
+        keyStorePassword: ${KEY_STORE_PASSWORD}
+        trustStorePath: ${TRUST_STORE_PATH}
+        trustStorePassword: ${TRUST_STORE_PASSWORD}
+
+    mongoMigrationEnabled: false
+
+    logging:
+      level: INFO
+      loggers:
+        com.epam: TRACE
+        com.novemberain: ERROR
+      appenders:
+      - type: console
+      - type: file
+        currentLogFilename: ${LOG_ROOT_DIR}/ssn/selfservice.log
+        archive: true
+        archivedLogFilenamePattern: ${LOG_ROOT_DIR}/ssn/selfservice-%d{yyyy-MM-dd}.log.gz
+        archivedFileCount: 10
+
+    mavenSearchService:
+      protocol: http
+      host: search.maven.org
+      port: 80
+      jerseyClient:
+        timeout: 5s
+        connectionTimeout: 5s
+
+    schedulers:
+      inactivity:
+        enabled: false
+        cron: "0 0 0/2 ? * * *"
+      checkInfrastructureStatusScheduler:
+        enabled: true
+        cron: "0 0/15 * ? * *"
+      startComputationalScheduler:
+        enabled: true
+        cron: "*/20 * * ? * * *"
+      stopComputationalScheduler:
+        enabled: true
+        cron: "*/20 * * ? * * *"
+      startExploratoryScheduler:
+        enabled: true
+        cron: "*/20 * * ? * * *"
+      stopExploratoryScheduler:
+        enabled: true
+        cron: "*/20 * * ? * * *"
+      terminateComputationalScheduler:
+        enabled: true
+        cron: "*/20 * * ? * * *"
+      checkQuoteScheduler:
+        enabled: true
+        cron: "0 2/15 * ? * *"
+      checkUserQuoteScheduler:
+        enabled: false
+        cron: "0 0 * ? * * *"
+      checkProjectQuoteScheduler:
+        enabled: true
+        cron: "0 4/15 * ? * *"
+      checkEndpointStatusScheduler:
+        enabled: true
+        cron: "0 6/15 * ? * *"
+      billingScheduler:
+        enabled: true
+        cron: "0 0/15 * ? * *"
+
+    guacamole:
+      connectionProtocol: ssh
+      serverPort: 4822
+      port: 22
+      username: datalab-user
+
+    keycloakConfiguration:
+      redirectUri: {{ .Values.ui.keycloak.redirect_uri }}
+      realm: {{ .Values.ui.keycloak.realm_name }}
+      bearer-only: true
+      auth-server-url: ${KEYCLOAK_AUTH_URL}
+      ssl-required: none
+      register-node-at-startup: true
+      register-node-period: 600
+      resource: {{ .Values.ui.keycloak.client_id }}
+      credentials:
+        secret: ${KEYCLOAK_CLIENT_SECRET}
+
+    jerseyClient:
+      minThreads: 1
+      maxThreads: 128
+      workQueueSize: 8
+      gzipEnabled: true
+      gzipEnabledForRequests: false
+      chunkedEncodingEnabled: true
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/deployment.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/deployment.yaml
new file mode 100644
index 0000000..9e2cbb0
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/deployment.yaml
@@ -0,0 +1,106 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "datalab-ui.fullname" . }}
+  labels: {{ include "datalab-ui.labels" . | nindent 4 }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: {{ include "datalab-ui.name" . }}
+      app.kubernetes.io/instance: {{ .Release.Name }}
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/name: {{ include "datalab-ui.name" . }}
+        app.kubernetes.io/instance: {{ .Release.Name }}
+    spec:
+      containers:
+        - name: {{ .Chart.Name }}
+          image: "{{ .Values.ui.image.repository }}:{{ .Values.ui.image.tag }}"
+          imagePullPolicy: {{ .Values.ui.image.pullPolicy }}
+          env:
+            - name: MONGO_DB_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: mongo-db-password
+                  key: password
+            - name: SSN_KEYSTORE_PASSWORD
+              valueFrom:
+                secretKeyRef:
+                  name: ssn-keystore-password
+                  key: password
+            - name: KEYCLOAK_CLIENT_SECRET
+              valueFrom:
+                secretKeyRef:
+                  name: keycloak-client-secret
+                  key: client_secret
+            - name: KEYCLOAK_AUTH_URL
+              value: {{ .Values.ui.keycloak.auth_server_url }}
+          ports:
+            - name: http
+              containerPort: 80
+              protocol: TCP
+          resources:
+            {{- toYaml .Values.resources | nindent 12 }}
+          volumeMounts:
+            - name: ui-conf
+              mountPath: /root/ssn.yml
+              subPath: ssn
+              readOnly: true
+            - name: ui-conf
+              mountPath: /root/self-service.yml
+              subPath: self-service
+              readOnly: true
+            - mountPath: "/root/step-certs"
+              name: ui-tls
+              readOnly: true
+      volumes:
+        - name: ui-conf
+          configMap:
+            name: {{ include "datalab-ui.fullname" . }}-ui-conf
+            defaultMode: 0644
+            items:
+              - key: ssn.yml
+                path: ssn
+              - key: self-service.yml
+                path: self-service
+        - name: ui-tls
+          secret:
+            secretName: {{ include "datalab-ui.fullname" . }}-tls
+
+      {{- with .Values.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+    {{- with .Values.affinity }}
+    affinity:
+      {{- toYaml . | nindent 8 }}
+    {{- end }}
+    {{- with .Values.tolerations }}
+    tolerations:
+      {{- toYaml . | nindent 8 }}
+    {{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/ingress.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/ingress.yaml
new file mode 100644
index 0000000..5354d93
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/ingress.yaml
@@ -0,0 +1,57 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+{{- if .Values.ui.ingress.enabled -}}
+{{- $fullName := include "datalab-ui.fullname" . -}}
+{{ $servicePort := .Values.ui.service.http_port }}
+{{ $host := .Values.ui.ingress.host }}
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+  name: {{ $fullName }}
+  labels:
+{{ include "datalab-ui.labels" . | indent 4 }}
+  annotations:
+{{- with .Values.ui.ingress.annotations }}
+{{ toYaml . | indent 4 }}
+  {{- end }}
+spec:
+{{- if .Values.ui.ingress.tls }}
+  tls:
+  {{- range .Values.ui.ingress.tls }}
+    - hosts:
+      {{- range .hosts }}
+        - {{ . | quote }}
+      {{- end }}
+      secretName: {{ .secretName }}
+  {{- end }}
+{{- end }}
+  rules:
+    - host: {{ $host }}
+      http:
+        paths:
+        - backend:
+            serviceName: {{ $fullName }}
+            servicePort: {{ $servicePort }}
+          path: /
+{{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/service.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/service.yaml
new file mode 100644
index 0000000..3d7122c
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/templates/service.yaml
@@ -0,0 +1,42 @@
+{{- /*
+  # *****************************************************************************
+  #
+  # Licensed to the Apache Software Foundation (ASF) under one
+  # or more contributor license agreements.  See the NOTICE file
+  # distributed with this work for additional information
+  # regarding copyright ownership.  The ASF licenses this file
+  # to you under the Apache License, Version 2.0 (the
+  # "License"); you may not use this file except in compliance
+  # with the License.  You may obtain a copy of the License at
+  #
+  #   http://www.apache.org/licenses/LICENSE-2.0
+  #
+  # Unless required by applicable law or agreed to in writing,
+  # software distributed under the License is distributed on an
+  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  # KIND, either express or implied.  See the License for the
+  # specific language governing permissions and limitations
+  # under the License.
+  #
+  # ******************************************************************************
+  */ -}}
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "datalab-ui.fullname" . }}
+  labels: {{ include "datalab-ui.labels" . | nindent 4 }}
+spec:
+  type: {{ .Values.ui.service.type }}
+  ports:
+    - port: {{ .Values.ui.service.http_port }}
+      targetPort: {{ .Values.ui.service.http_port }}
+      protocol: TCP
+      name: http
+    - port: {{ .Values.ui.service.https_port }}
+      targetPort: {{ .Values.ui.service.https_port }}
+      protocol: TCP
+      name: https
+  selector:
+    app.kubernetes.io/name: {{ include "datalab-ui.name" . }}
+    app.kubernetes.io/instance: {{ .Release.Name }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/values.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/values.yaml
new file mode 100644
index 0000000..80b4985
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui-chart/values.yaml
@@ -0,0 +1,66 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+# Default values for datalab-ui.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 1
+labels: {}
+namespace: ${namespace}
+
+ui:
+  service_base_name: ${service_base_name}
+  os: ${os}
+  image:
+    repository: epamdlab/ui
+    tag: '0.1-gcp'
+    pullPolicy: Always
+  service:
+    type: ClusterIP
+    #  port: 58443
+    http_port: 80
+    https_port: 443
+  ingress:
+    enabled: true
+    host: ${ssn_k8s_alb_dns_name}
+    annotations:
+      kubernetes.io/ingress.class: nginx
+      nginx.ingress.kubernetes.io/ssl-redirect: "true"
+      nginx.ingress.kubernetes.io/proxy-body-size: "50m"
+    tls:
+      - secretName: datalab-ui-tls
+  mongo:
+    host: ${mongo_service_name}
+    port: ${mongo_port}
+    username: ${mongo_user}
+    db_name: ${mongo_db_name}
+  keycloak:
+    auth_server_url: https://${ssn_k8s_alb_dns_name}/auth
+    redirect_uri: https://${ssn_k8s_alb_dns_name}/
+    realm_name: ${keycloak_realm_name}
+    client_id: ${keycloak_client_id}
+
+  custom_certs:
+    enabled: ${custom_certs_enabled}
+    crt: ${custom_certs_crt}
+    key: ${custom_certs_key}
+    ca: ${step_ca_crt}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui.tf
new file mode 100644
index 0000000..739099d
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/datalab-ui.tf
@@ -0,0 +1,71 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+locals {
+  custom_certs_enabled = lower(var.custom_certs_enabled)
+  custom_cert_name = local.custom_certs_enabled == "true" ? reverse(split("/", var.custom_cert_path))[0] : "None"
+  custom_key_name = local.custom_certs_enabled == "true" ? reverse(split("/", var.custom_key_path))[0] : "None"
+  custom_cert = local.custom_certs_enabled == "true" ? base64encode(file("/tmp/${local.custom_cert_name}")) : "None"
+  custom_key = local.custom_certs_enabled == "true" ? base64encode(file("/tmp/${local.custom_key_name}")) : "None"
+  ui_host = local.custom_certs_enabled == "true" ? var.custom_certs_host : "${var.service_base_name}-ssn.${var.domain}"
+}
+
+data "template_file" "datalab_ui_values" {
+  template = file("./modules/helm_charts/datalab-ui-chart/values.yaml")
+  vars = {
+    mongo_db_name = var.mongo_dbname
+    mongo_user = var.mongo_db_username
+    mongo_port = var.mongo_service_port
+    mongo_service_name = var.mongo_service_name
+    ssn_k8s_alb_dns_name = local.ui_host
+    service_base_name = var.service_base_name
+    os = var.env_os
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+    custom_certs_enabled = local.custom_certs_enabled
+    custom_certs_crt = local.custom_cert
+    custom_certs_key = local.custom_key
+    step_ca_crt = lookup(data.external.step-ca-config-values.result, "rootCa")
+    keycloak_realm_name = var.keycloak_realm_name
+    keycloak_client_id = var.keycloak_client_id
+  }
+}
+
+resource "helm_release" "datalab_ui" {
+  name = "datalab-ui"
+  chart = "./modules/helm_charts/datalab-ui-chart"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
+    depends_on = [
+    helm_release.mongodb,
+    kubernetes_secret.mongo_db_password_secret,
+    null_resource.step_ca_issuer_delay,
+    helm_release.external_dns]
+    values = [data.template_file.datalab_ui_values.rendered]
+}
+
+data "kubernetes_service" "ui_service" {
+  metadata {
+    name = helm_release.datalab_ui.name
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  }
+  depends_on = [
+    helm_release.datalab_ui]
+}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-billing.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-billing.tf
deleted file mode 100644
index b2c6716..0000000
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-billing.tf
+++ /dev/null
@@ -1,44 +0,0 @@
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-
-data "template_file" "dlab_billing_values" {
-  template = file("./modules/helm_charts/dlab-billing-chart/values.yaml")
-  vars = {
-    mongo_db_name           = var.mongo_dbname
-    mongo_user              = var.mongo_db_username
-    mongo_port              = var.mongo_service_port
-    mongo_service_name      = var.mongo_service_name
-    service_base_name       = var.service_base_name
-    big_query_dataset       = var.big_query_dataset
-  }
-}
-
-resource "helm_release" "dlab-billing" {
-    name       = "dlab-billing"
-    chart      = "./modules/helm_charts/dlab-billing-chart"
-    depends_on = [helm_release.mongodb, kubernetes_secret.mongo_db_password_secret, null_resource.cert_manager_delay]
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-    wait       = true
-
-    values     = [
-        data.template_file.dlab_billing_values.rendered
-    ]
-}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/cert.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/cert.yaml
deleted file mode 100644
index 5762e9a..0000000
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/cert.yaml
+++ /dev/null
@@ -1,64 +0,0 @@
-{{- /*
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-*/ -}}
-
-{{- if not .Values.ui.custom_certs.enabled -}}
-apiVersion: certmanager.k8s.io/v1alpha1
-kind: Certificate
-metadata:
-  name: dlab-ui
-  namespace: {{ .Values.namespace }}
-spec:
-  # The secret name to store the signed certificate
-  secretName: {{ include "dlab-ui.fullname" . }}-tls
-  # Common Name
-  commonName: dlab-kubernetes-cluster
-  # DNS SAN
-  dnsNames:
-    - localhost
-    - {{ .Values.ui.ingress.host }}
-  # IP Address SAN
-  ipAddresses:
-    - "127.0.0.1"
-  # Duration of the certificate
-  duration: 24h
-  # Renew 8 hours before the certificate expiration
-  renewBefore: 8h
-  # The reference to the step issuer
-  issuerRef:
-    group: certmanager.step.sm
-    kind: Issuer
-    name: step-issuer
-{{- end }}
----
-{{- if .Values.ui.custom_certs.enabled -}}
-apiVersion: v1
-kind: Secret
-metadata:
-  name: {{ include "dlab-ui.fullname" . }}-tls
-  namespace: {{ .Values.namespace }}
-type: kubernetes.io/tls
-data:
-  ca.crt: {{ .Values.ui.custom_certs.ca }}
-  tls.crt: {{ .Values.ui.custom_certs.crt }}
-  tls.key: {{ .Values.ui.custom_certs.key }}
-{{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/configmap-ui-conf.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/configmap-ui-conf.yaml
deleted file mode 100644
index ac96e8b..0000000
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/configmap-ui-conf.yaml
+++ /dev/null
@@ -1,235 +0,0 @@
-{{- /*
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-*/ -}}
-
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: {{ include "dlab-ui.fullname" . }}-ui-conf
-data:
-  ssn.yml: |
-    <#assign LOG_ROOT_DIR="/var/opt/dlab/log">
-    <#assign KEYS_DIR="/root/keys">
-    <#assign KEY_STORE_PATH="/root/keys/ssn.keystore.jks">
-    <#assign KEY_STORE_PASSWORD="${SSN_KEYSTORE_PASSWORD}">
-    <#assign TRUST_STORE_PATH="/usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts">
-    <#assign TRUST_STORE_PASSWORD="changeit">
-
-    # Available options are aws, azure, gcp
-    <#assign CLOUD_TYPE="gcp">
-    cloudProvider: ${CLOUD_TYPE}
-
-    #Switch on/off developer mode here
-    <#assign DEV_MODE="false">
-    devMode: ${DEV_MODE}
-
-    mongo:
-      host: {{ .Values.ui.mongo.host }}
-      port: {{ .Values.ui.mongo.port }}
-      username: {{ .Values.ui.mongo.username }}
-      password: ${MONGO_DB_PASSWORD}
-      database: {{ .Values.ui.mongo.db_name }}
-
-    selfService:
-      protocol: https
-      host: localhost
-      port: {{ .Values.ui.service.https_port }}
-      jerseyClient:
-        timeout: 3s
-        connectionTimeout: 3s
-
-    securityService:
-      protocol: https
-      host: localhost
-      port: 8090
-      jerseyClient:
-        timeout: 20s
-        connectionTimeout: 20s
-
-    provisioningService:
-      jerseyClient:
-        timeout: 3s
-        connectionTimeout: 3s
-
-    # Log out user on inactivity
-    inactiveUserTimeoutMillSec: 7200000
-
-  self-service.yml: |
-    <#include "/root/ssn.yml">
-
-    <#if CLOUD_TYPE == "aws">
-    # Minimum and maximum number of slave EMR instances than could be created
-    minEmrInstanceCount: 2
-    maxEmrInstanceCount: 14
-    # Minimum and maximum percentage cost for slave EMR spot instances biding
-    minEmrSpotInstanceBidPct: 20
-    maxEmrSpotInstanceBidPct: 90
-    </#if>
-
-    <#if CLOUD_TYPE == "gcp">
-    # Maximum length for gcp user name (due to gcp restrictions)
-    maxUserNameLength: 10
-    # Minimum and maximum number of slave Dataproc instances that could be created
-    minInstanceCount: 3
-    maxInstanceCount: 15
-    minDataprocPreemptibleCount: 0
-    gcpOuauth2AuthenticationEnabled: false
-    </#if>
-
-    # Boundaries for Spark cluster creation
-    minSparkInstanceCount: 2
-    maxSparkInstanceCount: 14
-
-    # Timeout for check the status of environment via provisioning service
-    checkEnvStatusTimeout: 5m
-
-    # Restrict access to DLab features using roles policy
-    rolePolicyEnabled: true
-    # Default access to DLab features using roles policy
-    roleDefaultAccess: true
-
-    # Set to true to enable the scheduler of billing report.
-    billingSchedulerEnabled: true
-    # Name of configuration file for billing report.
-    <#if DEV_MODE == "true">
-    billingConfFile: ${sys['user.dir']}/../billing/billing.yml
-    <#else>
-    billingConfFile: ${DLAB_CONF_DIR}/billing.yml
-    </#if>
-
-    <#if CLOUD_TYPE == "azure">
-    azureUseLdap: <LOGIN_USE_LDAP>
-    maxSessionDurabilityMilliseconds: 288000000
-    </#if>
-
-    serviceBaseName: {{ .Values.ui.service_base_name }}
-    os: {{ .Values.ui.os }}
-    server:
-      requestLog:
-        appenders:
-        - type: file
-          currentLogFilename: ${LOG_ROOT_DIR}/ssn/request-selfservice.log
-          archive: true
-          archivedLogFilenamePattern: ${LOG_ROOT_DIR}/ssn/request-selfservice-%d{yyyy-MM-dd}.log.gz
-          archivedFileCount: 10
-      rootPath: "/api"
-      applicationConnectors:
-      - type: http
-        port: {{ .Values.ui.service.http_port }}
-      - type: https
-        port: {{ .Values.ui.service.https_port }}
-        certAlias: ssn
-        validateCerts: false
-        keyStorePath: ${KEY_STORE_PATH}
-        keyStorePassword: ${KEY_STORE_PASSWORD}
-        trustStorePath: ${TRUST_STORE_PATH}
-        trustStorePassword: ${TRUST_STORE_PASSWORD}
-      adminConnectors:
-    #    - type: http
-    #      port: 8081
-      - type: https
-        port: 8444
-        certAlias: ssn
-        validateCerts: false
-        keyStorePath: ${KEY_STORE_PATH}
-        keyStorePassword: ${KEY_STORE_PASSWORD}
-        trustStorePath: ${TRUST_STORE_PATH}
-        trustStorePassword: ${TRUST_STORE_PASSWORD}
-
-    mongoMigrationEnabled: false
-
-    logging:
-      level: INFO
-      loggers:
-        com.epam: TRACE
-        com.novemberain: ERROR
-      appenders:
-      - type: console
-      - type: file
-        currentLogFilename: ${LOG_ROOT_DIR}/ssn/selfservice.log
-        archive: true
-        archivedLogFilenamePattern: ${LOG_ROOT_DIR}/ssn/selfservice-%d{yyyy-MM-dd}.log.gz
-        archivedFileCount: 10
-
-    mavenSearchService:
-      protocol: http
-      host: search.maven.org
-      port: 80
-      jerseyClient:
-        timeout: 5s
-        connectionTimeout: 5s
-
-    schedulers:
-      inactivity:
-        enabled: false
-        cron: "0 0 0/2 ? * * *"
-      startComputationalScheduler:
-        enabled: true
-        cron: "*/20 * * ? * * *"
-      stopComputationalScheduler:
-        enabled: true
-        cron: "*/20 * * ? * * *"
-      startExploratoryScheduler:
-        enabled: true
-        cron: "*/20 * * ? * * *"
-      stopExploratoryScheduler:
-        enabled: true
-        cron: "*/20 * * ? * * *"
-      terminateComputationalScheduler:
-        enabled: true
-        cron: "*/20 * * ? * * *"
-      checkQuoteScheduler:
-        enabled: true
-        cron: "0 0 * ? * * *"
-      checkUserQuoteScheduler:
-        enabled: false
-        cron: "0 0 * ? * * *"
-      checkProjectQuoteScheduler:
-        enabled: true
-        cron: "0 * * ? * * *"
-
-
-    guacamole:
-      connectionProtocol: ssh
-      serverPort: 4822
-      port: 22
-      username: dlab-user
-
-    keycloakConfiguration:
-      redirectUri: {{ .Values.ui.keycloak.redirect_uri }}
-      realm: {{ .Values.ui.keycloak.realm_name }}
-      bearer-only: true
-      auth-server-url: ${KEYCLOAK_AUTH_URL}
-      ssl-required: none
-      register-node-at-startup: true
-      register-node-period: 600
-      resource: {{ .Values.ui.keycloak.client_id }}
-      credentials:
-        secret: ${KEYCLOAK_CLIENT_SECRET}
-
-    jerseyClient:
-      minThreads: 1
-      maxThreads: 128
-      workQueueSize: 8
-      gzipEnabled: true
-      gzipEnabledForRequests: false
-      chunkedEncodingEnabled: true
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/deployment.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/deployment.yaml
deleted file mode 100644
index 03c469e..0000000
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/deployment.yaml
+++ /dev/null
@@ -1,107 +0,0 @@
-{{- /*
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-*/ -}}
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: {{ include "dlab-ui.fullname" . }}
-  labels:
-{{ include "dlab-ui.labels" . | indent 4 }}
-spec:
-  replicas: {{ .Values.replicaCount }}
-  selector:
-    matchLabels:
-      app.kubernetes.io/name: {{ include "dlab-ui.name" . }}
-      app.kubernetes.io/instance: {{ .Release.Name }}
-  template:
-    metadata:
-      labels:
-        app.kubernetes.io/name: {{ include "dlab-ui.name" . }}
-        app.kubernetes.io/instance: {{ .Release.Name }}
-    spec:
-      containers:
-        - name: {{ .Chart.Name }}
-          image: "{{ .Values.ui.image.repository }}:{{ .Values.ui.image.tag }}"
-          imagePullPolicy: {{ .Values.ui.image.pullPolicy }}
-          env:
-            - name: MONGO_DB_PASSWORD
-              valueFrom:
-                secretKeyRef:
-                  name: mongo-db-password
-                  key: password
-            - name: SSN_KEYSTORE_PASSWORD
-              valueFrom:
-                secretKeyRef:
-                  name: ssn-keystore-password
-                  key: password
-            - name: KEYCLOAK_CLIENT_SECRET
-              valueFrom:
-                secretKeyRef:
-                  name: keycloak-client-secret
-                  key: client_secret
-            - name: KEYCLOAK_AUTH_URL
-              value: {{ .Values.ui.keycloak.auth_server_url }}
-          ports:
-            - name: http
-              containerPort: 80
-              protocol: TCP
-          resources:
-            {{- toYaml .Values.resources | nindent 12 }}
-          volumeMounts:
-            - name: ui-conf
-              mountPath: /root/ssn.yml
-              subPath: ssn
-              readOnly: true
-            - name: ui-conf
-              mountPath: /root/self-service.yml
-              subPath: self-service
-              readOnly: true
-            - mountPath: "/root/step-certs"
-              name: ui-tls
-              readOnly: true
-      volumes:
-        - name: ui-conf
-          configMap:
-            name: {{ include "dlab-ui.fullname" . }}-ui-conf
-            defaultMode: 0644
-            items:
-              - key: ssn.yml
-                path: ssn
-              - key: self-service.yml
-                path: self-service
-        - name: ui-tls
-          secret:
-            secretName: {{ include "dlab-ui.fullname" . }}-tls
-
-      {{- with .Values.nodeSelector }}
-      nodeSelector:
-        {{- toYaml . | nindent 8 }}
-      {{- end }}
-    {{- with .Values.affinity }}
-      affinity:
-        {{- toYaml . | nindent 8 }}
-    {{- end }}
-    {{- with .Values.tolerations }}
-      tolerations:
-        {{- toYaml . | nindent 8 }}
-    {{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/ingress.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/ingress.yaml
deleted file mode 100644
index d53fb5e..0000000
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/templates/ingress.yaml
+++ /dev/null
@@ -1,57 +0,0 @@
-{{- /*
-# ******************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-*/ -}}
-
-{{- if .Values.ui.ingress.enabled -}}
-{{- $fullName := include "dlab-ui.fullname" . -}}
-{{ $servicePort := .Values.ui.service.http_port }}
-{{ $host := .Values.ui.ingress.host }}
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
-  name: {{ $fullName }}
-  labels:
-{{ include "dlab-ui.labels" . | indent 4 }}
-  annotations:
-{{- with .Values.ui.ingress.annotations }}
-{{ toYaml . | indent 4 }}
-  {{- end }}
-spec:
-{{- if .Values.ui.ingress.tls }}
-  tls:
-  {{- range .Values.ui.ingress.tls }}
-    - hosts:
-      {{- range .hosts }}
-        - {{ . | quote }}
-      {{- end }}
-      secretName: {{ .secretName }}
-  {{- end }}
-{{- end }}
-  rules:
-    - host: {{ $host }}
-      http:
-        paths:
-        - backend:
-            serviceName: {{ $fullName }}
-            servicePort: {{ $servicePort }}
-          path: /
-{{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/values.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/values.yaml
deleted file mode 100644
index 4f11f1b..0000000
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui-chart/values.yaml
+++ /dev/null
@@ -1,66 +0,0 @@
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-
-# Default values for dlab-ui.
-# This is a YAML-formatted file.
-# Declare variables to be passed into your templates.
-
-replicaCount: 1
-labels: {}
-namespace: ${namespace}
-
-ui:
-  service_base_name: ${service_base_name}
-  os: ${os}
-  image:
-    repository: epamdlab/ui
-    tag: '0.1-gcp'
-    pullPolicy: Always
-  service:
-    type: ClusterIP
-    #  port: 58443
-    http_port: 80
-    https_port: 443
-  ingress:
-    enabled: true
-    host: ${ssn_k8s_alb_dns_name}
-    annotations:
-      kubernetes.io/ingress.class: nginx
-      nginx.ingress.kubernetes.io/ssl-redirect: "true"
-      nginx.ingress.kubernetes.io/proxy-body-size: "50m"
-    tls:
-      - secretName: dlab-ui-tls
-  mongo:
-    host: ${mongo_service_name}
-    port: ${mongo_port}
-    username: ${mongo_user}
-    db_name: ${mongo_db_name}
-  keycloak:
-    auth_server_url: https://${ssn_k8s_alb_dns_name}/auth
-    redirect_uri: https://${ssn_k8s_alb_dns_name}/
-    realm_name: ${keycloak_realm_name}
-    client_id: ${keycloak_client_id}
-
-  custom_certs:
-    enabled: ${custom_certs_enabled}
-    crt: ${custom_certs_crt}
-    key: ${custom_certs_key}
-    ca: ${step_ca_crt}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui.tf
deleted file mode 100644
index b258a87..0000000
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/dlab-ui.tf
+++ /dev/null
@@ -1,70 +0,0 @@
-# *****************************************************************************
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# ******************************************************************************
-
-locals {
-    custom_certs_enabled = lower(var.custom_certs_enabled)
-    custom_cert_name     = local.custom_certs_enabled == "true" ? reverse(split("/", var.custom_cert_path))[0] : "None"
-    custom_key_name      = local.custom_certs_enabled == "true" ? reverse(split("/", var.custom_key_path))[0] : "None"
-    custom_cert          = local.custom_certs_enabled == "true" ? base64encode(file("/tmp/${local.custom_cert_name}")) : "None"
-    custom_key           = local.custom_certs_enabled == "true" ? base64encode(file("/tmp/${local.custom_key_name}")) : "None"
-    ui_host              = local.custom_certs_enabled == "true" ? var.custom_certs_host : "${var.service_base_name}-ssn.${var.domain}"
-}
-
-data "template_file" "dlab_ui_values" {
-  template = file("./modules/helm_charts/dlab-ui-chart/values.yaml")
-  vars     = {
-      mongo_db_name          = var.mongo_dbname
-      mongo_user             = var.mongo_db_username
-      mongo_port             = var.mongo_service_port
-      mongo_service_name     = var.mongo_service_name
-      ssn_k8s_alb_dns_name   = local.ui_host
-      service_base_name      = var.service_base_name
-      os                     = var.env_os
-      namespace              = kubernetes_namespace.dlab-namespace.metadata[0].name
-      custom_certs_enabled   = local.custom_certs_enabled
-      custom_certs_crt       = local.custom_cert
-      custom_certs_key       = local.custom_key
-      step_ca_crt            = lookup(data.external.step-ca-config-values.result, "rootCa")
-      keycloak_realm_name    = var.keycloak_realm_name
-      keycloak_client_id     = var.keycloak_client_id
-  }
-}
-
-resource "helm_release" "dlab_ui" {
-    name       = "dlab-ui"
-    chart      = "./modules/helm_charts/dlab-ui-chart"
-    depends_on = [helm_release.mongodb, kubernetes_secret.mongo_db_password_secret, null_resource.step_ca_issuer_delay,
-                  helm_release.external_dns]
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-    wait       = true
-
-    values     = [
-        data.template_file.dlab_ui_values.rendered
-    ]
-}
-
-data "kubernetes_service" "ui_service" {
-    metadata {
-        name       = helm_release.dlab_ui.name
-        namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-    }
-    depends_on = [helm_release.dlab_ui]
-}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/external-dns.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/external-dns.tf
index 3a00b4f..551bf14 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/external-dns.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/external-dns.tf
@@ -22,17 +22,17 @@
 data "template_file" "external_dns_values" {
     template = file("./modules/helm_charts/external-dns/values.yaml")
     vars     = {
-        namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-        project_id = var.project_id
+        namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+      project_id = var.project_id
         domain     = var.domain
     }
 }
 
 resource "helm_release" "external_dns" {
     name       = "external-dns"
-    chart      = "./modules/helm_charts/external-dns"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-    wait       = true
+  chart = "./modules/helm_charts/external-dns"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
     depends_on = [helm_release.nginx]
     values     = [
         data.template_file.external_dns_values.rendered
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/external-dns/templates/externaldns.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/external-dns/templates/externaldns.yaml
index a52bb2e..16ae005 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/external-dns/templates/externaldns.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/external-dns/templates/externaldns.yaml
@@ -79,4 +79,4 @@
         - --provider=google
         - --google-project={{ .Values.project_id }}
         - --registry=txt
-        - --txt-owner-id=dlab-kubernetes-cluster
\ No newline at end of file
+        - --txt-owner-id=datalab-kubernetes-cluster
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/configure_keycloak.sh b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/configure_keycloak.sh
index 309c37c..5dd2079 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/configure_keycloak.sh
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/configure_keycloak.sh
@@ -31,13 +31,13 @@
       }
       configure_keycloak () {
           # Create Realm
-          /opt/jboss/keycloak/bin/kcadm.sh create realms -s realm=${keycloak_realm_name} -s enabled=true -s loginTheme=dlab \
+          /opt/jboss/keycloak/bin/kcadm.sh create realms -s realm=${keycloak_realm_name} -s enabled=true -s loginTheme=datalab \
           -s sslRequired=none
           # Get realm ID
-          dlab_realm_id=$(/opt/jboss/keycloak/bin/kcadm.sh get realms/${keycloak_realm_name} | /usr/bin/jq -r '.id')
+          datalab_realm_id=$(/opt/jboss/keycloak/bin/kcadm.sh get realms/${keycloak_realm_name} | /usr/bin/jq -r '.id')
           # Create user federation
-          /opt/jboss/keycloak/bin/kcadm.sh create components -r ${keycloak_realm_name} -s name=dlab-ldap -s providerId=ldap \
-          -s providerType=org.keycloak.storage.UserStorageProvider -s parentId=$dlab_realm_id  -s 'config.priority=["1"]' \
+          /opt/jboss/keycloak/bin/kcadm.sh create components -r ${keycloak_realm_name} -s name=datalab-ldap -s providerId=ldap \
+          -s providerType=org.keycloak.storage.UserStorageProvider -s parentId=$datalab_realm_id  -s 'config.priority=["1"]' \
           -s 'config.fullSyncPeriod=["-1"]' -s 'config.changedSyncPeriod=["-1"]' -s 'config.cachePolicy=["DEFAULT"]' \
           -s config.evictionDay=[] -s config.evictionHour=[] -s config.evictionMinute=[] -s config.maxLifespan=[] -s \
           'config.batchSizeForSync=["1000"]' -s 'config.editMode=["READ_ONLY"]' -s 'config.syncRegistrations=["false"]' \
@@ -50,7 +50,7 @@
           -s 'config.useTruststoreSpi=["ldapsOnly"]' -s 'config.connectionPooling=["true"]' \
           -s 'config.pagination=["true"]' --server http://127.0.0.1:8080/auth
           # Get user federation ID
-          user_f_id=$(/opt/jboss/keycloak/bin/kcadm.sh get components -r ${keycloak_realm_name} --query name=dlab-ldap | /usr/bin/jq -er '.[].id')
+          user_f_id=$(/opt/jboss/keycloak/bin/kcadm.sh get components -r ${keycloak_realm_name} --query name=datalab-ldap | /usr/bin/jq -er '.[].id')
           # Create user federation email mapper
           /opt/jboss/keycloak/bin/kcadm.sh create components -r ${keycloak_realm_name} -s name=uid-attribute-to-email-mapper \
           -s providerId=user-attribute-ldap-mapper -s providerType=org.keycloak.storage.ldap.mappers.LDAPStorageMapper \
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/get_configmap_values.sh b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/get_configmap_values.sh
index 3085eb7..b0812c6 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/get_configmap_values.sh
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/get_configmap_values.sh
@@ -28,9 +28,9 @@
 
 gcloud auth activate-service-account --key-file "$creds_file_path"
 export KUBECONFIG=/tmp/config; gcloud beta container clusters get-credentials "$gke_name" --region "$region" --project "$project_id"
-ROOT_CA=$(kubectl get -o jsonpath="{.data['root_ca\.crt']}" configmaps/step-certificates-certs -ndlab | base64 | tr -d '\n')
-KID=$(kubectl get -o jsonpath="{.data['ca\.json']}" configmaps/step-certificates-config -ndlab | jq -r .authority.provisioners[].key.kid)
-KID_NAME=$(kubectl get -o jsonpath="{.data['ca\.json']}" configmaps/step-certificates-config -ndlab | jq -r .authority.provisioners[].name)
+ROOT_CA=$(kubectl get -o jsonpath="{.data['root_ca\.crt']}" configmaps/step-certificates-certs -ndatalab | base64 | tr -d '\n')
+KID=$(kubectl get -o jsonpath="{.data['ca\.json']}" configmaps/step-certificates-config -ndatalab | jq -r .authority.provisioners[].key.kid)
+KID_NAME=$(kubectl get -o jsonpath="{.data['ca\.json']}" configmaps/step-certificates-config -ndatalab | jq -r .authority.provisioners[].name)
 jq -n --arg rootCa "$ROOT_CA" --arg kid "$KID" --arg kidName "$KID_NAME" '{rootCa: $rootCa, kid: $kid, kidName: $kidName}'
 unset KUBECONFIG
 rm /tmp/config
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/keycloak_values.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/keycloak_values.yaml
index 569e4e7..382e253 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/keycloak_values.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/files/keycloak_values.yaml
@@ -35,6 +35,9 @@
     dbUser: ${mysql_user}
     dbPassword: "${mysql_user_password}"
 
+  cli:
+    enabled: false
+
   service:
     type: ClusterIP
     # nodePort: 31088
@@ -51,15 +54,14 @@
     tls:
       - hosts:
           - ${ssn_k8s_alb_dns_name}
-        secretName: dlab-ui-tls
+        secretName: datalab-ui-tls
 
   startupScripts:
     mystartup.sh: |
       ${configure_keycloak_file}
-
   extraInitContainers: |
     - name: theme-provider
-      image: epamdlab/ui-theme:0.1
+      image: epamdatalab/ui-theme:0.1
       imagePullPolicy: Always
       command:
         - sh
@@ -67,14 +69,13 @@
         - -c
         - |
           echo "Copying theme..."
-          cp -R /dlab/* /theme
+          cp -R /datalab/* /theme
       volumeMounts:
         - name: theme
           mountPath: /theme
   extraVolumeMounts: |
     - name: theme
-      mountPath: /opt/jboss/keycloak/themes/dlab
-
+      mountPath: /opt/jboss/keycloak/themes/datalab
   extraVolumes: |
     - name: theme
       emptyDir: {}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/Chart.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/Chart.yaml
new file mode 100644
index 0000000..7a6aaa7
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/Chart.yaml
@@ -0,0 +1,43 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+apiVersion: v1
+name: keycloak
+version: 7.0.0
+appVersion: 8.0.1
+description: Open Source Identity and Access Management For Modern Applications and Services
+keywords:
+  - sso
+  - idm
+  - openid connect
+  - saml
+  - kerberos
+  - ldap
+home: https://www.keycloak.org/
+icon: https://www.keycloak.org/resources/images/keycloak_logo_480x108.png
+sources:
+  - https://github.com/codecentric/helm-charts
+  - https://github.com/jboss-dockerfiles/keycloak
+maintainers:
+  - name: unguiculus
+    email: unguiculus@gmail.com
+  - name: thomasdarimont
+    email: thomas.darimont+github@gmail.com
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/ci/postgres-ha-values.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/ci/postgres-ha-values.yaml
new file mode 100644
index 0000000..f8e136b
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/ci/postgres-ha-values.yaml
@@ -0,0 +1,57 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+keycloak:
+  replicas: 2
+  password: keycloak
+
+  podLabels:
+    test-label: test-label-value
+  podAnnotations:
+    test-annotation: "test-annotation-value-{{ .Release.Name }}"
+    test-int-annotation: "12345"
+
+  startupScripts:
+    hello.sh: |
+      #!/bin/sh
+
+      echo '********************************************************************************'
+      echo '*                                                                              *'
+      echo '*                        Hello from my startup script!                         *'
+      echo '*                                                                              *'
+      echo '********************************************************************************'
+
+  lifecycleHooks: |
+    postStart:
+      exec:
+        command: ["/bin/sh", "-c", "echo 'Hello from lifecycle hook!'"]
+
+  persistence:
+    deployPostgres: true
+    dbVendor: postgres
+
+postgresql:
+  postgresqlPassword: keycloak
+  persistence:
+    enabled: true
+    storageClass: local-path
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/datasource.cli b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/datasource.cli
new file mode 100644
index 0000000..04c76d8
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/datasource.cli
@@ -0,0 +1,29 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+# Configure datasource to use explicit query timeout in seconds
+/subsystem=datasources/data-source=KeycloakDS/:write-attribute(name=query-timeout,value=${env.DB_QUERY_TIMEOUT:300})
+
+# Configure datasource to connection before use
+/subsystem=datasources/data-source=KeycloakDS/:write-attribute(name=validate-on-match,value=${env.DB_VALIDATE_ON_MATCH:true})
+
+# Configure datasource to try all other connections before failing
+/subsystem=datasources/data-source=KeycloakDS/:write-attribute(name=use-fast-fail,value=${env.DB_USE_CAST_FAIL:false})
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/ha.cli b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/ha.cli
new file mode 100644
index 0000000..662d9fa
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/ha.cli
@@ -0,0 +1,30 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:2})
+/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:2})
+/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:2})
+/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:2})
+/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:2})
+/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=owners, value=${env.CACHE_OWNERS:2})
+/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=owners, value=${env.CACHE_OWNERS:2})
+
+/subsystem=jgroups/channel=ee:write-attribute(name=stack, value=tcp)
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/logging.cli b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/logging.cli
new file mode 100644
index 0000000..343f7d0
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/logging.cli
@@ -0,0 +1,32 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+# Allow log level to be configured via environment variable
+/subsystem=logging/console-handler=CONSOLE:write-attribute(name=level, value=${env.WILDFLY_LOGLEVEL:INFO})
+/subsystem=logging/root-logger=ROOT:write-attribute(name=level, value=${env.WILDFLY_LOGLEVEL:INFO})
+
+# Add dedicated eventsListener config element to allow configuring elements.
+/subsystem=keycloak-server/spi=eventsListener:add()
+/subsystem=keycloak-server/spi=eventsListener/provider=jboss-logging:add(enabled=true)
+
+# Propagate success events to INFO instead of DEBUG, to expose successful logins for log analysis
+/subsystem=keycloak-server/spi=eventsListener/provider=jboss-logging:write-attribute(name=properties.success-level,value=info)
+/subsystem=keycloak-server/spi=eventsListener/provider=jboss-logging:write-attribute(name=properties.error-level,value=warn)
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/node-identifier.cli b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/node-identifier.cli
new file mode 100644
index 0000000..1d4f0e2
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/scripts/node-identifier.cli
@@ -0,0 +1,24 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+## Sets the node identifier to the node name (= pod name). Node identifiers have to be unique. They can have a
+## maximum length of 23 characters. Thus, the chart's fullname template truncates its length accordingly.
+/subsystem=transactions:write-attribute(name=node-identifier, value=${jboss.node.name})
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/NOTES.txt b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/NOTES.txt
new file mode 100644
index 0000000..4d88d39
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/NOTES.txt
@@ -0,0 +1,69 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+Keycloak can be accessed:
+
+* Within your cluster, at the following DNS name at port {{ .Values.keycloak.service.httpPort }}:
+
+  {{ include "keycloak.fullname" . }}-http.{{ .Release.Namespace }}.svc.cluster.local
+
+{{- if .Values.keycloak.ingress.enabled }}
+
+* From outside the cluster:
+
+{{- range .Values.keycloak.ingress.hosts }}
+  - http{{ if $.Values.keycloak.ingress.tls }}s{{ end }}://{{ . }}
+{{- end }}
+
+{{- else }}
+
+* From outside the cluster, run these commands in the same shell:
+
+{{- if contains "NodePort" .Values.keycloak.service.type }}
+
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "keycloak.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+
+{{- else if contains "LoadBalancer" .Values.keycloak.service.type }}
+
+  NOTE:
+  It may take a few minutes for the LoadBalancer IP to be available.
+  You can watch the status of by running 'kubectl get svc -w {{ include "keycloak.fullname" . }}'
+
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "keycloak.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.keycloak.service.httpPort }}
+
+{{- else if contains "ClusterIP" .Values.keycloak.service.type }}
+
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l app.kubernetes.io/instance={{ .Release.Name }} -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use Keycloak"
+  kubectl port-forward --namespace {{ .Release.Namespace }} $POD_NAME 8080
+
+{{- end }}
+
+{{- end }}
+
+Login with the following credentials:
+Username: {{ .Values.keycloak.username }}
+
+To retrieve the initial user password run:
+kubectl get secret --namespace {{ .Release.Namespace }} {{ include "keycloak.fullname" . }}-http -o jsonpath="{.data.password}" | base64 --decode; echo
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/_helpers.tpl b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/_helpers.tpl
new file mode 100644
index 0000000..f1f6429
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/_helpers.tpl
@@ -0,0 +1,211 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "keycloak.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate to 20 characters because this is used to set the node identifier in WildFly which is limited to
+23 characters. This allows for a replica suffix for up to 99 replicas.
+*/}}
+{{- define "keycloak.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 20 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 20 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 20 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create the service DNS name.
+*/}}
+{{- define "keycloak.serviceDnsName" -}}
+{{ include "keycloak.fullname" . }}-headless.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "keycloak.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+{{/*
+Create common labels.
+*/}}
+{{- define "keycloak.commonLabels" -}}
+app.kubernetes.io/name: {{ include "keycloak.name" . }}
+helm.sh/chart: {{ include "keycloak.chart" . }}
+app.kubernetes.io/instance: {{ .Release.Name | quote }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Create selector labels.
+*/}}
+{{- define "keycloak.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "keycloak.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name | quote }}
+{{- end -}}
+
+{{/*
+Create name of the service account to use
+*/}}
+{{- define "keycloak.serviceAccountName" -}}
+{{- if .Values.keycloak.serviceAccount.create -}}
+    {{ default (include "keycloak.fullname" .) .Values.keycloak.serviceAccount.name }}
+{{- else -}}
+    {{ default "default" .Values.keycloak.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name for the postgres requirement.
+*/}}
+{{- define "keycloak.postgresql.fullname" -}}
+{{- $postgresContext := dict "Values" .Values.postgresql "Release" .Release "Chart" (dict "Name" "postgresql") -}}
+{{ include "postgresql.fullname" $postgresContext }}
+{{- end -}}
+
+{{/*
+Create the name for the Keycloak secret.
+*/}}
+{{- define "keycloak.secret" -}}
+{{- if .Values.keycloak.existingSecret -}}
+  {{- tpl .Values.keycloak.existingSecret $ -}}
+{{- else -}}
+  {{- include "keycloak.fullname" . -}}-http
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create the name for the database secret.
+*/}}
+{{- define "keycloak.dbSecretName" -}}
+{{- if .Values.keycloak.persistence.existingSecret -}}
+  {{- tpl .Values.keycloak.persistence.existingSecret $ -}}
+{{- else -}}
+  {{- include "keycloak.fullname" . -}}-db
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create the Keycloak password.
+*/}}
+{{- define "keycloak.password" -}}
+{{- if .Values.keycloak.password -}}
+  {{- .Values.keycloak.password | b64enc | quote -}}
+{{- else -}}
+  {{- randAlphaNum 16 | b64enc | quote -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create the name for the password secret key.
+*/}}
+{{- define "keycloak.passwordKey" -}}
+{{- if .Values.keycloak.existingSecret -}}
+  {{- .Values.keycloak.existingSecretKey -}}
+{{- else -}}
+  password
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create the name for the database password secret key.
+*/}}
+{{- define "keycloak.dbPasswordKey" -}}
+{{- if and .Values.keycloak.persistence.existingSecret .Values.keycloak.persistence.existingSecretPasswordKey -}}
+  {{- .Values.keycloak.persistence.existingSecretPasswordKey -}}
+{{- else -}}
+  password
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create the name for the database password secret key - if it is defined.
+*/}}
+{{- define "keycloak.dbUserKey" -}}
+{{- if and .Values.keycloak.persistence.existingSecret .Values.keycloak.persistence.existingSecretUsernameKey -}}
+  {{- .Values.keycloak.persistence.existingSecretUsernameKey -}}
+{{- else -}}
+  username
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create environment variables for database configuration.
+*/}}
+{{- define "keycloak.dbEnvVars" -}}
+{{- if .Values.keycloak.persistence.deployPostgres }}
+{{- if not (eq "postgres" .Values.keycloak.persistence.dbVendor) }}
+{{ fail (printf "ERROR: 'Setting keycloak.persistence.deployPostgres' to 'true' requires setting 'keycloak.persistence.dbVendor' to 'postgres' (is: '%s')!" .Values.keycloak.persistence.dbVendor) }}
+{{- end }}
+- name: DB_VENDOR
+  value: postgres
+- name: DB_ADDR
+  value: {{ include "keycloak.postgresql.fullname" . }}
+- name: DB_PORT
+  value: "5432"
+- name: DB_DATABASE
+  value: {{ .Values.postgresql.postgresqlDatabase | quote }}
+- name: DB_USER
+  value: {{ .Values.postgresql.postgresqlUsername | quote }}
+- name: DB_PASSWORD
+  valueFrom:
+    secretKeyRef:
+      name: {{ include "keycloak.postgresql.fullname" . }}
+      key: postgresql-password
+{{- else }}
+- name: DB_VENDOR
+  value: {{ .Values.keycloak.persistence.dbVendor | quote }}
+{{- if not (eq "h2" .Values.keycloak.persistence.dbVendor) }}
+- name: DB_ADDR
+  value: {{ .Values.keycloak.persistence.dbHost | quote }}
+- name: DB_PORT
+  value: {{ .Values.keycloak.persistence.dbPort | quote }}
+- name: DB_DATABASE
+  value: {{ .Values.keycloak.persistence.dbName | quote }}
+- name: DB_USER
+  valueFrom:
+    secretKeyRef:
+      name: {{ include "keycloak.dbSecretName" . }}
+      key: {{ include "keycloak.dbUserKey" . | quote }}
+- name: DB_PASSWORD
+  valueFrom:
+    secretKeyRef:
+      name: {{ include "keycloak.dbSecretName" . }}
+      key: {{ include "keycloak.dbPasswordKey" . | quote }}
+{{- end }}
+{{- end }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/configmap-sh.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/configmap-sh.yaml
new file mode 100644
index 0000000..a0bde91
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/configmap-sh.yaml
@@ -0,0 +1,38 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- $highAvailability := gt (int .Values.keycloak.replicas) 1 -}}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "keycloak.fullname" . }}-sh
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+data:
+  keycloak.sh: |
+    #!/usr/bin/env bash
+
+    set -o errexit
+    set -o nounset
+
+    exec /opt/jboss/tools/docker-entrypoint.sh -b 0.0.0.0 {{ .Values.keycloak.extraArgs }}{{- if $highAvailability }} -c standalone-ha.xml{{ else }} -c standalone.xml{{ end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/configmap-startup.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/configmap-startup.yaml
new file mode 100644
index 0000000..4bfa2a0
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/configmap-startup.yaml
@@ -0,0 +1,69 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if or .Values.keycloak.cli.enabled .Values.keycloak.startupScripts -}}
+{{- $highAvailability := gt (int .Values.keycloak.replicas) 1 -}}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "keycloak.fullname" . }}-startup
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+data:
+  keycloak.cli: |
+    embed-server {{- if $highAvailability }} --server-config=standalone-ha.xml{{ end }} --std-out=echo
+    batch
+
+  {{- if ne .Values.keycloak.basepath "auth" }}
+    # Changes the base path to be /keycloak.basepath instead of /auth
+    /subsystem=keycloak-server:write-attribute(name=web-context,value={{ if eq .Values.keycloak.basepath "" }}ROOT{{ else }}{{ .Values.keycloak.basepath }}{{ end }})
+    {{- if eq .Values.keycloak.basepath "" }}
+    /subsystem=undertow/server=default-server/host=default-host:write-attribute(name=default-web-module,value=keycloak-server.war)
+    {{- end }}
+  {{ end }}
+
+  {{- with .Values.keycloak.cli }}
+
+    {{- tpl .nodeIdentifier $ | nindent 4 }}
+
+    {{- tpl .logging $ | nindent 4 }}
+
+    {{- tpl .datasource $ | nindent 4 }}
+
+    {{- if $highAvailability }}
+      {{- tpl .ha $ | nindent 4 }}
+    {{- end }}
+
+    {{- with .custom }}
+      {{- tpl . $ | nindent 4 }}
+    {{- end }}
+
+  {{- end }}
+
+    run-batch
+    stop-embedded-server
+
+{{- with .Values.keycloak.startupScripts }}
+  {{- toYaml . | nindent 2 }}
+{{- end }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/ingress.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/ingress.yaml
new file mode 100644
index 0000000..6e18bc3
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/ingress.yaml
@@ -0,0 +1,60 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- $ingress := .Values.keycloak.ingress -}}
+{{- if $ingress.enabled -}}
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+  name: {{ include "keycloak.fullname" . }}
+  {{- with $ingress.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+    {{- with $ingress.labels }}
+    {{- toYaml . | nindent 4 }}
+    {{- end }}
+spec:
+{{- if $ingress.tls }}
+  tls:
+  {{- range $ingress.tls }}
+    - hosts:
+      {{- range .hosts }}
+        - {{ . | quote }}
+      {{- end }}
+      secretName: {{ .secretName }}
+  {{- end }}
+{{- end }}
+  rules:
+  {{- range $ingress.hosts }}
+    - host: {{ . }}
+      http:
+        paths:
+          - path: {{ $ingress.path }}
+            backend:
+              serviceName: {{ include "keycloak.fullname" $ }}-http
+              servicePort: http
+  {{- end }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/poddisruptionbudget.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/poddisruptionbudget.yaml
new file mode 100644
index 0000000..5ae4a80
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/poddisruptionbudget.yaml
@@ -0,0 +1,36 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.keycloak.podDisruptionBudget -}}
+apiVersion: policy/v1beta1
+kind: PodDisruptionBudget
+metadata:
+  name: {{ include "keycloak.fullname" . }}
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+spec:
+  selector:
+    matchLabels:
+      {{- include "keycloak.selectorLabels" . | nindent 6 }}
+  {{- toYaml .Values.keycloak.podDisruptionBudget | nindent 2 }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/prometheusrules.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/prometheusrules.yaml
new file mode 100644
index 0000000..3071dc3
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/prometheusrules.yaml
@@ -0,0 +1,37 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{ if and (.Values.prometheus.operator.prometheusRules.enabled) (.Values.prometheus.operator.prometheusRules.rules) }}
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+  name: {{ include "keycloak.fullname" . }}
+  labels:
+    {{- include "keycloak.selectorLabels" . | nindent 4 }}
+    {{- toYaml .Values.prometheus.operator.prometheusRules.selector | nindent 4 }}
+spec:
+  groups:
+  - name: {{ include "keycloak.fullname" . }}
+    rules:
+      {{- toYaml .Values.prometheus.operator.prometheusRules.rules | nindent 6 }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/route.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/route.yaml
new file mode 100644
index 0000000..7223d08
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/route.yaml
@@ -0,0 +1,55 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- $route := .Values.keycloak.route -}}
+{{- if $route.enabled -}}
+apiVersion: route.openshift.io/v1
+kind: Route
+metadata:
+  name: {{ include "keycloak.fullname" . }}
+  {{- with $route.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+    {{- with $route.labels }}
+    {{- toYaml . | nindent 4 }}
+    {{- end }}
+spec:
+{{- if $route.host }}
+  host: {{ $route.host }}
+{{- end }}
+  path: {{ $route.path }}
+  port:
+    targetPort: http
+  to:
+    kind: Service
+    name: {{ include "keycloak.fullname" $ }}-http
+    weight: 100
+  {{- if $route.tls.enabled }}
+  tls:
+    insecureEdgeTerminationPolicy: {{ $route.tls.insecureEdgeTerminationPolicy }}
+    termination: {{ $route.tls.termination }}
+  {{- end }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/secret-db.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/secret-db.yaml
new file mode 100644
index 0000000..854f6b8
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/secret-db.yaml
@@ -0,0 +1,35 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if and (not .Values.keycloak.persistence.deployPostgres) (not .Values.keycloak.persistence.existingSecret) -}}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "keycloak.fullname" . }}-db
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+type: Opaque
+data:
+  {{ include "keycloak.dbPasswordKey" . }}: {{ .Values.keycloak.persistence.dbPassword | b64enc | quote }}
+  {{ include "keycloak.dbUserKey" . }}: {{ .Values.keycloak.persistence.dbUser | b64enc | quote }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/secret-keycloak.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/secret-keycloak.yaml
new file mode 100644
index 0000000..aab4a91
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/secret-keycloak.yaml
@@ -0,0 +1,34 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if not .Values.keycloak.existingSecret -}}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "keycloak.fullname" . }}-http
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+type: Opaque
+data:
+  {{ include "keycloak.passwordKey" . }}: {{ include "keycloak.password" . }}
+{{- end}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/service-headless.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/service-headless.yaml
new file mode 100644
index 0000000..948962d
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/service-headless.yaml
@@ -0,0 +1,51 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- $highAvailability := gt (int .Values.keycloak.replicas) 1 -}}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "keycloak.fullname" . }}-headless
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+    service: headless
+spec:
+  type: ClusterIP
+  clusterIP: None
+  ports:
+    - name: http
+      port: {{ .Values.keycloak.service.httpPort }}
+      targetPort: http
+      protocol: TCP
+    - name: https
+      port: {{ .Values.keycloak.service.httpsPort }}
+      targetPort: https
+      protocol: TCP
+  {{- if $highAvailability }}
+    - name: jgroups
+      port: {{ .Values.keycloak.service.jgroupsPort }}
+      targetPort: jgroups
+      protocol: TCP
+  {{- end }}
+  selector:
+    {{- include "keycloak.selectorLabels" . | nindent 4 }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/service-http.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/service-http.yaml
new file mode 100644
index 0000000..f6c2c6a
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/service-http.yaml
@@ -0,0 +1,57 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- $service := .Values.keycloak.service -}}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "keycloak.fullname" . }}-http
+  {{- with $service.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+    {{- with $service.labels }}
+    {{- toYaml . | nindent 4 }}
+    {{- end }}
+    service: http
+spec:
+  type: {{ $service.type }}
+  ports:
+    - name: http
+      port: {{ $service.httpPort }}
+      targetPort: http
+    {{- if and (eq "NodePort" $service.type) $service.httpNodePort }}
+      nodePort: {{ $service.httpNodePort }}
+    {{- end }}
+      protocol: TCP
+    - name: https
+      port: {{ $service.httpsPort }}
+      targetPort: https
+    {{- if and (eq "NodePort" $service.type) $service.httpsNodePort }}
+      nodePort: {{ $service.httpsNodePort }}
+    {{- end }}
+      protocol: TCP
+  selector:
+    {{- include "keycloak.selectorLabels" . | nindent 4 }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/serviceaccount.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/serviceaccount.yaml
new file mode 100644
index 0000000..b2b9aa5
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/serviceaccount.yaml
@@ -0,0 +1,31 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.keycloak.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ include "keycloak.fullname" . }}
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/servicemonitor.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/servicemonitor.yaml
new file mode 100644
index 0000000..098f9e1
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/servicemonitor.yaml
@@ -0,0 +1,45 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{ if and .Values.prometheus.operator.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ include "keycloak.fullname" . }}
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+    {{- toYaml .Values.prometheus.operator.serviceMonitor.selector | nindent 4 }}
+spec:
+  selector:
+    matchLabels:
+      {{- include "keycloak.selectorLabels" . | nindent 6 }}
+      service: http
+  endpoints:
+    - port: http
+      path: {{ .Values.prometheus.operator.serviceMonitor.path }}
+      interval: {{ .Values.prometheus.operator.serviceMonitor.interval }}
+      {{- with .Values.prometheus.operator.serviceMonitor.scrapeTimeout }}
+      scrapeTimeout: {{ . }}
+      {{- end }}
+{{ end }}
+
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/statefulset.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/statefulset.yaml
new file mode 100644
index 0000000..120f663
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/statefulset.yaml
@@ -0,0 +1,201 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- $highAvailability := gt (int .Values.keycloak.replicas) 1 -}}
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+  name: {{ include "keycloak.fullname" . }}
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+spec:
+  selector:
+    matchLabels:
+      {{- include "keycloak.selectorLabels" . | nindent 6 }}
+  replicas: {{ .Values.keycloak.replicas }}
+  serviceName: {{ include "keycloak.fullname" . }}-headless
+  podManagementPolicy: Parallel
+  updateStrategy:
+    type: RollingUpdate
+  template:
+    metadata:
+      labels:
+        {{- include "keycloak.selectorLabels" . | nindent 8 }}
+        {{- with .Values.keycloak.podLabels }}
+        {{- toYaml . | nindent 8 }}
+        {{- end }}
+      annotations:
+        checksum/config-sh: {{ include (print .Template.BasePath "/configmap-sh.yaml") . | sha256sum }}
+        checksum/config-startup: {{ include (print .Template.BasePath "/configmap-startup.yaml") . | sha256sum }}
+        {{- with .Values.keycloak.podAnnotations }}
+        {{- range $key, $value := . }}
+        {{- printf "%s: %s" $key (tpl $value $ | quote) | nindent 8 }}
+        {{- end }}
+        {{- end }}
+    spec:
+      {{- with .Values.keycloak.hostAliases }}
+      hostAliases:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- if .Values.keycloak.enableServiceLinks }}
+      enableServiceLinks: {{ .Values.keycloak.enableServiceLinks }}
+      {{- end }}
+      restartPolicy: {{ .Values.keycloak.restartPolicy }}
+      serviceAccountName: {{ include "keycloak.serviceAccountName" . }}
+      securityContext:
+        {{- toYaml .Values.keycloak.securityContext | nindent 8 }}
+    {{- with .Values.keycloak.image.pullSecrets }}
+      imagePullSecrets:
+      {{- range . }}
+        - name: {{ . }}
+      {{- end }}
+    {{- end }}
+    {{- if or .Values.keycloak.persistence.deployPostgres .Values.keycloak.extraInitContainers }}
+      initContainers:
+      {{- if .Values.keycloak.persistence.deployPostgres }}
+        - name: wait-for-postgresql
+          image: "{{ .Values.init.image.repository }}:{{ .Values.init.image.tag }}"
+          imagePullPolicy: {{ .Values.init.image.pullPolicy }}
+          securityContext:
+            {{- toYaml .Values.keycloak.containerSecurityContext | nindent 12 }}
+          command:
+            - sh
+            - -c
+            - |
+              until printf "." && nc -z -w 2 {{ include "keycloak.postgresql.fullname" . }} {{ .Values.postgresql.service.port }}; do
+                  sleep 2;
+              done;
+
+              echo 'PostgreSQL OK ✓'
+          resources:
+            {{- toYaml .Values.init.resources | nindent 12 }}
+      {{- end }}
+      {{- with .Values.keycloak.extraInitContainers }}
+        {{- tpl . $ | nindent 8 }}
+      {{- end }}
+    {{- end }}
+      containers:
+        - name: {{ .Chart.Name }}
+          image: "{{ .Values.keycloak.image.repository }}:{{ .Values.keycloak.image.tag }}"
+          imagePullPolicy: {{ .Values.keycloak.image.pullPolicy }}
+          securityContext:
+            {{- toYaml .Values.keycloak.containerSecurityContext | nindent 12 }}
+          command:
+            - /scripts/keycloak.sh
+          {{- with .Values.keycloak.lifecycleHooks }}
+          lifecycle:
+            {{- tpl . $ | nindent 12 }}
+          {{- end }}
+          env:
+            - name: KEYCLOAK_USER
+              value: {{ .Values.keycloak.username }}
+            - name: KEYCLOAK_PASSWORD_FILE
+              value: /secrets/{{ include "keycloak.passwordKey" . }}
+          {{- if $highAvailability }}
+            - name: JGROUPS_DISCOVERY_PROTOCOL
+              value: {{ .Values.keycloak.jgroups.discoveryProtocol }}
+            - name: JGROUPS_DISCOVERY_PROPERTIES
+              value: {{ tpl .Values.keycloak.jgroups.discoveryProperties . }}
+            - name: KEYCLOAK_SERVICE_DNS_NAME
+              value: "{{ include "keycloak.serviceDnsName" . }}"
+          {{- end }}
+            {{- include "keycloak.dbEnvVars" . | nindent 12 }}
+          {{- with .Values.keycloak.extraEnv }}
+            {{- tpl . $ | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: sh
+              mountPath: /scripts
+              readOnly: true
+            - name: secrets
+              mountPath: /secrets
+              readOnly: true
+            {{- if or .Values.keycloak.cli.enabled .Values.keycloak.startupScripts }}
+            - name: startup
+              mountPath: /opt/jboss/startup-scripts
+              readOnly: true
+            {{- end }}
+            {{- with .Values.keycloak.extraVolumeMounts }}
+            {{- tpl . $ | nindent 12 }}
+            {{- end }}
+          ports:
+            - name: http
+              containerPort: 8080
+              protocol: TCP
+            - name: https
+              containerPort: 8443
+              protocol: TCP
+          {{- if $highAvailability }}
+            - name: jgroups
+              containerPort: 7600
+              protocol: TCP
+          {{- end }}
+          {{- with .Values.keycloak.extraPorts }}
+            {{- tpl . $ | nindent 12 }}
+          {{- end }}
+          {{- with .Values.keycloak.livenessProbe }}
+          livenessProbe:
+            {{- tpl . $ | nindent 12 }}
+          {{- end }}
+          {{- with .Values.keycloak.readinessProbe }}
+          readinessProbe:
+            {{- tpl . $ | nindent 12 }}
+          {{- end }}
+          resources:
+            {{- toYaml .Values.keycloak.resources | nindent 12 }}
+      {{- with .Values.keycloak.extraContainers }}
+        {{- tpl . $ | nindent 8 }}
+      {{- end }}
+      {{- with .Values.keycloak.affinity }}
+      affinity:
+        {{- tpl . $ | nindent 8 }}
+      {{- end }}
+      {{- with .Values.keycloak.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.keycloak.tolerations }}
+      tolerations:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.keycloak.priorityClassName }}
+      priorityClassName: {{ . }}
+      {{- end }}
+      terminationGracePeriodSeconds: 60
+      volumes:
+        - name: sh
+          configMap:
+            name: {{ include "keycloak.fullname" . }}-sh
+            defaultMode: 0555
+        - name: secrets
+          secret:
+            secretName: {{ include "keycloak.secret" . }}
+      {{- if or .Values.keycloak.cli.enabled .Values.keycloak.startupScripts }}
+        - name: startup
+          configMap:
+            name: {{ include "keycloak.fullname" . }}-startup
+            defaultMode: 0555
+      {{- end }}
+      {{- with .Values.keycloak.extraVolumes }}
+        {{- tpl . $ | nindent 8 }}
+      {{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/test/configmap-test.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/test/configmap-test.yaml
new file mode 100644
index 0000000..862f393
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/test/configmap-test.yaml
@@ -0,0 +1,77 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.test.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ include "keycloak.fullname" . }}-test
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+data:
+  test.py: |
+    import os
+    from selenium import webdriver
+    from selenium.webdriver.common.by import By
+    from selenium.webdriver.support.ui import WebDriverWait
+    from selenium.webdriver.support import expected_conditions
+    from urllib.parse import urlparse
+
+    print('Creating PhantomJS driver...')
+    driver = webdriver.PhantomJS(service_log_path='/tmp/ghostdriver.log')
+
+    base_url = 'http://{{ include "keycloak.fullname" . }}-http{{ if ne 80 (int .Values.keycloak.service.httpPort) }}:{{ .Values.keycloak.service.httpPort }}{{ end }}'
+
+    print('Opening Keycloak...')
+    driver.get('{0}/auth/admin/'.format(base_url))
+
+    username = os.environ['KEYCLOAK_USER']
+    password = os.environ['KEYCLOAK_PASSWORD']
+
+    username_input = WebDriverWait(driver, 30).until(expected_conditions.presence_of_element_located((By.ID, "username")))
+    password_input = WebDriverWait(driver, 30).until(expected_conditions.presence_of_element_located((By.ID, "password")))
+    login_button = WebDriverWait(driver, 30).until(expected_conditions.presence_of_element_located((By.ID, "kc-login")))
+
+    print('Entering username...')
+    username_input.send_keys(username)
+
+    print('Entering password...')
+    password_input.send_keys(password)
+
+    print('Clicking login button...')
+    login_button.click()
+
+    current_url = urlparse(driver.current_url)
+    expected_url = urlparse('{0}/auth/admin/master/console/'.format(base_url))
+
+    print('Current URL: {0}'.format(current_url))
+    print('Expected URL: {0}'.format(expected_url))
+
+    if current_url.path != expected_url.path:
+        print('Login failed. Current url is not expected url')
+        exit(1)
+
+    print('URLs match. Login successful.')
+
+    driver.quit()
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/test/pod-test.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/test/pod-test.yaml
new file mode 100644
index 0000000..b4c0f8c
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/templates/test/pod-test.yaml
@@ -0,0 +1,62 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.test.enabled }}
+apiVersion: v1
+kind: Pod
+metadata:
+  name: "{{ include "keycloak.fullname" . }}-test-{{ randAlphaNum 5 | lower }}"
+  labels:
+    {{- include "keycloak.commonLabels" . | nindent 4 }}
+    role: test
+  annotations:
+    "helm.sh/hook": test-success
+spec:
+  securityContext:
+    {{- toYaml .Values.test.securityContext | nindent 4 }}
+  containers:
+    - name: {{ .Chart.Name }}-test
+      image: "{{ .Values.test.image.repository }}:{{ .Values.test.image.tag }}"
+      imagePullPolicy: {{ .Values.test.image.pullPolicy }}
+      securityContext:
+        {{- toYaml .Values.test.containerSecurityContext | nindent 8 }}
+      command:
+        - python3
+        - /tests/test.py
+      env:
+        - name: KEYCLOAK_USER
+          value: {{ .Values.keycloak.username }}
+        - name: KEYCLOAK_PASSWORD
+          valueFrom:
+            secretKeyRef:
+              name: {{ include "keycloak.secret" . }}
+              key: {{ include "keycloak.passwordKey" . }}
+      volumeMounts:
+        - name: tests
+          mountPath: /tests
+  volumes:
+    - name: tests
+      configMap:
+        name: {{ include "keycloak.fullname" . }}-test
+  restartPolicy: Never
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/values.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/values.yaml
new file mode 100644
index 0000000..08bd36f
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak-chart/values.yaml
@@ -0,0 +1,389 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+init:
+  image:
+    repository: busybox
+    tag: 1.31
+    pullPolicy: IfNotPresent
+  resources: {}
+    # limits:
+    #   cpu: "10m"
+    #   memory: "32Mi"
+    # requests:
+    #   cpu: "10m"
+    #   memory: "32Mi"
+
+clusterDomain: cluster.local
+
+## Optionally override the fully qualified name
+# fullnameOverride: keycloak
+
+## Optionally override the name
+# nameOverride: keycloak
+
+keycloak:
+  replicas: 1
+
+  image:
+    repository: jboss/keycloak
+    tag: 8.0.1
+    pullPolicy: IfNotPresent
+
+    ## Optionally specify an array of imagePullSecrets.
+    ## Secrets must be manually created in the namespace.
+    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+    ##
+    pullSecrets: []
+    # - myRegistrKeySecretName
+
+  hostAliases: []
+  #  - ip: "1.2.3.4"
+  #    hostnames:
+  #      - "my.host.com"
+
+  enableServiceLinks: false
+
+  restartPolicy: Always
+
+  serviceAccount:
+    # Specifies whether a service account should be created
+    create: false
+    # The name of the service account to use.
+    # If not set and create is true, a name is generated using the fullname template
+    name:
+
+  securityContext:
+    fsGroup: 1000
+
+  containerSecurityContext:
+    runAsUser: 1000
+    runAsNonRoot: true
+
+  ## The path keycloak will be served from. To serve keycloak from the root path, use two quotes (e.g. "").
+  basepath: auth
+
+  ## Additional init containers, e. g. for providing custom themes
+  extraInitContainers: |
+
+  ## Additional sidecar containers, e. g. for a database proxy, such as Google's cloudsql-proxy
+  extraContainers: |
+
+  ## lifecycleHooks defines the container lifecycle hooks
+  lifecycleHooks: |
+    # postStart:
+    #   exec:
+    #     command: ["/bin/sh", "-c", "ls"]
+
+  ## Additional arguments to start command e.g. -Dkeycloak.import= to load a realm
+  extraArgs: ""
+
+  ## Username for the initial Keycloak admin user
+  username: ${keycloak_user}
+
+  ## Password for the initial Keycloak admin user. Applicable only if existingSecret is not set.
+  ## If not set, a random 10 characters password will be used
+  password: "${keycloak_password}"
+
+  # Specifies an existing secret to be used for the admin password
+  existingSecret: ""
+
+  # The key in the existing secret that stores the password
+  existingSecretKey: password
+
+  ## jGroups configuration (only for HA deployment)
+  jgroups:
+    discoveryProtocol: dns.DNS_PING
+    discoveryProperties: >
+      "dns_query={{ template "keycloak.fullname" . }}-headless.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}"
+
+  ## Allows the specification of additional environment variables for Keycloak
+  extraEnv: |
+    - name: PROXY_ADDRESS_FORWARDING
+      value: "true"
+    # - name: KEYCLOAK_LOGLEVEL
+    #   value: DEBUG
+    # - name: WILDFLY_LOGLEVEL
+    #   value: DEBUG
+    # - name: CACHE_OWNERS
+    #   value: "2"
+    # - name: DB_QUERY_TIMEOUT
+    #   value: "60"
+    # - name: DB_VALIDATE_ON_MATCH
+    #   value: true
+    # - name: DB_USE_CAST_FAIL
+    #   value: false
+
+  affinity: |
+    podAntiAffinity:
+      requiredDuringSchedulingIgnoredDuringExecution:
+        - labelSelector:
+            matchLabels:
+              {{- include "keycloak.selectorLabels" . | nindent 10 }}
+            matchExpressions:
+              - key: role
+                operator: NotIn
+                values:
+                  - test
+          topologyKey: kubernetes.io/hostname
+      preferredDuringSchedulingIgnoredDuringExecution:
+        - weight: 100
+          podAffinityTerm:
+            labelSelector:
+              matchLabels:
+                {{- include "keycloak.selectorLabels" . | nindent 12 }}
+              matchExpressions:
+                - key: role
+                  operator: NotIn
+                  values:
+                    - test
+            topologyKey: failure-domain.beta.kubernetes.io/zone
+
+  nodeSelector: {}
+  priorityClassName: ""
+  tolerations: []
+
+  ## Additional pod labels
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  podLabels: {}
+
+  ## Extra Annotations to be added to pod
+  podAnnotations: {}
+
+  livenessProbe: |
+    httpGet:
+      path: {{ if ne .Values.keycloak.basepath "" }}/{{ .Values.keycloak.basepath }}{{ end }}/
+      port: http
+    initialDelaySeconds: 300
+    timeoutSeconds: 5
+  readinessProbe: |
+    httpGet:
+      path: {{ if ne .Values.keycloak.basepath "" }}/{{ .Values.keycloak.basepath }}{{ end }}/realms/master
+      port: http
+    initialDelaySeconds: 30
+    timeoutSeconds: 1
+
+  resources: {}
+    # limits:
+    #   cpu: "100m"
+    #   memory: "1024Mi"
+    # requests:
+    #   cpu: "100m"
+    #   memory: "1024Mi"
+
+  ## WildFly CLI configurations. They all end up in the file 'keycloak.cli' configured in the configmap which is
+  ## executed on server startup.
+  cli:
+    enabled: false
+    nodeIdentifier: |
+      {{ .Files.Get "scripts/node-identifier.cli" }}
+
+    logging: |
+      {{ .Files.Get "scripts/logging.cli" }}
+
+    ha: |
+      {{ .Files.Get "scripts/ha.cli" }}
+
+    datasource: |
+      {{ .Files.Get "scripts/datasource.cli" }}
+
+    # Custom CLI script
+    custom: |
+
+  podDisruptionBudget: {}
+    # maxUnavailable: 1
+    # minAvailable: 1
+
+  service:
+    annotations: {}
+    # service.beta.kubernetes.io/aws-load-balancer-internal: "0.0.0.0/0"
+
+    labels: {}
+    # key: value
+
+    ## ServiceType
+    ## ref: https://kubernetes.io/docs/user-guide/services/#publishing-services---service-types
+    type: ClusterIP
+
+    ## Optional static port assignment for service type NodePort.
+    # nodePort: 30000
+
+    httpPort: 80
+    httpNodePort: ""
+
+    httpsPort: 8443
+    httpsNodePort: ""
+
+    # Optional: jGroups port for high availability clustering
+    jgroupsPort: 7600
+
+  ## Ingress configuration.
+  ## ref: https://kubernetes.io/docs/user-guide/ingress/
+  ingress:
+    enabled: true
+    annotations:
+      kubernetes.io/ingress.class: nginx
+      nginx.ingress.kubernetes.io/ssl-redirect: "true"
+      nginx.ingress.kubernetes.io/rewrite-target: /auth
+    path: /auth
+    hosts:
+      - ${ssn_k8s_alb_dns_name}
+    tls:
+      - hosts:
+          - ${ssn_k8s_alb_dns_name}
+        secretName: datalab-ui-tls
+
+  ## OpenShift route configuration.
+  ## ref: https://docs.openshift.com/container-platform/3.11/architecture/networking/routes.html
+  route:
+    enabled: false
+    path: /
+
+    annotations: {}
+      # kubernetes.io/tls-acme: "true"
+      # haproxy.router.openshift.io/disable_cookies: "true"
+      # haproxy.router.openshift.io/balance: roundrobin
+
+    labels: {}
+      # key: value
+
+    # Host name for the route
+    host:
+
+    # TLS configuration
+    tls:
+      enabled: true
+      insecureEdgeTerminationPolicy: Redirect
+      termination: edge
+
+  ## Persistence configuration
+  persistence:
+    dbVendor: mysql
+    dbName: ${mysql_db_name}
+    dbHost: keycloak-mysql
+    dbPort: 3306
+    dbUser: ${mysql_user}
+    dbPassword: "${mysql_user_password}"
+
+  startupScripts:
+    mystartup.sh: |
+      ${configure_keycloak_file}
+  extraInitContainers: |
+    - name: theme-provider
+      image: epamdlab/ui-theme:0.1
+      imagePullPolicy: Always
+      command:
+        - sh
+      args:
+        - -c
+        - |
+          echo "Copying theme..."
+          cp -R /datalab/* /theme
+      volumeMounts:
+        - name: theme
+          mountPath: /theme
+  extraVolumeMounts: |
+    - name: theme
+      mountPath: /opt/jboss/keycloak/themes/datalab
+  extraVolumes: |
+    - name: theme
+      emptyDir: {}
+
+postgresql:
+  ### PostgreSQL User to create.
+  ##
+  postgresqlUsername: keycloak
+
+  ## PostgreSQL Password for the new user.
+  ## If not set, a random 10 characters password will be used.
+  ##
+  postgresqlPassword: ""
+
+  ## PostgreSQL Database to create.
+  ##
+  postgresqlDatabase: keycloak
+
+  ## Persistent Volume Storage configuration.
+  ## ref: https://kubernetes.io/docs/user-guide/persistent-volumes
+  ##
+  persistence:
+    ## Enable PostgreSQL persistence using Persistent Volume Claims.
+    ##
+    enabled: false
+
+test:
+  enabled: false
+  image:
+    repository: unguiculus/docker-python3-phantomjs-selenium
+    tag: v1
+    pullPolicy: IfNotPresent
+  securityContext:
+    fsGroup: 1000
+  containerSecurityContext:
+    runAsUser: 1000
+    runAsNonRoot: true
+
+prometheus:
+  operator:
+    ## Are you using Prometheus Operator?
+    enabled: false
+
+    serviceMonitor:
+      ## Additional labels to add to the ServiceMonitor so it is picked up by the operator.
+      ## If using the [Helm Chart](https://github.com/helm/charts/tree/master/stable/prometheus-operator) this is the name of the Helm release.
+      selector:
+        release: prometheus
+
+      ## Interval at which Prometheus scrapes metrics
+      interval: 10s
+
+      ## Timeout at which Prometheus timeouts scrape run
+      scrapeTimeout: 10s
+
+      ## The path to scrape
+      path: /auth/realms/master/metrics
+
+    prometheusRules:
+      ## Add Prometheus Rules?
+      enabled: false
+
+      ## Additional labels to add to the PrometheusRule so it is picked up by the operator.
+      ## If using the [Helm Chart](https://github.com/helm/charts/tree/master/stable/prometheus-operator) this is the name of the Helm release and 'app: prometheus-operator'
+      selector:
+        app: prometheus-operator
+        release: prometheus
+
+      ## Some example rules.
+      rules: {}
+      #  - alert: keycloak-IngressHigh5xxRate
+      #    annotations:
+      #      message: The percentage of 5xx errors for keycloak over the last 5 minutes is over 1%.
+      #    expr: (sum(rate(nginx_ingress_controller_response_duration_seconds_count{exported_namespace="mynamespace",ingress="mynamespace-keycloak",status=~"5[0-9]{2}"}[1m]))/sum(rate(nginx_ingress_controller_response_duration_seconds_count{exported_namespace="mynamespace",ingress="mynamespace-keycloak"}[1m])))*100 > 1
+      #    for: 5m
+      #    labels:
+      #      severity: warning
+      #  - alert: keycloak-IngressHigh5xxRate
+      #    annotations:
+      #      message: The percentage of 5xx errors for keycloak over the last 5 minutes is over 5%.
+      #    expr: (sum(rate(nginx_ingress_controller_response_duration_seconds_count{exported_namespace="mynamespace",ingress="mynamespace-keycloak",status=~"5[0-9]{2}"}[1m]))/sum(rate(nginx_ingress_controller_response_duration_seconds_count{exported_namespace="mynamespace",ingress="mynamespace-keycloak"}[1m])))*100 > 5
+      #    for: 5m
+      #    labels:
+      #      severity: critical
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak.tf
index ebd6d11..d708e46 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/keycloak.tf
@@ -40,7 +40,7 @@
 }
 
 data "template_file" "keycloak_values" {
-  template = file("./modules/helm_charts/files/keycloak_values.yaml")
+  template = file("./modules/helm_charts/keycloak-chart/values.yaml")
   vars     = {
     keycloak_user           = var.keycloak_user
     keycloak_password       = random_string.keycloak_password.result
@@ -60,15 +60,17 @@
 
 resource "helm_release" "keycloak" {
   name       = "keycloak"
-  repository = data.helm_repository.codecentric.metadata.0.name
-  chart      = "codecentric/keycloak"
-  namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-  wait       = true
+  chart = "./modules/helm_charts/keycloak-chart"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
   timeout    = 600
 
   values     = [
     data.template_file.keycloak_values.rendered
   ]
-  depends_on = [helm_release.keycloak-mysql, kubernetes_secret.keycloak_password_secret, helm_release.nginx,
-                helm_release.dlab_ui]
+  depends_on = [
+    helm_release.keycloak-mysql,
+    kubernetes_secret.keycloak_password_secret,
+    helm_release.nginx,
+    helm_release.datalab_ui]
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/main.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/main.tf
index 300e729..9cbc2dc 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/main.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/main.tf
@@ -28,6 +28,7 @@
 data "google_client_config" "current" {}
 
 provider "helm" {
+  version = "0.10.6"
 
   kubernetes {
     host                   = data.google_container_cluster.ssn_k8s_gke_cluster.endpoint
@@ -36,11 +37,14 @@
     client_key             = base64decode(data.google_container_cluster.ssn_k8s_gke_cluster.master_auth.0.client_key)
     cluster_ca_certificate = base64decode(data.google_container_cluster.ssn_k8s_gke_cluster.master_auth.0.cluster_ca_certificate)
   }
+
   install_tiller = true
   service_account = kubernetes_service_account.tiller_sa.metadata.0.name
 }
 
 provider "kubernetes" {
+  version = "1.10.0"
+  load_config_file = false
   host = data.google_container_cluster.ssn_k8s_gke_cluster.endpoint
 
   client_certificate     = base64decode(data.google_container_cluster.ssn_k8s_gke_cluster.master_auth.0.client_certificate)
@@ -72,7 +76,7 @@
   }
 }
 
-resource "kubernetes_namespace" "dlab-namespace" {
+resource "kubernetes_namespace" "datalab-namespace" {
   metadata {
     annotations = {
       name = var.namespace_name
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongo.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongo.tf
index f8a020b..73075b2 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongo.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongo.tf
@@ -35,9 +35,9 @@
 
 resource "helm_release" "mongodb" {
     name       = "mongo-ha"
-    chart      = "stable/mongodb"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-    wait       = true
+    chart = "./modules/helm_charts/mongodb-chart"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
     values     = [
         data.template_file.mongo_values.rendered
     ]
@@ -47,8 +47,8 @@
 
 data "kubernetes_service" "mongo_service" {
     metadata {
-        name       = "${helm_release.mongodb.name}-mongodb"
-        namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+      name = "${helm_release.mongodb.name}-mongodb"
+      namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
     }
     depends_on = [helm_release.mongodb]
 }
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/.helmignore b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/.helmignore
new file mode 100644
index 0000000..bd4e028
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/.helmignore
@@ -0,0 +1,22 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+.git
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/Chart.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/Chart.yaml
new file mode 100644
index 0000000..2e8ba47
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/Chart.yaml
@@ -0,0 +1,40 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+apiVersion: v1
+appVersion: 4.2.4
+deprecated: true
+description: DEPRECATED NoSQL document-oriented database that stores JSON-like documents
+  with dynamic schemas, simplifying the integration of data in content-driven applications.
+engine: gotpl
+home: https://mongodb.org
+icon: https://bitnami.com/assets/stacks/mongodb/img/mongodb-stack-220x234.png
+keywords:
+- mongodb
+- database
+- nosql
+- cluster
+- replicaset
+- replication
+name: mongodb
+sources:
+- https://github.com/bitnami/bitnami-docker-mongodb
+version: 7.8.10
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/README.md b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/README.md
new file mode 100644
index 0000000..0d592d5
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/README.md
@@ -0,0 +1,336 @@
+# MongoDB
+
+[MongoDB](https://www.mongodb.com/) is a cross-platform document-oriented database. Classified as a NoSQL database, MongoDB eschews the traditional table-based relational database structure in favor of JSON-like documents with dynamic schemas, making the integration of data in certain types of applications easier and faster.
+
+## This Helm chart is deprecated
+
+Given the [`stable` deprecation timeline](https://github.com/helm/charts#deprecation-timeline), the Bitnami maintained MongoDB Helm chart is now located at [bitnami/charts](https://github.com/bitnami/charts/).
+
+The Bitnami repository is already included in the Hubs and we will continue providing the same cadence of updates, support, etc that we've been keeping here these years. Installation instructions are very similar, just adding the _bitnami_ repo and using it during the installation (`bitnami/<chart>` instead of `stable/<chart>`)
+
+```bash
+$ helm repo add bitnami https://charts.bitnami.com/bitnami
+$ helm install my-release bitnami/<chart>           # Helm 3
+$ helm install --name my-release bitnami/<chart>    # Helm 2
+```
+
+To update an exisiting _stable_ deployment with a chart hosted in the bitnami repository you can execute
+
+```bash
+$ helm repo add bitnami https://charts.bitnami.com/bitnami
+$ helm upgrade my-release bitnami/<chart>
+```
+
+Issues and PRs related to the chart itself will be redirected to `bitnami/charts` GitHub repository. In the same way, we'll be happy to answer questions related to this migration process in [this issue](https://github.com/helm/charts/issues/20969) created as a common place for discussion.
+
+## TL;DR;
+
+```bash
+$ helm install my-release stable/mongodb
+```
+
+## Introduction
+
+This chart bootstraps a [MongoDB](https://github.com/bitnami/bitnami-docker-mongodb) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
+
+Bitnami charts can be used with [Kubeapps](https://kubeapps.com/) for deployment and management of Helm Charts in clusters. This chart has been tested to work with NGINX Ingress, cert-manager, fluentd and Prometheus on top of the [BKPR](https://kubeprod.io/).
+
+## Prerequisites
+
+- Kubernetes 1.12+
+- Helm 2.11+ or Helm 3.0-beta3+
+- PV provisioner support in the underlying infrastructure
+- ReadWriteMany volumes for deployment scaling
+
+## Installing the Chart
+
+To install the chart with the release name `my-release`:
+
+```bash
+$ helm install my-release stable/mongodb
+```
+
+The command deploys MongoDB on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) section lists the parameters that can be configured during installation.
+
+> **Tip**: List all releases using `helm list`
+
+## Uninstalling the Chart
+
+To uninstall/delete the `my-release` deployment:
+
+```bash
+$ helm delete my-release
+```
+
+The command removes all the Kubernetes components associated with the chart and deletes the release.
+
+## Parameters
+
+The following table lists the configurable parameters of the MongoDB chart and their default values.
+
+| Parameter                                          | Description                                                                                                                                               | Default                                                  |
+|----------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------|
+| `global.imageRegistry`                             | Global Docker image registry                                                                                                                              | `nil`                                                    |
+| `global.imagePullSecrets`                          | Global Docker registry secret names as an array                                                                                                           | `[]` (does not add image pull secrets to deployed pods)  |
+| `global.storageClass`                              | Global storage class for dynamic provisioning                                                                                                             | `nil`                                                    |
+| `image.registry`                                   | MongoDB image registry                                                                                                                                    | `docker.io`                                              |
+| `image.repository`                                 | MongoDB Image name                                                                                                                                        | `bitnami/mongodb`                                        |
+| `image.tag`                                        | MongoDB Image tag                                                                                                                                         | `{TAG_NAME}`                                             |
+| `image.pullPolicy`                                 | Image pull policy                                                                                                                                         | `IfNotPresent`                                           |
+| `image.pullSecrets`                                | Specify docker-registry secret names as an array                                                                                                          | `[]` (does not add image pull secrets to deployed pods)  |
+| `image.debug`                                      | Specify if debug logs should be enabled                                                                                                                   | `false`                                                  |
+| `nameOverride`                                     | String to partially override mongodb.fullname template with a string (will prepend the release name)                                                      | `nil`                                                    |
+| `fullnameOverride`                                 | String to fully override mongodb.fullname template with a string                                                                                          | `nil`                                                    |
+| `volumePermissions.enabled`                        | Enable init container that changes volume permissions in the data directory (for cases where the default k8s `runAsUser` and `fsUser` values do not work) | `false`                                                  |
+| `volumePermissions.image.registry`                 | Init container volume-permissions image registry                                                                                                          | `docker.io`                                              |
+| `volumePermissions.image.repository`               | Init container volume-permissions image name                                                                                                              | `bitnami/minideb`                                        |
+| `volumePermissions.image.tag`                      | Init container volume-permissions image tag                                                                                                               | `buster`                                                 |
+| `volumePermissions.image.pullPolicy`               | Init container volume-permissions image pull policy                                                                                                       | `Always`                                                 |
+| `volumePermissions.resources`                      | Init container resource requests/limit                                                                                                                    | `nil`                                                    |
+| `clusterDomain`                                    | Default Kubernetes cluster domain                                                                                                                         | `cluster.local`                                          |
+| `usePassword`                                      | Enable password authentication                                                                                                                            | `true`                                                   |
+| `existingSecret`                                   | Existing secret with MongoDB credentials                                                                                                                  | `nil`                                                    |
+| `mongodbRootPassword`                              | MongoDB admin password                                                                                                                                    | `random alphanumeric string (10)`                        |
+| `mongodbUsername`                                  | MongoDB custom user (mandatory if `mongodbDatabase` is set)                                                                                               | `nil`                                                    |
+| `mongodbPassword`                                  | MongoDB custom user password                                                                                                                              | `random alphanumeric string (10)`                        |
+| `mongodbDatabase`                                  | Database to create                                                                                                                                        | `nil`                                                    |
+| `mongodbEnableIPv6`                                | Switch to enable/disable IPv6 on MongoDB                                                                                                                  | `false`                                                  |
+| `mongodbDirectoryPerDB`                            | Switch to enable/disable DirectoryPerDB on MongoDB                                                                                                        | `false`                                                  |
+| `mongodbSystemLogVerbosity`                        | MongoDB system log verbosity level                                                                                                                        | `0`                                                      |
+| `mongodbDisableSystemLog`                          | Whether to disable MongoDB system log or not                                                                                                              | `false`                                                  |
+| `mongodbExtraFlags`                                | MongoDB additional command line flags                                                                                                                     | `[]`                                                     |
+| `service.name`                                     | Kubernetes service name                                                                                                                                   | `nil`                                                    |
+| `service.annotations`                              | Kubernetes service annotations, evaluated as a template                                                                                                   | `{}`                                                     |
+| `service.type`                                     | Kubernetes Service type                                                                                                                                   | `ClusterIP`                                              |
+| `service.clusterIP`                                | Static clusterIP or None for headless services                                                                                                            | `nil`                                                    |
+| `service.port`                                     | MongoDB service port                                                                                                                                      | `27017`                                                  |
+| `service.nodePort`                                 | Port to bind to for NodePort service type                                                                                                                 | `nil`                                                    |
+| `service.loadBalancerIP`                           | Static IP Address to use for LoadBalancer service type                                                                                                    | `nil`                                                    |
+| `service.externalIPs`                              | External IP list to use with ClusterIP service type                                                                                                       | `[]`                                                     |
+| `service.loadBalancerSourceRanges`                 | List of IP ranges allowed access to load balancer (if supported)                                                                                          | `[]` (does not add IP range restrictions to the service) |
+| `replicaSet.enabled`                               | Switch to enable/disable replica set configuration                                                                                                        | `false`                                                  |
+| `replicaSet.name`                                  | Name of the replica set                                                                                                                                   | `rs0`                                                    |
+| `replicaSet.useHostnames`                          | Enable DNS hostnames in the replica set config                                                                                                            | `true`                                                   |
+| `replicaSet.key`                                   | Key used for authentication in the replica set                                                                                                            | `random alphanumeric string (10)`                        |
+| `replicaSet.replicas.secondary`                    | Number of secondary nodes in the replica set                                                                                                              | `1`                                                      |
+| `replicaSet.replicas.arbiter`                      | Number of arbiter nodes in the replica set                                                                                                                | `1`                                                      |
+| `replicaSet.pdb.enabled`                           | Switch to enable/disable Pod Disruption Budget                                                                                                            | `true`                                                   |
+| `replicaSet.pdb.minAvailable.secondary`            | PDB (min available) for the MongoDB Secondary nodes                                                                                                       | `1`                                                      |
+| `replicaSet.pdb.minAvailable.arbiter`              | PDB (min available) for the MongoDB Arbiter nodes                                                                                                         | `1`                                                      |
+| `replicaSet.pdb.maxUnavailable.secondary`          | PDB (max unavailable) for the MongoDB Secondary nodes                                                                                                     | `nil`                                                    |
+| `replicaSet.pdb.maxUnavailable.arbiter`            | PDB (max unavailable) for the MongoDB Arbiter nodes                                                                                                       | `nil`                                                    |
+| `annotations`                                      | Annotations to be added to the deployment or statefulsets                                                                                                 | `{}`                                                     |
+| `labels`                                           | Additional labels for the deployment or statefulsets                                                                                                      | `{}`                                                     |
+| `podAnnotations`                                   | Annotations to be added to pods                                                                                                                           | `{}`                                                     |
+| `podLabels`                                        | Additional labels for the pod(s).                                                                                                                         | `{}`                                                     |
+| `resources`                                        | Pod resources                                                                                                                                             | `{}`                                                     |
+| `resourcesArbiter`                                 | Pod resources for arbiter when replica set is enabled                                                                                                     | `{}`                                                     |
+| `priorityClassName`                                | Pod priority class name                                                                                                                                   | ``                                                       |
+| `extraEnvVars`                                     | Array containing extra env vars to be added to all pods in the cluster (evaluated as a template)                                                          | `nil`                                                    |
+| `nodeSelector`                                     | Node labels for pod assignment                                                                                                                            | `{}`                                                     |
+| `affinity`                                         | Affinity for pod assignment                                                                                                                               | `{}`                                                     |
+| `affinityArbiter`                                  | Affinity for arbiter pod assignment                                                                                                                       | `{}`                                                     |
+| `tolerations`                                      | Toleration labels for pod assignment                                                                                                                      | `{}`                                                     |
+| `updateStrategy`                                   | Statefulsets update strategy policy                                                                                                                       | `RollingUpdate`                                          |
+| `securityContext.enabled`                          | Enable security context                                                                                                                                   | `true`                                                   |
+| `securityContext.fsGroup`                          | Group ID for the container                                                                                                                                | `1001`                                                   |
+| `securityContext.runAsUser`                        | User ID for the container                                                                                                                                 | `1001`                                                   |
+| `schedulerName`                                    | Name of the k8s scheduler (other than default)                                                                                                            | `nil`                                                    |
+| `sidecars`                                         | Add additional containers to pod                                                                                                                          | `[]`                                                     |
+| `extraVolumes`                                     | Add additional volumes to deployment                                                                                                                      | `[]`                                                     |
+| `extraVolumeMounts`                                | Add additional volumes mounts to pod                                                                                                                      | `[]`                                                     |
+| `sidecarsArbiter`                                  | Add additional containers to arbiter pod                                                                                                                  | `[]`                                                     |
+| `extraVolumesArbiter`                              | Add additional volumes to arbiter deployment                                                                                                              | `[]`                                                     |
+| `extraVolumeMountsArbiter`                         | Add additional volumes mounts to arbiter pod                                                                                                              | `[]`                                                     |
+| `persistence.enabled`                              | Use a PVC to persist data                                                                                                                                 | `true`                                                   |
+| `persistence.mountPath`                            | Path to mount the volume at                                                                                                                               | `/bitnami/mongodb`                                       |
+| `persistence.subPath`                              | Subdirectory of the volume to mount at                                                                                                                    | `""`                                                     |
+| `persistence.storageClass`                         | Storage class of backing PVC                                                                                                                              | `nil` (uses alpha storage class annotation)              |
+| `persistence.accessModes`                          | Use volume as ReadOnly or ReadWrite                                                                                                                       | `[ReadWriteOnce]`                                        |
+| `persistence.size`                                 | Size of data volume                                                                                                                                       | `8Gi`                                                    |
+| `persistence.annotations`                          | Persistent Volume annotations                                                                                                                             | `{}`                                                     |
+| `persistence.existingClaim`                        | Name of an existing PVC to use (avoids creating one if this is given)                                                                                     | `nil`                                                    |
+| `useStatefulSet`                                   | Set to true to use StatefulSet instead of Deployment even when replicaSet.enalbed=false                                                                   | `nil`                                                    |
+| `extraInitContainers`                              | Additional init containers as a string to be passed to the `tpl` function                                                                                 | `{}`                                                     |
+| `livenessProbe.enabled`                            | Enable/disable the Liveness probe                                                                                                                         | `true`                                                   |
+| `livenessProbe.initialDelaySeconds`                | Delay before liveness probe is initiated                                                                                                                  | `30`                                                     |
+| `livenessProbe.periodSeconds`                      | How often to perform the probe                                                                                                                            | `10`                                                     |
+| `livenessProbe.timeoutSeconds`                     | When the probe times out                                                                                                                                  | `5`                                                      |
+| `livenessProbe.successThreshold`                   | Minimum consecutive successes for the probe to be considered successful after having failed.                                                              | `1`                                                      |
+| `livenessProbe.failureThreshold`                   | Minimum consecutive failures for the probe to be considered failed after having succeeded.                                                                | `6`                                                      |
+| `readinessProbe.enabled`                           | Enable/disable the Readiness probe                                                                                                                        | `true`                                                   |
+| `readinessProbe.initialDelaySeconds`               | Delay before readiness probe is initiated                                                                                                                 | `5`                                                      |
+| `readinessProbe.periodSeconds`                     | How often to perform the probe                                                                                                                            | `10`                                                     |
+| `readinessProbe.timeoutSeconds`                    | When the probe times out                                                                                                                                  | `5`                                                      |
+| `readinessProbe.failureThreshold`                  | Minimum consecutive failures for the probe to be considered failed after having succeeded.                                                                | `6`                                                      |
+| `readinessProbe.successThreshold`                  | Minimum consecutive successes for the probe to be considered successful after having failed.                                                              | `1`                                                      |
+| `initConfigMap.name`                               | Custom config map with init scripts                                                                                                                       | `nil`                                                    |
+| `configmap`                                        | MongoDB configuration file to be used                                                                                                                     | `nil`                                                    |
+| `ingress.enabled`                                  | Enable ingress controller resource                                                                                                                        | `false`                                                  |
+| `ingress.certManager`                              | Add annotations for cert-manager                                                                                                                          | `false`                                                  |
+| `ingress.annotations`                              | Ingress annotations                                                                                                                                       | `[]`                                                     |
+| `ingress.hosts[0].name`                            | Hostname to your MongoDB installation                                                                                                                     | `mongodb.local`                                          |
+| `ingress.hosts[0].path`                            | Path within the url structure                                                                                                                             | `/`                                                      |
+| `ingress.tls[0].hosts[0]`                          | TLS hosts                                                                                                                                                 | `mongodb.local`                                          |
+| `ingress.tls[0].secretName`                        | TLS Secret (certificates)                                                                                                                                 | `mongodb.local-tls`                                      |
+| `ingress.secrets[0].name`                          | TLS Secret Name                                                                                                                                           | `nil`                                                    |
+| `ingress.secrets[0].certificate`                   | TLS Secret Certificate                                                                                                                                    | `nil`                                                    |
+| `ingress.secrets[0].key`                           | TLS Secret Key                                                                                                                                            | `nil`                                                    |
+| `metrics.enabled`                                  | Start a side-car prometheus exporter                                                                                                                      | `false`                                                  |
+| `metrics.image.registry`                           | MongoDB exporter image registry                                                                                                                           | `docker.io`                                              |
+| `metrics.image.repository`                         | MongoDB exporter image name                                                                                                                               | `bitnami/mongodb-exporter`                               |
+| `metrics.image.tag`                                | MongoDB exporter image tag                                                                                                                                | `{TAG_NAME}`                                             |
+| `metrics.image.pullPolicy`                         | Image pull policy                                                                                                                                         | `Always`                                                 |
+| `metrics.image.pullSecrets`                        | Specify docker-registry secret names as an array                                                                                                          | `[]` (does not add image pull secrets to deployed pods)  |
+| `metrics.podAnnotations.prometheus.io/scrape`      | Additional annotations for Metrics exporter pod                                                                                                           | `true`                                                   |
+| `metrics.podAnnotations.prometheus.io/port`        | Additional annotations for Metrics exporter pod                                                                                                           | `"9216"`                                                 |
+| `metrics.extraArgs`                                | String with extra arguments for the MongoDB Exporter                                                                                                      | ``                                                       |
+| `metrics.resources`                                | Exporter resource requests/limit                                                                                                                          | `{}`                                                     |
+| `metrics.serviceMonitor.enabled`                   | Create ServiceMonitor Resource for scraping metrics using PrometheusOperator                                                                              | `false`                                                  |
+| `metrics.serviceMonitor.namespace`                 | Optional namespace which Prometheus is running in                                                                                                         | `nil`                                                    |
+| `metrics.serviceMonitor.additionalLabels`          | Used to pass Labels that are required by the Installed Prometheus Operator                                                                                | `{}`                                                     |
+| `metrics.serviceMonitor.relabellings`              | Specify Metric Relabellings to add to the scrape endpoint                                                                                                 | `nil`                                                    |
+| `metrics.serviceMonitor.alerting.rules`            | Define individual alerting rules as required                                                                                                              | `{}`                                                     |
+| `metrics.serviceMonitor.alerting.additionalLabels` | Used to pass Labels that are required by the Installed Prometheus Operator                                                                                | `{}`                                                     |
+| `metrics.livenessProbe.enabled`                    | Enable/disable the Liveness Check of Prometheus metrics exporter                                                                                          | `false`                                                  |
+| `metrics.livenessProbe.initialDelaySeconds`        | Initial Delay for Liveness Check of Prometheus metrics exporter                                                                                           | `15`                                                     |
+| `metrics.livenessProbe.periodSeconds`              | How often to perform Liveness Check of Prometheus metrics exporter                                                                                        | `5`                                                      |
+| `metrics.livenessProbe.timeoutSeconds`             | Timeout for Liveness Check of Prometheus metrics exporter                                                                                                 | `5`                                                      |
+| `metrics.livenessProbe.failureThreshold`           | Failure Threshold for Liveness Check of Prometheus metrics exporter                                                                                       | `3`                                                      |
+| `metrics.livenessProbe.successThreshold`           | Success Threshold for Liveness Check of Prometheus metrics exporter                                                                                       | `1`                                                      |
+| `metrics.readinessProbe.enabled`                   | Enable/disable the Readiness Check of Prometheus metrics exporter                                                                                         | `false`                                                  |
+| `metrics.readinessProbe.initialDelaySeconds`       | Initial Delay for Readiness Check of Prometheus metrics exporter                                                                                          | `5`                                                      |
+| `metrics.readinessProbe.periodSeconds`             | How often to perform Readiness Check of Prometheus metrics exporter                                                                                       | `5`                                                      |
+| `metrics.readinessProbe.timeoutSeconds`            | Timeout for Readiness Check of Prometheus metrics exporter                                                                                                | `1`                                                      |
+| `metrics.readinessProbe.failureThreshold`          | Failure Threshold for Readiness Check of Prometheus metrics exporter                                                                                      | `3`                                                      |
+| `metrics.readinessProbe.successThreshold`          | Success Threshold for Readiness Check of Prometheus metrics exporter                                                                                      | `1`                                                      |
+
+
+Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
+
+```bash
+$ helm install my-release \
+  --set mongodbRootPassword=secretpassword,mongodbUsername=my-user,mongodbPassword=my-password,mongodbDatabase=my-database \
+    stable/mongodb
+```
+
+The above command sets the MongoDB `root` account password to `secretpassword`. Additionally, it creates a standard database user named `my-user`, with the password `my-password`, who has access to a database named `my-database`.
+
+Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
+
+```bash
+$ helm install my-release -f values.yaml stable/mongodb
+```
+
+> **Tip**: You can use the default [values.yaml](values.yaml)
+
+## Configuration and installation details
+
+### [Rolling VS Immutable tags](https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/)
+
+It is strongly recommended to use immutable tags in a production environment. This ensures your deployment does not change automatically if the same tag is updated with a different image.
+
+Bitnami will release a new chart updating its containers if a new version of the main container, significant changes, or critical vulnerabilities exist.
+
+### Production configuration and horizontal scaling
+
+This chart includes a `values-production.yaml` file where you can find some parameters oriented to production configuration in comparison to the regular `values.yaml`. You can use this file instead of the default one.
+
+- Switch to enable/disable replica set configuration:
+```diff
+- replicaSet.enabled: false
++ replicaSet.enabled: true
+```
+
+- Start a side-car prometheus exporter:
+```diff
+- metrics.enabled: false
++ metrics.enabled: true
+```
+
+- Enable/disable the Liveness Check of Prometheus metrics exporter:
+```diff
+- metrics.livenessProbe.enabled: false
++ metrics.livenessProbe.enabled: true
+```
+
+- Enable/disable the Readiness Check of Prometheus metrics exporter:
+```diff
+- metrics.readinessProbe.enabled: false
++ metrics.readinessProbe.enabled: true
+```
+
+To horizontally scale this chart, you can use the `--replicas` flag to modify the number of secondary nodes in your MongoDB replica set.
+
+### Replication
+
+You can start the MongoDB chart in replica set mode with the following parameter: `replicaSet.enabled=true`
+
+Some characteristics of this chart are:
+
+- Each of the participants in the replication has a fixed stateful set so you always know where to find the primary, secondary or arbiter nodes.
+- The number of secondary and arbiter nodes can be scaled out independently.
+- Easy to move an application from using a standalone MongoDB server to use a replica set.
+
+### Initialize a fresh instance
+
+The [Bitnami MongoDB](https://github.com/bitnami/bitnami-docker-mongodb) image allows you to use your custom scripts to initialize a fresh instance. In order to execute the scripts, they must be located inside the chart folder `files/docker-entrypoint-initdb.d` so they can be consumed as a ConfigMap.
+Also you can create a custom config map and give it via `initConfigMap`(check options for more details).
+
+The allowed extensions are `.sh`, and `.js`.
+
+## Persistence
+
+The [Bitnami MongoDB](https://github.com/bitnami/bitnami-docker-mongodb) image stores the MongoDB data and configurations at the `/bitnami/mongodb` path of the container.
+
+The chart mounts a [Persistent Volume](http://kubernetes.io/docs/user-guide/persistent-volumes/) at this location. The volume is created using dynamic volume provisioning.
+
+### Adjust permissions of persistent volume mountpoint
+
+As the image run as non-root by default, it is necessary to adjust the ownership of the persistent volume so that the container can write data into it.
+
+By default, the chart is configured to use Kubernetes Security Context to automatically change the ownership of the volume. However, this feature does not work in all Kubernetes distributions.
+As an alternative, this chart supports using an initContainer to change the ownership of the volume before mounting it in the final destination.
+
+You can enable this initContainer by setting `volumePermissions.enabled` to `true`.
+
+## Upgrading
+
+### To 7.0.0
+From this version, the way of setting the ingress rules has changed. Instead of using `ingress.paths` and `ingress.hosts` as separate objects, you should now define the rules as objects inside the `ingress.hosts` value, for example:
+
+```yaml
+ingress:
+  hosts:
+  - name: mongodb.local
+    path: /
+```
+
+### To 6.0.0
+
+From this version, `mongodbEnableIPv6` is set to `false` by default in order to work properly in most k8s clusters, if you want to use IPv6 support, you need to set this variable to `true` by adding `--set mongodbEnableIPv6=true` to your `helm` command.
+You can find more information in the [`bitnami/mongodb` image README](https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md).
+
+### To 5.0.0
+
+When enabling replicaset configuration, backwards compatibility is not guaranteed unless you modify the labels used on the chart's statefulsets.
+Use the workaround below to upgrade from versions previous to 5.0.0. The following example assumes that the release name is `my-release`:
+
+```console
+$ kubectl delete statefulset my-release-mongodb-arbiter my-release-mongodb-primary my-release-mongodb-secondary --cascade=false
+```
+
+## Configure Ingress
+MongoDB can exposed externally using an Ingress controller. To do so, it's necessary to:
+
+- Install the MongoDB chart setting the parameter `ingress.enabled=true`.
+- Create a ConfigMap to map the external port to use and the internal service/port where to redirect the requests (see https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/exposing-tcp-udp-services.md for more information).
+
+For instance, if you installed the MongoDB chart in the `default` namespace, you can install the [stable/nginx-ingress chart](https://github.com/helm/charts/tree/master/stable/nginx-ingress) setting the "tcp" parameter in the **values.yaml** used to install the chart as shown below:
+
+```yaml
+...
+
+tcp:
+  27017: "default/mongodb:27017"
+```
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/NOTES.txt b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/NOTES.txt
new file mode 100644
index 0000000..b75702e
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/NOTES.txt
@@ -0,0 +1,117 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+This Helm chart is deprecated
+
+Given the `stable` deprecation timeline (https://github.com/helm/charts#deprecation-timeline), the Bitnami maintained Helm chart is now located at bitnami/charts (https://github.com/bitnami/charts/).
+
+The Bitnami repository is already included in the Hubs and we will continue providing the same cadence of updates, support, etc that we've been keeping here these years. Installation instructions are very similar, just adding the _bitnami_ repo and using it during the installation (`bitnami/<chart>` instead of `stable/<chart>`)
+
+```bash
+$ helm repo add bitnami https://charts.bitnami.com/bitnami
+$ helm install my-release bitnami/<chart>           # Helm 3
+$ helm install --name my-release bitnami/<chart>    # Helm 2
+```
+
+To update an exisiting _stable_ deployment with a chart hosted in the bitnami repository you can execute
+
+```bash
+$ helm repo add bitnami https://charts.bitnami.com/bitnami
+$ helm upgrade my-release bitnami/<chart>
+```
+
+Issues and PRs related to the chart itself will be redirected to `bitnami/charts` GitHub repository. In the same way, we'll be happy to answer questions related to this migration process in this issue (https://github.com/helm/charts/issues/20969) created as a common place for discussion.
+
+{{- if contains .Values.service.type "LoadBalancer" }}
+{{- if not .Values.mongodbRootPassword }}
+-------------------------------------------------------------------------------
+ WARNING
+
+    By specifying "service.type=LoadBalancer" and not specifying "mongodbRootPassword"
+    you have most  likely exposed the MongoDB service externally without any
+    authentication mechanism.
+
+    For security reasons, we strongly suggest that you switch to "ClusterIP" or
+    "NodePort". As alternative, you can also specify a valid password on the
+    "mongodbRootPassword" parameter.
+
+-------------------------------------------------------------------------------
+{{- end }}
+{{- end }}
+
+** Please be patient while the chart is being deployed **
+
+MongoDB can be accessed via port {{ .Values.service.port }} on the following DNS name from within your cluster:
+
+    {{ template "mongodb.serviceName" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}
+
+{{ if .Values.usePassword -}}
+
+To get the root password run:
+
+    export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "mongodb.fullname" . }} -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
+
+{{- end }}
+{{- if and .Values.mongodbUsername .Values.mongodbDatabase }}
+{{- if .Values.mongodbPassword }}
+
+To get the password for "{{ .Values.mongodbUsername }}" run:
+
+    export MONGODB_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "mongodb.fullname" . }} -o jsonpath="{.data.mongodb-password}" | base64 --decode)
+
+{{- end }}
+{{- end }}
+
+To connect to your database run the following command:
+
+    kubectl run --namespace {{ .Release.Namespace }} {{ template "mongodb.fullname" . }}-client --rm --tty -i --restart='Never' --image {{ template "mongodb.image" . }} --command -- mongo admin --host {{ template "mongodb.serviceName" . }} {{- if .Values.usePassword }} --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD{{- end }}
+
+To connect to your database from outside the cluster execute the following commands:
+
+{{- if contains "NodePort" .Values.service.type }}
+
+    export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+    export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "mongodb.serviceName" . }})
+    mongo --host $NODE_IP --port $NODE_PORT {{- if .Values.usePassword }} --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD{{- end }}
+
+{{- else if contains "LoadBalancer" .Values.service.type }}
+
+  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+        Watch the status with: 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "mongodb.serviceName" . }}'
+
+    export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "mongodb.serviceName" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
+    mongo --host $SERVICE_IP --port {{ .Values.service.port }} {{- if .Values.usePassword }} --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD{{- end }}
+
+{{- else if contains "ClusterIP" .Values.service.type }}
+
+    kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ template "mongodb.serviceName" . }} {{ .Values.service.port }}:{{ .Values.service.port }} &
+    mongo --host 127.0.0.1 {{- if .Values.usePassword }} --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD{{- end }}
+
+{{- end }}
+
+{{- include "mongodb.validateValues" . -}}
+
+{{- if and (contains "bitnami/" .Values.image.repository) (not (.Values.image.tag | toString | regexFind "-r\\d+$|sha256:")) }}
+
+WARNING: Rolling tag detected ({{ .Values.image.repository }}:{{ .Values.image.tag }}), please note that it is strongly recommended to avoid using rolling tags in a production environment.
++info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/
+
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/_helpers.tpl b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/_helpers.tpl
new file mode 100644
index 0000000..39976de
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/_helpers.tpl
@@ -0,0 +1,273 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "mongodb.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Renders a value that contains template.
+Usage:
+{{ include "mongodb.tplValue" ( dict "value" .Values.path.to.the.Value "context" $) }}
+*/}}
+{{- define "mongodb.tplValue" -}}
+    {{- if typeIs "string" .value }}
+        {{- tpl .value .context }}
+    {{- else }}
+        {{- tpl (.value | toYaml) .context }}
+    {{- end }}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "mongodb.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "mongodb.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create the name for the admin secret.
+*/}}
+{{- define "mongodb.adminSecret" -}}
+    {{- if .Values.auth.existingAdminSecret -}}
+        {{- .Values.auth.existingAdminSecret -}}
+    {{- else -}}
+        {{- template "mongodb.fullname" . -}}-admin
+    {{- end -}}
+{{- end -}}
+
+{{/*
+Create the name for the key secret.
+*/}}
+{{- define "mongodb.keySecret" -}}
+    {{- if .Values.auth.existingKeySecret -}}
+        {{- .Values.auth.existingKeySecret -}}
+    {{- else -}}
+        {{- template "mongodb.fullname" . -}}-keyfile
+    {{- end -}}
+{{- end -}}
+
+{{/*
+Return the proper MongoDB image name
+*/}}
+{{- define "mongodb.image" -}}
+{{- $registryName := .Values.image.registry -}}
+{{- $repositoryName := .Values.image.repository -}}
+{{- $tag := .Values.image.tag | toString -}}
+{{/*
+Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
+but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
+Also, we can't use a single if because lazy evaluation is not an option
+*/}}
+{{- if .Values.global }}
+    {{- if .Values.global.imageRegistry }}
+        {{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
+    {{- else -}}
+        {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
+    {{- end -}}
+{{- else -}}
+    {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the proper image name (for the metrics image)
+*/}}
+{{- define "mongodb.metrics.image" -}}
+{{- $registryName := .Values.metrics.image.registry -}}
+{{- $repositoryName := .Values.metrics.image.repository -}}
+{{- $tag := .Values.metrics.image.tag | toString -}}
+{{/*
+Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
+but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
+Also, we can't use a single if because lazy evaluation is not an option
+*/}}
+{{- if .Values.global }}
+    {{- if .Values.global.imageRegistry }}
+        {{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
+    {{- else -}}
+        {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
+    {{- end -}}
+{{- else -}}
+    {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
+{{- end -}}
+{{- end -}}
+
+
+{{/*
+Return the proper Docker Image Registry Secret Names
+*/}}
+{{- define "mongodb.imagePullSecrets" -}}
+{{/*
+Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
+but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic.
+Also, we can not use a single if because lazy evaluation is not an option
+*/}}
+{{- if .Values.global }}
+{{- if .Values.global.imagePullSecrets }}
+imagePullSecrets:
+{{- range .Values.global.imagePullSecrets }}
+  - name: {{ . }}
+{{- end }}
+{{- else if or .Values.image.pullSecrets .Values.metrics.image.pullSecrets .Values.volumePermissions.image.pullSecrets }}
+imagePullSecrets:
+{{- range .Values.image.pullSecrets }}
+  - name: {{ . }}
+{{- end }}
+{{- range .Values.metrics.image.pullSecrets }}
+  - name: {{ . }}
+{{- end }}
+{{- range .Values.volumePermissions.image.pullSecrets }}
+  - name: {{ . }}
+{{- end }}
+{{- end -}}
+{{- else if or .Values.image.pullSecrets .Values.metrics.image.pullSecrets .Values.volumePermissions.image.pullSecrets }}
+imagePullSecrets:
+{{- range .Values.image.pullSecrets }}
+  - name: {{ . }}
+{{- end }}
+{{- range .Values.metrics.image.pullSecrets }}
+  - name: {{ . }}
+{{- end }}
+{{- range .Values.volumePermissions.image.pullSecrets }}
+  - name: {{ . }}
+{{- end }}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the proper image name (for the init container volume-permissions image)
+*/}}
+{{- define "mongodb.volumePermissions.image" -}}
+{{- $registryName := .Values.volumePermissions.image.registry -}}
+{{- $repositoryName := .Values.volumePermissions.image.repository -}}
+{{- $tag := .Values.volumePermissions.image.tag | toString -}}
+{{/*
+Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
+but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic.
+Also, we can't use a single if because lazy evaluation is not an option
+*/}}
+{{- if .Values.global }}
+    {{- if .Values.global.imageRegistry }}
+        {{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}}
+    {{- else -}}
+        {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
+    {{- end -}}
+{{- else -}}
+    {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Compile all warnings into a single message, and call fail.
+*/}}
+{{- define "mongodb.validateValues" -}}
+{{- $messages := list -}}
+{{- $messages := append $messages (include "mongodb.validateValues.mongodbCustomDatabase" .) -}}
+{{- $messages := without $messages "" -}}
+{{- $message := join "\n" $messages -}}
+
+{{- if $message -}}
+{{-   printf "\nVALUES VALIDATION:\n%s" $message | fail -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Validate values of MongoDB - both mongodbUsername and mongodbDatabase are necessary
+to create a custom user and database during 1st initialization
+*/}}
+{{- define "mongodb.validateValues.mongodbCustomDatabase" -}}
+{{- if or (and .Values.mongodbUsername (not .Values.mongodbDatabase)) (and (not .Values.mongodbUsername) .Values.mongodbDatabase) }}
+mongodb: mongodbUsername, mongodbDatabase
+    Both mongodbUsername and mongodbDatabase must be provided to create
+    a custom user and database during 1st initialization.
+    Please set both of them (--set mongodbUsername="xxxx",mongodbDatabase="yyyy")
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return  the proper Storage Class
+*/}}
+{{- define "mongodb.storageClass" -}}
+{{/*
+Helm 2.11 supports the assignment of a value to a variable defined in a different scope,
+but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic.
+*/}}
+{{- if .Values.global -}}
+    {{- if .Values.global.storageClass -}}
+        {{- if (eq "-" .Values.global.storageClass) -}}
+            {{- printf "storageClassName: \"\"" -}}
+        {{- else }}
+            {{- printf "storageClassName: %s" .Values.global.storageClass -}}
+        {{- end -}}
+    {{- else -}}
+        {{- if .Values.persistence.storageClass -}}
+              {{- if (eq "-" .Values.persistence.storageClass) -}}
+                  {{- printf "storageClassName: \"\"" -}}
+              {{- else }}
+                  {{- printf "storageClassName: %s" .Values.persistence.storageClass -}}
+              {{- end -}}
+        {{- end -}}
+    {{- end -}}
+{{- else -}}
+    {{- if .Values.persistence.storageClass -}}
+        {{- if (eq "-" .Values.persistence.storageClass) -}}
+            {{- printf "storageClassName: \"\"" -}}
+        {{- else }}
+            {{- printf "storageClassName: %s" .Values.persistence.storageClass -}}
+        {{- end -}}
+    {{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Returns the proper Service name depending if an explicit service name is set
+in the values file. If the name is not explicitly set it will take the "mongodb.fullname"
+*/}}
+{{- define "mongodb.serviceName" -}}
+  {{- if .Values.service.name -}}
+    {{ .Values.service.name }}
+  {{- else -}}
+    {{ template "mongodb.fullname" .}}
+  {{- end -}}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/configmap.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/configmap.yaml
new file mode 100644
index 0000000..4a3cd95
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/configmap.yaml
@@ -0,0 +1,37 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.configmap }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+  name: {{ template "mongodb.fullname" . }}
+data:
+  mongodb.conf: |-
+{{ toYaml .Values.configmap | indent 4 }}
+{{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/deployment-standalone.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/deployment-standalone.yaml
new file mode 100644
index 0000000..0176e34
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/deployment-standalone.yaml
@@ -0,0 +1,327 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if not .Values.replicaSet.enabled }}
+apiVersion: apps/v1
+kind: {{ if .Values.useStatefulSet }}{{ "StatefulSet" }}{{- else }}{{ "Deployment" }}{{- end }}
+metadata:
+  name: {{ template "mongodb.fullname" . }}
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+    {{- with .Values.labels }}
+{{ toYaml . | indent 4 }}
+    {{- end }}
+  {{- with .Values.annotations }}
+  annotations:
+{{ toYaml . | indent 4 }}
+  {{- end }}
+spec:
+  {{- if .Values.useStatefulSet }}
+  serviceName: {{ template "mongodb.serviceName" . }}
+  updateStrategy:
+  {{- else }}
+  strategy:
+  {{- end }}
+    type: {{ .Values.updateStrategy.type }}
+    {{- if (eq "Recreate" .Values.updateStrategy.type) }}
+    rollingUpdate: null
+    {{- end }}
+  selector:
+    matchLabels:
+      app: {{ template "mongodb.name" . }}
+      release: "{{ .Release.Name }}"
+  template:
+    metadata:
+      labels:
+        app: {{ template "mongodb.name" . }}
+        release: "{{ .Release.Name }}"
+        chart: {{ template "mongodb.chart" . }}
+      {{- if .Values.podLabels }}
+{{ toYaml .Values.podLabels | indent 8 }}
+      {{- end }}
+      {{- if or .Values.podAnnotations .Values.metrics.enabled }}
+      annotations:
+{{- if .Values.podAnnotations }}
+{{ toYaml .Values.podAnnotations | indent 8 }}
+{{- end }}
+{{- if .Values.metrics.enabled }}
+{{ toYaml .Values.metrics.podAnnotations | indent 8 }}
+{{- end }}
+      {{- end }}
+    spec:
+      {{- if .Values.schedulerName }}
+      schedulerName: "{{ .Values.schedulerName }}"
+      {{- end }}
+      {{- if .Values.priorityClassName }}
+      priorityClassName: {{ .Values.priorityClassName }}
+      {{- end }}
+      {{- if .Values.securityContext.enabled }}
+      securityContext:
+        fsGroup: {{ .Values.securityContext.fsGroup }}
+      {{- end }}
+      {{- if .Values.affinity }}
+      affinity:
+{{ toYaml .Values.affinity | indent 8 }}
+      {{- end -}}
+      {{- if .Values.nodeSelector }}
+      nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 8 }}
+      {{- end }}
+      {{- if .Values.tolerations }}
+      tolerations:
+{{ toYaml .Values.tolerations | indent 8 }}
+      {{- end }}
+{{- include "mongodb.imagePullSecrets" . | indent 6 }}
+      initContainers:
+      {{- if .Values.extraInitContainers }}
+{{ tpl .Values.extraInitContainers . | indent 6}}
+      {{- end }}
+      {{- if and .Values.volumePermissions.enabled .Values.persistence.enabled }}
+      - name: volume-permissions
+        image: {{ template "mongodb.volumePermissions.image" . }}
+        imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
+        command: ["chown", "-R", "{{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.fsGroup }}", "{{ .Values.persistence.mountPath }}"]
+        securityContext:
+          runAsUser: 0
+        resources: {{ toYaml .Values.volumePermissions.resources | nindent 10 }}
+        volumeMounts:
+        - name: data
+          mountPath: {{ .Values.persistence.mountPath }}
+      {{- end }}
+      containers:
+      - name: {{ template "mongodb.fullname" . }}
+        image: {{ template "mongodb.image" . }}
+        imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
+        {{- if .Values.securityContext.enabled }}
+        securityContext:
+          runAsNonRoot: true
+          runAsUser: {{ .Values.securityContext.runAsUser }}
+        {{- end }}
+        env:
+        {{- if .Values.image.debug}}
+        - name: BITNAMI_DEBUG
+          value: "true"
+        {{- end }}
+        {{- if .Values.usePassword }}
+        {{- if and .Values.mongodbUsername .Values.mongodbDatabase }}
+        - name: MONGODB_PASSWORD
+          valueFrom:
+            secretKeyRef:
+              name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+              key: mongodb-password
+        {{- end }}
+        - name: MONGODB_ROOT_PASSWORD
+          valueFrom:
+            secretKeyRef:
+              name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+              key: mongodb-root-password
+        {{- end }}
+        {{- if .Values.mongodbUsername }}
+        - name: MONGODB_USERNAME
+          value: {{ .Values.mongodbUsername | quote }}
+        {{- end }}
+        - name: MONGODB_SYSTEM_LOG_VERBOSITY
+          value: {{ .Values.mongodbSystemLogVerbosity | quote }}
+        - name: MONGODB_DISABLE_SYSTEM_LOG
+          {{- if .Values.mongodbDisableSystemLog }}
+          value: "yes"
+          {{- else }}
+          value: "no"
+          {{- end }}
+        {{- if .Values.mongodbDatabase }}
+        - name: MONGODB_DATABASE
+          value: {{ .Values.mongodbDatabase | quote }}
+        {{- end }}
+        - name: MONGODB_ENABLE_IPV6
+        {{- if .Values.mongodbEnableIPv6 }}
+          value: "yes"
+        {{- else }}
+          value: "no"
+        {{- end }}
+        - name: MONGODB_ENABLE_DIRECTORY_PER_DB
+        {{- if .Values.mongodbDirectoryPerDB }}
+          value: "yes"
+        {{- else }}
+          value: "no"
+        {{- end }}
+        {{- if .Values.mongodbExtraFlags }}
+        - name: MONGODB_EXTRA_FLAGS
+          value: {{ .Values.mongodbExtraFlags | join " " | quote }}
+        {{- end }}
+        {{- if .Values.extraEnvVars }}
+        {{- include "mongodb.tplValue" ( dict "value" .Values.extraEnvVars "context" $ ) | nindent 8 }}
+        {{- end }}
+        ports:
+        - name: mongodb
+          containerPort: 27017
+        {{- if .Values.livenessProbe.enabled }}
+        livenessProbe:
+          exec:
+            command:
+            - mongo
+            - --eval
+            - "db.adminCommand('ping')"
+          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+          periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
+          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+          successThreshold: {{ .Values.livenessProbe.successThreshold }}
+          failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
+        {{- end }}
+        {{- if .Values.readinessProbe.enabled }}
+        readinessProbe:
+          exec:
+            command:
+            - mongo
+            - --eval
+            - "db.adminCommand('ping')"
+          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+          periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
+          successThreshold: {{ .Values.readinessProbe.successThreshold }}
+          failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
+        {{- end }}
+        volumeMounts:
+        - name: data
+          mountPath: {{ .Values.persistence.mountPath }}
+          subPath: {{ .Values.persistence.subPath }}
+        {{- if  or (.Files.Glob "files/docker-entrypoint-initdb.d/*[sh|js|json]") (.Values.initConfigMap) }}
+        - name: custom-init-scripts
+          mountPath: /docker-entrypoint-initdb.d
+        {{- end }}
+        {{- if .Values.configmap }}
+        - name: config
+          mountPath: /opt/bitnami/mongodb/conf/mongodb.conf
+          subPath: mongodb.conf
+        {{- end }}
+        {{- if .Values.extraVolumeMounts }}
+{{ toYaml .Values.extraVolumeMounts | indent 8}}
+        {{- end }}
+        resources:
+{{ toYaml .Values.resources | indent 10 }}
+{{- if .Values.metrics.enabled }}
+      - name: metrics
+        image: {{ template "mongodb.metrics.image" . }}
+        imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}
+        {{- if .Values.securityContext.enabled }}
+        securityContext:
+          runAsNonRoot: true
+          runAsUser: {{ .Values.securityContext.runAsUser }}
+        {{- end }}
+        env:
+        {{- if .Values.usePassword }}
+        - name: MONGODB_ROOT_PASSWORD
+          valueFrom:
+            secretKeyRef:
+              name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+              key: mongodb-root-password
+        command: [ 'sh', '-c', '/bin/mongodb_exporter --mongodb.uri mongodb://root:${MONGODB_ROOT_PASSWORD}@localhost:{{ .Values.service.port }}/admin {{ .Values.metrics.extraArgs }}' ]
+        {{- else }}
+        command: [ 'sh', '-c', '/bin/mongodb_exporter --mongodb.uri mongodb://localhost:{{ .Values.service.port }} {{ .Values.metrics.extraArgs }}' ]
+        {{- end }}
+        ports:
+        - name: metrics
+          containerPort: 9216
+        {{- if .Values.metrics.livenessProbe.enabled }}
+        livenessProbe:
+          httpGet:
+            path: /metrics
+            port: metrics
+          initialDelaySeconds: {{ .Values.metrics.livenessProbe.initialDelaySeconds }}
+          periodSeconds: {{ .Values.metrics.readinessProbe.periodSeconds }}
+          timeoutSeconds: {{ .Values.metrics.livenessProbe.timeoutSeconds }}
+          failureThreshold: {{ .Values.metrics.livenessProbe.failureThreshold }}
+          successThreshold: {{ .Values.metrics.livenessProbe.successThreshold }}
+        {{- end }}
+        {{- if .Values.metrics.readinessProbe.enabled }}
+        readinessProbe:
+          httpGet:
+            path: /metrics
+            port: metrics
+          initialDelaySeconds: {{ .Values.metrics.readinessProbe.initialDelaySeconds }}
+          periodSeconds: {{ .Values.metrics.readinessProbe.periodSeconds }}
+          timeoutSeconds: {{ .Values.metrics.readinessProbe.timeoutSeconds }}
+          failureThreshold: {{ .Values.metrics.readinessProbe.failureThreshold }}
+          successThreshold: {{ .Values.metrics.readinessProbe.successThreshold }}
+        {{- end }}
+        resources:
+{{ toYaml .Values.metrics.resources | indent 10 }}
+{{- end }}
+{{- if .Values.sidecars }}
+{{ toYaml .Values.sidecars | indent 6 }}
+{{- end }}
+      volumes:
+      {{- if (.Files.Glob "files/docker-entrypoint-initdb.d/*[sh|js|json]") }}
+      - name: custom-init-scripts
+        configMap:
+          name: {{ template "mongodb.fullname" . }}-init-scripts
+      {{- end }}
+      {{- if (.Values.initConfigMap) }}
+      - name: custom-init-scripts
+        configMap:
+          name: {{ .Values.initConfigMap.name }}
+      {{- end }}
+      - name: data
+      {{- if not .Values.useStatefulSet }}
+      {{- if .Values.persistence.enabled }}
+        persistentVolumeClaim:
+          claimName: {{ if .Values.persistence.existingClaim }}{{ .Values.persistence.existingClaim }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+
+      {{- else }}
+        emptyDir: {}
+      {{- end -}}
+      {{- end -}}
+      {{- if .Values.configmap }}
+      - name: config
+        configMap:
+          name: {{ template "mongodb.fullname" . }}
+      {{- end }}
+      {{- if .Values.extraVolumes }}
+{{ toYaml .Values.extraVolumes | indent 6}}
+      {{- end }}
+{{- if .Values.useStatefulSet }}
+{{- if .Values.persistence.enabled }}
+  volumeClaimTemplates:
+    - metadata:
+        name: data
+        annotations:
+        {{- range $key, $value := .Values.persistence.annotations }}
+          {{ $key }}: "{{ $value }}"
+        {{- end }}
+      spec:
+        accessModes:
+        {{- range .Values.persistence.accessModes }}
+          - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.persistence.size | quote }}
+        {{ include "mongodb.storageClass" . }}
+{{- else }}
+        - name: data
+          emptyDir: {}
+{{- end }}
+{{- end }}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/ingress.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/ingress.yaml
new file mode 100644
index 0000000..c797d34
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/ingress.yaml
@@ -0,0 +1,56 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.ingress.enabled }}
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+  name: {{ template "mongodb.fullname" . }}
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+  annotations:
+    {{- if .Values.ingress.certManager }}
+    kubernetes.io/tls-acme: "true"
+    {{- end }}
+    {{- range $key, $value := .Values.ingress.annotations }}
+    {{ $key }}: {{ $value | quote }}
+    {{- end }}
+spec:
+  rules:
+  {{- range .Values.ingress.hosts }}
+  - host: {{ .name }}
+    http:
+      paths:
+      - path: {{ default "/" .path }}
+        backend:
+          serviceName: {{ template "mongodb.serviceName" $ }}
+          servicePort: mongodb
+  {{- end }}
+  {{- if .Values.ingress.tls }}
+  tls:
+{{ toYaml .Values.ingress.tls | indent 4 }}
+  {{- end }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/initialization-configmap.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/initialization-configmap.yaml
new file mode 100644
index 0000000..1f132e3
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/initialization-configmap.yaml
@@ -0,0 +1,36 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{ if  (.Files.Glob "files/docker-entrypoint-initdb.d/*[sh|js|json]") }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ template "mongodb.fullname" . }}-init-scripts
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    release: {{ .Release.Name | quote }}
+    heritage: {{ .Release.Service | quote }}
+data:
+{{ tpl (.Files.Glob "files/docker-entrypoint-initdb.d/*[sh|js|json]").AsConfig . | indent 2 }}
+{{ end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/poddisruptionbudget-arbiter-rs.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/poddisruptionbudget-arbiter-rs.yaml
new file mode 100644
index 0000000..fdfad70
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/poddisruptionbudget-arbiter-rs.yaml
@@ -0,0 +1,50 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if and .Values.replicaSet.enabled .Values.replicaSet.pdb.enabled }}
+apiVersion: policy/v1beta1
+kind: PodDisruptionBudget
+metadata:
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+  name: {{ template "mongodb.fullname" . }}-arbiter
+spec:
+  {{- if .Values.replicaSet.pdb.minAvailable }}
+  {{- if .Values.replicaSet.pdb.minAvailable.arbiter }}
+  minAvailable: {{ .Values.replicaSet.pdb.minAvailable.arbiter }}
+  {{- end }}
+  {{- end }}
+  {{- if .Values.replicaSet.pdb.maxUnavailable }}
+  {{- if .Values.replicaSet.pdb.maxUnavailable.arbiter }}
+  maxUnavailable: {{ .Values.replicaSet.pdb.maxUnavailable.arbiter }}
+  {{- end }}
+  {{- end }}
+  selector:
+    matchLabels:
+      app: {{ template "mongodb.name" . }}
+      release: {{ .Release.Name }}
+      component: arbiter
+{{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/poddisruptionbudget-secondary-rs.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/poddisruptionbudget-secondary-rs.yaml
new file mode 100644
index 0000000..3f88980
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/poddisruptionbudget-secondary-rs.yaml
@@ -0,0 +1,50 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if and .Values.replicaSet.enabled .Values.replicaSet.pdb.enabled }}
+apiVersion: policy/v1beta1
+kind: PodDisruptionBudget
+metadata:
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+  name: {{ template "mongodb.fullname" . }}-secondary
+spec:
+  {{- if .Values.replicaSet.pdb.minAvailable }}
+  {{- if .Values.replicaSet.pdb.minAvailable.secondary }}
+  minAvailable: {{ .Values.replicaSet.pdb.minAvailable.secondary }}
+  {{- end }}
+  {{- end }}
+  {{- if .Values.replicaSet.pdb.maxUnavailable }}
+  {{- if .Values.replicaSet.pdb.maxUnavailable.secondary }}
+  maxUnavailable: {{ .Values.replicaSet.pdb.maxUnavailable.secondary }}
+  {{- end }}
+  {{- end }}
+  selector:
+    matchLabels:
+      app: {{ template "mongodb.name" . }}
+      release: {{ .Release.Name }}
+      component: secondary
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/prometheus-alerting-rule.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/prometheus-alerting-rule.yaml
new file mode 100644
index 0000000..9f8fadc
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/prometheus-alerting-rule.yaml
@@ -0,0 +1,40 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled .Values.metrics.serviceMonitor.alerting.rules }}
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+  name: {{ template "mongodb.fullname" . }}
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+    {{- if .Values.metrics.serviceMonitor.alerting.additionalLabels }}
+{{ toYaml .Values.metrics.serviceMonitor.alerting.additionalLabels | indent 4 }}
+    {{- end }}
+spec:
+  groups:
+{{ toYaml .Values.metrics.serviceMonitor.alerting.rules | indent 4 }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/prometheus-service-monitor.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/prometheus-service-monitor.yaml
new file mode 100644
index 0000000..07a4f3b
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/prometheus-service-monitor.yaml
@@ -0,0 +1,58 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "mongodb.fullname" . }}
+  {{- if .Values.metrics.serviceMonitor.namespace }}
+  namespace: {{ .Values.metrics.serviceMonitor.namespace }}
+  {{- end }}
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+    {{- if .Values.metrics.serviceMonitor.additionalLabels }}
+{{ toYaml .Values.metrics.serviceMonitor.additionalLabels | indent 4 }}
+    {{- end }}
+spec:
+  endpoints:
+  - interval: 30s
+    port: metrics
+    {{- if .Values.metrics.serviceMonitor.relabellings }}
+    metricRelabelings:
+{{ toYaml .Values.metrics.serviceMonitor.relabellings | indent 4 }}
+    {{- end }}
+  jobLabel: {{ template "mongodb.fullname" . }}
+  namespaceSelector:
+    matchNames:
+    - "{{ $.Release.Namespace }}"
+  selector:
+    matchLabels:
+      app: {{ template "mongodb.name" . }}
+      chart: {{ template "mongodb.chart" . }}
+      release: "{{ .Release.Name }}"
+      heritage: "{{ .Release.Service }}"
+{{- end }}      
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/pvc-standalone.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/pvc-standalone.yaml
new file mode 100644
index 0000000..224061b
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/pvc-standalone.yaml
@@ -0,0 +1,43 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (not .Values.replicaSet.enabled) (not .Values.useStatefulSet) }}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+  name: {{ template "mongodb.fullname" . }}
+spec:
+  accessModes:
+  {{- range .Values.persistence.accessModes }}
+    - {{ . | quote }}
+  {{- end }}
+  resources:
+    requests:
+      storage: {{ .Values.persistence.size | quote }}
+  {{ include "mongodb.storageClass" . }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/secrets.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/secrets.yaml
new file mode 100644
index 0000000..d3043ce
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/secrets.yaml
@@ -0,0 +1,55 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{ if and .Values.usePassword (not .Values.existingSecret) -}}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ template "mongodb.fullname" . }}
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+type: Opaque
+data:
+  {{- if .Values.mongodbRootPassword }}
+  mongodb-root-password:  {{ .Values.mongodbRootPassword | b64enc | quote }}
+  {{- else }}
+  mongodb-root-password: {{ randAlphaNum 10 | b64enc | quote }}
+  {{- end }}
+  {{- if and .Values.mongodbUsername .Values.mongodbDatabase }}
+  {{- if .Values.mongodbPassword }}
+  mongodb-password:  {{ .Values.mongodbPassword | b64enc | quote }}
+  {{- else }}
+  mongodb-password: {{ randAlphaNum 10 | b64enc | quote }}
+  {{- end }}
+  {{- end }}
+  {{- if .Values.replicaSet.enabled }}
+  {{- if .Values.replicaSet.key }}
+  mongodb-replica-set-key:  {{ .Values.replicaSet.key | b64enc | quote }}
+  {{- else }}
+  mongodb-replica-set-key: {{ randAlphaNum 10 | b64enc | quote }}
+  {{- end }}
+  {{- end }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/statefulset-arbiter-rs.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/statefulset-arbiter-rs.yaml
new file mode 100644
index 0000000..62e9dcf
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/statefulset-arbiter-rs.yaml
@@ -0,0 +1,210 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.replicaSet.enabled }}
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+  name: {{ template "mongodb.fullname" . }}-arbiter
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+    {{- with .Values.labels }}
+{{ toYaml . | indent 4 }}
+    {{- end }}
+  {{- with .Values.annotations }}
+  annotations:
+{{ toYaml . | indent 4 }}
+  {{- end }}
+spec:
+  selector:
+    matchLabels:
+      app: {{ template "mongodb.name" . }}
+      release: {{ .Release.Name }}
+      component: arbiter
+  serviceName: {{ template "mongodb.fullname" . }}-headless
+  replicas: {{ .Values.replicaSet.replicas.arbiter }}
+  updateStrategy:
+    type: {{ .Values.updateStrategy.type }}
+    {{- if (eq "Recreate" .Values.updateStrategy.type) }}
+    rollingUpdate: null
+    {{- end }}
+  template:
+    metadata:
+      labels:
+        app: {{ template "mongodb.name" . }}
+        chart: {{ template "mongodb.chart" . }}
+        release: {{ .Release.Name }}
+        component: arbiter
+      {{- if .Values.podLabels }}
+{{ toYaml .Values.podLabels | indent 8 }}
+      {{- end }}
+      {{- if .Values.podAnnotations }}
+      annotations:
+{{ toYaml .Values.podAnnotations | indent 8 }}
+      {{- end }}
+    spec:
+      {{- if .Values.schedulerName }}
+      schedulerName: "{{ .Values.schedulerName }}"
+      {{- end }}
+      {{- if .Values.priorityClassName }}
+      priorityClassName: {{ .Values.priorityClassName }}
+      {{- end }}
+      {{- if .Values.securityContext.enabled }}
+      securityContext:
+        fsGroup: {{ .Values.securityContext.fsGroup }}
+      {{- end }}
+      {{- if .Values.affinityArbiter }}
+      affinity:
+{{ toYaml .Values.affinityArbiter | indent 8 }}
+      {{- end -}}
+      {{- if .Values.nodeSelector }}
+      nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 8 }}
+      {{- end }}
+      {{- if .Values.tolerations }}
+      tolerations:
+{{ toYaml .Values.tolerations | indent 8 }}
+      {{- end }}
+{{- include "mongodb.imagePullSecrets" . | indent 6 }}
+      {{- if .Values.extraInitContainers }}
+      initContainers:
+{{ tpl .Values.extraInitContainers . | indent 6}}
+      {{- end }}
+      containers:
+        - name: {{ template "mongodb.name" . }}-arbiter
+          image: {{ template "mongodb.image" . }}
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          {{- if .Values.securityContext.enabled }}
+          securityContext:
+            runAsNonRoot: true
+            runAsUser: {{ .Values.securityContext.runAsUser }}
+          {{- end }}
+          ports:
+          - containerPort: {{ .Values.service.port }}
+            name: mongodb
+          env:
+          {{- if .Values.image.debug}}
+          - name: BITNAMI_DEBUG
+            value: "true"
+          {{- end }}
+          - name: MONGODB_SYSTEM_LOG_VERBOSITY
+            value: {{ .Values.mongodbSystemLogVerbosity | quote }}
+          - name: MONGODB_DISABLE_SYSTEM_LOG
+            {{- if .Values.mongodbDisableSystemLog }}
+            value: "yes"
+            {{- else }}
+            value: "no"
+            {{- end }}
+          - name: MONGODB_POD_NAME
+            valueFrom:
+              fieldRef:
+                fieldPath: metadata.name
+          - name: MONGODB_REPLICA_SET_MODE
+            value: "arbiter"
+          - name: MONGODB_PRIMARY_HOST
+            value: {{ template "mongodb.fullname" . }}
+          - name: MONGODB_REPLICA_SET_NAME
+            value: {{ .Values.replicaSet.name | quote }}
+            {{- if .Values.replicaSet.useHostnames }}
+          - name: MONGODB_ADVERTISED_HOSTNAME
+            value: "$(MONGODB_POD_NAME).{{ template "mongodb.fullname" . }}-headless.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}"
+            {{- end }}
+            {{- if .Values.usePassword }}
+          - name: MONGODB_PRIMARY_ROOT_PASSWORD
+            valueFrom:
+              secretKeyRef:
+                name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+                key: mongodb-root-password
+          - name: MONGODB_REPLICA_SET_KEY
+            valueFrom:
+              secretKeyRef:
+                name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+                key: mongodb-replica-set-key
+            {{- end }}
+          - name: MONGODB_ENABLE_IPV6
+          {{- if .Values.mongodbEnableIPv6 }}
+            value: "yes"
+          {{- else }}
+            value: "no"
+          {{- end }}
+          - name: MONGODB_ENABLE_DIRECTORY_PER_DB
+          {{- if .Values.mongodbDirectoryPerDB }}
+            value: "yes"
+          {{- else }}
+            value: "no"
+          {{- end }}
+          {{- if .Values.mongodbExtraFlags }}
+          - name: MONGODB_EXTRA_FLAGS
+            value: {{ .Values.mongodbExtraFlags | join " " | quote }}
+          {{- end }}
+          {{- if .Values.extraEnvVars }}
+          {{- include "mongodb.tplValue" ( dict "value" .Values.extraEnvVars "context" $ ) | nindent 10 }}
+          {{- end }}
+          {{- if .Values.livenessProbe.enabled }}
+          livenessProbe:
+            tcpSocket:
+              port: mongodb
+            initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+            successThreshold: {{ .Values.livenessProbe.successThreshold }}
+            failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
+          {{- end }}
+          {{- if .Values.readinessProbe.enabled }}
+          readinessProbe:
+            tcpSocket:
+              port: mongodb
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
+          {{- end }}
+          volumeMounts:
+          {{- if .Values.configmap }}
+            - name: config
+              mountPath: /opt/bitnami/mongodb/conf/mongodb.conf
+              subPath: mongodb.conf
+          {{- end }}
+          resources:
+{{ toYaml .Values.resourcesArbiter | indent 12 }}
+{{- if .Values.extraVolumeMountsArbiter }}
+          volumeMounts:
+{{ toYaml .Values.extraVolumeMountsArbiter | indent 12}}
+{{- end }}
+{{- if .Values.sidecarsArbiter }}
+{{ toYaml .Values.sidecarsArbiter | indent 8 }}
+{{- end }}
+      volumes:
+      {{- if .Values.configmap }}
+        - name: config
+          configMap:
+            name: {{ template "mongodb.fullname" . }}
+      {{- end }}
+      {{- if .Values.extraVolumesArbiter }}
+{{ toYaml .Values.extraVolumesArbiter | indent 8 }}
+      {{- end }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/statefulset-primary-rs.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/statefulset-primary-rs.yaml
new file mode 100644
index 0000000..c1e14c4
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/statefulset-primary-rs.yaml
@@ -0,0 +1,330 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.replicaSet.enabled }}
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+  name: {{ template "mongodb.fullname" . }}-primary
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+    {{- with .Values.labels }}
+{{ toYaml . | indent 4 }}
+    {{- end }}
+  {{- with .Values.annotations }}
+  annotations:
+{{ toYaml . | indent 4 }}
+  {{- end }}
+spec:
+  serviceName: {{ template "mongodb.fullname" . }}-headless
+  replicas: 1
+  updateStrategy:
+    type: {{ .Values.updateStrategy.type }}
+    {{- if (eq "Recreate" .Values.updateStrategy.type) }}
+    rollingUpdate: null
+    {{- end }}
+  selector:
+    matchLabels:
+      app: {{ template "mongodb.name" . }}
+      release: {{ .Release.Name }}
+      component: primary
+  template:
+    metadata:
+      labels:
+        app: {{ template "mongodb.name" . }}
+        chart: {{ template "mongodb.chart" . }}
+        release: {{ .Release.Name }}
+        component: primary
+      {{- if .Values.podLabels }}
+{{ toYaml .Values.podLabels | indent 8 }}
+      {{- end }}
+      {{- if or .Values.podAnnotations .Values.metrics.enabled }}
+      annotations:
+{{- if .Values.podAnnotations }}
+{{ toYaml .Values.podAnnotations | indent 8 }}
+{{- end }}
+{{- if .Values.metrics.enabled }}
+{{ toYaml .Values.metrics.podAnnotations | indent 8 }}
+{{- end }}
+      {{- end }}
+    spec:
+      {{- if .Values.schedulerName }}
+      schedulerName: "{{ .Values.schedulerName }}"
+      {{- end }}
+      {{- if .Values.priorityClassName }}
+      priorityClassName: {{ .Values.priorityClassName }}
+      {{- end }}
+      {{- if .Values.securityContext.enabled }}
+      securityContext:
+        fsGroup: {{ .Values.securityContext.fsGroup }}
+      {{- end }}
+      {{- if .Values.affinity }}
+      affinity:
+{{ toYaml .Values.affinity | indent 8 }}
+      {{- end -}}
+      {{- if .Values.nodeSelector }}
+      nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 8 }}
+      {{- end }}
+      {{- if .Values.tolerations }}
+      tolerations:
+{{ toYaml .Values.tolerations | indent 8 }}
+      {{- end }}
+{{- include "mongodb.imagePullSecrets" . | indent 6 }}
+      initContainers:
+      {{- if .Values.extraInitContainers }}
+{{ tpl .Values.extraInitContainers . | indent 6}}
+      {{- end }}
+      {{- if and .Values.volumePermissions.enabled .Values.persistence.enabled }}
+      - name: volume-permissions
+        image: {{ template "mongodb.volumePermissions.image" . }}
+        imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
+        command: ["chown", "-R", "{{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.fsGroup }}", "{{ .Values.persistence.mountPath }}"]
+        securityContext:
+          runAsUser: 0
+        resources: {{ toYaml .Values.volumePermissions.resources | nindent 10 }}
+        volumeMounts:
+        - name: datadir
+          mountPath: {{ .Values.persistence.mountPath }}
+      {{- end }}
+      containers:
+        - name: {{ template "mongodb.name" . }}-primary
+          image: {{ template "mongodb.image" . }}
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          {{- if .Values.securityContext.enabled }}
+          securityContext:
+            runAsNonRoot: true
+            runAsUser: {{ .Values.securityContext.runAsUser }}
+          {{- end }}
+          ports:
+          - containerPort: {{ .Values.service.port }}
+            name: mongodb
+          env:
+          {{- if .Values.image.debug}}
+          - name: BITNAMI_DEBUG
+            value: "true"
+          {{- end }}
+          - name: MONGODB_SYSTEM_LOG_VERBOSITY
+            value: {{ .Values.mongodbSystemLogVerbosity | quote }}
+          - name: MONGODB_DISABLE_SYSTEM_LOG
+            {{- if .Values.mongodbDisableSystemLog }}
+            value: "yes"
+            {{- else }}
+            value: "no"
+            {{- end }}
+          - name: MONGODB_POD_NAME
+            valueFrom:
+              fieldRef:
+                fieldPath: metadata.name
+          - name: MONGODB_REPLICA_SET_MODE
+            value: "primary"
+          - name: MONGODB_REPLICA_SET_NAME
+            value: {{ .Values.replicaSet.name | quote }}
+            {{- if .Values.replicaSet.useHostnames }}
+          - name: MONGODB_ADVERTISED_HOSTNAME
+            value: "$(MONGODB_POD_NAME).{{ template "mongodb.fullname" . }}-headless.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}"
+            {{- end }}
+          {{- if .Values.mongodbUsername }}
+          - name: MONGODB_USERNAME
+            value: {{ .Values.mongodbUsername | quote }}
+          {{- end }}
+          {{- if .Values.mongodbDatabase }}
+          - name: MONGODB_DATABASE
+            value: {{ .Values.mongodbDatabase | quote }}
+          {{- end }}
+            {{- if .Values.usePassword }}
+            {{- if and .Values.mongodbUsername .Values.mongodbDatabase }}
+          - name: MONGODB_PASSWORD
+            valueFrom:
+              secretKeyRef:
+                name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+                key: mongodb-password
+            {{- end }}
+          - name: MONGODB_ROOT_PASSWORD
+            valueFrom:
+              secretKeyRef:
+                name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+                key: mongodb-root-password
+          - name: MONGODB_REPLICA_SET_KEY
+            valueFrom:
+              secretKeyRef:
+                name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+                key: mongodb-replica-set-key
+            {{- end }}
+          - name: MONGODB_ENABLE_IPV6
+          {{- if .Values.mongodbEnableIPv6 }}
+            value: "yes"
+          {{- else }}
+            value: "no"
+          {{- end }}
+          - name: MONGODB_ENABLE_DIRECTORY_PER_DB
+          {{- if .Values.mongodbDirectoryPerDB }}
+            value: "yes"
+          {{- else }}
+            value: "no"
+          {{- end }}
+          {{- if .Values.mongodbExtraFlags }}
+          - name: MONGODB_EXTRA_FLAGS
+            value: {{ .Values.mongodbExtraFlags | join " " | quote }}
+          {{- end }}
+          {{- if .Values.extraEnvVars }}
+          {{- include "mongodb.tplValue" ( dict "value" .Values.extraEnvVars "context" $ ) | nindent 10 }}
+          {{- end }}
+          {{- if .Values.livenessProbe.enabled }}
+          livenessProbe:
+            exec:
+              command:
+                - pgrep
+                - mongod
+            initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+            successThreshold: {{ .Values.livenessProbe.successThreshold }}
+            failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
+          {{- end }}
+          {{- if .Values.readinessProbe.enabled }}
+          readinessProbe:
+            exec:
+              command:
+                - mongo
+                - --eval
+                - "db.adminCommand('ping')"
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
+          {{- end }}
+          volumeMounts:
+            - name: datadir
+              mountPath: {{ .Values.persistence.mountPath }}
+              subPath: {{ .Values.persistence.subPath }}
+            {{- if  or (.Files.Glob "files/docker-entrypoint-initdb.d/*[sh|js|json]") (.Values.initConfigMap) }}
+            - name: custom-init-scripts
+              mountPath: /docker-entrypoint-initdb.d
+            {{- end }}
+            {{- if .Values.configmap }}
+            - name: config
+              mountPath: /opt/bitnami/mongodb/conf/mongodb.conf
+              subPath: mongodb.conf
+            {{- end }}
+          {{- if .Values.extraVolumeMounts }}
+{{ toYaml .Values.extraVolumeMounts | indent 12}}
+          {{- end }}
+          resources:
+{{ toYaml .Values.resources | indent 12 }}
+{{- if .Values.metrics.enabled }}
+        - name: metrics
+          image: {{ template "mongodb.metrics.image" . }}
+          imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}
+          {{- if .Values.securityContext.enabled }}
+          securityContext:
+            runAsNonRoot: true
+            runAsUser: {{ .Values.securityContext.runAsUser }}
+          {{- end }}
+          env:
+          {{- if .Values.usePassword }}
+          - name: MONGODB_ROOT_PASSWORD
+            valueFrom:
+              secretKeyRef:
+                name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+                key: mongodb-root-password
+          command: [ 'sh', '-c', '/bin/mongodb_exporter --mongodb.uri mongodb://root:${MONGODB_ROOT_PASSWORD}@localhost:{{ .Values.service.port }}/admin {{ .Values.metrics.extraArgs }}' ]
+          {{- else }}
+          command: [ 'sh', '-c', '/bin/mongodb_exporter --mongodb.uri mongodb://localhost:{{ .Values.service.port }} {{ .Values.metrics.extraArgs }}' ]
+          {{- end }}
+          ports:
+          - name: metrics
+            containerPort: 9216
+          {{- if .Values.metrics.livenessProbe.enabled }}
+          livenessProbe:
+            httpGet:
+              path: /metrics
+              port: metrics
+            initialDelaySeconds: {{ .Values.metrics.livenessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.metrics.livenessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.metrics.livenessProbe.timeoutSeconds }}
+            failureThreshold: {{ .Values.metrics.livenessProbe.failureThreshold }}
+            successThreshold: {{ .Values.metrics.livenessProbe.successThreshold }}
+          {{- end }}
+          {{- if .Values.metrics.readinessProbe.enabled }}
+          readinessProbe:
+            httpGet:
+              path: /metrics
+              port: metrics
+            initialDelaySeconds: {{ .Values.metrics.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.metrics.readinessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.metrics.readinessProbe.timeoutSeconds }}
+            failureThreshold: {{ .Values.metrics.readinessProbe.failureThreshold }}
+            successThreshold: {{ .Values.metrics.readinessProbe.successThreshold }}
+          {{- end }}
+          resources:
+{{ toYaml .Values.metrics.resources | indent 12 }}
+{{- end }}
+{{- if .Values.sidecars }}
+{{ toYaml .Values.sidecars | indent 8 }}
+{{- end }}
+      volumes:
+        {{- if (.Files.Glob "files/docker-entrypoint-initdb.d/*[sh|js|json]") }}
+        - name: custom-init-scripts
+          configMap:
+            name: {{ template "mongodb.fullname" . }}-init-scripts
+        {{- end }}
+        {{- if (.Values.initConfigMap) }}
+        - name: custom-init-scripts
+          configMap:
+            name: {{ .Values.initConfigMap.name }}
+        {{- end }}
+        {{- if .Values.configmap }}
+        - name: config
+          configMap:
+            name: {{ template "mongodb.fullname" . }}
+        {{- end }}
+        {{- if .Values.extraVolumes }}
+{{ toYaml .Values.extraVolumes | indent 8}}
+        {{- end }}
+{{- if .Values.persistence.enabled }}
+  volumeClaimTemplates:
+    - metadata:
+        name: datadir
+        annotations:
+        {{- range $key, $value := .Values.persistence.annotations }}
+          {{ $key }}: "{{ $value }}"
+        {{- end }}
+      spec:
+        accessModes:
+        {{- range .Values.persistence.accessModes }}
+          - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.persistence.size | quote }}
+        {{ include "mongodb.storageClass" . }}
+{{- else }}
+        - name: datadir
+          emptyDir: {}
+{{- end }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/statefulset-secondary-rs.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/statefulset-secondary-rs.yaml
new file mode 100644
index 0000000..3c13184
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/statefulset-secondary-rs.yaml
@@ -0,0 +1,304 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.replicaSet.enabled }}
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+  name: {{ template "mongodb.fullname" . }}-secondary
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    heritage: {{ .Release.Service }}
+    release: {{ .Release.Name }}
+    {{- with .Values.labels }}
+{{ toYaml . | indent 4 }}
+    {{- end }}
+  {{- with .Values.annotations }}
+  annotations:
+{{ toYaml . | indent 4 }}
+  {{- end }}
+spec:
+  selector:
+    matchLabels:
+      app: {{ template "mongodb.name" . }}
+      release: {{ .Release.Name }}
+      component: secondary
+  podManagementPolicy: "Parallel"
+  serviceName: {{ template "mongodb.fullname" . }}-headless
+  replicas: {{ .Values.replicaSet.replicas.secondary }}
+  updateStrategy:
+    type: {{ .Values.updateStrategy.type }}
+    {{- if (eq "Recreate" .Values.updateStrategy.type) }}
+    rollingUpdate: null
+    {{- end }}
+  template:
+    metadata:
+      labels:
+        app: {{ template "mongodb.name" . }}
+        chart: {{ template "mongodb.chart" . }}
+        release: {{ .Release.Name }}
+        component: secondary
+      {{- if .Values.podLabels }}
+{{ toYaml .Values.podLabels | indent 8 }}
+      {{- end }}
+      {{- if or .Values.podAnnotations .Values.metrics.enabled }}
+      annotations:
+{{- if .Values.podAnnotations }}
+{{ toYaml .Values.podAnnotations | indent 8 }}
+{{- end }}
+{{- if .Values.metrics.enabled }}
+{{ toYaml .Values.metrics.podAnnotations | indent 8 }}
+{{- end }}
+      {{- end }}
+    spec:
+      {{- if .Values.schedulerName }}
+      schedulerName: "{{ .Values.schedulerName }}"
+      {{- end }}
+      {{- if .Values.priorityClassName }}
+      priorityClassName: {{ .Values.priorityClassName }}
+      {{- end }}
+      {{- if .Values.securityContext.enabled }}
+      securityContext:
+        fsGroup: {{ .Values.securityContext.fsGroup }}
+      {{- end }}
+      {{- if .Values.affinity }}
+      affinity:
+{{ toYaml .Values.affinity | indent 8 }}
+      {{- end -}}
+      {{- if .Values.nodeSelector }}
+      nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 8 }}
+      {{- end }}
+      {{- if .Values.tolerations }}
+      tolerations:
+{{ toYaml .Values.tolerations | indent 8 }}
+      {{- end }}
+{{- include "mongodb.imagePullSecrets" . | indent 6 }}
+      initContainers:
+      {{- if .Values.extraInitContainers }}
+{{ tpl .Values.extraInitContainers . | indent 6}}
+      {{- end }}
+      {{- if and .Values.volumePermissions.enabled .Values.persistence.enabled }}
+      - name: volume-permissions
+        image: {{ template "mongodb.volumePermissions.image" . }}
+        imagePullPolicy: {{ .Values.volumePermissions.image.pullPolicy | quote }}
+        command: ["chown", "-R", "{{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.fsGroup }}", "{{ .Values.persistence.mountPath }}"]
+        securityContext:
+          runAsUser: 0
+        resources: {{ toYaml .Values.volumePermissions.resources | nindent 10 }}
+        volumeMounts:
+        - name: datadir
+          mountPath: {{ .Values.persistence.mountPath }}
+      {{- end }}
+      containers:
+        - name: {{ template "mongodb.name" . }}-secondary
+          image: {{ template "mongodb.image" . }}
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          {{- if .Values.securityContext.enabled }}
+          securityContext:
+            runAsNonRoot: true
+            runAsUser: {{ .Values.securityContext.runAsUser }}
+          {{- end }}
+          ports:
+          - containerPort: {{ .Values.service.port }}
+            name: mongodb
+          env:
+          {{- if .Values.image.debug}}
+          - name: BITNAMI_DEBUG
+            value: "true"
+          {{- end }}
+          - name: MONGODB_SYSTEM_LOG_VERBOSITY
+            value: {{ .Values.mongodbSystemLogVerbosity | quote }}
+          - name: MONGODB_DISABLE_SYSTEM_LOG
+            {{- if .Values.mongodbDisableSystemLog }}
+            value: "yes"
+            {{- else }}
+            value: "no"
+            {{- end }}
+          - name: MONGODB_POD_NAME
+            valueFrom:
+              fieldRef:
+                fieldPath: metadata.name
+          - name: MONGODB_REPLICA_SET_MODE
+            value: "secondary"
+          - name: MONGODB_PRIMARY_HOST
+            value: {{ template "mongodb.fullname" . }}
+          - name: MONGODB_REPLICA_SET_NAME
+            value: {{ .Values.replicaSet.name | quote }}
+            {{- if .Values.replicaSet.useHostnames }}
+          - name: MONGODB_ADVERTISED_HOSTNAME
+            value: "$(MONGODB_POD_NAME).{{ template "mongodb.fullname" . }}-headless.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}"
+            {{- end }}
+            {{- if .Values.usePassword }}
+          - name: MONGODB_PRIMARY_ROOT_PASSWORD
+            valueFrom:
+              secretKeyRef:
+                name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+                key: mongodb-root-password
+          - name: MONGODB_REPLICA_SET_KEY
+            valueFrom:
+              secretKeyRef:
+                name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+                key: mongodb-replica-set-key
+            {{- end }}
+          - name: MONGODB_ENABLE_IPV6
+          {{- if .Values.mongodbEnableIPv6 }}
+            value: "yes"
+          {{- else }}
+            value: "no"
+          {{- end }}
+          - name: MONGODB_ENABLE_DIRECTORY_PER_DB
+          {{- if .Values.mongodbDirectoryPerDB }}
+            value: "yes"
+          {{- else }}
+            value: "no"
+          {{- end }}
+          {{- if .Values.mongodbExtraFlags }}
+          - name: MONGODB_EXTRA_FLAGS
+            value: {{ .Values.mongodbExtraFlags | join " " | quote }}
+          {{- end }}
+          {{- if .Values.extraEnvVars }}
+          {{- include "mongodb.tplValue" ( dict "value" .Values.extraEnvVars "context" $ ) | nindent 10 }}
+          {{- end }}
+          {{- if .Values.livenessProbe.enabled }}
+          livenessProbe:
+            exec:
+              command:
+                - pgrep
+                - mongod
+            initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+            successThreshold: {{ .Values.livenessProbe.successThreshold }}
+            failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
+          {{- end }}
+          {{- if .Values.readinessProbe.enabled }}
+          readinessProbe:
+            exec:
+              command:
+                - mongo
+                - --eval
+                - "db.adminCommand('ping')"
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
+          {{- end }}
+          volumeMounts:
+            - name: datadir
+              mountPath: {{ .Values.persistence.mountPath }}
+              subPath: {{ .Values.persistence.subPath }}
+            {{- if .Values.configmap }}
+            - name: config
+              mountPath: /opt/bitnami/mongodb/conf/mongodb.conf
+              subPath: mongodb.conf
+            {{- end }}
+          {{- if .Values.extraVolumeMounts }}
+{{ toYaml .Values.extraVolumeMounts | indent 12}}
+          {{- end }}
+          resources:
+{{ toYaml .Values.resources | indent 12 }}
+{{- if .Values.metrics.enabled }}
+        - name: metrics
+          image: {{ template "mongodb.metrics.image" . }}
+          imagePullPolicy: {{ .Values.metrics.image.pullPolicy | quote }}
+          {{- if .Values.securityContext.enabled }}
+          securityContext:
+            runAsNonRoot: true
+            runAsUser: {{ .Values.securityContext.runAsUser }}
+          {{- end }}
+          env:
+          {{- if .Values.usePassword }}
+          - name: MONGODB_ROOT_PASSWORD
+            valueFrom:
+              secretKeyRef:
+                name: {{ if .Values.existingSecret }}{{ .Values.existingSecret }}{{- else }}{{ template "mongodb.fullname" . }}{{- end }}
+                key: mongodb-root-password
+          command: [ 'sh', '-c', '/bin/mongodb_exporter --mongodb.uri mongodb://root:${MONGODB_ROOT_PASSWORD}@localhost:{{ .Values.service.port }}/admin {{ .Values.metrics.extraArgs }}' ]
+          {{- else }}
+          command: [ 'sh', '-c', '/bin/mongodb_exporter --mongodb.uri mongodb://localhost:{{ .Values.service.port }} {{ .Values.metrics.extraArgs }}' ]
+          {{- end }}
+          ports:
+          - name: metrics
+            containerPort: 9216
+          {{- if .Values.metrics.livenessProbe.enabled }}
+          livenessProbe:
+            httpGet:
+              path: /metrics
+              port: metrics
+            initialDelaySeconds: {{ .Values.metrics.livenessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.metrics.livenessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.metrics.livenessProbe.timeoutSeconds }}
+            failureThreshold: {{ .Values.metrics.livenessProbe.failureThreshold }}
+            successThreshold: {{ .Values.metrics.livenessProbe.successThreshold }}
+          {{- end }}
+          {{- if .Values.metrics.readinessProbe.enabled }}
+          readinessProbe:
+            httpGet:
+              path: /metrics
+              port: metrics
+            initialDelaySeconds: {{ .Values.metrics.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.metrics.readinessProbe.periodSeconds }}
+            timeoutSeconds: {{ .Values.metrics.readinessProbe.timeoutSeconds }}
+            failureThreshold: {{ .Values.metrics.readinessProbe.failureThreshold }}
+            successThreshold: {{ .Values.metrics.readinessProbe.successThreshold }}
+          {{- end }}
+          resources:
+{{ toYaml .Values.metrics.resources | indent 12 }}
+{{- end }}
+{{- if .Values.sidecars }}
+{{ toYaml .Values.sidecars | indent 8 }}
+{{- end }}
+      volumes:
+        {{- if .Values.configmap }}
+        - name: config
+          configMap:
+            name: {{ template "mongodb.fullname" . }}
+        {{- end }}
+        {{- if .Values.extraVolumes }}
+{{ toYaml .Values.extraVolumes | indent 8}}
+        {{- end }}
+{{- if .Values.persistence.enabled }}
+  volumeClaimTemplates:
+    - metadata:
+        name: datadir
+        annotations:
+        {{- range $key, $value := .Values.persistence.annotations }}
+          {{ $key }}: "{{ $value }}"
+        {{- end }}
+      spec:
+        accessModes:
+        {{- range .Values.persistence.accessModes }}
+          - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.persistence.size | quote }}
+        {{ include "mongodb.storageClass" . }}
+{{- else }}
+        - name: datadir
+          emptyDir: {}
+{{- end }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/svc-headless-rs.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/svc-headless-rs.yaml
new file mode 100644
index 0000000..82ad6bf
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/svc-headless-rs.yaml
@@ -0,0 +1,46 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.replicaSet.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "mongodb.fullname" . }}-headless
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+{{- with .Values.service.annotations }}
+  annotations: {{ tpl (toYaml .) $ | nindent 4 }}
+{{- end }}
+spec:
+  type: ClusterIP
+  clusterIP: None
+  ports:
+  - name: mongodb
+    port: {{ .Values.service.port }}
+  selector:
+    app: {{ template "mongodb.name" . }}
+    release: {{ .Release.Name }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/svc-primary-rs.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/svc-primary-rs.yaml
new file mode 100644
index 0000000..64bd518
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/svc-primary-rs.yaml
@@ -0,0 +1,67 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.replicaSet.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "mongodb.serviceName" . }}
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+{{- with .Values.service.annotations }}
+  annotations: {{ tpl (toYaml .) $ | nindent 4 }}
+{{- end }}
+spec:
+  type: {{ .Values.service.type }}
+  {{- if and (eq .Values.service.type "ClusterIP") .Values.service.clusterIP }}
+  clusterIP: {{ .Values.service.clusterIP }}
+  {{- end }}
+  {{- if and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerIP }}
+  loadBalancerIP: {{ .Values.service.loadBalancerIP }}
+  {{- end }}
+  {{- if .Values.service.externalIPs }}
+  externalIPs: {{ toYaml .Values.service.externalIPs | nindent 4 }}
+  {{- end }}
+  {{- if .Values.service.loadBalancerSourceRanges }}
+  loadBalancerSourceRanges: {{- toYaml .Values.service.loadBalancerSourceRanges | nindent 4 }}
+  {{- end }}
+  ports:
+  - name: mongodb
+    port: {{ .Values.service.port }}
+    targetPort: mongodb
+{{- if .Values.service.nodePort }}
+    nodePort: {{ .Values.service.nodePort }}
+{{- end }}
+{{- if .Values.metrics.enabled }}
+  - name: metrics
+    port: 9216
+    targetPort: metrics
+{{- end }}
+  selector:
+    app: {{ template "mongodb.name" . }}
+    release: "{{ .Release.Name }}"
+    component: primary
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/svc-standalone.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/svc-standalone.yaml
new file mode 100644
index 0000000..f19cbba
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/templates/svc-standalone.yaml
@@ -0,0 +1,66 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if not .Values.replicaSet.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "mongodb.serviceName" . }}
+  labels:
+    app: {{ template "mongodb.name" . }}
+    chart: {{ template "mongodb.chart" . }}
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+{{- with .Values.service.annotations }}
+  annotations: {{ tpl (toYaml .) $ | nindent 4 }}
+{{- end }}
+spec:
+  type: {{ .Values.service.type }}
+  {{- if and (eq .Values.service.type "ClusterIP") .Values.service.clusterIP }}
+  clusterIP: {{ .Values.service.clusterIP }}
+  {{- end }}
+  {{- if and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerIP }}
+  loadBalancerIP: {{ .Values.service.loadBalancerIP }}
+  {{- end }}
+  {{- if .Values.service.externalIPs }}
+  externalIPs: {{ toYaml .Values.service.externalIPs | nindent 4 }}
+  {{- end }}
+  {{- if .Values.service.loadBalancerSourceRanges }}
+  loadBalancerSourceRanges: {{- toYaml .Values.service.loadBalancerSourceRanges | nindent 4 }}
+  {{- end }}
+  ports:
+  - name: mongodb
+    port: {{ .Values.service.port }}
+    targetPort: mongodb
+{{- if .Values.service.nodePort }}
+    nodePort: {{ .Values.service.nodePort }}
+{{- end }}
+{{- if .Values.metrics.enabled }}
+  - name: metrics
+    port: 9216
+    targetPort: metrics
+{{- end }}
+  selector:
+    app: {{ template "mongodb.name" . }}
+    release: "{{ .Release.Name }}"
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/values.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/values.yaml
new file mode 100644
index 0000000..8e57b82
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mongodb-chart/values.yaml
@@ -0,0 +1,529 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+## Global Docker image parameters
+## Please, note that this will override the image parameters, including dependencies, configured to use the global value
+## Current available global Docker image parameters: imageRegistry and imagePullSecrets
+##
+# global:
+#   imageRegistry: myRegistryName
+#   imagePullSecrets:
+#     - myRegistryKeySecretName
+#   storageClass: myStorageClass
+
+image:
+  ## Bitnami MongoDB registry
+  ##
+  registry: docker.io
+  ## Bitnami MongoDB image name
+  ##
+  repository: bitnami/mongodb
+  ## Bitnami MongoDB image tag
+  ## ref: https://hub.docker.com/r/bitnami/mongodb/tags/
+  ##
+  tag: 4.2.4-debian-10-r0
+  ## Specify a imagePullPolicy
+  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
+  ##
+  pullPolicy: IfNotPresent
+  ## Optionally specify an array of imagePullSecrets.
+  ## Secrets must be manually created in the namespace.
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+  ##
+  # pullSecrets:
+  #   - myRegistryKeySecretName
+
+  ## Set to true if you would like to see extra information on logs
+  ## It turns on Bitnami debugging in minideb-extras-base
+  ## ref:  https://github.com/bitnami/minideb-extras-base
+  debug: false
+
+## String to partially override mongodb.fullname template (will maintain the release name)
+##
+# nameOverride:
+
+## String to fully override mongodb.fullname template
+##
+# fullnameOverride:
+
+## Init containers parameters:
+## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.
+##
+volumePermissions:
+  enabled: false
+  image:
+    registry: docker.io
+    repository: bitnami/minideb
+    tag: buster
+    pullPolicy: Always
+    ## Optionally specify an array of imagePullSecrets.
+    ## Secrets must be manually created in the namespace.
+    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+    ##
+    # pullSecrets:
+    #   - myRegistryKeySecretName
+  resources: {}
+
+## Enable authentication
+## ref: https://docs.mongodb.com/manual/tutorial/enable-authentication/
+#
+usePassword: true
+# existingSecret: name-of-existing-secret
+
+## MongoDB admin password
+## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#setting-the-root-password-on-first-run
+##
+# mongodbRootPassword:
+
+## MongoDB custom user and database
+## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#creating-a-user-and-database-on-first-run
+##
+# mongodbUsername: username
+# mongodbPassword: password
+# mongodbDatabase: database
+
+## Whether enable/disable IPv6 on MongoDB
+## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-ipv6
+##
+mongodbEnableIPv6: false
+
+## Whether enable/disable DirectoryPerDB on MongoDB
+## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-directoryperdb
+##
+mongodbDirectoryPerDB: false
+
+## MongoDB System Log configuration
+## ref: https://github.com/bitnami/bitnami-docker-mongodb#configuring-system-log-verbosity-level
+##
+mongodbSystemLogVerbosity: 0
+mongodbDisableSystemLog: false
+
+## MongoDB additional command line flags
+##
+## Can be used to specify command line flags, for example:
+##
+## mongodbExtraFlags:
+##  - "--wiredTigerCacheSizeGB=2"
+mongodbExtraFlags: []
+
+## Pod Security Context
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
+##
+securityContext:
+  enabled: true
+  fsGroup: 1001
+  runAsUser: 1001
+
+## Kubernetes Cluster Domain
+clusterDomain: cluster.local
+
+## Kubernetes service type
+service:
+  ## Specify an explicit service name.
+  # name: svc-mongo
+  ## Provide any additional annotations which may be required.
+  ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart
+  annotations: {}
+  type: ClusterIP
+  # clusterIP: None
+  port: 27017
+
+  ## Specify the nodePort value for the LoadBalancer and NodePort service types.
+  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
+  ##
+  # nodePort:
+
+  ## Specify the externalIP value ClusterIP service type.
+  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips
+  # externalIPs: []
+
+  ## Specify the loadBalancerIP value for LoadBalancer service types.
+  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer
+  ##
+  # loadBalancerIP:
+
+  ## Specify the loadBalancerSourceRanges value for LoadBalancer service types.
+  ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+  ##
+  # loadBalancerSourceRanges: []
+
+# Add custom extra environment variables to all the MongoDB containers
+# extraEnvVars:
+
+## Use StatefulSet instead of Deployment when deploying standalone
+useStatefulSet: false
+
+## Setting up replication
+## ref: https://github.com/bitnami/bitnami-docker-mongodb#setting-up-a-replication
+#
+replicaSet:
+  ## Whether to create a MongoDB replica set for high availability or not
+  enabled: false
+  useHostnames: true
+
+  ## Name of the replica set
+  ##
+  name: rs0
+
+  ## Key used for replica set authentication
+  ##
+  # key: key
+
+  ## Number of replicas per each node type
+  ##
+  replicas:
+    secondary: 1
+    arbiter: 1
+
+  ## Pod Disruption Budget
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
+  pdb:
+    enabled: true
+    minAvailable:
+      primary: 1
+      secondary: 1
+      arbiter: 1
+    # maxUnavailable:
+      # primary: 1
+      # secondary: 1
+      # arbiter: 1
+
+# Annotations to be added to the deployment or statefulsets
+annotations: {}
+
+# Additional labels to apply to the deployment or statefulsets
+labels: {}
+
+# Annotations to be added to MongoDB pods
+podAnnotations: {}
+
+# Additional pod labels to apply
+podLabels: {}
+
+## Use an alternate scheduler, e.g. "stork".
+## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+##
+# schedulerName:
+
+## Configure resource requests and limits
+## ref: http://kubernetes.io/docs/user-guide/compute-resources/
+##
+resources: {}
+# Define separate resources per arbiter, which are less then primary or secondary
+# used only when replica set is enabled
+resourcesArbiter: {}
+# limits:
+#   cpu: 500m
+#   memory: 512Mi
+# requests:
+#   cpu: 100m
+#   memory: 256Mi
+
+## Pod priority
+## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/
+# priorityClassName: ""
+
+## Node selector
+## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
+nodeSelector: {}
+
+## Affinity
+## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+affinity: {}
+# Define separate affinity for arbiter pod
+affinityArbiter: {}
+
+## Tolerations
+## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+tolerations: []
+
+## updateStrategy for MongoDB Primary, Secondary and Arbitrer statefulsets
+## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+updateStrategy:
+  type: RollingUpdate
+
+## Add sidecars to the pod
+##
+## For example:
+## sidecars:
+##   - name: your-image-name
+##     image: your-image
+##     imagePullPolicy: Always
+##     ports:
+##       - name: portname
+##         containerPort: 1234
+sidecars: []
+## Array to add extra volumes
+##
+extraVolumes: []
+## Array to add extra mounts (normally used with extraVolumes)
+##
+extraVolumeMounts: []
+
+## Add sidecars to the arbiter pod
+# used only when replica set is enabled
+##
+## For example:
+## sidecars:
+##   - name: your-image-name
+##     image: your-image
+##     imagePullPolicy: Always
+##     ports:
+##       - name: portname
+##         containerPort: 1234
+sidecarsArbiter: []
+## Array to add extra volumes to the arbiter
+# used only when replica set is enabled
+##
+extraVolumesArbiter: []
+## Array to add extra mounts (normally used with extraVolumes) to the arbiter
+# used only when replica set is enabled
+##
+extraVolumeMountsArbiter: []
+
+## Enable persistence using Persistent Volume Claims
+## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
+##
+persistence:
+  enabled: true
+  ## A manually managed Persistent Volume and Claim
+  ## Requires persistence.enabled: true
+  ## If defined, PVC must be created manually before volume will be bound
+  ##
+  # existingClaim:
+
+  ## The path the volume will be mounted at, useful when using different
+  ## MongoDB images.
+  ##
+  mountPath: /bitnami/mongodb
+
+  ## The subdirectory of the volume to mount to, useful in dev environments
+  ## and one PV for multiple services.
+  ##
+  subPath: ""
+
+  ## mongodb data Persistent Volume Storage Class
+  ## If defined, storageClassName: <storageClass>
+  ## If set to "-", storageClassName: "", which disables dynamic provisioning
+  ## If undefined (the default) or set to null, no storageClassName spec is
+  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
+  ##   GKE, AWS & OpenStack)
+  ##
+  # storageClass: "-"
+  accessModes:
+    - ReadWriteOnce
+  size: 8Gi
+  annotations: {}
+
+## Configure the ingress resource that allows you to access the
+## MongoDB installation. Set up the URL
+## ref: http://kubernetes.io/docs/user-guide/ingress/
+##
+ingress:
+  ## Set to true to enable ingress record generation
+  enabled: false
+
+  ## Set this to true in order to add the corresponding annotations for cert-manager
+  certManager: false
+
+  ## Ingress annotations done as key:value pairs
+  ## For a full list of possible ingress annotations, please see
+  ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md
+  ##
+  ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: "true" will automatically be set
+  ## If certManager is set to true, annotation kubernetes.io/tls-acme: "true" will automatically be set
+  annotations:
+  #  kubernetes.io/ingress.class: nginx
+
+  ## The list of hostnames to be covered with this ingress record.
+  ## Most likely this will be just one host, but in the event more hosts are needed, this is an array
+  hosts:
+  - name: mongodb.local
+    path: /
+
+  ## The tls configuration for the ingress
+  ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
+  tls:
+  - hosts:
+      - mongodb.local
+    secretName: mongodb.local-tls
+
+  secrets:
+  ## If you're providing your own certificates, please use this to add the certificates as secrets
+  ## key and certificate should start with -----BEGIN CERTIFICATE----- or
+  ## -----BEGIN RSA PRIVATE KEY-----
+  ##
+  ## name should line up with a tlsSecret set further up
+  ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set
+  ##
+  ## It is also possible to create and manage the certificates outside of this helm chart
+  ## Please see README.md for more information
+  # - name: airflow.local-tls
+  #   key:
+  #   certificate:
+
+## Configure the options for init containers to be run before the main app containers
+## are started. All init containers are run sequentially and must exit without errors
+## for the next one to be started.
+## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+# extraInitContainers: |
+#   - name: do-something
+#     image: busybox
+#     command: ['do', 'something']
+
+## Configure extra options for liveness and readiness probes
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
+livenessProbe:
+  enabled: true
+  initialDelaySeconds: 30
+  periodSeconds: 10
+  timeoutSeconds: 5
+  failureThreshold: 6
+  successThreshold: 1
+readinessProbe:
+  enabled: true
+  initialDelaySeconds: 5
+  periodSeconds: 10
+  timeoutSeconds: 5
+  failureThreshold: 6
+  successThreshold: 1
+
+# Define custom config map with init scripts
+initConfigMap: {}
+#  name: "init-config-map"
+
+## Entries for the MongoDB config file. For documentation of all options, see:
+##   http://docs.mongodb.org/manual/reference/configuration-options/
+##
+configmap:
+#  # where and how to store data.
+#  storage:
+#    dbPath: /bitnami/mongodb/data/db
+#    journal:
+#      enabled: true
+#    directoryPerDB: false
+#  # where to write logging data.
+#  systemLog:
+#    destination: file
+#    quiet: false
+#    logAppend: true
+#    logRotate: reopen
+#    path: /opt/bitnami/mongodb/logs/mongodb.log
+#    verbosity: 0
+#  # network interfaces
+#  net:
+#    port: 27017
+#    unixDomainSocket:
+#      enabled: true
+#      pathPrefix: /opt/bitnami/mongodb/tmp
+#    ipv6: false
+#    bindIpAll: true
+#  # replica set options
+#  #replication:
+#    #replSetName: replicaset
+#    #enableMajorityReadConcern: true
+#  # process management options
+#  processManagement:
+#     fork: false
+#     pidFilePath: /opt/bitnami/mongodb/tmp/mongodb.pid
+#  # set parameter options
+#  setParameter:
+#     enableLocalhostAuthBypass: true
+#  # security options
+#  security:
+#    authorization: disabled
+#    #keyFile: /opt/bitnami/mongodb/conf/keyfile
+
+## Prometheus Exporter / Metrics
+##
+metrics:
+  enabled: false
+
+  image:
+    registry: docker.io
+    repository: bitnami/mongodb-exporter
+    tag: 0.10.0-debian-10-r41
+    pullPolicy: IfNotPresent
+    ## Optionally specify an array of imagePullSecrets.
+    ## Secrets must be manually created in the namespace.
+    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+    ##
+    # pullSecrets:
+    #   - myRegistryKeySecretName
+
+  ## String with extra arguments to the metrics exporter
+  ## ref: https://github.com/percona/mongodb_exporter/blob/master/mongodb_exporter.go
+  extraArgs: ""
+
+  ## Metrics exporter resource requests and limits
+  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/
+  ##
+  # resources: {}
+
+  ## Metrics exporter liveness and readiness probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)
+  livenessProbe:
+    enabled: false
+    initialDelaySeconds: 15
+    periodSeconds: 5
+    timeoutSeconds: 5
+    failureThreshold: 3
+    successThreshold: 1
+  readinessProbe:
+    enabled: false
+    initialDelaySeconds: 5
+    periodSeconds: 5
+    timeoutSeconds: 1
+    failureThreshold: 3
+    successThreshold: 1
+
+  ## Metrics exporter pod Annotation
+  podAnnotations:
+    prometheus.io/scrape: "true"
+    prometheus.io/port: "9216"
+
+  ## Prometheus Service Monitor
+  ## ref: https://github.com/coreos/prometheus-operator
+  ##      https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md
+  serviceMonitor:
+    ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry
+    enabled: false
+
+    ## Specify a namespace if needed
+    # namespace: monitoring
+
+    ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with
+    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec
+    additionalLabels: {}
+
+    ## Specify Metric Relabellings to add to the scrape endpoint
+    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint
+    # relabellings:
+
+    alerting:
+      ## Define individual alerting rules as required
+      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#rulegroup
+      ##      https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
+      rules: {}
+
+      ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Prometheus Rules to work with
+      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec
+      additionalLabels: {}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/.helmignore b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/.helmignore
new file mode 100644
index 0000000..fcbad37
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/.helmignore
@@ -0,0 +1,23 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+.git
+OWNERS
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/Chart.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/Chart.yaml
new file mode 100644
index 0000000..09c76ad
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/Chart.yaml
@@ -0,0 +1,38 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+apiVersion: v1
+appVersion: 5.7.30
+deprecated: true
+description: DEPRECATED - Fast, reliable, scalable, and easy to use open-source relational
+  database system.
+engine: gotpl
+home: https://www.mysql.com/
+icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png
+keywords:
+- mysql
+- database
+- sql
+name: mysql
+sources:
+- https://github.com/kubernetes/charts
+- https://github.com/docker-library/mysql
+version: 1.6.9
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/README.md b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/README.md
new file mode 100644
index 0000000..6923e2a
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/README.md
@@ -0,0 +1,255 @@
+# ⚠️ Repo Archive Notice
+
+As of Nov 13, 2020, charts in this repo will no longer be updated.
+For more information, see the Helm Charts [Deprecation and Archive Notice](https://github.com/helm/charts#%EF%B8%8F-deprecation-and-archive-notice), and [Update](https://helm.sh/blog/charts-repo-deprecation/).
+
+# MySQL
+
+[MySQL](https://MySQL.org) is one of the most popular database servers in the world. Notable users include Wikipedia, Facebook and Google.
+
+## DEPRECATION NOTICE
+
+This chart is deprecated and no longer supported.
+
+## Introduction
+
+This chart bootstraps a single node MySQL deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
+
+## Prerequisites
+
+- Kubernetes 1.10+ with Beta APIs enabled
+- PV provisioner support in the underlying infrastructure
+
+## Installing the Chart
+
+To install the chart with the release name `my-release`:
+
+```bash
+$ helm install --name my-release stable/mysql
+```
+
+The command deploys MySQL on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation.
+
+By default a random password will be generated for the root user. If you'd like to set your own password change the mysqlRootPassword
+in the values.yaml.
+
+You can retrieve your root password by running the following command. Make sure to replace [YOUR_RELEASE_NAME]:
+
+    printf $(printf '\%o' `kubectl get secret [YOUR_RELEASE_NAME]-mysql -o jsonpath="{.data.mysql-root-password[*]}"`)
+
+> **Tip**: List all releases using `helm list`
+
+## Uninstalling the Chart
+
+To uninstall/delete the `my-release` deployment:
+
+```bash
+$ helm delete --purge my-release
+```
+
+The command removes all the Kubernetes components associated with the chart and deletes the release completely.
+
+## Configuration
+
+The following table lists the configurable parameters of the MySQL chart and their default values.
+
+| Parameter                                    | Description                                                                                  | Default                                              |
+| -------------------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
+| `args`                                       | Additional arguments to pass to the MySQL container.                                         | `[]`                                                 |
+| `initContainer.resources`                    | initContainer resource requests/limits                                                       | Memory: `10Mi`, CPU: `10m`                           |
+| `image`                                      | `mysql` image repository.                                                                    | `mysql`                                              |
+| `imageTag`                                   | `mysql` image tag.                                                                           | `5.7.30`                                             |
+| `busybox.image`                              | `busybox` image repository.                                                                  | `busybox`                                            |
+| `busybox.tag`                                | `busybox` image tag.                                                                         | `1.32`                                               |
+| `testFramework.enabled`                      | `test-framework` switch.                                                                     | `true`                                               |
+| `testFramework.image`                        | `test-framework` image repository.                                                           | `bats/bats`                                          |
+| `testFramework.tag`                          | `test-framework` image tag.                                                                  | `1.2.1`                                              |
+| `testFramework.imagePullPolicy`              | `test-framework` image pull policy.                                                          | `IfNotPresent`                                       |
+| `testFramework.securityContext`              | `test-framework` securityContext                                                             | `{}`                                                 |
+| `imagePullPolicy`                            | Image pull policy                                                                            | `IfNotPresent`                                       |
+| `existingSecret`                             | Use Existing secret for Password details                                                     | `nil`                                                |
+| `extraVolumes`                               | Additional volumes as a string to be passed to the `tpl` function                            |                                                      |
+| `extraVolumeMounts`                          | Additional volumeMounts as a string to be passed to the `tpl` function                       |                                                      |
+| `extraInitContainers`                        | Additional init containers as a string to be passed to the `tpl` function                    |                                                      |
+| `extraEnvVars`                               | Additional environment variables as a string to be passed to the `tpl` function              |                                                      |
+| `mysqlRootPassword`                          | Password for the `root` user. Ignored if existing secret is provided                         | Random 10 characters                                 |
+| `mysqlUser`                                  | Username of new user to create.                                                              | `nil`                                                |
+| `mysqlPassword`                              | Password for the new user. Ignored if existing secret is provided                            | Random 10 characters                                 |
+| `mysqlDatabase`                              | Name for new database to create.                                                             | `nil`                                                |
+| `livenessProbe.initialDelaySeconds`          | Delay before liveness probe is initiated                                                     | 30                                                   |
+| `livenessProbe.periodSeconds`                | How often to perform the probe                                                               | 10                                                   |
+| `livenessProbe.timeoutSeconds`               | When the probe times out                                                                     | 5                                                    |
+| `livenessProbe.successThreshold`             | Minimum consecutive successes for the probe to be considered successful after having failed. | 1                                                    |
+| `livenessProbe.failureThreshold`             | Minimum consecutive failures for the probe to be considered failed after having succeeded.   | 3                                                    |
+| `readinessProbe.initialDelaySeconds`         | Delay before readiness probe is initiated                                                    | 5                                                    |
+| `readinessProbe.periodSeconds`               | How often to perform the probe                                                               | 10                                                   |
+| `readinessProbe.timeoutSeconds`              | When the probe times out                                                                     | 1                                                    |
+| `readinessProbe.successThreshold`            | Minimum consecutive successes for the probe to be considered successful after having failed. | 1                                                    |
+| `readinessProbe.failureThreshold`            | Minimum consecutive failures for the probe to be considered failed after having succeeded.   | 3                                                    |
+| `schedulerName`                              | Name of the k8s scheduler (other than default)                                               | `nil`                                                |
+| `mysqlx.port.enabled`                        | Boolean to toggle a port for mysqlx `33060` protocol.                                        | false                                                |
+| `persistence.enabled`                        | Create a volume to store data                                                                | true                                                 |
+| `persistence.size`                           | Size of persistent volume claim                                                              | 8Gi RW                                               |
+| `persistence.storageClass`                   | Type of persistent volume claim                                                              | nil                                                  |
+| `persistence.accessMode`                     | ReadWriteOnce or ReadOnly                                                                    | ReadWriteOnce                                        |
+| `persistence.existingClaim`                  | Name of existing persistent volume                                                           | `nil`                                                |
+| `persistence.subPath`                        | Subdirectory of the volume to mount                                                          | `nil`                                                |
+| `persistence.annotations`                    | Persistent Volume annotations                                                                | {}                                                   |
+| `nodeSelector`                               | Node labels for pod assignment                                                               | {}                                                   |
+| `affinity`                                   | Affinity rules for pod assignment                                                            | {}                                                   |
+| `tolerations`                                | Pod taint tolerations for deployment                                                         | {}                                                   |
+| `metrics.enabled`                            | Start a side-car prometheus exporter                                                         | `false`                                              |
+| `metrics.image`                              | Exporter image                                                                               | `prom/mysqld-exporter`                               |
+| `metrics.imageTag`                           | Exporter image                                                                               | `v0.10.0`                                            |
+| `metrics.imagePullPolicy`                    | Exporter image pull policy                                                                   | `IfNotPresent`                                       |
+| `metrics.resources`                          | Exporter resource requests/limit                                                             | `nil`                                                |
+| `metrics.livenessProbe.initialDelaySeconds`  | Delay before metrics liveness probe is initiated                                             | 15                                                   |
+| `metrics.livenessProbe.timeoutSeconds`       | When the probe times out                                                                     | 5                                                    |
+| `metrics.readinessProbe.initialDelaySeconds` | Delay before metrics readiness probe is initiated                                            | 5                                                    |
+| `metrics.readinessProbe.timeoutSeconds`      | When the probe times out                                                                     | 1                                                    |
+| `metrics.flags`                              | Additional flags for the mysql exporter to use                                               | `[]`                                                 |
+| `metrics.serviceMonitor.enabled`             | Set this to `true` to create ServiceMonitor for Prometheus operator                          | `false`                                              |
+| `metrics.serviceMonitor.additionalLabels`    | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus        | `{}`                                                 |
+| `resources`                                  | CPU/Memory resource requests/limits                                                          | Memory: `256Mi`, CPU: `100m`                         |
+| `configurationFiles`                         | List of mysql configuration files                                                            | `nil`                                                |
+| `configurationFilesPath`                     | Path of mysql configuration files                                                            | `/etc/mysql/conf.d/`                                 |
+| `securityContext.enabled`                    | Enable security context (mysql pod)                                                          | `false`                                              |
+| `securityContext.fsGroup`                    | Group ID for the container (mysql pod)                                                       | 999                                                  |
+| `securityContext.runAsUser`                  | User ID for the container (mysql pod)                                                        | 999                                                  |
+| `service.annotations`                        | Kubernetes annotations for mysql                                                             | {}                                                   |
+| `service.type`                               | Kubernetes service type                                                                      | ClusterIP                                            |
+| `service.loadBalancerIP`                     | LoadBalancer service IP                                                                      | `""`                                                 |
+| `serviceAccount.create`                      | Specifies whether a ServiceAccount should be created                                         | `false`                                              |
+| `serviceAccount.name`                        | The name of the ServiceAccount to create                                                     | Generated using the mysql.fullname template          |
+| `ssl.enabled`                                | Setup and use SSL for MySQL connections                                                      | `false`                                              |
+| `ssl.secret`                                 | Name of the secret containing the SSL certificates                                           | mysql-ssl-certs                                      |
+| `ssl.certificates[0].name`                   | Name of the secret containing the SSL certificates                                           | `nil`                                                |
+| `ssl.certificates[0].ca`                     | CA certificate                                                                               | `nil`                                                |
+| `ssl.certificates[0].cert`                   | Server certificate (public key)                                                              | `nil`                                                |
+| `ssl.certificates[0].key`                    | Server key (private key)                                                                     | `nil`                                                |
+| `imagePullSecrets`                           | Name of Secret resource containing private registry credentials                              | `nil`                                                |
+| `initializationFiles`                        | List of SQL files which are run after the container started                                  | `nil`                                                |
+| `timezone`                                   | Container and mysqld timezone (TZ env)                                                       | `nil` (UTC depending on image)                       |
+| `podAnnotations`                             | Map of annotations to add to the pods                                                        | `{}`                                                 |
+| `podLabels`                                  | Map of labels to add to the pods                                                             | `{}`                                                 |
+| `priorityClassName`                          | Set pod priorityClassName                                                                    | `{}`                                                 |
+| `deploymentAnnotations`		       | Map of annotations for deployment							      | `{}`						     |
+| `strategy`                                   | Update strategy policy                                                                       | `{type: "Recreate"}`                                 |
+
+Some of the parameters above map to the env variables defined in the [MySQL DockerHub image](https://hub.docker.com/_/mysql/).
+
+Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
+
+```bash
+$ helm install --name my-release \
+  --set mysqlRootPassword=secretpassword,mysqlUser=my-user,mysqlPassword=my-password,mysqlDatabase=my-database \
+    stable/mysql
+```
+
+The above command sets the MySQL `root` account password to `secretpassword`. Additionally it creates a standard database user named `my-user`, with the password `my-password`, who has access to a database named `my-database`.
+
+Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
+
+```bash
+$ helm install --name my-release -f values.yaml stable/mysql
+```
+
+> **Tip**: You can use the default [values.yaml](values.yaml)
+
+## Persistence
+
+The [MySQL](https://hub.docker.com/_/mysql/) image stores the MySQL data and configurations at the `/var/lib/mysql` path of the container.
+
+By default a PersistentVolumeClaim is created and mounted into that directory. In order to disable this functionality
+you can change the values.yaml to disable persistence and use an emptyDir instead.
+
+> *"An emptyDir volume is first created when a Pod is assigned to a Node, and exists as long as that Pod is running on that node. When a Pod is removed from a node for any reason, the data in the emptyDir is deleted forever."*
+
+**Notice**: You may need to increase the value of `livenessProbe.initialDelaySeconds` when enabling persistence by using PersistentVolumeClaim from PersistentVolume with varying properties. Since its IO performance has impact on the database initialization performance. The default limit for database initialization is `60` seconds (`livenessProbe.initialDelaySeconds` + `livenessProbe.periodSeconds` * `livenessProbe.failureThreshold`). Once such initialization process takes more time than this limit, kubelet will restart the database container, which will interrupt database initialization then causing persisent data in an unusable state.
+
+## Custom MySQL configuration files
+
+The [MySQL](https://hub.docker.com/_/mysql/) image accepts custom configuration files at the path `/etc/mysql/conf.d`. If you want to use a customized MySQL configuration, you can create your alternative configuration files by passing the file contents on the `configurationFiles` attribute. Note that according to the MySQL documentation only files ending with `.cnf` are loaded.
+
+```yaml
+configurationFiles:
+  mysql.cnf: |-
+    [mysqld]
+    skip-host-cache
+    skip-name-resolve
+    sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
+  mysql_custom.cnf: |-
+    [mysqld]
+```
+
+## MySQL initialization files
+
+The [MySQL](https://hub.docker.com/_/mysql/) image accepts *.sh, *.sql and *.sql.gz files at the path `/docker-entrypoint-initdb.d`.
+These files are being run exactly once for container initialization and ignored on following container restarts.
+If you want to use initialization scripts, you can create initialization files by passing the file contents on the `initializationFiles` attribute.
+
+
+```yaml
+initializationFiles:
+  first-db.sql: |-
+    CREATE DATABASE IF NOT EXISTS first DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
+  second-db.sql: |-
+    CREATE DATABASE IF NOT EXISTS second DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
+```
+
+## SSL
+
+This chart supports configuring MySQL to use [encrypted connections](https://dev.mysql.com/doc/refman/5.7/en/encrypted-connections.html) with TLS/SSL certificates provided by the user. This is accomplished by storing the required Certificate Authority file, the server public key certificate, and the server private key as a Kubernetes secret. The SSL options for this chart support the following use cases:
+
+* Manage certificate secrets with helm
+* Manage certificate secrets outside of helm
+
+## Manage certificate secrets with helm
+
+Include your certificate data in the `ssl.certificates` section. For example:
+
+```
+ssl:
+  enabled: false
+  secret: mysql-ssl-certs
+  certificates:
+  - name: mysql-ssl-certs
+    ca: |-
+      -----BEGIN CERTIFICATE-----
+      ...
+      -----END CERTIFICATE-----
+    cert: |-
+      -----BEGIN CERTIFICATE-----
+      ...
+      -----END CERTIFICATE-----
+    key: |-
+      -----BEGIN RSA PRIVATE KEY-----
+      ...
+      -----END RSA PRIVATE KEY-----
+```
+
+> **Note**: Make sure your certificate data has the correct formatting in the values file.
+
+## Manage certificate secrets outside of helm
+
+1. Ensure the certificate secret exist before installation of this chart.
+2. Set the name of the certificate secret in `ssl.secret`.
+3. Make sure there are no entries underneath `ssl.certificates`.
+
+To manually create the certificate secret from local files you can execute:
+```
+kubectl create secret generic mysql-ssl-certs \
+  --from-file=ca.pem=./ssl/certificate-authority.pem \
+  --from-file=server-cert.pem=./ssl/server-public-key.pem \
+  --from-file=server-key.pem=./ssl/server-private-key.pem
+```
+> **Note**: `ca.pem`, `server-cert.pem`, and `server-key.pem` **must** be used as the key names in this generic secret.
+
+If you are using a certificate your configurationFiles must include the three ssl lines under [mysqld]
+
+```
+[mysqld]
+    ssl-ca=/ssl/ca.pem
+    ssl-cert=/ssl/server-cert.pem
+    ssl-key=/ssl/server-key.pem
+```
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/NOTES.txt b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/NOTES.txt
new file mode 100644
index 0000000..8972993
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/NOTES.txt
@@ -0,0 +1,69 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
+{{ template "mysql.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local
+
+{{- if .Values.mysqlx.port.enabled }}
+Connection to the X protocol of MySQL can be done via 33060 on the following DNS name from within your cluster:
+{{ template "mysql.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local
+{{- end }}
+
+{{- if .Values.existingSecret }}
+If you have not already created the mysql password secret:
+
+   kubectl create secret generic {{ .Values.existingSecret }} --namespace {{ .Release.Namespace }} --from-file=./mysql-root-password --from-file=./mysql-password
+{{ else }}
+
+To get your root password run:
+
+    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "mysql.fullname" . }} -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
+{{- end }}
+
+To connect to your database:
+
+1. Run an Ubuntu pod that you can use as a client:
+
+    kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
+
+2. Install the mysql client:
+
+    $ apt-get update && apt-get install mysql-client -y
+
+3. Connect using the mysql cli, then provide your password:
+    $ mysql -h {{ template "mysql.fullname" . }} -p
+
+To connect to your database directly from outside the K8s cluster:
+    {{- if contains "NodePort" .Values.service.type }}
+    MYSQL_HOST=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath='{.items[0].status.addresses[0].address}')
+    MYSQL_PORT=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "mysql.fullname" . }} -o jsonpath='{.spec.ports[0].nodePort}')
+
+    {{- else if contains "ClusterIP" .Values.service.type }}
+    MYSQL_HOST=127.0.0.1
+    MYSQL_PORT={{ .Values.service.port }}
+
+    # Execute the following command to route the connection:
+    kubectl port-forward svc/{{ template "mysql.fullname" . }} {{ .Values.service.port }}
+
+    {{- end }}
+
+    mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
+    
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/_helpers.tpl b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/_helpers.tpl
new file mode 100644
index 0000000..6b034fc
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/_helpers.tpl
@@ -0,0 +1,64 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "mysql.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "mysql.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- printf .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Generate chart secret name
+*/}}
+{{- define "mysql.secretName" -}}
+{{ default (include "mysql.fullname" .) .Values.existingSecret }}
+{{- end -}}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "mysql.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create -}}
+{{ default (include "mysql.fullname" .) .Values.serviceAccount.name }}
+{{- else -}}
+{{ default "default" .Values.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/configurationFiles-configmap.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/configurationFiles-configmap.yaml
new file mode 100644
index 0000000..70943de
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/configurationFiles-configmap.yaml
@@ -0,0 +1,35 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.configurationFiles }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ template "mysql.fullname" . }}-configuration
+  namespace: {{ .Release.Namespace }}
+data:
+{{- range $key, $val := .Values.configurationFiles }}
+  {{ $key }}: |-
+{{ $val | indent 4}}
+{{- end }}
+{{- end -}}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/deployment.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/deployment.yaml
new file mode 100644
index 0000000..17a9f08
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/deployment.yaml
@@ -0,0 +1,282 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ template "mysql.fullname" . }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    app: {{ template "mysql.fullname" . }}
+    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+{{- with .Values.deploymentAnnotations }}
+  annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+
+spec:
+  strategy:
+{{ toYaml .Values.strategy | indent 4 }}
+  selector:
+    matchLabels:
+      app: {{ template "mysql.fullname" . }}
+      release: {{ .Release.Name }}
+  template:
+    metadata:
+      labels:
+        app: {{ template "mysql.fullname" . }}
+        release: {{ .Release.Name }}
+{{- with .Values.podLabels }}
+{{ toYaml . | indent 8 }}
+{{- end }}
+{{- with .Values.podAnnotations }}
+      annotations:
+{{ toYaml . | indent 8 }}
+{{- end }}
+    spec:
+      {{- if .Values.schedulerName }}
+      schedulerName: "{{ .Values.schedulerName }}"
+      {{- end }}
+      {{- if .Values.imagePullSecrets }}
+      imagePullSecrets:
+{{ toYaml .Values.imagePullSecrets | indent 8 }}
+      {{- end }}
+      {{- if .Values.priorityClassName }}
+      priorityClassName: "{{ .Values.priorityClassName }}"
+      {{- end }}
+      {{- if .Values.securityContext.enabled }}
+      securityContext:
+        fsGroup: {{ .Values.securityContext.fsGroup }}
+        runAsUser: {{ .Values.securityContext.runAsUser }}
+      {{- end }}
+      serviceAccountName: {{ template "mysql.serviceAccountName" . }}
+      initContainers:
+      - name: "remove-lost-found"
+        image: "{{ .Values.busybox.image}}:{{ .Values.busybox.tag }}"
+        imagePullPolicy: {{ .Values.imagePullPolicy | quote }}
+        resources:
+{{ toYaml .Values.initContainer.resources | indent 10 }}
+        command:  ["rm", "-fr", "/var/lib/mysql/lost+found"]
+        volumeMounts:
+        - name: data
+          mountPath: /var/lib/mysql
+          {{- if .Values.persistence.subPath }}
+          subPath: {{ .Values.persistence.subPath }}
+          {{- end }}
+      {{- if .Values.extraInitContainers }}
+{{ tpl .Values.extraInitContainers . | indent 6 }}
+      {{- end }}
+      {{- if .Values.nodeSelector }}
+      nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 8 }}
+      {{- end }}
+      {{- if .Values.affinity }}
+      affinity:
+{{ toYaml .Values.affinity | indent 8 }}
+      {{- end }}
+      {{- if .Values.tolerations }}
+      tolerations:
+{{ toYaml .Values.tolerations | indent 8 }}
+      {{- end }}
+      containers:
+      - name: {{ template "mysql.fullname" . }}
+        image: "{{ .Values.image }}:{{ .Values.imageTag }}"
+        imagePullPolicy: {{ .Values.imagePullPolicy | quote }}
+
+        {{- with .Values.args }}
+        args:
+        {{- range . }}
+          - {{ . | quote }}
+        {{- end }}
+        {{- end }}
+        resources:
+{{ toYaml .Values.resources | indent 10 }}
+        env:
+        {{- if .Values.mysqlAllowEmptyPassword }}
+        - name: MYSQL_ALLOW_EMPTY_PASSWORD
+          value: "true"
+        {{- end }}
+        {{- if not (and .Values.allowEmptyRootPassword (not .Values.mysqlRootPassword)) }}
+        - name: MYSQL_ROOT_PASSWORD
+          valueFrom:
+            secretKeyRef:
+              name: {{ template "mysql.secretName" . }}
+              key: mysql-root-password
+              {{- if .Values.mysqlAllowEmptyPassword }}
+              optional: true
+              {{- end }}
+        {{- end }}
+        {{- if not (and .Values.allowEmptyRootPassword (not .Values.mysqlPassword)) }}
+        - name: MYSQL_PASSWORD
+          valueFrom:
+            secretKeyRef:
+              name: {{ template "mysql.secretName" . }}
+              key: mysql-password
+              {{- if or .Values.mysqlAllowEmptyPassword (empty .Values.mysqlUser) }}
+              optional: true
+              {{- end }}
+        {{- end }}
+        - name: MYSQL_USER
+          value: {{ default "" .Values.mysqlUser | quote }}
+        - name: MYSQL_DATABASE
+          value: {{ default "" .Values.mysqlDatabase | quote }}
+        {{- if .Values.timezone }}
+        - name: TZ
+          value: {{ .Values.timezone }}
+        {{- end }}
+        {{- if .Values.extraEnvVars }}
+{{ tpl .Values.extraEnvVars . | indent 8 }}
+        {{- end }}
+        ports:
+        - name: mysql
+          containerPort: 3306
+        {{- if .Values.mysqlx.port.enabled }}
+        - name: mysqlx
+          port: 33060
+        {{- end }}
+        livenessProbe:
+          exec:
+            command:
+            {{- if .Values.mysqlAllowEmptyPassword }}
+            - mysqladmin
+            - ping
+            {{- else }}
+            - sh
+            - -c
+            - "mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}"
+            {{- end }}
+          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+          periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
+          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+          successThreshold: {{ .Values.livenessProbe.successThreshold }}
+          failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
+        readinessProbe:
+          exec:
+            command:
+            {{- if .Values.mysqlAllowEmptyPassword }}
+            - mysqladmin
+            - ping
+            {{- else }}
+            - sh
+            - -c
+            - "mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}"
+            {{- end }}
+          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+          periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
+          successThreshold: {{ .Values.readinessProbe.successThreshold }}
+          failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
+        volumeMounts:
+        - name: data
+          mountPath: /var/lib/mysql
+          {{- if .Values.persistence.subPath }}
+          subPath: {{ .Values.persistence.subPath }}
+          {{- end }}
+        {{- if .Values.configurationFiles }}
+        {{- range $key, $val := .Values.configurationFiles }}
+        - name: configurations
+          mountPath: {{ $.Values.configurationFilesPath }}{{ $key }}
+          subPath: {{ $key }}
+        {{- end -}}
+        {{- end }}
+        {{- if .Values.initializationFiles }}
+        - name: migrations
+          mountPath: /docker-entrypoint-initdb.d
+        {{- end }}
+        {{- if .Values.ssl.enabled }}
+        - name: certificates
+          mountPath: /ssl
+        {{- end }}
+        {{- if .Values.extraVolumeMounts }}
+{{ tpl .Values.extraVolumeMounts . | indent 8 }}
+        {{- end }}
+      {{- if .Values.metrics.enabled }}
+      - name: metrics
+        image: "{{ .Values.metrics.image }}:{{ .Values.metrics.imageTag }}"
+        imagePullPolicy: {{ .Values.metrics.imagePullPolicy | quote }}
+        {{- if .Values.mysqlAllowEmptyPassword }}
+        command:
+        - 'sh'
+        - '-c'
+        - 'DATA_SOURCE_NAME="root@(localhost:3306)/" /bin/mysqld_exporter'
+        {{- else }}
+        env:
+        - name: MYSQL_ROOT_PASSWORD
+          valueFrom:
+            secretKeyRef:
+              name: {{ template "mysql.secretName" . }}
+              key: mysql-root-password
+        command:
+        - 'sh'
+        - '-c'
+        - 'DATA_SOURCE_NAME="root:$MYSQL_ROOT_PASSWORD@(localhost:3306)/" /bin/mysqld_exporter'
+        {{- end }}
+        {{- range $f := .Values.metrics.flags }}
+        - {{ $f | quote }}
+        {{- end }}
+        ports:
+        - name: metrics
+          containerPort: 9104
+        livenessProbe:
+          httpGet:
+            path: /
+            port: metrics
+          initialDelaySeconds: {{ .Values.metrics.livenessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.metrics.livenessProbe.timeoutSeconds }}
+        readinessProbe:
+          httpGet:
+            path: /
+            port: metrics
+          initialDelaySeconds: {{ .Values.metrics.readinessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.metrics.readinessProbe.timeoutSeconds }}
+        resources:
+{{ toYaml .Values.metrics.resources | indent 10 }}
+      {{- end }}
+      volumes:
+      {{- if .Values.configurationFiles }}
+      - name: configurations
+        configMap:
+          name: {{ template "mysql.fullname" . }}-configuration
+      {{- end }}
+      {{- if .Values.initializationFiles }}
+      - name: migrations
+        configMap:
+          name: {{ template "mysql.fullname" . }}-initialization
+      {{- end }}
+      {{- if .Values.ssl.enabled }}
+      - name: certificates
+        secret:
+          secretName: {{ .Values.ssl.secret }}
+      {{- end }}
+      - name: data
+      {{- if .Values.persistence.enabled }}
+        persistentVolumeClaim:
+          claimName: {{ .Values.persistence.existingClaim | default (include "mysql.fullname" .) }}
+      {{- else }}
+        emptyDir: {}
+      {{- end -}}
+      {{- if .Values.extraVolumes }}
+{{ tpl .Values.extraVolumes . | indent 6 }}
+      {{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/initializationFiles-configmap.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/initializationFiles-configmap.yaml
new file mode 100644
index 0000000..ee42c5b
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/initializationFiles-configmap.yaml
@@ -0,0 +1,35 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.initializationFiles }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ template "mysql.fullname" . }}-initialization
+  namespace: {{ .Release.Namespace }}
+data:
+{{- range $key, $val := .Values.initializationFiles }}
+  {{ $key }}: |-
+{{ $val | indent 4}}
+{{- end }}
+{{- end -}}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/pvc.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/pvc.yaml
new file mode 100644
index 0000000..61bca3f
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/pvc.yaml
@@ -0,0 +1,52 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: {{ template "mysql.fullname" . }}
+  namespace: {{ .Release.Namespace }}
+{{- with .Values.persistence.annotations  }}
+  annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+  labels:
+    app: {{ template "mysql.fullname" . }}
+    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+spec:
+  accessModes:
+    - {{ .Values.persistence.accessMode | quote }}
+  resources:
+    requests:
+      storage: {{ .Values.persistence.size | quote }}
+{{- if .Values.persistence.storageClass }}
+{{- if (eq "-" .Values.persistence.storageClass) }}
+  storageClassName: ""
+{{- else }}
+  storageClassName: "{{ .Values.persistence.storageClass }}"
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/secrets.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/secrets.yaml
new file mode 100644
index 0000000..12236c0
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/secrets.yaml
@@ -0,0 +1,74 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if not .Values.existingSecret }}
+{{- if or (not .Values.allowEmptyRootPassword) (or .Values.mysqlRootPassword .Values.mysqlPassword) }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ template "mysql.fullname" . }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    app: {{ template "mysql.fullname" . }}
+    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+type: Opaque
+data:
+  {{ if .Values.mysqlRootPassword }}
+  mysql-root-password:  {{ .Values.mysqlRootPassword | b64enc | quote }}
+  {{ else }}
+  {{ if not .Values.allowEmptyRootPassword }}
+  mysql-root-password: {{ randAlphaNum 10 | b64enc | quote }}
+  {{ end }}
+  {{ end }}
+  {{ if .Values.mysqlPassword }}
+  mysql-password:  {{ .Values.mysqlPassword | b64enc | quote }}
+  {{ else }}
+  {{ if not .Values.allowEmptyRootPassword }}
+  mysql-password: {{ randAlphaNum 10 | b64enc | quote }}
+  {{ end }}
+  {{ end }}
+{{ end }}
+{{- if .Values.ssl.enabled }}
+{{ if .Values.ssl.certificates }}
+{{- range .Values.ssl.certificates }}
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ .name }}
+  labels:
+    app: {{ template "mysql.fullname" $ }}
+    chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
+    release: "{{ $.Release.Name }}"
+    heritage: "{{ $.Release.Service }}"
+type: Opaque
+data:
+  ca.pem: {{ .ca | b64enc }}
+  server-cert.pem: {{ .cert | b64enc }}
+  server-key.pem: {{ .key | b64enc }}
+{{- end }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/serviceaccount.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/serviceaccount.yaml
new file mode 100644
index 0000000..8488fd8
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/serviceaccount.yaml
@@ -0,0 +1,34 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.serviceAccount.create }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ template "mysql.serviceAccountName" . }}
+  labels:
+    app: {{ template "mysql.fullname" . }}
+    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/servicemonitor.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/servicemonitor.yaml
new file mode 100644
index 0000000..aa64c59
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/servicemonitor.yaml
@@ -0,0 +1,49 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ include "mysql.fullname" . }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    app: {{ template "mysql.fullname" . }}
+    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+    {{- if .Values.metrics.serviceMonitor.additionalLabels }}
+{{ toYaml .Values.metrics.serviceMonitor.additionalLabels | indent 4 }}
+    {{- end }}
+spec:
+  endpoints:
+    - port: metrics
+      interval: 30s
+  namespaceSelector:
+    matchNames:
+      - {{ .Release.Namespace }}
+  selector:
+    matchLabels:
+      app: {{ include "mysql.fullname" . }}
+      release: {{ .Release.Name }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/svc.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/svc.yaml
new file mode 100644
index 0000000..7588671
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/svc.yaml
@@ -0,0 +1,65 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "mysql.fullname" . }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    app: {{ template "mysql.fullname" . }}
+    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+    release: "{{ .Release.Name }}"
+    heritage: "{{ .Release.Service }}"
+  annotations:
+{{- if .Values.service.annotations }}
+{{ toYaml .Values.service.annotations | indent 4 }}
+{{- end }}
+{{- if and (.Values.metrics.enabled) (.Values.metrics.annotations) }}
+{{ toYaml .Values.metrics.annotations | indent 4 }}
+{{- end }}
+spec:
+  type: {{ .Values.service.type }}
+  {{- if (and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP))) }}
+  loadBalancerIP: {{ .Values.service.loadBalancerIP }}
+  {{- end }}
+  ports:
+  - name: mysql
+    port: {{ .Values.service.port }}
+    targetPort: mysql
+    {{- if .Values.service.nodePort }}
+    nodePort: {{ .Values.service.nodePort }}
+    {{- end }}
+  {{- if .Values.mysqlx.port.enabled }}
+  - name: mysqlx
+    port: 33060
+    targetPort: mysqlx
+    protocol: TCP
+  {{- end }}
+  {{- if .Values.metrics.enabled }}
+  - name: metrics
+    port: 9104
+    targetPort: metrics
+  {{- end }}
+  selector:
+    app: {{ template "mysql.fullname" . }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/tests/test-configmap.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/tests/test-configmap.yaml
new file mode 100644
index 0000000..35d85b6
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/tests/test-configmap.yaml
@@ -0,0 +1,46 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.testFramework.enabled  }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ template "mysql.fullname" . }}-test
+  namespace: {{ .Release.Namespace }}
+  labels:
+    app: {{ template "mysql.fullname" . }}
+    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+    heritage: "{{ .Release.Service }}"
+    release: "{{ .Release.Name }}"
+data:
+  run.sh: |-
+    {{- if .Values.ssl.enabled | and .Values.mysqlRootPassword }}
+    @test "Testing SSL MySQL Connection" {
+      mysql --host={{ template "mysql.fullname" . }} --port={{ .Values.service.port | default "3306" }} --ssl-cert=/ssl/server-cert.pem --ssl-key=ssl/server-key.pem -u root -p{{ .Values.mysqlRootPassword }}
+    }
+    {{- else if .Values.mysqlRootPassword }}
+    @test "Testing MySQL Connection" {
+      mysql --host={{ template "mysql.fullname" . }} --port={{ .Values.service.port | default "3306" }} -u root -p{{ .Values.mysqlRootPassword }}
+    }
+    {{- end }}
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/tests/test.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/tests/test.yaml
new file mode 100644
index 0000000..23410a0
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/templates/tests/test.yaml
@@ -0,0 +1,82 @@
+{{- /*
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
+
+{{- if .Values.testFramework.enabled  }}
+apiVersion: v1
+kind: Pod
+metadata:
+  name: {{ template "mysql.fullname" . }}-test
+  namespace: {{ .Release.Namespace }}
+  labels:
+    app: {{ template "mysql.fullname" . }}
+    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+    heritage: "{{ .Release.Service }}"
+    release: "{{ .Release.Name }}"
+  annotations:
+    "helm.sh/hook": test-success
+spec:
+  {{- if .Values.testFramework.securityContext }}
+  securityContext: {{ toYaml .Values.testFramework.securityContext | nindent 4 }}
+  {{- end }}
+  {{- if .Values.imagePullSecrets }}
+  imagePullSecrets:
+  {{- range .Values.imagePullSecrets }}
+    - name: {{ . }}
+  {{- end}}
+  {{- end }}
+  {{- with .Values.nodeSelector }}
+  nodeSelector:
+{{ toYaml . | indent 4 }}
+  {{- end }}
+  {{- with .Values.affinity }}
+  affinity:
+{{ toYaml . | indent 4 }}
+  {{- end }}
+  {{- with .Values.tolerations }}
+  tolerations:
+{{ toYaml . | indent 4 }}
+  {{- end }}
+  containers:
+    - name: {{ .Release.Name }}-test
+      image: "{{ .Values.testFramework.image }}:{{ .Values.testFramework.tag }}"
+      imagePullPolicy: "{{ .Values.testFramework.imagePullPolicy}}"
+      command: ["/opt/bats/bin/bats", "-t", "/tests/run.sh"]
+      volumeMounts:
+      - mountPath: /tests
+        name: tests
+        readOnly: true
+      {{- if .Values.ssl.enabled }}
+      - name: certificates
+        mountPath: /ssl
+      {{- end }}
+  volumes:
+  - name: tests
+    configMap:
+      name: {{ template "mysql.fullname" . }}-test
+  {{- if .Values.ssl.enabled }}
+  - name: certificates
+    secret:
+      secretName: {{ .Values.ssl.secret }}
+  {{- end }}
+  restartPolicy: Never
+{{- end }}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/values.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/values.yaml
new file mode 100644
index 0000000..180c52d
--- /dev/null
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql-chart/values.yaml
@@ -0,0 +1,267 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+## mysql image version
+## ref: https://hub.docker.com/r/library/mysql/tags/
+##
+image: "mysql"
+imageTag: "5.7.30"
+
+strategy:
+  type: Recreate
+
+busybox:
+  image: "busybox"
+  tag: "1.32"
+
+testFramework:
+  enabled: true
+  image: "bats/bats"
+  tag: "1.2.1"
+  imagePullPolicy: IfNotPresent
+  securityContext: {}
+
+## Specify password for root user
+##
+## Default: random 10 character string
+# mysqlRootPassword: testing
+
+## Create a database user
+##
+# mysqlUser:
+## Default: random 10 character string
+# mysqlPassword:
+
+## Allow unauthenticated access, uncomment to enable
+##
+# mysqlAllowEmptyPassword: true
+
+## Create a database
+##
+# mysqlDatabase:
+
+## Specify an imagePullPolicy (Required)
+## It's recommended to change this to 'Always' if the image tag is 'latest'
+## ref: http://kubernetes.io/docs/user-guide/images/#updating-images
+##
+imagePullPolicy: IfNotPresent
+
+## Additionnal arguments that are passed to the MySQL container.
+## For example use --default-authentication-plugin=mysql_native_password if older clients need to
+## connect to a MySQL 8 instance.
+args: []
+
+extraVolumes: |
+  # - name: extras
+  #   emptyDir: {}
+
+extraVolumeMounts: |
+  # - name: extras
+  #   mountPath: /usr/share/extras
+  #   readOnly: true
+
+extraInitContainers: |
+  # - name: do-something
+  #   image: busybox
+  #   command: ['do', 'something']
+
+## A string to add extra environment variables
+# extraEnvVars: |
+#   - name: EXTRA_VAR
+#     value: "extra"
+
+# Optionally specify an array of imagePullSecrets.
+# Secrets must be manually created in the namespace.
+# ref: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod
+# imagePullSecrets:
+  # - name: myRegistryKeySecretName
+
+## Node selector
+## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector
+nodeSelector: {}
+
+## Affinity
+## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+affinity: {}
+
+## Tolerations for pod assignment
+## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+##
+tolerations: []
+
+livenessProbe:
+  initialDelaySeconds: 30
+  periodSeconds: 10
+  timeoutSeconds: 5
+  successThreshold: 1
+  failureThreshold: 3
+
+readinessProbe:
+  initialDelaySeconds: 5
+  periodSeconds: 10
+  timeoutSeconds: 1
+  successThreshold: 1
+  failureThreshold: 3
+
+## Persist data to a persistent volume
+persistence:
+  enabled: true
+  ## database data Persistent Volume Storage Class
+  ## If defined, storageClassName: <storageClass>
+  ## If set to "-", storageClassName: "", which disables dynamic provisioning
+  ## If undefined (the default) or set to null, no storageClassName spec is
+  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
+  ##   GKE, AWS & OpenStack)
+  ##
+  # storageClass: "-"
+  accessMode: ReadWriteOnce
+  size: 8Gi
+  annotations: {}
+
+## Use an alternate scheduler, e.g. "stork".
+## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+##
+# schedulerName:
+
+## Security context
+securityContext:
+  enabled: false
+  runAsUser: 999
+  fsGroup: 999
+
+## Configure resource requests and limits
+## ref: http://kubernetes.io/docs/user-guide/compute-resources/
+##
+resources:
+  requests:
+    memory: 256Mi
+    cpu: 100m
+
+# Custom mysql configuration files path
+configurationFilesPath: /etc/mysql/conf.d/
+
+# Custom mysql configuration files used to override default mysql settings
+configurationFiles: {}
+#  mysql.cnf: |-
+#    [mysqld]
+#    skip-name-resolve
+#    ssl-ca=/ssl/ca.pem
+#    ssl-cert=/ssl/server-cert.pem
+#    ssl-key=/ssl/server-key.pem
+
+# Custom mysql init SQL files used to initialize the database
+initializationFiles: {}
+#  first-db.sql: |-
+#    CREATE DATABASE IF NOT EXISTS first DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
+#  second-db.sql: |-
+#    CREATE DATABASE IF NOT EXISTS second DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
+
+# To enaable the mysql X Protocol's port
+# .. will expose the port 33060
+# .. Note the X Plugin needs installation
+# ref: https://dev.mysql.com/doc/refman/8.0/en/x-plugin-checking-installation.html
+mysqlx:
+  port:
+    enabled: false
+
+metrics:
+  enabled: false
+  image: prom/mysqld-exporter
+  imageTag: v0.10.0
+  imagePullPolicy: IfNotPresent
+  resources: {}
+  annotations: {}
+    # prometheus.io/scrape: "true"
+    # prometheus.io/port: "9104"
+  livenessProbe:
+    initialDelaySeconds: 15
+    timeoutSeconds: 5
+  readinessProbe:
+    initialDelaySeconds: 5
+    timeoutSeconds: 1
+  flags: []
+  serviceMonitor:
+    enabled: false
+    additionalLabels: {}
+
+## Configure the service
+## ref: http://kubernetes.io/docs/user-guide/services/
+service:
+  annotations: {}
+  ## Specify a service type
+  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types
+  type: ClusterIP
+  port: 3306
+  # nodePort: 32000
+  # loadBalancerIP:
+
+## Pods Service Account
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
+serviceAccount:
+  ## Specifies whether a ServiceAccount should be created
+  ##
+  create: false
+  ## The name of the ServiceAccount to use.
+  ## If not set and create is true, a name is generated using the mariadb.fullname template
+  # name:
+
+ssl:
+  enabled: false
+  secret: mysql-ssl-certs
+  certificates:
+#  - name: mysql-ssl-certs
+#    ca: |-
+#      -----BEGIN CERTIFICATE-----
+#      ...
+#      -----END CERTIFICATE-----
+#    cert: |-
+#      -----BEGIN CERTIFICATE-----
+#      ...
+#      -----END CERTIFICATE-----
+#    key: |-
+#      -----BEGIN RSA PRIVATE KEY-----
+#      ...
+#      -----END RSA PRIVATE KEY-----
+
+## Populates the 'TZ' system timezone environment variable
+## ref: https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html
+##
+## Default: nil (mysql will use image's default timezone, normally UTC)
+## Example: 'Australia/Sydney'
+# timezone:
+
+# Deployment Annotations
+deploymentAnnotations: {}
+
+# To be added to the database server pod(s)
+podAnnotations: {}
+podLabels: {}
+
+## Set pod priorityClassName
+# priorityClassName: {}
+
+
+## Init container resources defaults
+initContainer:
+  resources:
+    requests:
+      memory: 10Mi
+      cpu: 10m
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql.tf
index e6afb3f..d54491a 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/mysql.tf
@@ -33,9 +33,9 @@
 
 resource "helm_release" "keycloak-mysql" {
   name       = "keycloak-mysql"
-  chart      = "stable/mysql"
-  namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-  wait       = true
+  chart = "./modules/helm_charts/mysql-chart"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
   values     = [
     data.template_file.mysql_values.rendered
   ]
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/nginx-ingress/templates/nginx-ingress.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/nginx-ingress/templates/nginx-ingress.yaml
index f8acfe0..00c603b 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/nginx-ingress/templates/nginx-ingress.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/nginx-ingress/templates/nginx-ingress.yaml
@@ -54,8 +54,8 @@
         image: gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.3
         args:
         - /nginx-ingress-controller
-        - --default-backend-service=dlab/nginx-default-backend
-        - --publish-service=dlab/nginx-ingress
+        - --default-backend-service=datalab/nginx-default-backend
+        - --publish-service=datalab/nginx-ingress
         env:
           - name: POD_NAME
             valueFrom:
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/nginx.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/nginx.tf
index e03bb97..d0d34ab 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/nginx.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/nginx.tf
@@ -25,9 +25,9 @@
 
 resource "helm_release" "nginx-default-backend" {
     name       = "nginx-default-backend"
-    chart      = "./modules/helm_charts/nginx-default-backend"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-    wait       = true
+    chart = "./modules/helm_charts/nginx-default-backend"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
     depends_on = [null_resource.crd_delay]
     values     = [
         data.template_file.nginx-default-backend.rendered
@@ -40,9 +40,9 @@
 
 resource "helm_release" "nginx" {
     name       = "nginx-ingress"
-    chart      = "./modules/helm_charts/nginx-ingress"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
-    wait       = true
+  chart = "./modules/helm_charts/nginx-ingress"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
+  wait = true
     depends_on = [helm_release.nginx-default-backend]
     values     = [
         data.template_file.nginx-ingress.rendered
@@ -51,8 +51,8 @@
 
 data "kubernetes_service" "nginx_service" {
     metadata {
-        name       = helm_release.nginx.name
-        namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+      name = helm_release.nginx.name
+      namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
     }
     depends_on     = [helm_release.nginx]
 }
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/outputs.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/outputs.tf
index 154527d..726c93c 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/outputs.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/outputs.tf
@@ -24,7 +24,7 @@
 }
 
 output "keycloak_client_id" {
-    value = "dlab-ui"
+    value = "datalab-ui"
 }
 
 output "keycloak_user_password" {
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/secrets.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/secrets.tf
index 5a78c41..47d5edd 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/secrets.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/secrets.tf
@@ -28,8 +28,8 @@
 
 resource "kubernetes_secret" "keycloak_client_secret" {
   metadata {
-    name       = "keycloak-client-secret"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "keycloak-client-secret"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -45,8 +45,8 @@
 
 resource "kubernetes_secret" "keycloak_password_secret" {
   metadata {
-    name       = "keycloak-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "keycloak-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -61,8 +61,8 @@
 
 resource "kubernetes_secret" "mongo_root_password_secret" {
   metadata {
-    name       = "mongo-root-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "mongo-root-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -77,8 +77,8 @@
 
 resource "kubernetes_secret" "mongo_db_password_secret" {
   metadata {
-    name       = "mongo-db-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "mongo-db-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -93,8 +93,8 @@
 
 resource "kubernetes_secret" "mysql_root_password_secret" {
   metadata {
-    name       = "mysql-root-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "mysql-root-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -109,8 +109,8 @@
 
 resource "kubernetes_secret" "mysql_keycloak_user_password_secret" {
   metadata {
-    name       = "mysql-keycloak-user-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "mysql-keycloak-user-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -120,8 +120,8 @@
 
 resource "kubernetes_secret" "ssn_keystore_password" {
   metadata {
-    name       = "ssn-keystore-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "ssn-keystore-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -136,8 +136,8 @@
 
 resource "kubernetes_secret" "step_ca_password_secret" {
   metadata {
-    name       = "step-ca-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "step-ca-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
@@ -152,8 +152,8 @@
 
 resource "kubernetes_secret" "step_ca_provisioner_password_secret" {
   metadata {
-    name       = "step-ca-provisioner-password"
-    namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+    name = "step-ca-provisioner-password"
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 
   data = {
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/.helmignore b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/.helmignore
index 2f795d4..e25078a 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/.helmignore
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/.helmignore
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/Chart.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/Chart.yaml
index e9d93e2..c3373d7 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/Chart.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/Chart.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
@@ -27,22 +27,22 @@
 home: https://smallstep.com
 icon: https://raw.githubusercontent.com/smallstep/certificates/master/icon.png
 keywords:
-  - acme
-- authority
-- ca
-- certificate
-- certificates
-- certificate-authority
-- kubernetes
-- pki
-- security
-- security-tools
-- smallstep
-- ssh
-- step
-- step-ca
-- tls
-- x509
+ - acme
+ - authority
+ - ca
+ - certificate
+ - certificates
+ - certificate-authority
+ - kubernetes
+ - pki
+ - security
+ - security-tools
+ - smallstep
+ - ssh
+ - step
+ - step-ca
+ - tls
+ - x509
 maintainers:
 - email: mariano@smallstep.com
   name: Mariano Cano
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/NOTES.txt b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/NOTES.txt
index 43f6544..5fbd70d 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/NOTES.txt
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/NOTES.txt
@@ -1,3 +1,23 @@
+# *****************************************************************************
+#
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#
+# ******************************************************************************
 
 Thanks for installing Step CA.
 
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/bootstrap.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/bootstrap.yaml
index 354c144..89cdf60 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/bootstrap.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/bootstrap.yaml
@@ -1,3 +1,4 @@
+{{- /*
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -18,6 +19,7 @@
 # under the License.
 #
 # ******************************************************************************
+*/ -}}
 
   {{- if .Release.IsInstall -}}
 apiVersion: v1
@@ -25,8 +27,7 @@
 metadata:
   name: {{ include "step-certificates.fullname" . }}-config
   namespace: {{.Release.Namespace}}
-  labels:
-  {{ include "step-certificates.labels" . | indent 4 }}
+  labels: {{ include "step-certificates.labels" . | nindent 4 }}
 ---
 apiVersion: batch/v1
 kind: Job
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/ca.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/ca.yaml
index 2551cc5..f3c96c8 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/ca.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/ca.yaml
@@ -1,3 +1,4 @@
+{{- /*
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -18,13 +19,13 @@
 # under the License.
 #
 # ******************************************************************************
+*/ -}}
 
 apiVersion: apps/v1
 kind: StatefulSet
 metadata:
   name: {{ include "step-certificates.fullname" . }}
-  labels:
-  {{ include "step-certificates.labels" . | indent 4 }}
+  labels: {{ include "step-certificates.labels" . | nindent 4 }}
 spec:
   # Only one replica is supported at this moment
   # Requested {{ .Values.replicaCount }}
@@ -41,119 +42,118 @@
         app.kubernetes.io/instance: {{ .Release.Name }}
         app: {{ include "step-certificates.fullname" . }}
     spec:
-{{- if .Release.IsInstall }}
-initContainers:
-  - name: {{ .Chart.Name }}-init
-    image: busybox:latest
-    imagePullPolicy: {{ .Values.image.pullPolicy }}
-    command: ["sleep", "20"]
-{{- end }}
-securityContext:
-  {{- if .Values.ca.runAsRoot }}
-  runAsUser: 0
-  {{- else }}
-  runAsUser: 1000
-  runAsNonRoot: true
-  runAsGroup: 1000
-  fsGroup: 1000
-  allowPrivilegeEscalation: false
-  {{- end }}
-containers:
-  - name: {{ .Chart.Name }}
-    image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
-    imagePullPolicy: {{ .Values.image.pullPolicy }}
-    command: ["/usr/local/bin/step-ca",
-              "--password-file", "/home/step/secrets/passwords/password",
-              "/home/step/config/ca.json"]
-    env:
-      - name: NAMESPACE
-        value: "{{ .Release.Namespace }}"
-    ports:
-      - name: https
-        containerPort: {{ .Values.service.targetPort }}
-        protocol: TCP
-    livenessProbe:
-      initialDelaySeconds: 5
-      httpGet:
-        path: /health
-        port: {{ .Values.service.targetPort }}
-        scheme: HTTPS
-    readinessProbe:
-      initialDelaySeconds: 5
-      httpGet:
-        path: /health
-        port: {{ .Values.service.targetPort }}
-        scheme: HTTPS
-    resources:
-      {{- toYaml .Values.resources | nindent 12 }}
-    volumeMounts:
-      - name: certs
-        mountPath: /home/step/certs
-        readOnly: true
-      - name: config
-        mountPath: /home/step/config
-        readOnly: true
-      - name: secrets
-        mountPath: /home/step/secrets
-        readOnly: true
-      - name: ca-password
-        mountPath: /home/step/secrets/passwords
-        readOnly: true
-    {{- if .Values.ca.db.enabled }}
-    - name: database
-      mountPath: /home/step/db
-      readOnly: false
-    {{- end }}
-volumes:
-  - name: certs
-    configMap:
-      name: {{ include "step-certificates.fullname" . }}-certs
-  - name: config
-configMap:
-  name: {{ include "step-certificates.fullname" . }}-config
-  - name: secrets
-configMap:
-  name: {{ include "step-certificates.fullname" . }}-secrets
-  - name: ca-password
-secret:
-  secretName: {{ include "step-certificates.fullname" . }}-ca-password
-  {{- if and .Values.ca.db.enabled (not .Values.ca.db.persistent) }}
-  - name: database
-emptyDir: {}
-  {{- end }}
-  {{- with .Values.nodeSelector }}
-nodeSelector:
-  {{- toYaml . | nindent 8 }}
-  {{- end }}
-  {{- with .Values.affinity }}
-affinity:
-  {{- toYaml . | nindent 8 }}
-  {{- end }}
-  {{- with .Values.tolerations }}
-tolerations:
-  {{- toYaml . | nindent 8 }}
-  {{- end }}
-{{- if and .Values.ca.db.enabled .Values.ca.db.persistent }}
-volumeClaimTemplates:
-  - metadata:
-      name: database
-      labels:
-        app.kubernetes.io/name: {{ include "step-certificates.name" . }}
-        app.kubernetes.io/instance: {{ .Release.Name }}
-        app.kubernetes.io/managed-by: {{ .Release.Service }}
-    spec:
-      accessModes:
-      {{- range .Values.ca.db.accessModes }}
-      - {{ . | quote }}
+      {{- if .Release.IsInstall }}
+      initContainers:
+        - name: {{ .Chart.Name }}-init
+          image: busybox:latest
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          command: ["sleep", "20"]
       {{- end }}
-      resources:
-        requests:
-          storage: {{ .Values.ca.db.size | quote }}
-    {{- if .Values.ca.db.storageClass }}
-    {{- if (eq "-" .Values.ca.db.storageClass) }}
-    storageClassName: ""
-    {{- else }}
-    storageClassName: {{ .Values.ca.db.storageClass | quote }}
-    {{- end }}
-    {{- end }}
-{{- end }}
\ No newline at end of file
+      securityContext:
+        {{- if .Values.ca.runAsRoot }}
+        runAsUser: 0
+        {{- else }}
+        runAsUser: 1000
+        runAsNonRoot: true
+        runAsGroup: 1000
+        fsGroup: 1000
+        {{- end }}
+      containers:
+        - name: {{ .Chart.Name }}
+          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          command: ["/usr/local/bin/step-ca",
+                    "--password-file", "/home/step/secrets/passwords/password",
+                    "/home/step/config/ca.json"]
+          env:
+            - name: NAMESPACE
+              value: "{{ .Release.Namespace }}"
+          ports:
+            - name: https
+              containerPort: {{ .Values.service.targetPort }}
+              protocol: TCP
+          livenessProbe:
+            initialDelaySeconds: 5
+            httpGet:
+              path: /health
+              port: {{ .Values.service.targetPort }}
+              scheme: HTTPS
+          readinessProbe:
+            initialDelaySeconds: 5
+            httpGet:
+              path: /health
+              port: {{ .Values.service.targetPort }}
+              scheme: HTTPS
+          resources:
+            {{- toYaml .Values.resources | nindent 12 }}
+          volumeMounts:
+            - name: certs
+              mountPath: /home/step/certs
+              readOnly: true
+            - name: config
+              mountPath: /home/step/config
+              readOnly: true
+            - name: secrets
+              mountPath: /home/step/secrets
+              readOnly: true
+            - name: ca-password
+              mountPath: /home/step/secrets/passwords
+              readOnly: true
+            {{- if .Values.ca.db.enabled }}
+            - name: database
+              mountPath: /home/step/db
+              readOnly: false
+            {{- end }}
+      volumes:
+        - name: certs
+          configMap:
+            name: {{ include "step-certificates.fullname" . }}-certs
+        - name: config
+          configMap:
+            name: {{ include "step-certificates.fullname" . }}-config
+        - name: secrets
+          configMap:
+            name: {{ include "step-certificates.fullname" . }}-secrets
+        - name: ca-password
+          secret:
+            secretName: {{ include "step-certificates.fullname" . }}-ca-password
+        {{- if and .Values.ca.db.enabled (not .Values.ca.db.persistent) }}
+        - name: database
+          emptyDir: {}
+        {{- end }}
+        {{- with .Values.nodeSelector }}
+        nodeSelector:
+          {{- toYaml . | nindent 8 }}
+        {{- end }}
+        {{- with .Values.affinity }}
+        affinity:
+          {{- toYaml . | nindent 8 }}
+        {{- end }}
+        {{- with .Values.tolerations }}
+        tolerations:
+          {{- toYaml . | nindent 8 }}
+        {{- end }}
+  {{- if and .Values.ca.db.enabled .Values.ca.db.persistent }}
+  volumeClaimTemplates:
+    - metadata:
+        name: database
+        labels:
+          app.kubernetes.io/name: {{ include "step-certificates.name" . }}
+          app.kubernetes.io/instance: {{ .Release.Name }}
+          app.kubernetes.io/managed-by: {{ .Release.Service }}
+      spec:
+        accessModes:
+        {{- range .Values.ca.db.accessModes }}
+        - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.ca.db.size | quote }}
+        {{- if .Values.ca.db.storageClass }}
+        {{- if (eq "-" .Values.ca.db.storageClass) }}
+        storageClassName: ""
+        {{- else }}
+        storageClassName: {{ .Values.ca.db.storageClass | quote }}
+        {{- end }}
+        {{- end }}
+  {{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/configmaps.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/configmaps.yaml
index 1670d9a..a512f33 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/configmaps.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/configmaps.yaml
@@ -1,3 +1,4 @@
+{{- /*
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -18,6 +19,7 @@
 # under the License.
 #
 # ******************************************************************************
+*/ -}}
 
 # ConfigMaps that will be updated by the configuration job:
 # 1. Step CA config directory.
@@ -28,16 +30,14 @@
 metadata:
   name: {{ include "step-certificates.fullname" . }}-config
   namespace: {{.Release.Namespace}}
-  labels:
-{{ include "step-certificates.labels" . | indent 4 }}
+  labels: {{ include "step-certificates.labels" . | nindent 4 }}
 ---
 apiVersion: v1
 kind: ConfigMap
 metadata:
   name: {{ include "step-certificates.fullname" . }}-certs
   namespace: {{.Release.Namespace}}
-  labels:
-{{ include "step-certificates.labels" . | indent 4 }}
+  labels: {{ include "step-certificates.labels" . | nindent 4 }}
 ---
 apiVersion: v1
 data:
@@ -47,29 +47,25 @@
 metadata:
   name: {{ include "step-certificates.fullname" . }}-secrets
   namespace: {{.Release.Namespace}}
-  labels:
-{{ include "step-certificates.labels" . | indent 4 }}
+  labels: {{ include "step-certificates.labels" . | nindent 4 }}
 ---
 apiVersion: v1
 kind: ConfigMap
 metadata:
   name: {{ include "step-certificates.fullname" . }}-bootstrap
   namespace: {{.Release.Namespace}}
-  labels:
-{{ include "step-certificates.labels" . | indent 4 }}
+  labels: {{ include "step-certificates.labels" . | nindent 4 }}
 data:
   bootstrap.sh: |-
     #!/bin/sh
     STEPPATH=/home/step
     echo -e "\e[1mWelcome to Step Certificates configuration.\e[0m\n"
-
     function permission_error () {
       echo -e "\033[0;31mPERMISSION ERROR:\033[0m $1\n"
       exit 1
     }
-
     function kbreplace() {
-      kubectl $@ -o yaml --dry-run | kubectl replace -f -
+      kubectl $@ -o yaml --dry-run=client | kubectl replace -f -
     }
 
     echo -e "\e[1mConfiguring kubctl with service account...\e[0m"
@@ -91,77 +87,77 @@
     if [ $? -ne 0 ]; then
       permission_error "create secrets"
     fi
-{{ if .Values.autocert.enabled }}
-echo -n "Checking for permission to create mutatingwebhookconfiguration in {{.Release.Namespace}} namespace: "
-    kubectl auth can-i create mutatingwebhookconfiguration --namespace {{.Release.Namespace}}
-    if [ $? -ne 0 ]; then
-      permission_error "create mutatingwebhookconfiguration"
-  fi
-{{- end }}
+    {{ if .Values.autocert.enabled }}
+    echo -n "Checking for permission to create mutatingwebhookconfiguration in {{.Release.Namespace}} namespace: "
+        kubectl auth can-i create mutatingwebhookconfiguration --namespace {{.Release.Namespace}}
+        if [ $? -ne 0 ]; then
+          permission_error "create mutatingwebhookconfiguration"
+      fi
+    {{- end }}
 
-# Setting this here on purpose, after the above section which explicitly checks
-# for and handles exit errors.
-  set -e
+    # Setting this here on purpose, after the above section which explicitly checks
+    # for and handles exit errors.
+      set -e
 
-  echo -e "\n\e[1mInitializating the CA...\e[0m"
+      echo -e "\n\e[1mInitializating the CA...\e[0m"
 
-# CA password
-{{- if .Values.ca.password }}
-  CA_PASSWORD={{ quote .Values.ca.password }}
-{{- else }}
-  CA_PASSWORD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo '')
-{{- end }}
-# Provisioner password
-{{- if .Values.ca.provisioner.password }}
-  CA_PROVISIONER_PASSWORD={{ quote .Values.ca.provisioner.password }}
-{{- else }}
-  CA_PROVISIONER_PASSWORD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo '')
-{{- end }}
+    # CA password
+    {{- if .Values.ca.password }}
+      CA_PASSWORD={{ quote .Values.ca.password }}
+    {{- else }}
+      CA_PASSWORD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo '')
+    {{- end }}
+    # Provisioner password
+    {{- if .Values.ca.provisioner.password }}
+      CA_PROVISIONER_PASSWORD={{ quote .Values.ca.provisioner.password }}
+    {{- else }}
+      CA_PROVISIONER_PASSWORD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo '')
+    {{- end }}
 
-  TMP_CA_PASSWORD=$(mktemp /tmp/autocert.XXXXXX)
-  TMP_CA_PROVISIONER_PASSWORD=$(mktemp /tmp/autocert.XXXXXX)
+    TMP_CA_PASSWORD=$(mktemp /tmp/autocert.XXXXXX)
+    TMP_CA_PROVISIONER_PASSWORD=$(mktemp /tmp/autocert.XXXXXX)
 
-  echo $CA_PASSWORD > $TMP_CA_PASSWORD
-  echo $CA_PROVISIONER_PASSWORD > $TMP_CA_PROVISIONER_PASSWORD
+    echo $CA_PASSWORD > $TMP_CA_PASSWORD
+    echo $CA_PROVISIONER_PASSWORD > $TMP_CA_PROVISIONER_PASSWORD
 
-  step ca init \
-  --name "{{.Values.ca.name}}" \
-  --dns "{{include "step-certificates.dns" .}}" \
-  --address "{{.Values.ca.address}}" \
-  --provisioner "{{.Values.ca.provisioner.name}}" \
-  --with-ca-url "{{include "step-certificates.url" .}}" \
-  --password-file "$TMP_CA_PASSWORD" \
-  --provisioner-password-file "$TMP_CA_PROVISIONER_PASSWORD" {{ if not .Values.ca.db.enabled }}--no-db{{ end }}
+    step ca init \
+    --name "{{.Values.ca.name}}" \
+    --dns "{{include "step-certificates.dns" .}}" \
+    --address "{{.Values.ca.address}}" \
+    --provisioner "{{.Values.ca.provisioner.name}}" \
+    --with-ca-url "{{include "step-certificates.url" .}}" \
+    --password-file "$TMP_CA_PASSWORD" \
+    --provisioner-password-file "$TMP_CA_PROVISIONER_PASSWORD" {{ if not .Values.ca.db.enabled }}--no-db{{ end }}
 
-  rm -f $TMP_CA_PASSWORD $TMP_CA_PROVISIONER_PASSWORD
+    rm -f $TMP_CA_PASSWORD $TMP_CA_PROVISIONER_PASSWORD
 
-  echo -e "\n\e[1mCreating configmaps and secrets in {{.Release.Namespace}} namespace ...\e[0m"
+    echo -e "\n\e[1mCreating configmaps and secrets in {{.Release.Namespace}} namespace ...\e[0m"
 
-  # Replace secrets created on helm install
-  # It allows to properly remove them on helm delete
-  kbreplace -n {{.Release.Namespace}} create configmap {{ include "step-certificates.fullname" . }}-config --from-file $(step path)/config
-  kbreplace -n {{.Release.Namespace}} create configmap {{ include "step-certificates.fullname" . }}-certs --from-file $(step path)/certs
-  kbreplace -n {{.Release.Namespace}} create configmap {{ include "step-certificates.fullname" . }}-secrets --from-file $(step path)/secrets
+    # Replace secrets created on helm install
+    # It allows to properly remove them on helm delete
+    kbreplace -n {{.Release.Namespace}} create configmap {{ include "step-certificates.fullname" . }}-config --from-file $(step path)/config
+    kbreplace -n {{.Release.Namespace}} create configmap {{ include "step-certificates.fullname" . }}-certs --from-file $(step path)/certs
+    kbreplace -n {{.Release.Namespace}} create configmap {{ include "step-certificates.fullname" . }}-secrets --from-file $(step path)/secrets
 
-  kbreplace -n {{.Release.Namespace}} create secret generic {{ include "step-certificates.fullname" . }}-ca-password --from-literal "password=${CA_PASSWORD}"
-  kbreplace -n {{.Release.Namespace}} create secret generic {{ include "step-certificates.fullname" . }}-provisioner-password --from-literal "password=${CA_PROVISIONER_PASSWORD}"
+    kbreplace -n {{.Release.Namespace}} create secret generic {{ include "step-certificates.fullname" . }}-ca-password --from-literal "password=${CA_PASSWORD}"
+    kbreplace -n {{.Release.Namespace}} create secret generic {{ include "step-certificates.fullname" . }}-provisioner-password --from-literal "password=${CA_PROVISIONER_PASSWORD}"
 
-# Label all configmaps and secrets
-kubectl -n {{.Release.Namespace}} label configmap {{ include "step-certificates.fullname" . }}-config {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
-kubectl -n {{.Release.Namespace}} label configmap {{ include "step-certificates.fullname" . }}-certs {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
-kubectl -n {{.Release.Namespace}} label configmap {{ include "step-certificates.fullname" . }}-secrets {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
-kubectl -n {{.Release.Namespace}} label secret {{ include "step-certificates.fullname" . }}-ca-password {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
-kubectl -n {{.Release.Namespace}} label secret {{ include "step-certificates.fullname" . }}-provisioner-password {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
+    # Label all configmaps and secrets
+    kubectl -n {{.Release.Namespace}} label configmap {{ include "step-certificates.fullname" . }}-config {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
+    kubectl -n {{.Release.Namespace}} label configmap {{ include "step-certificates.fullname" . }}-certs {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
+    kubectl -n {{.Release.Namespace}} label configmap {{ include "step-certificates.fullname" . }}-secrets {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
+    kubectl -n {{.Release.Namespace}} label secret {{ include "step-certificates.fullname" . }}-ca-password {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
+    kubectl -n {{.Release.Namespace}} label secret {{ include "step-certificates.fullname" . }}-provisioner-password {{ include "step-certificates.labels" . | replace ": " "=" | replace "\n" " " }}
 
-# Patch webhook if autocert is enabled
-{{ if .Values.autocert.enabled }}
-  CA_BUNDLE=$(cat $(step path)/certs/root_ca.crt | base64 | tr -d '\n')
-  kubectl patch mutatingwebhookconfigurations {{ .Release.Name }}-autocert-webhook-config \
-  --type json -p="[{\"op\":\"replace\",\"path\":\"/webhooks/0/clientConfig/caBundle\",\"value\":\"$CA_BUNDLE\"}]"
-{{- end }}
+    # Patch webhook if autocert is enabled
+    {{ if .Values.autocert.enabled }}
+      CA_BUNDLE=$(cat $(step path)/certs/root_ca.crt | base64 | tr -d '\n')
+      kubectl patch mutatingwebhookconfigurations {{ .Release.Name }}-autocert-webhook-config \
+      --type json -p="[{\"op\":\"replace\",\"path\":\"/webhooks/0/clientConfig/caBundle\",\"value\":\"$CA_BUNDLE\"}]"
+    {{- end }}
 
-  echo -e "\n\e[1mStep Certificates installed!\e[0m"
-  echo
-echo "CA URL: {{include "step-certificates.url" .}}"
-echo "CA Fingerprint: $(step certificate fingerprint $(step path)/certs/root_ca.crt)"
-  echo
\ No newline at end of file
+      echo -e "\n\e[1mStep Certificates installed!\e[0m"
+      echo
+    echo "CA URL: {{include "step-certificates.url" .}}"
+    echo "CA Fingerprint: $(step certificate fingerprint $(step path)/certs/root_ca.crt)"
+    echo
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/ingress.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/ingress.yaml
index 240bdaf..13a82b6 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/ingress.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/ingress.yaml
@@ -1,23 +1,25 @@
+{{- /*
 # *****************************************************************************
 #
-  # Licensed to the Apache Software Foundation (ASF) under one
-  # or more contributor license agreements.  See the NOTICE file
-  # distributed with this work for additional information
-  # regarding copyright ownership.  The ASF licenses this file
-  # to you under the Apache License, Version 2.0 (the
-  # "License"); you may not use this file except in compliance
-  # with the License.  You may obtain a copy of the License at
-  #
-  #   http://www.apache.org/licenses/LICENSE-2.0
-  #
-  # Unless required by applicable law or agreed to in writing,
-  # software distributed under the License is distributed on an
-  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  # KIND, either express or implied.  See the License for the
-  # specific language governing permissions and limitations
-  # under the License.
-  #
-  # ******************************************************************************
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+*/ -}}
 
   {{- if .Values.ingress.enabled -}}
   {{- $fullName := include "step-certificates.fullname" . -}}
@@ -54,4 +56,4 @@
         servicePort: http
     {{- end }}
   {{- end }}
-{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/rbac.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/rbac.yaml
index 0534856..f3fc096 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/rbac.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/rbac.yaml
@@ -1,3 +1,4 @@
+{{- /*
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -18,6 +19,7 @@
 # under the License.
 #
 # ******************************************************************************
+*/ -}}
 
   {{- if .Release.IsInstall -}}
 apiVersion: rbac.authorization.k8s.io/v1
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/secrets.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/secrets.yaml
index 68d0b8d..9c07c4c 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/secrets.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/secrets.yaml
@@ -1,3 +1,4 @@
+{{- /*
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -18,6 +19,7 @@
 # under the License.
 #
 # ******************************************************************************
+*/ -}}
 
 # Secrets that will be updated by the configuration job:
 # 1. CA keys password.
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/service.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/service.yaml
index dccae38..de1f897 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/service.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/service.yaml
@@ -1,3 +1,4 @@
+{{- /*
 # *****************************************************************************
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -18,23 +19,23 @@
 # under the License.
 #
 # ******************************************************************************
+*/ -}}
 
 apiVersion: v1
 kind: Service
 metadata:
   name: {{ include "step-certificates.fullname" . }}
-  labels:
-  {{ include "step-certificates.labels" . | indent 4 }}
+  labels: {{ include "step-certificates.labels" . | nindent 4 }}
 spec:
   type: {{ .Values.service.type }}
   ports:
     - port: {{ .Values.service.port }}
       targetPort: {{ .Values.service.targetPort }}
-{{- if .Values.service.nodePort }}
-nodePort: {{ .Values.service.nodePort }}
-{{- end }}
-protocol: TCP
-name: https
-selector:
-  app.kubernetes.io/name: {{ include "step-certificates.name" . }}
-  app.kubernetes.io/instance: {{ .Release.Name }}
\ No newline at end of file
+      {{- if .Values.service.nodePort }}
+      nodePort: {{ .Values.service.nodePort }}
+      {{- end }}
+      protocol: TCP
+      name: https
+  selector:
+    app.kubernetes.io/name: {{ include "step-certificates.name" . }}
+    app.kubernetes.io/instance: {{ .Release.Name }}
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/tests/test-connection.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/tests/test-connection.yaml
index 4fe296d..8b2901d 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/tests/test-connection.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/templates/tests/test-connection.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
@@ -24,9 +24,9 @@
 metadata:
   name: "{{ include "step-certificates.fullname" . }}-test-connection"
   labels:
-  {{ include "step-certificates.labels" . | indent 4 }}
-annotations:
-  "helm.sh/hook": test-success
+    {{- include "step-certificates.labels" . | nindent 4 }}
+  annotations:
+    "helm.sh/hook": test-success
 spec:
   containers:
     - name: wget
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/values.yaml b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/values.yaml
index 269e7fa..aa26ec4 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/values.yaml
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca-chart/values.yaml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
@@ -33,7 +33,7 @@
 # image contains the docker image for step-certificates.
 image:
   repository: smallstep/step-ca
-  tag: 0.13.2
+  tag: 0.15.5
   pullPolicy: IfNotPresent
 
 # bootstrapImage contains the docker image for the bootstrap of the configuration.
@@ -51,17 +51,15 @@
 # ca contains the certificate authority configuration.
 ca:
   # name is new public key infrastructure (PKI) names.
-  name: dlab-step-ca
+  name: datalab-step-ca
   # address is the HTTP listener address of step-certificates.
   address: :9000
   # dns is the comma separated dns names to use. Leave it empty to use the format:
   # {include "step-certificates.fullname" .}.{ .Release.Namespace}.svc.cluster.local,127.0.0.1
   dns: ${step_chart_name}.${namespace}.svc.cluster.local,${step_ca_host}
-  # ${step_ca_host}
   # url is the http url where step-certificates will listen at. Leave it empty to use the format
   # https://{{ include "step-certificates.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local
   url: https://${step_chart_name}.${namespace}.svc.cluster.local
-  #${step_ca_host}
   # password is the password used to encrypt the keys. Leave it empty to generate a random one.
   password: ${step_ca_password}
   # provisioner contains the step-certificates provisioner configuration.
@@ -82,14 +80,21 @@
     # If undefined or set to null, no storageClassName spec is set, choosing the
     # default provisioner (gp2 on AWS, standard on GKE, AWS & OpenStack).
     storageClass: standard
+    ## Persistent Volume existing claim name
+    ## Requires ca.db.persistent: true
+    ## If defined, PVC must be created manually before volume will be bound
+    # existingClaim: ""
     # accessModes defines the Persistent Volume Access Mode.
     accessModes:
-      - ReadWriteOnce
+    - ReadWriteOnce
     # size is the Persistent Volume size.
     size: 10Gi
   # runAsRoot runs the ca as root instead of the step user. This is required in
   # some storage provisioners.
   runAsRoot: false
+  bootstrap:
+    # Add script snippets here to be executed after the step ca init has been run
+    postInitHook: ""
 
 # autocert is used to configure the autocert chart that depends on step-certificates.
 autocert:
@@ -113,7 +118,7 @@
   #   memory: 128Mi
   # requests:
   #   cpu: 100m
-#   memory: 128Mi
+  #   memory: 128Mi
 
 # nodeSelector contains the node labels for pod assignment.
 nodeSelector: {}
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca.tf
index c920367..e17b939 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-ca.tf
@@ -28,7 +28,7 @@
   depends_on = [null_resource.cert_manager_delay]
   metadata {
     name = "step-certs"
-    namespace = kubernetes_namespace.dlab-namespace.metadata[0].name
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
   spec {
     selector = {
@@ -50,15 +50,15 @@
     step_ca_password             = random_string.step_ca_password.result
     step_ca_provisioner_password = random_string.step_ca_provisioner_password.result
     step_ca_host                 = kubernetes_service.step_service_lb.load_balancer_ingress.0.ip
-    step_chart_name              = local.step_ca_name
-    namespace                    = kubernetes_namespace.dlab-namespace.metadata[0].name
+    step_chart_name = local.step_ca_name
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   }
 }
 
 resource "helm_release" "step_ca" {
   name       = local.step_ca_name
-  chart      = "./modules/helm_charts/step-ca-chart"
-  namespace  = kubernetes_namespace.dlab-namespace.metadata[0].name
+  chart = "./modules/helm_charts/step-ca-chart"
+  namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
   # depends_on = [kubernetes_service.step_service_lb]
   wait       = false
   timeout    = 600
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-issuer.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-issuer.tf
index 2cbb247..56d1aa7 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-issuer.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/modules/helm_charts/step-issuer.tf
@@ -47,8 +47,8 @@
   template = file("./modules/helm_charts/step-ca-issuer-chart/values.yaml")
   vars     = {
     step_ca_url      = "https://${kubernetes_service.step_service_lb.load_balancer_ingress.0.ip}"
-    step_ca_bundle   = lookup(data.external.step-ca-config-values.result, "rootCa")
-    namespace        = kubernetes_namespace.dlab-namespace.metadata[0].name
+    step_ca_bundle = lookup(data.external.step-ca-config-values.result, "rootCa")
+    namespace = kubernetes_namespace.datalab-namespace.metadata[0].name
     step_ca_kid_name = lookup(data.external.step-ca-config-values.result, "kidName")
     step_ca_kid      = lookup(data.external.step-ca-config-values.result, "kid")
   }
diff --git a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/variables.tf b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/variables.tf
index fbecd7c..02d0050 100644
--- a/infrastructure-provisioning/terraform/gcp/ssn-gke/main/variables.tf
+++ b/infrastructure-provisioning/terraform/gcp/ssn-gke/main/variables.tf
@@ -20,7 +20,7 @@
 # ******************************************************************************
 
 variable "namespace_name" {
-    default = "dlab"
+    default = "datalab"
 }
 
 variable "credentials_file_path" {
@@ -48,7 +48,7 @@
 }
 
 variable "service_base_name" {
-  default = "dlab-k8s"
+  default = "datalab-k8s"
 }
 
 variable "subnet_cidr" {
@@ -56,7 +56,7 @@
 }
 
 variable "additional_tag" {
-  default = "product:dlab"
+  default = "product:datalab"
 }
 
 variable "ssn_k8s_workers_count" {
@@ -64,7 +64,7 @@
 }
 
 variable "gke_cluster_version" {
-  default = "1.14.8-gke.12"
+  default = "1.14.10-gke.50"
 }
 
 // Couldn't assign in GCP
@@ -93,7 +93,7 @@
 }
 
 variable "keycloak_user" {
-    default = "dlab-admin"
+  default = "datalab-admin"
 }
 
 variable "mysql_user" {
@@ -141,11 +141,11 @@
 }
 
 variable "mongo_dbname" {
-    default = "dlabdb"
+  default = "datalabdb"
 }
 
 variable "mongo_image_tag" {
-    default = "4.0.10-debian-9-r13"
+    default = "4.2.4-debian-10-r0"
     description = "MongoDB Image tag"
 }
 
@@ -196,9 +196,9 @@
 }
 
 variable "keycloak_realm_name" {
-  default = "dlab"
+  default = "datalab"
 }
 
 variable "keycloak_client_id" {
-  default = "dlab-ui"
+  default = "datalab-ui"
 }
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/Dockerfile b/infrastructure-provisioning/terraform/keycloak-theme/Dockerfile
index 6e29689..5a7239d 100644
--- a/infrastructure-provisioning/terraform/keycloak-theme/Dockerfile
+++ b/infrastructure-provisioning/terraform/keycloak-theme/Dockerfile
@@ -20,4 +20,4 @@
 # ******************************************************************************
 
 FROM busybox
-COPY dlab /dlab
\ No newline at end of file
+COPY datalab /datalab
\ No newline at end of file
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/css/login.css b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/css/login.css
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/css/login.css
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/css/login.css
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/favicon.ico b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/favicon.ico
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/favicon.ico
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/favicon.ico
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-error-arrow-down.png b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-error-arrow-down.png
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-error-arrow-down.png
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-error-arrow-down.png
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-error-sign.png b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-error-sign.png
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-error-sign.png
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-error-sign.png
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-success-arrow-down.png b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-success-arrow-down.png
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-success-arrow-down.png
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-success-arrow-down.png
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-success-sign.png b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-success-sign.png
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-success-sign.png
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-success-sign.png
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-warning-arrow-down.png b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-warning-arrow-down.png
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-warning-arrow-down.png
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-warning-arrow-down.png
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-warning-sign.png b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-warning-sign.png
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/feedback-warning-sign.png
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/feedback-warning-sign.png
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/keycloak-logo.png b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/keycloak-logo.png
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/keycloak-logo.png
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/keycloak-logo.png
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/login-background.png b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/login-background.png
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/login-background.png
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/login-background.png
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/login-background1.png b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/login-background1.png
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/login-background1.png
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/login-background1.png
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/login-icons.png b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/login-icons.png
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/login-icons.png
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/login-icons.png
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/logo.png b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/logo.png
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/resources/img/logo.png
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/resources/img/logo.png
Binary files differ
diff --git a/infrastructure-provisioning/terraform/keycloak-theme/dlab/login/theme.properties b/infrastructure-provisioning/terraform/keycloak-theme/datalab/login/theme.properties
similarity index 100%
rename from infrastructure-provisioning/terraform/keycloak-theme/dlab/login/theme.properties
rename to infrastructure-provisioning/terraform/keycloak-theme/datalab/login/theme.properties
diff --git a/pom.xml b/pom.xml
index 46b9616..2224ef8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,14 +22,14 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                    http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <groupId>com.epam.dlab</groupId>
-    <artifactId>dlab</artifactId>
+    <groupId>com.epam.datalab</groupId>
+    <artifactId>datalab</artifactId>
     <version>1.0</version>
     <packaging>pom</packaging>
 
     <scm>
-        <connection>scm:git:https://github.com/apache/incubator-dlab.git</connection>
-        <url>scm:git:https://github.com/apache/incubator-dlab.git</url>
+        <connection>scm:git:https://github.com/apache/incubator-datalab.git</connection>
+        <url>scm:git:https://github.com/apache/incubator-datalab.git</url>
         <tag>HEAD</tag>
     </scm>
 
@@ -52,16 +52,56 @@
                 <module>services/billing-gcp</module>
             </modules>
         </profile>
+        <profile>
+            <id>sonar</id>
+            <activation>
+                <activeByDefault>false</activeByDefault>
+            </activation>
+            <properties>
+                <sonar.host.url>
+                    http://localhost:9000/sonar
+                </sonar.host.url>
+                <sonar.coverage.exclusions>
+                    **/*Exception.java,
+                    **/BucketServiceAwsImpl.java,
+                    **/BucketServiceAzureImpl.java,
+                    **/BucketServiceGcpImpl.java,
+                    **/*DAO.java,
+                    **/*DAOImpl.java,
+                    **/*Configuration.java,
+                    **/*ApplicationConfiguration.java,
+                    **/*Application.java,
+                    src/main/java/com/epam/datalab/dto/**,
+                    src/main/java/com/epam/datalab/backendapi/interceptor/**,
+                    src/main/java/com/epam/datalab/backendapi/auth/**,
+                    src/main/java/com/epam/datalab/backendapi/conf/**,
+                    src/main/java/com/epam/datalab/backendapi/domain/**,
+                    src/main/java/com/epam/datalab/backendapi/dropwizard/**,
+                    src/main/java/com/epam/datalab/backendapi/healthcheck/**,
+                    src/main/java/com/epam/datalab/backendapi/modules/**,
+                    src/main/java/com/epam/datalab/backendapi/resources/dto/**,
+                    src/main/java/com/epam/datalab/backendapi/roles/**,
+                    src/main/java/com/epam/datalab/backendapi/servlet/guacamole/**,
+                    src/main/java/com/epam/datalab/backendapi/util/**,
+                    src/main/java/com/epam/datalab/backendapi/validation/**,
+                    src/main/java/com/epam/datalab/backendapi/core/commands/**,
+                    src/main/java/com/epam/datalab/process/**,
+                    src/main/java/com/epam/datalab/backendapi/modules/**,
+                    src/main/java/com/epam/datalab/backendapi/validation/**,
+                    src/main/java/com/epam/datalab/backendapi/schedulers/**
+                </sonar.coverage.exclusions>
+            </properties>
+        </profile>
     </profiles>
 
     <modules>
         <module>services/common</module>
         <module>services/provisioning-service</module>
         <module>services/self-service</module>
-        <module>services/dlab-model</module>
-        <module>services/dlab-utils</module>
-        <module>services/dlab-webapp-common</module>
-        <module>services/dlab-mongo-migration</module>
+        <module>services/datalab-model</module>
+        <module>services/datalab-utils</module>
+        <module>services/datalab-webapp-common</module>
+        <module>services/datalab-mongo-migration</module>
         <module>services/billing-azure</module>
         <module>services/billing-gcp</module>
         <module>services/billing-aws</module>
@@ -69,7 +109,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <io.dropwizard.version>1.3.2</io.dropwizard.version>
+        <io.dropwizard.version>1.3.21</io.dropwizard.version>
         <dropwizard.swagger.version>1.3.5-1</dropwizard.swagger.version>
         <com.google.inject.version>4.2.0</com.google.inject.version>
         <dropwizard-template-config.version>1.4.0</dropwizard-template-config.version>
@@ -86,7 +126,9 @@
         <lombok.version>1.16.18</lombok.version>
         <hibernate.validator.version>5.4.2.Final</hibernate.validator.version>
         <logback.version>1.2.3</logback.version>
+        <commons-fileupload.version>1.3.3</commons-fileupload.version>
     </properties>
+
     <dependencyManagement>
         <dependencies>
             <dependency>
@@ -95,7 +137,7 @@
                 <version>1.3</version>
             </dependency>
             <dependency>
-                <groupId>com.epam.dlab</groupId>
+                <groupId>com.epam.datalab</groupId>
                 <artifactId>common</artifactId>
                 <version>${project.version}</version>
             </dependency>
@@ -129,8 +171,6 @@
                 <artifactId>dropwizard-util</artifactId>
                 <version>${io.dropwizard.version}</version>
             </dependency>
-
-
         </dependencies>
     </dependencyManagement>
 
@@ -151,7 +191,7 @@
     </dependencies>
 
     <build>
-        <finalName>${project.artifactId}-${dlab.version}</finalName>
+        <finalName>${project.artifactId}-${datalab.version}</finalName>
         <pluginManagement>
             <plugins>
                 <plugin>
@@ -173,6 +213,11 @@
                         </execution>
                     </executions>
                 </plugin>
+                <plugin>
+                    <groupId>org.sonarsource.scanner.maven</groupId>
+                    <artifactId>sonar-maven-plugin</artifactId>
+                    <version>3.7.0.1746</version>
+                </plugin>
             </plugins>
         </pluginManagement>
         <plugins>
@@ -229,7 +274,7 @@
             <plugin>
                 <groupId>org.apache.rat</groupId>
                 <artifactId>apache-rat-plugin</artifactId>
-                <version>0.7</version>
+                <version>0.13</version>
                 <configuration>
                     <excludes>
                         <exclude>.git/**</exclude>
diff --git a/services/billing-aws/Dockerfile b/services/billing-aws/Dockerfile
index b41a919..b327889 100644
--- a/services/billing-aws/Dockerfile
+++ b/services/billing-aws/Dockerfile
@@ -23,6 +23,6 @@
 
 USER root
 
-COPY billing-aws-2.2.jar /root/
+COPY billing-aws-*.jar /root/
 
-CMD java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 /root/billing-aws-2.2.jar --conf /root/billing.yml
\ No newline at end of file
+CMD java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 /root/billing-aws-*.jar --conf /root/billing.yml
\ No newline at end of file
diff --git a/services/billing-aws/billing.yml b/services/billing-aws/billing.yml
index 3b1943f..cb1d6dc 100644
--- a/services/billing-aws/billing.yml
+++ b/services/billing-aws/billing.yml
@@ -30,7 +30,7 @@
 port: 27017
 username: admin
 password: MONGO_PASSWORD
-database: dlabdb
+database: datalabdb
 
 # Adapter for reading source data. Known types: file, s3file
 adapterIn:
@@ -44,13 +44,13 @@
 
 # Adapter for writing converted data. Known types: console, file, s3file, mongodb
 adapterOut:
-  - type: mongodlab
+  - type: mongodatalab
     host: MONGO_HOST
     port: 27017
     username: admin
     password: MONGO_PASSWORD
-    database: dlabdb
-#    bufferSize: 10000
+    database: datalabdb
+    #    bufferSize: 10000
     upsert: true
     serviceBaseName: SERVICE_BASE_NAME
 
@@ -58,7 +58,7 @@
 filter:
   - type: aws
     currencyCode: USD
-    columnDlabTag: CONF_BILLING_TAG
+    columnDatalabTag: CONF_BILLING_TAG
     serviceBaseName: SERVICE_BASE_NAME
 
 
@@ -68,7 +68,7 @@
     headerLineNo: 1
     skipLines: 1
     columnMapping: >-
-      dlab_id=DLAB_ID;usage_date=USAGE_DATE;product=PRODUCT;
+      datalab_id=DATALAB_ID;usage_date=USAGE_DATE;product=PRODUCT;
       usage_type=USAGE_TYPE;usage=USAGE;cost=COST;
       resource_id=RESOURCE_ID;tags=TAGS
     aggregate: day
@@ -88,7 +88,7 @@
   appenders:
     #- type: console
     - type: file
-      currentLogFilename: /var/opt/dlab/log/ssn/billing.log
+      currentLogFilename: /var/opt/datalab/log/ssn/billing.log
       archive: true
-      archivedLogFilenamePattern: /var/opt/dlab/log/ssn/billing-%d{yyyy-MM-dd}.log.gz
+      archivedLogFilenamePattern: /var/opt/datalab/log/ssn/billing-%d{yyyy-MM-dd}.log.gz
       archivedFileCount: 10
\ No newline at end of file
diff --git a/services/billing-aws/pom.xml b/services/billing-aws/pom.xml
index ec4c830..7a4d762 100644
--- a/services/billing-aws/pom.xml
+++ b/services/billing-aws/pom.xml
@@ -23,8 +23,8 @@
                    http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
-        <groupId>com.epam.dlab</groupId>
-        <artifactId>dlab</artifactId>
+        <groupId>com.epam.datalab</groupId>
+        <artifactId>datalab</artifactId>
         <version>1.0</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
@@ -58,7 +58,7 @@
 
     <dependencies>
         <dependency>
-            <groupId>com.epam.dlab</groupId>
+            <groupId>com.epam.datalab</groupId>
             <artifactId>common</artifactId>
         </dependency>
 
@@ -90,7 +90,7 @@
         <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-validator</artifactId>
-            <version>5.1.1.Final</version>
+            <version>5.1.3.Final</version>
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
@@ -131,7 +131,7 @@
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
-            <version>24.1-jre</version>
+            <version>30.0-jre</version>
         </dependency>
 
         <dependency>
@@ -173,8 +173,8 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>dlab-model</artifactId>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>datalab-model</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
 
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/BillingAwsApplication.java b/services/billing-aws/src/main/java/com/epam/datalab/BillingAwsApplication.java
new file mode 100644
index 0000000..c34ad40
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/BillingAwsApplication.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab;
+
+import com.epam.datalab.exceptions.InitializationException;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
+
+@SpringBootApplication
+@EnableMongoRepositories
+@EnableConfigurationProperties
+public class BillingAwsApplication {
+
+    public static void main(String[] args) throws InitializationException {
+        SpringApplication.run(BillingAwsApplication.class, args);
+        BillingServiceImpl.startApplication(args);
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/BillingService.java b/services/billing-aws/src/main/java/com/epam/datalab/BillingService.java
new file mode 100644
index 0000000..bfdd4c6
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/BillingService.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab;
+
+import com.epam.datalab.dto.billing.BillingData;
+
+import java.util.List;
+
+@FunctionalInterface
+public interface BillingService {
+    List<BillingData> getBillingData();
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/BillingServiceImpl.java b/services/billing-aws/src/main/java/com/epam/datalab/BillingServiceImpl.java
new file mode 100644
index 0000000..25e2fe5
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/BillingServiceImpl.java
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab;
+
+import com.epam.datalab.configuration.BillingToolConfiguration;
+import com.epam.datalab.configuration.BillingToolConfigurationFactory;
+import com.epam.datalab.core.parser.ParserBase;
+import com.epam.datalab.dto.billing.BillingData;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.util.ServiceUtils;
+import org.bson.Document;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.model.aws.ReportLine.FIELD_COST;
+import static com.epam.datalab.model.aws.ReportLine.FIELD_CURRENCY_CODE;
+import static com.epam.datalab.model.aws.ReportLine.FIELD_DATALAB_ID;
+import static com.epam.datalab.model.aws.ReportLine.FIELD_PRODUCT;
+import static com.epam.datalab.model.aws.ReportLine.FIELD_RESOURCE_TYPE;
+import static com.epam.datalab.model.aws.ReportLine.FIELD_USAGE_DATE;
+
+@Service
+public class BillingServiceImpl implements BillingService {
+    private static final Logger LOGGER = LoggerFactory.getLogger(BillingServiceImpl.class);
+    private static BillingToolConfiguration configuration;
+
+    public List<BillingData> getBillingData() {
+        try {
+            ParserBase parser = configuration.build();
+
+            List<BillingData> billingData = parser.parse()
+                    .stream()
+                    .map(this::toBillingData)
+                    .collect(Collectors.toList());
+
+            if (!parser.getStatistics().isEmpty()) {
+                LOGGER.info("Billing report parser statistics:");
+                for (int i = 0; i < parser.getStatistics().size(); i++) {
+                    LOGGER.info("  {}", parser.getStatistics().get(i).toString());
+                }
+            }
+
+            return billingData;
+        } catch (Exception e) {
+            LOGGER.error("Something went wrong ", e);
+            return Collections.emptyList();
+        }
+    }
+
+    private BillingData toBillingData(Document billingData) {
+        return BillingData.builder()
+                .tag(billingData.getString(FIELD_DATALAB_ID).toLowerCase())
+                .usageDateFrom(Optional.ofNullable(billingData.getString(FIELD_USAGE_DATE)).map(LocalDate::parse).orElse(null))
+                .usageDateTo(Optional.ofNullable(billingData.getString(FIELD_USAGE_DATE)).map(LocalDate::parse).orElse(null))
+                .usageDate(billingData.getString(FIELD_USAGE_DATE))
+                .product(billingData.getString(FIELD_PRODUCT))
+                .usageType(billingData.getString(FIELD_RESOURCE_TYPE))
+                .cost(billingData.getDouble(FIELD_COST))
+                .currency(billingData.getString(FIELD_CURRENCY_CODE))
+                .build();
+    }
+
+    public static void initialize(String filename) throws InitializationException {
+        LOGGER.debug("Billing report configuration file: {}", filename);
+        configuration = BillingToolConfigurationFactory.build(filename, BillingToolConfiguration.class);
+    }
+
+    public static void startApplication(String[] args) throws InitializationException {
+        if (ServiceUtils.printAppVersion(BillingTool.class, args)) {
+            return;
+        }
+
+        String confName = null;
+        for (int i = 0; i < args.length; i++) {
+            if (BillingTool.isKey("help", args[i])) {
+                i++;
+                Help.usage(i < args.length ? Arrays.copyOfRange(args, i, args.length) : null);
+                return;
+            } else if (BillingTool.isKey("conf", args[i])) {
+                i++;
+                if (i < args.length) {
+                    confName = args[i];
+                } else {
+                    throw new InitializationException("Missing the name of configuration file");
+                }
+            }
+        }
+
+        if (confName == null) {
+            Help.usage();
+            throw new InitializationException("Missing arguments");
+        }
+
+        BillingTool.setLoggerLevel();
+        try {
+            initialize(confName);
+        } catch (Exception e) {
+            throw new DatalabException("Billing scheduler failed", e);
+        }
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/BillingTool.java b/services/billing-aws/src/main/java/com/epam/datalab/BillingTool.java
new file mode 100644
index 0000000..f334883
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/BillingTool.java
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.LoggerContext;
+import com.epam.datalab.configuration.BillingToolConfiguration;
+import com.epam.datalab.configuration.BillingToolConfigurationFactory;
+import com.epam.datalab.core.parser.ParserBase;
+import com.epam.datalab.exceptions.AdapterException;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.exceptions.ParseException;
+import com.epam.datalab.util.ServiceUtils;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+
+/**
+ * Provides billing parser features.
+ */
+public class BillingTool {
+    private static final Logger LOGGER = LoggerFactory.getLogger(BillingTool.class);
+
+    /**
+     * Runs parser for given configuration.
+     *
+     * @param conf billing configuration.
+     * @throws InitializationException
+     * @throws AdapterException
+     * @throws ParseException
+     */
+    public void run(BillingToolConfiguration conf) throws InitializationException, AdapterException, ParseException {
+        ParserBase parser = conf.build();
+        LOGGER.debug("Billing Tool Configuration: {}", conf);
+        LOGGER.debug("Parser configuration: {}", parser);
+
+        parser.parse();
+        LOGGER.debug("Billing Tool statistics: {}", parser.getStatistics());
+    }
+
+    /**
+     * Runs parser for given configuration in file.
+     *
+     * @param filename the name of file for billing configuration.
+     * @throws InitializationException
+     * @throws AdapterException
+     * @throws ParseException
+     */
+    public void run(String filename) throws InitializationException, AdapterException, ParseException {
+        run(BillingToolConfigurationFactory.build(filename, BillingToolConfiguration.class));
+    }
+
+    /**
+     * Runs parser for given configuration.
+     *
+     * @param jsonNode the billing configuration.
+     * @throws InitializationException
+     * @throws AdapterException
+     * @throws ParseException
+     */
+    public void run(JsonNode jsonNode) throws InitializationException, AdapterException, ParseException {
+        run(BillingToolConfigurationFactory.build(jsonNode, BillingToolConfiguration.class));
+    }
+
+
+    /**
+     * Check the key name for command line.
+     *
+     * @param keyName the name of key.
+     * @param arg     the argument from command line.
+     * @return <b>true</b> if given argument is key.
+     */
+    protected static boolean isKey(String keyName, String arg) {
+        return (("--" + keyName).equalsIgnoreCase(arg) ||
+                ("/" + keyName).equalsIgnoreCase(arg));
+    }
+
+    /**
+     * Set the level of loggers to INFO for external loggers.
+     */
+    protected static void setLoggerLevel() {
+        ch.qos.logback.classic.LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+        ch.qos.logback.classic.Logger logger;
+        String[] loggers = {
+                "org.hibernate",
+                "org.jboss.logging"
+        };
+        for (String name : loggers) {
+            logger = context.getLogger(name);
+            logger.setLevel(Level.INFO);
+        }
+    }
+
+
+    /**
+     * Runs parser for given configuration.
+     *
+     * @param args the arguments of command line.
+     * @throws InitializationException
+     */
+    public static void main(String[] args) throws InitializationException {
+        if (ServiceUtils.printAppVersion(BillingServiceImpl.class, args)) {
+            return;
+        }
+
+        String confName = null;
+        String json = null;
+
+        for (int i = 0; i < args.length; i++) {
+            if (isKey("help", args[i])) {
+                i++;
+                Help.usage(i < args.length ? Arrays.copyOfRange(args, i, args.length) : null);
+                return;
+            } else if (isKey("conf", args[i])) {
+                i++;
+                if (i < args.length) {
+                    confName = args[i];
+                } else {
+                    throw new InitializationException("Missing the name of configuration file");
+                }
+            } else if (isKey("json", args[i])) {
+                i++;
+                if (i < args.length) {
+                    json = args[i];
+                } else {
+                    throw new InitializationException("Missing the content of json configuration");
+                }
+            } else {
+                throw new InitializationException("Unknow argument: " + args[i]);
+            }
+        }
+
+        if (confName == null && json == null) {
+            Help.usage();
+            throw new InitializationException("Missing arguments");
+        }
+
+        if (confName != null && json != null) {
+            Help.usage();
+            throw new InitializationException("Invalid arguments.");
+        }
+
+        setLoggerLevel();
+        try {
+            if (confName != null) {
+                new BillingTool().run(confName);
+            } else {
+                JsonNode jsonNode = new ObjectMapper().valueToTree(json);
+                new BillingTool().run(jsonNode);
+            }
+        } catch (Exception e) {
+            throw new DatalabException("Billing tool failed", e);
+        }
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/Help.java b/services/billing-aws/src/main/java/com/epam/datalab/Help.java
new file mode 100644
index 0000000..08096e6
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/Help.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab;
+
+import com.epam.datalab.core.BillingUtils;
+import com.epam.datalab.core.ModuleType;
+import com.epam.datalab.exceptions.InitializationException;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Print help for billing tool.
+ */
+public class Help {
+
+    private Help() {
+    }
+
+    /**
+     * Print help to console.
+     *
+     * @param resourceName the name of resource.
+     * @param substitute   - map for substitution in help content.
+     * @throws InitializationException
+     */
+    private static void printHelp(String resourceName, Map<String, String> substitute) throws InitializationException {
+        List<String> list = BillingUtils.getResourceAsList("/" + Help.class.getName() + "." + resourceName + ".txt");
+        String help = StringUtils.join(list, System.lineSeparator());
+
+        if (substitute == null) {
+            substitute = new HashMap<>();
+        }
+        substitute.put("classname", BillingServiceImpl.class.getName());
+
+        for (String key : substitute.keySet()) {
+            help = StringUtils.replace(help, "${" + key.toUpperCase() + "}", substitute.get(key));
+        }
+        System.out.println(help);
+    }
+
+    /**
+     * Create and return substitutions for names of modules.
+     *
+     * @return
+     * @throws InitializationException
+     */
+    private static Map<String, String> findModules() throws InitializationException {
+        List<Class<?>> modules = BillingUtils.getModuleClassList();
+        Map<String, String> substitute = new HashMap<>();
+
+        for (Class<?> module : modules) {
+            ModuleType type = BillingUtils.getModuleType(module);
+            JsonTypeName typeName = module.getAnnotation(JsonTypeName.class);
+            if (typeName != null) {
+                String typeNames = substitute.get(type.toString() + "s");
+                typeNames = (typeNames == null ? typeName.value() : typeNames + ", " + typeName.value());
+                substitute.put(type.toString() + "s", typeNames);
+            }
+        }
+
+        return substitute;
+    }
+
+    /**
+     * Find and return help for module.
+     *
+     * @param type the type of module.
+     * @param name the name of module.
+     * @throws InitializationException
+     */
+    private static String findModuleHelp(ModuleType type, String name) throws InitializationException {
+        List<Class<?>> modules = BillingUtils.getModuleClassList();
+        String typeNames = null;
+        for (Class<?> module : modules) {
+            ModuleType t = BillingUtils.getModuleType(module);
+            if (t == type) {
+                JsonTypeName typeName = module.getAnnotation(JsonTypeName.class);
+                if (typeName != null) {
+                    if (name.equals(typeName.value())) {
+                        JsonClassDescription description = module.getAnnotation(JsonClassDescription.class);
+                        if (description != null) {
+                            return description.value();
+                        }
+                        throw new InitializationException("Help for " + type + " " + name + " not found");
+                    } else {
+                        typeNames = (typeNames == null ? typeName.value() : typeNames + ", " + typeName.value());
+                    }
+                }
+            }
+        }
+        throw new InitializationException("Module for " + type + " " + name + " not found." +
+                (typeNames == null ? "" : " Module type must be one of next: " + typeNames));
+    }
+
+    /**
+     * Print help screen for billing tool.
+     *
+     * @throws InitializationException
+     */
+    public static void usage(String... args) throws InitializationException {
+        if (args == null || args.length == 0) {
+            printHelp("usage", null);
+        } else if ("conf".equalsIgnoreCase(args[0])) {
+            printHelp("conf", findModules());
+        } else {
+            ModuleType type = ModuleType.of(args[0]);
+            if (type == null) {
+                System.out.println("Unknown --help " + args[0] + " command.");
+            } else if (args.length < 2) {
+                System.out.println("Missing the type of module.");
+                String typeNames = findModules().get(type.toString() + "s");
+                if (typeNames != null) {
+                    System.out.println("Must be one of next: " + typeNames);
+                }
+            } else if (args.length > 2) {
+                System.out.println("Extra arguments in command: " +
+                        StringUtils.join(Arrays.copyOfRange(args, 2, args.length), " "));
+            } else {
+                System.out.println(findModuleHelp(type, args[1]));
+            }
+        }
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/conf/SecurityConfig.java b/services/billing-aws/src/main/java/com/epam/datalab/conf/SecurityConfig.java
new file mode 100644
index 0000000..d08d5fa
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/conf/SecurityConfig.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.conf;
+
+import org.keycloak.adapters.KeycloakConfigResolver;
+import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
+import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
+import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
+import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
+import org.springframework.security.core.session.SessionRegistryImpl;
+import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
+
+@KeycloakConfiguration
+class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
+
+    @Autowired
+    public void configureGlobal(AuthenticationManagerBuilder auth) {
+        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
+        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
+        auth.authenticationProvider(keycloakAuthenticationProvider);
+    }
+
+    @Bean
+    public KeycloakConfigResolver keycloakConfigResolver() {
+        return new KeycloakSpringBootConfigResolver();
+    }
+
+    @Bean
+    @Override
+    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
+        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
+    }
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        super.configure(http);
+        http
+                .anonymous().disable()
+                .authorizeRequests()
+                .anyRequest()
+                .authenticated();
+    }
+}
\ No newline at end of file
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/configuration/BillingToolConfiguration.java b/services/billing-aws/src/main/java/com/epam/datalab/configuration/BillingToolConfiguration.java
new file mode 100644
index 0000000..b43031d
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/configuration/BillingToolConfiguration.java
@@ -0,0 +1,282 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.configuration;
+
+import com.epam.datalab.BillingTool;
+import com.epam.datalab.core.AdapterBase;
+import com.epam.datalab.core.AdapterBase.Mode;
+import com.epam.datalab.core.FilterBase;
+import com.epam.datalab.core.ModuleBase;
+import com.epam.datalab.core.ModuleData;
+import com.epam.datalab.core.parser.ParserBase;
+import com.epam.datalab.exceptions.AdapterException;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.mongo.MongoDbConnection;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import com.google.common.collect.ImmutableList;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+/**
+ * Describe configuration for {@link BillingTool}
+ */
+public class BillingToolConfiguration {
+
+    /**
+     * The host name.
+     */
+    @JsonProperty
+    private String host;
+
+    /**
+     * The port.
+     */
+    @JsonProperty
+    private int port;
+
+    /**
+     * The name of database.
+     */
+    @JsonProperty
+    private String database;
+
+    /**
+     * The name of user.
+     */
+    @JsonProperty
+    private String username;
+
+    /**
+     * The password.
+     */
+    @JsonProperty
+    private String password;
+
+    @JsonProperty
+    private boolean billingEnabled;
+
+    /**
+     * Adapter for reading source data.
+     */
+    @Valid
+    @NotNull
+    @JsonProperty
+    private ImmutableList<AdapterBase> adapterIn;
+
+    /**
+     * Adapter for writing converted data.
+     */
+    @Valid
+    @NotNull
+    @JsonProperty
+    private ImmutableList<AdapterBase> adapterOut;
+
+    /**
+     * Parser of source data to common format.
+     */
+    @Valid
+    @NotNull
+    @JsonProperty
+    private ImmutableList<ParserBase> parser;
+
+    /**
+     * Filter for source and converted data.
+     */
+    @Valid
+    @JsonProperty
+    private ImmutableList<FilterBase> filter = null;
+
+    /**
+     * Logging configuration.
+     */
+    @Valid
+    @JsonProperty
+    private LoggingConfigurationFactory logging = null;
+
+
+    /**
+     * Working data of modules.
+     */
+    @JsonIgnore
+    private ModuleData moduleData;
+
+    /**
+     * Return the adapter for reading source data.
+     */
+    public ImmutableList<AdapterBase> getAdapterIn() {
+        return adapterIn;
+    }
+
+    /**
+     * Set the adapter for reading source data.
+     */
+    public void setAdapterIn(ImmutableList<AdapterBase> adapter) {
+        for (AdapterBase a : adapter) {
+            a.setMode(Mode.READ);
+        }
+        this.adapterIn = adapter;
+    }
+
+    /**
+     * Return the adapter for writing converted data.
+     */
+    public ImmutableList<AdapterBase> getAdapterOut() {
+        return adapterOut;
+    }
+
+    /**
+     * Set the adapter for writing converted data.
+     */
+    public void setAdapterOut(ImmutableList<AdapterBase> adapter) {
+        for (AdapterBase a : adapter) {
+            a.setMode(Mode.WRITE);
+        }
+        this.adapterOut = adapter;
+    }
+
+    /**
+     * Return the parser of source data to common format.
+     */
+    public ImmutableList<ParserBase> getParser() {
+        return parser;
+    }
+
+    /**
+     * Set the parser of source data to common format.
+     */
+    public void setParser(ImmutableList<ParserBase> parser) {
+        this.parser = parser;
+    }
+
+    /**
+     * Return the filter for source and converted data.
+     */
+    public ImmutableList<FilterBase> getFilter() {
+        return filter;
+    }
+
+    /**
+     * Set the filter for source and converted data.
+     */
+    public void setFilter(ImmutableList<FilterBase> filter) {
+        this.filter = filter;
+    }
+
+    /**
+     * Return the logging configuration.
+     */
+    public LoggingConfigurationFactory getLogging() {
+        return logging;
+    }
+
+    /**
+     * Set the logging configuration.
+     */
+    public void setLogging(LoggingConfigurationFactory logging) {
+        this.logging = logging;
+    }
+
+
+    /**
+     * Return the working data of modules.
+     */
+    @JsonIgnore
+    public ModuleData getModuleData() {
+        return moduleData;
+    }
+
+    /**
+     * Check and return module.
+     *
+     * @param modules    the list of modules.
+     * @param name       the name of module.
+     * @param isOptional optional module or not.
+     * @return module
+     * @throws InitializationException
+     */
+    private <T extends ModuleBase> T getModule(ImmutableList<T> modules, String name, boolean isOptional) throws
+            InitializationException {
+        T module = (modules != null && modules.size() == 1 ? modules.get(0) : null);
+        if (!isOptional && module == null) {
+            throw new InitializationException("Invalid configuration for property " + name);
+        }
+        return module;
+    }
+
+    /**
+     * Build and return the parser.
+     *
+     * @return the parser.
+     * @throws InitializationException
+     */
+    public ParserBase build() throws InitializationException {
+        ParserBase parserBase = getModule(this.parser, "parser", false);
+        AdapterBase in = getModule(adapterIn, "adapterIn", false);
+        AdapterBase out = getModule(adapterOut, "adapterOut", false);
+        FilterBase f = getModule(filter, "filter", true);
+
+        final MongoDbConnection connection;
+        try {
+            connection = new MongoDbConnection(host, port, database, username, password);
+        } catch (AdapterException e) {
+            throw new InitializationException("Cannot configure mongo connection. " + e.getLocalizedMessage(), e);
+        }
+        moduleData = new ModuleData(connection);
+
+        parserBase.setModuleData(moduleData);
+        in.setModuleData(moduleData);
+        out.setModuleData(moduleData);
+        if (f != null) {
+            f.setModuleData(moduleData);
+        }
+
+        return parserBase.build(in, out, f);
+    }
+
+    public boolean isBillingEnabled() {
+        return billingEnabled;
+    }
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @param self the object to generate the string for (typically this), used only for its class name.
+     */
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("moduleData", moduleData)
+                .add("adapterIn", adapterIn)
+                .add("adapterOut", adapterOut)
+                .add("filter", filter)
+                .add("parser", parser)
+                .add("logging", logging)
+                .add("billingEnabled", billingEnabled);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .toString();
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/configuration/BillingToolConfigurationFactory.java b/services/billing-aws/src/main/java/com/epam/datalab/configuration/BillingToolConfigurationFactory.java
new file mode 100644
index 0000000..fac6795
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/configuration/BillingToolConfigurationFactory.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.configuration;
+
+import com.epam.datalab.core.BillingUtils;
+import com.epam.datalab.exceptions.InitializationException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.fasterxml.jackson.datatype.guava.GuavaModule;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Build the instance of class {@link BillingToolConfiguration}.
+ */
+public class BillingToolConfigurationFactory {
+
+    /**
+     * Mapper for reading configuration.
+     */
+    private static ObjectMapper mapper;
+
+    /**
+     * Build the instance of class {@link BillingToolConfiguration} from YAML file.
+     *
+     * @param filename  the name of file.
+     * @param confClass configuration class.
+     * @return the instance of configuration.
+     * @throws InitializationException
+     */
+    public static <T extends BillingToolConfiguration> T build(String filename, Class<T> confClass) throws InitializationException {
+        try {
+            InputStream is = new FreeMarkerConfig().getInputStream(filename);
+            JsonNode node = getMapper().readTree(new YAMLFactory().createParser(is));
+            return build(node, confClass);
+        } catch (IOException | InitializationException e) {
+            throw new InitializationException("Cannot parse configuration file " + filename + ". " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Build the instance of class {@link BillingToolConfiguration} from YAML file.
+     *
+     * @param node      the content of configuration.
+     * @param confClass configuration class.
+     * @return the instance of configuration.
+     * @throws InitializationException
+     */
+    public static <T extends BillingToolConfiguration> T build(JsonNode node, Class<T> confClass) throws InitializationException {
+        T conf;
+        try {
+            conf = getMapper().readValue(node.toString(), confClass);
+        } catch (Exception e) {
+            throw new InitializationException("Cannot parse json configuration. " + e.getLocalizedMessage(), e);
+        }
+
+        try {
+            LoggingConfigurationFactory logging = conf.getLogging();
+            if (logging != null) {
+                logging.configure();
+            }
+        } catch (Exception e) {
+            throw new InitializationException("Cannot initialize configuration. " + e.getLocalizedMessage(), e);
+        }
+
+        new ConfigurationValidator<T>()
+                .validate(conf);
+
+        return conf;
+    }
+
+    /**
+     * Return the mapper for reading configuration.
+     *
+     * @throws InitializationException
+     */
+    private static ObjectMapper getMapper() throws InitializationException {
+        if (mapper != null) {
+            return mapper;
+        }
+        mapper = new ObjectMapper()
+                .enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+        mapper.registerModule(new GuavaModule());
+        for (Class<?> clazz : BillingUtils.getModuleClassList()) {
+            mapper.registerSubtypes(clazz);
+        }
+
+        return mapper;
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/configuration/ConfigJsonGenerator.java b/services/billing-aws/src/main/java/com/epam/datalab/configuration/ConfigJsonGenerator.java
new file mode 100644
index 0000000..fae1bf6
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/configuration/ConfigJsonGenerator.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.configuration;
+
+import com.epam.datalab.core.BillingUtils;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Generate the json configuration of billing tool.
+ */
+public class ConfigJsonGenerator {
+
+    /**
+     * Buffer for configuration properties.
+     */
+    private Map<String, Map<String, String>[]> config = new HashMap<>();
+
+    /**
+     * Add the properties of module to configuration.
+     *
+     * @param moduleName the name of module.
+     * @param properties the properties: key and value sequence.
+     */
+    private ConfigJsonGenerator withModule(String moduleName, String... properties) {
+        if (properties == null) {
+            config.remove(moduleName);
+            return this;
+        }
+
+        @SuppressWarnings("unchecked")
+        Map<String, String>[] map = new Map[1];
+        map[0] = BillingUtils.stringsToMap(properties);
+        config.put(moduleName, map);
+        return this;
+    }
+
+    /**
+     * Add the properties of input adapter to configuration.
+     *
+     * @param properties the properties: key and value sequence.
+     */
+    public ConfigJsonGenerator withAdapterIn(String... properties) {
+        return withModule("adapterIn", properties);
+    }
+
+    /**
+     * Add the properties of output adapter to configuration.
+     *
+     * @param properties the properties: key and value sequence.
+     */
+    public ConfigJsonGenerator withAdapterOut(String... properties) {
+        return withModule("adapterOut", properties);
+    }
+
+    /**
+     * Add the properties of parser to configuration.
+     *
+     * @param properties the properties: key and value sequence.
+     */
+    public ConfigJsonGenerator withParser(String... properties) {
+        return withModule("parser", properties);
+    }
+
+    /**
+     * Add the properties of filter to configuration.
+     *
+     * @param properties the properties: key and value sequence.
+     */
+    public ConfigJsonGenerator withFilter(String... properties) {
+        return withModule("filter", properties);
+    }
+
+    /**
+     * Build and return json configuration.
+     *
+     * @param properties the properties: key and value sequence.
+     */
+    public JsonNode build() {
+        return new ObjectMapper()
+                .valueToTree(config);
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/configuration/ConfigurationValidator.java b/services/billing-aws/src/main/java/com/epam/datalab/configuration/ConfigurationValidator.java
new file mode 100644
index 0000000..4f8c039
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/configuration/ConfigurationValidator.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.configuration;
+
+import com.epam.datalab.core.BillingUtils;
+import com.epam.datalab.exceptions.InitializationException;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Json properties validator.
+ *
+ * @param <T> Class for validation.
+ */
+public class ConfigurationValidator<T> {
+
+    /**
+     * Error messages.
+     */
+    private static Map<String, String> messages = BillingUtils.stringsToMap(
+            "{javax.validation.constraints.NotNull.message}", "Property \"%s\" may not be null");
+
+    /**
+     * Return the list of error messages.
+     *
+     * @param violation constraint violations.
+     */
+    public String getMessage(ConstraintViolation<T> violation) {
+        return String.format(
+                messages.get(violation.getMessageTemplate()),
+                violation.getPropertyPath(),
+                violation.getInvalidValue());
+    }
+
+    /**
+     * Validate properties in instance and throw exception if it have not valid property.
+     *
+     * @param clazz instance for validation.
+     * @throws InitializationException
+     */
+    public void validate(T clazz) throws InitializationException {
+        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
+        Validator validator = validatorFactory.getValidator();
+        Set<ConstraintViolation<T>> violations = validator.validate(clazz);
+        for (ConstraintViolation<T> violation : violations) {
+            throw new InitializationException(getMessage(violation));
+        }
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/configuration/FreeMarkerConfig.java b/services/billing-aws/src/main/java/com/epam/datalab/configuration/FreeMarkerConfig.java
new file mode 100644
index 0000000..a134f30
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/configuration/FreeMarkerConfig.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.configuration;
+
+import com.google.common.base.Throwables;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Provides Apache FreeMarker the template engine for the billing configuration.
+ */
+public class FreeMarkerConfig {
+
+    /**
+     * Create and return the input stream for the configuration file.
+     *
+     * @param filename the name of configuration file.
+     * @throws IOException
+     */
+    public InputStream getInputStream(final String filename) throws IOException {
+        try {
+            Configuration conf = new Configuration(Configuration.VERSION_2_3_22);
+            Template template = new Template("billing-config", new FileReader(new File(filename)), conf);
+            Map<String, Object> dataModel = getDataModel();
+
+            ByteArrayOutputStream streamBuffer = new ByteArrayOutputStream();
+            template.process(dataModel, new OutputStreamWriter(streamBuffer, StandardCharsets.UTF_8));
+            byte[] buffer = streamBuffer.toByteArray();
+
+            return new ByteArrayInputStream(buffer);
+        } catch (TemplateException e) {
+            throw Throwables.propagate(e);
+        }
+    }
+
+    /**
+     * Create and return JVM and OS properties.
+     */
+    private Map<String, Object> getDataModel() {
+        Map<String, Object> dataModel = new HashMap<>();
+
+        Iterator<Object> sysProps = System.getProperties().keySet().iterator();
+        while (sysProps.hasNext()) {
+            String key = (String) sysProps.next();
+            dataModel.put(key, System.getProperties().getProperty(key));
+        }
+        dataModel.putAll(System.getenv());
+
+        dataModel.put("env", System.getenv());
+        dataModel.put("sys", System.getProperties());
+
+        return dataModel;
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/configuration/LoggingConfigurationFactory.java b/services/billing-aws/src/main/java/com/epam/datalab/configuration/LoggingConfigurationFactory.java
new file mode 100644
index 0000000..e407c14
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/configuration/LoggingConfigurationFactory.java
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.configuration;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.logging.AppenderBase;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.slf4j.LoggerFactory;
+
+import javax.validation.Valid;
+
+/**
+ * Configuration and factory for logging.
+ */
+public class LoggingConfigurationFactory {
+
+    /**
+     * Default logging level for all appenders.
+     */
+    @Valid
+    @JsonProperty
+    private Level level = Level.INFO;
+
+    /**
+     * List of logging levels for appenders.
+     */
+    @JsonIgnore
+    private ImmutableMap<String, Level> loggers = ImmutableMap.of();
+
+    /**
+     * List of logging appenders.
+     */
+    @Valid
+    @JsonProperty
+    private ImmutableList<AppenderBase> appenders = ImmutableList.of();
+
+
+    /**
+     * Return the default logging level for all appenders.
+     */
+    public Level getLevel() {
+        return level;
+    }
+
+    /**
+     * Set the default logging level for all appenders.
+     */
+    public void setLevel(String level) throws InitializationException {
+        this.level = toLevel(level);
+    }
+
+    /**
+     * Return the list of logging levels for appenders.
+     */
+    public ImmutableMap<String, Level> getLoggers() {
+        return loggers;
+    }
+
+    /**
+     * Set the list of logging levels for appenders.
+     */
+    @JsonProperty
+    public void setLoggers(ImmutableMap<String, JsonNode> loggers) throws InitializationException {
+        ImmutableMap.Builder<String, Level> levels = new ImmutableMap.Builder<>();
+        for (String key : loggers.keySet()) {
+            JsonNode node = loggers.get(key);
+            levels.put(key, toLevel(node.asText()));
+        }
+        this.loggers = levels.build();
+    }
+
+    /**
+     * Return the list of logging appenders.
+     */
+    public ImmutableList<AppenderBase> getAppenders() {
+        return appenders;
+    }
+
+    /**
+     * Set the list of logging appenders.
+     */
+    public void setAppenders(ImmutableList<AppenderBase> appenders) {
+        this.appenders = appenders;
+    }
+
+
+    /**
+     * Translate the name of logging level to {@link Level}.
+     *
+     * @param level the name of logging level.
+     * @return logging level.
+     * @throws InitializationException if given unknown logging level name.
+     */
+    private Level toLevel(String level) throws InitializationException {
+        Level l = Level.toLevel(level, null);
+        if (l == null) {
+            throw new InitializationException("Unknown logging level: " + level);
+        }
+        return l;
+    }
+
+    /**
+     * Configure logging appenders.
+     *
+     * @throws InitializationException
+     */
+    public void configure() throws InitializationException {
+        if (appenders == null) {
+            throw new InitializationException("Configuration property logging.appenders cannot be null.");
+        }
+        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+        context.reset();
+
+        for (AppenderBase appender : appenders) {
+            appender.configure(context);
+        }
+
+        Logger logger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
+        logger.setLevel(level);
+        for (String name : loggers.keySet()) {
+            logger = context.getLogger(name);
+            logger.setLevel(loggers.get(name));
+        }
+    }
+
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @param self the object to generate the string for (typically this), used only for its class name.
+     */
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("level", level)
+                .add("loggers", loggers)
+                .add("appenders", appenders);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .toString();
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/controller/BillingController.java b/services/billing-aws/src/main/java/com/epam/datalab/controller/BillingController.java
new file mode 100644
index 0000000..d28d9f4
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/controller/BillingController.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.controller;
+
+import com.epam.datalab.BillingService;
+import com.epam.datalab.dto.billing.BillingData;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class BillingController {
+
+    private final BillingService billingService;
+
+    public BillingController(BillingService billingService) {
+        this.billingService = billingService;
+    }
+
+    @GetMapping
+    public ResponseEntity<List<BillingData>> getBilling() {
+        return new ResponseEntity<>(billingService.getBillingData(), HttpStatus.OK);
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/AdapterBase.java b/services/billing-aws/src/main/java/com/epam/datalab/core/AdapterBase.java
new file mode 100644
index 0000000..9ceea05
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/AdapterBase.java
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core;
+
+import com.epam.datalab.exceptions.AdapterException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import org.bson.Document;
+
+import java.util.List;
+
+/**
+ * Abstract module for read/write adapter.
+ * See description of {@link ModuleBase} how to create your own adapter.
+ */
+public abstract class AdapterBase extends ModuleBase {
+    public enum Mode {READ, WRITE}
+
+    ;
+
+    /**
+     * Flag the header of common format should be written to target.
+     */
+    @JsonProperty
+    private boolean writeHeader = true;
+
+
+    /**
+     * The mode of adapter read or write.
+     */
+    @JsonIgnore
+    private Mode mode;
+
+
+    /**
+     * Default constructor for deserialization.
+     */
+    public AdapterBase() {
+    }
+
+    /**
+     * Instantiate adapter for reading or writing.
+     *
+     * @param mode the mode of adapter.
+     */
+    public AdapterBase(Mode mode) {
+        this.mode = mode;
+    }
+
+
+    /**
+     * Return <b>true</b> if the header of common format should be written to target.
+     */
+    public boolean isWriteHeader() {
+        return writeHeader;
+    }
+
+    /**
+     * Set flag the header of common format should be written to target.
+     */
+    public void setWriteHeader(boolean writeHeader) {
+        this.writeHeader = writeHeader;
+    }
+
+
+    /**
+     * Return the mode of adapter read or write.
+     */
+    public Mode getMode() {
+        return mode;
+    }
+
+    /**
+     * Set the mode of adapter read or write.
+     */
+    public void setMode(Mode mode) {
+        this.mode = mode;
+    }
+
+
+    /**
+     * Open connection.
+     *
+     * @throws AdapterException if cannot open connection.
+     */
+    public abstract void open() throws AdapterException;
+
+    /**
+     * Return <b>true</b> if adapter has the multiply entries of data.
+     */
+    public boolean hasMultyEntry() {
+        return false;
+    }
+
+    /**
+     * Return <b>true</b> if current entry has the data.
+     */
+    public boolean hasEntryData() {
+        return true;
+    }
+
+    /**
+     * Open next entry if exists and return <b>true</b> otherwise return <b>false</b>.
+     *
+     * @throws AdapterException if cannot open entry.
+     */
+    public boolean openNextEntry() throws AdapterException {
+        return false;
+    }
+
+    /**
+     * Close connection.
+     *
+     * @throws AdapterException if cannot close connection.
+     */
+    public abstract void close() throws AdapterException;
+
+    /**
+     * Return the current processed entry name.
+     */
+    public abstract String getEntryName();
+
+    /**
+     * Read the line of data from adapter and return it.
+     *
+     * @throws AdapterException
+     */
+    public abstract String readLine() throws AdapterException;
+
+    /**
+     * Write the header of data to adapter.
+     *
+     * @param header the header of common format.
+     * @throws AdapterException
+     */
+    public abstract void writeHeader(List<String> header) throws AdapterException;
+
+    /**
+     * Write the row of data to adapter.
+     *
+     * @param row the row of common format.
+     * @return
+     * @throws AdapterException
+     */
+    public abstract Document writeRow(ReportLine row) throws AdapterException;
+
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("mode", mode)
+                .add("writeHeader", isWriteHeader());
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/BillingUtils.java b/services/billing-aws/src/main/java/com/epam/datalab/core/BillingUtils.java
new file mode 100644
index 0000000..65ec1b5
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/BillingUtils.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core;
+
+import com.epam.datalab.configuration.BillingToolConfigurationFactory;
+import com.epam.datalab.core.parser.ParserBase;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.logging.AppenderBase;
+import com.google.common.io.Resources;
+
+import java.io.IOException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Billing toll utilities.
+ */
+public class BillingUtils {
+
+    /**
+     * Name of resource with the names of module classes.
+     */
+    private static final String RESOURCE_MODULE_NAMES = "/" + BillingToolConfigurationFactory.class.getName();
+
+    private BillingUtils() {
+    }
+
+    /**
+     * Create and return map from given key/values.
+     *
+     * @param keyValues the key/value pairs.
+     */
+    public static Map<String, String> stringsToMap(String... keyValues) {
+        Map<String, String> map = new HashMap<>();
+        if (keyValues == null) {
+            return map;
+        }
+        if (keyValues.length % 2 != 0) {
+            throw new IllegalArgumentException("Missing key or value in arguments");
+        }
+
+        for (int i = 1; i < keyValues.length; i += 2) {
+            map.put(keyValues[i - 1], keyValues[i]);
+        }
+        return map;
+    }
+
+    /**
+     * Read and return content as string list from resource.
+     *
+     * @param resourceName the name of resource.
+     * @return list of strings.
+     * @throws InitializationException
+     */
+    public static List<String> getResourceAsList(String resourceName) throws InitializationException {
+        try {
+            URL url = BillingToolConfigurationFactory.class.getResource(resourceName);
+            if (url == null) {
+                throw new InitializationException("Resource " + resourceName + " not found");
+            }
+            return Resources.readLines(url, Charset.forName("utf-8"));
+        } catch (IllegalArgumentException | IOException e) {
+            throw new InitializationException("Cannot read resource " + resourceName + ": " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Return the list of billing tool modules.
+     *
+     * @throws InitializationException
+     */
+    public static List<Class<?>> getModuleClassList() throws InitializationException {
+        List<String> modules = getResourceAsList(RESOURCE_MODULE_NAMES);
+        List<Class<?>> classes = new ArrayList<>();
+
+        for (String className : modules) {
+            try {
+                classes.add(Class.forName(className));
+            } catch (ClassNotFoundException e) {
+                throw new InitializationException("Cannot add the sub type " + className +
+                        " from resource " + RESOURCE_MODULE_NAMES + ": " + e.getLocalizedMessage(), e);
+            }
+        }
+        return classes;
+    }
+
+    /**
+     * Check for child class is belong to parent by hierarchy.
+     *
+     * @param child  the child class for check.
+     * @param parent the parent class from hierarchy.
+     */
+    public static boolean classChildOf(Class<?> child, Class<?> parent) {
+        return child != null && parent != null && parent.isAssignableFrom(child);
+    }
+
+    /**
+     * Return the type of module if class is module otherwise <b>null</b>.
+     *
+     * @param moduleClass the class.
+     */
+    public static ModuleType getModuleType(Class<?> moduleClass) {
+        if (classChildOf(moduleClass, AdapterBase.class)) {
+            return ModuleType.ADAPTER;
+        } else if (classChildOf(moduleClass, FilterBase.class)) {
+            return ModuleType.FILTER;
+        } else if (classChildOf(moduleClass, ParserBase.class)) {
+            return ModuleType.PARSER;
+        } else if (classChildOf(moduleClass, AppenderBase.class)) {
+            return ModuleType.LOGAPPENDER;
+        }
+        return null;
+    }
+
+    /**
+     * Return the name of user without domain.
+     *
+     * @param value the value.
+     */
+    public static String getSimpleUserName(String username) {
+        return (username == null ? null : username.replaceAll("@.*", ""));
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/DBAdapterBase.java b/services/billing-aws/src/main/java/com/epam/datalab/core/DBAdapterBase.java
new file mode 100644
index 0000000..cda3da0
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/DBAdapterBase.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+/**
+ * The abstract adapter for database.
+ * See description of {@link ModuleBase} how to create your own adapter.
+ */
+public abstract class DBAdapterBase extends AdapterBase {
+
+    /**
+     * The host name.
+     */
+    @JsonProperty
+    private String host;
+
+    /**
+     * The port.
+     */
+    @JsonProperty
+    private int port;
+
+    /**
+     * The name of database.
+     */
+    @JsonProperty
+    private String database;
+
+    /**
+     * The name of user.
+     */
+    @JsonProperty
+    private String username;
+
+    /**
+     * The password.
+     */
+    @JsonProperty
+    private String password;
+
+
+    /**
+     * Default constructor for deserialization.
+     */
+    public DBAdapterBase() {
+    }
+
+    /**
+     * Instantiate adapter for reading or writing.
+     *
+     * @param mode the mode of adapter.
+     */
+    public DBAdapterBase(Mode mode) {
+        super(mode);
+    }
+
+
+    @Override
+    public boolean isWriteHeader() {
+        return false;
+    }
+
+    /**
+     * Return the host name.
+     */
+    public String getHost() {
+        return host;
+    }
+
+    /**
+     * Set the host name.
+     */
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    /**
+     * Return the port.
+     */
+    public int getPort() {
+        return port;
+    }
+
+    /**
+     * Set the port.
+     */
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    /**
+     * Return the name of database.
+     */
+    public String getDatabase() {
+        return database;
+    }
+
+    /**
+     * Set the name of database.
+     */
+    public void setDatabase(String database) {
+        this.database = database;
+    }
+
+    /**
+     * Return the name of user.
+     */
+    public String getUsername() {
+        return username;
+    }
+
+    /**
+     * Set the name of user.
+     */
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    /**
+     * Return the password.
+     */
+    public String getPassword() {
+        return password;
+    }
+
+    /**
+     * Set the password.
+     */
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("host", host)
+                .add("port", port)
+                .add("database", database)
+                .add("username", username)
+                .add("password", "***");
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/FilterBase.java b/services/billing-aws/src/main/java/com/epam/datalab/core/FilterBase.java
new file mode 100644
index 0000000..4e17514
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/FilterBase.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core;
+
+import com.epam.datalab.core.parser.ParserBase;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.exceptions.ParseException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import java.util.List;
+
+/**
+ * Abstract module of filtering.
+ * See description of {@link ModuleBase} how to create your own filter.
+ */
+public abstract class FilterBase extends ModuleBase {
+
+    /**
+     * Parser.
+     */
+    private ParserBase parser;
+
+    /**
+     * Return parser.
+     */
+    public ParserBase getParser() {
+        return parser;
+    }
+
+    /**
+     * Set parser.
+     */
+    public void setParser(ParserBase parser) {
+        this.parser = parser;
+    }
+
+
+    /**
+     * Initialize the filter.
+     *
+     * @throws InitializationException
+     */
+    public abstract void initialize() throws InitializationException;
+
+    /**
+     * Return the line for parsing if line is accepted and may be parsed,
+     * otherwise return <b>null</b>.
+     *
+     * @param line the source line.
+     * @throws ParseException
+     */
+    public abstract String canParse(String line) throws ParseException;
+
+    /**
+     * Return the list of values for transformation if value is accepted and may be transformed,
+     * otherwise return <b>null</b>.
+     *
+     * @param row the list of values.
+     * @throws ParseException
+     */
+    public abstract List<String> canTransform(List<String> row) throws ParseException;
+
+    /**
+     * Return the row of billing report if row is accepted and may be written to target,
+     * otherwise return <b>null</b>.
+     *
+     * @param row the report line.
+     * @throws ParseException
+     */
+    public abstract ReportLine canAccept(ReportLine row) throws ParseException;
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("parser", (parser == null ? null : parser.getType()));
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/ModuleBase.java b/services/billing-aws/src/main/java/com/epam/datalab/core/ModuleBase.java
new file mode 100644
index 0000000..acb26a3
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/ModuleBase.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core;
+
+import com.epam.datalab.core.parser.ParserBase;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+/**
+ * Abstract class for modules: adapter, filter, parser.<br>
+ * To create your adapter:<br>
+ * 1. Create a class which extends one of {@link AdapterBase}, {@link FilterBase} or {@link ParserBase} classes.<br>
+ * 2. Annotate it with {@link JsonTypeName} annotation and give it a unique type name for this type of modules.<br>
+ * 3. Add full the name of your class to main/resources/com.epam.datalab.configuration.BillingToolConfigurationFactory file.
+ * 4. Annotate it with {@link JsonClassDescription] annotation and describe all properties of module.
+ */
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
+public abstract class ModuleBase {
+
+    /**
+     * Working data of module.
+     */
+    @JsonIgnore
+    private ModuleData moduleData;
+
+    /**
+     * Return the name of type for appender.
+     */
+    @JsonIgnore
+    public String getType() {
+        Class<? extends ModuleBase> clazz = this.getClass();
+        return (clazz.isAnnotationPresent(JsonTypeName.class) ?
+                clazz.getAnnotation(JsonTypeName.class).value() : clazz.getName());
+    }
+
+    /**
+     * Return the working data of module.
+     */
+    public ModuleData getModuleData() {
+        return moduleData;
+    }
+
+    /**
+     * Set the working data of module.
+     */
+    public void setModuleData(ModuleData moduleData) {
+        this.moduleData = moduleData;
+    }
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @param self the object to generate the string for (typically this), used only for its class name.
+     */
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("type", getType());
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/ModuleData.java b/services/billing-aws/src/main/java/com/epam/datalab/core/ModuleData.java
new file mode 100644
index 0000000..41e1bdd
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/ModuleData.java
@@ -0,0 +1,182 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core;
+
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.mongo.MongoConstants;
+import com.epam.datalab.mongo.MongoDbConnection;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import com.mongodb.client.FindIterable;
+import com.mongodb.client.model.UpdateOptions;
+import org.apache.commons.lang3.StringUtils;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.gte;
+import static com.mongodb.client.model.Filters.or;
+import static com.mongodb.client.model.Filters.regex;
+
+/**
+ * Provides loading and storing the working data of modules.
+ */
+public class ModuleData {
+
+    public static final String ENTRIES_FIELD = "entries";
+    private static final String ID_FIELD = "_id";
+    private static final String MODIFICATION_DATE = "lastModificationDate";
+    /**
+     * Date formatter.
+     */
+    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
+    private final MongoDbConnection connection;
+
+    private String id;
+    private Date modificationDate;
+
+    /**
+     * Entries of data.
+     */
+    private Map<String, String> entries = new HashMap<>();
+
+    /**
+     * Flag modification of entries.
+     */
+    private boolean modified;
+
+    /**
+     * Instantiate module data.
+     *
+     * @param connection the name of data file.
+     * @throws InitializationException
+     */
+    public ModuleData(MongoDbConnection connection) {
+        this.connection = connection;
+    }
+
+    /**
+     * Return <b>true</b> if any entries was modify.
+     */
+    public boolean isModified() {
+        return modified;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public void setModificationDate(Date modificationDate) {
+        this.modificationDate = modificationDate;
+    }
+
+    /**
+     * Return the value for given key or <b>null</b> if value not found.
+     *
+     * @param key the key of entry.
+     */
+    public String getString(String key) {
+        return entries.get(key);
+    }
+
+    /**
+     * Return the date value for given key or <b>null</b> if value not found.
+     *
+     * @param key the key of entry.
+     * @throws ParseException
+     */
+    public Date getDate(String key) throws ParseException {
+        String value = entries.get(key);
+        return (value == null ? null : dateFormat.parse(value));
+    }
+
+    /**
+     * Set value for given key or delete entry if the value is <b>null</b>.
+     *
+     * @param key   the key of entry.
+     * @param value the value.
+     */
+    public void set(String key, String value) {
+        if (StringUtils.equals(entries.get(key), value)) {
+            return;
+        } else if (value == null) {
+            entries.remove(key);
+        } else {
+            entries.put(key, value);
+        }
+        modified = true;
+    }
+
+    /**
+     * Set value for given key or delete entry if the value is <b>null</b>.
+     *
+     * @param key   the key of entry.
+     * @param value the date.
+     */
+    public void set(String key, Date value) {
+        set(key, dateFormat.format(value));
+    }
+
+    public void store() {
+        final Document document = new Document().append(ID_FIELD, id).append(MODIFICATION_DATE, modificationDate).append(ENTRIES_FIELD, entries);
+        connection.getCollection(MongoConstants.BILLING_DATA_COLLECTION)
+                .updateOne(eq(ID_FIELD, id), new Document("$set", document), new UpdateOptions().upsert(true));
+        modified = false;
+    }
+
+    public boolean wasProcessed(String fileName, Date modificationDate, String datePrefix) {
+        final Bson filePerBillingPeriodCondition = and(regex(ID_FIELD, "^" + datePrefix), gte(MODIFICATION_DATE,
+                modificationDate));
+        final Bson fileWithExactNameCondition = and(eq(ID_FIELD, fileName), gte(MODIFICATION_DATE, modificationDate));
+        final FindIterable<Document> documents = connection.getCollection(MongoConstants.BILLING_DATA_COLLECTION)
+                .find(or(fileWithExactNameCondition, filePerBillingPeriodCondition))
+                .limit(1);
+        return documents.iterator().hasNext();
+    }
+
+    public void closeMongoConnection() throws IOException {
+        connection.close();
+    }
+
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @param self the object to generate the string for (typically this), used only for its class name.
+     */
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .addValue(entries);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .toString();
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/ModuleType.java b/services/billing-aws/src/main/java/com/epam/datalab/core/ModuleType.java
new file mode 100644
index 0000000..1b30446
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/ModuleType.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core;
+
+/**
+ * The type of billing modules: adapter, filter, parser or log appender.
+ */
+public enum ModuleType {
+    ADAPTER,
+    FILTER,
+    PARSER,
+    LOGAPPENDER;
+
+    @Override
+    public String toString() {
+        return super.toString().toLowerCase();
+    }
+
+    public static ModuleType of(String string) {
+        if (string != null) {
+            for (ModuleType value : ModuleType.values()) {
+                if (string.equalsIgnoreCase(value.toString())) {
+                    return value;
+                }
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/aggregate/AggregateGranularity.java b/services/billing-aws/src/main/java/com/epam/datalab/core/aggregate/AggregateGranularity.java
new file mode 100644
index 0000000..20617d2
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/aggregate/AggregateGranularity.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.core.aggregate;
+
+/**
+ * Aggregate granularity for aggregation.
+ */
+public enum AggregateGranularity {
+    NONE,
+    DAY,
+    MONTH;
+
+    @Override
+    public String toString() {
+        return super.toString().toLowerCase();
+    }
+
+    public static AggregateGranularity of(String string) {
+        if (string != null) {
+            for (AggregateGranularity value : AggregateGranularity.values()) {
+                if (string.equalsIgnoreCase(value.toString())) {
+                    return value;
+                }
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/aggregate/DataAggregator.java b/services/billing-aws/src/main/java/com/epam/datalab/core/aggregate/DataAggregator.java
new file mode 100644
index 0000000..0800182
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/aggregate/DataAggregator.java
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.aggregate;
+
+import com.epam.datalab.model.aws.ReportLine;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Vector;
+
+/**
+ * Aggregate billing report and summarizes column usage and cost.
+ */
+public class DataAggregator {
+    /**
+     * List of the report lines.
+     */
+    private final Vector<ReportLine> reportLines = new Vector<>(1000);
+
+    /**
+     * Comparator for aggregation.
+     */
+    private final Comparator<ReportLine> aggComparator = new AggComparator();
+
+    /**
+     * Granularity for aggregation.
+     */
+    private AggregateGranularity granularity;
+
+    /**
+     * Length of date for truncate.
+     */
+    private int truncateDateLength;
+
+
+    public DataAggregator(AggregateGranularity granularity) {
+        switch (granularity) {
+            case DAY:
+                truncateDateLength = 10;
+                break;
+            case MONTH:
+                truncateDateLength = 7;
+                break;
+            default:
+                throw new IllegalArgumentException("Invalid value of granularity argument: expected DAY or MONTH, " +
+                        "actual is " + granularity);
+        }
+        this.granularity = granularity;
+    }
+
+    /**
+     * Return granularity for aggregation.
+     */
+    public AggregateGranularity getGranularity() {
+        return granularity;
+    }
+
+    /**
+     * Appends the report line to the list and returns it.
+     *
+     * @param row the line of report.
+     * @return Instance of the aggregated report line.
+     */
+    public ReportLine append(ReportLine row) {
+        synchronized (this) {
+            String usageInterval = truncDate(row.getUsageDate());
+            row.setUsageDate(usageInterval);
+            int index = Collections.binarySearch(reportLines, row, aggComparator);
+            if (index < 0) {
+                index = -index;
+                if (index > reportLines.size()) {
+                    reportLines.add(row);
+                } else {
+                    reportLines.add(index - 1, row);
+                }
+            } else {
+                ReportLine found = reportLines.get(index);
+                found.setUsage(found.getUsage() + row.getUsage());
+                found.setCost(found.getCost() + row.getCost());
+                return found;
+            }
+        }
+
+        return row;
+    }
+
+    /**
+     * Truncate given date for aggregates.
+     *
+     * @param date the date.
+     * @return truncated date.
+     */
+    private String truncDate(String date) {
+        if (date == null || date.length() <= truncateDateLength) {
+            return date;
+        }
+        return date.substring(0, truncateDateLength);
+    }
+
+    /**
+     * Returns the number of the report lines in list.
+     */
+    public int size() {
+        return reportLines.size();
+    }
+
+    /**
+     * Returns the report line.
+     *
+     * @param index index of the report line.
+     */
+    public ReportLine get(int index) {
+        return reportLines.get(index);
+    }
+
+    /**
+     * Removes all of the elements from list.
+     */
+    public void clear() {
+        reportLines.clear();
+    }
+
+    /**
+     * Comparator for aggregation.
+     */
+    private class AggComparator implements Comparator<ReportLine> {
+        @Override
+        public int compare(ReportLine o1, ReportLine o2) {
+            if (o1 == null) {
+                return (o2 == null ? 0 : -1);
+            } else if (o2 == null) {
+                return 1;
+            }
+
+            int result = StringUtils.compare(o1.getResourceId(), o2.getResourceId());
+            if (result == 0) {
+                result = StringUtils.compare(o1.getUsageType(), o2.getUsageType());
+                if (result == 0) {
+                    result = StringUtils.compare(o1.getUsageDate(), o2.getUsageDate());
+                    if (result == 0) {
+                        result = StringUtils.compare(o1.getProduct(), o2.getProduct());
+                        if (result == 0) {
+                            result = StringUtils.compare(o1.getUser(), o2.getUser());
+                            if (result == 0) {
+                                return StringUtils.compare(o1.getDatalabId(), o2.getDatalabId());
+                            }
+                        }
+                    }
+                }
+            }
+            return result;
+        }
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/aggregate/UsageDataList.java b/services/billing-aws/src/main/java/com/epam/datalab/core/aggregate/UsageDataList.java
new file mode 100644
index 0000000..f45381c
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/aggregate/UsageDataList.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.aggregate;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * List of usage dates the billing report data.
+ */
+public class UsageDataList implements Iterable<String> {
+    /**
+     * List of dates.
+     */
+    private final Map<String, Boolean> map = new HashMap<>();
+
+    /**
+     * Appends the date to the list and returns it.
+     *
+     * @param usageDate the date of data.
+     * @return Instance of the range.
+     */
+    public void append(String usageDate) {
+        synchronized (this) {
+            if (!map.containsKey(usageDate)) {
+                map.put(usageDate, false);
+            }
+        }
+    }
+
+    /**
+     * Returns the number of the range in list.
+     */
+    public int size() {
+        return map.size();
+    }
+
+    /**
+     * Returns the value for date.
+     *
+     * @param usageDate the date.
+     */
+    public Boolean get(String usageDate) {
+        return map.get(usageDate);
+    }
+
+    /**
+     * Set the value of usageDate.
+     *
+     * @param usageDate the date.
+     */
+    public void set(String usageDate, boolean value) {
+        if (map.containsKey(usageDate)) {
+            map.put(usageDate, value);
+        }
+    }
+
+    /**
+     * Removes all of the elements from list.
+     */
+    public void clear() {
+        map.clear();
+    }
+
+    @Override
+    public Iterator<String> iterator() {
+        return map.keySet().iterator();
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ColumnInfo.java b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ColumnInfo.java
new file mode 100644
index 0000000..ee5aceb
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ColumnInfo.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+/**
+ * Describe the info of column mapping: source to target.
+ */
+public class ColumnInfo {
+
+    /**
+     * The target column name.
+     */
+    public final String targetName;
+
+    /**
+     * The source column name.
+     */
+    public final String sourceName;
+
+    /**
+     * The source column index.
+     */
+    public final int sourceIndex;
+
+    /**
+     * Instantiate the info of column mapping.
+     *
+     * @param targetName  the target column name.
+     * @param sourceName  the source column name.
+     * @param sourceIndex the source column index.
+     */
+    public ColumnInfo(String targetName, String sourceName, int sourceIndex) {
+        this.targetName = targetName;
+        this.sourceName = sourceName;
+        this.sourceIndex = sourceIndex;
+    }
+
+    @Override
+    public String toString() {
+        return targetName + "=" + (sourceName == null ? "" : sourceName + "[" + sourceIndex + "]");
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ColumnMeta.java b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ColumnMeta.java
new file mode 100644
index 0000000..63172bd
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ColumnMeta.java
@@ -0,0 +1,318 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Provides column meta information.
+ */
+public class ColumnMeta {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ColumnMeta.class);
+
+    /**
+     * Character for separate the tag values and column names.
+     */
+    public static final char TAG_SEPARATOR = ',';
+    /**
+     * Character for separate the column mapping.
+     */
+    public static final char MAPPING_COLUMN_SEPARATOR = ';';
+
+    /**
+     * The column names for common format.
+     */
+    static final String[] COLUMN_NAMES = {
+            ReportLine.FIELD_DATALAB_ID,
+            ReportLine.FIELD_USER_ID,
+            ReportLine.FIELD_USAGE_DATE,
+            ReportLine.FIELD_PRODUCT,
+            ReportLine.FIELD_USAGE_TYPE,
+            ReportLine.FIELD_USAGE,
+            ReportLine.FIELD_COST,
+            ReportLine.FIELD_CURRENCY_CODE,
+            ReportLine.FIELD_RESOURCE_ID,
+            ReportLine.FIELD_TAGS
+    };
+
+    /**
+     * The index of the first column for tags.
+     */
+    public static final int TAG_COLUMN_INDEX = COLUMN_NAMES.length - 1;
+
+    /**
+     * The list of target column names.
+     */
+    private List<String> targetColumnNames;
+
+    /**
+     * The list of source column names.
+     */
+    private final List<String> sourceColumnNames;
+
+    /**
+     * The list of column mapping: source to target.
+     */
+    private List<ColumnInfo> columnMapping;
+
+
+    /**
+     * Instantiate the common format parser. <b>columnMappingString</b> is semicolon separated
+     * string with key=value as target=source columns name or indexes of source column. For example,<br>
+     * "accountId=PayerAccountId;usageIntervalStart=UsageStartDate;usageIntervalEnd=UsageEndDate; ...
+     * ;tags=user:tag1,user:tag2,user:tagN".
+     *
+     * @param columnMappingString column mapping: source to target. if <b>null</b>
+     *                            the source data will be converted without mapping.
+     * @param sourceColumnNames   the source column names.
+     * @throws InitializationException
+     */
+    public ColumnMeta(String columnMappingString, List<String> sourceColumnNames) throws InitializationException {
+        this.sourceColumnNames = sourceColumnNames;
+        if (columnMappingString != null) {
+            try {
+                setColumnMapping(columnMappingString, sourceColumnNames);
+            } catch (Exception e) {
+                throw new InitializationException("Column mapping error. " + e.getLocalizedMessage(), e);
+            }
+        }
+    }
+
+
+    /**
+     * Return the list of target column names.
+     */
+    public List<String> getTargetColumnNames() {
+        return targetColumnNames;
+    }
+
+    /**
+     * Return the list of source column names.
+     */
+    public List<String> getSourceColumnNames() {
+        return sourceColumnNames;
+    }
+
+    /**
+     * Return the list of column mapping: source to target.
+     */
+    public List<ColumnInfo> getColumnMapping() {
+        return columnMapping;
+    }
+
+
+    /**
+     * Return the index of column in the list <b>columnNames</b> or throw exception {@link InitializationException}
+     *
+     * @param columnName  the name of column.
+     * @param columnNames the list of column names.
+     * @return the index of column.
+     * @throws InitializationException if column not found in the list of columns.
+     */
+    public static int getColumnIndexByName(String columnName, List<String> columnNames) throws
+            InitializationException {
+        for (int i = 0; i < columnNames.size(); i++) {
+            if (columnName.equals(columnNames.get(i))) {
+                return i;
+            }
+        }
+        throw new InitializationException("Column index not detected for column \"" + columnName + "\"");
+    }
+
+    /**
+     * Return the index of column in the list <b>columnNames</b> or throw exception {@link InitializationException}.
+     * columnName may be present as column index. For example like this "$2" for second column.
+     *
+     * @param columnName  the name of column or index.
+     * @param columnNames the list of column names.
+     * @return the index of column.
+     * @throws InitializationException if column not found in the list of columns.
+     */
+    private static int getColumnIndex(String columnName, List<String> columnNames) throws InitializationException {
+        if (columnName.startsWith("$")) {
+            try {
+                return Integer.parseInt(columnName.substring(1)) - 1;
+            } catch (NumberFormatException e) {
+                // Not a column index but column name
+            }
+        }
+        if (columnNames == null) {
+            throw new InitializationException("Invalid column index \"" + columnName + "\"");
+        }
+        return getColumnIndexByName(columnName, columnNames);
+    }
+
+    /**
+     * Return the index of column in the list <b>columnNames</b> or throw exception {@link InitializationException}.
+     * columnName may be present as column index. For example like this "$2" for second column.
+     *
+     * @param columnName the name of column or index.
+     * @return the index of column.
+     * @throws InitializationException if column not found in the list of columns.
+     */
+    private static int getColumnIndex(String columnName) throws InitializationException {
+        ArrayList<String> list = new ArrayList<>(COLUMN_NAMES.length);
+        for (String s : COLUMN_NAMES) {
+            list.add(s);
+        }
+        return getColumnIndexByName(columnName, list);
+    }
+
+    /**
+     * Create map of target and source columns for column mapping. Key of map is target column, the value
+     * is source column. <b>columnMappingString</b> is semicolon separated string with key=value as
+     * target=source columns name or indexes of source column. For example,<br>
+     * "accountId=PayerAccountId;usageIntervalStart=UsageStartDate;usageIntervalEnd=UsageEndDate; ...
+     * ;tags=user:tag1,user:tag2,user:tagN".
+     *
+     * @param columnMappingString column mapping: source to target.
+     * @param sourceColumnNames
+     * @return Map of target and source columns for column mapping.
+     * @throws InitializationException
+     */
+    private Map<String, String> getSourceToTarget(String columnMappingString, List<String> sourceColumnNames) throws
+            InitializationException {
+        String[] entries = StringUtils.split(columnMappingString, MAPPING_COLUMN_SEPARATOR);
+        Map<String, String> sourceToTarget = new HashMap<>();
+
+        for (String entry : entries) {
+            if (entry.trim().isEmpty() || !entry.contains("=")) {
+                throw new InitializationException("Invalid the entry \"" + entry + "\"in column mapping");
+            }
+            String[] pair = StringUtils.split(entry, '=');
+            if (pair.length != 2) {
+                throw new InitializationException("Invalid the entry \"" + entry + "\"in column mapping");
+            }
+
+            pair[0] = pair[0].trim();
+            pair[1] = pair[1].trim();
+
+            try {
+                int index = getColumnIndex(pair[0]);
+                pair[0] = COLUMN_NAMES[index];
+            } catch (InitializationException e) {
+                throw new InitializationException("Unkown target column \"" + pair[0] + "\".", e);
+            }
+
+            try {
+                if (!pair[0].equals(ReportLine.FIELD_TAGS)) {
+                    int index = getColumnIndex(pair[1], sourceColumnNames);
+                    if (sourceColumnNames != null) {
+                        pair[1] = sourceColumnNames.get(index);
+                    }
+                }
+            } catch (InitializationException e) {
+                if (sourceColumnNames == null) {
+                    throw new InitializationException("Invalid column index \"" + pair[1] + "\" or column header not " +
+                            "defined");
+                }
+                throw new InitializationException("Unkown source column \"" + pair[1] + "\".", e);
+            }
+            sourceToTarget.put(pair[0], pair[1]);
+        }
+
+        return sourceToTarget;
+    }
+
+    /**
+     * Initialize and set column mapping. <b>columnMappingString</b> is semicolon separated string with key=value as
+     * target=source columns name or indexes of source column. For example,<br>
+     * "accountId=PayerAccountId;usageIntervalStart=UsageStartDate;usageIntervalEnd=UsageEndDate; ...
+     * ;tags=user:tag1,user:tag2,user:tagN".
+     *
+     * @param columnMappingString column mapping: source to target. if <b>null</b>
+     *                            the source data will be converted without mapping.
+     * @param sourceColumnNames   the list of source column names.
+     * @throws InitializationException
+     */
+    private void setColumnMapping(String columnMappingString, List<String> sourceColumnNames) throws
+            InitializationException {
+        if (columnMappingString == null) {
+            throw new InitializationException("Mapping not defined.");
+        }
+
+        Map<String, String> sourceToTarget = getSourceToTarget(columnMappingString, sourceColumnNames);
+        String tags = sourceToTarget.get(ReportLine.FIELD_TAGS);
+        List<String> tagColumns = (tags == null ? null :
+                Arrays.asList(StringUtils.split(tags, TAG_SEPARATOR)));
+
+        LOGGER.info("Mapping columns [target=source:name[index]]:");
+        int columnCount = COLUMN_NAMES.length - 1;
+        int tagCount = (tagColumns == null ? 0 : tagColumns.size());
+        columnMapping = new ArrayList<>(columnCount + tagCount);
+        targetColumnNames = new ArrayList<>(columnCount + tagCount);
+
+        for (int i = 0; i < columnCount; i++) {
+            String sourceName = sourceToTarget.get(COLUMN_NAMES[i]);
+            ColumnInfo columnInfo = new ColumnInfo(
+                    COLUMN_NAMES[i],
+                    sourceName,
+                    (sourceName == null ? -1 : getColumnIndex(sourceName, sourceColumnNames)));
+            columnMapping.add(columnInfo);
+            targetColumnNames.add(COLUMN_NAMES[i]);
+            LOGGER.info("  " + columnInfo.toString());
+        }
+
+        for (int i = 0; i < tagCount; i++) {
+            String sourceName = tagColumns.get(i).trim();
+            int sourceIndex = getColumnIndex(sourceName, sourceColumnNames);
+            if (sourceColumnNames != null) {
+                sourceName = sourceColumnNames.get(sourceIndex);
+            }
+            ColumnInfo columnInfo = new ColumnInfo(
+                    ReportLine.FIELD_TAGS,
+                    sourceName,
+                    sourceIndex);
+            columnMapping.add(columnInfo);
+            targetColumnNames.add(sourceName);
+            LOGGER.info("  " + columnInfo.toString());
+        }
+    }
+
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @param self the object to generate the string for (typically this), used only for its class name.
+     */
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("targetColumnNames", targetColumnNames)
+                .add("sourceColumnNames", sourceColumnNames)
+                .add("columnMapping", columnMapping);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/parser/CommonFormat.java b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/CommonFormat.java
new file mode 100644
index 0000000..28b4242
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/CommonFormat.java
@@ -0,0 +1,304 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import com.epam.datalab.exceptions.ParseException;
+import com.epam.datalab.model.aws.ReportLine;
+import org.apache.commons.lang3.StringUtils;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+/**
+ * Provides common format features.
+ */
+public class CommonFormat {
+    /**
+     * Character for separate field names and values.
+     */
+    public static final char FIELD_SEPARATOR = ',';
+
+    /**
+     * Character for termination field names and values.
+     */
+    public static final char FIELD_DELIMITER = '"';
+
+    /**
+     * Escape character.
+     */
+    public static final char ESCAPE_CHAR = '\\';
+
+    /**
+     * Default character used for decimal sign.
+     */
+    public static final char DECIMAL_SEPARATOR_DEFAULT = '.';
+
+    /**
+     * Default character used for thousands separator.
+     */
+    public static final char DECIMAL_GROUPING_SEPARATOR_DEFAULT = ' ';
+
+    /**
+     * String of the field separator for replacement to target data.
+     */
+    private static final String DELIMITER_REPLACE_FROM = String.valueOf(FIELD_DELIMITER);
+
+    /**
+     * String of the escaped field separator for replacement to target data.
+     */
+    private static final String DELIMITER_REPLACE_TO = new StringBuilder()
+            .append(ESCAPE_CHAR)
+            .append(FIELD_DELIMITER)
+            .toString();
+
+    /**
+     * Formatter for convert decimal numbers to string.
+     */
+    private static final DecimalFormat DECIMAL_TO_STRING_FORMAT;
+
+    static {
+        DECIMAL_TO_STRING_FORMAT = new DecimalFormat();
+        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
+        symbols.setDecimalSeparator(DECIMAL_SEPARATOR_DEFAULT);
+        DECIMAL_TO_STRING_FORMAT.setDecimalFormatSymbols(symbols);
+        DECIMAL_TO_STRING_FORMAT.setGroupingUsed(false);
+        DECIMAL_TO_STRING_FORMAT.setMaximumFractionDigits(100);
+    }
+
+
+    /**
+     * Column meta information.
+     */
+    private final ColumnMeta columnMeta;
+
+    /**
+     * Formatter for parse of decimal number .
+     */
+    private final DecimalFormat sourceDecimalFormat;
+
+
+    /**
+     * Instantiate the helper for common format.
+     *
+     * @param columnMeta column meta information.
+     */
+    public CommonFormat(ColumnMeta columnMeta) {
+        this(columnMeta, DECIMAL_SEPARATOR_DEFAULT, DECIMAL_GROUPING_SEPARATOR_DEFAULT);
+    }
+
+    /**
+     * Instantiate the helper for common format.
+     *
+     * @param columnMeta        column meta information.
+     * @param decimalSeparator  the character used for decimal sign.
+     * @param groupingSeparator the character used for thousands separator.
+     */
+    public CommonFormat(ColumnMeta columnMeta, char sourceDecimalSeparator, char sourceGroupingSeparator) {
+        this.columnMeta = columnMeta;
+        this.sourceDecimalFormat = getDecimalFormat(sourceDecimalSeparator, sourceGroupingSeparator);
+    }
+
+
+    /**
+     * Create and return the target row for common format from source.
+     *
+     * @param sourceRow the source row.
+     * @return row in common format.
+     * @throws ParseException
+     */
+    public ReportLine toCommonFormat(List<String> sourceRow) throws ParseException {
+        if (columnMeta.getColumnMapping() == null) {
+            return toReportLine(sourceRow);
+        }
+
+        List<String> targetRow = new ArrayList<>();
+        for (ColumnInfo columnInfo : columnMeta.getColumnMapping()) {
+            targetRow.add((columnInfo.sourceIndex < 0 ? "" :
+                    (columnInfo.sourceIndex < sourceRow.size() ? sourceRow.get(columnInfo.sourceIndex) : null)));
+        }
+        return toReportLine(targetRow);
+    }
+
+    /**
+     * Add the column value to string in CSV format.
+     *
+     * @param sb    the buffer of sting.
+     * @param value the value.
+     * @return the buffer of string.
+     */
+    private static StringBuilder addToStringBuilder(StringBuilder sb, String value) {
+        if (sb.length() > 0) {
+            sb.append(FIELD_SEPARATOR);
+        }
+        return sb.append(FIELD_DELIMITER)
+                .append(StringUtils.replace(value, DELIMITER_REPLACE_FROM, DELIMITER_REPLACE_TO))
+                .append(FIELD_DELIMITER);
+    }
+
+    /**
+     * Convert row to line in CSV format.
+     *
+     * @param row row for convertation.
+     * @return string in CSV format.
+     */
+    public static String rowToString(List<String> row) {
+        StringBuilder sb = new StringBuilder();
+        for (String s : row) {
+            addToStringBuilder(sb, s);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Convert row to line in CSV format.
+     *
+     * @param row row for convertation.
+     * @return string in CSV format.
+     */
+    public static String rowToString(ReportLine row) {
+        StringBuilder sb = new StringBuilder();
+
+        addToStringBuilder(sb, row.getDatalabId());
+        addToStringBuilder(sb, row.getUser());
+        addToStringBuilder(sb, row.getUsageDate());
+        addToStringBuilder(sb, row.getProduct());
+        addToStringBuilder(sb, row.getUsageType());
+        addToStringBuilder(sb, doubleToString(row.getUsage()));
+        addToStringBuilder(sb, doubleToString(row.getCost()));
+        addToStringBuilder(sb, row.getCurrencyCode());
+        addToStringBuilder(sb, row.getResourceType().toString());
+        addToStringBuilder(sb, row.getResourceId());
+
+        if (row.getTags() != null) {
+            for (String key : row.getTags().keySet()) {
+                addToStringBuilder(sb, row.getTags().get(key));
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Create and return decimal formatter.
+     *
+     * @param decimalSeparator  the character used for decimal sign.
+     * @param groupingSeparator the character used for thousands separator.
+     * @return Formatter for decimal digits.
+     */
+    private DecimalFormat getDecimalFormat(char decimalSeparator, char groupingSeparator) {
+        DecimalFormat df = new DecimalFormat();
+        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
+        symbols.setDecimalSeparator(decimalSeparator);
+        symbols.setGroupingSeparator(groupingSeparator);
+        df.setDecimalFormatSymbols(symbols);
+        return df;
+    }
+
+    /**
+     * Parse and return double value. If value is <b>null</b> or empty return zero.
+     *
+     * @param columnName the name of column.
+     * @param value      the value.
+     * @throws ParseException
+     */
+    public double parseDouble(String columnName, String value) throws ParseException {
+        if (value == null || value.trim().isEmpty()) {
+            return 0;
+        }
+        try {
+            return sourceDecimalFormat.parse(value).doubleValue();
+        } catch (Exception e) {
+            throw new ParseException("Cannot cast column " + columnName + " value \"" + value + "\" to double: " + e
+                    .getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Return the string representation of double value.
+     *
+     * @param value the value.
+     */
+    public static String doubleToString(double value) {
+        return DECIMAL_TO_STRING_FORMAT.format(value);
+    }
+
+    /**
+     * Creates and returns the line of billing report from the list of values.
+     *
+     * @param row the list of values.
+     * @return the line of billing report.
+     * @throws ParseException
+     */
+    public ReportLine toReportLine(List<String> row) throws ParseException {
+        if (row.size() < ColumnMeta.TAG_COLUMN_INDEX || row.size() > columnMeta.getTargetColumnNames().size()) {
+            throw new ParseException("Invalid the number of columns in list: expected from " + ColumnMeta
+                    .TAG_COLUMN_INDEX +
+                    " to " + columnMeta.getTargetColumnNames().size() + ", actual " + row.size());
+        }
+        ReportLine line = new ReportLine();
+        int i = 0;
+
+        line.setDatalabId(row.get(i));
+        line.setUser(row.get(++i));
+        line.setUsageDate(row.get(++i));
+        line.setProduct(row.get(++i));
+        line.setUsageType(row.get(++i));
+        line.setUsage(parseDouble("usage", row.get(++i)));
+        line.setCost(parseDouble("cost", row.get(++i)));
+        line.setCurrencyCode(row.get(++i));
+        line.setResourceTypeId(row.get(++i));
+
+        if (row.size() >= ColumnMeta.TAG_COLUMN_INDEX) {
+            LinkedHashMap<String, String> tags = new LinkedHashMap<>();
+            i++;
+            while (i < row.size()) {
+                tags.put(columnMeta.getTargetColumnNames().get(i), row.get(i++));
+            }
+            line.setTags(tags);
+        }
+
+        return line;
+    }
+
+
+    /**
+     * Print row to console.
+     *
+     * @param row array of values.
+     */
+    public static void printRow(String[] row) {
+        System.out.print(" | ");
+        for (String s : row) {
+            System.out.print(s + " | ");
+        }
+        System.out.println();
+    }
+
+    /**
+     * Print row to console.
+     *
+     * @param row list of values.
+     */
+    public static void printRow(List<String> row) {
+        printRow(row.toArray(new String[row.size()]));
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ConditionEvaluate.java b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ConditionEvaluate.java
new file mode 100644
index 0000000..abfd31e
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ConditionEvaluate.java
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.exceptions.ParseException;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import org.apache.commons.jexl3.JexlBuilder;
+import org.apache.commons.jexl3.JexlContext;
+import org.apache.commons.jexl3.JexlEngine;
+import org.apache.commons.jexl3.MapContext;
+import org.apache.commons.jexl3.internal.Script;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Evaluate condition for filtering source data.
+ */
+public class ConditionEvaluate {
+
+    /**
+     * Names of columns for condition.
+     */
+    private String[] columnNames;
+
+    /**
+     * Indexes of columns for condition.
+     */
+    private int[] columnIndexes;
+
+    /**
+     * JEXL expression for evaluation.
+     */
+    private final Script expression;
+
+    /**
+     * JEXL context to evaluate row.
+     */
+    private final JexlContext jexlContext;
+
+    /**
+     * Instantiate the engine to evaluate condition.
+     *
+     * @param columnNames the list of column names.
+     * @param condition   condition for filtering data.
+     * @throws InitializationException
+     */
+    public ConditionEvaluate(List<String> columnNames, String condition) throws InitializationException {
+        //Replace : to . in column names
+        List<String> colNames = new ArrayList<>(columnNames.size());
+        for (int i = 0; i < columnNames.size(); i++) {
+            String name = columnNames.get(i);
+            if (name.indexOf(':') > -1 && condition.indexOf(name) > -1) {
+                String newName = StringUtils.replaceChars(name, ':', '.');
+                colNames.add(newName);
+                condition = StringUtils.replace(condition, name, newName);
+            } else {
+                colNames.add(name);
+            }
+        }
+
+        try {
+            JexlEngine engine = new JexlBuilder().strict(true).silent(false).debug(true).create();
+            expression = (Script) engine.createExpression(condition);
+            jexlContext = new MapContext();
+        } catch (Exception e) {
+            throw new InitializationException("Cannot initialize JEXL engine for condition: " + condition + ". " +
+                    e.getLocalizedMessage(), e);
+        }
+
+        // Create mapping of columns for evaluations.
+        List<String> names = new ArrayList<>();
+        List<Integer> indexes = new ArrayList<>();
+        for (List<String> variableList : expression.getVariables()) {
+            String columnName = StringUtils.join(variableList, '.');
+            int index = getColumnIndex(colNames, columnName);
+            if (index == -1) {
+                throw new InitializationException("Unknow source column name \"" + columnName + "\" in condition: " +
+                        expression.getSourceText() + ". Known column names: " + StringUtils.join(columnNames, ", ") + ".");
+            }
+            names.add(columnName);
+            indexes.add(index);
+        }
+
+        this.columnNames = new String[names.size()];
+        this.columnIndexes = new int[indexes.size()];
+        for (int i = 0; i < indexes.size(); i++) {
+            this.columnNames[i] = names.get(i);
+            this.columnIndexes[i] = indexes.get(i);
+        }
+    }
+
+    /**
+     * Find and return the index of column in the given column list.
+     *
+     * @param columnNames the list of column names.
+     * @param columnName  the name of column to find.
+     */
+    private int getColumnIndex(List<String> columnNames, String columnName) {
+        for (int i = 0; i < columnNames.size(); i++) {
+            if (columnName.equals(columnNames.get(i))) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * Evaluate condition for given row.
+     *
+     * @param row the row to evaluate.
+     * @return <true> if condition is true.
+     * @throws ParseException if condition is not return boolean type.
+     */
+    public boolean evaluate(List<String> row) throws ParseException {
+        for (int i = 0; i < columnNames.length; i++) {
+            jexlContext.set(columnNames[i], row.get(columnIndexes[i]));
+        }
+        Object value;
+        try {
+            value = expression.evaluate(jexlContext);
+        } catch (Exception e) {
+            throw new ParseException("Cannot evaluate condition: " + expression.getSourceText() + ". " +
+                    e.getLocalizedMessage(), e);
+        }
+        if (value instanceof Boolean) {
+            return (Boolean) value;
+        }
+        throw new ParseException("Invalid condition: " + expression.getSourceText());
+    }
+
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @param self the object to generate the string for (typically this), used only for its class name.
+     */
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("columnNames", columnNames)
+                .add("columnIndexes", columnIndexes);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ParserBase.java b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ParserBase.java
new file mode 100644
index 0000000..3b54850
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ParserBase.java
@@ -0,0 +1,395 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import com.epam.datalab.core.AdapterBase;
+import com.epam.datalab.core.FilterBase;
+import com.epam.datalab.core.ModuleBase;
+import com.epam.datalab.core.aggregate.AggregateGranularity;
+import com.epam.datalab.core.aggregate.DataAggregator;
+import com.epam.datalab.exceptions.AdapterException;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.exceptions.ParseException;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import org.apache.commons.lang3.StringUtils;
+import org.bson.Document;
+
+import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Abstract module of parser.<br>
+ * See description of {@link ModuleBase} how to create your own parser.
+ */
+public abstract class ParserBase extends ModuleBase {
+
+    /**
+     * Default character used for decimal sign.
+     */
+    public static final char DECIMAL_SEPARATOR_DEFAULT = '.';
+
+    /**
+     * Default character used for thousands separator.
+     */
+    public static final char DECIMAL_GROUPING_SEPARATOR_DEFAULT = ' ';
+
+    /**
+     * Name of key for date report data.
+     */
+    public static final String DATA_KEY_START_DATE = "ParserBase.maxStartDate";
+
+
+    /**
+     * Mapping columns from source format to target.
+     */
+    @JsonProperty
+    private String columnMapping = null;
+
+    /**
+     * Where condition for filtering the source data.
+     */
+    @JsonProperty
+    private String whereCondition = null;
+
+    /**
+     * How to aggregate the parsed data.
+     */
+    @JsonProperty
+    @NotNull
+    private AggregateGranularity aggregate = AggregateGranularity.NONE;
+
+    /**
+     * Character used for decimal sign of source data.
+     */
+    @JsonProperty
+    @NotNull
+    private char decimalSeparator = DECIMAL_SEPARATOR_DEFAULT;
+
+    /**
+     * Character used for thousands separator of source data.
+     */
+    @JsonProperty
+    @NotNull
+    private char groupingSeparator = DECIMAL_GROUPING_SEPARATOR_DEFAULT;
+
+
+    /**
+     * Adapter for reading source data.
+     */
+    @JsonIgnore
+    private AdapterBase adapterIn;
+
+    /**
+     * Adapter for writing converted data.
+     */
+    @JsonIgnore
+    private AdapterBase adapterOut;
+
+    /**
+     * Filter for source and converted data.
+     */
+    @JsonIgnore
+    private FilterBase filter;
+
+
+    /**
+     * Column meta information.
+     */
+    @JsonIgnore
+    private ColumnMeta columnMeta;
+
+    /**
+     * Condition for filtering the source data.
+     */
+    @JsonIgnore
+    private ConditionEvaluate condition;
+
+    /**
+     * Aggregator of billing report.
+     */
+    @JsonIgnore
+    private DataAggregator aggregator;
+
+    /**
+     * Common format helper.
+     */
+    @JsonIgnore
+    private CommonFormat commonFormat;
+
+    /**
+     * Parser statistics.
+     */
+    @JsonIgnore
+    private final List<ParserStatistics> statistics = new ArrayList<>();
+
+    /**
+     * Current parser statistics.
+     */
+    @JsonIgnore
+    ParserStatistics currentStatistics = null;
+
+
+    /**
+     * Return mapping columns from source format to target.
+     */
+    public String getColumnMapping() {
+        return columnMapping;
+    }
+
+    /**
+     * Set mapping columns from source format to target.
+     */
+    public void setColumnMapping(String columnMapping) {
+        this.columnMapping = columnMapping;
+    }
+
+    /**
+     * Return where condition for filtering the source data.
+     */
+    public String getWhereCondition() {
+        return whereCondition;
+    }
+
+    /**
+     * Set where condition for filtering the source data.
+     */
+    public void setWhereCondition(String whereCondition) {
+        this.whereCondition = whereCondition;
+    }
+
+    /**
+     * Return how to aggregate the parsed data.
+     */
+    public AggregateGranularity getAggregate() {
+        return aggregate;
+    }
+
+    /**
+     * Set how to aggregate the parsed data.
+     *
+     * @throws InitializationException
+     */
+    public void setAggregate(String aggregate) throws InitializationException {
+        if (aggregate == null) {
+            throw new InitializationException("Property aggregate cannot be null");
+        }
+        AggregateGranularity value = AggregateGranularity.of(aggregate);
+        if (value == null) {
+            throw new InitializationException("Invalid value \"" + aggregate + "\" for property aggregate. " +
+                    "Should be one of: " + StringUtils.join(AggregateGranularity.values(), ", "));
+        }
+        this.aggregate = value;
+    }
+
+    /**
+     * Return character used for decimal sign of source data.
+     */
+    public char getDecimalSeparator() {
+        return decimalSeparator;
+    }
+
+    /**
+     * Set character used for decimal sign of source data.
+     */
+    public void setDecimalSeparator(char decimalSeparator) {
+        this.decimalSeparator = decimalSeparator;
+    }
+
+    /**
+     * Return character used for thousands separator of source data.
+     */
+    public char getGroupingSeparator() {
+        return groupingSeparator;
+    }
+
+    /**
+     * Set character used for thousands separator of source data.
+     */
+    public void setGroupingSeparator(char groupingSeparator) {
+        this.groupingSeparator = groupingSeparator;
+    }
+
+
+    /**
+     * Return the adapter for reading source data.
+     */
+    public AdapterBase getAdapterIn() {
+        return adapterIn;
+    }
+
+    /**
+     * Return the adapter for writing converted data.
+     */
+    public AdapterBase getAdapterOut() {
+        return adapterOut;
+    }
+
+    /**
+     * Return the filter for source and converted data.
+     */
+    public FilterBase getFilter() {
+        return filter;
+    }
+
+    /**
+     * Return the column meta information.
+     */
+    public ColumnMeta getColumnMeta() {
+        return columnMeta;
+    }
+
+    /**
+     * Return the condition for filtering the source data.
+     */
+    public ConditionEvaluate getCondition() {
+        return condition;
+    }
+
+    /**
+     * Return the aggregator of billing report.
+     */
+    public DataAggregator getAggregator() {
+        return aggregator;
+    }
+
+    /**
+     * Return the common format helper.
+     */
+    public CommonFormat getCommonFormat() {
+        return commonFormat;
+    }
+
+    /**
+     * Return the parser statistics.
+     */
+    public List<ParserStatistics> getStatistics() {
+        return statistics;
+    }
+
+    /**
+     * Add and return the new instance for statistics.
+     *
+     * @param entryName the name of new entry.
+     */
+    public ParserStatistics addStatistics(String entryName) {
+        currentStatistics = new ParserStatistics(entryName);
+        statistics.add(currentStatistics);
+        return currentStatistics;
+    }
+
+    /**
+     * Return the current parser statistics.
+     */
+    public ParserStatistics getCurrentStatistics() {
+        return currentStatistics;
+    }
+
+
+    /**
+     * Initialize the parser.
+     *
+     * @throws InitializationException
+     */
+    public abstract void initialize() throws InitializationException;
+
+    /**
+     * Parse the source data to common format and write it to output adapter.
+     *
+     * @return
+     * @throws InitializationException
+     * @throws AdapterException
+     * @throws ParseException
+     */
+    public abstract List<Document> parse() throws InitializationException, AdapterException, ParseException;
+
+    /**
+     * Build parser from given modules.
+     *
+     * @param adapterIn  the adapter for reading source data.
+     * @param adapterOut the adapter for writing converted data.
+     * @param filter     the filter for source and converted data. May be <b>null<b>.
+     */
+    public ParserBase build(AdapterBase adapterIn, AdapterBase adapterOut, FilterBase filter) {
+        this.adapterIn = adapterIn;
+        this.adapterOut = adapterOut;
+        if (filter != null) {
+            filter.setParser(this);
+        }
+        this.filter = filter;
+        return this;
+    }
+
+
+    /**
+     * Initialize ParserBase.
+     *
+     * @param header - the header of source data.
+     * @throws InitializationException
+     * @throws AdapterException
+     */
+    protected void init(List<String> header) throws InitializationException, AdapterException {
+        columnMeta = new ColumnMeta(columnMapping, header);
+        if (whereCondition != null) {
+            if (columnMeta.getSourceColumnNames() == null) {
+                throw new InitializationException("To use the whereCondition property you must specify and have the header of source data");
+            }
+            condition = new ConditionEvaluate(columnMeta.getSourceColumnNames(), whereCondition);
+        } else {
+            condition = null;
+        }
+        commonFormat = new CommonFormat(columnMeta, decimalSeparator, groupingSeparator);
+
+        if (aggregate != AggregateGranularity.NONE) {
+            aggregator = new DataAggregator(aggregate);
+        }
+
+        if (getAdapterOut().isWriteHeader()) {
+            getAdapterOut().writeHeader(columnMeta.getTargetColumnNames());
+        }
+    }
+
+
+    /**
+     * Return the index of source column by column name.
+     *
+     * @param columnName the name of column.
+     * @throws InitializationException
+     */
+    public int getSourceColumnIndexByName(String columnName) throws InitializationException {
+        return ColumnMeta.getColumnIndexByName(columnName, columnMeta.getSourceColumnNames());
+    }
+
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("adapterIn", (adapterIn == null ? null : adapterIn.getType()))
+                .add("adapterOut", (adapterOut == null ? null : adapterOut.getType()))
+                .add("filter", (filter == null ? null : filter.getType()))
+                .add("columnMapping", columnMapping)
+                .add("whereCondition", whereCondition)
+                .add("aggregate", aggregate)
+                .add("decimalSeparator", decimalSeparator)
+                .add("groupingSeparator", groupingSeparator);
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ParserByLine.java b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ParserByLine.java
new file mode 100644
index 0000000..11f06cf
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ParserByLine.java
@@ -0,0 +1,249 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import com.epam.datalab.core.ModuleBase;
+import com.epam.datalab.core.aggregate.AggregateGranularity;
+import com.epam.datalab.exceptions.AdapterException;
+import com.epam.datalab.exceptions.GenericException;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.exceptions.ParseException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.bson.Document;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Abstract module of parser by the line.<br>
+ * See description of {@link ModuleBase} how to create your own parser.
+ */
+public abstract class ParserByLine extends ParserBase {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParserByLine.class);
+    private static final String ENTRY_NAME = "\nEntry name: ";
+    private static final String SOURCE_LINE = "\nSource line[";
+
+    /**
+     * Parse the header of source data and return it.
+     *
+     * @return the header of source data.
+     * @throws AdapterException
+     * @throws ParseException
+     */
+    public abstract List<String> parseHeader() throws AdapterException, ParseException;
+
+    /**
+     * Parse the row from source line and return result row.
+     *
+     * @param line the source line.
+     * @return the parsed row.
+     * @throws ParseException
+     */
+    public abstract List<String> parseRow(String line) throws ParseException;
+
+    /**
+     * Read the line from adapter and return it.
+     *
+     * @return the parsed row from adapterIn.
+     * @throws AdapterException
+     */
+    @JsonIgnore
+    public String getNextRow() throws AdapterException {
+        String line = getAdapterIn().readLine();
+        if (line == null) {
+            return null;
+        }
+        getCurrentStatistics().incrRowReaded();
+        return line;
+    }
+
+    /**
+     * Initialize ParserBase.
+     *
+     * @throws InitializationException
+     * @throws AdapterException
+     * @throws ParseException
+     */
+    protected boolean init() throws InitializationException, AdapterException, ParseException {
+        getAdapterIn().open();
+        LOGGER.debug("Source data has multy entry {}", getAdapterIn().hasMultyEntry());
+        if (!initEntry()) {
+            return false;
+        }
+        getAdapterOut().open();
+        return true;
+    }
+
+    /**
+     * Initialize for each entry ParserBase.
+     *
+     * @throws InitializationException
+     * @throws AdapterException
+     * @throws ParseException
+     */
+    private boolean initEntry() throws InitializationException, AdapterException, ParseException {
+        if (getAdapterIn().hasMultyEntry() && !getAdapterIn().hasEntryData()) {
+            return false;
+        }
+        addStatistics(getAdapterIn().getEntryName());
+        getCurrentStatistics().start();
+
+        super.init(parseHeader());
+        initialize();
+        if (getFilter() != null) {
+            getFilter().initialize();
+        }
+        return true;
+    }
+
+    /**
+     * Close adapters.
+     *
+     * @throws AdapterException
+     */
+    protected void close(boolean silent) throws AdapterException {
+        AdapterException ex = null;
+        try {
+            getAdapterIn().close();
+        } catch (Exception e) {
+            if (silent) {
+                LOGGER.warn("Cannot close adapterIn. {}", e.getLocalizedMessage(), e);
+            } else {
+                ex = new AdapterException("Cannot close adapterIn. " + e.getLocalizedMessage(), e);
+            }
+        }
+        try {
+            getAdapterOut().close();
+        } catch (Exception e) {
+            if (silent || ex != null) {
+                LOGGER.warn("Cannot close adapterOut. {}", e.getLocalizedMessage(), e);
+            } else {
+                ex = new AdapterException("Cannot close adapterOut. " + e.getLocalizedMessage(), e);
+            }
+        }
+        try {
+            getModuleData().closeMongoConnection();
+        } catch (IOException e) {
+            if (silent || ex != null) {
+                LOGGER.warn("Cannot close mongo connection. {}", e.getLocalizedMessage(), e);
+            } else {
+                ex = new AdapterException("Cannot close mongo connection. " + e.getLocalizedMessage(), e);
+            }
+        }
+        if (!silent && ex != null) {
+            throw ex;
+        }
+    }
+
+    /**
+     * Parse the source data to common format and write it to output adapter.
+     *
+     * @return list of billing data
+     * @throws InitializationException
+     * @throws AdapterException
+     * @throws ParseException
+     */
+    public List<Document> parse() throws InitializationException, AdapterException, ParseException {
+        List<Document> billingData = new ArrayList<>();
+        try {
+            if (init()) {
+                String line;
+                List<String> row;
+                ReportLine reportLine;
+                LOGGER.info("Parsing {}", getAdapterIn().getEntryName());
+
+                while ((line = getNextRow()) != null) {
+                    if (getFilter() != null && (line = getFilter().canParse(line)) == null) {
+                        getCurrentStatistics().incrRowFiltered();
+                        continue;
+                    }
+
+                    row = parseRow(line);
+                    if ((getFilter() != null && (row = getFilter().canTransform(row)) == null)) {
+                        getCurrentStatistics().incrRowFiltered();
+                        continue;
+                    }
+                    try {
+                        if (getCondition() != null && !getCondition().evaluate(row)) {
+                            getCurrentStatistics().incrRowFiltered();
+                            continue;
+                        }
+                    } catch (ParseException e) {
+                        throw new ParseException(e.getLocalizedMessage() + ENTRY_NAME + getCurrentStatistics().getEntryName() +
+                                SOURCE_LINE + getCurrentStatistics().getRowReaded() + "]: " + line, e);
+                    } catch (Exception e) {
+                        throw new ParseException("Cannot evaluate condition " + getWhereCondition() + ". " +
+                                e.getLocalizedMessage() + ENTRY_NAME + getCurrentStatistics().getEntryName() +
+                                SOURCE_LINE + getCurrentStatistics().getRowReaded() + "]: " + line, e);
+                    }
+
+                    try {
+                        reportLine = getCommonFormat().toCommonFormat(row);
+                    } catch (ParseException e) {
+                        throw new ParseException("Cannot cast row to common format. " +
+                                e.getLocalizedMessage() + ENTRY_NAME + getCurrentStatistics().getEntryName() +
+                                SOURCE_LINE + getCurrentStatistics().getRowReaded() + "]: " + line, e);
+                    }
+                    if (getFilter() != null && (reportLine = getFilter().canAccept(reportLine)) == null) {
+                        getCurrentStatistics().incrRowFiltered();
+                        continue;
+                    }
+
+                    getCurrentStatistics().incrRowParsed();
+                    if (getAggregate() != AggregateGranularity.NONE) {
+                        getAggregator().append(reportLine);
+                    } else {
+                        billingData.add(getAdapterOut().writeRow(reportLine));
+                        getCurrentStatistics().incrRowWritten();
+                    }
+                }
+
+                if (getAggregate() != AggregateGranularity.NONE) {
+                    for (int i = 0; i < getAggregator().size(); i++) {
+                        billingData.add(getAdapterOut().writeRow(getAggregator().get(i)));
+                        getCurrentStatistics().incrRowWritten();
+                    }
+                }
+            }
+        } catch (GenericException e) {
+            close(true);
+            if (getCurrentStatistics() != null) {
+                getCurrentStatistics().stop();
+            }
+            throw e;
+        } catch (Exception e) {
+            close(true);
+            if (getCurrentStatistics() != null) {
+                getCurrentStatistics().stop();
+            }
+            throw new ParseException("Unknown parser error. " + e.getLocalizedMessage(), e);
+        }
+
+        close(false);
+        if (getCurrentStatistics() != null) {
+            getCurrentStatistics().stop();
+        }
+        return billingData;
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ParserStatistics.java b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ParserStatistics.java
new file mode 100644
index 0000000..966bbd0
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/core/parser/ParserStatistics.java
@@ -0,0 +1,194 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+/**
+ * Store the statistic of parser processing.
+ */
+public class ParserStatistics {
+    /**
+     * Name of parsed entry.
+     */
+    private final String entryName;
+
+    /**
+     * Time is milliseconds when parser has been started.
+     */
+    private long timeStartInMillis = 0;
+
+    /**
+     * Parsing time in milliseconds.
+     */
+    private long elapsedTimeInMillis = 0;
+
+    /**
+     * Number of rows read.
+     */
+    private long rowReaded;
+
+    /**
+     * Number of rows skipped.
+     */
+    private long rowSkipped;
+
+    /**
+     * Number of rows filtered.
+     */
+    private long rowFiltered;
+
+    /**
+     * Number of rows parsed.
+     */
+    private long rowParsed;
+
+    /**
+     * Number of rows write.
+     */
+    private long rowWritten;
+
+
+    public ParserStatistics(String entryName) {
+        this.entryName = entryName;
+    }
+
+    public void start() {
+        timeStartInMillis = System.currentTimeMillis();
+        elapsedTimeInMillis = 0;
+        rowReaded = 0;
+        rowSkipped = 0;
+        rowFiltered = 0;
+        rowParsed = 0;
+        rowWritten = 0;
+    }
+
+    public void stop() {
+        if (timeStartInMillis != 0) {
+            elapsedTimeInMillis = System.currentTimeMillis() - timeStartInMillis;
+            timeStartInMillis = 0;
+        }
+    }
+
+
+    /**
+     * Return the name of parsed entry.
+     */
+    public String getEntryName() {
+        return entryName;
+    }
+
+    /**
+     * Return the elapsed time in milliseconds of initializing, reading, filtering, parsing and writing operations.
+     */
+    public long getElapsedTime() {
+        return (elapsedTimeInMillis != 0 ?
+                elapsedTimeInMillis :
+                timeStartInMillis == 0 ? 0 : System.currentTimeMillis() - timeStartInMillis);
+    }
+
+    /**
+     * Return the number of rows read.
+     */
+    public long getRowReaded() {
+        return rowReaded;
+    }
+
+    /**
+     * Return the number of rows skipped.
+     */
+    public long getRowSkipped() {
+        return rowSkipped;
+    }
+
+    /**
+     * Return the number of rows filtered.
+     */
+    public long getRowFiltered() {
+        return rowFiltered;
+    }
+
+    /**
+     * Return the number of rows parsed.
+     */
+    public long getRowParsed() {
+        return rowParsed;
+    }
+
+    /**
+     * Return the number of rows write.
+     */
+    public long getRowWritten() {
+        return rowWritten;
+    }
+
+    /**
+     * Increment the number of rows read.
+     */
+    public void incrRowReaded() {
+        rowReaded++;
+    }
+
+    /**
+     * Increment the number of rows skipped.
+     */
+    public void incrRowSkipped() {
+        rowSkipped++;
+    }
+
+    /**
+     * Increment the number of rows filtered.
+     */
+    public void incrRowFiltered() {
+        rowFiltered++;
+    }
+
+    /**
+     * Increment the number of rows parsed.
+     */
+    public void incrRowParsed() {
+        rowParsed++;
+    }
+
+    /**
+     * Increment the number of rows write.
+     */
+    public void incrRowWritten() {
+        rowWritten++;
+    }
+
+
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("entryName", entryName)
+                .add("elapsedTime", getElapsedTime())
+                .add("rowReaded", rowReaded)
+                .add("rowSkipped", rowSkipped)
+                .add("rowFiltered", rowFiltered)
+                .add("rowParsed", rowParsed)
+                .add("rowWritten", rowWritten);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/logging/AppenderBase.java b/services/billing-aws/src/main/java/com/epam/datalab/logging/AppenderBase.java
new file mode 100644
index 0000000..b3f7d97
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/logging/AppenderBase.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.logging;
+
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.OutputStreamAppender;
+import com.epam.datalab.exceptions.InitializationException;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import java.util.TimeZone;
+
+/**
+ * Abstract class provides base configuration for the log appenders.
+ */
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
+public abstract class AppenderBase {
+
+    /**
+     * Log format pattern.
+     */
+    private final String logFormatPattern = "%-5p [%d{ISO8601," + TimeZone.getDefault().getID() + "}] %c: %m%n%rEx";
+
+    /**
+     * Perform configure of appender.
+     *
+     * @param context the context of logger.
+     */
+    public abstract void configure(LoggerContext context) throws InitializationException;
+
+    /**
+     * Perform the base configure of appender.
+     *
+     * @param context      the context of logger.
+     * @param appenderName the name of appender.
+     * @param appender     the class instance of appender.
+     */
+    public void configure(LoggerContext context, String appenderName, OutputStreamAppender<ILoggingEvent> appender) {
+        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
+        encoder.setPattern(logFormatPattern);
+        encoder.setContext(context);
+        encoder.start();
+
+        appender.setContext(context);
+        appender.setName(appenderName);
+        appender.setEncoder(encoder);
+        appender.start();
+
+        Logger logger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
+        logger.addAppender(appender);
+        logger.setAdditive(true);
+    }
+
+    /**
+     * Return the name of type for appender.
+     */
+    @JsonIgnore
+    public String getType() {
+        Class<? extends AppenderBase> clazz = this.getClass();
+        return (clazz.isAnnotationPresent(JsonTypeName.class) ?
+                clazz.getAnnotation(JsonTypeName.class).value() : clazz.getName());
+    }
+
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @param self the object to generate the string for (typically this), used only for its class name.
+     */
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("type", getType());
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .toString();
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/logging/AppenderConsole.java b/services/billing-aws/src/main/java/com/epam/datalab/logging/AppenderConsole.java
new file mode 100644
index 0000000..0987bbf
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/logging/AppenderConsole.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.logging;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.ConsoleAppender;
+import com.epam.datalab.exceptions.InitializationException;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+/**
+ * Console appender for logging.
+ */
+@JsonTypeName("console")
+@JsonClassDescription(
+        "Console log appender.\n" +
+                "Output log data to console. Does not have any properties.\n" +
+                "  - type: console"
+)
+public class AppenderConsole extends AppenderBase {
+
+    @Override
+    public void configure(LoggerContext context) throws InitializationException {
+        super.configure(context, "console-appender", new ConsoleAppender<ILoggingEvent>());
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/logging/AppenderFile.java b/services/billing-aws/src/main/java/com/epam/datalab/logging/AppenderFile.java
new file mode 100644
index 0000000..4ab53ad
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/logging/AppenderFile.java
@@ -0,0 +1,208 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.logging;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.CoreConstants;
+import ch.qos.logback.core.FileAppender;
+import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy;
+import ch.qos.logback.core.rolling.RollingFileAppender;
+import ch.qos.logback.core.rolling.TimeBasedFileNamingAndTriggeringPolicy;
+import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
+import com.epam.datalab.exceptions.InitializationException;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+/**
+ * File appender for logging. Support rolling files and archiving.
+ */
+@JsonTypeName("file")
+@JsonClassDescription(
+        "File log appender.\n" +
+                "Output log data to the file, if property archive is set to true then rolling\n" +
+                "mode is enabled. If archivedLogFilenamePattern ends with .gz or .zip extension\n" +
+                "then old log file will be compressed.\n" +
+                "  - type: file\n" +
+                "    currentLogFilename: <[path/]filename.log>  - pattern for log file naming.\n" +
+                "    [archive: <true | false>]                  - rolling log files or none.\n" +
+                "    [archivedLogFilenamePattern: <[path/]filename-%d{yyyy-MM-dd}.log[.gz | .zip]>]\n" +
+                "                                               - pattern for naming the archive log\n" +
+                "                                                 files.\n" +
+                "    [archivedFileCount: <number_of_days>]      - number of archive log file history."
+)
+public class AppenderFile extends AppenderBase {
+
+    /**
+     * The name of current log file.
+     */
+    @Valid
+    @NotNull
+    @JsonProperty
+    private String currentLogFilename;
+
+    /**
+     * Flag for archive of old files.
+     */
+    @Valid
+    @JsonProperty
+    private boolean archive = false;
+
+    /**
+     * Pattern for naming archive files. The compression mode depending on last
+     * letters of the fileNamePatternStr. Patterns ending with .gz imply GZIP
+     * compression, endings with '.zip' imply ZIP compression. Otherwise and by
+     * default, there is no compression.
+     */
+    @Valid
+    @JsonProperty
+    private String archivedLogFilenamePattern;
+
+    /**
+     * The maximum number of archive files to keep..
+     */
+    @Valid
+    @JsonProperty
+    private int archivedFileCount = CoreConstants.UNBOUND_HISTORY;
+
+
+    /**
+     * Return the name of current log file.
+     */
+    public String getCurrentLogFilename() {
+        return currentLogFilename;
+    }
+
+    /**
+     * Set the name of current log file.
+     */
+    public void setCurrentLogFilename(String currentLogFilename) {
+        this.currentLogFilename = currentLogFilename;
+    }
+
+    /**
+     * Return the flag for archive of old files.
+     */
+    public boolean getArchive() {
+        return archive;
+    }
+
+    /**
+     * Set the flag for archive of old files.
+     */
+    public void setArchive(boolean archive) {
+        this.archive = archive;
+    }
+
+    /**
+     * Return the pattern for naming archive files.
+     */
+    public String getArchivedLogFilenamePattern() {
+        return archivedLogFilenamePattern;
+    }
+
+    /**
+     * Set pattern for naming archive files. The compression mode depending on last
+     * letters of the fileNamePatternStr. Patterns ending with .gz imply GZIP
+     * compression, endings with '.zip' imply ZIP compression. Otherwise and by
+     * default, there is no compression.
+     * For example,
+     * /logs/application-%d{yyyy-MM-dd}.log.gz
+     */
+    public void setArchivedLogFilenamePattern(String archivedLogFilenamePattern) {
+        this.archivedLogFilenamePattern = archivedLogFilenamePattern;
+    }
+
+    /**
+     * Return the maximum number of archive files to keep..
+     */
+    public int getArchivedFileCount() {
+        return archivedFileCount;
+    }
+
+    /**
+     * Set the maximum number of archive files to keep..
+     */
+    public void setArchivedFileCount(int archivedFileCount) {
+        this.archivedFileCount = archivedFileCount;
+    }
+
+
+    @Override
+    public void configure(LoggerContext context) throws InitializationException {
+        if (currentLogFilename == null || currentLogFilename.trim().isEmpty()) {
+            throw new InitializationException("Configuration property logging.appenders.currentLogFilename cannot be null.");
+        }
+        super.configure(context, "file-appender", (archive ? getRollingFileAppender(context) : getFileAppender()));
+    }
+
+    /**
+     * Create and return synchronous the file appender.
+     */
+    private FileAppender<ILoggingEvent> getFileAppender() {
+        FileAppender<ILoggingEvent> appender = new FileAppender<>();
+        appender.setFile(currentLogFilename);
+        appender.setAppend(true);
+        return appender;
+    }
+
+    /**
+     * Create and return synchronous the rolling file appender.
+     *
+     * @param context the context of logger.
+     */
+    private RollingFileAppender<ILoggingEvent> getRollingFileAppender(LoggerContext context) throws InitializationException {
+        if (archivedLogFilenamePattern == null || archivedLogFilenamePattern.trim().isEmpty()) {
+            throw new InitializationException("Configuration property logging.appenders.archivedLogFilenamePattern cannot be null.");
+        }
+        RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<>();
+        appender.setFile(currentLogFilename);
+        appender.setAppend(true);
+
+        TimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent> triggerPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<>();
+        triggerPolicy.setContext(context);
+
+        TimeBasedRollingPolicy<ILoggingEvent> rollPolicy = new TimeBasedRollingPolicy<>();
+        rollPolicy.setContext(context);
+        rollPolicy.setParent(appender);
+        rollPolicy.setFileNamePattern(archivedLogFilenamePattern);
+        rollPolicy.setMaxHistory(archivedFileCount);
+        rollPolicy.setTimeBasedFileNamingAndTriggeringPolicy(triggerPolicy);
+        rollPolicy.start();
+        appender.setRollingPolicy(rollPolicy);
+
+        return appender;
+    }
+
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("currentLogFilename", currentLogFilename)
+                .add("archive", archive)
+                .add("archivedLogFilenamePattern", archivedLogFilenamePattern)
+                .add("archivedFileCount", archivedFileCount);
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/module/AdapterConsole.java b/services/billing-aws/src/main/java/com/epam/datalab/module/AdapterConsole.java
new file mode 100644
index 0000000..bca08b5
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/module/AdapterConsole.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module;
+
+import com.epam.datalab.core.AdapterBase;
+import com.epam.datalab.core.parser.CommonFormat;
+import com.epam.datalab.exceptions.AdapterException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.bson.Document;
+
+import java.util.List;
+
+/**
+ * The adapter for console output.
+ */
+@JsonTypeName(ModuleName.ADAPTER_CONSOLE)
+@JsonClassDescription(
+        "Console adapter.\n" +
+                "Output data to console. Can be used for AdapterOut only.\n" +
+                "  - type: " + ModuleName.ADAPTER_CONSOLE + "\n" +
+                "    [writeHeader: <true | false>]  - write header of data to the adapterOut."
+)
+public class AdapterConsole extends AdapterBase {
+
+    /**
+     * Default constructor for deserialization.
+     */
+    public AdapterConsole() {
+    }
+
+    /**
+     * Instantiate adapter for reading or writing.
+     *
+     * @param mode the mode of adapter.
+     */
+    public AdapterConsole(Mode mode) {
+        super(mode);
+    }
+
+
+    @Override
+    public void open() throws AdapterException {
+        if (getMode() != Mode.WRITE) {
+            throw new AdapterException("Mode of " + getType() + " adapter may be " + Mode.WRITE + " only.");
+        }
+    }
+
+    @Override
+    public void close() throws AdapterException {
+        // Nothing to do
+    }
+
+    @Override
+    public String getEntryName() {
+        return "console";
+    }
+
+    @Override
+    public String readLine() throws AdapterException {
+        throw new AdapterException("Unimplemented method called.");
+    }
+
+    @Override
+    public void writeHeader(List<String> header) {
+        System.out.println(CommonFormat.rowToString(header));
+    }
+
+    @Override
+    public Document writeRow(ReportLine row) {
+        System.out.println(CommonFormat.rowToString(row));
+        return null;
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/module/AdapterFile.java b/services/billing-aws/src/main/java/com/epam/datalab/module/AdapterFile.java
new file mode 100644
index 0000000..02af157
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/module/AdapterFile.java
@@ -0,0 +1,164 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module;
+
+import com.epam.datalab.core.AdapterBase;
+import com.epam.datalab.core.parser.CommonFormat;
+import com.epam.datalab.exceptions.AdapterException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import org.bson.Document;
+
+import javax.validation.constraints.NotNull;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * The adapter for file system.
+ */
+@JsonTypeName(ModuleName.ADAPTER_FILE)
+@JsonClassDescription(
+        "File adapter.\n" +
+                "Read source or write converted data to the file.\n" +
+                "  - type: " + ModuleName.ADAPTER_FILE + "\n" +
+                "    [writeHeader: <true | false>]  - write header of data to the adapterOut.\n" +
+                "    file: <filename>               - the name of file."
+)
+public class AdapterFile extends AdapterBase {
+
+    /**
+     * The name of file.
+     */
+    @NotNull
+    @JsonProperty
+    private String file;
+    /**
+     * Reader for adapter.
+     */
+    @JsonIgnore
+    private BufferedReader reader;
+    /**
+     * Writer for adapter.
+     */
+    @JsonIgnore
+    private BufferedWriter writer;
+
+    /**
+     * Return the name of file.
+     */
+    public String getFile() {
+        return file;
+    }
+
+    /**
+     * Set the name of file.
+     */
+    public void setFile(String file) {
+        this.file = file;
+    }
+
+    @Override
+    public void open() throws AdapterException {
+        try {
+            if (getMode() == Mode.READ) {
+                reader = new BufferedReader(new FileReader(file));
+            } else if (getMode() == Mode.WRITE) {
+                writer = new BufferedWriter(new FileWriter(file));
+            } else {
+                throw new AdapterException("Mode of adapter unknown or not defined. Set mode to " + Mode.READ + " or " + Mode.WRITE + ".");
+            }
+        } catch (Exception e) {
+            throw new AdapterException("Cannot open file " + file + ". " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    @Override
+    public void close() throws AdapterException {
+        if (reader != null) {
+            try {
+                reader.close();
+            } catch (IOException e) {
+                throw new AdapterException("Cannot close file " + file + ". " + e.getLocalizedMessage(), e);
+            } finally {
+                reader = null;
+            }
+        }
+
+        if (writer != null) {
+            try {
+                writer.close();
+            } catch (IOException e) {
+                throw new AdapterException("Cannot close file " + file + ". " + e.getLocalizedMessage(), e);
+            } finally {
+                writer = null;
+            }
+        }
+    }
+
+    @Override
+    public String getEntryName() {
+        return getFile();
+    }
+
+    @Override
+    public String readLine() throws AdapterException {
+        try {
+            return reader.readLine();
+        } catch (IOException e) {
+            throw new AdapterException("Cannot read file " + file + ". " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    @Override
+    public void writeHeader(List<String> header) throws AdapterException {
+        try {
+            writer.write(CommonFormat.rowToString(header));
+            writer.write(System.lineSeparator());
+        } catch (IOException e) {
+            throw new AdapterException("Cannot write file " + file + ". " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    @Override
+    public Document writeRow(ReportLine row) throws AdapterException {
+        try {
+            writer.write(CommonFormat.rowToString(row));
+            writer.write(System.lineSeparator());
+        } catch (IOException e) {
+            throw new AdapterException("Cannot write file " + file + ". " + e.getLocalizedMessage(), e);
+        }
+        return null;
+    }
+
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("file", file);
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/module/ModuleName.java b/services/billing-aws/src/main/java/com/epam/datalab/module/ModuleName.java
new file mode 100644
index 0000000..a72bb06
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/module/ModuleName.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module;
+
+/**
+ * Names of billing tool modules.
+ */
+public class ModuleName {
+    public static final String ADAPTER_CONSOLE = "console";
+    public static final String ADAPTER_AGG_CONSOLE = "aggConsole";
+    public static final String ADAPTER_FILE = "file";
+    public static final String ADAPTER_S3_FILE = "s3file";
+    public static final String ADAPTER_MONGO_DATALAB = "mongodatalab";
+    public static final String PARSER_CSV = "csv";
+    public static final String FILTER_AWS = "aws";
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/module/ParserCsv.java b/services/billing-aws/src/main/java/com/epam/datalab/module/ParserCsv.java
new file mode 100644
index 0000000..7a4bc2b
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/module/ParserCsv.java
@@ -0,0 +1,312 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module;
+
+import com.epam.datalab.core.parser.ParserByLine;
+import com.epam.datalab.exceptions.AdapterException;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.exceptions.ParseException;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Parse CSV format to common CSV format.
+ */
+@JsonTypeName(ModuleName.PARSER_CSV)
+@JsonClassDescription(
+        "CSV parser.\n" +
+                "Parse source CSV format to common billing report.\n" +
+                "  - type: " + ModuleName.PARSER_CSV + "\n" +
+                "    [dataFile: <filename>]           - the file name to store working data of parser.]\n" +
+                "    [columnStartDate: <column_name>] - the name of source column with date of data.]\n" +
+                "    [columnMapping: >-\n" +
+                "                    <targetColumn1=sourceColumnX;targetColumn2=sourceColumnY; ...;\n" +
+                "                     tags=sourceColumnK,...,sourceColumnN>]\n" +
+                "                                  - columns mapping to target from source columns.\n" +
+                "                                    Know target columns: datalab_id, user,\n" +
+                "                                    usage_date, product, usage_type, usage, cost,\n" +
+                "                                    currency_code, resource_id, tags.\n" +
+                "    [whereCondition: >-\n" +
+                "                    <(source_columnX > 0.0 || source_columnY == 'string') &&\n" +
+                "                     source_columnZ != 2016>]\n" +
+                "                                  - where condition for filtering the source data,\n" +
+                "                                    see http://commons.apache.org/proper/commons-jexl/reference/syntax.html#Operators\n" +
+                "                                    for detais.\n" +
+                "    [aggregate: <none | month | day>] - how to aggregate the data.\n" +
+                "    [headerLineNo: <number>]          - the number of header line in source data.\n" +
+                "    [skipLines: <numbber>]            - the number of line which will be skipped\n" +
+                "                                        (include header).\n" +
+                "    [fieldSeparator: <char>]          - char for separate field names and values.\n" +
+                "    [fieldTerminator: <char>]         - char for terminate field names and values.\n" +
+                "    [escapeChar: <char>]              - escape char.\n" +
+                "    [decimalSeparator: <char>]        - char for decimal sign.\n" +
+                "    [groupingSeparator: <char>]       - char for thousands separator.\n"
+)
+public class ParserCsv extends ParserByLine {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ParserCsv.class);
+
+    /**
+     * Character for separate field names and values.
+     */
+    public static final char FIELD_SEPARATOR_DEFAULT = ',';
+
+    /**
+     * Character for termination field names and values.
+     */
+    public static final char FIELD_DELIMITER_DEFAULT = '"';
+
+    /**
+     * Escape character.
+     */
+    public static final char ESCAPE_CHAR_DEFAULT = '\\';
+
+
+    /**
+     * Character for separate field names and values.
+     */
+    @NotNull
+    @JsonProperty
+    private char fieldSeparator = FIELD_SEPARATOR_DEFAULT;
+
+    /**
+     * Character for termination field names and values.
+     */
+    @NotNull
+    @JsonProperty
+    private char fieldTerminator = FIELD_DELIMITER_DEFAULT;
+
+    /**
+     * Escape character.
+     */
+    @NotNull
+    @JsonProperty
+    private char escapeChar = ESCAPE_CHAR_DEFAULT;
+
+    /**
+     * The number of line that contain the header of data.
+     */
+    @JsonProperty
+    private int headerLineNo = 0;
+
+    /**
+     * The number of line which will be skipped (include header).
+     */
+    @JsonProperty
+    private int skipLines = 0;
+
+
+    /**
+     * Return the character for separate field names and values.
+     */
+    public char getFieldSeparator() {
+        return fieldSeparator;
+    }
+
+    /**
+     * Set the character for separate field names and values.
+     */
+    public void setFieldSeparator(char fieldSeparator) {
+        this.fieldSeparator = fieldSeparator;
+    }
+
+    /**
+     * Return the character for termination field names and values.
+     */
+    public char getFieldTerminator() {
+        return fieldTerminator;
+    }
+
+    /**
+     * Set the character for termination field names and values.
+     */
+    public void setFieldTerminator(char fieldTerminator) {
+        this.fieldTerminator = fieldTerminator;
+    }
+
+    /**
+     * Return the escape character.
+     */
+    public char getEscapeChar() {
+        return escapeChar;
+    }
+
+    /**
+     * Set the escape character.
+     */
+    public void setEscapeChar(char escapeChar) {
+        this.escapeChar = escapeChar;
+    }
+
+    /**
+     * Return the number of line that contain the header of data.
+     */
+    public int getHeaderLineNo() {
+        return headerLineNo;
+    }
+
+    /**
+     * Set the number of line that contain the header of data.
+     */
+    public void setHeaderLineNo(int headerLineNo) {
+        this.headerLineNo = headerLineNo;
+    }
+
+    /**
+     * Return the number of line which will be skipped (include header).
+     */
+    public int getSkipLines() {
+        return skipLines;
+    }
+
+    /**
+     * Set the number of line which will be skipped (include header).
+     */
+    public void setSkipLines(int skipLines) {
+        this.skipLines = skipLines;
+    }
+
+
+    @Override
+    public void initialize() throws InitializationException {
+    }
+
+    @Override
+    public List<String> parseHeader() throws AdapterException, ParseException {
+        String line = null;
+        List<String> header = null;
+
+        if (headerLineNo > 0) {
+            while (getCurrentStatistics().getRowReaded() < headerLineNo) {
+                if ((line = getNextRow()) == null) {
+                    return null;
+                }
+                getCurrentStatistics().incrRowSkipped();
+            }
+            header = parseRow(line);
+        }
+
+        while (getCurrentStatistics().getRowReaded() < skipLines) {
+            if (getNextRow() == null) {
+                break;
+            }
+            getCurrentStatistics().incrRowSkipped();
+        }
+
+        return header;
+    }
+
+
+    /**
+     * Construct the exception.
+     *
+     * @param message    the error message.
+     * @param pos        the position in the parsed line.
+     * @param sourceLine the parsed line.
+     * @return ParseException
+     */
+    private ParseException getParseException(String message, int pos, String sourceLine) {
+        String s = String.format("%s at pos %d in line: ", message, pos);
+        LOGGER.error(s + sourceLine);
+        LOGGER.error(StringUtils.repeat(' ', s.length() + pos - 1) + '^');
+        return new ParseException(s + sourceLine);
+    }
+
+    @Override
+    public List<String> parseRow(String line) throws ParseException {
+        int realPos = 0;
+        int pos = 0;
+        boolean isDelimiter = false;
+        StringBuilder sb = new StringBuilder(line);
+        List<String> row = new ArrayList<>();
+
+        while (pos < sb.length()) {
+            char c = sb.charAt(pos);
+            if (c == escapeChar) {
+                realPos++;
+                pos++;
+                if (pos == sb.length()) {
+                    throw getParseException("Invalid escape char", realPos, line);
+                }
+                sb.delete(pos - 1, pos);
+                realPos++;
+            } else if (c == fieldTerminator) {
+                realPos++;
+                if (isDelimiter) {
+                    realPos++;
+                    pos++;
+                    if (pos == sb.length()) {
+                        sb.delete(pos - 1, pos);
+                        break;
+                    }
+                    if (sb.charAt(pos) == fieldSeparator) {
+                        row.add(sb.substring(0, pos - 1));
+                        sb.delete(0, pos + 1);
+                        pos = 0;
+                        isDelimiter = false;
+                        continue;
+                    }
+                    throw getParseException("Invalid field delimiter", realPos, line);
+                }
+
+                if (pos != 0) {
+                    throw getParseException("Unterminated field", realPos, line);
+                }
+                sb.delete(0, 1);
+                isDelimiter = true;
+                continue;
+            } else if (c == fieldSeparator) {
+                realPos++;
+                if (isDelimiter) {
+                    pos++;
+                    continue;
+                }
+                row.add(sb.substring(0, pos));
+                sb.delete(0, pos + 1);
+                pos = 0;
+            } else {
+                realPos++;
+                pos++;
+            }
+        }
+        row.add(sb.toString());
+
+        return row;
+    }
+
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("fieldSeparator", fieldSeparator)
+                .add("fieldTerminator", fieldTerminator)
+                .add("escapeChar", escapeChar)
+                .add("headerLineNo", headerLineNo)
+                .add("skipLines", skipLines);
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/module/aws/AdapterS3File.java b/services/billing-aws/src/main/java/com/epam/datalab/module/aws/AdapterS3File.java
new file mode 100644
index 0000000..5bd7680
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/module/aws/AdapterS3File.java
@@ -0,0 +1,388 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module.aws;
+
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.services.s3.AmazonS3;
+import com.amazonaws.services.s3.AmazonS3Client;
+import com.amazonaws.services.s3.model.GetObjectRequest;
+import com.amazonaws.services.s3.model.S3Object;
+import com.epam.datalab.core.AdapterBase;
+import com.epam.datalab.exceptions.AdapterException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.epam.datalab.module.ModuleName;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import org.bson.Document;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.validation.constraints.NotNull;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * The adapter for S3 file system of Amazon.
+ */
+@JsonTypeName(ModuleName.ADAPTER_S3_FILE)
+@JsonClassDescription(
+        "Amazon S3 file system adapter.\n" +
+                "Read source or write converted data to the file in Amazon S3 bucket.\n" +
+                "  - type: " + ModuleName.ADAPTER_S3_FILE + "\n" +
+                "    [writeHeader: <true | false>]   - write header of data to the adapterOut.\n" +
+                "    bucket: <bucketname>            - the name of S3 bucket.\n" +
+                "    path: <path>                    - the path to the report or empty if used the root folder.\n" +
+                "    accountId: <AWS account number> - the account number, see for details\n" +
+                "                                      \"Detailed billing report with resources and tags\"\n" +
+                "                                      http://docs.aws.amazon" +
+                ".com/awsaccountbilling/latest/aboutv2/billing-reports.html#detailed-report-with-resources-tags\n" +
+                "    [accessKeyId: <string>]         - Amazon access key ID.\n" +
+                "    [secretAccessKey: <string>]     - Amazon secret access key."
+)
+public class AdapterS3File extends AdapterBase {
+    /**
+     * Name of key for the last loaded file.
+     */
+    public static final String DATA_KEY_LAST_LOADED_FILE = "AdapterS3File_lastLoadedFile";
+    /**
+     * Name of key for the modification date of loaded file.
+     */
+    public static final String DATA_KEY_LAST_MODIFICATION_DATE = "AdapterS3File_lastModifyDate";
+    private static final Logger LOGGER = LoggerFactory.getLogger(AdapterS3File.class);
+    private static final String CANNOT_READ_FILE_FORMAT = "Cannot read file %s. %s";
+    private static final String DELIMITER = "/";
+
+    /**
+     * The name of bucket.
+     */
+    @NotNull
+    @JsonProperty
+    private String bucket;
+
+    /**
+     * The path to report.
+     */
+    @JsonProperty
+    private String path;
+
+    /**
+     * AWS account number.
+     */
+    @NotNull
+    @JsonProperty
+    private String accountId;
+
+    /**
+     * Access key ID for Amazon Web Services.
+     */
+    @JsonProperty
+    private String accessKeyId;
+
+    /**
+     * Secret key for Amazon Web Services.
+     */
+    @JsonProperty
+    private String secretAccessKey;
+
+    @JsonProperty
+    private boolean awsJobEnabled;
+    /**
+     * List of report files for loading.
+     */
+    @JsonIgnore
+    private List<String> filelist = null;
+    /**
+     * Index of current report file.
+     */
+    @JsonIgnore
+    private int currentFileIndex = -1;
+    /**
+     * Index of current report file.
+     */
+    @JsonIgnore
+    private String entryName = null;
+    /**
+     * Amazon S3 client.
+     */
+    @JsonIgnore
+    private AmazonS3 clientS3 = null;
+    /**
+     * Amazon S3 client.
+     */
+    @JsonIgnore
+    private Date lastModificationDate = null;
+    /**
+     * File input stream.
+     */
+    @JsonIgnore
+    private InputStream fileInputStream = null;
+    /**
+     * Reader for adapter.
+     */
+    @JsonIgnore
+    private BufferedReader reader = null;
+
+    /**
+     * Return the name of bucket.
+     */
+    public String getBucket() {
+        return bucket;
+    }
+
+    /**
+     * Set the name of bucket.
+     */
+    public void setBucket(String bucket) {
+        this.bucket = bucket;
+    }
+
+    /**
+     * Return the path to report.
+     */
+    public String getPath() {
+        return path;
+    }
+
+    /**
+     * Set the path to report.
+     */
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    /**
+     * Return the AWS account number.
+     */
+    public String getAccountId() {
+        return accountId;
+    }
+
+    /**
+     * Set the AWS account number.
+     */
+    public void setAccountId(String accountId) {
+        this.accountId = accountId;
+    }
+
+    /**
+     * Return the access key ID for Amazon Web Services.
+     */
+    public String getAccessKeyId() {
+        return this.accessKeyId;
+    }
+
+    /**
+     * Set the access key ID for Amazon Web Services.
+     */
+    public void setAccessKeyId(String accessKeyId) {
+        this.accessKeyId = accessKeyId;
+    }
+
+    /**
+     * Return the secret key for Amazon Web Services.
+     */
+    public String getSecretAccessKey() {
+        return this.secretAccessKey;
+    }
+
+    /**
+     * Set the secret key for Amazon Web Services.
+     */
+    public void setSecretAccessKey(String secretAccessKey) {
+        this.secretAccessKey = secretAccessKey;
+    }
+
+    @Override
+    public void open() throws AdapterException {
+        LOGGER.debug("Adapter S3 will be opened for {}", getMode());
+        if (getMode() == Mode.READ) {
+            setLastModificationDate();
+            clientS3 = getAmazonClient();
+            S3FileList s3files = new S3FileList(awsJobEnabled, bucket, getModuleData());
+            filelist = s3files.getFiles(clientS3);
+            currentFileIndex = (filelist.isEmpty() ? -1 : 0);
+            fileInputStream = null;
+            reader = null;
+            entryName = null;
+            openNextEntry();
+            LOGGER.debug("Adapter S3 has been opened");
+        } else if (getMode() == Mode.WRITE) {
+            throw new AdapterException("Unsupported mode " + Mode.WRITE + ".");
+        } else {
+            throw new AdapterException("Mode of adapter unknown or not defined. Set mode to " + Mode.READ + ".");
+        }
+    }
+
+    @Override
+    public boolean hasMultyEntry() {
+        return true;
+    }
+
+    @Override
+    public boolean openNextEntry() throws AdapterException {
+        String filename = getCurrentFileName();
+        if (filename == null) {
+            if (filelist.isEmpty()) {
+                final String reportPath = path == null ? bucket : bucket + DELIMITER + path;
+                LOGGER.debug("New report files in bucket folder {} not found", reportPath);
+            }
+            return false;
+        }
+        entryName = filename;
+        LOGGER.debug("Open a next entry in file {}", filename);
+        reader = new BufferedReader(new InputStreamReader(getFileStream()));
+        try {
+            getModuleData().setId(filename);
+            getModuleData().setModificationDate(lastModificationDate);
+            getModuleData().set(DATA_KEY_LAST_LOADED_FILE, filename);
+            getModuleData().set(DATA_KEY_LAST_MODIFICATION_DATE, lastModificationDate);
+            getModuleData().store();
+        } catch (Exception e) {
+            throw new AdapterException(e.getLocalizedMessage(), e);
+        }
+        currentFileIndex++;
+        return false;
+    }
+
+    @Override
+    public boolean hasEntryData() {
+        return (reader != null);
+    }
+
+    @Override
+    public void close() throws AdapterException {
+        closeFile(getCurrentFileName());
+    }
+
+    @Override
+    public String getEntryName() {
+        return entryName;
+    }
+
+    @Override
+    public String readLine() throws AdapterException {
+        try {
+            return reader.readLine();
+        } catch (IOException e) {
+            throw new AdapterException(String.format(CANNOT_READ_FILE_FORMAT, getCurrentFileName(), e
+                    .getLocalizedMessage()), e);
+        }
+    }
+
+    @Override
+    public void writeHeader(List<String> header) throws AdapterException {
+        throw new AdapterException("Unimplemented method.");
+    }
+
+    @Override
+    public Document writeRow(ReportLine row) throws AdapterException {
+        throw new AdapterException("Unimplemented method.");
+    }
+
+    /**
+     * Return the current file name.
+     */
+    public String getCurrentFileName() {
+        return (filelist == null || currentFileIndex < 0 || currentFileIndex >= filelist.size() ? null : filelist.get
+                (currentFileIndex));
+    }
+
+    /**
+     * Creates and returns the Amazon client, as well as checks bucket existence.
+     *
+     * @throws AdapterException
+     */
+    private AmazonS3 getAmazonClient() throws AdapterException {
+        AmazonS3 s3 = (accessKeyId == null ?
+                new AmazonS3Client() :
+                new AmazonS3Client(new BasicAWSCredentials(accessKeyId, secretAccessKey)));
+
+        if (!s3.doesBucketExist(bucket)) {
+            throw new AdapterException("Bucket \"" + bucket + "\" does not exist.");
+        }
+
+        return s3;
+    }
+
+    /**
+     * Open the source file and return reader.
+     *
+     * @throws AdapterException
+     */
+    private InputStream getFileStream() throws AdapterException {
+        try {
+            GetObjectRequest request = new GetObjectRequest(bucket, getCurrentFileName());
+            S3Object object = clientS3.getObject(request);
+            lastModificationDate = object.getObjectMetadata().getLastModified();
+            return object.getObjectContent();
+        } catch (Exception e) {
+            throw new AdapterException("Cannot open file " + bucket + DELIMITER + getCurrentFileName() + ". " + e
+                    .getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Return the modification date of loaded file.
+     *
+     * @throws AdapterException
+     */
+    private void setLastModificationDate() throws AdapterException {
+        try {
+            lastModificationDate = getModuleData().getDate(DATA_KEY_LAST_MODIFICATION_DATE);
+        } catch (Exception e) {
+            throw new AdapterException("Cannot get the last modification date for report. " + e.getLocalizedMessage(),
+                    e);
+        }
+    }
+
+    /**
+     * Close a zip file.
+     *
+     * @param filename file name.
+     * @throws AdapterException
+     */
+    private void closeFile(String filename) throws AdapterException {
+        if (fileInputStream != null) {
+            try {
+                fileInputStream.close();
+            } catch (IOException e) {
+                throw new AdapterException("Cannot close file " + filename + ". " + e.getLocalizedMessage(), e);
+            }
+            fileInputStream = null;
+        }
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("bucket", bucket)
+                .add("path", path)
+                .add("accountId", accountId)
+                .add("accessKeyId", "***")
+                .add("secretAccessKey", "***");
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/module/aws/FilterAWS.java b/services/billing-aws/src/main/java/com/epam/datalab/module/aws/FilterAWS.java
new file mode 100644
index 0000000..71154b5
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/module/aws/FilterAWS.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module.aws;
+
+import com.epam.datalab.core.FilterBase;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.epam.datalab.module.ModuleName;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * Filter and transform the line of AWS detailed billing reports.
+ */
+@JsonTypeName(ModuleName.FILTER_AWS)
+@JsonClassDescription(
+        "Amazon Web Services detailed billing reports filter.\n" +
+                "Filter report data and select line item only. Set column projectCode and\n" +
+                "currencyCode to user values.\n" +
+                "  - type: " + ModuleName.FILTER_AWS + "\n" +
+                "    [currencyCode: <string>]    - user value for currencyCode column.\n" +
+                "    [columnDatalabTag: <string>]   - name of column tag of DataLab resource id.\n" +
+                "    [serviceBaseName: <string>] - DataLab's service base name."
+
+)
+public class FilterAWS extends FilterBase {
+
+    /**
+     * The code of currency.
+     */
+    @NotNull
+    @JsonProperty
+    private String currencyCode;
+
+    /**
+     * Name of report column tag of DataLab.
+     */
+    @NotNull
+    @JsonProperty
+    private String columnDatalabTag;
+
+    /**
+     * DataLab service base name.
+     */
+    @NotNull
+    @JsonProperty
+    private String serviceBaseName;
+    private int datalabIdIndex = -1;
+    private String datalabPrefix;
+
+    /**
+     * Return the code of currency for billing.
+     */
+    public String getCurrencyCode() {
+        return currencyCode;
+    }
+
+    /**
+     * Set the code of currency for billing.
+     */
+    public void setCurrencyCode(String currencyCode) {
+        this.currencyCode = currencyCode;
+    }
+
+    /**
+     * Return the name of report column tag of DataLab.
+     */
+    public String getColumnDatalabTag() {
+        return columnDatalabTag;
+    }
+
+    /**
+     * Set the name of report column tag of DataLab.
+     */
+    public void setDatalabTagName(String columnDatalabTag) {
+        this.columnDatalabTag = columnDatalabTag;
+    }
+
+    /**
+     * Return service base name.
+     */
+    public String getServiceBaseName() {
+        return serviceBaseName;
+    }
+
+    /**
+     * Set service base name.
+     */
+    public void setServiceBaseName(String serviceBaseName) {
+        this.serviceBaseName = serviceBaseName;
+    }
+
+    @Override
+    public void initialize() throws InitializationException {
+        datalabIdIndex = (getColumnDatalabTag() == null ? -1 :
+                getParser().getSourceColumnIndexByName(getColumnDatalabTag()));
+        datalabPrefix = getServiceBaseName() + ":";
+    }
+
+    @Override
+    public String canParse(String line) {
+        return line;
+    }
+
+    @Override
+    public List<String> canTransform(List<String> row) {
+        if (datalabIdIndex != -1 &&
+                (row.size() <= datalabIdIndex ||
+                        !row.get(datalabIdIndex).startsWith(datalabPrefix))) {
+            return null;
+        }
+        return row;
+    }
+
+    @Override
+    public ReportLine canAccept(ReportLine row) {
+        row.setCurrencyCode(currencyCode);
+        return row;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("currencyCode", currencyCode)
+                .add("columnDatalabTag", columnDatalabTag)
+                .add("serviceBaseName", serviceBaseName);
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/module/aws/S3FileList.java b/services/billing-aws/src/main/java/com/epam/datalab/module/aws/S3FileList.java
new file mode 100644
index 0000000..719aad8
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/module/aws/S3FileList.java
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module.aws;
+
+import com.amazonaws.services.s3.AmazonS3;
+import com.amazonaws.services.s3.model.ListObjectsV2Request;
+import com.amazonaws.services.s3.model.ListObjectsV2Result;
+import com.amazonaws.services.s3.model.S3ObjectSummary;
+import com.epam.datalab.core.ModuleData;
+import com.epam.datalab.exceptions.AdapterException;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static java.util.stream.Collectors.mapping;
+import static java.util.stream.Collectors.toList;
+
+/**
+ * Create a file listing of reports from AWS bucket.
+ * See details in
+ * <a href="http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-reports.html#detailed-report-with-resources-tags">
+ * Detailed billing report with resources and tags</a>.
+ */
+public class S3FileList {
+
+    /**
+     * Report suffix without date.
+     */
+    private static final String REPORT_SUFIX = ".csv";
+    /**
+     * Date regex for YYYYMMDD
+     */
+    private static final String DATE_REGEX = "\\d{4}(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])";
+    private static final String REGEX = String.format("(^.*/.*/%s-%s)/.*/*.\\%s", DATE_REGEX, DATE_REGEX,
+            REPORT_SUFIX);
+
+    /**
+     * Bucket name.
+     */
+    private final String bucket;
+
+    /**
+     * Name of last file which is loaded or <b>null</b> for loading all files in bucket folder.
+     */
+    private final ModuleData moduleData;
+    private final Pattern reportPattern;
+    private final boolean awsJobEnabled;
+
+
+    /**
+     * Instantiate file find class.
+     *
+     * @param awsJobEnabled
+     * @param bucket        the name of bucket.
+     * @param moduleData    data for working module
+     */
+    public S3FileList(boolean awsJobEnabled, String bucket, ModuleData moduleData) {
+        this.bucket = bucket;
+        this.moduleData = moduleData;
+        this.awsJobEnabled = awsJobEnabled;
+        this.reportPattern = this.awsJobEnabled ? Pattern.compile(REGEX) : Pattern.compile(".*" + REPORT_SUFIX + "$");
+    }
+
+    /**
+     * Return the list of files for new reports.
+     *
+     * @param s3Client the S3 client.
+     * @return the list of files.
+     * @throws AdapterException
+     */
+    public List<String> getFiles(AmazonS3 s3Client) throws AdapterException {
+        final List<S3ObjectSummary> objectSummaries = reportFilesInBillingBucket(s3Client);
+        return awsJobEnabled ? lastFilesPerBillingPeriod(objectSummaries) :
+                objectSummaries.stream().map(S3ObjectSummary::getKey).sorted().collect(toList());
+    }
+
+    private List<S3ObjectSummary> reportFilesInBillingBucket(AmazonS3 s3Client) throws AdapterException {
+        ListObjectsV2Request request = new ListObjectsV2Request()
+                .withBucketName(bucket);
+        ListObjectsV2Result result;
+        List<S3ObjectSummary> objectSummaries = new ArrayList<>();
+        try {
+            do {
+                result = s3Client.listObjectsV2(request);
+                objectSummaries.addAll(notProcessedFiles(result));
+            } while (result.isTruncated());
+        } catch (Exception e) {
+            throw new AdapterException("Cannot get the file listing of bucket \"" + bucket + "*\". " +
+                    e.getLocalizedMessage(), e);
+        }
+        return objectSummaries;
+    }
+
+    private List<S3ObjectSummary> notProcessedFiles(ListObjectsV2Result result) {
+        return result.getObjectSummaries()
+                .stream()
+                .filter(this::matchBillingRegexAndWasNotProcessed)
+                .collect(toList());
+    }
+
+    private boolean matchBillingRegexAndWasNotProcessed(S3ObjectSummary o) {
+        return reportPattern.matcher(o.getKey()).matches()
+                && !moduleData.wasProcessed(o.getKey(), o.getLastModified(),
+                extractDatePrefix(reportPattern, o));
+    }
+
+    /**
+     * Returns list of files that per billing period
+     * For particular billing period file with the biggest modification date will be returned
+     *
+     * @param objectSummaries amazon s3 objects
+     * @return list of file names
+     */
+    protected List<String> lastFilesPerBillingPeriod(List<S3ObjectSummary> objectSummaries) {
+        final Map<String, List<S3ObjectSummary>> months = objectSummaries.stream()
+                .collect(Collectors.groupingBy(o -> extractDatePrefix(reportPattern, o), mapping(o -> o, toList())));
+
+        return months.entrySet()
+                .stream()
+                .flatMap(this::lastFileForBillingPeriod)
+                .sorted()
+                .collect(Collectors.toList());
+    }
+
+    private Stream<? extends String> lastFileForBillingPeriod(Map.Entry<String, List<S3ObjectSummary>> entry) {
+        final List<S3ObjectSummary> assemblyIds = entry.getValue();
+        final S3ObjectSummary lastBillingFile = assemblyIds.stream()
+                .max(Comparator.comparing(S3ObjectSummary::getLastModified))
+                .orElseThrow(() -> new IllegalStateException("AssemblyId does not contains any file"));
+        return assemblyIds.stream()
+                .filter(s -> s.getKey().startsWith(StringUtils.substringBeforeLast(lastBillingFile.getKey(), "/")))
+                .map(S3ObjectSummary::getKey);
+    }
+
+    private String extractDatePrefix(Pattern pattern, S3ObjectSummary o) {
+        final String key = o.getKey();
+        final Matcher matcher = pattern.matcher(key);
+        if (matcher.find() && awsJobEnabled) {
+            return matcher.group(1);
+        } else {
+            return key;
+        }
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/mongo/AdapterMongoDb.java b/services/billing-aws/src/main/java/com/epam/datalab/mongo/AdapterMongoDb.java
new file mode 100644
index 0000000..38c5890
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/mongo/AdapterMongoDb.java
@@ -0,0 +1,229 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.mongo;
+
+import com.epam.datalab.core.DBAdapterBase;
+import com.epam.datalab.core.aggregate.UsageDataList;
+import com.epam.datalab.exceptions.AdapterException;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.exceptions.ParseException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.epam.datalab.module.ModuleName;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.model.UpdateOptions;
+import org.bson.Document;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.epam.datalab.mongo.MongoConstants.COLLECTION_SETTINGS;
+import static com.epam.datalab.mongo.MongoConstants.FIELD_SERIVICE_BASE_NAME;
+import static com.mongodb.client.model.Filters.eq;
+
+/**
+ * The adapter for file system.
+ */
+@JsonTypeName(ModuleName.ADAPTER_MONGO_DATALAB)
+@JsonClassDescription(
+        "Mongo DB adapter.\n" +
+                "Write converted data to the Mongo database. Can be used for AdapterOut only.\n" +
+                "  - type: " + ModuleName.ADAPTER_MONGO_DATALAB + "\n" +
+                "    host: <host>             - the host name or IP address.\n" +
+                "    port: <port>             - the port number.\n" +
+                "    database: <database>     - the name of database.\n" +
+                "    username: <username>     - the name of user.\n" +
+                "    password: <password>     - the password of user.\n" +
+                "    [bufferSize: <number>]   - the size of buffer, default is 10000 records.\n" +
+                "    [upsert: <false | true>] - if true then upsert is enabled."
+)
+public class AdapterMongoDb extends DBAdapterBase {
+
+    /**
+     * The size of buffer for bulk insert. Not applicable for upsert mode.
+     */
+    @JsonProperty
+    private int bufferSize = 10000;
+
+    /**
+     * The upsert mode if set to <b>true</b>.
+     */
+    @JsonProperty
+    private boolean upsert = false;
+
+    @JsonProperty
+    private String serviceBaseName;
+    /**
+     * Custom connection to Mongo database.
+     */
+    private MongoDbConnection connection;
+    /**
+     * Mongo collection.
+     */
+    private MongoCollection<Document> collection;
+    /**
+     * DAO of DataLab's resource type.
+     */
+    private DatalabResourceTypeDAO resourceTypeDAO;
+    /**
+     * Buffer for insert operations.
+     */
+    private List<Document> buffer;
+    /**
+     * List of dates for delete from MongoDB.
+     */
+    private UsageDataList usageDateList;
+
+    public String getServiceBaseName() {
+        return serviceBaseName;
+    }
+
+    public void setServiceBaseName(String serviceBaseName) {
+        this.serviceBaseName = serviceBaseName;
+    }
+
+    /**
+     * Return the size of buffer for bulk insert.
+     */
+    public int getBufferSize() {
+        return bufferSize;
+    }
+
+    /**
+     * Set the size of buffer for bulk insert.
+     *
+     * @throws InitializationException
+     */
+    public void setBufferSize(int bufferSize) throws InitializationException {
+        if (upsert && bufferSize <= 0) {
+            throw new InitializationException("The bufferSize must be greater than zero when upsert mode is switched" +
+                    " " +
+                    "on");
+        }
+        this.bufferSize = bufferSize;
+    }
+
+    /**
+     * Return the <b>true</b> if upsert mode switched on.
+     */
+    public boolean isUpsert() {
+        return upsert;
+    }
+
+    /**
+     * Set the upsert mode.
+     *
+     * @throws InitializationException
+     */
+    public void setUpsert(boolean upsert) throws InitializationException {
+        if (upsert && bufferSize <= 0) {
+            throw new InitializationException("Upsert mode cannot be enabled if the bufferSize is zero or less than " +
+                    "zero");
+        }
+        this.upsert = upsert;
+    }
+
+    @Override
+    public void open() throws AdapterException {
+        if (connection == null) {
+            if (getMode() != Mode.WRITE) {
+                throw new AdapterException("Mode of " + getType() + " adapter may be " + Mode.WRITE + " only.");
+            }
+            connection = new MongoDbConnection(getHost(), getPort(), getDatabase(), getUsername(), getPassword());
+            setServiceBaseName();
+            collection = connection.getCollection(MongoConstants.COLLECTION_BILLING);
+            try {
+                resourceTypeDAO = new DatalabResourceTypeDAO(connection);
+            } catch (InitializationException e) {
+                throw new AdapterException("Cannot initialize billing transformer to DataLab format. " + e.getLocalizedMessage(), e);
+            }
+
+            connection.createBillingIndexes();
+            usageDateList = new UsageDataList();
+            buffer = (upsert || bufferSize > 0 ? new ArrayList<>(bufferSize) : null);
+        } else {
+            throw new AdapterException("Connection is already opened");
+        }
+    }
+
+    private void setServiceBaseName() {
+        connection.getCollection(COLLECTION_SETTINGS)
+                .updateOne(eq("_id", FIELD_SERIVICE_BASE_NAME), new Document("$set", new Document("value", serviceBaseName)),
+                        new UpdateOptions().upsert(true));
+    }
+
+    @Override
+    public void close() throws AdapterException {
+        if (connection != null) {
+            if (upsert) {
+                connection.upsertRows(collection, buffer, usageDateList);
+            } else if (bufferSize > 0) {
+                connection.insertRows(collection, buffer);
+            }
+            buffer = null;
+
+            try {
+                connection.close();
+            } catch (Exception e) {
+                throw new AdapterException("Cannot close connection to database " +
+                        getDatabase() + ". " + e.getLocalizedMessage(), e);
+            } finally {
+                connection = null;
+            }
+        }
+    }
+
+    @Override
+    public String getEntryName() {
+        return MongoConstants.COLLECTION_BILLING;
+    }
+
+    @Override
+    public String readLine() throws AdapterException {
+        throw new AdapterException("Unimplemented method called.");
+    }
+
+    @Override
+    public void writeHeader(List<String> header) {
+        // Nothing to do
+    }
+
+    @Override
+    public Document writeRow(ReportLine row) throws AdapterException {
+        Document document;
+        try {
+            document = resourceTypeDAO.transform(row);
+        } catch (ParseException e) {
+            throw new AdapterException("Cannot transform report line. " + e.getLocalizedMessage(), e);
+        }
+
+        return document;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("bufferSize", bufferSize)
+                .add("upsert", upsert);
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/mongo/DatalabResourceTypeDAO.java b/services/billing-aws/src/main/java/com/epam/datalab/mongo/DatalabResourceTypeDAO.java
new file mode 100644
index 0000000..e407804
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/mongo/DatalabResourceTypeDAO.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.mongo;
+
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.exceptions.ParseException;
+import com.epam.datalab.model.aws.ReportLine;
+import org.bson.Document;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static com.mongodb.client.model.Filters.eq;
+import static org.apache.commons.lang3.StringUtils.EMPTY;
+
+/**
+ * Provides Mongo DAO for billing resources in DataLab.
+ */
+public class DatalabResourceTypeDAO implements MongoConstants {
+    private static final Logger LOGGER = LoggerFactory.getLogger(DatalabResourceTypeDAO.class);
+
+    /**
+     * Mongo database connection.
+     */
+    private final MongoDbConnection connection;
+
+    /**
+     * Service base name.
+     */
+    private String serviceBaseName;
+    private String serviceBaseNameId;
+
+    /**
+     * Instantiate DAO for billing resources.
+     *
+     * @param connection the connection to Mongo DB.
+     * @throws InitializationException
+     */
+    public DatalabResourceTypeDAO(MongoDbConnection connection) throws InitializationException {
+        this.connection = connection;
+        setServiceBaseName();
+    }
+
+    /**
+     * Returns the base name of service.
+     */
+    public String getServiceBaseName() {
+        return serviceBaseName;
+    }
+
+    /**
+     * Set the base name of service.
+     *
+     * @throws InitializationException
+     */
+    private void setServiceBaseName() throws InitializationException {
+        Document d = connection.getCollection(COLLECTION_SETTINGS)
+                .find(eq(FIELD_ID, FIELD_SERIVICE_BASE_NAME))
+                .first();
+        if (d == null) {
+            throw new InitializationException("Service base name property " + COLLECTION_SETTINGS +
+                    "." + FIELD_SERIVICE_BASE_NAME + " in Mongo DB not found");
+        }
+        String value = d.getOrDefault("value", EMPTY).toString();
+        if (d.isEmpty()) {
+            throw new InitializationException("Service base name property " + COLLECTION_SETTINGS +
+                    "." + FIELD_SERIVICE_BASE_NAME + " in Mongo DB is empty");
+        }
+        serviceBaseName = value;
+        serviceBaseNameId = value + ":";
+        LOGGER.debug("serviceBaseName is {}", serviceBaseName);
+    }
+
+    /**
+     * Convert and return the report line of billing to Mongo document.
+     *
+     * @param row report line.
+     * @return Mongo document.
+     * @throws ParseException
+     */
+    public Document transform(ReportLine row) throws ParseException {
+        String resourceId = row.getDatalabId();
+        if (resourceId == null || !resourceId.startsWith(serviceBaseNameId)) {
+            throw new ParseException("DatalabId is not match: expected start with " + serviceBaseNameId + ", actual " +
+                    resourceId);
+        }
+        resourceId = resourceId.substring(serviceBaseNameId.length());
+        Document d = new Document(ReportLine.FIELD_DATALAB_ID, resourceId);
+        return d.append(ReportLine.FIELD_USAGE_DATE, row.getUsageDate())
+                .append(ReportLine.FIELD_PRODUCT, row.getProduct())
+                .append(ReportLine.FIELD_USAGE_TYPE, row.getUsageType())
+                .append(ReportLine.FIELD_USAGE, row.getUsage())
+                .append(ReportLine.FIELD_COST, row.getCost())
+                .append(ReportLine.FIELD_CURRENCY_CODE, row.getCurrencyCode())
+                .append(ReportLine.FIELD_RESOURCE_TYPE, row.getResourceType().category())
+                .append(ReportLine.FIELD_RESOURCE_ID, row.getResourceId())
+                .append(ReportLine.FIELD_TAGS, row.getTags());
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/mongo/MongoConstants.java b/services/billing-aws/src/main/java/com/epam/datalab/mongo/MongoConstants.java
new file mode 100644
index 0000000..d93217a
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/mongo/MongoConstants.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.mongo;
+
+/**
+ * The constants names of collections and fields in Mongo DB.
+ */
+public interface MongoConstants {
+    String FIELD_ID = "_id";
+    String COLLECTION_SETTINGS = "settings";
+    String FIELD_SERIVICE_BASE_NAME = "conf_service_base_name";
+    String FIELD_EXPLORATORY_NAME = "exploratory_name";
+    String COLLECTION_BILLING = "billing";
+    String BILLING_DATA_COLLECTION = "BillingData";
+}
diff --git a/services/billing-aws/src/main/java/com/epam/datalab/mongo/MongoDbConnection.java b/services/billing-aws/src/main/java/com/epam/datalab/mongo/MongoDbConnection.java
new file mode 100644
index 0000000..a9993b5
--- /dev/null
+++ b/services/billing-aws/src/main/java/com/epam/datalab/mongo/MongoDbConnection.java
@@ -0,0 +1,223 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.mongo;
+
+import com.epam.datalab.core.aggregate.UsageDataList;
+import com.epam.datalab.exceptions.AdapterException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.mongodb.BasicDBObject;
+import com.mongodb.MongoClient;
+import com.mongodb.MongoCredential;
+import com.mongodb.ServerAddress;
+import com.mongodb.WriteConcern;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
+import com.mongodb.client.model.IndexOptions;
+import com.mongodb.client.result.DeleteResult;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+import static com.mongodb.client.model.Filters.eq;
+
+/**
+ * Provides operation with Mongo database and billing report.
+ */
+public class MongoDbConnection implements Closeable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(MongoDbConnection.class);
+
+    /**
+     * Mongo client.
+     */
+    private MongoClient client;
+
+    /**
+     * Mongo database.
+     */
+    private MongoDatabase database;
+
+
+    /**
+     * Instantiate the helper for Mongo database adapter.
+     *
+     * @param host         the host name.
+     * @param port         the port.
+     * @param databaseName the name of database.
+     * @param username     the name of user.
+     * @param password     the password.
+     * @throws AdapterException
+     */
+    public MongoDbConnection(String host, int port, String databaseName, String username, String password) throws
+            AdapterException {
+        try {
+            client = new MongoClient(
+                    new ServerAddress(host, port),
+                    Collections.singletonList(
+                            MongoCredential.createCredential(username, databaseName, password.toCharArray())));
+            database = client.getDatabase(databaseName).withWriteConcern(WriteConcern.ACKNOWLEDGED);
+        } catch (Exception e) {
+            throw new AdapterException("Cannot create connection to database " +
+                    databaseName + ". " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Close connection to Mongo database.
+     */
+    @Override
+    public void close() throws IOException {
+        if (client != null) {
+            try {
+                client.close();
+            } catch (Exception e) {
+                throw new IOException(e.getLocalizedMessage(), e);
+            } finally {
+                client = null;
+                database = null;
+            }
+        }
+    }
+
+    /**
+     * Create index on billing collection.
+     *
+     * @param indexName the name of index.
+     * @param index     the index options.
+     */
+    private void createBillingIndexes(String indexName, Bson index) {
+        MongoCollection<Document> collection = database.getCollection(MongoConstants.COLLECTION_BILLING);
+        IndexOptions options = new IndexOptions().name(MongoConstants.COLLECTION_BILLING + indexName);
+        try {
+            collection
+                    .createIndex(index, options);
+        } catch (Exception e) {
+            LOGGER.warn("Cannot create index {} on collection {}. {}", options.getName(),
+                    MongoConstants.COLLECTION_BILLING, e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Create index on Mongo collection for fast upsert operations.
+     */
+    public void createBillingIndexes() {
+        createBillingIndexes("_IntervalIdx",
+                new BasicDBObject()
+                        .append(ReportLine.FIELD_USER_ID, 1)
+                        .append(ReportLine.FIELD_USAGE_DATE, 2));
+        createBillingIndexes("_ExploratoryIdx",
+                new BasicDBObject()
+                        .append(ReportLine.FIELD_USER_ID, 1)
+                        .append(MongoConstants.FIELD_EXPLORATORY_NAME, 2));
+    }
+
+    /**
+     * Return the collection of Mongo database.
+     *
+     * @param collectionName the name of collection.
+     */
+    public MongoCollection<Document> getCollection(String collectionName) {
+        return database.getCollection(collectionName);
+    }
+
+    /**
+     * Insert document to Mongo.
+     *
+     * @param collection the name of collection.
+     * @param document   the document.
+     * @throws AdapterException
+     */
+    public void insertOne(MongoCollection<Document> collection, Document document) throws AdapterException {
+        try {
+            collection.insertOne(document);
+        } catch (Exception e) {
+            throw new AdapterException("Cannot insert document into collection " +
+                    collection.getNamespace() + ": " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Insert documents from list to Mongo collection and clear list.
+     *
+     * @param collection Mongo collection.
+     * @param documents  the list of documents.
+     * @throws AdapterException
+     */
+    public void insertRows(MongoCollection<Document> collection, List<Document> documents) throws AdapterException {
+        try {
+            if (!documents.isEmpty()) {
+                collection.insertMany(documents);
+                LOGGER.debug("{} documents has been inserted into collection {}",
+                        documents.size(), collection.getNamespace());
+                documents.clear();
+            }
+        } catch (Exception e) {
+            throw new AdapterException("Cannot insert new documents into collection " +
+                    collection.getNamespace() + ": " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Insert documents from list to Mongo collection and clear list.
+     *
+     * @param collection    Mongo collection.
+     * @param documents     the list of documents.
+     * @param usageDateList list of the data interval to deletion old data from Mongo.
+     * @throws AdapterException
+     */
+    public void upsertRows(MongoCollection<Document> collection, List<Document> documents, UsageDataList usageDateList)
+            throws AdapterException {
+        deleteRows(collection, usageDateList);
+        insertRows(collection, documents);
+    }
+
+    /**
+     * Delete the documents from Mongo collection.
+     *
+     * @param collection    Mongo collection.
+     * @param usageDateList list of the data interval to deletion data from Mongo.
+     * @throws AdapterException
+     */
+    public void deleteRows(MongoCollection<Document> collection, UsageDataList usageDateList)
+            throws AdapterException {
+        try {
+            long rowCount = 0;
+            for (String date : usageDateList) {
+                if (!usageDateList.get(date)) {
+                    DeleteResult result = collection.deleteMany(eq(ReportLine.FIELD_USAGE_DATE, date));
+                    rowCount += result.getDeletedCount();
+                    usageDateList.set(date, true);
+                }
+            }
+            if (rowCount > 0) {
+                LOGGER.debug("{} documents has been deleted from collection {}",
+                        rowCount, collection.getNamespace());
+            }
+        } catch (Exception e) {
+            throw new AdapterException("Cannot delete old rows from collection " +
+                    collection.getNamespace() + ": " + e.getLocalizedMessage(), e);
+        }
+    }
+}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/BillingAwsApplication.java b/services/billing-aws/src/main/java/com/epam/dlab/BillingAwsApplication.java
deleted file mode 100644
index c878370..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/BillingAwsApplication.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab;
-
-import com.epam.dlab.exceptions.InitializationException;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
-
-@SpringBootApplication
-@EnableMongoRepositories
-@EnableConfigurationProperties
-public class BillingAwsApplication {
-
-    public static void main(String[] args) throws InitializationException {
-        SpringApplication.run(BillingAwsApplication.class, args);
-        BillingServiceImpl.startApplication(args);
-    }
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/BillingService.java b/services/billing-aws/src/main/java/com/epam/dlab/BillingService.java
deleted file mode 100644
index 9b4d6db..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/BillingService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab;
-
-import com.epam.dlab.dto.billing.BillingData;
-
-import java.util.List;
-
-public interface BillingService {
-    List<BillingData> getBillingData();
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/BillingServiceImpl.java b/services/billing-aws/src/main/java/com/epam/dlab/BillingServiceImpl.java
deleted file mode 100644
index 8ac6c48..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/BillingServiceImpl.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab;
-
-import com.epam.dlab.configuration.BillingToolConfiguration;
-import com.epam.dlab.configuration.BillingToolConfigurationFactory;
-import com.epam.dlab.core.parser.ParserBase;
-import com.epam.dlab.dto.billing.BillingData;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.util.ServiceUtils;
-import org.bson.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDate;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import static com.epam.dlab.model.aws.ReportLine.FIELD_COST;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_CURRENCY_CODE;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_DLAB_ID;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_PRODUCT;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_RESOURCE_TYPE;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_USAGE_DATE;
-
-@Service
-public class BillingServiceImpl implements BillingService {
-	private static final Logger LOGGER = LoggerFactory.getLogger(BillingServiceImpl.class);
-	private static BillingToolConfiguration configuration;
-
-	public List<BillingData> getBillingData() {
-		try {
-			ParserBase parser = configuration.build();
-
-			LOGGER.info("Try to load billing report for configuration: {}", configuration);
-			List<BillingData> billingData = parser.parse()
-					.stream()
-					.map(this::toBillingData)
-					.collect(Collectors.toList());
-
-			if (!parser.getStatistics().isEmpty()) {
-				LOGGER.info("Billing report parser statistics:");
-				for (int i = 0; i < parser.getStatistics().size(); i++) {
-					LOGGER.info("  {}", parser.getStatistics().get(i).toString());
-				}
-			}
-
-			return billingData;
-		} catch (Exception e) {
-			LOGGER.error("Something went wrong ", e);
-			return Collections.emptyList();
-		}
-	}
-
-	private BillingData toBillingData(Document billingData) {
-		return BillingData.builder()
-				.tag(billingData.getString(FIELD_DLAB_ID).toLowerCase())
-				.usageDateFrom(Optional.ofNullable(billingData.getString(FIELD_USAGE_DATE)).map(LocalDate::parse).orElse(null))
-				.usageDateTo(Optional.ofNullable(billingData.getString(FIELD_USAGE_DATE)).map(LocalDate::parse).orElse(null))
-				.usageDate(billingData.getString(FIELD_USAGE_DATE))
-				.product(billingData.getString(FIELD_PRODUCT))
-				.usageType(billingData.getString(FIELD_RESOURCE_TYPE))
-				.cost(billingData.getDouble(FIELD_COST))
-				.currency(billingData.getString(FIELD_CURRENCY_CODE))
-				.build();
-	}
-
-	public static void initialize(String filename) throws InitializationException {
-		LOGGER.debug("Billing report configuration file: {}", filename);
-		configuration = BillingToolConfigurationFactory.build(filename, BillingToolConfiguration.class);
-	}
-
-	public static void startApplication(String[] args) throws InitializationException {
-		if (ServiceUtils.printAppVersion(BillingTool.class, args)) {
-			return;
-		}
-
-		String confName = null;
-		for (int i = 0; i < args.length; i++) {
-			if (BillingTool.isKey("help", args[i])) {
-				i++;
-				Help.usage(i < args.length ? Arrays.copyOfRange(args, i, args.length) : null);
-				return;
-			} else if (BillingTool.isKey("conf", args[i])) {
-				i++;
-				if (i < args.length) {
-					confName = args[i];
-				} else {
-					throw new InitializationException("Missing the name of configuration file");
-				}
-			}
-		}
-
-		if (confName == null) {
-			Help.usage();
-			throw new InitializationException("Missing arguments");
-		}
-
-		BillingTool.setLoggerLevel();
-		try {
-			initialize(confName);
-		} catch (Exception e) {
-			throw new DlabException("Billing scheduler failed", e);
-		}
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/BillingTool.java b/services/billing-aws/src/main/java/com/epam/dlab/BillingTool.java
deleted file mode 100644
index cde9d4e..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/BillingTool.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.LoggerContext;
-import com.epam.dlab.configuration.BillingToolConfiguration;
-import com.epam.dlab.configuration.BillingToolConfigurationFactory;
-import com.epam.dlab.core.parser.ParserBase;
-import com.epam.dlab.exceptions.AdapterException;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.epam.dlab.util.ServiceUtils;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Arrays;
-
-/** Provides billing parser features.
- */
-public class BillingTool {
-	private static final Logger LOGGER = LoggerFactory.getLogger(BillingTool.class);
-	
-	/** Runs parser for given configuration.
-	 * @param conf billing configuration.
-	 * @throws InitializationException
-	 * @throws AdapterException
-	 * @throws ParseException
-	 */
-	public void run(BillingToolConfiguration conf) throws InitializationException, AdapterException, ParseException {
-		ParserBase parser = conf.build();
-		LOGGER.debug("Billing Tool Configuration: {}", conf);
-		LOGGER.debug("Parser configuration: {}", parser);
-		
-		parser.parse();
-		LOGGER.debug("Billing Tool statistics: {}", parser.getStatistics());
-	}
-	
-	/** Runs parser for given configuration in file.
-	 * @param filename the name of file for billing configuration.
-	 * @throws InitializationException
-	 * @throws AdapterException
-	 * @throws ParseException
-	 */
-	public void run(String filename) throws InitializationException, AdapterException, ParseException {
-		run(BillingToolConfigurationFactory.build(filename, BillingToolConfiguration.class));
-	}
-	
-	/** Runs parser for given configuration.
-	 * @param jsonNode the billing configuration.
-	 * @throws InitializationException
-	 * @throws AdapterException
-	 * @throws ParseException
-	 */
-	public void run(JsonNode jsonNode) throws InitializationException, AdapterException, ParseException {
-		run(BillingToolConfigurationFactory.build(jsonNode, BillingToolConfiguration.class));
-	}
-	
-	
-	/** Check the key name for command line.
-	 * @param keyName the name of key.
-	 * @param arg the argument from command line.
-	 * @return <b>true</b> if given argument is key.
-	 */
-	protected static boolean isKey(String keyName, String arg) {
-		return (("--" + keyName).equalsIgnoreCase(arg) ||
-				("/" + keyName).equalsIgnoreCase(arg));
-	}
-	
-	/** Set the level of loggers to INFO for external loggers.
-	 */
-	protected static void setLoggerLevel() {
-		ch.qos.logback.classic.LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
-		ch.qos.logback.classic.Logger logger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
-		String [] loggers = {
-			"org.hibernate",
-			"org.jboss.logging"
-		};
-		for (String name : loggers) {
-			logger = context.getLogger(name);
-            logger.setLevel(Level.INFO);
-		}
-	}
-	
-	
-	/** Runs parser for given configuration.
-	 * @param args the arguments of command line. 
-	 * @throws InitializationException
-	 */
-	public static void main(String[] args) throws InitializationException {
-		if (ServiceUtils.printAppVersion(BillingServiceImpl.class, args)) {
-			return;
-		}
-
-		String confName = null;
-		String json = null;
-
-		for (int i = 0; i < args.length; i++) {
-			if (isKey("help", args[i])) {
-				i++;
-				Help.usage(i < args.length ? Arrays.copyOfRange(args, i, args.length) : null);
-				return;
-			} else if (isKey("conf", args[i])) {
-				i++;
-				if (i < args.length) {
-					confName = args[i];
-				} else {
-					throw new InitializationException("Missing the name of configuration file");
-				}
-			} else if (isKey("json", args[i])) {
-				i++;
-				if (i < args.length) {
-					json = args[i];
-				} else {
-					throw new InitializationException("Missing the content of json configuration");
-				}
-			} else {
-				throw new InitializationException("Unknow argument: " + args[i]);
-			}
-		}
-
-		if (confName == null && json == null) {
-			Help.usage();
-			throw new InitializationException("Missing arguments");
-		}
-		
-		if (confName != null && json != null) {
-			Help.usage();
-			throw new InitializationException("Invalid arguments.");
-		}
-
-		setLoggerLevel();
-		try {
-			if (confName != null) {
-				new BillingTool().run(confName);
-			} else {
-				JsonNode jsonNode = new ObjectMapper().valueToTree(json);
-				new BillingTool().run(jsonNode);
-			}
-		} catch (Exception e) {
-			throw new DlabException("Billing tool failed", e);
-		}
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/Help.java b/services/billing-aws/src/main/java/com/epam/dlab/Help.java
deleted file mode 100644
index c2fe5c2..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/Help.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab;
-
-import com.epam.dlab.core.BillingUtils;
-import com.epam.dlab.core.ModuleType;
-import com.epam.dlab.exceptions.InitializationException;
-import com.fasterxml.jackson.annotation.JsonClassDescription;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/** Print help for billing tool.
- */
-public class Help {
-
-	private Help() {
-	}
-
-	/** Print help to console.
-	 * @param resourceName the name of resource.
-	 * @param substitute - map for substitution in help content.
-	 * @throws InitializationException
-	 */
-	private static void printHelp(String resourceName, Map<String, String> substitute) throws InitializationException {
-		List<String> list = BillingUtils.getResourceAsList("/" + Help.class.getName() + "." + resourceName + ".txt");
-		String help = StringUtils.join(list, System.lineSeparator());
-
-		if (substitute == null) {
-			substitute = new HashMap<>();
-		}
-		substitute.put("classname", BillingServiceImpl.class.getName());
-
-		for (String key : substitute.keySet()) {
-			help = StringUtils.replace(help, "${" + key.toUpperCase() + "}", substitute.get(key));
-		}
-		System.out.println(help);
-	}
-
-	/** Create and return substitutions for names of modules.
-	 * @return
-	 * @throws InitializationException
-	 */
-	private static Map<String, String> findModules() throws InitializationException {
-		List<Class<?>> modules = BillingUtils.getModuleClassList();
-		Map<String, String> substitute = new HashMap<>();
-		
-		for (Class<?> module : modules) {
-			ModuleType type = BillingUtils.getModuleType(module);
-			JsonTypeName typeName = module.getAnnotation(JsonTypeName.class);
-			if (typeName != null) {
-				String typeNames = substitute.get(type.toString() + "s");
-				typeNames = (typeNames == null ? typeName.value() : typeNames + ", " + typeName.value());
-				substitute.put(type.toString() + "s", typeNames);
-			}
-		}
-		
-		return substitute;
-	}
-
-	/** Find and return help for module.
-	 * @param type the type of module.
-	 * @param name the name of module.
-	 * @throws InitializationException
-	 */
-	private static String findModuleHelp(ModuleType type, String name) throws InitializationException {
-		List<Class<?>> modules = BillingUtils.getModuleClassList();
-		String typeNames = null;
-		for (Class<?> module : modules) {
-			ModuleType t = BillingUtils.getModuleType(module);
-			if (t == type) {
-				JsonTypeName typeName = module.getAnnotation(JsonTypeName.class);
-				if (typeName != null ) {
-					if (name.equals(typeName.value())) {
-						JsonClassDescription description = module.getAnnotation(JsonClassDescription.class);
-						if (description != null) {
-							return description.value();
-						}
-						throw new InitializationException("Help for " + type + " " + name + " not found");
-					} else {
-						typeNames = (typeNames == null ? typeName.value() : typeNames + ", " + typeName.value());
-					}
-				}
-			}
-		}
-		throw new InitializationException("Module for " + type + " " + name + " not found." +
-				(typeNames == null ? "" : " Module type must be one of next: " + typeNames));
-	}
-
-	/** Print help screen for billing tool. 
-	 * @throws InitializationException */
-	public static void usage(String ... args) throws InitializationException {
-		if (args == null || args.length == 0) {
-			printHelp("usage", null);
-		} else if (args[0].equalsIgnoreCase("conf")) {
-			printHelp("conf", findModules());
-		} else {
-			ModuleType type = ModuleType.of(args[0]);
-			if (type == null) {
-				System.out.println("Unknown --help " + args[0] + " command.");
-			} else if (args.length < 2) {
-				System.out.println("Missing the type of module.");
-				String typeNames = findModules().get(type.toString() + "s");
-				if (typeNames != null) {
-					System.out.println("Must be one of next: " + typeNames);
-				}
-			} else if (args.length > 2) {
-				System.out.println("Extra arguments in command: " +
-					StringUtils.join(Arrays.copyOfRange(args, 2, args.length), " "));
-			} else {
-				System.out.println(findModuleHelp(type, args[1]));
-			}
-		}
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/conf/SecurityConfig.java b/services/billing-aws/src/main/java/com/epam/dlab/conf/SecurityConfig.java
deleted file mode 100644
index dba4086..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/conf/SecurityConfig.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.conf;
-
-import org.keycloak.adapters.KeycloakConfigResolver;
-import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
-import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
-import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
-import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
-import org.springframework.security.core.session.SessionRegistryImpl;
-import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
-import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
-
-@KeycloakConfiguration
-class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
-
-    @Autowired
-    public void configureGlobal(AuthenticationManagerBuilder auth) {
-        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
-        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
-        auth.authenticationProvider(keycloakAuthenticationProvider);
-    }
-
-    @Bean
-    public KeycloakConfigResolver KeycloakConfigResolver() {
-        return new KeycloakSpringBootConfigResolver();
-    }
-
-    @Bean
-    @Override
-    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
-        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
-    }
-
-    @Override
-    protected void configure(HttpSecurity http) throws Exception {
-        super.configure(http);
-        http
-                .anonymous().disable()
-                .authorizeRequests()
-                .anyRequest()
-                .authenticated();
-    }
-}
\ No newline at end of file
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/configuration/BillingToolConfiguration.java b/services/billing-aws/src/main/java/com/epam/dlab/configuration/BillingToolConfiguration.java
deleted file mode 100644
index 420b9e0..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/configuration/BillingToolConfiguration.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.configuration;
-
-import com.epam.dlab.BillingTool;
-import com.epam.dlab.core.AdapterBase;
-import com.epam.dlab.core.AdapterBase.Mode;
-import com.epam.dlab.core.FilterBase;
-import com.epam.dlab.core.ModuleBase;
-import com.epam.dlab.core.ModuleData;
-import com.epam.dlab.core.parser.ParserBase;
-import com.epam.dlab.exceptions.AdapterException;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.mongo.MongoDbConnection;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import com.google.common.collect.ImmutableList;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-
-/**
- * Describe configuration for {@link BillingTool}
- */
-public class BillingToolConfiguration {
-
-	/**
-	 * The host name.
-	 */
-	@JsonProperty
-	private String host;
-
-	/**
-	 * The port.
-	 */
-	@JsonProperty
-	private int port;
-
-	/**
-	 * The name of database.
-	 */
-	@JsonProperty
-	private String database;
-
-	/**
-	 * The name of user.
-	 */
-	@JsonProperty
-	private String username;
-
-	/**
-	 * The password.
-	 */
-	@JsonProperty
-	private String password;
-
-	@JsonProperty
-	private boolean billingEnabled;
-
-	/**
-	 * Adapter for reading source data.
-	 */
-	@Valid
-	@NotNull
-	@JsonProperty
-	private ImmutableList<AdapterBase> adapterIn;
-
-	/**
-	 * Adapter for writing converted data.
-	 */
-	@Valid
-	@NotNull
-	@JsonProperty
-	private ImmutableList<AdapterBase> adapterOut;
-
-	/**
-	 * Parser of source data to common format.
-	 */
-	@Valid
-	@NotNull
-	@JsonProperty
-	private ImmutableList<ParserBase> parser;
-
-	/**
-	 * Filter for source and converted data.
-	 */
-	@Valid
-	@JsonProperty
-	private ImmutableList<FilterBase> filter = null;
-
-	/**
-	 * Logging configuration.
-	 */
-	@Valid
-	@JsonProperty
-	private LoggingConfigurationFactory logging = null;
-
-
-	/**
-	 * Working data of modules.
-	 */
-	@JsonIgnore
-	private ModuleData moduleData;
-
-	/**
-	 * Return the adapter for reading source data.
-	 */
-	public ImmutableList<AdapterBase> getAdapterIn() {
-		return adapterIn;
-	}
-
-	/**
-	 * Set the adapter for reading source data.
-	 */
-	public void setAdapterIn(ImmutableList<AdapterBase> adapter) {
-		for (AdapterBase a : adapter) {
-			a.setMode(Mode.READ);
-		}
-		this.adapterIn = adapter;
-	}
-
-	/**
-	 * Return the adapter for writing converted data.
-	 */
-	public ImmutableList<AdapterBase> getAdapterOut() {
-		return adapterOut;
-	}
-
-	/**
-	 * Set the adapter for writing converted data.
-	 */
-	public void setAdapterOut(ImmutableList<AdapterBase> adapter) {
-		for (AdapterBase a : adapter) {
-			a.setMode(Mode.WRITE);
-		}
-		this.adapterOut = adapter;
-	}
-
-	/**
-	 * Return the parser of source data to common format.
-	 */
-	public ImmutableList<ParserBase> getParser() {
-		return parser;
-	}
-
-	/**
-	 * Set the parser of source data to common format.
-	 */
-	public void setParser(ImmutableList<ParserBase> parser) {
-		this.parser = parser;
-	}
-
-	/**
-	 * Return the filter for source and converted data.
-	 */
-	public ImmutableList<FilterBase> getFilter() {
-		return filter;
-	}
-
-	/**
-	 * Set the filter for source and converted data.
-	 */
-	public void setFilter(ImmutableList<FilterBase> filter) {
-		this.filter = filter;
-	}
-
-	/**
-	 * Return the logging configuration.
-	 */
-	public LoggingConfigurationFactory getLogging() {
-		return logging;
-	}
-
-	/**
-	 * Set the logging configuration.
-	 */
-	public void setLogging(LoggingConfigurationFactory logging) {
-		this.logging = logging;
-	}
-
-
-	/**
-	 * Return the working data of modules.
-	 */
-	@JsonIgnore
-	public ModuleData getModuleData() {
-		return moduleData;
-	}
-
-	/**
-	 * Check and return module.
-	 *
-	 * @param modules    the list of modules.
-	 * @param name       the name of module.
-	 * @param isOptional optional module or not.
-	 * @return module
-	 * @throws InitializationException
-	 */
-	private <T extends ModuleBase> T getModule(ImmutableList<T> modules, String name, boolean isOptional) throws
-			InitializationException {
-		T module = (modules != null && modules.size() == 1 ? modules.get(0) : null);
-		if (!isOptional && module == null) {
-			throw new InitializationException("Invalid configuration for property " + name);
-		}
-		return module;
-	}
-
-	/**
-	 * Build and return the parser.
-	 *
-	 * @return the parser.
-	 * @throws InitializationException
-	 */
-	public ParserBase build() throws InitializationException {
-		ParserBase parser = getModule(this.parser, "parser", false);
-		AdapterBase in = getModule(adapterIn, "adapterIn", false);
-		AdapterBase out = getModule(adapterOut, "adapterOut", false);
-		FilterBase f = getModule(filter, "filter", true);
-
-		final MongoDbConnection connection;
-		try {
-			connection = new MongoDbConnection(host, port, database, username, password);
-		} catch (AdapterException e) {
-			throw new InitializationException("Cannot configure mongo connection. " + e.getLocalizedMessage(), e);
-		}
-		moduleData = new ModuleData(connection);
-
-		parser.setModuleData(moduleData);
-		in.setModuleData(moduleData);
-		out.setModuleData(moduleData);
-		if (f != null) {
-			f.setModuleData(moduleData);
-		}
-
-		return parser.build(in, out, f);
-	}
-
-	public boolean isBillingEnabled() {
-		return billingEnabled;
-	}
-
-	/**
-	 * Returns a string representation of the object.
-	 *
-	 * @param self the object to generate the string for (typically this), used only for its class name.
-	 */
-	public ToStringHelper toStringHelper(Object self) {
-		return MoreObjects.toStringHelper(self)
-				.add("moduleData", moduleData)
-				.add("adapterIn", adapterIn)
-				.add("adapterOut", adapterOut)
-				.add("filter", filter)
-				.add("parser", parser)
-				.add("logging", logging)
-				.add("billingEnabled", billingEnabled);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this)
-				.toString();
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/configuration/BillingToolConfigurationFactory.java b/services/billing-aws/src/main/java/com/epam/dlab/configuration/BillingToolConfigurationFactory.java
deleted file mode 100644
index 1de80af..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/configuration/BillingToolConfigurationFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.configuration;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import com.epam.dlab.core.BillingUtils;
-import com.epam.dlab.exceptions.InitializationException;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.fasterxml.jackson.datatype.guava.GuavaModule;
-
-/** Build the instance of class {@link BillingToolConfiguration}. 
- */
-public class BillingToolConfigurationFactory {
-
-	/** Mapper for reading configuration. */
-	private static ObjectMapper mapper;
-	
-	/** Build the instance of class {@link BillingToolConfiguration} from YAML file.
-	 * @param filename the name of file.
-	 * @param confClass configuration class.
-	 * @return the instance of configuration.
-	 * @throws InitializationException
-	 */
-	public static <T extends BillingToolConfiguration> T build(String filename, Class<T> confClass) throws InitializationException {
-		try {
-			InputStream is = new FreeMarkerConfig().getInputStream(filename);
-			JsonNode node = getMapper().readTree(new YAMLFactory().createParser(is));
-			return build(node, confClass);
-		} catch (IOException | InitializationException e) {
-			throw new InitializationException("Cannot parse configuration file " + filename + ". " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/** Build the instance of class {@link BillingToolConfiguration} from YAML file.
-	 * @param node the content of configuration.
-	 * @param confClass configuration class.
-	 * @return the instance of configuration.
-	 * @throws InitializationException
-	 */
-	public static <T extends BillingToolConfiguration> T build(JsonNode node, Class<T> confClass) throws InitializationException {
-		T conf;
-		try {
-			conf = getMapper().readValue(node.toString(), confClass);
-		} catch (Exception e) {
-			throw new InitializationException("Cannot parse json configuration. " + e.getLocalizedMessage(), e);
-		}
-
-		try {
-			LoggingConfigurationFactory logging = conf.getLogging();
-			if (logging != null) {
-				logging.configure();
-			}
-		} catch (Exception e) {
-			throw new InitializationException("Cannot initialize configuration. " + e.getLocalizedMessage(), e);
-		}
-		
-		new ConfigurationValidator<T>()
-			.validate(conf);
-
-		return conf;
-	}
-	
-	/** Return the mapper for reading configuration. 
-	 * @throws InitializationException
-	 */
-	private static ObjectMapper getMapper() throws InitializationException {
-		if (mapper != null) {
-			return mapper;
-		}
-        mapper = new ObjectMapper()
-        		.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
-        mapper.registerModule(new GuavaModule());
-    	for (Class<?> clazz : BillingUtils.getModuleClassList()) {
-			mapper.registerSubtypes(clazz);
-		}
-        
-        return mapper;
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/configuration/ConfigJsonGenerator.java b/services/billing-aws/src/main/java/com/epam/dlab/configuration/ConfigJsonGenerator.java
deleted file mode 100644
index 0ed8a18..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/configuration/ConfigJsonGenerator.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.configuration;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import com.epam.dlab.core.BillingUtils;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/** Generate the json configuration of billing tool.
- */
-public class ConfigJsonGenerator {
-
-	/** Buffer for configuration properties. */
-	private Map<String, Map<String, String>[]> config = new HashMap<>();
-	
-	/** Add the properties of module to configuration.
-	 * @param moduleName the name of module.
-	 * @param properties the properties: key and value sequence.
-	 */
-	private ConfigJsonGenerator withModule(String moduleName, String ... properties) {
-		if (properties == null) {
-			config.remove(moduleName);
-			return this;
-		}
-		
-		@SuppressWarnings("unchecked")
-		Map<String, String>[] map = new Map[1];
-		map[0] = BillingUtils.stringsToMap(properties);
-		config.put(moduleName, map);
-		return this;
-	}
-
-	/** Add the properties of input adapter to configuration.
-	 * @param properties the properties: key and value sequence.
-	 */
-	public ConfigJsonGenerator withAdapterIn(String ... properties) {
-		return withModule("adapterIn", properties);
-	}
-	
-	/** Add the properties of output adapter to configuration.
-	 * @param properties the properties: key and value sequence.
-	 */
-	public ConfigJsonGenerator withAdapterOut(String ... properties) {
-		return withModule("adapterOut", properties);
-	}
-	
-	/** Add the properties of parser to configuration.
-	 * @param properties the properties: key and value sequence.
-	 */
-	public ConfigJsonGenerator withParser(String ... properties) {
-		return withModule("parser", properties);
-	}
-	
-	/** Add the properties of filter to configuration.
-	 * @param properties the properties: key and value sequence.
-	 */
-	public ConfigJsonGenerator withFilter(String ... properties) {
-		return withModule("filter", properties);
-	}
-	
-	/** Build and return json configuration.
-	 * @param properties the properties: key and value sequence.
-	 */
-	public JsonNode build() {
-		return new ObjectMapper()
-				.valueToTree(config);
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/configuration/ConfigurationValidator.java b/services/billing-aws/src/main/java/com/epam/dlab/configuration/ConfigurationValidator.java
deleted file mode 100644
index 422f9ae..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/configuration/ConfigurationValidator.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.configuration;
-
-import java.util.Map;
-import java.util.Set;
-
-import javax.validation.ConstraintViolation;
-import javax.validation.Validation;
-import javax.validation.Validator;
-import javax.validation.ValidatorFactory;
-
-import com.epam.dlab.core.BillingUtils;
-import com.epam.dlab.exceptions.InitializationException;
-
-/** Json properties validator.
- * @param <T> Class for validation.
- */
-public class ConfigurationValidator<T> {
-	
-	/** Error messages. */
-	private static Map<String, String> messages = BillingUtils.stringsToMap(
-			"{javax.validation.constraints.NotNull.message}", "Property \"%s\" may not be null"); 
-
-	/** Return the list of error messages.
-	 * @param violation constraint violations.
-	 */
-	public String getMessage(ConstraintViolation<T> violation) {
-		String template = messages.get(violation.getMessageTemplate());
-		if (template == null) {
-			template = "Property \"%s\" %s";
-		}
-		return String.format(
-					messages.get(violation.getMessageTemplate()),
-					violation.getPropertyPath(),
-					violation.getInvalidValue());
-	}
-
-	/** Validate properties in instance and throw exception if it have not valid property.
-	 * @param clazz instance for validation.
-	 * @throws InitializationException
-	 */
-	public void validate(T clazz) throws InitializationException {
-		ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
-		Validator validator = validatorFactory.getValidator();
-		Set<ConstraintViolation<T>> violations = validator.validate(clazz);
-		for (ConstraintViolation<T> violation : violations) {
-			throw new InitializationException(getMessage(violation));
-		}
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/configuration/FreeMarkerConfig.java b/services/billing-aws/src/main/java/com/epam/dlab/configuration/FreeMarkerConfig.java
deleted file mode 100644
index 36b7c45..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/configuration/FreeMarkerConfig.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.configuration;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStreamWriter;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import com.google.common.base.Throwables;
-
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import freemarker.template.TemplateException;
-
-/** Provides Apache FreeMarker the template engine for the billing configuration.
- */
-public class FreeMarkerConfig {
-	
-	/** Create and return the input stream for the configuration file.
-	 * @param filename the name of configuration file.
-	 * @throws IOException
-	 */
-	public InputStream getInputStream(final String filename) throws IOException {
-		try {
-			Configuration conf = new Configuration(Configuration.VERSION_2_3_22);
-			Template template = new Template("billing-config", new FileReader(new File(filename)), conf);
-			Map<String, Object> dataModel = getDataModel();
-			
-			ByteArrayOutputStream streamBuffer = new ByteArrayOutputStream();
-			template.process(dataModel, new OutputStreamWriter(streamBuffer, StandardCharsets.UTF_8));
-			byte[] buffer = streamBuffer.toByteArray();
-			
-			return new ByteArrayInputStream(buffer);
-		} catch (TemplateException e) {
-			throw Throwables.propagate(e);
-		}
-	}
-
-	/** Create and return JVM and OS properties.
-	 */
-	private Map<String, Object> getDataModel() {
-		Map<String, Object> dataModel = new HashMap<>();
-		
-		Iterator<Object> sysProps = System.getProperties().keySet().iterator();
-		while (sysProps.hasNext()) {
-			String key = (String) sysProps.next();
-			dataModel.put(key, System.getProperties().getProperty(key));
-		}
-		dataModel.putAll(System.getenv());
-
-		dataModel.put("env", System.getenv());
-		dataModel.put("sys", System.getProperties());
-
-		return dataModel;
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/configuration/LoggingConfigurationFactory.java b/services/billing-aws/src/main/java/com/epam/dlab/configuration/LoggingConfigurationFactory.java
deleted file mode 100644
index 7fb91bb..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/configuration/LoggingConfigurationFactory.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.configuration;
-
-import javax.validation.Valid;
-
-import org.slf4j.LoggerFactory;
-
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.logging.AppenderBase;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.LoggerContext;
-
-/** Configuration and factory for logging.
- */
-public class LoggingConfigurationFactory {
-	
-	/** Default logging level for all appenders. */
-	@Valid
-	@JsonProperty
-	private Level level = Level.INFO;
-
-	/** List of logging levels for appenders. */
-	@JsonIgnore
-	private ImmutableMap<String, Level> loggers = ImmutableMap.of();
-
-	/** List of logging appenders. */
-	@Valid
-	@JsonProperty
-	private ImmutableList<AppenderBase> appenders = ImmutableList.of();
-
-
-	/** Return the default logging level for all appenders. */
-	public Level getLevel() {
-		return level;
-	}
-
-	/** Set the default logging level for all appenders. */
-	public void setLevel(String level) throws InitializationException {
-		this.level = toLevel(level);
-	}
-
-	/** Return the list of logging levels for appenders. */
-	public ImmutableMap<String, Level> getLoggers() {
-		return loggers;
-	}
-
-	/** Set the list of logging levels for appenders. */
-	@JsonProperty
-	public void setLoggers(ImmutableMap<String, JsonNode> loggers) throws InitializationException {
-		ImmutableMap.Builder<String, Level> levels = new ImmutableMap.Builder<String, Level>();
-		for(String key : loggers.keySet()) {
-			JsonNode node = loggers.get(key);
-			levels.put(key, toLevel(node.asText()));
-		}
-		this.loggers = levels.build();
-	}
-
-	/** Return the list of logging appenders. */
-	public ImmutableList<AppenderBase> getAppenders() {
-		return appenders;
-	}
-
-	/** Set the list of logging appenders. */
-	public void setAppenders(ImmutableList<AppenderBase> appenders) {
-		this.appenders = appenders;
-	}
-	
-	
-	/** Translate the name of logging level to {@link Level}.
-	 * @param level the name of logging level.
-	 * @return logging level.
-	 * @throws InitializationException if given unknown logging level name.
-	 */
-	private Level toLevel(String level) throws InitializationException {
-		Level l = Level.toLevel(level, null);
-		if (l == null) {
-			throw new InitializationException("Unknown logging level: " + level);
-		}
-		return l;
-	}
-
-	/** Configure logging appenders.
-	 * @throws InitializationException
-	 */
-	public void configure() throws InitializationException {
-		if (appenders == null) {
-			throw new InitializationException("Configuration property logging.appenders cannot be null.");
-		}
-		LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
-		context.reset();
-	
-		for (AppenderBase appender : appenders) {
-			appender.configure(context);
-		}
-
-		Logger logger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
-		logger.setLevel(level);
-		for (String name : loggers.keySet()) {
-			logger = context.getLogger(name);
-            logger.setLevel(loggers.get(name));
-		}
-	}
-	
-	
-	/** Returns a string representation of the object.
-	 * @param self the object to generate the string for (typically this), used only for its class name.
-	 */
-	public ToStringHelper toStringHelper(Object self) {
-    	return MoreObjects.toStringHelper(self)
-    			.add("level", level)
-    			.add("loggers", loggers)
-    			.add("appenders", appenders);
-    }
-    
-    @Override
-    public String toString() {
-    	return toStringHelper(this)
-    			.toString();
-    }
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/controller/BillingController.java b/services/billing-aws/src/main/java/com/epam/dlab/controller/BillingController.java
deleted file mode 100644
index deabf44..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/controller/BillingController.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.controller;
-
-import com.epam.dlab.BillingService;
-import com.epam.dlab.dto.billing.BillingData;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-@RestController
-public class BillingController {
-
-    private final BillingService billingService;
-
-    public BillingController(BillingService billingService) {
-        this.billingService = billingService;
-    }
-
-    @GetMapping
-    public ResponseEntity<List<BillingData>> getBilling() {
-        return new ResponseEntity<>(billingService.getBillingData(), HttpStatus.OK);
-    }
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/AdapterBase.java b/services/billing-aws/src/main/java/com/epam/dlab/core/AdapterBase.java
deleted file mode 100644
index 475404d..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/AdapterBase.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core;
-
-import com.epam.dlab.exceptions.AdapterException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import org.bson.Document;
-
-import java.util.List;
-
-/**
- * Abstract module for read/write adapter.
- * See description of {@link ModuleBase} how to create your own adapter.
- */
-public abstract class AdapterBase extends ModuleBase {
-	public enum Mode {READ, WRITE}
-
-	;
-
-	/**
-	 * Flag the header of common format should be written to target.
-	 */
-	@JsonProperty
-	private boolean writeHeader = true;
-
-
-	/**
-	 * The mode of adapter read or write.
-	 */
-	@JsonIgnore
-	private Mode mode;
-
-
-	/**
-	 * Default constructor for deserialization.
-	 */
-	public AdapterBase() {
-	}
-
-	/**
-	 * Instantiate adapter for reading or writing.
-	 *
-	 * @param mode the mode of adapter.
-	 */
-	public AdapterBase(Mode mode) {
-		this.mode = mode;
-	}
-
-
-	/**
-	 * Return <b>true</b> if the header of common format should be written to target.
-	 */
-	public boolean isWriteHeader() {
-		return writeHeader;
-	}
-
-	/**
-	 * Set flag the header of common format should be written to target.
-	 */
-	public void setWriteHeader(boolean writeHeader) {
-		this.writeHeader = writeHeader;
-	}
-
-
-	/**
-	 * Return the mode of adapter read or write.
-	 */
-	public Mode getMode() {
-		return mode;
-	}
-
-	/**
-	 * Set the mode of adapter read or write.
-	 */
-	public void setMode(Mode mode) {
-		this.mode = mode;
-	}
-
-
-	/**
-	 * Open connection.
-	 *
-	 * @throws AdapterException if cannot open connection.
-	 */
-	public abstract void open() throws AdapterException;
-
-	/**
-	 * Return <b>true</b> if adapter has the multiply entries of data.
-	 */
-	public boolean hasMultyEntry() {
-		return false;
-	}
-
-	/**
-	 * Return <b>true</b> if current entry has the data.
-	 */
-	public boolean hasEntryData() {
-		return true;
-	}
-
-	/**
-	 * Open next entry if exists and return <b>true</b> otherwise return <b>false</b>.
-	 *
-	 * @throws AdapterException if cannot open entry.
-	 */
-	public boolean openNextEntry() throws AdapterException {
-		return false;
-	}
-
-	/**
-	 * Close connection.
-	 *
-	 * @throws AdapterException if cannot close connection.
-	 */
-	public abstract void close() throws AdapterException;
-
-	/**
-	 * Return the current processed entry name.
-	 */
-	public abstract String getEntryName();
-
-	/**
-	 * Read the line of data from adapter and return it.
-	 *
-	 * @throws AdapterException
-	 */
-	public abstract String readLine() throws AdapterException;
-
-	/**
-	 * Write the header of data to adapter.
-	 *
-	 * @param header the header of common format.
-	 * @throws AdapterException
-	 */
-	public abstract void writeHeader(List<String> header) throws AdapterException;
-
-	/**
-	 * Write the row of data to adapter.
-	 *
-	 * @param row the row of common format.
-	 * @return
-	 * @throws AdapterException
-	 */
-	public abstract Document writeRow(ReportLine row) throws AdapterException;
-
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("mode", mode)
-				.add("writeHeader", isWriteHeader());
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/BillingUtils.java b/services/billing-aws/src/main/java/com/epam/dlab/core/BillingUtils.java
deleted file mode 100644
index 50eb871..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/BillingUtils.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core;
-
-import java.io.IOException;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import com.epam.dlab.configuration.BillingToolConfigurationFactory;
-import com.epam.dlab.core.parser.ParserBase;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.logging.AppenderBase;
-import com.google.common.io.Resources;
-
-/** Billing toll utilities. 
- */
-public class BillingUtils {
-
-	/** Name of resource with the names of module classes. */
-	private static final String RESOURCE_MODULE_NAMES = "/" + BillingToolConfigurationFactory.class.getName();
-
-	private BillingUtils() {
-	}
-	
-	/** Create and return map from given key/values.
-	 * @param keyValues the key/value pairs.
-	 */
-	public static Map<String, String> stringsToMap(String ... keyValues) {
-		Map<String, String> map = new HashMap<>();
-		if (keyValues == null) {
-			return map;
-		}
-		if (keyValues.length % 2 != 0) {
-			throw new IllegalArgumentException("Missing key or value in arguments");
-		}
-		
-		for (int i = 1; i < keyValues.length; i+=2) {
-			map.put(keyValues[i - 1], keyValues[i]);
-		}
-		return map;
-	}
-	
-	/** Read and return content as string list from resource.
-	 * @param resourceName the name of resource.
-	 * @return list of strings.
-	 * @throws InitializationException
-	 */
-	public static List<String> getResourceAsList(String resourceName) throws InitializationException {
-        try {
-    		URL url = BillingToolConfigurationFactory.class.getResource(resourceName);
-            if (url == null) {
-            	throw new InitializationException("Resource " + resourceName + " not found");
-            }
-    		return Resources.readLines(url, Charset.forName("utf-8"));
-		} catch (IllegalArgumentException | IOException e) {
-			throw new InitializationException("Cannot read resource " + resourceName + ": " + e.getLocalizedMessage(), e);
-		}
-	}
-	
-	/** Return the list of billing tool modules.
-	 * @throws InitializationException
-	 */
-	public static List<Class<?>> getModuleClassList() throws InitializationException {
-		List<String> modules = getResourceAsList(RESOURCE_MODULE_NAMES);
-		List<Class<?>> classes = new ArrayList<>();
-		
-		for (String className : modules) {
-			try {
-				classes.add(Class.forName(className));
-			} catch (ClassNotFoundException e) {
-				throw new InitializationException("Cannot add the sub type " + className +
-						" from resource " + RESOURCE_MODULE_NAMES + ": " + e.getLocalizedMessage(), e);
-			}
-		}
-    	return classes;
-	}
-	
-	/** Check for child class is belong to parent by hierarchy.
-	 * @param child the child class for check.
-	 * @param parent the parent class from hierarchy.
-	 */
-	public static boolean classChildOf(Class<?> child, Class<?> parent) {
-		return child != null && parent != null && parent.isAssignableFrom(child);
-	}
-
-	/** Return the type of module if class is module otherwise <b>null</b>.
-	 * @param moduleClass the class.
-	 */
-	public static ModuleType getModuleType(Class<?> moduleClass) {
-		if (classChildOf(moduleClass, AdapterBase.class)) {
-			return ModuleType.ADAPTER;
-		} else if (classChildOf(moduleClass, FilterBase.class)) {
-			return ModuleType.FILTER;
-		} else if (classChildOf(moduleClass, ParserBase.class)) {
-			return ModuleType.PARSER;
-		} else if (classChildOf(moduleClass, AppenderBase.class)) {
-			return ModuleType.LOGAPPENDER;
-		}
-		return null;
-	}
-	
-	/** Return the name of user without domain.
-	 * @param value the value.
-	 */
-	public static String getSimpleUserName(String username) {
-        return (username == null ? null : username.replaceAll("@.*", ""));
-    }
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/DBAdapterBase.java b/services/billing-aws/src/main/java/com/epam/dlab/core/DBAdapterBase.java
deleted file mode 100644
index 65aa2a0..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/DBAdapterBase.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-/** The abstract adapter for database.
- * See description of {@link ModuleBase} how to create your own adapter.
- */
-public abstract class DBAdapterBase extends AdapterBase {
-
-	/** The host name. */
-    @JsonProperty
-    private String host;
-
-	/** The port. */
-    @JsonProperty
-    private int port;
-
-	/** The name of database. */
-    @JsonProperty
-    private String database;
-
-	/** The name of user. */
-    @JsonProperty
-    private String username;
-
-	/** The password. */
-    @JsonProperty
-    private String password;
-
-    
-	/** Default constructor for deserialization. */
-	public DBAdapterBase() { }
-	
-	/** Instantiate adapter for reading or writing.
-	 * @param mode the mode of adapter.
-	 */
-	public DBAdapterBase(Mode mode) {
-		super(mode);
-	}
-
-	
-	@Override
-	public boolean isWriteHeader() {
-		return false;
-	}
-    
-	/** Return the host name. */
-	public String getHost() {
-		return host;
-	}
-	
-	/** Set the host name. */
-	public void setHost(String host) {
-		this.host = host;
-	}
-	
-	/** Return the port. */
-	public int getPort() {
-		return port;
-	}
-	
-	/** Set the port. */
-	public void setPort(int port) {
-		this.port = port;
-	}
-	
-	/** Return the name of database. */
-	public String getDatabase() {
-		return database;
-	}
-	
-	/** Set the name of database. */
-	public void setDatabase(String database) {
-		this.database = database;
-	}
-	
-	/** Return the name of user. */
-	public String getUsername() {
-		return username;
-	}
-	
-	/** Set the name of user. */
-	public void setUsername(String username) {
-		this.username = username;
-	}
-	
-	/** Return the password. */
-	public String getPassword() {
-		return password;
-	}
-	
-	/** Set the password. */
-	public void setPassword(String password) {
-		this.password = password;
-	}
-	
-	
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("host", host)
-				.add("port", port)
-				.add("database", database)
-				.add("username", username)
-				.add("password", "***");
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/FilterBase.java b/services/billing-aws/src/main/java/com/epam/dlab/core/FilterBase.java
deleted file mode 100644
index 5b51cc5..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/FilterBase.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core;
-
-import com.epam.dlab.core.parser.ParserBase;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import java.util.List;
-
-/**
- * Abstract module of filtering.
- * See description of {@link ModuleBase} how to create your own filter.
- */
-public abstract class FilterBase extends ModuleBase {
-
-	/**
-	 * Parser.
-	 */
-	private ParserBase parser;
-
-	/**
-	 * Return parser.
-	 */
-	public ParserBase getParser() {
-		return parser;
-	}
-
-	/**
-	 * Set parser.
-	 */
-	public void setParser(ParserBase parser) {
-		this.parser = parser;
-	}
-
-
-	/**
-	 * Initialize the filter.
-	 *
-	 * @throws InitializationException
-	 */
-	public abstract void initialize() throws InitializationException;
-
-	/**
-	 * Return the line for parsing if line is accepted and may be parsed,
-	 * otherwise return <b>null</b>.
-	 *
-	 * @param line the source line.
-	 * @throws ParseException
-	 */
-	public abstract String canParse(String line) throws ParseException;
-
-	/**
-	 * Return the list of values for transformation if value is accepted and may be transformed,
-	 * otherwise return <b>null</b>.
-	 *
-	 * @param row the list of values.
-	 * @throws ParseException
-	 */
-	public abstract List<String> canTransform(List<String> row) throws ParseException;
-
-	/**
-	 * Return the row of billing report if row is accepted and may be written to target,
-	 * otherwise return <b>null</b>.
-	 *
-	 * @param row the report line.
-	 * @throws ParseException
-	 */
-	public abstract ReportLine canAccept(ReportLine row) throws ParseException;
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("parser", (parser == null ? null : parser.getType()));
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/ModuleBase.java b/services/billing-aws/src/main/java/com/epam/dlab/core/ModuleBase.java
deleted file mode 100644
index 13e0204..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/ModuleBase.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core;
-
-import com.epam.dlab.core.parser.ParserBase;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-/** Abstract class for modules: adapter, filter, parser.<br>
- * To create your adapter:<br>
- * 1. Create a class which extends one of {@link AdapterBase}, {@link FilterBase} or {@link ParserBase} classes.<br>
- * 2. Annotate it with {@link JsonTypeName} annotation and give it a unique type name for this type of modules.<br>
- * 3. Add full the name of your class to main/resources/com.epam.dlab.configuration.BillingToolConfigurationFactory file.
- * 4. Annotate it with {@link JsonClassDescription] annotation and describe all properties of module.
- */
-@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
-public abstract class ModuleBase {
-	
-	/** Working data of module. */
-	@JsonIgnore
-	private ModuleData moduleData;
-	
-	/** Return the name of type for appender. */
-	@JsonIgnore
-	public String getType() {
-		Class<? extends ModuleBase> clazz = this.getClass();
-		return (clazz.isAnnotationPresent(JsonTypeName.class) ?
-				clazz.getAnnotation(JsonTypeName.class).value() : clazz.getName());
-	}
-	
-	/** Return the working data of module. */
-	public ModuleData getModuleData() {
-		return moduleData;
-	}
-	
-	/** Set the working data of module. */
-	public void setModuleData(ModuleData moduleData) {
-		this.moduleData = moduleData;
-	}
-	
-	/** Returns a string representation of the object.
-	 * @param self the object to generate the string for (typically this), used only for its class name.
-	 */
-	public ToStringHelper toStringHelper(Object self) {
-    	return MoreObjects.toStringHelper(self)
-    			.add("type",  getType());
-    }
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/ModuleData.java b/services/billing-aws/src/main/java/com/epam/dlab/core/ModuleData.java
deleted file mode 100644
index 2322c05..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/ModuleData.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core;
-
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.mongo.MongoConstants;
-import com.epam.dlab.mongo.MongoDbConnection;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import com.mongodb.client.FindIterable;
-import com.mongodb.client.model.UpdateOptions;
-import org.apache.commons.lang3.StringUtils;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.io.IOException;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import static com.mongodb.client.model.Filters.*;
-
-/**
- * Provides loading and storing the working data of modules.
- */
-public class ModuleData {
-
-	private static final String ID_FIELD = "_id";
-	private static final String MODIFICATION_DATE = "lastModificationDate";
-	public static final String ENTRIES_FIELD = "entries";
-	/**
-	 * Date formatter.
-	 */
-	private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
-	private final MongoDbConnection connection;
-
-	private String id;
-	private Date modificationDate;
-
-	/**
-	 * Entries of data.
-	 */
-	private Map<String, String> entries = new HashMap<>();
-
-	/**
-	 * Flag modification of entries.
-	 */
-	private boolean modified;
-
-	/**
-	 * Return <b>true</b> if any entries was modify.
-	 */
-	public boolean isModified() {
-		return modified;
-	}
-
-	/**
-	 * Instantiate module data.
-	 *
-	 * @param connection the name of data file.
-	 * @throws InitializationException
-	 */
-	public ModuleData(MongoDbConnection connection) {
-		this.connection = connection;
-	}
-
-	public void setId(String id) {
-		this.id = id;
-	}
-
-	public void setModificationDate(Date modificationDate) {
-		this.modificationDate = modificationDate;
-	}
-
-	/**
-	 * Return the value for given key or <b>null</b> if value not found.
-	 *
-	 * @param key the key of entry.
-	 */
-	public String getString(String key) {
-		return entries.get(key);
-	}
-
-	/**
-	 * Return the date value for given key or <b>null</b> if value not found.
-	 *
-	 * @param key the key of entry.
-	 * @throws ParseException
-	 */
-	public Date getDate(String key) throws ParseException {
-		String value = entries.get(key);
-		return (value == null ? null : dateFormat.parse(value));
-	}
-
-	/**
-	 * Set value for given key or delete entry if the value is <b>null</b>.
-	 *
-	 * @param key   the key of entry.
-	 * @param value the value.
-	 */
-	public void set(String key, String value) {
-		if (StringUtils.equals(entries.get(key), value)) {
-			return;
-		} else if (value == null) {
-			entries.remove(key);
-		} else {
-			entries.put(key, value);
-		}
-		modified = true;
-	}
-
-	/**
-	 * Set value for given key or delete entry if the value is <b>null</b>.
-	 *
-	 * @param key   the key of entry.
-	 * @param value the date.
-	 */
-	public void set(String key, Date value) {
-		set(key, dateFormat.format(value));
-	}
-
-	public void store() {
-		//TODO refactor this module move working with db to DAO layer
-		final Document document = new Document().append(ID_FIELD, id).append(MODIFICATION_DATE,
-				modificationDate).append(ENTRIES_FIELD, entries);
-		connection.getCollection(MongoConstants.BILLING_DATA_COLLECTION)
-				.updateOne(eq(ID_FIELD, id), new Document("$set", document), new UpdateOptions().upsert(true));
-		modified = false;
-	}
-
-	public boolean wasProcessed(String fileName, Date modificationDate, String datePrefix) {
-		final Bson filePerBillingPeriodCondition = and(regex(ID_FIELD, "^" + datePrefix), gte(MODIFICATION_DATE,
-				modificationDate));
-		final Bson fileWithExactNameCondition = and(eq(ID_FIELD, fileName), gte(MODIFICATION_DATE, modificationDate));
-		final FindIterable<Document> documents = connection.getCollection(MongoConstants.BILLING_DATA_COLLECTION)
-				.find(or(fileWithExactNameCondition, filePerBillingPeriodCondition))
-				.limit(1);
-		return documents.iterator().hasNext();
-	}
-
-	public void closeMongoConnection() throws IOException {
-		connection.close();
-	}
-
-
-	/**
-	 * Returns a string representation of the object.
-	 *
-	 * @param self the object to generate the string for (typically this), used only for its class name.
-	 */
-	public ToStringHelper toStringHelper(Object self) {
-		return MoreObjects.toStringHelper(self)
-				.addValue(entries);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this)
-				.toString();
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/ModuleType.java b/services/billing-aws/src/main/java/com/epam/dlab/core/ModuleType.java
deleted file mode 100644
index fd15ec2..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/ModuleType.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core;
-
-/** The type of billing modules: adapter, filter, parser or log appender.
- */
-public enum ModuleType {
-	ADAPTER,
-	FILTER,
-	PARSER,
-	LOGAPPENDER;
-	
-    @Override
-    public String toString() {
-        return super.toString().toLowerCase();
-    }
-
-    public static ModuleType of(String string) {
-        if (string != null) {
-            for (ModuleType value : ModuleType.values()) {
-                if (string.equalsIgnoreCase(value.toString())) {
-                    return value;
-                }
-            }
-        }
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/aggregate/AggregateGranularity.java b/services/billing-aws/src/main/java/com/epam/dlab/core/aggregate/AggregateGranularity.java
deleted file mode 100644
index b6803e8..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/aggregate/AggregateGranularity.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.core.aggregate;
-
-/** Aggregate granularity for aggregation. */
-public enum AggregateGranularity {
-	NONE,
-    DAY,
-    MONTH;
-
-    @Override
-    public String toString() {
-        return super.toString().toLowerCase();
-    }
-
-    public static AggregateGranularity of(String string) {
-        if (string != null) {
-            for (AggregateGranularity value : AggregateGranularity.values()) {
-                if (string.equalsIgnoreCase(value.toString())) {
-                    return value;
-                }
-            }
-        }
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/aggregate/DataAggregator.java b/services/billing-aws/src/main/java/com/epam/dlab/core/aggregate/DataAggregator.java
deleted file mode 100644
index e6f2285..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/aggregate/DataAggregator.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.aggregate;
-
-import com.epam.dlab.model.aws.ReportLine;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Vector;
-
-/**
- * Aggregate billing report and summarizes column usage and cost.
- */
-public class DataAggregator {
-	/**
-	 * List of the report lines.
-	 */
-	private final Vector<ReportLine> reportLines = new Vector<>(1000);
-
-	/**
-	 * Comparator for aggregation.
-	 */
-	private final Comparator<ReportLine> aggComparator = new AggComparator();
-
-	/**
-	 * Granularity for aggregation.
-	 */
-	private AggregateGranularity granularity;
-
-	/**
-	 * Length of date for truncate.
-	 */
-	private int truncateDateLength;
-
-
-	public DataAggregator(AggregateGranularity granularity) {
-		switch (granularity) {
-			case DAY:
-				truncateDateLength = 10;
-				break;
-			case MONTH:
-				truncateDateLength = 7;
-				break;
-			default:
-				throw new IllegalArgumentException("Invalid value of granularity argument: expected DAY or MONTH, " +
-						"actual is " + granularity);
-		}
-		this.granularity = granularity;
-	}
-
-	/**
-	 * Return granularity for aggregation.
-	 */
-	public AggregateGranularity getGranularity() {
-		return granularity;
-	}
-
-	/**
-	 * Appends the report line to the list and returns it.
-	 *
-	 * @param row the line of report.
-	 * @return Instance of the aggregated report line.
-	 */
-	public ReportLine append(ReportLine row) {
-		synchronized (this) {
-			String usageInterval = truncDate(row.getUsageDate());
-			row.setUsageDate(usageInterval);
-			int index = Collections.binarySearch(reportLines, row, aggComparator);
-			if (index < 0) {
-				index = -index;
-				if (index > reportLines.size()) {
-					reportLines.add(row);
-				} else {
-					reportLines.add(index - 1, row);
-				}
-			} else {
-				ReportLine found = reportLines.get(index);
-				found.setUsage(found.getUsage() + row.getUsage());
-				found.setCost(found.getCost() + row.getCost());
-				return found;
-			}
-		}
-
-		return row;
-	}
-
-	/**
-	 * Truncate given date for aggregates.
-	 *
-	 * @param date the date.
-	 * @return truncated date.
-	 */
-	private String truncDate(String date) {
-		if (date == null || date.length() <= truncateDateLength) {
-			return date;
-		}
-		return date.substring(0, truncateDateLength);
-	}
-
-	/**
-	 * Returns the number of the report lines in list.
-	 */
-	public int size() {
-		return reportLines.size();
-	}
-
-	/**
-	 * Returns the report line.
-	 *
-	 * @param index index of the report line.
-	 */
-	public ReportLine get(int index) {
-		return reportLines.get(index);
-	}
-
-	/**
-	 * Removes all of the elements from list.
-	 */
-	public void clear() {
-		reportLines.clear();
-	}
-
-	/**
-	 * Comparator for aggregation.
-	 */
-	private class AggComparator implements Comparator<ReportLine> {
-		@Override
-		public int compare(ReportLine o1, ReportLine o2) {
-			if (o1 == null) {
-				return (o2 == null ? 0 : -1);
-			} else if (o2 == null) {
-				return 1;
-			}
-
-			int result = StringUtils.compare(o1.getResourceId(), o2.getResourceId());
-			if (result == 0) {
-				result = StringUtils.compare(o1.getUsageType(), o2.getUsageType());
-				if (result == 0) {
-					result = StringUtils.compare(o1.getUsageDate(), o2.getUsageDate());
-					if (result == 0) {
-						result = StringUtils.compare(o1.getProduct(), o2.getProduct());
-						if (result == 0) {
-							result = StringUtils.compare(o1.getUser(), o2.getUser());
-							if (result == 0) {
-								return StringUtils.compare(o1.getDlabId(), o2.getDlabId());
-							}
-						}
-					}
-				}
-			}
-			return result;
-		}
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/aggregate/UsageDataList.java b/services/billing-aws/src/main/java/com/epam/dlab/core/aggregate/UsageDataList.java
deleted file mode 100644
index 5237290..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/aggregate/UsageDataList.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.aggregate;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/** List of usage dates the billing report data.
- */
-public class UsageDataList implements Iterable<String> {
-	/** List of dates. */
-	private final Map<String, Boolean> map = new HashMap<>();
-	
-	/** Appends the date to the list and returns it.
-	 * @param usageDate the date of data.
-	 * @return Instance of the range.
-	 */
-	public void append(String usageDate) {
-	    synchronized (this) {
-	    	if (!map.containsKey(usageDate)) {
-	    		map.put(usageDate, false);
-	    	}
-	    }
-	}
-
-	/** Returns the number of the range in list. */
-	public int size() {
-		return map.size();
-	}
-
-	/** Returns the value for date.
-	 * @param usageDate the date.
-	 */
-	public Boolean get(String usageDate) {
-		return map.get(usageDate);
-	}
-
-	/** Set the value of usageDate.
-	 * @param usageDate the date.
-	 */
-	public void set(String usageDate, boolean value) {
-		if (map.containsKey(usageDate)) {
-    		map.put(usageDate, value);
-    	}
-	}
-
-	/** Removes all of the elements from list.
-	 */
-	public void clear() {
-		map.clear();
-	}
-
-	@Override
-	public Iterator<String> iterator() {
-		return map.keySet().iterator();
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ColumnInfo.java b/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ColumnInfo.java
deleted file mode 100644
index c2f592f..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ColumnInfo.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-/** Describe the info of column mapping: source to target.
- */
-public class ColumnInfo {
-
-	/** The target column name. */
-	public final String targetName;
-	
-	/** The source column name. */
-	public final String sourceName;
-
-	/** The source column index. */
-	public final int sourceIndex;
-	
-	/** Instantiate the info of column mapping.
-	 * @param targetName the target column name. 
-	 * @param sourceName the source column name.
-	 * @param sourceIndex the source column index.
-	 */
-	public ColumnInfo(String targetName, String sourceName, int sourceIndex) {
-		this.targetName = targetName;
-		this.sourceName = sourceName;
-		this.sourceIndex = sourceIndex;
-	}
-	
-	@Override
-	public String toString() {
-		return targetName + "=" + (sourceName == null ? "" : sourceName + "[" + String.valueOf(sourceIndex) + "]");
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ColumnMeta.java b/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ColumnMeta.java
deleted file mode 100644
index 42b40f0..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ColumnMeta.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.*;
-
-/**
- * Provides column meta information.
- */
-public class ColumnMeta {
-	private static final Logger LOGGER = LoggerFactory.getLogger(ColumnMeta.class);
-
-	/**
-	 * Character for separate the tag values and column names.
-	 */
-	public static final char TAG_SEPARATOR = ',';
-	/**
-	 * Character for separate the column mapping.
-	 */
-	public static final char MAPPING_COLUMN_SEPARATOR = ';';
-
-	/**
-	 * The column names for common format.
-	 */
-	static final String[] COLUMN_NAMES = {
-			ReportLine.FIELD_DLAB_ID,
-			ReportLine.FIELD_USER_ID,
-			ReportLine.FIELD_USAGE_DATE,
-			ReportLine.FIELD_PRODUCT,
-			ReportLine.FIELD_USAGE_TYPE,
-			ReportLine.FIELD_USAGE,
-			ReportLine.FIELD_COST,
-			ReportLine.FIELD_CURRENCY_CODE,
-			ReportLine.FIELD_RESOURCE_ID,
-			ReportLine.FIELD_TAGS
-	};
-
-	/**
-	 * The index of the first column for tags.
-	 */
-	public static final int TAG_COLUMN_INDEX = COLUMN_NAMES.length - 1;
-
-	/**
-	 * The list of target column names.
-	 */
-	private List<String> targetColumnNames;
-
-	/**
-	 * The list of source column names.
-	 */
-	private final List<String> sourceColumnNames;
-
-	/**
-	 * The list of column mapping: source to target.
-	 */
-	private List<ColumnInfo> columnMapping;
-
-
-	/**
-	 * Instantiate the common format parser. <b>columnMappingString</b> is semicolon separated
-	 * string with key=value as target=source columns name or indexes of source column. For example,<br>
-	 * "accountId=PayerAccountId;usageIntervalStart=UsageStartDate;usageIntervalEnd=UsageEndDate; ...
-	 * ;tags=user:tag1,user:tag2,user:tagN".
-	 *
-	 * @param columnMappingString column mapping: source to target. if <b>null</b>
-	 *                            the source data will be converted without mapping.
-	 * @param sourceColumnNames   the source column names.
-	 * @throws InitializationException
-	 */
-	public ColumnMeta(String columnMappingString, List<String> sourceColumnNames) throws InitializationException {
-		this.sourceColumnNames = sourceColumnNames;
-		if (columnMappingString != null) {
-			try {
-				setColumnMapping(columnMappingString, sourceColumnNames);
-			} catch (Exception e) {
-				throw new InitializationException("Column mapping error. " + e.getLocalizedMessage(), e);
-			}
-		}
-	}
-
-
-	/**
-	 * Return the list of target column names.
-	 */
-	public List<String> getTargetColumnNames() {
-		return targetColumnNames;
-	}
-
-	/**
-	 * Return the list of source column names.
-	 */
-	public List<String> getSourceColumnNames() {
-		return sourceColumnNames;
-	}
-
-	/**
-	 * Return the list of column mapping: source to target.
-	 */
-	public List<ColumnInfo> getColumnMapping() {
-		return columnMapping;
-	}
-
-
-	/**
-	 * Return the index of column in the list <b>columnNames</b> or throw exception {@link InitializationException}
-	 *
-	 * @param columnName  the name of column.
-	 * @param columnNames the list of column names.
-	 * @return the index of column.
-	 * @throws InitializationException if column not found in the list of columns.
-	 */
-	public static int getColumnIndexByName(String columnName, List<String> columnNames) throws
-			InitializationException {
-		for (int i = 0; i < columnNames.size(); i++) {
-			if (columnName.equals(columnNames.get(i))) {
-				return i;
-			}
-		}
-		throw new InitializationException("Column index not detected for column \"" + columnName + "\"");
-	}
-
-	/**
-	 * Return the index of column in the list <b>columnNames</b> or throw exception {@link InitializationException}.
-	 * columnName may be present as column index. For example like this "$2" for second column.
-	 *
-	 * @param columnName  the name of column or index.
-	 * @param columnNames the list of column names.
-	 * @return the index of column.
-	 * @throws InitializationException if column not found in the list of columns.
-	 */
-	private static int getColumnIndex(String columnName, List<String> columnNames) throws InitializationException {
-		if (columnName.startsWith("$")) {
-			try {
-				return Integer.parseInt(columnName.substring(1)) - 1;
-			} catch (NumberFormatException e) {
-				// Not a column index but column name
-			}
-		}
-		if (columnNames == null) {
-			throw new InitializationException("Invalid column index \"" + columnName + "\"");
-		}
-		return getColumnIndexByName(columnName, columnNames);
-	}
-
-	/**
-	 * Return the index of column in the list <b>columnNames</b> or throw exception {@link InitializationException}.
-	 * columnName may be present as column index. For example like this "$2" for second column.
-	 *
-	 * @param columnName the name of column or index.
-	 * @return the index of column.
-	 * @throws InitializationException if column not found in the list of columns.
-	 */
-	private static int getColumnIndex(String columnName) throws InitializationException {
-		ArrayList<String> list = new ArrayList<String>(COLUMN_NAMES.length);
-		for (String s : COLUMN_NAMES) {
-			list.add(s);
-		}
-		return getColumnIndexByName(columnName, list);
-	}
-
-	/**
-	 * Create map of target and source columns for column mapping. Key of map is target column, the value
-	 * is source column. <b>columnMappingString</b> is semicolon separated string with key=value as
-	 * target=source columns name or indexes of source column. For example,<br>
-	 * "accountId=PayerAccountId;usageIntervalStart=UsageStartDate;usageIntervalEnd=UsageEndDate; ...
-	 * ;tags=user:tag1,user:tag2,user:tagN".
-	 *
-	 * @param columnMappingString column mapping: source to target.
-	 * @param sourceColumnNames
-	 * @return Map of target and source columns for column mapping.
-	 * @throws InitializationException
-	 */
-	private Map<String, String> getSourceToTarget(String columnMappingString, List<String> sourceColumnNames) throws
-			InitializationException {
-		String[] entries = StringUtils.split(columnMappingString, MAPPING_COLUMN_SEPARATOR);
-		Map<String, String> sourceToTarget = new HashMap<String, String>();
-
-		for (String entry : entries) {
-			if (entry.trim().isEmpty() || !entry.contains("=")) {
-				throw new InitializationException("Invalid the entry \"" + entry + "\"in column mapping");
-			}
-			String[] pair = StringUtils.split(entry, '=');
-			if (pair.length != 2) {
-				throw new InitializationException("Invalid the entry \"" + entry + "\"in column mapping");
-			}
-
-			pair[0] = pair[0].trim();
-			pair[1] = pair[1].trim();
-
-			try {
-				int index = getColumnIndex(pair[0]);
-				pair[0] = COLUMN_NAMES[index];
-			} catch (InitializationException e) {
-				throw new InitializationException("Unkown target column \"" + pair[0] + "\".", e);
-			}
-
-			try {
-				if (!pair[0].equals(ReportLine.FIELD_TAGS)) {
-					int index = getColumnIndex(pair[1], sourceColumnNames);
-					if (sourceColumnNames != null) {
-						pair[1] = sourceColumnNames.get(index);
-					}
-				}
-			} catch (InitializationException e) {
-				if (sourceColumnNames == null) {
-					throw new InitializationException("Invalid column index \"" + pair[1] + "\" or column header not " +
-							"defined");
-				}
-				throw new InitializationException("Unkown source column \"" + pair[1] + "\".", e);
-			}
-			sourceToTarget.put(pair[0], pair[1]);
-		}
-
-		return sourceToTarget;
-	}
-
-	/**
-	 * Initialize and set column mapping. <b>columnMappingString</b> is semicolon separated string with key=value as
-	 * target=source columns name or indexes of source column. For example,<br>
-	 * "accountId=PayerAccountId;usageIntervalStart=UsageStartDate;usageIntervalEnd=UsageEndDate; ...
-	 * ;tags=user:tag1,user:tag2,user:tagN".
-	 *
-	 * @param columnMappingString column mapping: source to target. if <b>null</b>
-	 *                            the source data will be converted without mapping.
-	 * @param sourceColumnNames   the list of source column names.
-	 * @throws InitializationException
-	 */
-	private void setColumnMapping(String columnMappingString, List<String> sourceColumnNames) throws
-			InitializationException {
-		if (columnMappingString == null) {
-			throw new InitializationException("Mapping not defined.");
-		}
-
-		Map<String, String> sourceToTarget = getSourceToTarget(columnMappingString, sourceColumnNames);
-		String tags = sourceToTarget.get(ReportLine.FIELD_TAGS);
-		List<String> tagColumns = (tags == null ? null :
-				Arrays.asList(StringUtils.split(tags, TAG_SEPARATOR)));
-
-		LOGGER.info("Mapping columns [target=source:name[index]]:");
-		int columnCount = COLUMN_NAMES.length - 1;
-		int tagCount = (tagColumns == null ? 0 : tagColumns.size());
-		columnMapping = new ArrayList<ColumnInfo>(columnCount + tagCount);
-		targetColumnNames = new ArrayList<String>(columnCount + tagCount);
-
-		for (int i = 0; i < columnCount; i++) {
-			String sourceName = sourceToTarget.get(COLUMN_NAMES[i]);
-			ColumnInfo columnInfo = new ColumnInfo(
-					COLUMN_NAMES[i],
-					sourceName,
-					(sourceName == null ? -1 : getColumnIndex(sourceName, sourceColumnNames)));
-			columnMapping.add(columnInfo);
-			targetColumnNames.add(COLUMN_NAMES[i]);
-			LOGGER.info("  " + columnInfo.toString());
-		}
-
-		for (int i = 0; i < tagCount; i++) {
-			String sourceName = tagColumns.get(i).trim();
-			int sourceIndex = getColumnIndex(sourceName, sourceColumnNames);
-			if (sourceColumnNames != null) {
-				sourceName = sourceColumnNames.get(sourceIndex);
-			}
-			ColumnInfo columnInfo = new ColumnInfo(
-					ReportLine.FIELD_TAGS,
-					sourceName,
-					sourceIndex);
-			columnMapping.add(columnInfo);
-			targetColumnNames.add(sourceName);
-			LOGGER.info("  " + columnInfo.toString());
-		}
-	}
-
-
-	/**
-	 * Returns a string representation of the object.
-	 *
-	 * @param self the object to generate the string for (typically this), used only for its class name.
-	 */
-	public ToStringHelper toStringHelper(Object self) {
-		return MoreObjects.toStringHelper(self)
-				.add("targetColumnNames", targetColumnNames)
-				.add("sourceColumnNames", sourceColumnNames)
-				.add("columnMapping", columnMapping);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/CommonFormat.java b/services/billing-aws/src/main/java/com/epam/dlab/core/parser/CommonFormat.java
deleted file mode 100644
index e07ae0b..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/CommonFormat.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import com.epam.dlab.exceptions.ParseException;
-import com.epam.dlab.model.aws.ReportLine;
-import org.apache.commons.lang3.StringUtils;
-
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-
-/**
- * Provides common format features.
- */
-public class CommonFormat {
-	/**
-	 * Character for separate field names and values.
-	 */
-	public static final char FIELD_SEPARATOR = ',';
-
-	/**
-	 * Character for termination field names and values.
-	 */
-	public static final char FIELD_DELIMITER = '"';
-
-	/**
-	 * Escape character.
-	 */
-	public static final char ESCAPE_CHAR = '\\';
-
-	/**
-	 * Default character used for decimal sign.
-	 */
-	public static final char DECIMAL_SEPARATOR_DEFAULT = '.';
-
-	/**
-	 * Default character used for thousands separator.
-	 */
-	public static final char DECIMAL_GROUPING_SEPARATOR_DEFAULT = ' ';
-
-	/**
-	 * String of the field separator for replacement to target data.
-	 */
-	private static final String DELIMITER_REPLACE_FROM = String.valueOf(FIELD_DELIMITER);
-
-	/**
-	 * String of the escaped field separator for replacement to target data.
-	 */
-	private static final String DELIMITER_REPLACE_TO = new StringBuilder()
-			.append(ESCAPE_CHAR)
-			.append(FIELD_DELIMITER)
-			.toString();
-
-	/**
-	 * Formatter for convert decimal numbers to string.
-	 */
-	private static final DecimalFormat DECIMAL_TO_STRING_FORMAT;
-
-	static {
-		DECIMAL_TO_STRING_FORMAT = new DecimalFormat();
-		DecimalFormatSymbols symbols = new DecimalFormatSymbols();
-		symbols.setDecimalSeparator(DECIMAL_SEPARATOR_DEFAULT);
-		DECIMAL_TO_STRING_FORMAT.setDecimalFormatSymbols(symbols);
-		DECIMAL_TO_STRING_FORMAT.setGroupingUsed(false);
-		DECIMAL_TO_STRING_FORMAT.setMaximumFractionDigits(100);
-	}
-
-
-	/**
-	 * Column meta information.
-	 */
-	private final ColumnMeta columnMeta;
-
-	/**
-	 * Formatter for parse of decimal number .
-	 */
-	private final DecimalFormat sourceDecimalFormat;
-
-
-	/**
-	 * Instantiate the helper for common format.
-	 *
-	 * @param columnMeta column meta information.
-	 */
-	public CommonFormat(ColumnMeta columnMeta) {
-		this(columnMeta, DECIMAL_SEPARATOR_DEFAULT, DECIMAL_GROUPING_SEPARATOR_DEFAULT);
-	}
-
-	/**
-	 * Instantiate the helper for common format.
-	 *
-	 * @param columnMeta        column meta information.
-	 * @param decimalSeparator  the character used for decimal sign.
-	 * @param groupingSeparator the character used for thousands separator.
-	 */
-	public CommonFormat(ColumnMeta columnMeta, char sourceDecimalSeparator, char sourceGroupingSeparator) {
-		this.columnMeta = columnMeta;
-		this.sourceDecimalFormat = getDecimalFormat(sourceDecimalSeparator, sourceGroupingSeparator);
-	}
-
-
-	/**
-	 * Create and return the target row for common format from source.
-	 *
-	 * @param sourceRow the source row.
-	 * @return row in common format.
-	 * @throws ParseException
-	 */
-	public ReportLine toCommonFormat(List<String> sourceRow) throws ParseException {
-		if (columnMeta.getColumnMapping() == null) {
-			return toReportLine(sourceRow);
-		}
-
-		List<String> targetRow = new ArrayList<String>();
-		for (ColumnInfo columnInfo : columnMeta.getColumnMapping()) {
-			targetRow.add((columnInfo.sourceIndex < 0 ? "" :
-					(columnInfo.sourceIndex < sourceRow.size() ? sourceRow.get(columnInfo.sourceIndex) : null)));
-		}
-		return toReportLine(targetRow);
-	}
-
-	/**
-	 * Add the column value to string in CSV format.
-	 *
-	 * @param sb    the buffer of sting.
-	 * @param value the value.
-	 * @return the buffer of string.
-	 */
-	private static StringBuilder addToStringBuilder(StringBuilder sb, String value) {
-		if (sb.length() > 0) {
-			sb.append(FIELD_SEPARATOR);
-		}
-		return sb.append(FIELD_DELIMITER)
-				.append(StringUtils.replace(value, DELIMITER_REPLACE_FROM, DELIMITER_REPLACE_TO))
-				.append(FIELD_DELIMITER);
-	}
-
-	/**
-	 * Convert row to line in CSV format.
-	 *
-	 * @param row row for convertation.
-	 * @return string in CSV format.
-	 */
-	public static String rowToString(List<String> row) {
-		StringBuilder sb = new StringBuilder();
-		for (String s : row) {
-			addToStringBuilder(sb, s);
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Convert row to line in CSV format.
-	 *
-	 * @param row row for convertation.
-	 * @return string in CSV format.
-	 */
-	public static String rowToString(ReportLine row) {
-		StringBuilder sb = new StringBuilder();
-
-		addToStringBuilder(sb, row.getDlabId());
-		addToStringBuilder(sb, row.getUser());
-		addToStringBuilder(sb, row.getUsageDate());
-		addToStringBuilder(sb, row.getProduct());
-		addToStringBuilder(sb, row.getUsageType());
-		addToStringBuilder(sb, doubleToString(row.getUsage()));
-		addToStringBuilder(sb, doubleToString(row.getCost()));
-		addToStringBuilder(sb, row.getCurrencyCode());
-		addToStringBuilder(sb, row.getResourceType().toString());
-		addToStringBuilder(sb, row.getResourceId());
-
-		if (row.getTags() != null) {
-			for (String key : row.getTags().keySet()) {
-				addToStringBuilder(sb, row.getTags().get(key));
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Create and return decimal formatter.
-	 *
-	 * @param decimalSeparator  the character used for decimal sign.
-	 * @param groupingSeparator the character used for thousands separator.
-	 * @return Formatter for decimal digits.
-	 */
-	private DecimalFormat getDecimalFormat(char decimalSeparator, char groupingSeparator) {
-		DecimalFormat df = new DecimalFormat();
-		DecimalFormatSymbols symbols = new DecimalFormatSymbols();
-		symbols.setDecimalSeparator(decimalSeparator);
-		symbols.setGroupingSeparator(groupingSeparator);
-		df.setDecimalFormatSymbols(symbols);
-		return df;
-	}
-
-	/**
-	 * Parse and return double value. If value is <b>null</b> or empty return zero.
-	 *
-	 * @param columnName the name of column.
-	 * @param value      the value.
-	 * @throws ParseException
-	 */
-	public double parseDouble(String columnName, String value) throws ParseException {
-		if (value == null || value.trim().isEmpty()) {
-			return 0;
-		}
-		try {
-			return sourceDecimalFormat.parse(value).doubleValue();
-		} catch (Exception e) {
-			throw new ParseException("Cannot cast column " + columnName + " value \"" + value + "\" to double: " + e
-					.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Return the string representation of double value.
-	 *
-	 * @param value the value.
-	 */
-	public static String doubleToString(double value) {
-		return DECIMAL_TO_STRING_FORMAT.format(value);
-	}
-
-	/**
-	 * Creates and returns the line of billing report from the list of values.
-	 *
-	 * @param row the list of values.
-	 * @return the line of billing report.
-	 * @throws ParseException
-	 */
-	public ReportLine toReportLine(List<String> row) throws ParseException {
-		if (row.size() < ColumnMeta.TAG_COLUMN_INDEX || row.size() > columnMeta.getTargetColumnNames().size()) {
-			throw new ParseException("Invalid the number of columns in list: expected from " + ColumnMeta
-					.TAG_COLUMN_INDEX +
-					" to " + columnMeta.getTargetColumnNames().size() + ", actual " + row.size());
-		}
-		ReportLine line = new ReportLine();
-		int i = 0;
-
-		line.setDlabId(row.get(i));
-		line.setUser(row.get(++i));
-		line.setUsageDate(row.get(++i));
-		line.setProduct(row.get(++i));
-		line.setUsageType(row.get(++i));
-		line.setUsage(parseDouble("usage", row.get(++i)));
-		line.setCost(parseDouble("cost", row.get(++i)));
-		line.setCurrencyCode(row.get(++i));
-		line.setResourceTypeId(row.get(++i));
-
-		if (row.size() >= ColumnMeta.TAG_COLUMN_INDEX) {
-			LinkedHashMap<String, String> tags = new LinkedHashMap<>();
-			i++;
-			while (i < row.size()) {
-				tags.put(columnMeta.getTargetColumnNames().get(i), row.get(i++));
-			}
-			line.setTags(tags);
-		}
-
-		return line;
-	}
-
-
-	/**
-	 * Print row to console.
-	 *
-	 * @param row array of values.
-	 */
-	public static void printRow(String[] row) {
-		System.out.print(" | ");
-		for (String s : row) {
-			System.out.print(s + " | ");
-		}
-		System.out.println();
-	}
-
-	/**
-	 * Print row to console.
-	 *
-	 * @param row list of values.
-	 */
-	public static void printRow(List<String> row) {
-		printRow(row.toArray(new String[row.size()]));
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ConditionEvaluate.java b/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ConditionEvaluate.java
deleted file mode 100644
index 708fea8..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ConditionEvaluate.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.jexl3.JexlBuilder;
-import org.apache.commons.jexl3.JexlContext;
-import org.apache.commons.jexl3.JexlEngine;
-import org.apache.commons.jexl3.MapContext;
-import org.apache.commons.jexl3.internal.Script;
-import org.apache.commons.lang3.StringUtils;
-
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-/** Evaluate condition for filtering source data.
- */
-public class ConditionEvaluate {
-
-	/** Names of columns for condition. */
-	private String [] columnNames;
-
-	/** Indexes of columns for condition. */
-	private int [] columnIndexes;
-
-	/** JEXL expression for evaluation. */
-	private final Script expression;
-
-	/** JEXL context to evaluate row. */
-	private final JexlContext jexlContext;
-	
-	/** Instantiate the engine to evaluate condition. 
-	 * @param columnNames the list of column names.
-	 * @param condition condition for filtering data.
-	 * @throws InitializationException
-	 */
-	public ConditionEvaluate(List<String> columnNames, String condition) throws InitializationException {
-		//Replace : to . in column names
-		List<String> colNames = new ArrayList<>(columnNames.size());
-		for (int i = 0; i < columnNames.size(); i++) {
-			String name = columnNames.get(i);
-			if (name.indexOf(':') > -1 && condition.indexOf(name) > -1) {
-				String newName = StringUtils.replaceChars(name, ':', '.');
-				colNames.add(newName);
-				condition = StringUtils.replace(condition, name, newName);
-			} else {
-				colNames.add(name);
-			}
-		}
-
-		try {
-			JexlEngine engine = new JexlBuilder().strict(true).silent(false).debug(true).create();
-			expression = (Script) engine.createExpression(condition);
-			jexlContext = new MapContext();
-		} catch (Exception e) {
-			throw new InitializationException("Cannot initialize JEXL engine for condition: " + condition + ". " +
-							e.getLocalizedMessage(), e);
-		}
-		
-		// Create mapping of columns for evaluations. 
-		List<String> names = new ArrayList<>();
-		List<Integer> indexes = new ArrayList<>();
-		for (List<String> variableList : expression.getVariables()) {
-			String columnName = StringUtils.join(variableList, '.');
-			int index = getColumnIndex(colNames, columnName);
-	    	if (index == -1) {
-	    		throw new InitializationException("Unknow source column name \"" + columnName + "\" in condition: " +
-	    				expression.getSourceText() + ". Known column names: " + StringUtils.join(columnNames, ", ") + ".");
-	    	}
-	    	names.add(columnName);
-	    	indexes.add(index);
-		}
-		
-		this.columnNames = new String[names.size()];
-		this.columnIndexes = new int[indexes.size()];
-		for (int i = 0; i < indexes.size(); i++) {
-			this.columnNames[i] = names.get(i);
-			this.columnIndexes[i] = indexes.get(i);
-		}
-	}
-	
-	/** Find and return the index of column in the given column list.
-	 * @param columnNames the list of column names.
-	 * @param columnName the name of column to find.
-	 */
-	private int getColumnIndex(List<String> columnNames, String columnName) {
-		for (int i = 0; i < columnNames.size(); i++) {
-			if (columnName.equals(columnNames.get(i))) {
-				return i;
-			}
-		}
-		return -1;
-	}
-	
-	/** Evaluate condition for given row.
-	 * @param row the row to evaluate.
-	 * @return <true> if condition is true.
-	 * @throws ParseException if condition is not return boolean type.
-	 */
-	public boolean evaluate(List<String> row) throws ParseException {
-		for (int i = 0; i < columnNames.length; i++) {
-			jexlContext.set(columnNames[i], row.get(columnIndexes[i]));
-		}
-	    Object value;
-	    try {
-	    	value = expression.evaluate(jexlContext);
-	    } catch (Exception e) {
-	    	throw new ParseException("Cannot evaluate condition: " + expression.getSourceText() + ". " +
-	    				e.getLocalizedMessage(), e);
-	    }
-		if (value instanceof Boolean) {
-			return (Boolean)value;
-		}
-	    throw new ParseException("Invalid condition: " + expression.getSourceText());
-	}
-
-	
-	/** Returns a string representation of the object.
-	 * @param self the object to generate the string for (typically this), used only for its class name.
-	 */
-	public ToStringHelper toStringHelper(Object self) {
-    	return MoreObjects.toStringHelper(self)
-    			.add("columnNames",  columnNames)
-    			.add("columnIndexes", columnIndexes);
-    }
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ParserBase.java b/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ParserBase.java
deleted file mode 100644
index bfd86bc..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ParserBase.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import com.epam.dlab.core.AdapterBase;
-import com.epam.dlab.core.FilterBase;
-import com.epam.dlab.core.ModuleBase;
-import com.epam.dlab.core.aggregate.AggregateGranularity;
-import com.epam.dlab.core.aggregate.DataAggregator;
-import com.epam.dlab.exceptions.AdapterException;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import org.apache.commons.lang3.StringUtils;
-import org.bson.Document;
-
-import javax.validation.constraints.NotNull;
-import java.util.ArrayList;
-import java.util.List;
-
-/** Abstract module of parser.<br>
- * See description of {@link ModuleBase} how to create your own parser.
- */
-public abstract class ParserBase extends ModuleBase {
-	
-	/** Default character used for decimal sign. */
-	public static final char DECIMAL_SEPARATOR_DEFAULT = '.';
-	
-	/** Default character used for thousands separator. */
-	public static final char DECIMAL_GROUPING_SEPARATOR_DEFAULT = ' ';
-	
-	/** Name of key for date report data. */
-	public static final String DATA_KEY_START_DATE = "ParserBase.maxStartDate";
-
-	
-	/** Mapping columns from source format to target. */
-	@JsonProperty
-	private String columnMapping = null;
-	
-	/** Where condition for filtering the source data. */
-	@JsonProperty
-	private String whereCondition = null;
-	
-	/** How to aggregate the parsed data. */
-	@JsonProperty
-	@NotNull
-	private AggregateGranularity aggregate = AggregateGranularity.NONE;
-	
-	/** Character used for decimal sign of source data. */
-	@JsonProperty
-	@NotNull
-	private char decimalSeparator = DECIMAL_SEPARATOR_DEFAULT;
-	
-	/** Character used for thousands separator of source data. */
-	@JsonProperty
-	@NotNull
-	private char groupingSeparator = DECIMAL_GROUPING_SEPARATOR_DEFAULT;
-
-
-	/** Adapter for reading source data. */
-	@JsonIgnore
-	private AdapterBase adapterIn;
-	
-	/** Adapter for writing converted data. */
-	@JsonIgnore
-	private AdapterBase adapterOut;
-	
-	/** Filter for source and converted data. */
-	@JsonIgnore
-	private FilterBase filter;
-
-
-	/** Column meta information. */
-	@JsonIgnore
-	private ColumnMeta columnMeta;
-	
-	/** Condition for filtering the source data. */
-	@JsonIgnore
-	private ConditionEvaluate condition;
-	
-	/** Aggregator of billing report.*/
-	@JsonIgnore
-	private DataAggregator aggregator;
-	
-	/** Common format helper. */
-	@JsonIgnore
-	private CommonFormat commonFormat;
-
-	/** Parser statistics. */
-	@JsonIgnore
-	private final List<ParserStatistics> statistics = new ArrayList<>();
-	
-	/** Current parser statistics. */
-	@JsonIgnore
-	ParserStatistics currentStatistics = null; 
-	
-	
-	/** Return mapping columns from source format to target. */
-	public String getColumnMapping() {
-		return columnMapping;
-	}
-
-	/** Set mapping columns from source format to target. */
-	public void setColumnMapping(String columnMapping) {
-		this.columnMapping = columnMapping;
-	}
-
-	/** Return where condition for filtering the source data. */
-	public String getWhereCondition() {
-		return whereCondition;
-	}
-
-	/** Set where condition for filtering the source data. */
-	public void setWhereCondition(String whereCondition) {
-		this.whereCondition = whereCondition;
-	}
-
-	/** Return how to aggregate the parsed data. */
-	public AggregateGranularity getAggregate() {
-		return aggregate;
-	}
-
-	/** Set how to aggregate the parsed data.
-	 * @throws InitializationException */
-	public void setAggregate(String aggregate) throws InitializationException {
-		if (aggregate == null) {
-			throw new InitializationException("Property aggregate cannot be null");
-		}
-		AggregateGranularity value = AggregateGranularity.of(aggregate);
-        if (value == null) {
-        	throw new InitializationException("Invalid value \"" + aggregate + "\" for property aggregate. " +
-					"Should be one of: " + StringUtils.join(AggregateGranularity.values(), ", "));
-        }
-		this.aggregate = value;
-	}
-
-	/** Return character used for decimal sign of source data. */
-	public char getDecimalSeparator() {
-		return decimalSeparator;
-	}
-	
-	/** Set character used for decimal sign of source data. */
-	public void setDecimalSeparator(char decimalSeparator) {
-		this.decimalSeparator = decimalSeparator;
-	}
-	
-	/** Return character used for thousands separator of source data. */
-	public char getGroupingSeparator() {
-		return groupingSeparator;
-	}
-	
-	/** Set character used for thousands separator of source data. */
-	public void setGroupingSeparator(char groupingSeparator) {
-		this.groupingSeparator = groupingSeparator;
-	}
-	
-	
-	/** Return the adapter for reading source data. */
-	public AdapterBase getAdapterIn() {
-		return adapterIn;
-	}
-
-	/** Return the adapter for writing converted data. */
-	public AdapterBase getAdapterOut() {
-		return adapterOut;
-	}
-	
-	/** Return the filter for source and converted data. */
-	public FilterBase getFilter() {
-		return filter;
-	}
-
-	/** Return the column meta information. */
-	public ColumnMeta getColumnMeta() {
-		return columnMeta;
-	}
-	
-	/** Return the condition for filtering the source data. */
-	public ConditionEvaluate getCondition() {
-		return condition;
-	}
-	
-	/** Return the aggregator of billing report.*/
-	public DataAggregator getAggregator() {
-		return aggregator;
-	}
-	
-	/** Return the common format helper. */
-	public CommonFormat getCommonFormat() {
-		return commonFormat;
-	}
-	
-	/** Return the parser statistics. */
-	public List<ParserStatistics> getStatistics() {
-		return statistics;
-	}
-	
-	/** Add and return the new instance for statistics.
-	 * @param entryName the name of new entry.
-	 */
-	public ParserStatistics addStatistics(String entryName) {
-		currentStatistics = new ParserStatistics(entryName);
-		statistics.add(currentStatistics);
-		return currentStatistics;
-	}
-	
-	/** Return the current parser statistics. */
-	public ParserStatistics getCurrentStatistics() {
-		return currentStatistics;
-	}
-
-	
-	/** Initialize the parser.
-	 * @throws InitializationException
-	 */
-	public abstract void initialize()  throws InitializationException;
-
-	/**
-	 * Parse the source data to common format and write it to output adapter.
-	 *
-	 * @return
-	 * @throws InitializationException
-	 * @throws AdapterException
-	 * @throws ParseException
-	 */
-	public abstract List<Document> parse() throws InitializationException, AdapterException, ParseException;
-	
-	/** Build parser from given modules.
-	 * @param adapterIn the adapter for reading source data.
-	 * @param adapterOut the adapter for writing converted data.
-	 * @param filter the filter for source and converted data. May be <b>null<b>.
-	 */
-	public ParserBase build(AdapterBase adapterIn, AdapterBase adapterOut, FilterBase filter) {
-		this.adapterIn = adapterIn;
-		this.adapterOut = adapterOut;
-		if (filter != null) {
-			filter.setParser(this);
-		}
-		this.filter = filter;
-		return this;
-	}
-	
-	
-	/** Initialize ParserBase.
-	 * @param header - the header of source data.
-	 * @throws InitializationException
-	 * @throws AdapterException
-	 */
-	protected void init(List<String> header) throws InitializationException, AdapterException {
-		columnMeta = new ColumnMeta(columnMapping, header);
-		if (whereCondition != null) {
-			if (columnMeta.getSourceColumnNames() == null) {
-				throw new InitializationException("To use the whereCondition property you must specify and have the header of source data");
-			}
-			condition = new ConditionEvaluate(columnMeta.getSourceColumnNames(), whereCondition);
-		} else {
-			condition = null;
-		}
-		commonFormat = new CommonFormat(columnMeta, decimalSeparator, groupingSeparator);
-
-		if (aggregate != AggregateGranularity.NONE) {
-			aggregator = new DataAggregator(aggregate);
-		}
-
-		if (getAdapterOut().isWriteHeader()) {
-			getAdapterOut().writeHeader(columnMeta.getTargetColumnNames());
-		}
-	}
-	
-	
-	/** Return the index of source column by column name. 
-	 * @param columnName the name of column.
-	 * @throws InitializationException
-	 */
-	public int getSourceColumnIndexByName(String columnName) throws InitializationException {
-		return ColumnMeta.getColumnIndexByName(columnName, columnMeta.getSourceColumnNames());
-	}
-	
-	
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-    	return super.toStringHelper(self)
-    			.add("adapterIn", (adapterIn == null ? null : adapterIn.getType()))
-    			.add("adapterOut", (adapterOut == null ? null : adapterOut.getType()))
-    			.add("filter", (filter == null ? null : filter.getType()))
-    			.add("columnMapping", columnMapping)
-    			.add("whereCondition", whereCondition)
-    			.add("aggregate", aggregate)
-    			.add("decimalSeparator", decimalSeparator)
-    			.add("groupingSeparator", groupingSeparator);
-    }
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ParserByLine.java b/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ParserByLine.java
deleted file mode 100644
index d878cb9..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ParserByLine.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import com.epam.dlab.core.ModuleBase;
-import com.epam.dlab.core.aggregate.AggregateGranularity;
-import com.epam.dlab.exceptions.AdapterException;
-import com.epam.dlab.exceptions.GenericException;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.bson.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Abstract module of parser by the line.<br>
- * See description of {@link ModuleBase} how to create your own parser.
- */
-public abstract class ParserByLine extends ParserBase {
-	private static final Logger LOGGER = LoggerFactory.getLogger(ParserByLine.class);
-
-	/**
-	 * Parse the header of source data and return it.
-	 *
-	 * @return the header of source data.
-	 * @throws AdapterException
-	 * @throws ParseException
-	 */
-	public abstract List<String> parseHeader() throws AdapterException, ParseException;
-
-	/**
-	 * Parse the row from source line and return result row.
-	 *
-	 * @param line the source line.
-	 * @return the parsed row.
-	 * @throws ParseException
-	 */
-	public abstract List<String> parseRow(String line) throws ParseException;
-
-	/**
-	 * Read the line from adapter and return it.
-	 *
-	 * @return the parsed row from adapterIn.
-	 * @throws AdapterException
-	 * @throws ParseException
-	 */
-	@JsonIgnore
-	public String getNextRow() throws AdapterException, ParseException {
-		String line = getAdapterIn().readLine();
-		if (line == null) {
-			return null;
-		}
-		getCurrentStatistics().incrRowReaded();
-		return line;
-	}
-
-	/**
-	 * Initialize ParserBase.
-	 *
-	 * @throws InitializationException
-	 * @throws AdapterException
-	 * @throws ParseException
-	 */
-	protected boolean init() throws InitializationException, AdapterException, ParseException {
-		getAdapterIn().open();
-		LOGGER.debug("Source data has multy entry {}", getAdapterIn().hasMultyEntry());
-		if (!initEntry()) {
-			return false;
-		}
-		getAdapterOut().open();
-		return true;
-	}
-
-	/**
-	 * Initialize for each entry ParserBase.
-	 *
-	 * @throws InitializationException
-	 * @throws AdapterException
-	 * @throws ParseException
-	 */
-	private boolean initEntry() throws InitializationException, AdapterException, ParseException {
-		if (getAdapterIn().hasMultyEntry() && !getAdapterIn().hasEntryData()) {
-			return false;
-		}
-		addStatistics(getAdapterIn().getEntryName());
-		getCurrentStatistics().start();
-
-		super.init(parseHeader());
-		initialize();
-		if (getFilter() != null) {
-			getFilter().initialize();
-		}
-		return true;
-	}
-
-	/**
-	 * Close adapters.
-	 *
-	 * @throws AdapterException
-	 */
-	protected void close(boolean silent) throws AdapterException {
-		AdapterException ex = null;
-		try {
-			getAdapterIn().close();
-		} catch (Exception e) {
-			if (silent) {
-				LOGGER.warn("Cannot close adapterIn. {}", e.getLocalizedMessage(), e);
-			} else {
-				ex = new AdapterException("Cannot close adapterIn. " + e.getLocalizedMessage(), e);
-			}
-		}
-		try {
-			getAdapterOut().close();
-		} catch (Exception e) {
-			if (silent || ex != null) {
-				LOGGER.warn("Cannot close adapterOut. {}", e.getLocalizedMessage(), e);
-			} else {
-				ex = new AdapterException("Cannot close adapterOut. " + e.getLocalizedMessage(), e);
-			}
-		}
-		try {
-			getModuleData().closeMongoConnection();
-		} catch (IOException e) {
-			if (silent || ex != null) {
-				LOGGER.warn("Cannot close mongo connection. {}", e.getLocalizedMessage(), e);
-			} else {
-				ex = new AdapterException("Cannot close mongo connection. " + e.getLocalizedMessage(), e);
-			}
-		}
-		if (!silent && ex != null) {
-			throw ex;
-		}
-	}
-
-	/**
-	 * Parse the source data to common format and write it to output adapter.
-	 *
-	 * @return list of billing data
-	 * @throws InitializationException
-	 * @throws AdapterException
-	 * @throws ParseException
-	 */
-	public List<Document> parse() throws InitializationException, AdapterException, ParseException {
-		List<Document> billingData = new ArrayList<>();
-		try {
-			if (init()) {
-				String line;
-				List<String> row;
-				ReportLine reportLine;
-				do {
-					while ((line = getNextRow()) != null) {
-						if (getFilter() != null && (line = getFilter().canParse(line)) == null) {
-							getCurrentStatistics().incrRowFiltered();
-							continue;
-						}
-
-						row = parseRow(line);
-						if ((getFilter() != null && (row = getFilter().canTransform(row)) == null)) {
-							getCurrentStatistics().incrRowFiltered();
-							continue;
-						}
-						try {
-							if (getCondition() != null && !getCondition().evaluate(row)) {
-								getCurrentStatistics().incrRowFiltered();
-								continue;
-							}
-						} catch (ParseException e) {
-							throw new ParseException(e.getLocalizedMessage() + "\nEntry name: " + getCurrentStatistics
-									().getEntryName() +
-									"\nSource line[" +
-									getCurrentStatistics().getRowReaded() + "]: " + line, e);
-						} catch (Exception e) {
-							throw new ParseException("Cannot evaluate condition " + getWhereCondition() + ". " +
-									e.getLocalizedMessage() + "\nEntry name: " + getCurrentStatistics().getEntryName()
-									+ "\nSource line[" + getCurrentStatistics().getRowReaded() + "]: " + line, e);
-						}
-
-						try {
-							reportLine = getCommonFormat().toCommonFormat(row);
-						} catch (ParseException e) {
-							throw new ParseException("Cannot cast row to common format. " +
-									e.getLocalizedMessage() + "\nEntry name: " + getCurrentStatistics().getEntryName
-									() +
-									"\nSource line[" + getCurrentStatistics().getRowReaded() + "]: " + line, e);
-						}
-						if (getFilter() != null && (reportLine = getFilter().canAccept(reportLine)) == null) {
-							getCurrentStatistics().incrRowFiltered();
-							continue;
-						}
-
-						getCurrentStatistics().incrRowParsed();
-						if (getAggregate() != AggregateGranularity.NONE) {
-							getAggregator().append(reportLine);
-						} else {
-							billingData.add(getAdapterOut().writeRow(reportLine));
-							getCurrentStatistics().incrRowWritten();
-						}
-					}
-
-					if (getAggregate() != AggregateGranularity.NONE) {
-						for (int i = 0; i < getAggregator().size(); i++) {
-							billingData.add(getAdapterOut().writeRow(getAggregator().get(i)));
-							getCurrentStatistics().incrRowWritten();
-						}
-					}
-
-					if (getAdapterIn().hasMultyEntry()) {
-						if (getAdapterIn().openNextEntry()) {
-							// Search entry with data
-							while (!initEntry()) {
-								if (!getAdapterIn().openNextEntry()) {
-									break;
-								}
-							}
-						} else {
-							break;
-						}
-					}
-				} while (getAdapterIn().hasMultyEntry() && getAdapterIn().hasEntryData());
-			}
-		} catch (GenericException e) {
-			close(true);
-			if (getCurrentStatistics() != null) {
-				getCurrentStatistics().stop();
-			}
-			throw e;
-		} catch (Exception e) {
-			close(true);
-			if (getCurrentStatistics() != null) {
-				getCurrentStatistics().stop();
-			}
-			throw new ParseException("Unknown parser error. " + e.getLocalizedMessage(), e);
-		}
-
-		close(false);
-		if (getCurrentStatistics() != null) {
-			getCurrentStatistics().stop();
-		}
-		return billingData;
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ParserStatistics.java b/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ParserStatistics.java
deleted file mode 100644
index 55123a4..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/core/parser/ParserStatistics.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-/** Store the statistic of parser processing.
- */
-public class ParserStatistics {
-	/** Name of parsed entry. */
-	private final String entryName;
-	
-	/** Time is milliseconds when parser has been started. */
-	private long timeStartInMillis = 0;
-	
-	/** Parsing time in milliseconds. */
-	private long elapsedTimeInMillis = 0;
-	
-	/** Number of rows read. */
-	private long rowReaded;
-	
-	/** Number of rows skipped. */
-	private long rowSkipped;
-	
-	/** Number of rows filtered. */
-	private long rowFiltered;
-	
-	/** Number of rows parsed. */
-	private long rowParsed;
-	
-	/** Number of rows write. */
-	private long rowWritten;
-	
-	
-	public ParserStatistics(String entryName) {
-		this.entryName = entryName;
-	}
-	
-	public void start() {
-		timeStartInMillis = System.currentTimeMillis();
-		elapsedTimeInMillis = 0;
-		rowReaded = 0;
-		rowSkipped = 0;
-		rowFiltered = 0;
-		rowParsed = 0;
-		rowWritten = 0;
-	}
-	
-	public void stop() {
-		if (timeStartInMillis != 0) {
-			elapsedTimeInMillis = System.currentTimeMillis() - timeStartInMillis;
-			timeStartInMillis = 0;
-		}
-	}
-	
-	
-	/** Return the name of parsed entry. */
-	public String getEntryName() {
-		return entryName;
-	}
-	
-	/** Return the elapsed time in milliseconds of initializing, reading, filtering, parsing and writing operations. */
-	public long getElapsedTime() {
-		return (elapsedTimeInMillis != 0 ?
-					elapsedTimeInMillis :
-					timeStartInMillis == 0 ? 0 : System.currentTimeMillis() - timeStartInMillis);
-	}
-	
-	/** Return the number of rows read. */
-	public long getRowReaded() {
-		return rowReaded;
-	}
-	
-	/** Return the number of rows skipped. */
-	public long getRowSkipped() {
-		return rowSkipped;
-	}
-	
-	/** Return the number of rows filtered. */
-	public long getRowFiltered() {
-		return rowFiltered;
-	}
-	
-	/** Return the number of rows parsed. */
-	public long getRowParsed() {
-		return rowParsed;
-	}
-	
-	/** Return the number of rows write. */
-	public long getRowWritten() {
-		return rowWritten;
-	}
-	
-	/** Increment the number of rows read. */
-	public void incrRowReaded() {
-		rowReaded++;
-	}
-	
-	/** Increment the number of rows skipped. */
-	public void incrRowSkipped() {
-		rowSkipped++;
-	}
-	
-	/** Increment the number of rows filtered. */
-	public void incrRowFiltered() {
-		rowFiltered++;
-	}
-	
-	/** Increment the number of rows parsed. */
-	public void incrRowParsed() {
-		rowParsed++;
-	}
-	
-	/** Increment the number of rows write. */
-	public void incrRowWritten() {
-		rowWritten++;
-	}
-	
-
-	public ToStringHelper toStringHelper(Object self) {
-    	return MoreObjects.toStringHelper(self)
-    			.add("entryName", entryName)
-    			.add("elapsedTime", getElapsedTime())
-    			.add("rowReaded", rowReaded)
-    			.add("rowSkipped", rowSkipped)
-    			.add("rowFiltered", rowFiltered)
-    			.add("rowParsed", rowParsed)
-    			.add("rowWritten", rowWritten);
-    }
-	
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/logging/AppenderBase.java b/services/billing-aws/src/main/java/com/epam/dlab/logging/AppenderBase.java
deleted file mode 100644
index 55e5159..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/logging/AppenderBase.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.logging;
-
-import java.util.TimeZone;
-
-import com.epam.dlab.exceptions.InitializationException;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.OutputStreamAppender;
-
-/** Abstract class provides base configuration for the log appenders.
- */
-@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
-public abstract class AppenderBase {
-
-	/** Log format pattern. */
-	private final String logFormatPattern = "%-5p [%d{ISO8601," + TimeZone.getDefault().getID() + "}] %c: %m%n%rEx";
-	
-	/** Perform configure of appender.
-	 * @param context the context of logger.
-	 */
-	public abstract void configure(LoggerContext context) throws InitializationException;
-	
-	/** Perform the base configure of appender.
-	 * @param context the context of logger.
-	 * @param appenderName the name of appender.
-	 * @param appender the class instance of appender.
-	 */
-	public void configure(LoggerContext context, String appenderName, OutputStreamAppender<ILoggingEvent> appender) {
-        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
-        encoder.setPattern(logFormatPattern);
-        encoder.setContext(context);
-        encoder.start();
-
-        appender.setContext(context);
-        appender.setName(appenderName);
-        appender.setEncoder(encoder);
-        appender.start();
-
-        Logger logger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
-        logger.addAppender(appender);
-        logger.setAdditive(true);
-	}
-
-	/** Return the name of type for appender. */
-	@JsonIgnore
-	public String getType() {
-		Class<? extends AppenderBase> clazz = this.getClass();
-		return (clazz.isAnnotationPresent(JsonTypeName.class) ?
-				clazz.getAnnotation(JsonTypeName.class).value() : clazz.getName());
-	}
-	
-	
-	/** Returns a string representation of the object.
-	 * @param self the object to generate the string for (typically this), used only for its class name.
-	 */
-	public ToStringHelper toStringHelper(Object self) {
-    	return MoreObjects.toStringHelper(self)
-    			.add("type",  getType());
-    }
-    
-    @Override
-    public String toString() {
-    	return toStringHelper(this)
-    			.toString();
-    }
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/logging/AppenderConsole.java b/services/billing-aws/src/main/java/com/epam/dlab/logging/AppenderConsole.java
deleted file mode 100644
index 780802f..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/logging/AppenderConsole.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.logging;
-
-import com.epam.dlab.exceptions.InitializationException;
-import com.fasterxml.jackson.annotation.JsonClassDescription;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.ConsoleAppender;
-
-/** Console appender for logging.
- */
-@JsonTypeName("console")
-@JsonClassDescription(
-	"Console log appender.\n" +
-	"Output log data to console. Does not have any properties.\n" +
-	"  - type: console"
-	)
-public class AppenderConsole extends AppenderBase {
-	
-	@Override
-    public void configure(LoggerContext context)  throws InitializationException {
-    	super.configure(context, "console-appender", new ConsoleAppender<ILoggingEvent>());
-    }
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/logging/AppenderFile.java b/services/billing-aws/src/main/java/com/epam/dlab/logging/AppenderFile.java
deleted file mode 100644
index 29f5d7f..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/logging/AppenderFile.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.logging;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-
-import com.epam.dlab.exceptions.InitializationException;
-import com.fasterxml.jackson.annotation.JsonClassDescription;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.CoreConstants;
-import ch.qos.logback.core.FileAppender;
-import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy;
-import ch.qos.logback.core.rolling.RollingFileAppender;
-import ch.qos.logback.core.rolling.TimeBasedFileNamingAndTriggeringPolicy;
-import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
-
-/** File appender for logging. Support rolling files and archiving.
- */
-@JsonTypeName("file")
-@JsonClassDescription(
-	"File log appender.\n" + 
-	"Output log data to the file, if property archive is set to true then rolling\n" +
-	"mode is enabled. If archivedLogFilenamePattern ends with .gz or .zip extension\n" +
-	"then old log file will be compressed.\n" +
-	"  - type: file\n" +
-	"    currentLogFilename: <[path/]filename.log>  - pattern for log file naming.\n" +
-	"    [archive: <true | false>]                  - rolling log files or none.\n" +
-	"    [archivedLogFilenamePattern: <[path/]filename-%d{yyyy-MM-dd}.log[.gz | .zip]>]\n" +
-	"                                               - pattern for naming the archive log\n" +
-	"                                                 files.\n" +
-	"    [archivedFileCount: <number_of_days>]      - number of archive log file history."
-	)
-public class AppenderFile extends AppenderBase {
-
-	/** The name of current log file. */
-	@Valid
-    @NotNull
-    @JsonProperty
-    private String currentLogFilename;
-
-	/** Flag for archive of old files. */
-    @Valid
-    @JsonProperty
-    private boolean archive = false;
-    
-    /** Pattern for naming archive files. The compression mode depending on last
-	 * letters of the fileNamePatternStr. Patterns ending with .gz imply GZIP
-	 * compression, endings with '.zip' imply ZIP compression. Otherwise and by
-	 * default, there is no compression. */
-    @Valid
-    @JsonProperty
-    private String archivedLogFilenamePattern;
-    
-    /** The maximum number of archive files to keep.. */
-    @Valid
-    @JsonProperty
-    private int archivedFileCount = CoreConstants.UNBOUND_HISTORY;
-    
-    
-    /** Return the name of current log file. */
-    public String getCurrentLogFilename() {
-    	return currentLogFilename;
-    }
-    
-    /** Set the name of current log file. */
-    public void setCurrentLogFilename(String currentLogFilename) {
-    	this.currentLogFilename = currentLogFilename;
-    }
-    
-    /** Return the flag for archive of old files. */
-    public boolean getArchive() {
-    	return archive;
-    }
-    
-    /** Set the flag for archive of old files. */
-    public void setArchive(boolean archive) {
-    	this.archive = archive;
-    }
-    
-    /** Return the pattern for naming archive files. */
-    public String getArchivedLogFilenamePattern() {
-    	return archivedLogFilenamePattern;
-    }
-    
-    /** Set pattern for naming archive files. The compression mode depending on last
-	 * letters of the fileNamePatternStr. Patterns ending with .gz imply GZIP
-	 * compression, endings with '.zip' imply ZIP compression. Otherwise and by
-	 * default, there is no compression.
-	 * For example,
-	 * /logs/application-%d{yyyy-MM-dd}.log.gz
-	 */
-    public void setArchivedLogFilenamePattern(String archivedLogFilenamePattern) {
-    	this.archivedLogFilenamePattern = archivedLogFilenamePattern;
-    }
-    
-    /** Return the maximum number of archive files to keep.. */
-    public int getArchivedFileCount() {
-    	return archivedFileCount;
-    }
-    
-    /** Set the maximum number of archive files to keep.. */
-    public void setArchivedFileCount(int archivedFileCount) {
-    	this.archivedFileCount = archivedFileCount;
-    }
-    
-    
-    @Override
-    public void configure(LoggerContext context) throws InitializationException {
-    	if (currentLogFilename == null || currentLogFilename.trim().isEmpty()) {
-    		throw new InitializationException("Configuration property logging.appenders.currentLogFilename cannot be null.");
-    	}
-    	super.configure(context, "file-appender", (archive ? getRollingFileAppender(context) : getFileAppender()));
-    }
-
-    /** Create and return synchronous the file appender. 
-     */
-	private FileAppender<ILoggingEvent> getFileAppender() {
-		FileAppender<ILoggingEvent> appender = new FileAppender<ILoggingEvent>();
-		appender.setFile(currentLogFilename);
-		appender.setAppend(true);
-		return appender;
-	}
-	
-    /** Create and return synchronous the rolling file appender.
-     * @param context the context of logger. 
-     */
-	private RollingFileAppender<ILoggingEvent> getRollingFileAppender(LoggerContext context) throws InitializationException {
-		if (archivedLogFilenamePattern == null || archivedLogFilenamePattern.trim().isEmpty()) {
-			throw new InitializationException("Configuration property logging.appenders.archivedLogFilenamePattern cannot be null.");
-		}
-		RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<ILoggingEvent>();
-        appender.setFile(currentLogFilename);
-        appender.setAppend(true);
-
-        TimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent> triggerPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent>();
-        triggerPolicy.setContext(context);
-        
-        TimeBasedRollingPolicy<ILoggingEvent> rollPolicy = new TimeBasedRollingPolicy<ILoggingEvent>();
-        rollPolicy.setContext(context);
-        rollPolicy.setParent(appender);
-        rollPolicy.setFileNamePattern(archivedLogFilenamePattern);
-        rollPolicy.setMaxHistory(archivedFileCount);
-        rollPolicy.setTimeBasedFileNamingAndTriggeringPolicy(triggerPolicy);
-        rollPolicy.start();
-        appender.setRollingPolicy(rollPolicy);
-        
-		return appender;
-	}
-
-	
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("currentLogFilename", currentLogFilename)
-				.add("archive", archive)
-				.add("archivedLogFilenamePattern", archivedLogFilenamePattern)
-				.add("archivedFileCount", archivedFileCount);
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/module/AdapterConsole.java b/services/billing-aws/src/main/java/com/epam/dlab/module/AdapterConsole.java
deleted file mode 100644
index 3bffa79..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/module/AdapterConsole.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module;
-
-import com.epam.dlab.core.AdapterBase;
-import com.epam.dlab.core.parser.CommonFormat;
-import com.epam.dlab.exceptions.AdapterException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.fasterxml.jackson.annotation.JsonClassDescription;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import org.bson.Document;
-
-import java.util.List;
-
-/**
- * The adapter for console output.
- */
-@JsonTypeName(ModuleName.ADAPTER_CONSOLE)
-@JsonClassDescription(
-		"Console adapter.\n" +
-				"Output data to console. Can be used for AdapterOut only.\n" +
-				"  - type: " + ModuleName.ADAPTER_CONSOLE + "\n" +
-				"    [writeHeader: <true | false>]  - write header of data to the adapterOut."
-)
-public class AdapterConsole extends AdapterBase {
-
-	/**
-	 * Default constructor for deserialization.
-	 */
-	public AdapterConsole() {
-	}
-
-	/**
-	 * Instantiate adapter for reading or writing.
-	 *
-	 * @param mode the mode of adapter.
-	 */
-	public AdapterConsole(Mode mode) {
-		super(mode);
-	}
-
-
-	@Override
-	public void open() throws AdapterException {
-		if (getMode() != Mode.WRITE) {
-			throw new AdapterException("Mode of " + getType() + " adapter may be " + Mode.WRITE + " only.");
-		}
-	}
-
-	@Override
-	public void close() throws AdapterException {
-		// Nothing to do
-	}
-
-	@Override
-	public String getEntryName() {
-		return "console";
-	}
-
-	@Override
-	public String readLine() throws AdapterException {
-		throw new AdapterException("Unimplemented method called.");
-	}
-
-	@Override
-	public void writeHeader(List<String> header) throws AdapterException {
-		System.out.println(CommonFormat.rowToString(header));
-	}
-
-	@Override
-	public Document writeRow(ReportLine row) throws AdapterException {
-		System.out.println(CommonFormat.rowToString(row));
-		return null;
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/module/AdapterFile.java b/services/billing-aws/src/main/java/com/epam/dlab/module/AdapterFile.java
deleted file mode 100644
index dd256eb..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/module/AdapterFile.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module;
-
-import com.epam.dlab.core.AdapterBase;
-import com.epam.dlab.core.parser.CommonFormat;
-import com.epam.dlab.exceptions.AdapterException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.fasterxml.jackson.annotation.JsonClassDescription;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import org.bson.Document;
-
-import javax.validation.constraints.NotNull;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.List;
-
-/** The adapter for file system.
- */
-@JsonTypeName(ModuleName.ADAPTER_FILE)
-@JsonClassDescription(
-	"File adapter.\n" +
-	"Read source or write converted data to the file.\n" +
-	"  - type: " + ModuleName.ADAPTER_FILE + "\n" +
-	"    [writeHeader: <true | false>]  - write header of data to the adapterOut.\n" +
-	"    file: <filename>               - the name of file."
-	)
-public class AdapterFile extends AdapterBase {
-
-	/** The name of file. */
-	@NotNull
-	@JsonProperty
-	private String file;
-
-    
-	/** Return the name of file. */
-	public String getFile() {
-		return file;
-	}
-	
-	/** Set the name of file. */
-	public void setFile(String file) {
-		this.file = file;
-	}
-	
-	
-	/** Reader for adapter. */
-	@JsonIgnore
-	private BufferedReader reader;
-	
-	/** Writer for adapter. */
-	@JsonIgnore
-	private BufferedWriter writer;
-	
-
-	@Override
-	public void open() throws AdapterException {
-		try {
-			if (getMode() == Mode.READ) {
-				reader = new BufferedReader(new FileReader(file));
-			} else if (getMode() == Mode.WRITE) {
-				writer = new BufferedWriter(new FileWriter(file));
-			} else {
-				throw new AdapterException("Mode of adapter unknown or not defined. Set mode to " + Mode.READ + " or " + Mode.WRITE + ".");
-			}
-		} catch (Exception e) {
-			throw new AdapterException("Cannot open file " + file + ". " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	@Override
-	public void close() throws AdapterException {
-		if (reader != null) {
-			try {
-				reader.close();
-			} catch (IOException e) {
-				throw new AdapterException("Cannot close file " + file + ". " + e.getLocalizedMessage(), e);
-			} finally {
-				reader = null;
-			}
-		}
-		
-		if (writer != null) {
-			try {
-				writer.close();
-			} catch (IOException e) {
-				throw new AdapterException("Cannot close file " + file + ". " + e.getLocalizedMessage(), e);
-			} finally {
-				writer = null;
-			}
-		}
-	}
-
-	@Override
-	public String getEntryName() {
-		return getFile();
-	}
-
-	@Override
-	public String readLine() throws AdapterException {
-		try {
-			return reader.readLine();
-		} catch (IOException e) {
-			throw new AdapterException("Cannot read file " + file + ". " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	@Override
-	public void writeHeader(List<String> header) throws AdapterException {
-		try {
-			writer.write(CommonFormat.rowToString(header));
-			writer.write(System.lineSeparator());
-		} catch (IOException e) {
-			throw new AdapterException("Cannot write file " + file + ". " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	@Override
-	public Document writeRow(ReportLine row) throws AdapterException {
-		try {
-			writer.write(CommonFormat.rowToString(row));
-			writer.write(System.lineSeparator());
-		} catch (IOException e) {
-			throw new AdapterException("Cannot write file " + file + ". " + e.getLocalizedMessage(), e);
-		}
-		return null;
-	}
-	
-	
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("file", file);
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/module/ModuleName.java b/services/billing-aws/src/main/java/com/epam/dlab/module/ModuleName.java
deleted file mode 100644
index 58a31b8..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/module/ModuleName.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module;
-
-/** Names of billing tool modules.
- */
-public class ModuleName {
-	public static final String ADAPTER_CONSOLE = "console";
-	public static final String ADAPTER_AGG_CONSOLE = "aggConsole";
-	public static final String ADAPTER_FILE = "file";
-	public static final String ADAPTER_S3_FILE = "s3file";
-	public static final String ADAPTER_MONGO_DLAB = "mongodlab";
-	public static final String PARSER_CSV = "csv";
-	public static final String FILTER_AWS = "aws";
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/module/ParserCsv.java b/services/billing-aws/src/main/java/com/epam/dlab/module/ParserCsv.java
deleted file mode 100644
index aaaa73b..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/module/ParserCsv.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.validation.constraints.NotNull;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.epam.dlab.core.parser.ParserByLine;
-import com.epam.dlab.exceptions.AdapterException;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.fasterxml.jackson.annotation.JsonClassDescription;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-/** Parse CSV format to common CSV format.
- */
-@JsonTypeName(ModuleName.PARSER_CSV)
-@JsonClassDescription(
-	"CSV parser.\n" +
-	"Parse source CSV format to common billing report.\n" +
-	"  - type: " + ModuleName.PARSER_CSV + "\n" +
-	"    [dataFile: <filename>]           - the file name to store working data of parser.]\n" +
-	"    [columnStartDate: <column_name>] - the name of source column with date of data.]\n" +
-	"    [columnMapping: >-\n" +
-    "                    <targetColumn1=sourceColumnX;targetColumn2=sourceColumnY; ...;\n" +
-    "                     tags=sourceColumnK,...,sourceColumnN>]\n" +
-    "                                  - columns mapping to target from source columns.\n" +
-    "                                    Know target columns: dlab_id, user,\n" +
-    "                                    usage_date, product, usage_type, usage, cost,\n" +
-    "                                    currency_code, resource_id, tags.\n" +
-	"    [whereCondition: >-\n" +
-    "                    <(source_columnX > 0.0 || source_columnY == 'string') &&\n" +
-    "                     source_columnZ != 2016>]\n" +
-    "                                  - where condition for filtering the source data,\n" +
-    "                                    see http://commons.apache.org/proper/commons-jexl/reference/syntax.html#Operators\n" +
-    "                                    for detais.\n" +
-	"    [aggregate: <none | month | day>] - how to aggregate the data.\n" +
-	"    [headerLineNo: <number>]          - the number of header line in source data.\n" +
-	"    [skipLines: <numbber>]            - the number of line which will be skipped\n" +
-	"                                        (include header).\n" +
-	"    [fieldSeparator: <char>]          - char for separate field names and values.\n" +
-	"    [fieldTerminator: <char>]         - char for terminate field names and values.\n" +
-	"    [escapeChar: <char>]              - escape char.\n" +
-	"    [decimalSeparator: <char>]        - char for decimal sign.\n" +
-	"    [groupingSeparator: <char>]       - char for thousands separator.\n"
-	)
-public class ParserCsv extends ParserByLine {
-	private static final Logger LOGGER = LoggerFactory.getLogger(ParserCsv.class);
-
-	/** Character for separate field names and values. */
-	public static final char FIELD_SEPARATOR_DEFAULT = ',';
-	
-	/** Character for termination field names and values. */
-	public static final char FIELD_DELIMITER_DEFAULT = '"';
-	
-	/** Escape character. */
-	public static final char ESCAPE_CHAR_DEFAULT = '\\';
-	
-
-	/** Character for separate field names and values. */
-	@NotNull
-	@JsonProperty
-	private char fieldSeparator = FIELD_SEPARATOR_DEFAULT;
-
-	/** Character for termination field names and values. */
-	@NotNull
-	@JsonProperty
-	private char fieldTerminator = FIELD_DELIMITER_DEFAULT;
-	
-	/** Escape character. */
-	@NotNull
-	@JsonProperty
-	private char escapeChar = ESCAPE_CHAR_DEFAULT;
-
-	/** The number of line that contain the header of data.*/
-	@JsonProperty
-	private int headerLineNo = 0;
-
-	/** The number of line which will be skipped (include header).*/
-	@JsonProperty
-	private int skipLines = 0;
-	
-
-	/** Return the character for separate field names and values. */
-	public char getFieldSeparator() {
-		return fieldSeparator;
-	}
-	
-	/** Set the character for separate field names and values. */
-	public void setFieldSeparator(char fieldSeparator) {
-		this.fieldSeparator = fieldSeparator;
-	}
-	
-	/** Return the character for termination field names and values. */
-	public char getFieldTerminator() {
-		return fieldTerminator;
-	}
-	
-	/** Set the character for termination field names and values. */
-	public void setFieldTerminator(char fieldTerminator) {
-		this.fieldTerminator = fieldTerminator;
-	}
-	
-	/** Return the escape character. */
-	public char getEscapeChar() {
-		return escapeChar;
-	}
-	
-	/** Set the escape character. */
-	public void setEscapeChar(char escapeChar) {
-		this.escapeChar = escapeChar;
-	}
-	
-	/** Return the number of line that contain the header of data.*/
-	public int getHeaderLineNo() {
-		return headerLineNo;
-	}
-	
-	/** Set the number of line that contain the header of data.*/
-	public void setHeaderLineNo(int headerLineNo) {
-		this.headerLineNo = headerLineNo;
-	}
-	
-	/** Return the number of line which will be skipped (include header).*/
-	public int getSkipLines() {
-		return skipLines;
-	}
-
-	/** Set the number of line which will be skipped (include header).*/
-	public void setSkipLines(int skipLines) {
-		this.skipLines = skipLines;
-	}
-
-	
-	@Override
-	public void initialize() throws InitializationException { }
-	
-	@Override
-	public List<String> parseHeader() throws AdapterException, ParseException {
-		String line = null;
-		List<String> header = null;
-		
-		if (headerLineNo > 0) {
-    		while(getCurrentStatistics().getRowReaded() < headerLineNo) {
-    			if ((line = getNextRow()) == null) {
-    				return null;
-    			}
-    			getCurrentStatistics().incrRowSkipped();
-    		}
-    		header = parseRow(line);
-    	}
-    	
-    	while (getCurrentStatistics().getRowReaded() < skipLines) {
-    		if (getNextRow() == null) {
-    			break;
-    		}
-    		getCurrentStatistics().incrRowSkipped();
-    	}
-    	
-    	return header;
-	}
-	
-	
-	/** Construct the exception.
-	 * @param message the error message.
-	 * @param pos the position in the parsed line.
-	 * @param sourceLine the parsed line.
-	 * @return ParseException
-	 */
-	private ParseException getParseException(String message, int pos, String sourceLine) {
-		String s = String.format("%s at pos %d in line: ", message, pos);
-		LOGGER.error(s + sourceLine);
-		LOGGER.error(StringUtils.repeat(' ', s.length() + pos - 1) + '^');
-		return new ParseException(s + sourceLine);
-	}
-
-	@Override
-	public List<String> parseRow(String line) throws ParseException {
-		int realPos = 0;
-		int pos = 0;
-		boolean isDelimiter = false;
-		StringBuilder sb = new StringBuilder(line);
-		List<String> row = new ArrayList<String>();
-		
-		while (pos < sb.length()) {
-			char c = sb.charAt(pos);
-			/*
-			LOGGER.debug("Current buffer {}", sb);
-			LOGGER.debug("pos {}", pos);
-			LOGGER.debug("isDelimiter {}", isDelimiter);
-			*/
-			if (c == escapeChar) {
-				realPos++;
-				pos++;
-				if (pos == sb.length()) {
-					throw getParseException("Invalid escape char", realPos, line);
-				}
-				sb.delete(pos - 1, pos);
-				realPos++;
-			} else if (c == fieldTerminator) {
-				realPos++;
-				if (isDelimiter) {
-					realPos++;
-					pos++;
-					if (pos == sb.length()) {
-						sb.delete(pos - 1, pos);
-						break;
-					}
-					if (sb.charAt(pos) == fieldSeparator) {
-						row.add(sb.substring(0, pos - 1));
-						sb.delete(0, pos + 1);
-						pos = 0;
-						isDelimiter = false;
-						continue;
-					}
-					throw getParseException("Invalid field delimiter", realPos, line);
-				}
-				
-				if (pos != 0) {
-					throw getParseException("Unterminated field", realPos, line);
-				}
-				sb.delete(0, 1);
-				isDelimiter = true;
-				continue;
-			} else if (c == fieldSeparator) {
-				realPos++;
-				if (isDelimiter) {
-					pos++;
-					continue;
-				}
-				row.add(sb.substring(0, pos));
-				sb.delete(0, pos + 1);
-				pos = 0;
-			} else {
-				realPos++;
-				pos++;
-			}
-		}
-		row.add(sb.toString());
-		
-		return row;
-	}
-	
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-    	return super.toStringHelper(self)
-    	        .add("fieldSeparator", fieldSeparator)
-    	        .add("fieldTerminator", fieldTerminator)
-    	        .add("escapeChar", escapeChar)
-    	        .add("headerLineNo", headerLineNo)
-    	        .add("skipLines", skipLines);
-    }
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/module/aws/AdapterS3File.java b/services/billing-aws/src/main/java/com/epam/dlab/module/aws/AdapterS3File.java
deleted file mode 100644
index 0579063..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/module/aws/AdapterS3File.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module.aws;
-
-import com.amazonaws.auth.BasicAWSCredentials;
-import com.amazonaws.services.s3.AmazonS3;
-import com.amazonaws.services.s3.AmazonS3Client;
-import com.amazonaws.services.s3.model.GetObjectRequest;
-import com.amazonaws.services.s3.model.S3Object;
-import com.epam.dlab.core.AdapterBase;
-import com.epam.dlab.exceptions.AdapterException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.epam.dlab.module.ModuleName;
-import com.fasterxml.jackson.annotation.JsonClassDescription;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import org.bson.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.validation.constraints.NotNull;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Date;
-import java.util.List;
-
-/**
- * The adapter for S3 file system of Amazon.
- */
-@JsonTypeName(ModuleName.ADAPTER_S3_FILE)
-@JsonClassDescription(
-		"Amazon S3 file system adapter.\n" +
-				"Read source or write converted data to the file in Amazon S3 bucket.\n" +
-				"  - type: " + ModuleName.ADAPTER_S3_FILE + "\n" +
-				"    [writeHeader: <true | false>]   - write header of data to the adapterOut.\n" +
-				"    bucket: <bucketname>            - the name of S3 bucket.\n" +
-				"    path: <path>                    - the path to the report or empty if used the root folder.\n" +
-				"    accountId: <AWS account number> - the account number, see for details\n" +
-				"                                      \"Detailed billing report with resources and tags\"\n" +
-				"                                      http://docs.aws.amazon" +
-				".com/awsaccountbilling/latest/aboutv2/billing-reports.html#detailed-report-with-resources-tags\n" +
-				"    [accessKeyId: <string>]         - Amazon access key ID.\n" +
-				"    [secretAccessKey: <string>]     - Amazon secret access key."
-)
-public class AdapterS3File extends AdapterBase {
-	private static final Logger LOGGER = LoggerFactory.getLogger(AdapterS3File.class);
-
-	/**
-	 * Name of key for the last loaded file.
-	 */
-	public static final String DATA_KEY_LAST_LOADED_FILE = "AdapterS3File_lastLoadedFile";
-
-	/**
-	 * Name of key for the modification date of loaded file.
-	 */
-	public static final String DATA_KEY_LAST_MODIFICATION_DATE = "AdapterS3File_lastModifyDate";
-	private static final String CANNOT_READ_FILE_FORMAT = "Cannot read file %s. %s";
-	private static final String DELIMITER = "/";
-
-	/**
-	 * The name of bucket.
-	 */
-	@NotNull
-	@JsonProperty
-	private String bucket;
-
-	/**
-	 * The path to report.
-	 */
-	@JsonProperty
-	private String path;
-
-	/**
-	 * AWS account number.
-	 */
-	@NotNull
-	@JsonProperty
-	private String accountId;
-
-	/**
-	 * Access key ID for Amazon Web Services.
-	 */
-	@JsonProperty
-	private String accessKeyId;
-
-	/**
-	 * Secret key for Amazon Web Services.
-	 */
-	@JsonProperty
-	private String secretAccessKey;
-
-	@JsonProperty
-	private boolean awsJobEnabled;
-
-	/**
-	 * Return the name of bucket.
-	 */
-	public String getBucket() {
-		return bucket;
-	}
-
-	/**
-	 * Set the name of bucket.
-	 */
-	public void setBucket(String bucket) {
-		this.bucket = bucket;
-	}
-
-	/**
-	 * Return the path to report.
-	 */
-	public String getPath() {
-		return path;
-	}
-
-	/**
-	 * Set the path to report.
-	 */
-	public void setPath(String path) {
-		this.path = path;
-	}
-
-	/**
-	 * Return the AWS account number.
-	 */
-	public String getAccountId() {
-		return accountId;
-	}
-
-	/**
-	 * Set the AWS account number.
-	 */
-	public void setAccountId(String accountId) {
-		this.accountId = accountId;
-	}
-
-	/**
-	 * Return the access key ID for Amazon Web Services.
-	 */
-	public String getAccessKeyId() {
-		return this.accessKeyId;
-	}
-
-	/**
-	 * Set the access key ID for Amazon Web Services.
-	 */
-	public void setAccessKeyId(String accessKeyId) {
-		this.accessKeyId = accessKeyId;
-	}
-
-	/**
-	 * Return the secret key for Amazon Web Services.
-	 */
-	public String getSecretAccessKey() {
-		return this.secretAccessKey;
-	}
-
-	/**
-	 * Set the secret key for Amazon Web Services.
-	 */
-	public void setSecretAccessKey(String secretAccessKey) {
-		this.secretAccessKey = secretAccessKey;
-	}
-
-
-	/**
-	 * List of report files for loading.
-	 */
-	@JsonIgnore
-	private List<String> filelist = null;
-
-	/**
-	 * Index of current report file.
-	 */
-	@JsonIgnore
-	private int currentFileIndex = -1;
-
-	/**
-	 * Index of current report file.
-	 */
-	@JsonIgnore
-	private String entryName = null;
-
-	/**
-	 * Amazon S3 client.
-	 */
-	@JsonIgnore
-	private AmazonS3 clientS3 = null;
-
-	/**
-	 * Amazon S3 client.
-	 */
-	@JsonIgnore
-	private Date lastModificationDate = null;
-
-	/**
-	 * File input stream.
-	 */
-	@JsonIgnore
-	private InputStream fileInputStream = null;
-
-	/**
-	 * Reader for adapter.
-	 */
-	@JsonIgnore
-	private BufferedReader reader = null;
-
-	@Override
-	public void open() throws AdapterException {
-		LOGGER.debug("Adapter S3 will be opened for {}", getMode());
-		if (getMode() == Mode.READ) {
-			setLastModificationDate();
-			clientS3 = getAmazonClient();
-			S3FileList s3files = new S3FileList(awsJobEnabled, bucket, getModuleData());
-			filelist = s3files.getFiles(clientS3);
-			currentFileIndex = (filelist.isEmpty() ? -1 : 0);
-			fileInputStream = null;
-			reader = null;
-			entryName = null;
-			openNextEntry();
-			LOGGER.debug("Adapter S3 has been opened");
-		} else if (getMode() == Mode.WRITE) {
-			throw new AdapterException("Unsupported mode " + Mode.WRITE + ".");
-		} else {
-			throw new AdapterException("Mode of adapter unknown or not defined. Set mode to " + Mode.READ + ".");
-		}
-	}
-
-	@Override
-	public boolean hasMultyEntry() {
-		return true;
-	}
-
-	@Override
-	public boolean openNextEntry() throws AdapterException {
-		String filename = getCurrentFileName();
-		if (filename == null) {
-			if (filelist.isEmpty()) {
-				final String reportPath = path == null ? bucket : bucket + DELIMITER + path;
-				LOGGER.debug("New report files in bucket folder {} not found", reportPath);
-			}
-			return false;
-		}
-		entryName = filename;
-		LOGGER.debug("Open a next entry in file {}", filename);
-		reader = new BufferedReader(new InputStreamReader(getFileStream()));
-		try {
-			getModuleData().setId(filename);
-			getModuleData().setModificationDate(lastModificationDate);
-			getModuleData().set(DATA_KEY_LAST_LOADED_FILE, filename);
-			getModuleData().set(DATA_KEY_LAST_MODIFICATION_DATE, lastModificationDate);
-			getModuleData().store();
-		} catch (Exception e) {
-			throw new AdapterException(e.getLocalizedMessage(), e);
-		}
-		currentFileIndex++;
-		return false;
-	}
-
-	@Override
-	public boolean hasEntryData() {
-		return (reader != null);
-	}
-
-	@Override
-	public void close() throws AdapterException {
-		closeFile(getCurrentFileName());
-	}
-
-	@Override
-	public String getEntryName() {
-		return entryName;
-	}
-
-	@Override
-	public String readLine() throws AdapterException {
-		try {
-			return reader.readLine();
-		} catch (IOException e) {
-			throw new AdapterException(String.format(CANNOT_READ_FILE_FORMAT, getCurrentFileName(), e
-					.getLocalizedMessage()), e);
-		}
-	}
-
-	@Override
-	public void writeHeader(List<String> header) throws AdapterException {
-		throw new AdapterException("Unimplemented method.");
-	}
-
-	@Override
-	public Document writeRow(ReportLine row) throws AdapterException {
-		throw new AdapterException("Unimplemented method.");
-	}
-
-
-	/**
-	 * Return the current file name.
-	 */
-	public String getCurrentFileName() {
-		return (filelist == null || currentFileIndex < 0 || currentFileIndex >= filelist.size() ? null : filelist.get
-				(currentFileIndex));
-	}
-
-	/**
-	 * Creates and returns the Amazon client, as well as checks bucket existence.
-	 *
-	 * @throws AdapterException
-	 */
-	private AmazonS3 getAmazonClient() throws AdapterException {
-		AmazonS3 s3 = (accessKeyId == null ?
-				new AmazonS3Client() :
-				new AmazonS3Client(new BasicAWSCredentials(accessKeyId, secretAccessKey)));
-
-		if (!s3.doesBucketExist(bucket)) {
-			throw new AdapterException("Bucket \"" + bucket + "\" does not exist.");
-		}
-
-		return s3;
-	}
-
-	/**
-	 * Open the source file and return reader.
-	 *
-	 * @throws AdapterException
-	 */
-	private InputStream getFileStream() throws AdapterException {
-		try {
-			GetObjectRequest request = new GetObjectRequest(bucket, getCurrentFileName());
-			S3Object object = clientS3.getObject(request);
-			lastModificationDate = object.getObjectMetadata().getLastModified();
-			return object.getObjectContent();
-		} catch (Exception e) {
-			throw new AdapterException("Cannot open file " + bucket + DELIMITER + getCurrentFileName() + ". " + e
-					.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Return the modification date of loaded file.
-	 *
-	 * @throws AdapterException
-	 */
-	private void setLastModificationDate() throws AdapterException {
-		try {
-			lastModificationDate = getModuleData().getDate(DATA_KEY_LAST_MODIFICATION_DATE);
-		} catch (Exception e) {
-			throw new AdapterException("Cannot get the last modification date for report. " + e.getLocalizedMessage(),
-					e);
-		}
-	}
-
-	/**
-	 * Close a zip file.
-	 *
-	 * @param filename file name.
-	 * @throws AdapterException
-	 */
-	private void closeFile(String filename) throws AdapterException {
-		if (fileInputStream != null) {
-			try {
-				fileInputStream.close();
-			} catch (IOException e) {
-				throw new AdapterException("Cannot close file " + filename + ". " + e.getLocalizedMessage(), e);
-			}
-			fileInputStream = null;
-		}
-	}
-
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("bucket", bucket)
-				.add("path", path)
-				.add("accountId", accountId)
-				.add("accessKeyId", "***")
-				.add("secretAccessKey", "***");
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/module/aws/FilterAWS.java b/services/billing-aws/src/main/java/com/epam/dlab/module/aws/FilterAWS.java
deleted file mode 100644
index d388271..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/module/aws/FilterAWS.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module.aws;
-
-import com.epam.dlab.core.FilterBase;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.epam.dlab.module.ModuleName;
-import com.fasterxml.jackson.annotation.JsonClassDescription;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import javax.validation.constraints.NotNull;
-import java.util.List;
-
-/**
- * Filter and transform the line of AWS detailed billing reports.
- */
-@JsonTypeName(ModuleName.FILTER_AWS)
-@JsonClassDescription(
-		"Amazon Web Services detailed billing reports filter.\n" +
-				"Filter report data and select line item only. Set column projectCode and\n" +
-				"currencyCode to user values.\n" +
-				"  - type: " + ModuleName.FILTER_AWS + "\n" +
-				"    [currencyCode: <string>]    - user value for currencyCode column.\n" +
-				"    [columnDlabTag: <string>]   - name of column tag of DLab resource id.\n" +
-				"    [serviceBaseName: <string>] - DLab's service base name."
-
-)
-public class FilterAWS extends FilterBase {
-
-	/**
-	 * The code of currency.
-	 */
-	@NotNull
-	@JsonProperty
-	private String currencyCode;
-
-	/**
-	 * Name of report column tag of DLab.
-	 */
-	@NotNull
-	@JsonProperty
-	private String columnDlabTag;
-
-	/**
-	 * DLab service base name.
-	 */
-	@NotNull
-	@JsonProperty
-	private String serviceBaseName;
-
-
-	/**
-	 * Return the code of currency for billing.
-	 */
-	public String getCurrencyCode() {
-		return currencyCode;
-	}
-
-	/**
-	 * Set the code of currency for billing.
-	 */
-	public void setCurrencyCode(String currencyCode) {
-		this.currencyCode = currencyCode;
-	}
-
-	/**
-	 * Return the name of report column tag of DLab.
-	 */
-	public String getColumnDlabTag() {
-		return columnDlabTag;
-	}
-
-	/**
-	 * Set the name of report column tag of DLab.
-	 */
-	public void setDlabTagName(String columnDlabTag) {
-		this.columnDlabTag = columnDlabTag;
-	}
-
-	/**
-	 * Return service base name.
-	 */
-	public String getServiceBaseName() {
-		return serviceBaseName;
-	}
-
-	/**
-	 * Set service base name.
-	 */
-	public void setServiceBaseName(String serviceBaseName) {
-		this.serviceBaseName = serviceBaseName;
-	}
-
-
-	private int dlabIdIndex = -1;
-	private String dlabPrefix;
-
-	@Override
-	public void initialize() throws InitializationException {
-		dlabIdIndex = (getColumnDlabTag() == null ? -1 :
-				getParser().getSourceColumnIndexByName(getColumnDlabTag()));
-		dlabPrefix = getServiceBaseName() + ":";
-	}
-
-	@Override
-	public String canParse(String line) throws ParseException {
-		return line;
-	}
-
-	@Override
-	public List<String> canTransform(List<String> row) throws ParseException {
-		if (dlabIdIndex != -1 &&
-				(row.size() <= dlabIdIndex ||
-						!row.get(dlabIdIndex).startsWith(dlabPrefix))) {
-			return null;
-		}
-		return row;
-	}
-
-	@Override
-	public ReportLine canAccept(ReportLine row) throws ParseException {
-		row.setCurrencyCode(currencyCode);
-		return row;
-	}
-
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("currencyCode", currencyCode)
-				.add("columnDlabTag", columnDlabTag)
-				.add("serviceBaseName", serviceBaseName);
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/module/aws/S3FileList.java b/services/billing-aws/src/main/java/com/epam/dlab/module/aws/S3FileList.java
deleted file mode 100644
index 021497e..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/module/aws/S3FileList.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module.aws;
-
-import com.amazonaws.services.s3.AmazonS3;
-import com.amazonaws.services.s3.model.ListObjectsV2Request;
-import com.amazonaws.services.s3.model.ListObjectsV2Result;
-import com.amazonaws.services.s3.model.S3ObjectSummary;
-import com.epam.dlab.core.ModuleData;
-import com.epam.dlab.exceptions.AdapterException;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static java.util.stream.Collectors.mapping;
-import static java.util.stream.Collectors.toList;
-
-/**
- * Create a file listing of reports from AWS bucket.
- * See details in
- * <a href="http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-reports.html#detailed-report-with-resources-tags">
- * Detailed billing report with resources and tags</a>.
- */
-public class S3FileList {
-
-	/**
-	 * Report suffix without date.
-	 */
-	private static final String REPORT_SUFIX = ".csv";
-	/**
-	 * Date regex for YYYYMMDD
-	 */
-	private static final String DATE_REGEX = "\\d{4}(0?[1-9]|1[012])(0?[1-9]|[12][0-9]|3[01])";
-	private static final String REGEX = String.format("(^.*/.*/%s-%s)/.*/*.\\%s", DATE_REGEX, DATE_REGEX,
-			REPORT_SUFIX);
-
-	/**
-	 * Bucket name.
-	 */
-	private final String bucket;
-
-	/**
-	 * Name of last file which is loaded or <b>null</b> for loading all files in bucket folder.
-	 */
-	private final ModuleData moduleData;
-	private final Pattern reportPattern;
-	private final boolean awsJobEnabled;
-
-
-	/**
-	 * Instantiate file find class.
-	 *
-	 * @param awsJobEnabled
-	 * @param bucket        the name of bucket.
-	 * @param moduleData    data for working module
-	 */
-	public S3FileList(boolean awsJobEnabled, String bucket, ModuleData moduleData) {
-		this.bucket = bucket;
-		this.moduleData = moduleData;
-		this.awsJobEnabled = awsJobEnabled;
-		this.reportPattern = this.awsJobEnabled ? Pattern.compile(REGEX) : Pattern.compile(".*" + REPORT_SUFIX + "$");
-	}
-
-	/**
-	 * Return the list of files for new reports.
-	 *
-	 * @param s3Client the S3 client.
-	 * @return the list of files.
-	 * @throws AdapterException
-	 */
-	public List<String> getFiles(AmazonS3 s3Client) throws AdapterException {
-		final List<S3ObjectSummary> objectSummaries = reportFilesInBillingBucket(s3Client);
-		return awsJobEnabled ? lastFilesPerBillingPeriod(objectSummaries) :
-				objectSummaries.stream().map(S3ObjectSummary::getKey).sorted().collect(toList());
-	}
-
-	private List<S3ObjectSummary> reportFilesInBillingBucket(AmazonS3 s3Client) throws AdapterException {
-		ListObjectsV2Request request = new ListObjectsV2Request()
-				.withBucketName(bucket);
-		ListObjectsV2Result result;
-		List<S3ObjectSummary> objectSummaries = new ArrayList<>();
-		try {
-			do {
-				result = s3Client.listObjectsV2(request);
-				objectSummaries.addAll(notProcessedFiles(result));
-			} while (result.isTruncated());
-		} catch (Exception e) {
-			throw new AdapterException("Cannot get the file listing of bucket \"" + bucket + "*\". " +
-					e.getLocalizedMessage(), e);
-		}
-		return objectSummaries;
-	}
-
-	private List<S3ObjectSummary> notProcessedFiles(ListObjectsV2Result result) {
-		return result.getObjectSummaries()
-				.stream()
-				.filter(this::matchBillingRegexAndWasNotProcessed)
-				.collect(toList());
-	}
-
-	private boolean matchBillingRegexAndWasNotProcessed(S3ObjectSummary o) {
-		return reportPattern.matcher(o.getKey()).matches()
-				&& !moduleData.wasProcessed(o.getKey(), o.getLastModified(),
-				extractDatePrefix(reportPattern, o));
-	}
-
-	/**
-	 * Returns list of files that per billing period
-	 * For particular billing period file with the biggest modification date will be returned
-	 *
-	 * @param objectSummaries amazon s3 objects
-	 * @return list of file names
-	 */
-	protected List<String> lastFilesPerBillingPeriod(List<S3ObjectSummary> objectSummaries) {
-		final Map<String, List<S3ObjectSummary>> months = objectSummaries.stream()
-				.collect(Collectors.groupingBy(o -> extractDatePrefix(reportPattern, o), mapping(o -> o, toList())));
-
-		return months.entrySet()
-				.stream()
-				.flatMap(this::lastFileForBillingPeriod)
-				.sorted()
-				.collect(Collectors.toList());
-	}
-
-	private Stream<? extends String> lastFileForBillingPeriod(Map.Entry<String, List<S3ObjectSummary>> entry) {
-		final List<S3ObjectSummary> assemblyIds = entry.getValue();
-		final S3ObjectSummary lastBillingFile = assemblyIds.stream()
-				.max(Comparator.comparing(S3ObjectSummary::getLastModified))
-				.orElseThrow(() -> new IllegalStateException("AssemblyId does not contains any file"));
-		return assemblyIds.stream()
-				.filter(s -> s.getKey().startsWith(StringUtils.substringBeforeLast(lastBillingFile.getKey(), "/")))
-				.map(S3ObjectSummary::getKey);
-	}
-
-	private String extractDatePrefix(Pattern pattern, S3ObjectSummary o) {
-		final String key = o.getKey();
-		final Matcher matcher = pattern.matcher(key);
-		if (matcher.find() && awsJobEnabled) {
-			return matcher.group(1);
-		} else {
-			return key;
-		}
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/mongo/AdapterMongoDb.java b/services/billing-aws/src/main/java/com/epam/dlab/mongo/AdapterMongoDb.java
deleted file mode 100644
index db92a80..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/mongo/AdapterMongoDb.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.mongo;
-
-import com.epam.dlab.core.DBAdapterBase;
-import com.epam.dlab.core.aggregate.UsageDataList;
-import com.epam.dlab.exceptions.AdapterException;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.epam.dlab.module.ModuleName;
-import com.fasterxml.jackson.annotation.JsonClassDescription;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import com.mongodb.client.MongoCollection;
-import com.mongodb.client.model.UpdateOptions;
-import org.bson.Document;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.TreeSet;
-
-import static com.epam.dlab.mongo.MongoConstants.COLLECTION_SETTINGS;
-import static com.epam.dlab.mongo.MongoConstants.FIELD_SERIVICE_BASE_NAME;
-import static com.mongodb.client.model.Filters.eq;
-
-/**
- * The adapter for file system.
- */
-@JsonTypeName(ModuleName.ADAPTER_MONGO_DLAB)
-@JsonClassDescription(
-		"Mongo DB adapter.\n" +
-				"Write converted data to the Mongo database. Can be used for AdapterOut only.\n" +
-				"  - type: " + ModuleName.ADAPTER_MONGO_DLAB + "\n" +
-				"    host: <host>             - the host name or IP address.\n" +
-				"    port: <port>             - the port number.\n" +
-				"    database: <database>     - the name of database.\n" +
-				"    username: <username>     - the name of user.\n" +
-				"    password: <password>     - the password of user.\n" +
-				"    [bufferSize: <number>]   - the size of buffer, default is 10000 records.\n" +
-				"    [upsert: <false | true>] - if true then upsert is enabled."
-)
-public class AdapterMongoDb extends DBAdapterBase {
-
-	/**
-	 * The size of buffer for bulk insert. Not applicable for upsert mode.
-	 */
-	@JsonProperty
-	private int bufferSize = 10000;
-
-	/**
-	 * The upsert mode if set to <b>true</b>.
-	 */
-	@JsonProperty
-	private boolean upsert = false;
-
-	@JsonProperty
-	private String serviceBaseName;
-
-	public String getServiceBaseName() {
-		return serviceBaseName;
-	}
-
-	public void setServiceBaseName(String serviceBaseName) {
-		this.serviceBaseName = serviceBaseName;
-	}
-
-	/**
-	 * Return the size of buffer for bulk insert.
-	 */
-	public int getBufferSize() {
-		return bufferSize;
-	}
-
-	/**
-	 * Set the size of buffer for bulk insert.
-	 *
-	 * @throws InitializationException
-	 */
-	public void setBufferSize(int bufferSize) throws InitializationException {
-		if (upsert && bufferSize <= 0) {
-			throw new InitializationException("The bufferSize must be greater than zero when upsert mode is switched" +
-					" " +
-					"on");
-		}
-		this.bufferSize = bufferSize;
-	}
-
-	/**
-	 * Return the <b>true</b> if upsert mode switched on.
-	 */
-	public boolean isUpsert() {
-		return upsert;
-	}
-
-	/**
-	 * Set the upsert mode.
-	 *
-	 * @throws InitializationException
-	 */
-	public void setUpsert(boolean upsert) throws InitializationException {
-		if (upsert && bufferSize <= 0) {
-			throw new InitializationException("Upsert mode cannot be enabled if the bufferSize is zero or less than " +
-					"zero");
-		}
-		this.upsert = upsert;
-	}
-
-
-	/**
-	 * Custom connection to Mongo database.
-	 */
-	private MongoDbConnection connection;
-
-	/**
-	 * Mongo collection.
-	 */
-	private MongoCollection<Document> collection;
-
-	/**
-	 * DAO of DLab's resource type.
-	 */
-	private DlabResourceTypeDAO resourceTypeDAO;
-
-	/**
-	 * Buffer for insert operations.
-	 */
-	private List<Document> buffer;
-
-	/**
-	 * List of dates for delete from MongoDB.
-	 */
-	private UsageDataList usageDateList;
-
-
-	@Override
-	public void open() throws AdapterException {
-		if (connection == null) {
-			if (getMode() != Mode.WRITE) {
-				throw new AdapterException("Mode of " + getType() + " adapter may be " + Mode.WRITE + " only.");
-			}
-			connection = new MongoDbConnection(getHost(), getPort(), getDatabase(), getUsername(), getPassword());
-			setServiceBaseName();
-			collection = connection.getCollection(MongoConstants.COLLECTION_BILLING);
-			try {
-				resourceTypeDAO = new DlabResourceTypeDAO(connection);
-			} catch (InitializationException e) {
-				throw new AdapterException("Cannot initialize billing transformer to DLab format. " + e
-						.getLocalizedMessage(), e);
-			}
-
-			connection.createBillingIndexes();
-			usageDateList = new UsageDataList();
-			buffer = (upsert || bufferSize > 0 ? new ArrayList<>(bufferSize) : null);
-		} else {
-			throw new AdapterException("Connection is already opened");
-		}
-	}
-
-	private void setServiceBaseName() {
-		connection.getCollection(COLLECTION_SETTINGS)
-				.updateOne(eq("_id", FIELD_SERIVICE_BASE_NAME), new Document("$set", new Document("value", serviceBaseName)),
-						new UpdateOptions().upsert(true));
-	}
-
-	@Override
-	public void close() throws AdapterException {
-		if (connection != null) {
-			if (upsert) {
-				connection.upsertRows(collection, buffer, usageDateList);
-			} else if (bufferSize > 0) {
-				connection.insertRows(collection, buffer);
-			}
-			buffer = null;
-			updateTotal();
-
-			try {
-				connection.close();
-			} catch (Exception e) {
-				throw new AdapterException("Cannot close connection to database " +
-						getDatabase() + ". " + e.getLocalizedMessage(), e);
-			} finally {
-				connection = null;
-			}
-		}
-	}
-
-	@Override
-	public String getEntryName() {
-		return MongoConstants.COLLECTION_BILLING;
-	}
-
-	@Override
-	public String readLine() throws AdapterException {
-		throw new AdapterException("Unimplemented method called.");
-	}
-
-	@Override
-	public void writeHeader(List<String> header) {
-		// Nothing to do
-	}
-
-	@Override
-	public Document writeRow(ReportLine row) throws AdapterException {
-		Document document;
-		try {
-			document = resourceTypeDAO.transform(row);
-		} catch (ParseException e) {
-			throw new AdapterException("Cannot transform report line. " + e.getLocalizedMessage(), e);
-		}
-
-//		usageDateList.append(row.getUsageDate());
-//		if (upsert) {
-//			buffer.add(document);
-//			if (buffer.size() >= bufferSize) {
-//				connection.upsertRows(collection, buffer, usageDateList);
-//			}
-//		} else if (bufferSize > 0) {
-//			buffer.add(document);
-//			if (buffer.size() >= bufferSize) {
-//				connection.insertRows(collection, buffer);
-//			}
-//		} else {
-//			connection.insertOne(collection, document);
-//		}
-		return document;
-	}
-
-	/**
-	 * Update total cost of resources.
-	 */
-	private void updateTotal() throws AdapterException {
-		TreeSet<String> months = new TreeSet<>();
-		try {
-			for (String date : usageDateList) {
-				months.add(date.substring(0, 7));
-			}
-			for (String month : months) {
-				resourceTypeDAO.updateMonthTotalCost(month);
-			}
-		} catch (Exception e) {
-			throw new AdapterException("Cannot update total monthly cost. " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("bufferSize", bufferSize)
-				.add("upsert", upsert);
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/mongo/DlabResourceTypeDAO.java b/services/billing-aws/src/main/java/com/epam/dlab/mongo/DlabResourceTypeDAO.java
deleted file mode 100644
index 0c95605..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/mongo/DlabResourceTypeDAO.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.mongo;
-
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.mongodb.client.AggregateIterable;
-import com.mongodb.client.MongoCollection;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import static com.mongodb.client.model.Accumulators.sum;
-import static com.mongodb.client.model.Aggregates.group;
-import static com.mongodb.client.model.Aggregates.match;
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.gte;
-import static com.mongodb.client.model.Filters.lte;
-import static org.apache.commons.lang3.StringUtils.EMPTY;
-
-/**
- * Provides Mongo DAO for billing resources in DLab.
- */
-public class DlabResourceTypeDAO implements MongoConstants {
-	private static final Logger LOGGER = LoggerFactory.getLogger(DlabResourceTypeDAO.class);
-
-	/**
-	 * Mongo database connection.
-	 */
-	private final MongoDbConnection connection;
-
-	/**
-	 * Service base name.
-	 */
-	private String serviceBaseName;
-	private String serviceBaseNameId;
-
-	/**
-	 * Instantiate DAO for billing resources.
-	 *
-	 * @param connection the connection to Mongo DB.
-	 * @throws InitializationException
-	 */
-	public DlabResourceTypeDAO(MongoDbConnection connection) throws InitializationException {
-		this.connection = connection;
-		setServiceBaseName();
-	}
-
-	/**
-	 * Returns the base name of service.
-	 */
-	public String getServiceBaseName() {
-		return serviceBaseName;
-	}
-
-	/**
-	 * Set the base name of service.
-	 *
-	 * @throws InitializationException
-	 */
-	private void setServiceBaseName() throws InitializationException {
-		Document d = connection.getCollection(COLLECTION_SETTINGS)
-				.find(eq(FIELD_ID, FIELD_SERIVICE_BASE_NAME))
-				.first();
-		if (d == null) {
-			throw new InitializationException("Service base name property " + COLLECTION_SETTINGS +
-					"." + FIELD_SERIVICE_BASE_NAME + " in Mongo DB not found");
-		}
-		String value = d.getOrDefault("value", EMPTY).toString();
-		if (d.isEmpty()) {
-			throw new InitializationException("Service base name property " + COLLECTION_SETTINGS +
-					"." + FIELD_SERIVICE_BASE_NAME + " in Mongo DB is empty");
-		}
-		serviceBaseName = value;
-		serviceBaseNameId = value + ":";
-		LOGGER.debug("serviceBaseName is {}", serviceBaseName);
-	}
-
-	/**
-	 * Convert and return the report line of billing to Mongo document.
-	 *
-	 * @param row report line.
-	 * @return Mongo document.
-	 * @throws ParseException
-	 */
-	public Document transform(ReportLine row) throws ParseException {
-		String resourceId = row.getDlabId();
-		if (resourceId == null || !resourceId.startsWith(serviceBaseNameId)) {
-			throw new ParseException("DlabId is not match: expected start with " + serviceBaseNameId + ", actual " +
-					resourceId);
-		}
-		resourceId = resourceId.substring(serviceBaseNameId.length());
-		Document d = new Document(ReportLine.FIELD_DLAB_ID, resourceId);
-		return d.append(ReportLine.FIELD_USAGE_DATE, row.getUsageDate())
-				.append(ReportLine.FIELD_PRODUCT, row.getProduct())
-				.append(ReportLine.FIELD_USAGE_TYPE, row.getUsageType())
-				.append(ReportLine.FIELD_USAGE, row.getUsage())
-				.append(ReportLine.FIELD_COST, row.getCost())
-				.append(ReportLine.FIELD_CURRENCY_CODE, row.getCurrencyCode())
-				.append(ReportLine.FIELD_RESOURCE_TYPE, row.getResourceType().category())
-				.append(ReportLine.FIELD_RESOURCE_ID, row.getResourceId())
-				.append(ReportLine.FIELD_TAGS, row.getTags());
-	}
-
-
-	/**
-	 * Return field condition for groupping.
-	 *
-	 * @param fieldNames the list of field names.
-	 */
-	private Document getGroupingFields(String... fieldNames) {
-		Document d = new Document();
-		for (String name : fieldNames) {
-			d.put(name, "$" + name);
-		}
-		return d;
-	}
-
-	/**
-	 * Update monthly total in Mongo DB.
-	 *
-	 * @param month the month in format YYYY-MM.
-	 * @throws InitializationException
-	 */
-	public void updateMonthTotalCost(String month) throws InitializationException {
-		LOGGER.debug("Update total cost for month {}", month);
-		try {
-			//Check month
-			SimpleDateFormat fd = new SimpleDateFormat("yyyy-MM");
-			fd.parse(month);
-		} catch (java.text.ParseException e) {
-			throw new InitializationException("Invalid month value. " + e.getLocalizedMessage(), e);
-		}
-
-		List<? extends Bson> pipeline = Arrays.asList(
-				match(and(gte(ReportLine.FIELD_USAGE_DATE, month + "-01"),
-						lte(ReportLine.FIELD_USAGE_DATE, month + "-31"))),
-				group(getGroupingFields(FIELD_DLAB_RESOURCE_ID,
-						FIELD_DLAB_RESOURCE_TYPE,
-						FIELD_USER,
-						FIELD_EXPLORATORY_NAME,
-						ReportLine.FIELD_CURRENCY_CODE,
-						ReportLine.FIELD_RESOURCE_TYPE),
-						sum(ReportLine.FIELD_COST, "$" + ReportLine.FIELD_COST))
-		);
-		AggregateIterable<Document> docs = connection.getCollection(COLLECTION_BILLING).aggregate(pipeline);
-
-		MongoCollection<Document> collection = connection.getCollection(COLLECTION_BILLING_TOTAL);
-		long deletedCount = collection.deleteMany(eq(ReportLine.FIELD_USAGE_DATE, month)).getDeletedCount();
-		LOGGER.debug("{} documents has been deleted from collection {}", deletedCount, COLLECTION_BILLING_TOTAL);
-		List<Document> totals = new ArrayList<>();
-		for (Document d : docs) {
-			Document total = (Document) d.get(FIELD_ID);
-			total
-					.append(ReportLine.FIELD_USAGE_DATE, month)
-					.append(ReportLine.FIELD_COST, d.getDouble(ReportLine.FIELD_COST));
-			totals.add(total);
-		}
-		if (!totals.isEmpty()) {
-			LOGGER.debug("{} documents will be inserted into collection {}", totals.size(), COLLECTION_BILLING_TOTAL);
-			collection.insertMany(totals);
-		}
-	}
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/mongo/MongoConstants.java b/services/billing-aws/src/main/java/com/epam/dlab/mongo/MongoConstants.java
deleted file mode 100644
index 68c56cd..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/mongo/MongoConstants.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.mongo;
-
-/** The constants names of collections and fields in Mongo DB.
- */
-public interface MongoConstants {
-	/** Name of ID field. */
-	String FIELD_ID = "_id";
-    
-	/** Collection environment settings. */
-    String COLLECTION_SETTINGS = "settings";
-    String FIELD_SERIVICE_BASE_NAME = "conf_service_base_name";
-
-    /** Collection user AWS credentials. */
-    String COLLECTION_USER_EDGE = "userCloudCredentials";
-
-    /** Collection user instances. */
-    String COLLECTION_USER_INSTANCES = "userInstances";
-    String FIELD_EXPLORATORY_NAME = "exploratory_name";
-    String FIELD_USER = "user";
-	String FIELD_IMAGE = "image";
-    String FIELD_EXPLORATORY_ID = "exploratory_id";
-    String FIELD_CURRENCY_CODE = "currency_code";
-    String FIELD_COMPUTATIONAL_RESOURCES = "computational_resources";
-    String FIELD_COMPUTATIONAL_ID = "computational_id";
-    String FIELD_COMPUTATIONAL_NAME = "computational_name";
-	String FIELD_DATAENGINE_INSTANCE_COUNT = "dataengine_instance_count";
-
-    /** Collection billing. */
-    String COLLECTION_BILLING = "billing";
-	String FIELD_DLAB_RESOURCE_ID = "dlab_resource_id";
-	String FIELD_RESOURCE_NAME = "resource_name";
-	String FIELD_PROJECT = "project";
-	String FIELD_DLAB_RESOURCE_TYPE = "dlab_resource_type";
-
-    /** Collection billingTotal. */
-	String COLLECTION_BILLING_TOTAL = "billingTotal";
-	String FIELD_USAGE_DATE_START = "from";
-	String FIELD_USAGE_DATE_END = "to";
-	String BILLING_DATA_COLLECTION = "BillingData";
-}
diff --git a/services/billing-aws/src/main/java/com/epam/dlab/mongo/MongoDbConnection.java b/services/billing-aws/src/main/java/com/epam/dlab/mongo/MongoDbConnection.java
deleted file mode 100644
index 7cd4a44..0000000
--- a/services/billing-aws/src/main/java/com/epam/dlab/mongo/MongoDbConnection.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.mongo;
-
-import com.epam.dlab.core.aggregate.UsageDataList;
-import com.epam.dlab.exceptions.AdapterException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.mongodb.*;
-import com.mongodb.client.MongoCollection;
-import com.mongodb.client.MongoDatabase;
-import com.mongodb.client.model.IndexOptions;
-import com.mongodb.client.result.DeleteResult;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-
-import static com.mongodb.client.model.Filters.eq;
-
-/**
- * Provides operation with Mongo database and billing report.
- */
-public class MongoDbConnection implements Closeable {
-	private static final Logger LOGGER = LoggerFactory.getLogger(MongoDbConnection.class);
-
-	/**
-	 * Mongo client.
-	 */
-	private MongoClient client;
-
-	/**
-	 * Mongo database.
-	 */
-	private MongoDatabase database;
-
-
-	/**
-	 * Instantiate the helper for Mongo database adapter.
-	 *
-	 * @param host         the host name.
-	 * @param port         the port.
-	 * @param databaseName the name of database.
-	 * @param username     the name of user.
-	 * @param password     the password.
-	 * @throws AdapterException
-	 */
-	public MongoDbConnection(String host, int port, String databaseName, String username, String password) throws
-			AdapterException {
-		try {
-			client = new MongoClient(
-					new ServerAddress(host, port),
-					Collections.singletonList(
-							MongoCredential.createCredential(username, databaseName, password.toCharArray())));
-			database = client.getDatabase(databaseName).withWriteConcern(WriteConcern.ACKNOWLEDGED);
-		} catch (Exception e) {
-			throw new AdapterException("Cannot create connection to database " +
-					databaseName + ". " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Close connection to Mongo database.
-	 */
-	@Override
-	public void close() throws IOException {
-		if (client != null) {
-			try {
-				client.close();
-			} catch (Exception e) {
-				throw new IOException(e.getLocalizedMessage(), e);
-			} finally {
-				client = null;
-				database = null;
-			}
-		}
-	}
-
-	/**
-	 * Create index on billing collection.
-	 *
-	 * @param indexName the name of index.
-	 * @param index     the index options.
-	 */
-	private void createBillingIndexes(String indexName, Bson index) {
-		MongoCollection<Document> collection = database.getCollection(MongoConstants.COLLECTION_BILLING);
-		IndexOptions options = new IndexOptions().name(MongoConstants.COLLECTION_BILLING + indexName);
-		try {
-			collection
-					.createIndex(index, options);
-		} catch (Exception e) {
-			LOGGER.warn("Cannot create index {} on collection {}. {}", options.getName(),
-					MongoConstants.COLLECTION_BILLING, e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Create index on Mongo collection for fast upsert operations.
-	 */
-	public void createBillingIndexes() {
-		createBillingIndexes("_IntervalIdx",
-				new BasicDBObject()
-						.append(ReportLine.FIELD_USER_ID, 1)
-						.append(ReportLine.FIELD_USAGE_DATE, 2));
-		createBillingIndexes("_ExploratoryIdx",
-				new BasicDBObject()
-						.append(ReportLine.FIELD_USER_ID, 1)
-						.append(MongoConstants.FIELD_EXPLORATORY_NAME, 2));
-	}
-
-	/**
-	 * Return the collection of Mongo database.
-	 *
-	 * @param collectionName the name of collection.
-	 */
-	public MongoCollection<Document> getCollection(String collectionName) {
-		return database.getCollection(collectionName);
-	}
-
-	/**
-	 * Insert document to Mongo.
-	 *
-	 * @param collection the name of collection.
-	 * @param document   the document.
-	 * @throws AdapterException
-	 */
-	public void insertOne(MongoCollection<Document> collection, Document document) throws AdapterException {
-		try {
-			collection.insertOne(document);
-		} catch (Exception e) {
-			throw new AdapterException("Cannot insert document into collection " +
-					collection.getNamespace() + ": " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Insert documents from list to Mongo collection and clear list.
-	 *
-	 * @param collection Mongo collection.
-	 * @param documents  the list of documents.
-	 * @throws AdapterException
-	 */
-	public void insertRows(MongoCollection<Document> collection, List<Document> documents)
-			throws AdapterException {
-		try {
-			if (documents.size() > 0) {
-				collection.insertMany(documents);
-				LOGGER.debug("{} documents has been inserted into collection {}",
-						documents.size(), collection.getNamespace());
-				documents.clear();
-			}
-		} catch (Exception e) {
-			throw new AdapterException("Cannot insert new documents into collection " +
-					collection.getNamespace() + ": " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Insert documents from list to Mongo collection and clear list.
-	 *
-	 * @param collection    Mongo collection.
-	 * @param documents     the list of documents.
-	 * @param usageDateList list of the data interval to deletion old data from Mongo.
-	 * @throws AdapterException
-	 */
-	public void upsertRows(MongoCollection<Document> collection, List<Document> documents, UsageDataList usageDateList)
-			throws AdapterException {
-		deleteRows(collection, usageDateList);
-		insertRows(collection, documents);
-	}
-
-	/**
-	 * Delete the documents from Mongo collection.
-	 *
-	 * @param collection    Mongo collection.
-	 * @param usageDateList list of the data interval to deletion data from Mongo.
-	 * @throws AdapterException
-	 */
-	public void deleteRows(MongoCollection<Document> collection, UsageDataList usageDateList)
-			throws AdapterException {
-		try {
-			long rowCount = 0;
-			for (String date : usageDateList) {
-				if (!usageDateList.get(date)) {
-					DeleteResult result = collection.deleteMany(eq(ReportLine.FIELD_USAGE_DATE, date));
-					rowCount += result.getDeletedCount();
-					usageDateList.set(date, true);
-				}
-			}
-			if (rowCount > 0) {
-				LOGGER.debug("{} documents has been deleted from collection {}",
-						rowCount, collection.getNamespace());
-			}
-		} catch (Exception e) {
-			throw new AdapterException("Cannot delete old rows from collection " +
-					collection.getNamespace() + ": " + e.getLocalizedMessage(), e);
-		}
-	}
-}
diff --git a/services/billing-aws/src/main/resources/application.yml b/services/billing-aws/src/main/resources/application.yml
index 8bd3a4f..7849fb7 100644
--- a/services/billing-aws/src/main/resources/application.yml
+++ b/services/billing-aws/src/main/resources/application.yml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
@@ -26,7 +26,7 @@
     mongodb:
       username: admin
       password: MONGO_PASSWORD
-      database: dlabdb
+      database: datalabdb
       port: 27017
       host: MONGO_HOST
 
@@ -41,14 +41,14 @@
 server.ssl.key-alias: ssn
 
 logging:
-  file: /var/opt/dlab/log/ssn/billing.log
+  file: /var/opt/datalab/log/ssn/billing.log
   level:
     com:
       epam: trace
 
 keycloak:
   bearer-only: true
-  realm: dlab
+  realm: datalab
   resource: KEYCLOAK_CLIENT_ID
   credentials.secret: KEYCLOAK_CLIENT_SECRET
   ssl-required: none
diff --git a/services/billing-aws/src/main/resources/com.epam.datalab.configuration.BillingToolConfigurationFactory b/services/billing-aws/src/main/resources/com.epam.datalab.configuration.BillingToolConfigurationFactory
new file mode 100644
index 0000000..6616dfb
--- /dev/null
+++ b/services/billing-aws/src/main/resources/com.epam.datalab.configuration.BillingToolConfigurationFactory
@@ -0,0 +1,8 @@
+com.epam.datalab.logging.AppenderConsole
+com.epam.datalab.logging.AppenderFile
+com.epam.datalab.module.AdapterConsole
+com.epam.datalab.module.AdapterFile
+com.epam.datalab.module.aws.AdapterS3File
+com.epam.datalab.mongo.AdapterMongoDb
+com.epam.datalab.module.ParserCsv
+com.epam.datalab.module.aws.FilterAWS
\ No newline at end of file
diff --git a/services/billing-aws/src/main/resources/com.epam.dlab.Help.conf.txt b/services/billing-aws/src/main/resources/com.epam.dlab.Help.conf.txt
index 44e7071..0e461de 100644
--- a/services/billing-aws/src/main/resources/com.epam.dlab.Help.conf.txt
+++ b/services/billing-aws/src/main/resources/com.epam.dlab.Help.conf.txt
@@ -1,7 +1,28 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
 Configuration syntax:
 
 # Working file for store billing report variables.
-workingFile: /opt/dlab/tmp/result/billing-data.json
+workingFile: /opt/datalab/tmp/result/billing-data.json
 
 scheduler:
 # Schedule is comma separated values of time in format hh[:mm[:ss]]. hh - in the 24-hour clock, at 8:15PM is 20:15.
diff --git a/services/billing-aws/src/main/resources/com.epam.dlab.Help.module.txt b/services/billing-aws/src/main/resources/com.epam.dlab.Help.module.txt
index 38f8daa..6f033d2 100644
--- a/services/billing-aws/src/main/resources/com.epam.dlab.Help.module.txt
+++ b/services/billing-aws/src/main/resources/com.epam.dlab.Help.module.txt
@@ -1,3 +1,24 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
 Usage:
   java ${CLASSNAME} <option>
 Options:
diff --git a/services/billing-aws/src/main/resources/com.epam.dlab.Help.usage.txt b/services/billing-aws/src/main/resources/com.epam.dlab.Help.usage.txt
index 18479b4..30282f4 100644
--- a/services/billing-aws/src/main/resources/com.epam.dlab.Help.usage.txt
+++ b/services/billing-aws/src/main/resources/com.epam.dlab.Help.usage.txt
@@ -1,3 +1,24 @@
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
 Usage:
   java -jar billing-x.y.jar <option>
   or
diff --git a/services/billing-aws/src/main/resources/com.epam.dlab.configuration.BillingToolConfigurationFactory b/services/billing-aws/src/main/resources/com.epam.dlab.configuration.BillingToolConfigurationFactory
deleted file mode 100644
index ee6ea90..0000000
--- a/services/billing-aws/src/main/resources/com.epam.dlab.configuration.BillingToolConfigurationFactory
+++ /dev/null
@@ -1,8 +0,0 @@
-com.epam.dlab.logging.AppenderConsole
-com.epam.dlab.logging.AppenderFile
-com.epam.dlab.module.AdapterConsole
-com.epam.dlab.module.AdapterFile
-com.epam.dlab.module.aws.AdapterS3File
-com.epam.dlab.mongo.AdapterMongoDb
-com.epam.dlab.module.ParserCsv
-com.epam.dlab.module.aws.FilterAWS
\ No newline at end of file
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/configuration/BillingToolConfigurationTest.java b/services/billing-aws/src/test/java/com/epam/datalab/configuration/BillingToolConfigurationTest.java
new file mode 100644
index 0000000..4e86c29
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/configuration/BillingToolConfigurationTest.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.configuration;
+
+import com.epam.datalab.core.AdapterBase.Mode;
+import com.epam.datalab.core.aggregate.AggregateGranularity;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.module.AdapterConsole;
+import com.epam.datalab.module.AdapterFile;
+import com.epam.datalab.module.ModuleName;
+import com.epam.datalab.module.ParserCsv;
+import com.epam.datalab.module.aws.FilterAWS;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertNotNull;
+
+public class BillingToolConfigurationTest {
+
+	@Test
+	@Ignore
+	public void config() throws InitializationException {
+		JsonNode node = new ConfigJsonGenerator()
+				.withAdapterIn("type", ModuleName.ADAPTER_FILE,
+						"file", "fileIn.csv")
+				.withAdapterOut("type", ModuleName.ADAPTER_CONSOLE)
+				.withFilter("type", ModuleName.FILTER_AWS,
+						"currencyCode", "USD",
+						"columnDatalabTag", "user:user:tag",
+						"serviceBaseName", "sbn")
+				.withParser("type", ModuleName.PARSER_CSV,
+						"columnMapping", "datalab_id=user:user:tag;usage_date=UsageStartDate;product=ProductName;" +
+								"tags=Operation,ItemDescription",
+						"whereCondition", "UsageStartDate >= '2017-04-12'",
+						"aggregate", "day",
+						"headerLineNo", "5",
+						"skipLines", "10",
+						"fieldSeparator", ";",
+						"fieldTerminator", "^",
+						"escapeChar", "/",
+						"decimalSeparator", ",",
+						"groupingSeparator", "_")
+				.build();
+		BillingToolConfiguration conf = BillingToolConfigurationFactory.build(node, BillingToolConfiguration.class);
+		ParserCsv parser = (ParserCsv) conf.build();
+
+		assertNotNull("Parser was not build", parser);
+
+		AdapterFile in = (AdapterFile) parser.getAdapterIn();
+		assertEquals(ModuleName.ADAPTER_FILE, in.getType());
+		assertEquals(Mode.READ, in.getMode());
+		assertEquals("fileIn.csv", in.getFile());
+
+		AdapterConsole out = (AdapterConsole) parser.getAdapterOut();
+		assertEquals(ModuleName.ADAPTER_CONSOLE, out.getType());
+		assertEquals(Mode.WRITE, out.getMode());
+
+		FilterAWS filter = (FilterAWS) parser.getFilter();
+		assertEquals(ModuleName.FILTER_AWS, filter.getType());
+		assertEquals("USD", filter.getCurrencyCode());
+		assertEquals("user:user:tag", filter.getColumnDatalabTag());
+		assertEquals("sbn", filter.getServiceBaseName());
+		assertEquals(parser, filter.getParser());
+
+		assertEquals(ModuleName.PARSER_CSV, parser.getType());
+		assertEquals("datalab_id=user:user:tag;usage_date=UsageStartDate;product=ProductName;tags=Operation,ItemDescription",
+				parser.getColumnMapping());
+		assertEquals("UsageStartDate >= '2017-04-12'", parser.getWhereCondition());
+		assertEquals(AggregateGranularity.DAY, parser.getAggregate());
+		assertEquals(5, parser.getHeaderLineNo());
+		assertEquals(10, parser.getSkipLines());
+		assertEquals(';', parser.getFieldSeparator());
+		assertEquals('^', parser.getFieldTerminator());
+		assertEquals('/', parser.getEscapeChar());
+		assertEquals(',', parser.getDecimalSeparator());
+		assertEquals('_', parser.getGroupingSeparator());
+	}
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/configuration/ConfigJsonGeneratorTest.java b/services/billing-aws/src/test/java/com/epam/datalab/configuration/ConfigJsonGeneratorTest.java
new file mode 100644
index 0000000..8300fca
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/configuration/ConfigJsonGeneratorTest.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.configuration;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertNotNull;
+
+public class ConfigJsonGeneratorTest {
+
+    private void checkProperty(JsonNode conf, String module, String name, String expectedValue) {
+        JsonNode m = conf.get(module);
+        assertNotNull("Module \"" + module + "\" not found in JSON configuration", m);
+
+        JsonNode item = m.get(0);
+        assertNotNull("Property \"" + module + "." + name + "\" not found in JSON configuration", item);
+
+        JsonNode p = item.get(name);
+        assertNotNull("Property \"" + module + "." + name + "\" not found in JSON configuration", p);
+
+        assertEquals(expectedValue, p.asText());
+    }
+
+    @Test
+    public void build() throws IOException {
+        JsonNode conf = new ConfigJsonGenerator()
+                .withAdapterIn("adapterInProperty", "adapterInValue")
+                .withAdapterOut("adapterOutProperty", "adapterOutValue")
+                .withParser("parserProperty", "parserValue")
+                .withFilter("filterProperty", "filterValue")
+                .build();
+
+        checkProperty(conf, "adapterIn", "adapterInProperty", "adapterInValue");
+        checkProperty(conf, "adapterOut", "adapterOutProperty", "adapterOutValue");
+        checkProperty(conf, "parser", "parserProperty", "parserValue");
+        checkProperty(conf, "filter", "filterProperty", "filterValue");
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/configuration/ConfigurationValidatorTest.java b/services/billing-aws/src/test/java/com/epam/datalab/configuration/ConfigurationValidatorTest.java
new file mode 100644
index 0000000..429e4a1
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/configuration/ConfigurationValidatorTest.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.configuration;
+
+import com.epam.datalab.exceptions.InitializationException;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.junit.Test;
+
+import javax.validation.constraints.NotNull;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.fail;
+
+public class ConfigurationValidatorTest {
+
+    class TestProperty {
+
+        @JsonProperty
+        @NotNull
+        String property;
+    }
+
+    @Test
+    public void validate() throws InitializationException {
+        ConfigurationValidator<TestProperty> v = new ConfigurationValidator<>();
+        TestProperty o = new TestProperty();
+        try {
+            v.validate(o);
+            fail("Property is null but validate is passed");
+        } catch (InitializationException e) {
+            // OK
+        }
+        o.property = "value";
+        v.validate(o);
+        assertEquals("value", o.property);
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/configuration/LoggingConfigurationFactoryTest.java b/services/billing-aws/src/test/java/com/epam/datalab/configuration/LoggingConfigurationFactoryTest.java
new file mode 100644
index 0000000..b929eb3
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/configuration/LoggingConfigurationFactoryTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.configuration;
+
+import ch.qos.logback.classic.Level;
+import com.epam.datalab.core.BillingUtils;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.logging.AppenderBase;
+import com.epam.datalab.logging.AppenderConsole;
+import com.epam.datalab.logging.AppenderFile;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.guava.GuavaModule;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertNotNull;
+
+public class LoggingConfigurationFactoryTest {
+
+    private ObjectMapper getMapper() throws InitializationException {
+        ObjectMapper mapper = new ObjectMapper().enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+        mapper.registerModule(new GuavaModule());
+        for (Class<?> clazz : BillingUtils.getModuleClassList()) {
+            mapper.registerSubtypes(clazz);
+        }
+        return mapper;
+    }
+
+    @Test
+    public void config() throws IOException, InitializationException {
+        // {"filter":[{"filterProperty":"filterValue"}],"parser":[{"parserProperty":"parserValue"}],"adapterIn":[{"adapterInProperty":"adapterInValue"}],"adapterOut":[{"adapterOutProperty":"adapterOutValue"}]}
+        final String jsonString =
+                "{\n" +
+                        "  \"level\":\"INFO\",\n" +
+                        "  \"loggers\":{\n" +
+                        "    \"com.epam\":\"DEBUG\",\n" +
+                        "    \"org.apache.http\":\"WARN\"},\n" +
+                        "  \"appenders\":[\n" +
+                        "    {\"type\":\"console\"},\n" +
+                        "    {\"type\":\"file\",\n" +
+                        "      \"currentLogFilename\":\"billing.log\",\n" +
+                        "      \"archive\":true,\n" +
+                        "      \"archivedLogFilenamePattern\":\"billing-%d{yyyy-MM-dd}.log.gz\",\n" +
+                        "      \"archivedFileCount\":10}]\n" +
+                        "}";
+
+        ObjectMapper mapper = getMapper();
+        JsonNode conf = mapper.readTree(jsonString); // validate JSON
+        LoggingConfigurationFactory logger = mapper.readValue(conf.toString(), LoggingConfigurationFactory.class);
+
+        assertEquals(Level.INFO, logger.getLevel());
+        assertEquals(Level.DEBUG, logger.getLoggers().get("com.epam"));
+        assertEquals(Level.WARN, logger.getLoggers().get("org.apache.http"));
+
+        List<AppenderBase> appenders = logger.getAppenders();
+        assertEquals("Invalid number of appenders", 2, appenders.size());
+
+        AppenderConsole ac = (AppenderConsole) appenders.get(0);
+        assertNotNull(ac);
+
+        AppenderFile af = (AppenderFile) appenders.get(1);
+        assertEquals("billing.log", af.getCurrentLogFilename());
+        assertEquals(true, af.getArchive());
+        assertEquals("billing-%d{yyyy-MM-dd}.log.gz", af.getArchivedLogFilenamePattern());
+        assertEquals(10, af.getArchivedFileCount());
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/core/BillingUtilsTest.java b/services/billing-aws/src/test/java/com/epam/datalab/core/BillingUtilsTest.java
new file mode 100644
index 0000000..b73b7ce
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/core/BillingUtilsTest.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core;
+
+import com.epam.datalab.core.parser.ParserBase;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.logging.AppenderBase;
+import com.epam.datalab.logging.AppenderConsole;
+import com.epam.datalab.logging.AppenderFile;
+import com.epam.datalab.module.AdapterConsole;
+import com.epam.datalab.module.AdapterFile;
+import com.epam.datalab.module.ParserCsv;
+import com.epam.datalab.module.aws.AdapterS3File;
+import com.epam.datalab.module.aws.FilterAWS;
+import com.epam.datalab.mongo.AdapterMongoDb;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Map;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.fail;
+
+public class BillingUtilsTest {
+
+    @Test
+    public void stringsToMap() {
+        Map<String, String> map = BillingUtils.stringsToMap(
+                "key1", "value1",
+                "key2", "value2");
+        assertEquals(2, map.size());
+        assertEquals("value1", map.get("key1"));
+        assertEquals("value2", map.get("key2"));
+
+        try {
+            map = BillingUtils.stringsToMap(
+                    "key1", "value1",
+                    "key2");
+            fail("Missed value2 is passed");
+        } catch (IllegalArgumentException e) {
+            // OK
+        }
+    }
+
+    private void checkModule(List<Class<?>> list, Class<?> moduleClass) {
+        for (Class<?> module : list) {
+            if (module == moduleClass) {
+                return;
+            }
+        }
+        fail("Module " + moduleClass.getName() + " is not in module list");
+    }
+
+    @Test
+    public void getModuleClassList() throws InitializationException {
+        List<Class<?>> list = BillingUtils.getModuleClassList();
+        checkModule(list, AdapterConsole.class);
+        checkModule(list, AdapterFile.class);
+        checkModule(list, AdapterS3File.class);
+        checkModule(list, AdapterMongoDb.class);
+        checkModule(list, FilterAWS.class);
+        checkModule(list, ParserCsv.class);
+        checkModule(list, AppenderConsole.class);
+        checkModule(list, AppenderFile.class);
+    }
+
+    @Test
+    public void classChildOf() {
+        assertEquals(true, BillingUtils.classChildOf(AdapterConsole.class, AdapterBase.class));
+        assertEquals(false, BillingUtils.classChildOf(AdapterConsole.class, FilterBase.class));
+        assertEquals(true, BillingUtils.classChildOf(FilterAWS.class, FilterBase.class));
+        assertEquals(false, BillingUtils.classChildOf(FilterAWS.class, ParserBase.class));
+        assertEquals(true, BillingUtils.classChildOf(ParserCsv.class, ParserBase.class));
+        assertEquals(false, BillingUtils.classChildOf(ParserCsv.class, AppenderBase.class));
+        assertEquals(true, BillingUtils.classChildOf(AppenderConsole.class, AppenderBase.class));
+        assertEquals(false, BillingUtils.classChildOf(AppenderConsole.class, AdapterBase.class));
+    }
+
+    @Test
+    public void getModuleType() {
+        assertEquals(ModuleType.ADAPTER, BillingUtils.getModuleType(AdapterConsole.class));
+        assertEquals(ModuleType.ADAPTER, BillingUtils.getModuleType(AdapterFile.class));
+        assertEquals(ModuleType.ADAPTER, BillingUtils.getModuleType(AdapterS3File.class));
+        assertEquals(ModuleType.ADAPTER, BillingUtils.getModuleType(AdapterMongoDb.class));
+        assertEquals(ModuleType.FILTER, BillingUtils.getModuleType(FilterAWS.class));
+        assertEquals(ModuleType.PARSER, BillingUtils.getModuleType(ParserCsv.class));
+        assertEquals(ModuleType.LOGAPPENDER, BillingUtils.getModuleType(AppenderConsole.class));
+        assertEquals(ModuleType.LOGAPPENDER, BillingUtils.getModuleType(AppenderFile.class));
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/core/aggregate/DataAggregatorTest.java b/services/billing-aws/src/test/java/com/epam/datalab/core/aggregate/DataAggregatorTest.java
new file mode 100644
index 0000000..d14bc9f
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/core/aggregate/DataAggregatorTest.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.aggregate;
+
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class DataAggregatorTest {
+
+    @Test
+    public void append() {
+        UsageDataList list = new UsageDataList();
+
+        list.append("2017-04-12");
+        list.append("2017-04-12");
+        list.append("2017-04-14");
+
+        assertEquals(2, list.size());
+
+        assertEquals(Boolean.FALSE, list.get("2017-04-12"));
+        assertEquals(Boolean.FALSE, list.get("2017-04-14"));
+
+        list.set("2017-04-14", true);
+        assertEquals(Boolean.TRUE, list.get("2017-04-14"));
+
+        list.clear();
+        assertEquals(0, list.size());
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/core/aggregate/UsageDataListTest.java b/services/billing-aws/src/test/java/com/epam/datalab/core/aggregate/UsageDataListTest.java
new file mode 100644
index 0000000..201d1f4
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/core/aggregate/UsageDataListTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.aggregate;
+
+import com.epam.datalab.model.aws.ReportLine;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.fail;
+
+public class UsageDataListTest {
+
+    @Test
+    public void day() {
+        DataAggregator agg = new DataAggregator(AggregateGranularity.DAY);
+        ReportLine r;
+
+        r = new ReportLine();
+        r.setUsageDate("2017-04-12 12:34:56");
+        r.setCost(1.2);
+        r.setUsage(10.1);
+        agg.append(r);
+
+        r = new ReportLine();
+        r.setUsageDate("2017-04-12 12:34:78");
+        r.setCost(3.4);
+        r.setUsage(20.2);
+        agg.append(r);
+
+        r = new ReportLine();
+        r.setUsageDate("2017-04-14 11:22:33");
+        r.setCost(5.6);
+        r.setUsage(40.4);
+        agg.append(r);
+
+        assertEquals(AggregateGranularity.DAY, agg.getGranularity());
+        assertEquals(2, agg.size());
+
+        assertEquals("2017-04-12", agg.get(0).getUsageDate());
+        assertEquals(4.6, agg.get(0).getCost());
+        assertEquals(30.3, agg.get(0).getUsage(), 0.000001);
+
+        assertEquals("2017-04-14", agg.get(1).getUsageDate());
+        assertEquals(5.6, agg.get(1).getCost());
+        assertEquals(40.4, agg.get(1).getUsage());
+
+        agg.clear();
+        assertEquals(0, agg.size());
+    }
+
+    @Test
+    public void month() {
+        DataAggregator agg = new DataAggregator(AggregateGranularity.MONTH);
+        ReportLine r;
+
+        r = new ReportLine();
+        r.setUsageDate("2017-04-12 12:34:56");
+        r.setCost(1.2);
+        r.setUsage(10.1);
+        agg.append(r);
+
+        r = new ReportLine();
+        r.setUsageDate("2017-04-12 12:34:78");
+        r.setCost(3.4);
+        r.setUsage(20.2);
+        agg.append(r);
+
+        r = new ReportLine();
+        r.setUsageDate("2017-05-14 11:22:33");
+        r.setCost(5.6);
+        r.setUsage(40.4);
+        agg.append(r);
+
+        assertEquals(AggregateGranularity.MONTH, agg.getGranularity());
+        assertEquals(2, agg.size());
+
+        assertEquals("2017-04", agg.get(0).getUsageDate());
+        assertEquals(4.6, agg.get(0).getCost());
+        assertEquals(30.3, agg.get(0).getUsage(), 0.000001);
+
+        assertEquals("2017-05", agg.get(1).getUsageDate());
+        assertEquals(5.6, agg.get(1).getCost());
+        assertEquals(40.4, agg.get(1).getUsage());
+
+        agg.clear();
+        assertEquals(0, agg.size());
+    }
+
+    @Test
+    public void none() {
+        try {
+            new DataAggregator(AggregateGranularity.NONE);
+            fail("DataArggregator should not have been created");
+        } catch (IllegalArgumentException e) {
+            // OK
+        }
+    }
+
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/core/parser/BillingResourceTypeTest.java b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/BillingResourceTypeTest.java
new file mode 100644
index 0000000..a84f034
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/BillingResourceTypeTest.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import com.epam.datalab.model.aws.BillingResourceType;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class BillingResourceTypeTest {
+
+    @Test
+    public void test() {
+        BillingResourceType type = BillingResourceType.of("cluster");
+
+        assertEquals(BillingResourceType.CLUSTER, type);
+        assertEquals(BillingResourceType.CLUSTER.toString(), "CLUSTER");
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ColumnInfoTest.java b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ColumnInfoTest.java
new file mode 100644
index 0000000..4b03748
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ColumnInfoTest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class ColumnInfoTest {
+
+    @Test
+    public void test() {
+        ColumnInfo ci = new ColumnInfo("target", "source", 123);
+
+        assertEquals("target", ci.targetName);
+        assertEquals("source", ci.sourceName);
+        assertEquals(123, ci.sourceIndex);
+    }
+
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ColumnMetaTest.java b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ColumnMetaTest.java
new file mode 100644
index 0000000..f776309
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ColumnMetaTest.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.google.common.collect.Lists;
+import org.junit.Test;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class ColumnMetaTest {
+
+    @Test
+    public void getColumnIndexByName() throws InitializationException {
+        final List<String> columns = Lists.newArrayList("sCol1", "sCol2", "sCol3", "sCol4");
+
+        assertEquals(0, ColumnMeta.getColumnIndexByName("sCol1", columns));
+        assertEquals(1, ColumnMeta.getColumnIndexByName("sCol2", columns));
+        assertEquals(3, ColumnMeta.getColumnIndexByName("sCol4", columns));
+
+        try {
+            ColumnMeta.getColumnIndexByName("NotFound", columns);
+
+            throw new RuntimeException("Test failed");
+        } catch (InitializationException e) {
+            // OK
+        }
+    }
+
+    private void checkMapping(ColumnInfo info, String targetColumnName, String sourceColumnName, int
+            sourceColumnIndex) {
+        assertEquals(targetColumnName, info.targetName);
+        assertEquals(sourceColumnName, info.sourceName);
+        assertEquals(sourceColumnIndex, info.sourceIndex);
+    }
+
+    @Test
+    public void create() throws InitializationException {
+        final String mapping =
+                ColumnMeta.COLUMN_NAMES[0] + "=sCol2;" +
+                        ColumnMeta.COLUMN_NAMES[1] + "=$1;" +
+                        ReportLine.FIELD_TAGS + "=sCol4,$3";
+        final List<String> columns = Lists.newArrayList("sCol1", "sCol2", "sCol3", "sCol4");
+        ColumnMeta meta = new ColumnMeta(mapping, columns);
+
+        assertEquals(4, meta.getSourceColumnNames().size());
+        assertEquals("sCol1", meta.getSourceColumnNames().get(0));
+        assertEquals("sCol2", meta.getSourceColumnNames().get(1));
+        assertEquals("sCol3", meta.getSourceColumnNames().get(2));
+        assertEquals("sCol4", meta.getSourceColumnNames().get(3));
+
+        assertEquals(ColumnMeta.COLUMN_NAMES.length + 1, meta.getTargetColumnNames().size());
+        assertEquals(ColumnMeta.COLUMN_NAMES[0], meta.getTargetColumnNames().get(0));
+        assertEquals("sCol4", meta.getTargetColumnNames().get(ColumnMeta.COLUMN_NAMES.length - 1));
+        assertEquals("sCol3", meta.getTargetColumnNames().get(ColumnMeta.COLUMN_NAMES.length));
+
+        assertEquals(ColumnMeta.COLUMN_NAMES.length + 1, meta.getColumnMapping().size());
+        checkMapping(meta.getColumnMapping().get(0), ColumnMeta.COLUMN_NAMES[0], "sCol2", 1);
+        checkMapping(meta.getColumnMapping().get(1), ColumnMeta.COLUMN_NAMES[1], "sCol1", 0);
+        checkMapping(meta.getColumnMapping().get(ColumnMeta.COLUMN_NAMES.length - 1), ColumnMeta
+                .COLUMN_NAMES[ColumnMeta.COLUMN_NAMES.length - 1], "sCol4", 3);
+        checkMapping(meta.getColumnMapping().get(ColumnMeta.COLUMN_NAMES.length), ColumnMeta.COLUMN_NAMES[ColumnMeta
+                .COLUMN_NAMES.length - 1], "sCol3", 2);
+    }
+
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/core/parser/CommonFormatTest.java b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/CommonFormatTest.java
new file mode 100644
index 0000000..7de4f01
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/CommonFormatTest.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import com.epam.datalab.core.BillingUtils;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.exceptions.ParseException;
+import com.epam.datalab.model.aws.BillingResourceType;
+import com.epam.datalab.model.aws.ReportLine;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.junit.Test;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class CommonFormatTest {
+
+    private CommonFormat getInstance() throws InitializationException {
+        final List<String> columns = Lists.newArrayList("sCol1", "sCol2", "sCol3", "sCol4");
+        final String mapping = ReportLine.FIELD_DATALAB_ID + "=sCol2;" +
+                ReportLine.FIELD_USER_ID + "=$1;" + ReportLine.FIELD_TAGS + "=$4,sCol3";
+        ColumnMeta meta = new ColumnMeta(mapping, columns);
+        return new CommonFormat(meta, '.', ' ');
+    }
+
+    @Test
+    public void toCommonFormat() throws InitializationException, ParseException {
+        final CommonFormat format = getInstance();
+        final List<String> values = Lists.newArrayList("value1", "value2", "value3", "value4");
+        final ReportLine r = format.toCommonFormat(values);
+
+        assertEquals("value2", r.getDatalabId());
+        assertEquals("value1", r.getUser());
+        assertEquals(2, r.getTags().size());
+        assertEquals("value4", r.getTags().get("sCol4"));
+        assertEquals("value3", r.getTags().get("sCol3"));
+
+        assertEquals(123456.789, format.parseDouble("column1", "123 456.789"));
+        assertEquals("12345.678", CommonFormat.doubleToString(12345.678));
+    }
+
+    @Test
+    public void rowToString() throws ParseException {
+        final List<String> values = Lists.newArrayList("val\"ue1", "\"val,;ue2\"", "value3", "value4");
+        String line = CommonFormat.rowToString(values);
+        assertEquals("\"val\\\"ue1\",\"\\\"val,;ue2\\\"\",\"value3\",\"value4\"", line);
+
+        final ReportLine r = new ReportLine();
+        r.setDatalabId("accountId");
+        r.setUser("user");
+        r.setUsageDate("2016-03-20");
+        r.setProduct("Amazon Elastic Compute Cloud");
+        r.setUsageType("usageType");
+        r.setUsage(56.7);
+        r.setCost(1234.56789);
+        r.setCurrencyCode("USD");
+        r.setResourceTypeId("i-1234567890abcdefg");
+        r.setTags(Maps.newLinkedHashMap(BillingUtils.stringsToMap("tag1", "value1", "tag2", "value2")));
+        line = CommonFormat.rowToString(r);
+        assertEquals("\"accountId\",\"user\",\"2016-03-20\",\"Amazon Elastic Compute Cloud\"," +
+                "\"usageType\",\"56.7\",\"1234.56789\",\"USD\"," +
+                "\"COMPUTER\",\"i-1234567890abcdefg\"," +
+                "\"value1\",\"value2\"", line);
+    }
+
+    @Test
+    public void toReportLine() throws InitializationException, ParseException {
+        final CommonFormat format = getInstance();
+        final List<String> values = Lists.newArrayList(
+                "accountId", "user", "2016-03-27",
+                "Amazon Elastic Compute Cloud", "usageType", "56.7", "1234.56789", "USD",
+                "i-1234567890abcdefg", "value1", "value2");
+        final ReportLine r = format.toReportLine(values);
+
+        assertEquals("accountId", r.getDatalabId());
+        assertEquals("user", r.getUser());
+        assertEquals("2016-03-27", r.getUsageDate());
+        assertEquals("Amazon Elastic Compute Cloud", r.getProduct());
+        assertEquals("usageType", r.getUsageType());
+        assertEquals(56.7, r.getUsage());
+        assertEquals(1234.56789, r.getCost());
+        assertEquals("USD", r.getCurrencyCode());
+        assertEquals(BillingResourceType.COMPUTER, r.getResourceType());
+        assertEquals("i-1234567890abcdefg", r.getResourceId());
+        assertEquals("value1", r.getTags().get("sCol4"));
+        assertEquals("value2", r.getTags().get("sCol3"));
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ConditionEvaluateTest.java b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ConditionEvaluateTest.java
new file mode 100644
index 0000000..87e4eff
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ConditionEvaluateTest.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.exceptions.ParseException;
+import com.google.common.collect.Lists;
+import org.junit.Test;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class ConditionEvaluateTest {
+    private static final List<String> columnNames = Lists.newArrayList("column1", "column2", "column3");
+
+    private void checkCondition(boolean excpectedResult, String condition, String... values
+    ) throws InitializationException, ParseException {
+        ConditionEvaluate c = new ConditionEvaluate(columnNames, condition);
+        final List<String> row = Lists.newArrayList(values);
+        assertEquals(excpectedResult, c.evaluate(row));
+    }
+
+    private void isTrue(String condition, String... values
+    ) throws InitializationException, ParseException {
+        checkCondition(true, condition, values);
+    }
+
+    private void isFalse(String condition, String... values
+    ) throws InitializationException, ParseException {
+        checkCondition(false, condition, values);
+    }
+
+    @Test
+    public void mixCondition() throws InitializationException, ParseException {
+        String condition = "column1 == 123 && column2 == '456' && column3 > 0.2";
+        ConditionEvaluate c = new ConditionEvaluate(columnNames, condition);
+
+        List<String> row = Lists.newArrayList("123", "456", "0.5");
+        assertEquals(true, c.evaluate(row));
+
+        row = Lists.newArrayList("123", "456", "-5");
+        assertEquals(false, c.evaluate(row));
+
+        isFalse("column1 == 123 || column2 == 321", "321", "123");
+        isTrue("column1 == 123 || column2 == 321", "123", "456");
+        isTrue("column1 == 123 || column2 == 321", "456", "321");
+
+        isFalse("(column1 == 123 || column2 == 321) && column3 == 5", "321", "123", "5");
+        isFalse("(column1 == 123 || column2 == 321) && column3 == 5", "123", "321", "4");
+
+        isTrue("(column1 == 123 || column2 == 321) && column3 == 5", "123", "456", "5");
+        isTrue("(column1 == 123 || column2 == 321) && column3 == 5", "234", "321", "5");
+    }
+
+    @Test
+    public void compareInteger() throws InitializationException, ParseException {
+        isFalse("column1 == 123", "456");
+        isTrue("column1 == 123", "123");
+
+        isFalse("column1 != 123", "123");
+        isTrue("column1 != 123", "456");
+
+        isFalse("column1 < 123", "123");
+        isTrue("column1 < 123", "122");
+
+        isFalse("column1 > 123", "123");
+        isTrue("column1 > 123", "124");
+
+        isFalse("column1 <= 123", "124");
+        isTrue("column1 <= 123", "123");
+        isTrue("column1 <= 123", "122");
+
+        isFalse("column1 >= 123", "122");
+        isTrue("column1 >= 123", "123");
+        isTrue("column1 >= 123", "124");
+    }
+
+    @Test
+    public void compareString() throws InitializationException, ParseException {
+        isFalse("column1 == 'abc'", "abcd");
+        isTrue("column1 == 'abc'", "abc");
+
+        isFalse("column1 != 'abc'", "abc");
+        isTrue("column1 != 'abc'", "asd");
+
+        isFalse("column1 < 'abc'", "abd");
+        isTrue("column1 < 'abc'", "abb");
+
+        isFalse("column1 > 'abc'", "abb");
+        isTrue("column1 > 'abc'", "abd");
+
+        isFalse("column1 <= 'abc'", "abd");
+        isTrue("column1 <= 'abc'", "abc");
+        isTrue("column1 <= 'abc'", "abb");
+
+        isFalse("column1 >= 'abc'", "abb");
+        isTrue("column1 >= 'abc'", "abc");
+        isTrue("column1 >= 'abc'", "abd");
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ReportLineTest.java b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ReportLineTest.java
new file mode 100644
index 0000000..f599abf
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/core/parser/ReportLineTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.core.parser;
+
+import com.epam.datalab.core.BillingUtils;
+import com.epam.datalab.exceptions.ParseException;
+import com.epam.datalab.model.aws.BillingResourceType;
+import com.epam.datalab.model.aws.ReportLine;
+import com.google.common.collect.Maps;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class ReportLineTest {
+
+    private void checkGetters(ReportLine r) {
+        assertEquals("datalabId", r.getDatalabId());
+        assertEquals("user", r.getUser());
+        assertEquals("2016-01-22", r.getUsageDate());
+        assertEquals("Amazon Elastic Compute Cloud", r.getProduct());
+        assertEquals("usageType", r.getUsageType());
+        assertEquals(56.7, r.getUsage());
+        assertEquals(12.34, r.getCost());
+        assertEquals("USD", r.getCurrencyCode());
+        assertEquals("i-1234567890abcdefg", r.getResourceId());
+        assertEquals("value1", r.getTags().get("tag1"));
+        assertEquals("value2", r.getTags().get("tag2"));
+    }
+
+    @Test
+    public void set() throws ParseException {
+        ReportLine r = new ReportLine();
+
+        r.setDatalabId("datalabId");
+        r.setCost(12.34);
+        r.setCurrencyCode("USD");
+        r.setProduct("Amazon Elastic Compute Cloud");
+        r.setResourceTypeId("i-1234567890abcdefg");
+        r.setUsage(56.7);
+        r.setUsageDate("2016-01-22");
+        r.setUsageType("usageType");
+        r.setUser("user");
+        r.setTags(Maps.newLinkedHashMap(BillingUtils.stringsToMap("tag1", "value1", "tag2", "value2")));
+
+        checkGetters(r);
+    }
+
+    private void checkResourceType(String product, String resourceTypeId,
+                                   BillingResourceType expectedResourceType, String expectedResourceId) throws
+            ParseException {
+        ReportLine r = new ReportLine();
+        r.setProduct(product);
+        r.setResourceTypeId(resourceTypeId);
+
+        assertEquals(expectedResourceType, r.getResourceType());
+        assertEquals(expectedResourceId, r.getResourceId());
+    }
+
+    @Test
+    public void resourceType() throws ParseException {
+        checkResourceType("Amazon Elastic Compute Cloud", "i-000c0e51d117e3b4a", BillingResourceType.COMPUTER,
+                "i-000c0e51d117e3b4a");
+        checkResourceType("Amazon Elastic Compute Cloud", "vol-04c20f339836c56b6", BillingResourceType.STORAGE_EBS,
+                "vol-04c20f339836c56b6");
+        checkResourceType("Amazon Elastic Compute Cloud", "34.208.106.54", BillingResourceType.IP_ADDRESS,
+                "34.208.106.54");
+
+        checkResourceType("Amazon Elastic MapReduce",
+                "arn:aws:elasticmapreduce:us-west-2:203753054073:cluster/j-1FOBGFRC8X4XY", BillingResourceType
+                        .CLUSTER, "j-1FOBGFRC8X4XY");
+
+        checkResourceType("Amazon Simple Storage Service", "datalab-s3", BillingResourceType.STORAGE_BUCKET, "datalab-s3");
+        checkResourceType("AmazonCloudWatch",
+                "arn:aws:logs:us-west-2:203753054073:log-group:CloudTrail/DefaultLogGroup", BillingResourceType.OTHER,
+                "arn:aws:logs:us-west-2:203753054073:log-group:CloudTrail/DefaultLogGroup");
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/logging/AppenderConsoleTest.java b/services/billing-aws/src/test/java/com/epam/datalab/logging/AppenderConsoleTest.java
new file mode 100644
index 0000000..4785c8c
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/logging/AppenderConsoleTest.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.logging;
+
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class AppenderConsoleTest {
+
+    @Test
+    public void config() {
+        AppenderConsole appender = new AppenderConsole();
+        assertEquals("console", appender.getType());
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/logging/AppenderFileTest.java b/services/billing-aws/src/test/java/com/epam/datalab/logging/AppenderFileTest.java
new file mode 100644
index 0000000..30e941d
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/logging/AppenderFileTest.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.logging;
+
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class AppenderFileTest {
+
+    @Test
+    public void config() {
+        AppenderFile appender = new AppenderFile();
+        appender.setArchive(true);
+        appender.setArchivedFileCount(123);
+        appender.setArchivedLogFilenamePattern("file.log.zip");
+        appender.setCurrentLogFilename("file.log");
+
+        assertEquals("file", appender.getType());
+        assertEquals(true, appender.getArchive());
+        assertEquals(123, appender.getArchivedFileCount());
+        assertEquals("file.log.zip", appender.getArchivedLogFilenamePattern());
+        assertEquals("file.log", appender.getCurrentLogFilename());
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/module/AdapterConsoleTest.java b/services/billing-aws/src/test/java/com/epam/datalab/module/AdapterConsoleTest.java
new file mode 100644
index 0000000..40a9f09
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/module/AdapterConsoleTest.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module;
+
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class AdapterConsoleTest {
+
+    @Test
+    public void config() {
+        AdapterConsole adapter = new AdapterConsole();
+        assertEquals(ModuleName.ADAPTER_CONSOLE, adapter.getType());
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/module/AdapterFileTest.java b/services/billing-aws/src/test/java/com/epam/datalab/module/AdapterFileTest.java
new file mode 100644
index 0000000..3cbd128
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/module/AdapterFileTest.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module;
+
+import com.epam.datalab.core.AdapterBase.Mode;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class AdapterFileTest {
+
+    @Test
+    public void config() {
+        AdapterFile adapter = new AdapterFile();
+        adapter.setMode(Mode.READ);
+        adapter.setWriteHeader(true);
+        adapter.setFile("filename");
+
+        assertEquals(ModuleName.ADAPTER_FILE, adapter.getType());
+        assertEquals(Mode.READ, adapter.getMode());
+        assertEquals(true, adapter.isWriteHeader());
+        assertEquals("filename", adapter.getFile());
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/module/AdapterMongoDBTest.java b/services/billing-aws/src/test/java/com/epam/datalab/module/AdapterMongoDBTest.java
new file mode 100644
index 0000000..7984520
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/module/AdapterMongoDBTest.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module;
+
+import com.epam.datalab.core.AdapterBase.Mode;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.mongo.AdapterMongoDb;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class AdapterMongoDBTest {
+
+    @Test
+    public void config() throws InitializationException {
+        AdapterMongoDb adapter = new AdapterMongoDb();
+        adapter.setMode(Mode.WRITE);
+        adapter.setWriteHeader(false);
+        adapter.setHost("host");
+        adapter.setPort(123);
+        adapter.setDatabase("database");
+        adapter.setUsername("username");
+        adapter.setPassword("password");
+        adapter.setBufferSize(321);
+        adapter.setUpsert(true);
+
+        assertEquals(ModuleName.ADAPTER_MONGO_DATALAB, adapter.getType());
+        assertEquals(Mode.WRITE, adapter.getMode());
+        assertEquals(false, adapter.isWriteHeader());
+        assertEquals("host", adapter.getHost());
+        assertEquals(123, adapter.getPort());
+        assertEquals("database", adapter.getDatabase());
+        assertEquals("username", adapter.getUsername());
+        assertEquals("password", adapter.getPassword());
+        assertEquals(321, adapter.getBufferSize());
+        assertEquals(true, adapter.isUpsert());
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/module/ParserCsvTest.java b/services/billing-aws/src/test/java/com/epam/datalab/module/ParserCsvTest.java
new file mode 100644
index 0000000..e3ed1e9
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/module/ParserCsvTest.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module;
+
+import com.epam.datalab.core.aggregate.AggregateGranularity;
+import com.epam.datalab.exceptions.InitializationException;
+import com.epam.datalab.exceptions.ParseException;
+import com.epam.datalab.module.aws.FilterAWS;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.Lists;
+import org.junit.Test;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class ParserCsvTest {
+
+    @Test
+    public void config() throws InitializationException {
+        ParserCsv parser = new ParserCsv();
+
+        parser.setFieldSeparator('a');
+        parser.setFieldTerminator('b');
+        parser.setEscapeChar('c');
+        parser.setDecimalSeparator('d');
+        parser.setGroupingSeparator('e');
+        parser.setAggregate(AggregateGranularity.DAY.toString());
+        parser.setColumnMapping("ColumnMapping");
+        parser.setHeaderLineNo(123);
+        parser.setSkipLines(321);
+
+        assertEquals(ModuleName.PARSER_CSV, parser.getType());
+        assertEquals('a', parser.getFieldSeparator());
+        assertEquals('b', parser.getFieldTerminator());
+        assertEquals('c', parser.getEscapeChar());
+        assertEquals('d', parser.getDecimalSeparator());
+        assertEquals('e', parser.getGroupingSeparator());
+        assertEquals(AggregateGranularity.DAY, parser.getAggregate());
+        assertEquals("ColumnMapping", parser.getColumnMapping());
+        assertEquals(123, parser.getHeaderLineNo());
+        assertEquals(321, parser.getSkipLines());
+
+        AdapterConsole adapterIn = new AdapterConsole();
+        AdapterConsole adapterOut = new AdapterConsole();
+        FilterAWS filter = new FilterAWS();
+        parser.build(adapterIn, adapterOut, filter);
+
+        assertEquals(adapterIn, parser.getAdapterIn());
+        assertEquals(adapterOut, parser.getAdapterOut());
+        assertEquals(filter, parser.getFilter());
+
+        parser.initialize();
+    }
+
+    @Test
+    public void parseRow() throws ParseException {
+        ParserCsv parser = new ParserCsv();
+        final List<String> row = Lists.newArrayList("qwe", "rty", "\"uio\"", "asd\"fgh\"jkl");
+        final String line = "\"qwe\",\"rty\",\"\\\"uio\\\"\",\"asd\\\"fgh\\\"jkl\"";
+        List<String> rowParsed = parser.parseRow(line);
+        assertEquals(MoreObjects.toStringHelper(this).add("row", row).toString(), MoreObjects.toStringHelper(this).add("row", rowParsed).toString());
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/module/aws/AdapterS3FileTest.java b/services/billing-aws/src/test/java/com/epam/datalab/module/aws/AdapterS3FileTest.java
new file mode 100644
index 0000000..318fb1f
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/module/aws/AdapterS3FileTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module.aws;
+
+import com.epam.datalab.core.AdapterBase.Mode;
+import com.epam.datalab.module.ModuleName;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class AdapterS3FileTest {
+
+    @Test
+    public void config() {
+        AdapterS3File adapter = new AdapterS3File();
+        adapter.setMode(Mode.READ);
+        adapter.setWriteHeader(true);
+        adapter.setBucket("bucket");
+        adapter.setPath("path");
+        adapter.setAccountId("accountId");
+        adapter.setAccessKeyId("accessKeyId");
+        adapter.setSecretAccessKey("secretAccessKey");
+
+        assertEquals(ModuleName.ADAPTER_S3_FILE, adapter.getType());
+        assertEquals(Mode.READ, adapter.getMode());
+        assertEquals(true, adapter.isWriteHeader());
+        assertEquals("bucket", adapter.getBucket());
+        assertEquals("path", adapter.getPath());
+        assertEquals("accountId", adapter.getAccountId());
+        assertEquals("accessKeyId", adapter.getAccessKeyId());
+        assertEquals("secretAccessKey", adapter.getSecretAccessKey());
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/module/aws/FilterAWSTest.java b/services/billing-aws/src/test/java/com/epam/datalab/module/aws/FilterAWSTest.java
new file mode 100644
index 0000000..f6dfd17
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/module/aws/FilterAWSTest.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module.aws;
+
+import com.epam.datalab.exceptions.ParseException;
+import com.epam.datalab.model.aws.ReportLine;
+import com.epam.datalab.module.ModuleName;
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class FilterAWSTest {
+
+    @Test
+    public void config() {
+        FilterAWS filter = new FilterAWS();
+        filter.setCurrencyCode("currency");
+
+        assertEquals(ModuleName.FILTER_AWS, filter.getType());
+        assertEquals("currency", filter.getCurrencyCode());
+    }
+
+    @Test
+    public void canAccept() throws ParseException {
+        FilterAWS filter = new FilterAWS();
+        filter.setCurrencyCode("currency");
+
+        ReportLine row = new ReportLine();
+        row = filter.canAccept(row);
+
+        assertEquals(filter.getCurrencyCode(), row.getCurrencyCode());
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/datalab/module/aws/S3FileListTest.java b/services/billing-aws/src/test/java/com/epam/datalab/module/aws/S3FileListTest.java
new file mode 100644
index 0000000..da38bb8
--- /dev/null
+++ b/services/billing-aws/src/test/java/com/epam/datalab/module/aws/S3FileListTest.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.module.aws;
+
+import com.amazonaws.services.s3.AmazonS3Client;
+import com.amazonaws.services.s3.model.ListObjectsV2Request;
+import com.amazonaws.services.s3.model.ListObjectsV2Result;
+import com.amazonaws.services.s3.model.S3ObjectSummary;
+import com.epam.datalab.core.ModuleData;
+import com.epam.datalab.exceptions.AdapterException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.sql.Date;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Arrays;
+import java.util.List;
+
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.TestCase.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class S3FileListTest {
+
+    @Test
+    public void sort() throws AdapterException {
+        final AmazonS3Client s3Client = mock(AmazonS3Client.class);
+        final ListObjectsV2Result result = mock(ListObjectsV2Result.class);
+        final ModuleData moduleData = mock(ModuleData.class);
+        final String[] array = {
+                "report-prefix/report/20160101-20160131/123456789/report-1.csv",
+                "report-prefix/report/20160101-20160131/123456789/report-2.csv",
+                "report-prefix/report/20160101-20160131/123456789/report-3.csv",
+                "report-prefix/report/20160202-20160231/123456789/report.csv",
+                "report-prefix/report/20160202-20160301/123456789/report.csv",
+                "report-prefix/report/20160303-20160301/123456789/report-1.csv",
+                "report-prefix/report/20160303-20160301/123456789/report-2.csv",
+                "report-prefix/report/20160303-20160302/123456789/report-1.csv",
+                "report-prefix/report/20160303-20160302/123456789/report-2.csv"
+        };
+        final List<S3ObjectSummary> objectSummaries = Arrays.asList(
+                getObjectSummary(array[0], LocalDate.of(2018, 4, 4)),
+                getObjectSummary(array[4], LocalDate.of(2018, 4, 4)),
+                getObjectSummary(array[1], LocalDate.of(2018, 4, 4)),
+                getObjectSummary(array[2], LocalDate.of(2018, 4, 4)),
+                getObjectSummary(array[3], LocalDate.of(2018, 4, 4)),
+                getObjectSummary(array[5], LocalDate.of(2018, 4, 4)),
+                getObjectSummary(array[6], LocalDate.of(2018, 4, 4)),
+                getObjectSummary(array[7], LocalDate.of(2018, 4, 4)),
+                getObjectSummary(array[8], LocalDate.of(2018, 4, 4))
+
+        );
+        when(s3Client.listObjectsV2(any(ListObjectsV2Request.class))).thenReturn(result);
+        when(result.getObjectSummaries()).thenReturn(objectSummaries);
+        when(moduleData.wasProcessed(any(), any(), anyString())).thenReturn(false);
+
+        S3FileList s3list = new S3FileList(false, "test", moduleData);
+        final List<String> list = s3list.getFiles(s3Client);
+
+        assertEquals(array.length, list.size());
+        for (int i = 0; i < array.length; i++) {
+            assertEquals(array[i], list.get(i));
+        }
+    }
+
+    @Test
+    public void testGettingLastFilesInBillingPeriod() throws Exception {
+        final ListObjectsV2Result result = mock(ListObjectsV2Result.class);
+        final ModuleData moduleData = mock(ModuleData.class);
+        final List<S3ObjectSummary> objectSummaries = Arrays.asList(
+                getObjectSummary("DATALAB-billing/reportName/20180101-20180201/guid1/test-1.csv.zip",
+                        LocalDate.of(2018, 4, 1)),
+                getObjectSummary("DATALAB-billing/reportName/20180101-20180201/guid1/test-2.csv.zip",
+                        LocalDate.of(2018, 4, 1)),
+                getObjectSummary("DATALAB-billing/reportName/20180101-20180201/guid0/test-1.csv.zip",
+                        LocalDate.of(2018, 1, 1)),
+                getObjectSummary("DATALAB-billing/reportName/20180201-20180301/guid0/test-1.csv.zip",
+                        LocalDate.of(2018, 1, 1)),
+                getObjectSummary("DATALAB-billing/reportName/20180202-20180301/guid0/test-2.csv.zip",
+                        LocalDate.of(2018, 1, 1))
+
+        );
+        when(result.getObjectSummaries()).thenReturn(objectSummaries);
+        final List<String> files = new S3FileList(true, null, moduleData).lastFilesPerBillingPeriod(result
+                .getObjectSummaries());
+
+        assertEquals(4, files.size());
+        assertTrue(files.contains("DATALAB-billing/reportName/20180101-20180201/guid1/test-1.csv.zip"));
+        assertTrue(files.contains("DATALAB-billing/reportName/20180101-20180201/guid1/test-2.csv.zip"));
+        assertTrue(files.contains("DATALAB-billing/reportName/20180201-20180301/guid0/test-1.csv.zip"));
+        assertTrue(files.contains("DATALAB-billing/reportName/20180202-20180301/guid0/test-2.csv.zip"));
+
+
+    }
+
+    private S3ObjectSummary getObjectSummary(String key, LocalDate modificationDate) {
+        final S3ObjectSummary objectSummary = new S3ObjectSummary();
+        objectSummary.setKey(key);
+        objectSummary.setLastModified(Date.from(modificationDate.atStartOfDay(ZoneId.systemDefault()).toInstant()));
+        return objectSummary;
+    }
+}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/configuration/BillingToolConfigurationTest.java b/services/billing-aws/src/test/java/com/epam/dlab/configuration/BillingToolConfigurationTest.java
deleted file mode 100644
index 4577516..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/configuration/BillingToolConfigurationTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.configuration;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertNotNull;
-
-import org.junit.Ignore;
-import org.junit.Test;
-
-import com.epam.dlab.core.AdapterBase.Mode;
-import com.epam.dlab.core.aggregate.AggregateGranularity;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.module.AdapterConsole;
-import com.epam.dlab.module.AdapterFile;
-import com.epam.dlab.module.ModuleName;
-import com.epam.dlab.module.ParserCsv;
-import com.epam.dlab.module.aws.FilterAWS;
-import com.fasterxml.jackson.databind.JsonNode;
-
-public class BillingToolConfigurationTest {
-
-	@Test
-	@Ignore
-	public void config() throws InitializationException {
-		JsonNode node = new ConfigJsonGenerator()
-				.withAdapterIn("type", ModuleName.ADAPTER_FILE,
-								"file", "fileIn.csv")
-				.withAdapterOut("type", ModuleName.ADAPTER_CONSOLE)
-				.withFilter("type", ModuleName.FILTER_AWS,
-							"currencyCode", "USD",
-							"columnDlabTag", "user:user:tag",
-							"serviceBaseName", "sbn")
-				.withParser("type", ModuleName.PARSER_CSV,
-							"columnMapping", "dlab_id=user:user:tag;usage_date=UsageStartDate;product=ProductName;" +
-											"tags=Operation,ItemDescription",
-							"whereCondition", "UsageStartDate >= '2017-04-12'",
-							"aggregate", "day",
-							"headerLineNo", "5",
-							"skipLines", "10",
-							"fieldSeparator", ";",
-							"fieldTerminator", "^",
-							"escapeChar", "/",
-							"decimalSeparator", ",",
-							"groupingSeparator", "_")
-				.build();
-		BillingToolConfiguration conf = BillingToolConfigurationFactory.build(node, BillingToolConfiguration.class);
-		ParserCsv parser = (ParserCsv) conf.build();
-		
-		assertNotNull("Parser was not build", parser);
-		
-		AdapterFile in = (AdapterFile) parser.getAdapterIn();
-		assertEquals(ModuleName.ADAPTER_FILE, in.getType());
-		assertEquals(Mode.READ, in.getMode());
-		assertEquals("fileIn.csv", in.getFile());
-		
-		AdapterConsole out = (AdapterConsole) parser.getAdapterOut();
-		assertEquals(ModuleName.ADAPTER_CONSOLE, out.getType());
-		assertEquals(Mode.WRITE, out.getMode());
-		
-		FilterAWS filter = (FilterAWS) parser.getFilter();
-		assertEquals(ModuleName.FILTER_AWS, filter.getType());
-		assertEquals("USD", filter.getCurrencyCode());
-		assertEquals("user:user:tag", filter.getColumnDlabTag());
-		assertEquals("sbn", filter.getServiceBaseName());
-		assertEquals(parser, filter.getParser());
-		
-		assertEquals(ModuleName.PARSER_CSV, parser.getType());
-		assertEquals("dlab_id=user:user:tag;usage_date=UsageStartDate;product=ProductName;tags=Operation,ItemDescription",
-				parser.getColumnMapping());
-		assertEquals("UsageStartDate >= '2017-04-12'", parser.getWhereCondition());
-		assertEquals(AggregateGranularity.DAY, parser.getAggregate());
-		assertEquals(5, parser.getHeaderLineNo());
-		assertEquals(10, parser.getSkipLines());
-		assertEquals(';', parser.getFieldSeparator());
-		assertEquals('^', parser.getFieldTerminator());
-		assertEquals('/', parser.getEscapeChar());
-		assertEquals(',', parser.getDecimalSeparator());
-		assertEquals('_', parser.getGroupingSeparator());
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/configuration/ConfigJsonGeneratorTest.java b/services/billing-aws/src/test/java/com/epam/dlab/configuration/ConfigJsonGeneratorTest.java
deleted file mode 100644
index 15d3224..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/configuration/ConfigJsonGeneratorTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.configuration;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertNotNull;
-
-import java.io.IOException;
-
-import org.junit.Test;
-
-import com.fasterxml.jackson.databind.JsonNode;
-
-public class ConfigJsonGeneratorTest {
-	
-	private void checkProperty(JsonNode conf, String module, String name, String expectedValue) {
-		JsonNode m = conf.get(module);
-		assertNotNull("Module \"" + module + "\" not found in JSON configuration", m);
-		
-		JsonNode item = m.get(0);
-		assertNotNull("Property \"" + module + "." + name + "\" not found in JSON configuration", item);
-		
-		JsonNode p = item.get(name);
-		assertNotNull("Property \"" + module + "." + name + "\" not found in JSON configuration", p);
-		
-		assertEquals(expectedValue, p.asText());
-	}
-
-	@Test
-	public void build() throws IOException {
-		JsonNode conf = new ConfigJsonGenerator()
-				.withAdapterIn("adapterInProperty", "adapterInValue")
-				.withAdapterOut("adapterOutProperty", "adapterOutValue")
-				.withParser("parserProperty", "parserValue")
-				.withFilter("filterProperty", "filterValue")
-				.build();
-		
-		checkProperty(conf, "adapterIn", "adapterInProperty", "adapterInValue");
-		checkProperty(conf, "adapterOut", "adapterOutProperty", "adapterOutValue");
-		checkProperty(conf, "parser", "parserProperty", "parserValue");
-		checkProperty(conf, "filter", "filterProperty", "filterValue");
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/configuration/ConfigurationValidatorTest.java b/services/billing-aws/src/test/java/com/epam/dlab/configuration/ConfigurationValidatorTest.java
deleted file mode 100644
index 9d75413..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/configuration/ConfigurationValidatorTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.configuration;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.fail;
-
-import javax.validation.constraints.NotNull;
-
-import org.junit.Test;
-
-import com.epam.dlab.exceptions.InitializationException;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-public class ConfigurationValidatorTest {
-	
-	class TestProperty {
-		
-		@JsonProperty
-		@NotNull
-		String property;
-	}
-	
-	@Test
-	public void validate() throws InitializationException {
-		ConfigurationValidator<TestProperty> v = new ConfigurationValidator<>();
-		TestProperty o = new TestProperty();
-		try {
-			v.validate(o);
-			fail("Property is null but validate is passed");
-		} catch (InitializationException e) {
-			// OK
-		}
-		o.property = "value";
-		v.validate(o);
-		assertEquals("value", o.property);
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/configuration/LoggingConfigurationFactoryTest.java b/services/billing-aws/src/test/java/com/epam/dlab/configuration/LoggingConfigurationFactoryTest.java
deleted file mode 100644
index 82f5ef5..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/configuration/LoggingConfigurationFactoryTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.configuration;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertNotNull;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.junit.Test;
-
-import com.epam.dlab.core.BillingUtils;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.logging.AppenderBase;
-import com.epam.dlab.logging.AppenderConsole;
-import com.epam.dlab.logging.AppenderFile;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.guava.GuavaModule;
-
-import ch.qos.logback.classic.Level;
-
-public class LoggingConfigurationFactoryTest {
-	
-	private ObjectMapper getMapper() throws InitializationException {
-		ObjectMapper mapper = new ObjectMapper().enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
-		mapper.registerModule(new GuavaModule());
-    	for (Class<?> clazz : BillingUtils.getModuleClassList()) {
-			mapper.registerSubtypes(clazz);
-		}
-    	return mapper;
-	}
-
-	@Test
-	public void config() throws IOException, InitializationException {
-		// {"filter":[{"filterProperty":"filterValue"}],"parser":[{"parserProperty":"parserValue"}],"adapterIn":[{"adapterInProperty":"adapterInValue"}],"adapterOut":[{"adapterOutProperty":"adapterOutValue"}]}
-		final String jsonString =
-			"{\n" +
-			"  \"level\":\"INFO\",\n" +
-			"  \"loggers\":{\n" +
-			"    \"com.epam\":\"DEBUG\",\n" +
-			"    \"org.apache.http\":\"WARN\"},\n" +
-			"  \"appenders\":[\n" +
-			"    {\"type\":\"console\"},\n" +
-			"    {\"type\":\"file\",\n" +
-			"      \"currentLogFilename\":\"billing.log\",\n" +
-			"      \"archive\":true,\n" +
-			"      \"archivedLogFilenamePattern\":\"billing-%d{yyyy-MM-dd}.log.gz\",\n" +
-			"      \"archivedFileCount\":10}]\n" +
-			"}";
-		
-		ObjectMapper mapper = getMapper();
-		JsonNode conf = mapper.readTree(jsonString); // validate JSON
-		LoggingConfigurationFactory logger = mapper.readValue(conf.toString(), LoggingConfigurationFactory.class);
-		
-		assertEquals(Level.INFO, logger.getLevel());
-		assertEquals(Level.DEBUG, logger.getLoggers().get("com.epam"));
-		assertEquals(Level.WARN, logger.getLoggers().get("org.apache.http"));
-		
-		List<AppenderBase> appenders = logger.getAppenders();
-		assertEquals("Invalid number of appenders", 2, appenders.size());
-		
-		AppenderConsole ac = (AppenderConsole) appenders.get(0);
-		assertNotNull(ac);
-		
-		AppenderFile af = (AppenderFile) appenders.get(1);
-		assertEquals("billing.log", af.getCurrentLogFilename());
-		assertEquals(true, af.getArchive());
-		assertEquals("billing-%d{yyyy-MM-dd}.log.gz", af.getArchivedLogFilenamePattern());
-		assertEquals(10, af.getArchivedFileCount());
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/core/BillingUtilsTest.java b/services/billing-aws/src/test/java/com/epam/dlab/core/BillingUtilsTest.java
deleted file mode 100644
index 70d1127..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/core/BillingUtilsTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.fail;
-
-import java.util.List;
-import java.util.Map;
-
-import org.junit.Test;
-
-import com.epam.dlab.core.parser.ParserBase;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.logging.AppenderBase;
-import com.epam.dlab.logging.AppenderConsole;
-import com.epam.dlab.logging.AppenderFile;
-import com.epam.dlab.module.AdapterConsole;
-import com.epam.dlab.module.AdapterFile;
-import com.epam.dlab.module.ParserCsv;
-import com.epam.dlab.module.aws.AdapterS3File;
-import com.epam.dlab.module.aws.FilterAWS;
-import com.epam.dlab.mongo.AdapterMongoDb;
-
-public class BillingUtilsTest {
-	
-	@Test
-	public void stringsToMap() {
-		Map<String, String> map = BillingUtils.stringsToMap(
-				"key1", "value1",
-				"key2", "value2");
-		assertEquals(2, map.size());
-		assertEquals("value1", map.get("key1"));
-		assertEquals("value2", map.get("key2"));
-		
-		try {
-			map = BillingUtils.stringsToMap(
-				"key1", "value1",
-				"key2");
-			fail("Missed value2 is passed");
-		} catch (IllegalArgumentException e) {
-			// OK
-		}
-	}
-	
-	private void checkModule(List<Class<?>> list, Class<?> moduleClass) {
-		for (Class<?> module : list) {
-			if (module == moduleClass) {
-				return;
-			}
-		}
-		fail("Module " + moduleClass.getName() + " is not in module list");
-	}
-	
-	@Test
-	public void getModuleClassList() throws InitializationException {
-		List<Class<?>> list = BillingUtils.getModuleClassList();
-		checkModule(list, AdapterConsole.class);
-		checkModule(list, AdapterFile.class);
-		checkModule(list, AdapterS3File.class);
-		checkModule(list, AdapterMongoDb.class);
-		checkModule(list, FilterAWS.class);
-		checkModule(list, ParserCsv.class);
-		checkModule(list, AppenderConsole.class);
-		checkModule(list, AppenderFile.class);
-	}
-	
-	@Test
-	public void classChildOf() {
-		assertEquals(true, BillingUtils.classChildOf(AdapterConsole.class, AdapterBase.class));
-		assertEquals(false, BillingUtils.classChildOf(AdapterConsole.class, FilterBase.class));
-		assertEquals(true, BillingUtils.classChildOf(FilterAWS.class, FilterBase.class));
-		assertEquals(false, BillingUtils.classChildOf(FilterAWS.class, ParserBase.class));
-		assertEquals(true, BillingUtils.classChildOf(ParserCsv.class, ParserBase.class));
-		assertEquals(false, BillingUtils.classChildOf(ParserCsv.class, AppenderBase.class));
-		assertEquals(true, BillingUtils.classChildOf(AppenderConsole.class, AppenderBase.class));
-		assertEquals(false, BillingUtils.classChildOf(AppenderConsole.class, AdapterBase.class));
-	}
-	
-	@Test
-	public void getModuleType() {
-		assertEquals(ModuleType.ADAPTER, BillingUtils.getModuleType(AdapterConsole.class));
-		assertEquals(ModuleType.ADAPTER, BillingUtils.getModuleType(AdapterFile.class));
-		assertEquals(ModuleType.ADAPTER, BillingUtils.getModuleType(AdapterS3File.class));
-		assertEquals(ModuleType.ADAPTER, BillingUtils.getModuleType(AdapterMongoDb.class));
-		assertEquals(ModuleType.FILTER, BillingUtils.getModuleType(FilterAWS.class));
-		assertEquals(ModuleType.PARSER, BillingUtils.getModuleType(ParserCsv.class));
-		assertEquals(ModuleType.LOGAPPENDER, BillingUtils.getModuleType(AppenderConsole.class));
-		assertEquals(ModuleType.LOGAPPENDER, BillingUtils.getModuleType(AppenderFile.class));
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/core/aggregate/DataAggregatorTest.java b/services/billing-aws/src/test/java/com/epam/dlab/core/aggregate/DataAggregatorTest.java
deleted file mode 100644
index d77ef71..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/core/aggregate/DataAggregatorTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.aggregate;
-
-import static junit.framework.TestCase.assertEquals;
-
-import org.junit.Test;
-
-public class DataAggregatorTest {
-
-	@Test
-	public void append() {
-		UsageDataList list = new UsageDataList();
-		
-		list.append("2017-04-12");
-		list.append("2017-04-12");
-		list.append("2017-04-14");
-		
-		assertEquals(2, list.size());
-		
-		assertEquals(Boolean.FALSE, list.get("2017-04-12"));
-		assertEquals(Boolean.FALSE, list.get("2017-04-14"));
-		
-		list.set("2017-04-14", true);
-		assertEquals(Boolean.TRUE, list.get("2017-04-14"));
-		
-		list.clear();
-		assertEquals(0, list.size());
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/core/aggregate/UsageDataListTest.java b/services/billing-aws/src/test/java/com/epam/dlab/core/aggregate/UsageDataListTest.java
deleted file mode 100644
index 275a30b..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/core/aggregate/UsageDataListTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.aggregate;
-
-import com.epam.dlab.model.aws.ReportLine;
-import org.junit.Test;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.fail;
-
-public class UsageDataListTest {
-
-	@Test
-	public void day() {
-		DataAggregator agg = new DataAggregator(AggregateGranularity.DAY);
-		ReportLine r;
-
-		r = new ReportLine();
-		r.setUsageDate("2017-04-12 12:34:56");
-		r.setCost(1.2);
-		r.setUsage(10.1);
-		agg.append(r);
-
-		r = new ReportLine();
-		r.setUsageDate("2017-04-12 12:34:78");
-		r.setCost(3.4);
-		r.setUsage(20.2);
-		agg.append(r);
-
-		r = new ReportLine();
-		r.setUsageDate("2017-04-14 11:22:33");
-		r.setCost(5.6);
-		r.setUsage(40.4);
-		agg.append(r);
-
-		assertEquals(AggregateGranularity.DAY, agg.getGranularity());
-		assertEquals(2, agg.size());
-
-		assertEquals("2017-04-12", agg.get(0).getUsageDate());
-		assertEquals(4.6, agg.get(0).getCost());
-		assertEquals(30.3, agg.get(0).getUsage(), 0.000001);
-
-		assertEquals("2017-04-14", agg.get(1).getUsageDate());
-		assertEquals(5.6, agg.get(1).getCost());
-		assertEquals(40.4, agg.get(1).getUsage());
-
-		agg.clear();
-		assertEquals(0, agg.size());
-	}
-
-	@Test
-	public void month() {
-		DataAggregator agg = new DataAggregator(AggregateGranularity.MONTH);
-		ReportLine r;
-
-		r = new ReportLine();
-		r.setUsageDate("2017-04-12 12:34:56");
-		r.setCost(1.2);
-		r.setUsage(10.1);
-		agg.append(r);
-
-		r = new ReportLine();
-		r.setUsageDate("2017-04-12 12:34:78");
-		r.setCost(3.4);
-		r.setUsage(20.2);
-		agg.append(r);
-
-		r = new ReportLine();
-		r.setUsageDate("2017-05-14 11:22:33");
-		r.setCost(5.6);
-		r.setUsage(40.4);
-		agg.append(r);
-
-		assertEquals(AggregateGranularity.MONTH, agg.getGranularity());
-		assertEquals(2, agg.size());
-
-		assertEquals("2017-04", agg.get(0).getUsageDate());
-		assertEquals(4.6, agg.get(0).getCost());
-		assertEquals(30.3, agg.get(0).getUsage(), 0.000001);
-
-		assertEquals("2017-05", agg.get(1).getUsageDate());
-		assertEquals(5.6, agg.get(1).getCost());
-		assertEquals(40.4, agg.get(1).getUsage());
-
-		agg.clear();
-		assertEquals(0, agg.size());
-	}
-
-	@Test
-	public void none() {
-		try {
-			new DataAggregator(AggregateGranularity.NONE);
-			fail("DataArggregator should not have been created");
-		} catch (IllegalArgumentException e) {
-			// OK
-		}
-	}
-
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/BillingResourceTypeTest.java b/services/billing-aws/src/test/java/com/epam/dlab/core/parser/BillingResourceTypeTest.java
deleted file mode 100644
index 9aaa383..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/BillingResourceTypeTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import com.epam.dlab.model.aws.BillingResourceType;
-import org.junit.Test;
-
-import static junit.framework.TestCase.assertEquals;
-
-public class BillingResourceTypeTest {
-	
-	@Test
-	public void test() {
-		BillingResourceType type = BillingResourceType.of("cluster");
-		
-		assertEquals(BillingResourceType.CLUSTER, type);
-		assertEquals(BillingResourceType.CLUSTER.toString(), "CLUSTER");
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ColumnInfoTest.java b/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ColumnInfoTest.java
deleted file mode 100644
index adc1a5e..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ColumnInfoTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import static junit.framework.TestCase.assertEquals;
-
-import org.junit.Test;
-
-public class ColumnInfoTest {
-	
-	@Test
-	public void test() {
-		ColumnInfo ci = new ColumnInfo("target", "source", 123);
-		
-		assertEquals("target", ci.targetName);
-		assertEquals("source", ci.sourceName);
-		assertEquals(123, ci.sourceIndex);
-	}
-
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ColumnMetaTest.java b/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ColumnMetaTest.java
deleted file mode 100644
index c03f87f..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ColumnMetaTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.google.common.collect.Lists;
-import org.junit.Test;
-
-import java.util.List;
-
-import static junit.framework.TestCase.assertEquals;
-
-public class ColumnMetaTest {
-
-	@Test
-	public void getColumnIndexByName() throws InitializationException {
-		final List<String> columns = Lists.newArrayList("sCol1", "sCol2", "sCol3", "sCol4");
-
-		assertEquals(0, ColumnMeta.getColumnIndexByName("sCol1", columns));
-		assertEquals(1, ColumnMeta.getColumnIndexByName("sCol2", columns));
-		assertEquals(3, ColumnMeta.getColumnIndexByName("sCol4", columns));
-
-		try {
-			ColumnMeta.getColumnIndexByName("NotFound", columns);
-
-			throw new RuntimeException("Test failed");
-		} catch (InitializationException e) {
-			// OK
-		}
-	}
-
-	private void checkMapping(ColumnInfo info, String targetColumnName, String sourceColumnName, int
-			sourceColumnIndex) {
-		assertEquals(targetColumnName, info.targetName);
-		assertEquals(sourceColumnName, info.sourceName);
-		assertEquals(sourceColumnIndex, info.sourceIndex);
-	}
-
-	@Test
-	public void create() throws InitializationException {
-		final String mapping =
-				ColumnMeta.COLUMN_NAMES[0] + "=sCol2;" +
-						ColumnMeta.COLUMN_NAMES[1] + "=$1;" +
-						ReportLine.FIELD_TAGS + "=sCol4,$3";
-		final List<String> columns = Lists.newArrayList("sCol1", "sCol2", "sCol3", "sCol4");
-		ColumnMeta meta = new ColumnMeta(mapping, columns);
-
-		assertEquals(4, meta.getSourceColumnNames().size());
-		assertEquals("sCol1", meta.getSourceColumnNames().get(0));
-		assertEquals("sCol2", meta.getSourceColumnNames().get(1));
-		assertEquals("sCol3", meta.getSourceColumnNames().get(2));
-		assertEquals("sCol4", meta.getSourceColumnNames().get(3));
-
-		assertEquals(ColumnMeta.COLUMN_NAMES.length + 1, meta.getTargetColumnNames().size());
-		assertEquals(ColumnMeta.COLUMN_NAMES[0], meta.getTargetColumnNames().get(0));
-		assertEquals("sCol4", meta.getTargetColumnNames().get(ColumnMeta.COLUMN_NAMES.length - 1));
-		assertEquals("sCol3", meta.getTargetColumnNames().get(ColumnMeta.COLUMN_NAMES.length));
-
-		assertEquals(ColumnMeta.COLUMN_NAMES.length + 1, meta.getColumnMapping().size());
-		checkMapping(meta.getColumnMapping().get(0), ColumnMeta.COLUMN_NAMES[0], "sCol2", 1);
-		checkMapping(meta.getColumnMapping().get(1), ColumnMeta.COLUMN_NAMES[1], "sCol1", 0);
-		checkMapping(meta.getColumnMapping().get(ColumnMeta.COLUMN_NAMES.length - 1), ColumnMeta
-				.COLUMN_NAMES[ColumnMeta.COLUMN_NAMES.length - 1], "sCol4", 3);
-		checkMapping(meta.getColumnMapping().get(ColumnMeta.COLUMN_NAMES.length), ColumnMeta.COLUMN_NAMES[ColumnMeta
-				.COLUMN_NAMES.length - 1], "sCol3", 2);
-	}
-
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/CommonFormatTest.java b/services/billing-aws/src/test/java/com/epam/dlab/core/parser/CommonFormatTest.java
deleted file mode 100644
index 632fa96..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/CommonFormatTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import com.epam.dlab.core.BillingUtils;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.epam.dlab.model.aws.BillingResourceType;
-import com.epam.dlab.model.aws.ReportLine;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.junit.Test;
-
-import java.util.List;
-
-import static junit.framework.TestCase.assertEquals;
-
-public class CommonFormatTest {
-
-	private CommonFormat getInstance() throws InitializationException {
-		final List<String> columns = Lists.newArrayList("sCol1", "sCol2", "sCol3", "sCol4");
-		final String mapping = ReportLine.FIELD_DLAB_ID + "=sCol2;" +
-				ReportLine.FIELD_USER_ID + "=$1;" + ReportLine.FIELD_TAGS + "=$4,sCol3";
-		ColumnMeta meta = new ColumnMeta(mapping, columns);
-		return new CommonFormat(meta, '.', ' ');
-	}
-
-	@Test
-	public void toCommonFormat() throws InitializationException, ParseException {
-		final CommonFormat format = getInstance();
-		final List<String> values = Lists.newArrayList("value1", "value2", "value3", "value4");
-		final ReportLine r = format.toCommonFormat(values);
-
-		assertEquals("value2", r.getDlabId());
-		assertEquals("value1", r.getUser());
-		assertEquals(2, r.getTags().size());
-		assertEquals("value4", r.getTags().get("sCol4"));
-		assertEquals("value3", r.getTags().get("sCol3"));
-
-		assertEquals(123456.789, format.parseDouble("column1", "123 456.789"));
-		assertEquals("12345.678", CommonFormat.doubleToString(12345.678));
-	}
-
-	@Test
-	public void rowToString() throws ParseException {
-		final List<String> values = Lists.newArrayList("val\"ue1", "\"val,;ue2\"", "value3", "value4");
-		String line = CommonFormat.rowToString(values);
-		assertEquals("\"val\\\"ue1\",\"\\\"val,;ue2\\\"\",\"value3\",\"value4\"", line);
-
-		final ReportLine r = new ReportLine();
-		r.setDlabId("accountId");
-		r.setUser("user");
-		r.setUsageDate("2016-03-20");
-		r.setProduct("Amazon Elastic Compute Cloud");
-		r.setUsageType("usageType");
-		r.setUsage(56.7);
-		r.setCost(1234.56789);
-		r.setCurrencyCode("USD");
-		r.setResourceTypeId("i-1234567890abcdefg");
-		r.setTags(Maps.newLinkedHashMap(BillingUtils.stringsToMap("tag1", "value1", "tag2", "value2")));
-		line = CommonFormat.rowToString(r);
-		assertEquals("\"accountId\",\"user\",\"2016-03-20\",\"Amazon Elastic Compute Cloud\"," +
-				"\"usageType\",\"56.7\",\"1234.56789\",\"USD\"," +
-				"\"COMPUTER\",\"i-1234567890abcdefg\"," +
-				"\"value1\",\"value2\"", line);
-	}
-
-	@Test
-	public void toReportLine() throws InitializationException, ParseException {
-		final CommonFormat format = getInstance();
-		final List<String> values = Lists.newArrayList(
-				"accountId", "user", "2016-03-27",
-				"Amazon Elastic Compute Cloud", "usageType", "56.7", "1234.56789", "USD",
-				"i-1234567890abcdefg", "value1", "value2");
-		final ReportLine r = format.toReportLine(values);
-
-		assertEquals("accountId", r.getDlabId());
-		assertEquals("user", r.getUser());
-		assertEquals("2016-03-27", r.getUsageDate());
-		assertEquals("Amazon Elastic Compute Cloud", r.getProduct());
-		assertEquals("usageType", r.getUsageType());
-		assertEquals(56.7, r.getUsage());
-		assertEquals(1234.56789, r.getCost());
-		assertEquals("USD", r.getCurrencyCode());
-		assertEquals(BillingResourceType.COMPUTER, r.getResourceType());
-		assertEquals("i-1234567890abcdefg", r.getResourceId());
-		assertEquals("value1", r.getTags().get("sCol4"));
-		assertEquals("value2", r.getTags().get("sCol3"));
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ConditionEvaluateTest.java b/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ConditionEvaluateTest.java
deleted file mode 100644
index 548aa5c..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ConditionEvaluateTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import static junit.framework.TestCase.assertEquals;
-
-import java.util.List;
-
-import org.junit.Test;
-
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.google.common.collect.Lists;
-
-public class ConditionEvaluateTest {
-	private static final List<String> columnNames = Lists.newArrayList("column1", "column2", "column3");
-	
-	private void checkCondition(boolean excpectedResult, String condition, String ... values
-			) throws InitializationException, ParseException {
-		ConditionEvaluate c = new ConditionEvaluate(columnNames, condition);
-		final List<String> row = Lists.newArrayList(values);
-		assertEquals(excpectedResult, c.evaluate(row));
-	}
-
-	private void isTrue(String condition, String ... values
-			) throws InitializationException, ParseException {
-		checkCondition(true, condition, values);
-	}
-
-	private void isFalse(String condition, String ... values
-			) throws InitializationException, ParseException {
-		checkCondition(false, condition, values);
-	}
-
-	@Test
-	public void mixCondition() throws InitializationException, ParseException {
-		String condition = "column1 == 123 && column2 == '456' && column3 > 0.2";
-		ConditionEvaluate c = new ConditionEvaluate(columnNames, condition);
-		
-		List<String> row = Lists.newArrayList("123", "456", "0.5");
-		assertEquals(true, c.evaluate(row));
-		
-		row = Lists.newArrayList("123", "456", "-5");
-		assertEquals(false, c.evaluate(row));
-		
-		isFalse("column1 == 123 || column2 == 321", "321", "123");
-		isTrue("column1 == 123 || column2 == 321", "123", "456");
-		isTrue("column1 == 123 || column2 == 321", "456", "321");
-
-		isFalse("(column1 == 123 || column2 == 321) && column3 == 5", "321", "123", "5");
-		isFalse("(column1 == 123 || column2 == 321) && column3 == 5", "123", "321", "4");
-		
-		isTrue("(column1 == 123 || column2 == 321) && column3 == 5", "123", "456", "5");
-		isTrue("(column1 == 123 || column2 == 321) && column3 == 5", "234", "321", "5");
-	}
-
-	@Test
-	public void compareInteger() throws InitializationException, ParseException {
-		isFalse("column1 == 123", "456");
-		isTrue("column1 == 123", "123");
-		
-		isFalse("column1 != 123", "123");
-		isTrue("column1 != 123", "456");
-
-		isFalse("column1 < 123", "123");
-		isTrue("column1 < 123", "122");
-
-		isFalse("column1 > 123", "123");
-		isTrue("column1 > 123", "124");
-
-		isFalse("column1 <= 123", "124");
-		isTrue("column1 <= 123", "123");
-		isTrue("column1 <= 123", "122");
-
-		isFalse("column1 >= 123", "122");
-		isTrue("column1 >= 123", "123");
-		isTrue("column1 >= 123", "124");
-	}
-
-	@Test
-	public void compareString() throws InitializationException, ParseException {
-		isFalse("column1 == 'abc'", "abcd");
-		isTrue("column1 == 'abc'", "abc");
-		
-		isFalse("column1 != 'abc'", "abc");
-		isTrue("column1 != 'abc'", "asd");
-
-		isFalse("column1 < 'abc'", "abd");
-		isTrue("column1 < 'abc'", "abb");
-
-		isFalse("column1 > 'abc'", "abb");
-		isTrue("column1 > 'abc'", "abd");
-
-		isFalse("column1 <= 'abc'", "abd");
-		isTrue("column1 <= 'abc'", "abc");
-		isTrue("column1 <= 'abc'", "abb");
-
-		isFalse("column1 >= 'abc'", "abb");
-		isTrue("column1 >= 'abc'", "abc");
-		isTrue("column1 >= 'abc'", "abd");
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ReportLineTest.java b/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ReportLineTest.java
deleted file mode 100644
index 72380a4..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/core/parser/ReportLineTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.core.parser;
-
-import com.epam.dlab.core.BillingUtils;
-import com.epam.dlab.exceptions.ParseException;
-import com.epam.dlab.model.aws.BillingResourceType;
-import com.epam.dlab.model.aws.ReportLine;
-import com.google.common.collect.Maps;
-import org.junit.Test;
-
-import static junit.framework.TestCase.assertEquals;
-
-public class ReportLineTest {
-
-	private void checkGetters(ReportLine r) {
-		assertEquals("dlabId", r.getDlabId());
-		assertEquals("user", r.getUser());
-		assertEquals("2016-01-22", r.getUsageDate());
-		assertEquals("Amazon Elastic Compute Cloud", r.getProduct());
-		assertEquals("usageType", r.getUsageType());
-		assertEquals(56.7, r.getUsage());
-		assertEquals(12.34, r.getCost());
-		assertEquals("USD", r.getCurrencyCode());
-		assertEquals("i-1234567890abcdefg", r.getResourceId());
-		assertEquals("value1", r.getTags().get("tag1"));
-		assertEquals("value2", r.getTags().get("tag2"));
-	}
-
-	@Test
-	public void set() throws ParseException {
-		ReportLine r = new ReportLine();
-
-		r.setDlabId("dlabId");
-		r.setCost(12.34);
-		r.setCurrencyCode("USD");
-		r.setProduct("Amazon Elastic Compute Cloud");
-		r.setResourceTypeId("i-1234567890abcdefg");
-		r.setUsage(56.7);
-		r.setUsageDate("2016-01-22");
-		r.setUsageType("usageType");
-		r.setUser("user");
-		r.setTags(Maps.newLinkedHashMap(BillingUtils.stringsToMap("tag1", "value1", "tag2", "value2")));
-
-		checkGetters(r);
-	}
-
-	private void checkResourceType(String product, String resourceTypeId,
-								   BillingResourceType expectedResourceType, String expectedResourceId) throws
-			ParseException {
-		ReportLine r = new ReportLine();
-		r.setProduct(product);
-		r.setResourceTypeId(resourceTypeId);
-
-		assertEquals(expectedResourceType, r.getResourceType());
-		assertEquals(expectedResourceId, r.getResourceId());
-	}
-
-	@Test
-	public void resourceType() throws ParseException {
-		checkResourceType("Amazon Elastic Compute Cloud", "i-000c0e51d117e3b4a", BillingResourceType.COMPUTER,
-				"i-000c0e51d117e3b4a");
-		checkResourceType("Amazon Elastic Compute Cloud", "vol-04c20f339836c56b6", BillingResourceType.STORAGE_EBS,
-				"vol-04c20f339836c56b6");
-		checkResourceType("Amazon Elastic Compute Cloud", "34.208.106.54", BillingResourceType.IP_ADDRESS,
-				"34.208.106.54");
-
-		checkResourceType("Amazon Elastic MapReduce",
-				"arn:aws:elasticmapreduce:us-west-2:203753054073:cluster/j-1FOBGFRC8X4XY", BillingResourceType
-						.CLUSTER, "j-1FOBGFRC8X4XY");
-
-		checkResourceType("Amazon Simple Storage Service", "dlab-s3", BillingResourceType.STORAGE_BUCKET, "dlab-s3");
-		checkResourceType("AmazonCloudWatch",
-				"arn:aws:logs:us-west-2:203753054073:log-group:CloudTrail/DefaultLogGroup", BillingResourceType.OTHER,
-				"arn:aws:logs:us-west-2:203753054073:log-group:CloudTrail/DefaultLogGroup");
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/logging/AppenderConsoleTest.java b/services/billing-aws/src/test/java/com/epam/dlab/logging/AppenderConsoleTest.java
deleted file mode 100644
index deae3f6..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/logging/AppenderConsoleTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.logging;
-
-import static junit.framework.TestCase.assertEquals;
-
-import org.junit.Test;
-
-public class AppenderConsoleTest {
-
-	@Test
-	public void config() {
-		AppenderConsole appender = new AppenderConsole();
-		assertEquals("console", appender.getType());
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/logging/AppenderFileTest.java b/services/billing-aws/src/test/java/com/epam/dlab/logging/AppenderFileTest.java
deleted file mode 100644
index f330771..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/logging/AppenderFileTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.logging;
-
-import static junit.framework.TestCase.assertEquals;
-
-import org.junit.Test;
-
-public class AppenderFileTest {
-
-	@Test
-	public void config() {
-		AppenderFile appender = new AppenderFile();
-		appender.setArchive(true);
-		appender.setArchivedFileCount(123);
-		appender.setArchivedLogFilenamePattern("file.log.zip");
-		appender.setCurrentLogFilename("file.log");
-		
-		assertEquals("file", appender.getType());
-		assertEquals(true, appender.getArchive());
-		assertEquals(123, appender.getArchivedFileCount());
-		assertEquals("file.log.zip", appender.getArchivedLogFilenamePattern());
-		assertEquals("file.log", appender.getCurrentLogFilename());
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/module/AdapterConsoleTest.java b/services/billing-aws/src/test/java/com/epam/dlab/module/AdapterConsoleTest.java
deleted file mode 100644
index 9df26c1..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/module/AdapterConsoleTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module;
-
-import static junit.framework.TestCase.assertEquals;
-
-import org.junit.Test;
-
-public class AdapterConsoleTest {
-
-	@Test
-	public void config() {
-		AdapterConsole adapter = new AdapterConsole();
-		assertEquals(ModuleName.ADAPTER_CONSOLE, adapter.getType());
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/module/AdapterFileTest.java b/services/billing-aws/src/test/java/com/epam/dlab/module/AdapterFileTest.java
deleted file mode 100644
index 0894f30..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/module/AdapterFileTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module;
-
-import static junit.framework.TestCase.assertEquals;
-
-import org.junit.Test;
-
-import com.epam.dlab.core.AdapterBase.Mode;
-
-public class AdapterFileTest {
-
-	@Test
-	public void config() {
-		AdapterFile adapter = new AdapterFile();
-		adapter.setMode(Mode.READ);
-		adapter.setWriteHeader(true);
-		adapter.setFile("filename");
-		
-		assertEquals(ModuleName.ADAPTER_FILE, adapter.getType());
-		assertEquals(Mode.READ, adapter.getMode());
-		assertEquals(true, adapter.isWriteHeader());
-		assertEquals("filename", adapter.getFile());
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/module/AdapterMongoDBTest.java b/services/billing-aws/src/test/java/com/epam/dlab/module/AdapterMongoDBTest.java
deleted file mode 100644
index 034c32c..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/module/AdapterMongoDBTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module;
-
-import static junit.framework.TestCase.assertEquals;
-
-import org.junit.Test;
-
-import com.epam.dlab.core.AdapterBase.Mode;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.mongo.AdapterMongoDb;
-
-public class AdapterMongoDBTest {
-
-	@Test
-	public void config() throws InitializationException {
-		AdapterMongoDb adapter = new AdapterMongoDb();
-		adapter.setMode(Mode.WRITE);
-		adapter.setWriteHeader(false);
-		adapter.setHost("host");
-		adapter.setPort(123);
-		adapter.setDatabase("database");
-		adapter.setUsername("username");
-		adapter.setPassword("password");
-		adapter.setBufferSize(321);
-		adapter.setUpsert(true);
-		
-		assertEquals(ModuleName.ADAPTER_MONGO_DLAB, adapter.getType());
-		assertEquals(Mode.WRITE, adapter.getMode());
-		assertEquals(false, adapter.isWriteHeader());
-		assertEquals("host", adapter.getHost());
-		assertEquals(123, adapter.getPort());
-		assertEquals("database", adapter.getDatabase());
-		assertEquals("username", adapter.getUsername());
-		assertEquals("password", adapter.getPassword());
-		assertEquals(321, adapter.getBufferSize());
-		assertEquals(true, adapter.isUpsert());
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/module/ParserCsvTest.java b/services/billing-aws/src/test/java/com/epam/dlab/module/ParserCsvTest.java
deleted file mode 100644
index 63ec202..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/module/ParserCsvTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module;
-
-import static junit.framework.TestCase.assertEquals;
-
-import java.util.List;
-
-import org.junit.Test;
-
-import com.epam.dlab.core.aggregate.AggregateGranularity;
-import com.epam.dlab.exceptions.InitializationException;
-import com.epam.dlab.exceptions.ParseException;
-import com.epam.dlab.module.aws.FilterAWS;
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.Lists;
-
-public class ParserCsvTest {
-
-	@Test
-	public void config() throws InitializationException {
-		ParserCsv parser = new ParserCsv();
-		
-		parser.setFieldSeparator('a');
-		parser.setFieldTerminator('b');
-		parser.setEscapeChar('c');
-		parser.setDecimalSeparator('d');
-		parser.setGroupingSeparator('e');
-		parser.setAggregate(AggregateGranularity.DAY.toString());
-		parser.setColumnMapping("ColumnMapping");
-		parser.setHeaderLineNo(123);
-		parser.setSkipLines(321);
-
-		assertEquals(ModuleName.PARSER_CSV, parser.getType());
-		assertEquals('a', parser.getFieldSeparator());
-		assertEquals('b', parser.getFieldTerminator());
-		assertEquals('c', parser.getEscapeChar());
-		assertEquals('d', parser.getDecimalSeparator());
-		assertEquals('e', parser.getGroupingSeparator());
-		assertEquals(AggregateGranularity.DAY, parser.getAggregate());
-		assertEquals("ColumnMapping", parser.getColumnMapping());
-		assertEquals(123, parser.getHeaderLineNo());
-		assertEquals(321, parser.getSkipLines());
-
-		AdapterConsole adapterIn = new AdapterConsole();
-		AdapterConsole adapterOut = new AdapterConsole();
-		FilterAWS filter = new FilterAWS();
-		parser.build(adapterIn, adapterOut, filter);
-		
-		assertEquals(adapterIn, parser.getAdapterIn());
-		assertEquals(adapterOut, parser.getAdapterOut());
-		assertEquals(filter, parser.getFilter());
-		
-		parser.initialize();
-	}
-	
-	@Test
-	public void parseRow() throws ParseException {
-		ParserCsv parser = new ParserCsv();
-		final List<String> row = Lists.newArrayList("qwe", "rty", "\"uio\"", "asd\"fgh\"jkl");
-		final String line = "\"qwe\",\"rty\",\"\\\"uio\\\"\",\"asd\\\"fgh\\\"jkl\"";
-		List<String> rowParsed = parser.parseRow(line);
-		assertEquals(MoreObjects.toStringHelper(this).add("row", row).toString(), MoreObjects.toStringHelper(this).add("row", rowParsed).toString());
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/module/aws/AdapterS3FileTest.java b/services/billing-aws/src/test/java/com/epam/dlab/module/aws/AdapterS3FileTest.java
deleted file mode 100644
index 7d29792..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/module/aws/AdapterS3FileTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module.aws;
-
-import static junit.framework.TestCase.assertEquals;
-
-import org.junit.Test;
-
-import com.epam.dlab.core.AdapterBase.Mode;
-import com.epam.dlab.module.ModuleName;
-
-public class AdapterS3FileTest {
-
-	@Test
-	public void config() {
-		AdapterS3File adapter = new AdapterS3File();
-		adapter.setMode(Mode.READ);
-		adapter.setWriteHeader(true);
-		adapter.setBucket("bucket");
-		adapter.setPath("path");
-		adapter.setAccountId("accountId");
-		adapter.setAccessKeyId("accessKeyId");
-		adapter.setSecretAccessKey("secretAccessKey");
-		
-		assertEquals(ModuleName.ADAPTER_S3_FILE, adapter.getType());
-		assertEquals(Mode.READ, adapter.getMode());
-		assertEquals(true, adapter.isWriteHeader());
-		assertEquals("bucket", adapter.getBucket());
-		assertEquals("path", adapter.getPath());
-		assertEquals("accountId", adapter.getAccountId());
-		assertEquals("accessKeyId", adapter.getAccessKeyId());
-		assertEquals("secretAccessKey", adapter.getSecretAccessKey());
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/module/aws/FilterAWSTest.java b/services/billing-aws/src/test/java/com/epam/dlab/module/aws/FilterAWSTest.java
deleted file mode 100644
index 03deeb9..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/module/aws/FilterAWSTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module.aws;
-
-import com.epam.dlab.exceptions.ParseException;
-import com.epam.dlab.model.aws.ReportLine;
-import com.epam.dlab.module.ModuleName;
-import org.junit.Test;
-
-import static junit.framework.TestCase.assertEquals;
-
-public class FilterAWSTest {
-
-	@Test
-	public void config() {
-		FilterAWS filter = new FilterAWS();
-		filter.setCurrencyCode("currency");
-
-		assertEquals(ModuleName.FILTER_AWS, filter.getType());
-		assertEquals("currency", filter.getCurrencyCode());
-	}
-
-	@Test
-	public void canAccept() throws ParseException {
-		FilterAWS filter = new FilterAWS();
-		filter.setCurrencyCode("currency");
-
-		ReportLine row = new ReportLine();
-		row = filter.canAccept(row);
-
-		assertEquals(filter.getCurrencyCode(), row.getCurrencyCode());
-	}
-}
diff --git a/services/billing-aws/src/test/java/com/epam/dlab/module/aws/S3FileListTest.java b/services/billing-aws/src/test/java/com/epam/dlab/module/aws/S3FileListTest.java
deleted file mode 100644
index 56315b5..0000000
--- a/services/billing-aws/src/test/java/com/epam/dlab/module/aws/S3FileListTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.module.aws;
-
-import com.amazonaws.services.s3.AmazonS3Client;
-import com.amazonaws.services.s3.model.ListObjectsV2Request;
-import com.amazonaws.services.s3.model.ListObjectsV2Result;
-import com.amazonaws.services.s3.model.S3ObjectSummary;
-import com.epam.dlab.core.ModuleData;
-import com.epam.dlab.exceptions.AdapterException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.sql.Date;
-import java.time.LocalDate;
-import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.TestCase.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class S3FileListTest {
-
-	@Test
-	public void sort() throws AdapterException {
-		final AmazonS3Client s3Client = mock(AmazonS3Client.class);
-		final ListObjectsV2Result result = mock(ListObjectsV2Result.class);
-		final ModuleData moduleData = mock(ModuleData.class);
-		final String[] array = {
-				"report-prefix/report/20160101-20160131/123456789/report-1.csv",
-				"report-prefix/report/20160101-20160131/123456789/report-2.csv",
-				"report-prefix/report/20160101-20160131/123456789/report-3.csv",
-				"report-prefix/report/20160202-20160231/123456789/report.csv",
-				"report-prefix/report/20160202-20160301/123456789/report.csv",
-				"report-prefix/report/20160303-20160301/123456789/report-1.csv",
-				"report-prefix/report/20160303-20160301/123456789/report-2.csv",
-				"report-prefix/report/20160303-20160302/123456789/report-1.csv",
-				"report-prefix/report/20160303-20160302/123456789/report-2.csv"
-		};
-		final List<S3ObjectSummary> objectSummaries = Arrays.asList(
-				getObjectSummary(array[0], LocalDate.of(2018, 4, 4)),
-				getObjectSummary(array[4], LocalDate.of(2018, 4, 4)),
-				getObjectSummary(array[1], LocalDate.of(2018, 4, 4)),
-				getObjectSummary(array[2], LocalDate.of(2018, 4, 4)),
-				getObjectSummary(array[3], LocalDate.of(2018, 4, 4)),
-				getObjectSummary(array[5], LocalDate.of(2018, 4, 4)),
-				getObjectSummary(array[6], LocalDate.of(2018, 4, 4)),
-				getObjectSummary(array[7], LocalDate.of(2018, 4, 4)),
-				getObjectSummary(array[8], LocalDate.of(2018, 4, 4))
-
-		);
-		when(s3Client.listObjectsV2(any(ListObjectsV2Request.class))).thenReturn(result);
-		when(result.getObjectSummaries()).thenReturn(objectSummaries);
-		when(moduleData.wasProcessed(any(),any(), anyString())).thenReturn(false);
-
-		S3FileList s3list = new S3FileList(false, "test", moduleData);
-		final List<String> list = s3list.getFiles(s3Client);
-
-		assertEquals(array.length, list.size());
-		for (int i = 0; i < array.length; i++) {
-			assertEquals(array[i], list.get(i));
-		}
-	}
-
-	@Test
-	public void testGettingLastFilesInBillingPeriod() throws Exception {
-		final ListObjectsV2Result result = mock(ListObjectsV2Result.class);
-		final ModuleData moduleData = mock(ModuleData.class);
-		final List<S3ObjectSummary> objectSummaries = Arrays.asList(
-				getObjectSummary("DLAB-billing/reportName/20180101-20180201/guid1/test-1.csv.zip",
-						LocalDate.of(2018, 4, 1)),
-				getObjectSummary("DLAB-billing/reportName/20180101-20180201/guid1/test-2.csv.zip",
-						LocalDate.of(2018, 4, 1)),
-				getObjectSummary("DLAB-billing/reportName/20180101-20180201/guid0/test-1.csv.zip",
-						LocalDate.of(2018, 1, 1)),
-				getObjectSummary("DLAB-billing/reportName/20180201-20180301/guid0/test-1.csv.zip",
-						LocalDate.of(2018, 1, 1)),
-				getObjectSummary("DLAB-billing/reportName/20180202-20180301/guid0/test-2.csv.zip",
-						LocalDate.of(2018, 1, 1))
-
-		);
-		when(result.getObjectSummaries()).thenReturn(objectSummaries);
-		final List<String> files = new S3FileList(true, null, moduleData).lastFilesPerBillingPeriod(result
-				.getObjectSummaries());
-
-		assertEquals(4, files.size());
-		assertTrue(files.contains("DLAB-billing/reportName/20180101-20180201/guid1/test-1.csv.zip"));
-		assertTrue(files.contains("DLAB-billing/reportName/20180101-20180201/guid1/test-2.csv.zip"));
-		assertTrue(files.contains("DLAB-billing/reportName/20180201-20180301/guid0/test-1.csv.zip"));
-		assertTrue(files.contains("DLAB-billing/reportName/20180202-20180301/guid0/test-2.csv.zip"));
-
-
-	}
-
-	private S3ObjectSummary getObjectSummary(String key, LocalDate modificationDate) {
-		final S3ObjectSummary objectSummary = new S3ObjectSummary();
-		objectSummary.setKey(key);
-		objectSummary.setLastModified(Date.from(modificationDate.atStartOfDay(ZoneId.systemDefault()).toInstant()));
-		return objectSummary;
-	}
-}
diff --git a/services/billing-azure/Dockerfile b/services/billing-azure/Dockerfile
index dc19faf..1986e98 100644
--- a/services/billing-azure/Dockerfile
+++ b/services/billing-azure/Dockerfile
@@ -23,6 +23,6 @@
 
 USER root
 
-COPY billing-azure-2.2.jar /root/
+COPY billing-azure-*.jar /root/
 
-CMD java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 /root/billing-azure-2.2.jar --conf /root/billing.yml
\ No newline at end of file
+CMD java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 /root/billing-azure-*.jar --conf /root/billing.yml
\ No newline at end of file
diff --git a/services/billing-azure/billing.yml b/services/billing-azure/billing.yml
index 5361d90..0695c08 100644
--- a/services/billing-azure/billing.yml
+++ b/services/billing-azure/billing.yml
@@ -26,7 +26,7 @@
     mongodb:
       username: admin
       password: MONGO_PASSWORD
-      database: dlabdb
+      database: datalabdb
       port: MONGO_PORT
       host: MONGO_HOST
 
@@ -41,20 +41,20 @@
 server.ssl.key-alias: ssn
 
 logging:
-  file: /var/opt/dlab/log/ssn/billing.log
+  file: /var/opt/datalab/log/ssn/billing.log
   level:
     com:
       epam: trace
 
 keycloak:
   bearer-only: true
-  realm: dlab
+  realm: datalab
   resource: KEYCLOAK_CLIENT_ID
   credentials.secret: KEYCLOAK_CLIENT_SECRET
   ssl-required: none
   auth-server-url: KEYCLOAK_AUTH_SERVER_URL
 
-dlab:
+datalab:
   sbn: SERVICE_BASE_NAME
   billingEnabled: true
 
@@ -86,7 +86,7 @@
     port: MONGO_PORT
     username: admin
     password: MONGO_PASSWORD
-    database: dlabdb
+    database: datalabdb
   ssnStorageAccountTagName: <AZURE_SSN_STORAGE_ACCOUNT_TAG>
   sharedStorageAccountTagName: <AZURE_SHARED_STORAGE_ACCOUNT_TAG>
-  datalakeTagName: <AZURE_DATALAKE_TAG>
\ No newline at end of file
+  datalakeTagName: <AZURE_DATALAKE_TAG>
diff --git a/services/billing-azure/pom.xml b/services/billing-azure/pom.xml
index 75c8e35..340157a 100644
--- a/services/billing-azure/pom.xml
+++ b/services/billing-azure/pom.xml
@@ -22,8 +22,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>dlab</artifactId>
-        <groupId>com.epam.dlab</groupId>
+        <artifactId>datalab</artifactId>
+        <groupId>com.epam.datalab</groupId>
         <version>1.0</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
@@ -88,8 +88,8 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>dlab-model</artifactId>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>datalab-model</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
 
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/AzureInvoiceCalculationService.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/AzureInvoiceCalculationService.java
new file mode 100644
index 0000000..6601ec3
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/AzureInvoiceCalculationService.java
@@ -0,0 +1,242 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure;
+
+import com.epam.datalab.billing.BillingCalculationUtils;
+import com.epam.datalab.billing.azure.config.BillingConfigurationAzure;
+import com.epam.datalab.billing.azure.model.AzureDailyResourceInvoice;
+import com.epam.datalab.billing.azure.rate.AzureRateCardClient;
+import com.epam.datalab.billing.azure.rate.Meter;
+import com.epam.datalab.billing.azure.rate.RateCardResponse;
+import com.epam.datalab.billing.azure.usage.AzureUsageAggregateClient;
+import com.epam.datalab.billing.azure.usage.UsageAggregateRecord;
+import com.epam.datalab.billing.azure.usage.UsageAggregateResponse;
+import com.epam.datalab.exceptions.DatalabException;
+import com.microsoft.azure.AzureEnvironment;
+import com.microsoft.azure.credentials.ApplicationTokenCredentials;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Filters billing data and calculate prices for each
+ * resource using combination of Microsoft Azure RateCard API and Usage API
+ */
+@Slf4j
+public class AzureInvoiceCalculationService {
+
+    /**
+     * According to Microsoft Azure documentation
+     * https://docs.microsoft.com/en-us/azure/active-directory/active-directory-configurable-token-lifetimes
+     * min TTL time of token 10 minutes
+     */
+    private static final long MAX_AUTH_TOKEN_TTL_MILLIS = 9L * 60L * 1000L;
+
+    private BillingConfigurationAzure billingConfigurationAzure;
+
+    /**
+     * Constructs service class
+     *
+     * @param billingConfigurationAzure contains <code>billing-azure</code> module configuration
+     */
+    public AzureInvoiceCalculationService(BillingConfigurationAzure billingConfigurationAzure) {
+        this.billingConfigurationAzure = billingConfigurationAzure;
+    }
+
+    /**
+     * Prepares invoice records aggregated by day
+     *
+     * @param from start usage period
+     * @param to   end usage period
+     * @return list of invoice records for each meter category aggregated by day
+     */
+    public List<AzureDailyResourceInvoice> generateInvoiceData(String from, String to) {
+
+        long refreshTokenTime = System.currentTimeMillis() + MAX_AUTH_TOKEN_TTL_MILLIS;
+
+        String authenticationToken = getNewToken();
+        AzureRateCardClient azureRateCardClient = new AzureRateCardClient(billingConfigurationAzure,
+                authenticationToken);
+        AzureUsageAggregateClient azureUsageAggregateClient = new AzureUsageAggregateClient(billingConfigurationAzure,
+                authenticationToken);
+
+        List<AzureDailyResourceInvoice> invoiceData = new ArrayList<>();
+
+        try {
+
+            UsageAggregateResponse usageAggregateResponse = null;
+            Map<String, Meter> rates = transformRates(azureRateCardClient.getRateCard());
+
+            do {
+
+                if (usageAggregateResponse != null && StringUtils.isNotEmpty(usageAggregateResponse.getNextLink())) {
+                    log.info("Get usage of resources using link {}", usageAggregateResponse.getNextLink());
+                    usageAggregateResponse = azureUsageAggregateClient.getUsageAggregateResponse
+                            (usageAggregateResponse.getNextLink());
+                    log.info("Received usage of resources. Items {} ", usageAggregateResponse.getValue() != null ?
+                            usageAggregateResponse.getValue().size() : 0);
+                    log.info("Next link is {}", usageAggregateResponse.getNextLink());
+                } else if (usageAggregateResponse == null) {
+                    log.info("Get usage of resources from {} to {}", from, to);
+                    usageAggregateResponse = azureUsageAggregateClient.getUsageAggregateResponse(from, to);
+                    log.info("Received usage of resources. Items {} ", usageAggregateResponse.getValue() != null ?
+                            usageAggregateResponse.getValue().size() : 0);
+                    log.info("Next link is {}", usageAggregateResponse.getNextLink());
+                }
+
+                invoiceData.addAll(generateBillingInfo(rates, usageAggregateResponse));
+
+                if (System.currentTimeMillis() > refreshTokenTime) {
+                    authenticationToken = getNewToken();
+                    azureUsageAggregateClient.setAuthToken(authenticationToken);
+                }
+
+            } while (StringUtils.isNotEmpty(usageAggregateResponse.getNextLink()));
+
+        } catch (IOException | RuntimeException | URISyntaxException e) {
+            log.error("Cannot calculate billing information", e);
+            throw new DatalabException("Cannot prepare invoice data", e);
+        }
+
+        return invoiceData;
+    }
+
+    private List<AzureDailyResourceInvoice> generateBillingInfo(Map<String, Meter> rates, UsageAggregateResponse
+            usageAggregateResponse) {
+        List<UsageAggregateRecord> usageAggregateRecordList = usageAggregateResponse.getValue();
+        List<AzureDailyResourceInvoice> invoices = new ArrayList<>();
+
+        if (usageAggregateRecordList != null && !usageAggregateRecordList.isEmpty()) {
+            log.info("Processing {} usage records", usageAggregateRecordList.size());
+            usageAggregateRecordList = usageAggregateRecordList.stream().filter(e ->
+                    matchProperStructure(e) && isBillableDatalabResource(e))
+                    .collect(Collectors.toList());
+
+            log.info("Applicable records number is {}", usageAggregateRecordList.size());
+
+            for (UsageAggregateRecord record : usageAggregateRecordList) {
+                invoices.add(calculateInvoice(rates, record, record.getProperties().getParsedInstanceData()
+                        .getMicrosoftResources().getTags().get("Name")));
+            }
+        } else {
+            log.error("No usage records in response.");
+        }
+
+        return invoices;
+    }
+
+    private Map<String, Meter> transformRates(RateCardResponse rateCardResponse) {
+        Map<String, Meter> rates = new HashMap<>();
+        for (Meter meter : rateCardResponse.getMeters()) {
+            rates.put(meter.getMeterId(), meter);
+        }
+
+        return rates;
+    }
+
+    private boolean matchProperStructure(UsageAggregateRecord record) {
+        if (record.getProperties() == null) {
+            return false;
+        }
+
+        if (record.getProperties().getMeterId() == null || record.getProperties().getMeterId().isEmpty()) {
+            return false;
+        }
+
+        return !(record.getProperties().getParsedInstanceData() == null
+                || record.getProperties().getParsedInstanceData().getMicrosoftResources() == null
+                || record.getProperties().getParsedInstanceData().getMicrosoftResources().getTags() == null
+                || record.getProperties().getParsedInstanceData().getMicrosoftResources().getTags().isEmpty());
+    }
+
+    private boolean isBillableDatalabResource(UsageAggregateRecord record) {
+        String datalabId = record.getProperties().getParsedInstanceData().getMicrosoftResources().getTags().get("Name");
+        return datalabId != null && !datalabId.isEmpty() && datalabId.startsWith(billingConfigurationAzure.getSbn());
+    }
+
+    private AzureDailyResourceInvoice calculateInvoice(Map<String, Meter> rates, UsageAggregateRecord record, String datalabId) {
+        String meterId = record.getProperties().getMeterId();
+        Meter rateCard = rates.get(meterId);
+
+        if (rateCard != null) {
+            Map<String, Double> meterRates = rateCard.getMeterRates();
+            if (meterRates != null) {
+                Double rate = meterRates.get(AzureRateCardClient.MAIN_RATE_KEY);
+                if (rate != null) {
+                    return AzureDailyResourceInvoice.builder()
+                            .datalabId(datalabId)
+                            .usageStartDate(getDay(record.getProperties().getUsageStartTime()))
+                            .usageEndDate(getDay(record.getProperties().getUsageEndTime()))
+                            .meterCategory(record.getProperties().getMeterCategory())
+                            .cost(BillingCalculationUtils.round(rate * record.getProperties().getQuantity(), 3))
+                            .day(getDay(record.getProperties().getUsageStartTime()))
+                            .currencyCode(billingConfigurationAzure.getCurrency())
+                            .build();
+                } else {
+                    log.error("Rate Card {} has no rate for meter id {} and rate id {}. Skip record {}.",
+                            rateCard, meterId, AzureRateCardClient.MAIN_RATE_KEY, record);
+                }
+            } else {
+                log.error("Rate Card {} has no meter rates fro meter id {}. Skip record {}",
+                        rateCard, meterId, record);
+            }
+        } else {
+            log.error("Meter rate {} form usage aggregate is not found in rate card. Skip record {}.", meterId, record);
+        }
+
+        return null;
+    }
+
+    private String getNewToken() {
+        try {
+            log.info("Requesting authentication token ... ");
+            ApplicationTokenCredentials applicationTokenCredentials = new ApplicationTokenCredentials(
+                    billingConfigurationAzure.getClientId(),
+                    billingConfigurationAzure.getTenantId(),
+                    billingConfigurationAzure.getClientSecret(),
+                    AzureEnvironment.AZURE);
+
+            return applicationTokenCredentials.getToken(AzureEnvironment.AZURE.resourceManagerEndpoint());
+        } catch (IOException e) {
+            log.error("Cannot retrieve authentication token due to", e);
+            throw new DatalabException("Cannot retrieve authentication token", e);
+        }
+    }
+
+    private String getDay(String dateTime) {
+        if (dateTime != null) {
+            String[] parts = dateTime.split("T");
+            if (parts.length == 2) {
+                return parts[0];
+            }
+        }
+
+        log.error("Wrong usage date format {} ", dateTime);
+        return null;
+    }
+
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/BillingAzureApplication.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/BillingAzureApplication.java
new file mode 100644
index 0000000..5d10d9e
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/BillingAzureApplication.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
+
+@SpringBootApplication
+@EnableMongoRepositories
+@EnableConfigurationProperties
+public class BillingAzureApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(BillingAzureApplication.class, args);
+    }
+
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/CalculateBillingService.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/CalculateBillingService.java
new file mode 100644
index 0000000..4de0dba
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/CalculateBillingService.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure;
+
+import com.epam.datalab.dto.billing.BillingData;
+
+import java.util.List;
+
+@FunctionalInterface
+public interface CalculateBillingService {
+    List<BillingData> getBillingData();
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/CalculateBillingServiceImpl.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/CalculateBillingServiceImpl.java
new file mode 100644
index 0000000..c6e558a
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/CalculateBillingServiceImpl.java
@@ -0,0 +1,247 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure;
+
+import com.epam.datalab.MongoKeyWords;
+import com.epam.datalab.billing.azure.config.BillingConfigurationAzure;
+import com.epam.datalab.billing.azure.model.AzureDailyResourceInvoice;
+import com.epam.datalab.billing.azure.model.BillingPeriod;
+import com.epam.datalab.dto.billing.BillingData;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.model.azure.AzureAuthFile;
+import com.epam.datalab.util.mongo.modules.IsoDateModule;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.mongodb.BasicDBObject;
+import com.mongodb.client.model.Filters;
+import com.mongodb.client.model.UpdateOptions;
+import com.mongodb.client.result.UpdateResult;
+import lombok.extern.slf4j.Slf4j;
+import org.bson.Document;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class CalculateBillingServiceImpl implements CalculateBillingService {
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z");
+    private static final String SCHEDULER_ID = "azureBillingScheduler";
+    private final BillingConfigurationAzure billingConfigurationAzure;
+    private final MongoDbBillingClient mongoDbBillingClient;
+    private ObjectMapper objectMapper;
+
+    @Autowired
+    public CalculateBillingServiceImpl(BillingConfigurationAzure configuration) throws IOException {
+        billingConfigurationAzure = configuration;
+        objectMapper = new ObjectMapper().registerModule(new IsoDateModule());
+        Path path = Paths.get(billingConfigurationAzure.getAuthenticationFile());
+
+        if (path.toFile().exists()) {
+            log.info("Read and override configs using auth file");
+            try {
+                AzureAuthFile azureAuthFile = new ObjectMapper().readValue(path.toFile(), AzureAuthFile.class);
+                this.billingConfigurationAzure.setClientId(azureAuthFile.getClientId());
+                this.billingConfigurationAzure.setClientSecret(azureAuthFile.getClientSecret());
+                this.billingConfigurationAzure.setTenantId(azureAuthFile.getTenantId());
+                this.billingConfigurationAzure.setSubscriptionId(azureAuthFile.getSubscriptionId());
+            } catch (IOException e) {
+                log.error("Cannot read configuration file", e);
+                throw e;
+            }
+            log.info("Configs from auth file are used");
+        } else {
+            log.info("Configs from yml file are used");
+        }
+
+        this.mongoDbBillingClient = new MongoDbBillingClient
+                (billingConfigurationAzure.getAggregationOutputMongoDataSource().getHost(),
+                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getPort(),
+                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getDatabase(),
+                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getUsername(),
+                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getPassword());
+    }
+
+    @Override
+    public List<BillingData> getBillingData() {
+        try {
+            BillingPeriod billingPeriod = getBillingPeriod();
+            DateTime currentTime = new DateTime().withZone(DateTimeZone.UTC);
+            if (billingPeriod == null) {
+                saveBillingPeriod(initialSchedulerInfo(currentTime));
+            } else {
+                log.info("Billing period from db is {}", billingPeriod);
+
+                if (shouldTriggerJobByTime(currentTime, billingPeriod)) {
+                    List<BillingData> billingData = getBillingData(billingPeriod);
+                    boolean hasNew = !billingData.isEmpty();
+                    updateBillingPeriod(billingPeriod, currentTime, hasNew);
+                    return billingData;
+                }
+            }
+        } catch (RuntimeException e) {
+            log.error("Cannot update billing information", e);
+        }
+        return Collections.emptyList();
+    }
+
+    private BillingPeriod initialSchedulerInfo(DateTime currentTime) {
+
+        BillingPeriod initialBillingPeriod = new BillingPeriod();
+        initialBillingPeriod.setFrom(currentTime.minusDays(2).toDateMidnight().toDate());
+        initialBillingPeriod.setTo(currentTime.toDateMidnight().toDate());
+
+        log.info("Initial scheduler info {}", initialBillingPeriod);
+
+        return initialBillingPeriod;
+
+    }
+
+    private boolean shouldTriggerJobByTime(DateTime currentTime, BillingPeriod billingPeriod) {
+
+        DateTime dateTimeToFromBillingPeriod = new DateTime(billingPeriod.getTo()).withZone(DateTimeZone.UTC);
+
+        log.info("Comparing current time[{}, {}] and from scheduler info [{}, {}]", currentTime,
+                currentTime.toDateMidnight(),
+                dateTimeToFromBillingPeriod, dateTimeToFromBillingPeriod.toDateMidnight());
+
+        if (currentTime.toDateMidnight().isAfter(dateTimeToFromBillingPeriod.toDateMidnight())
+                || currentTime.toDateMidnight().isEqual(dateTimeToFromBillingPeriod.toDateMidnight())) {
+            log.info("Should trigger the job by time");
+            return true;
+        }
+
+        log.info("Should not trigger the job by time");
+        return false;
+    }
+
+    private List<BillingData> getBillingData(BillingPeriod billingPeriod) {
+        AzureInvoiceCalculationService azureInvoiceCalculationService
+                = new AzureInvoiceCalculationService(billingConfigurationAzure);
+
+        List<AzureDailyResourceInvoice> dailyInvoices = azureInvoiceCalculationService.generateInvoiceData(
+                DATE_TIME_FORMATTER.print(new DateTime(billingPeriod.getFrom()).withZone(DateTimeZone.UTC)),
+                DATE_TIME_FORMATTER.print(new DateTime(billingPeriod.getTo()).withZone(DateTimeZone.UTC)));
+
+        if (!dailyInvoices.isEmpty()) {
+            return dailyInvoices
+                    .stream()
+                    .filter(Objects::nonNull)
+                    .map(this::toBillingData)
+                    .collect(Collectors.toList());
+        } else {
+            log.warn("Daily invoices is empty for period {}", billingPeriod);
+            return Collections.emptyList();
+        }
+    }
+
+    private void updateBillingPeriod(BillingPeriod billingPeriod, DateTime currentTime, boolean updates) {
+
+        try {
+            mongoDbBillingClient.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER_HISTORY).insertOne(
+                    Document.parse(objectMapper.writeValueAsString(billingPeriod)).append("updates", updates));
+            log.debug("History of billing periods is updated with {}",
+                    objectMapper.writeValueAsString(billingPeriod));
+        } catch (JsonProcessingException e) {
+            log.error("Cannot update history of billing periods", e);
+
+        }
+
+        billingPeriod.setFrom(billingPeriod.getTo());
+
+        if (new DateTime(billingPeriod.getFrom()).withZone(DateTimeZone.UTC).toDateMidnight()
+                .isEqual(currentTime.toDateMidnight())) {
+
+            log.info("Setting billing to one day later");
+            billingPeriod.setTo(currentTime.plusDays(1).toDateMidnight().toDate());
+
+        } else {
+            billingPeriod.setTo(currentTime.toDateMidnight().toDate());
+        }
+
+        saveBillingPeriod(billingPeriod);
+    }
+
+    private boolean saveBillingPeriod(BillingPeriod billingPeriod) {
+        log.debug("Saving billing period {}", billingPeriod);
+
+        try {
+            UpdateResult updateResult = mongoDbBillingClient.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER)
+                    .updateMany(Filters.eq(MongoKeyWords.MONGO_ID, SCHEDULER_ID),
+                            new BasicDBObject("$set",
+                                    Document.parse(objectMapper.writeValueAsString(billingPeriod))
+                                            .append(MongoKeyWords.MONGO_ID, SCHEDULER_ID))
+                            , new UpdateOptions().upsert(true)
+                    );
+
+            log.debug("Billing period save operation result is {}", updateResult);
+            return true;
+        } catch (JsonProcessingException e) {
+            log.error("Cannot save billing period", e);
+        }
+
+        return false;
+    }
+
+    private BillingPeriod getBillingPeriod() {
+        log.debug("Get billing period");
+
+        try {
+            Document document = mongoDbBillingClient.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER)
+                    .find(Filters.eq(MongoKeyWords.MONGO_ID, SCHEDULER_ID)).first();
+
+            log.debug("Retrieved billing period document {}", document);
+            if (document != null) {
+                return objectMapper.readValue(document.toJson(), BillingPeriod.class);
+            }
+
+            return null;
+
+        } catch (IOException e) {
+            log.error("Cannot save billing period", e);
+            throw new DatalabException("Cannot parse string", e);
+        }
+    }
+
+    private BillingData toBillingData(AzureDailyResourceInvoice billingData) {
+        return BillingData.builder()
+                .tag(billingData.getDatalabId().toLowerCase())
+                .usageDateFrom(Optional.ofNullable(billingData.getUsageStartDate()).map(LocalDate::parse).orElse(null))
+                .usageDateTo(Optional.ofNullable(billingData.getUsageEndDate()).map(LocalDate::parse).orElse(null))
+                .usageDate(billingData.getDay())
+                .product(billingData.getMeterCategory())
+                .cost(billingData.getCost())
+                .currency(billingData.getCurrencyCode())
+                .build();
+    }
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/MongoDbBillingClient.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/MongoDbBillingClient.java
new file mode 100644
index 0000000..b0e7929
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/MongoDbBillingClient.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure;
+
+import com.google.common.collect.Lists;
+import com.mongodb.MongoClient;
+import com.mongodb.MongoCredential;
+import com.mongodb.ServerAddress;
+import com.mongodb.client.MongoDatabase;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class MongoDbBillingClient {
+
+    private MongoClient client;
+    private MongoDatabase database;
+
+    public MongoDbBillingClient(String host, int port, String databaseName, String username, String password) {
+        this.client = new MongoClient(new ServerAddress(host, port),
+                Lists.newArrayList(MongoCredential.createCredential(username,
+                        databaseName, password.toCharArray())));
+
+        this.database = client.getDatabase(databaseName);
+    }
+
+    public MongoClient getClient() {
+        return client;
+    }
+
+    public MongoDatabase getDatabase() {
+        return database;
+    }
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/MongoDocument.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/MongoDocument.java
new file mode 100644
index 0000000..60ee4ca
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/MongoDocument.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure;
+
+import com.epam.datalab.exceptions.DatalabException;
+import org.bson.Document;
+
+import java.lang.reflect.Field;
+
+public abstract class MongoDocument<T> {
+
+    protected Document to() {
+        Field[] fields = this.getClass().getDeclaredFields();
+        Document document = new Document();
+
+        try {
+            for (Field field : fields) {
+                field.setAccessible(true);
+                if (field.getType().isEnum()) {
+                    document.append(field.getName(), field.get(this).toString());
+                } else {
+                    document.append(field.getName(), field.get(this));
+                }
+            }
+
+            return document;
+
+        } catch (IllegalArgumentException | IllegalAccessException e) {
+            throw new DatalabException("", e);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private T from(Document document) {
+
+        Field[] fields = this.getClass().getDeclaredFields();
+
+        try {
+            for (Field field : fields) {
+                field.setAccessible(true);
+
+                if (field.getType().isEnum()) {
+                    field.set(this, Enum.valueOf((Class<Enum>) field.getType(), (String) document.get(field.getName())));
+                } else {
+                    field.set(this, document.get(field.getName()));
+                }
+            }
+            return (T) this;
+        } catch (IllegalArgumentException | IllegalAccessException e) {
+            throw new DatalabException("", e);
+        }
+    }
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/AggregationOutputMongoDataSource.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/AggregationOutputMongoDataSource.java
new file mode 100644
index 0000000..9828bea
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/AggregationOutputMongoDataSource.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.config;
+
+import lombok.Data;
+
+@Data
+public class AggregationOutputMongoDataSource {
+    private String host;
+    private int port;
+    private String username;
+    private String password;
+    private String database;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/BillingConfigurationAzure.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/BillingConfigurationAzure.java
new file mode 100644
index 0000000..b35e5ab
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/BillingConfigurationAzure.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties("datalab")
+@Data
+public class BillingConfigurationAzure {
+    private String sbn;
+    private long initialDelay;
+    private long period;
+
+    private String clientId;
+    private String clientSecret;
+    private String tenantId;
+    private String subscriptionId;
+
+    private String authenticationFile;
+
+    private String offerNumber;
+    private String currency;
+    private String locale;
+    private String regionInfo;
+    private boolean billingEnabled;
+
+    private String ssnStorageAccountTagName;
+    private String sharedStorageAccountTagName;
+    private String datalakeTagName;
+
+    private AggregationOutputMongoDataSource aggregationOutputMongoDataSource;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/LoggingConfigurationFactory.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/LoggingConfigurationFactory.java
new file mode 100644
index 0000000..8bff0da
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/LoggingConfigurationFactory.java
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.config;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import com.epam.datalab.billing.azure.logging.AppenderBase;
+import com.epam.datalab.exceptions.InitializationException;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Configuration and factory for logging.
+ */
+public class LoggingConfigurationFactory {
+
+    /**
+     * Default logging level for all appenders.
+     */
+    @JsonProperty
+    private Level level = Level.INFO;
+
+    /**
+     * List of logging levels for appenders.
+     */
+    @JsonIgnore
+    private ImmutableMap<String, Level> loggers = ImmutableMap.of();
+
+    /**
+     * List of logging appenders.
+     */
+    @JsonProperty
+    private ImmutableList<AppenderBase> appenders = ImmutableList.of();
+
+
+    /**
+     * Return the default logging level for all appenders.
+     */
+    public Level getLevel() {
+        return level;
+    }
+
+    /**
+     * Set the default logging level for all appenders.
+     */
+    public void setLevel(String level) throws InitializationException {
+        this.level = toLevel(level);
+    }
+
+    /**
+     * Return the list of logging levels for appenders.
+     */
+    public ImmutableMap<String, Level> getLoggers() {
+        return loggers;
+    }
+
+    /**
+     * Set the list of logging levels for appenders.
+     */
+    @JsonProperty
+    public void setLoggers(ImmutableMap<String, JsonNode> loggers) throws InitializationException {
+        ImmutableMap.Builder<String, Level> levels = new ImmutableMap.Builder<>();
+        for (String key : loggers.keySet()) {
+            JsonNode node = loggers.get(key);
+            levels.put(key, toLevel(node.asText()));
+        }
+        this.loggers = levels.build();
+    }
+
+    /**
+     * Return the list of logging appenders.
+     */
+    public ImmutableList<AppenderBase> getAppenders() {
+        return appenders;
+    }
+
+    /**
+     * Set the list of logging appenders.
+     */
+    public void setAppenders(ImmutableList<AppenderBase> appenders) {
+        this.appenders = appenders;
+    }
+
+
+    /**
+     * Translate the name of logging level to {@link Level}.
+     *
+     * @param level the name of logging level.
+     * @return logging level.
+     * @throws InitializationException if given unknown logging level name.
+     */
+    private Level toLevel(String level) throws InitializationException {
+        Level l = Level.toLevel(level, null);
+        if (l == null) {
+            throw new InitializationException("Unknown logging level: " + level);
+        }
+        return l;
+    }
+
+    /**
+     * Configure logging appenders.
+     *
+     * @throws InitializationException
+     */
+    public void configure() throws InitializationException {
+        if (appenders == null) {
+            throw new InitializationException("Configuration property logging.appenders cannot be null.");
+        }
+        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+        context.reset();
+
+        for (AppenderBase appender : appenders) {
+            appender.configure(context);
+        }
+
+        Logger logger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
+        logger.setLevel(level);
+        for (String name : loggers.keySet()) {
+            logger = context.getLogger(name);
+            logger.setLevel(loggers.get(name));
+        }
+    }
+
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @param self the object to generate the string for (typically this), used only for its class name.
+     */
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("level", level)
+                .add("loggers", loggers)
+                .add("appenders", appenders);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .toString();
+    }
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/SecurityConfig.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/SecurityConfig.java
new file mode 100644
index 0000000..836b3b6
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/config/SecurityConfig.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.config;
+
+import org.keycloak.adapters.KeycloakConfigResolver;
+import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
+import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
+import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
+import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
+import org.springframework.security.core.session.SessionRegistryImpl;
+import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
+
+@KeycloakConfiguration
+class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
+
+    @Autowired
+    public void configureGlobal(AuthenticationManagerBuilder auth) {
+        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
+        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
+        auth.authenticationProvider(keycloakAuthenticationProvider);
+    }
+
+    @Bean
+    public KeycloakConfigResolver keycloakConfigResolver() {
+        return new KeycloakSpringBootConfigResolver();
+    }
+
+    @Bean
+    @Override
+    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
+        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
+    }
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        super.configure(http);
+        http
+                .anonymous().disable()
+                .authorizeRequests()
+                .anyRequest()
+                .authenticated();
+    }
+}
\ No newline at end of file
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/controller/BillingController.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/controller/BillingController.java
new file mode 100644
index 0000000..5536208
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/controller/BillingController.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.controller;
+
+import com.epam.datalab.billing.azure.CalculateBillingService;
+import com.epam.datalab.dto.billing.BillingData;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class BillingController {
+
+    private final CalculateBillingService billingService;
+
+    public BillingController(CalculateBillingService billingService) {
+        this.billingService = billingService;
+    }
+
+    @GetMapping
+    public ResponseEntity<List<BillingData>> getBilling() {
+        return new ResponseEntity<>(billingService.getBillingData(), HttpStatus.OK);
+    }
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/logging/AppenderBase.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/logging/AppenderBase.java
new file mode 100644
index 0000000..7350414
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/logging/AppenderBase.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.logging;
+
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.OutputStreamAppender;
+import com.epam.datalab.exceptions.InitializationException;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import java.util.TimeZone;
+
+/**
+ * Abstract class provides base configuration for the log appenders.
+ */
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
+public abstract class AppenderBase {
+
+    /**
+     * Log format pattern.
+     */
+    private final String logFormatPattern = "%-5p [%d{ISO8601," + TimeZone.getDefault().getID() + "}] %c: %m%n%rEx";
+
+    /**
+     * Perform configure of appender.
+     *
+     * @param context the context of logger.
+     */
+    public abstract void configure(LoggerContext context) throws InitializationException;
+
+    /**
+     * Perform the base configure of appender.
+     *
+     * @param context      the context of logger.
+     * @param appenderName the name of appender.
+     * @param appender     the class instance of appender.
+     */
+    public void configure(LoggerContext context, String appenderName, OutputStreamAppender<ILoggingEvent> appender) {
+        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
+        encoder.setPattern(logFormatPattern);
+        encoder.setContext(context);
+        encoder.start();
+
+        appender.setContext(context);
+        appender.setName(appenderName);
+        appender.setEncoder(encoder);
+        appender.start();
+
+        Logger logger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
+        logger.addAppender(appender);
+        logger.setAdditive(true);
+    }
+
+    /**
+     * Return the name of type for appender.
+     */
+    @JsonIgnore
+    public String getType() {
+        Class<? extends AppenderBase> clazz = this.getClass();
+        return (clazz.isAnnotationPresent(JsonTypeName.class) ?
+                clazz.getAnnotation(JsonTypeName.class).value() : clazz.getName());
+    }
+
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @param self the object to generate the string for (typically this), used only for its class name.
+     */
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("type", getType());
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .toString();
+    }
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/logging/AppenderConsole.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/logging/AppenderConsole.java
new file mode 100644
index 0000000..44d7088
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/logging/AppenderConsole.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.logging;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.ConsoleAppender;
+import com.epam.datalab.exceptions.InitializationException;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+/**
+ * Console appender for logging.
+ */
+@JsonTypeName("console")
+@JsonClassDescription(
+        "Console log appender.\n" +
+                "Output log data to console. Does not have any properties.\n" +
+                "  - type: console"
+)
+public class AppenderConsole extends AppenderBase {
+
+    @Override
+    public void configure(LoggerContext context) throws InitializationException {
+        super.configure(context, "console-appender", new ConsoleAppender<ILoggingEvent>());
+    }
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/logging/AppenderFile.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/logging/AppenderFile.java
new file mode 100644
index 0000000..99ad32e
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/logging/AppenderFile.java
@@ -0,0 +1,200 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.logging;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.CoreConstants;
+import ch.qos.logback.core.FileAppender;
+import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy;
+import ch.qos.logback.core.rolling.RollingFileAppender;
+import ch.qos.logback.core.rolling.TimeBasedFileNamingAndTriggeringPolicy;
+import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
+import com.epam.datalab.exceptions.InitializationException;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+/**
+ * File appender for logging. Support rolling files and archiving.
+ */
+@JsonTypeName("file")
+@JsonClassDescription(
+        "File log appender.\n" +
+                "Output log data to the file, if property archive is set to true then rolling\n" +
+                "mode is enabled. If archivedLogFilenamePattern ends with .gz or .zip extension\n" +
+                "then old log file will be compressed.\n" +
+                "  - type: file\n" +
+                "    currentLogFilename: <[path/]filename.log>  - pattern for log file naming.\n" +
+                "    [archive: <true | false>]                  - rolling log files or none.\n" +
+                "    [archivedLogFilenamePattern: <[path/]filename-%d{yyyy-MM-dd}.log[.gz | .zip]>]\n" +
+                "                                               - pattern for naming the archive log\n" +
+                "                                                 files.\n" +
+                "    [archivedFileCount: <number_of_days>]      - number of archive log file history."
+)
+public class AppenderFile extends AppenderBase {
+
+    /**
+     * The name of current log file.
+     */
+    @JsonProperty
+    private String currentLogFilename;
+
+    /**
+     * Flag for archive of old files.
+     */
+    @JsonProperty
+    private boolean archive = false;
+
+    /**
+     * Pattern for naming archive files. The compression mode depending on last
+     * letters of the fileNamePatternStr. Patterns ending with .gz imply GZIP
+     * compression, endings with '.zip' imply ZIP compression. Otherwise and by
+     * default, there is no compression.
+     */
+    @JsonProperty
+    private String archivedLogFilenamePattern;
+
+    /**
+     * The maximum number of archive files to keep..
+     */
+    @JsonProperty
+    private int archivedFileCount = CoreConstants.UNBOUND_HISTORY;
+
+
+    /**
+     * Return the name of current log file.
+     */
+    public String getCurrentLogFilename() {
+        return currentLogFilename;
+    }
+
+    /**
+     * Set the name of current log file.
+     */
+    public void setCurrentLogFilename(String currentLogFilename) {
+        this.currentLogFilename = currentLogFilename;
+    }
+
+    /**
+     * Return the flag for archive of old files.
+     */
+    public boolean getArchive() {
+        return archive;
+    }
+
+    /**
+     * Set the flag for archive of old files.
+     */
+    public void setArchive(boolean archive) {
+        this.archive = archive;
+    }
+
+    /**
+     * Return the pattern for naming archive files.
+     */
+    public String getArchivedLogFilenamePattern() {
+        return archivedLogFilenamePattern;
+    }
+
+    /**
+     * Set pattern for naming archive files. The compression mode depending on last
+     * letters of the fileNamePatternStr. Patterns ending with .gz imply GZIP
+     * compression, endings with '.zip' imply ZIP compression. Otherwise and by
+     * default, there is no compression.
+     * For example,
+     * /logs/application-%d{yyyy-MM-dd}.log.gz
+     */
+    public void setArchivedLogFilenamePattern(String archivedLogFilenamePattern) {
+        this.archivedLogFilenamePattern = archivedLogFilenamePattern;
+    }
+
+    /**
+     * Return the maximum number of archive files to keep..
+     */
+    public int getArchivedFileCount() {
+        return archivedFileCount;
+    }
+
+    /**
+     * Set the maximum number of archive files to keep..
+     */
+    public void setArchivedFileCount(int archivedFileCount) {
+        this.archivedFileCount = archivedFileCount;
+    }
+
+
+    @Override
+    public void configure(LoggerContext context) throws InitializationException {
+        if (currentLogFilename == null || currentLogFilename.trim().isEmpty()) {
+            throw new InitializationException("Configuration property logging.appenders.currentLogFilename cannot be null.");
+        }
+        super.configure(context, "file-appender", (archive ? getRollingFileAppender(context) : getFileAppender()));
+    }
+
+    /**
+     * Create and return synchronous the file appender.
+     */
+    private FileAppender<ILoggingEvent> getFileAppender() {
+        FileAppender<ILoggingEvent> appender = new FileAppender<>();
+        appender.setFile(currentLogFilename);
+        appender.setAppend(true);
+        return appender;
+    }
+
+    /**
+     * Create and return synchronous the rolling file appender.
+     *
+     * @param context the context of logger.
+     */
+    private RollingFileAppender<ILoggingEvent> getRollingFileAppender(LoggerContext context) throws InitializationException {
+        if (archivedLogFilenamePattern == null || archivedLogFilenamePattern.trim().isEmpty()) {
+            throw new InitializationException("Configuration property logging.appenders.archivedLogFilenamePattern cannot be null.");
+        }
+        RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<>();
+        appender.setFile(currentLogFilename);
+        appender.setAppend(true);
+
+        TimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent> triggerPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<>();
+        triggerPolicy.setContext(context);
+
+        TimeBasedRollingPolicy<ILoggingEvent> rollPolicy = new TimeBasedRollingPolicy<>();
+        rollPolicy.setContext(context);
+        rollPolicy.setParent(appender);
+        rollPolicy.setFileNamePattern(archivedLogFilenamePattern);
+        rollPolicy.setMaxHistory(archivedFileCount);
+        rollPolicy.setTimeBasedFileNamingAndTriggeringPolicy(triggerPolicy);
+        rollPolicy.start();
+        appender.setRollingPolicy(rollPolicy);
+
+        return appender;
+    }
+
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("currentLogFilename", currentLogFilename)
+                .add("archive", archive)
+                .add("archivedLogFilenamePattern", archivedLogFilenamePattern)
+                .add("archivedFileCount", archivedFileCount);
+    }
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/model/AzureDailyResourceInvoice.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/model/AzureDailyResourceInvoice.java
new file mode 100644
index 0000000..5b8c0ac
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/model/AzureDailyResourceInvoice.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.model;
+
+import com.epam.datalab.billing.azure.MongoDocument;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@Builder
+@EqualsAndHashCode(callSuper = true)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class AzureDailyResourceInvoice extends MongoDocument<AzureDailyResourceInvoice> {
+    @JsonProperty
+    private String datalabId;
+    @JsonProperty
+    private String meterCategory;
+    @JsonProperty
+    private String usageStartDate;
+    @JsonProperty
+    private String usageEndDate;
+    @JsonProperty
+    private String day;
+    @JsonProperty
+    private double cost;
+    @JsonProperty
+    private String currencyCode;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/model/AzureDatalabBillableResource.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/model/AzureDatalabBillableResource.java
new file mode 100644
index 0000000..6eb194b
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/model/AzureDatalabBillableResource.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.model;
+
+import com.epam.datalab.billing.DatalabResourceType;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class AzureDatalabBillableResource {
+    private String id;
+    private DatalabResourceType type;
+    private String user;
+    private String project;
+    private String notebookId;
+    private String resourceName;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/model/BillingPeriod.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/model/BillingPeriod.java
new file mode 100644
index 0000000..23083bb
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/model/BillingPeriod.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class BillingPeriod {
+    @JsonProperty
+    private Date from;
+    @JsonProperty
+    private Date to;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/rate/AzureRateCardClient.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/rate/AzureRateCardClient.java
new file mode 100644
index 0000000..a3f66c0
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/rate/AzureRateCardClient.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.rate;
+
+import com.epam.datalab.billing.azure.config.BillingConfigurationAzure;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.Header;
+import org.apache.http.HttpHeaders;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.ProtocolException;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.DefaultRedirectStrategy;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.function.Predicate;
+
+@Slf4j
+public class AzureRateCardClient {
+    private ObjectMapper objectMapper = new ObjectMapper();
+    public static final String MAIN_RATE_KEY = "0";
+    private BillingConfigurationAzure billingConfigurationAzure;
+    private String authToken;
+
+    public AzureRateCardClient(BillingConfigurationAzure billingConfigurationAzure, String authToken) {
+        this.billingConfigurationAzure = billingConfigurationAzure;
+        this.authToken = authToken;
+    }
+
+    public RateCardResponse getRateCard() throws IOException, URISyntaxException {
+
+        try (CloseableHttpClient httpClient = HttpClients.custom()
+                .setRedirectStrategy(new CustomRedirectWithoutAuthorizationStrategy())
+                .build()) {
+            final URIBuilder uriBuilder = new URIBuilder("https://management.azure.com/subscriptions/" +
+                    billingConfigurationAzure.getSubscriptionId() + "/providers/Microsoft.Commerce/RateCard")
+                    .addParameter("api-version", "2016-08-31-preview")
+                    .addParameter("$filter", String.format("OfferDurableId eq '%s' and Currency eq '%s' and Locale " +
+                                    "eq '%s' and RegionInfo eq '%s'", billingConfigurationAzure.getOfferNumber(),
+                            billingConfigurationAzure.getCurrency(), billingConfigurationAzure.getLocale(),
+                            billingConfigurationAzure.getRegionInfo()));
+
+            final HttpGet request = new HttpGet(uriBuilder.build());
+            request.addHeader("Authorization", String.format("Bearer %s", authToken));
+            request.addHeader(HttpHeaders.ACCEPT, "application/json");
+            return objectMapper.readValue(EntityUtils.toString
+                    (httpClient.execute(request).getEntity()), RateCardResponse.class);
+        } catch (IOException | URISyntaxException e) {
+            log.error("Cannot retrieve rate card due to ", e);
+            throw e;
+        }
+    }
+
+    class CustomRedirectWithoutAuthorizationStrategy extends DefaultRedirectStrategy {
+        @Override
+        public HttpUriRequest getRedirect(HttpRequest request, HttpResponse response, HttpContext context) throws
+                ProtocolException {
+            if (HttpGet.METHOD_NAME.equals(request.getRequestLine().getMethod())) {
+                return httpGetWithoutAuthorization(request, response, context);
+            } else {
+                return super.getRedirect(request, response, context);
+            }
+        }
+
+        private HttpUriRequest httpGetWithoutAuthorization(HttpRequest request, HttpResponse response, HttpContext
+                context) throws ProtocolException {
+            return new HttpGet(getLocationURI(request, response, context)) {
+                @Override
+                public void setHeaders(Header[] headers) {
+                    super.setHeaders(filter(headers, h -> !h.getName().equals(HttpHeaders.AUTHORIZATION)));
+                }
+
+                private Header[] filter(Header[] headers, Predicate<Header> predicate) {
+                    return Arrays.stream(headers)
+                            .filter(predicate)
+                            .toArray(Header[]::new);
+                }
+            };
+        }
+    }
+
+
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/rate/Meter.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/rate/Meter.java
new file mode 100644
index 0000000..dd4e994
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/rate/Meter.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.rate;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class Meter {
+    @JsonProperty("EffectiveDate")
+    private String effectiveDate;
+    @JsonProperty("IncludedQuantity")
+    private long includedQuantity;
+    @JsonProperty("MeterCategory")
+    private String meterCategory;
+    @JsonProperty("MeterId")
+    private String meterId;
+    @JsonProperty("MeterName")
+    private String meterName;
+    @JsonProperty("MeterRates")
+    private Map<String, Double> meterRates;
+    @JsonProperty("MeterRegion")
+    private String meterRegion;
+    @JsonProperty("MeterStatus")
+    private String meterStatus;
+    @JsonProperty("MeterSubCategory")
+    private String meterSubCategory;
+    @JsonProperty("MeterTags")
+    private List<Object> meterTags;
+    @JsonProperty("Unit")
+    private String unit;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/rate/RateCardResponse.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/rate/RateCardResponse.java
new file mode 100644
index 0000000..de6a5fa
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/rate/RateCardResponse.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.rate;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.ToString;
+
+import java.util.List;
+
+@Data
+@ToString(exclude = "meters")
+public class RateCardResponse {
+    @JsonProperty("OfferTerms")
+    private List<Object> offerTerms;
+    @JsonProperty("Meters")
+    private List<Meter> meters;
+    @JsonProperty("Currency")
+    private String currency;
+    @JsonProperty("Locale")
+    private String locale;
+    @JsonProperty("IsTaxIncluded")
+    private boolean taxIncluded;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/AzureUsageAggregateClient.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/AzureUsageAggregateClient.java
new file mode 100644
index 0000000..c961537
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/AzureUsageAggregateClient.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.usage;
+
+import com.epam.datalab.billing.azure.config.BillingConfigurationAzure;
+import com.epam.datalab.exceptions.DatalabException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpHeaders;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.Objects;
+
+@Slf4j
+public class AzureUsageAggregateClient {
+    private ObjectMapper objectMapper = new ObjectMapper();
+    private BillingConfigurationAzure billingConfigurationAzure;
+    private String authToken;
+
+    public AzureUsageAggregateClient(BillingConfigurationAzure billingConfigurationAzure, String authToken) {
+        this.billingConfigurationAzure = billingConfigurationAzure;
+        this.authToken = authToken;
+    }
+
+    public UsageAggregateResponse getUsageAggregateResponse(String from, String to) throws IOException,
+            URISyntaxException {
+        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+
+            final URIBuilder uriBuilder = new URIBuilder("https://management.azure.com/subscriptions/" +
+                    billingConfigurationAzure.getSubscriptionId() + "/providers/Microsoft" +
+                    ".Commerce/UsageAggregates")
+                    .addParameter("api-version", "2015-06-01-preview")
+                    .addParameter("reportedStartTime", from)
+                    .addParameter("reportedEndTime", to)
+                    .addParameter("aggregationGranularity", "daily")
+                    .addParameter("showDetails", "false");
+            final HttpGet request = new HttpGet(uriBuilder.build());
+            request.addHeader("Authorization", String.format("Bearer %s", authToken));
+            request.addHeader(HttpHeaders.ACCEPT, "application/json");
+            final UsageAggregateResponse usageAggregateResponse = objectMapper.readValue(EntityUtils.toString
+                    (httpClient.execute(request).getEntity()), UsageAggregateResponse.class);
+            return postProcess(usageAggregateResponse);
+        } catch (URISyntaxException e) {
+            log.error("Cannot retrieve usage detail due to ", e);
+            throw e;
+        }
+    }
+
+
+    public UsageAggregateResponse getUsageAggregateResponse(String nextUrl) throws IOException {
+        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+            final HttpGet request = new HttpGet(nextUrl);
+            request.addHeader("Authorization", String.format("Bearer %s", authToken));
+            request.addHeader(HttpHeaders.ACCEPT, "application/json");
+            final UsageAggregateResponse usageAggregateResponse = objectMapper.readValue(EntityUtils.toString
+                    (httpClient.execute(request).getEntity()), UsageAggregateResponse.class);
+            return postProcess(usageAggregateResponse);
+        }
+    }
+
+    public void setAuthToken(String authToken) {
+        this.authToken = authToken;
+    }
+
+    private UsageAggregateResponse postProcess(UsageAggregateResponse usageAggregateResponse) {
+        usageAggregateResponse.getValue()
+                .stream()
+                .filter(r -> Objects.nonNull(r.getProperties().getInstanceData()))
+                .forEach(r -> r.getProperties().setParsedInstanceData(toInstanceData(r)));
+        return usageAggregateResponse;
+    }
+
+    private InstanceData toInstanceData(UsageAggregateRecord r) {
+        try {
+            return objectMapper.readValue(r.getProperties().getInstanceData(), InstanceData.class);
+        } catch (IOException e) {
+            throw new DatalabException("Can not parse instance data", e);
+        }
+    }
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/InstanceData.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/InstanceData.java
new file mode 100644
index 0000000..4e56600
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/InstanceData.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.usage;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class InstanceData {
+    @JsonProperty("Microsoft.Resources")
+    private MicrosoftResources microsoftResources;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/MicrosoftResources.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/MicrosoftResources.java
new file mode 100644
index 0000000..61d6700
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/MicrosoftResources.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.usage;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class MicrosoftResources {
+    @JsonProperty
+    private String resourceUri;
+    @JsonProperty
+    private String location;
+    @JsonProperty
+    private Map<String, String> tags;
+    @JsonProperty
+    private Map<String, String> additionalInfo;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/UsageAggregateRecord.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/UsageAggregateRecord.java
new file mode 100644
index 0000000..af39a27
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/UsageAggregateRecord.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.usage;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class UsageAggregateRecord {
+    @JsonProperty
+    private String id;
+    @JsonProperty
+    private String name;
+    @JsonProperty
+    private String type;
+    @JsonProperty
+    private UsageAggregateRecordProperties properties;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/UsageAggregateRecordProperties.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/UsageAggregateRecordProperties.java
new file mode 100644
index 0000000..938530d
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/UsageAggregateRecordProperties.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.usage;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class UsageAggregateRecordProperties {
+    @JsonProperty
+    private String subscriptionId;
+    @JsonProperty
+    private String usageStartTime;
+    @JsonProperty
+    private String usageEndTime;
+    @JsonProperty
+    private String meterName;
+    @JsonProperty
+    private String meterRegion;
+    @JsonProperty
+    private String meterCategory;
+    @JsonProperty
+    private String meterSubCategory;
+    @JsonProperty
+    private String unit;
+    @JsonProperty
+    private String instanceData;
+    private InstanceData parsedInstanceData;
+    @JsonProperty
+    private String meterId;
+    @JsonProperty
+    private Map<String, String> infoFields;
+    @JsonProperty
+    private double quantity;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/UsageAggregateResponse.java b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/UsageAggregateResponse.java
new file mode 100644
index 0000000..ecdf3a6
--- /dev/null
+++ b/services/billing-azure/src/main/java/com/epam/datalab/billing/azure/usage/UsageAggregateResponse.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.azure.usage;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UsageAggregateResponse {
+    @JsonProperty
+    private List<UsageAggregateRecord> value;
+    @JsonProperty
+    private String nextLink;
+}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/AzureInvoiceCalculationService.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/AzureInvoiceCalculationService.java
deleted file mode 100644
index b3eec4f..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/AzureInvoiceCalculationService.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure;
-
-import com.epam.dlab.billing.BillingCalculationUtils;
-import com.epam.dlab.billing.azure.config.BillingConfigurationAzure;
-import com.epam.dlab.billing.azure.model.AzureDailyResourceInvoice;
-import com.epam.dlab.billing.azure.model.AzureDlabBillableResource;
-import com.epam.dlab.billing.azure.rate.AzureRateCardClient;
-import com.epam.dlab.billing.azure.rate.Meter;
-import com.epam.dlab.billing.azure.rate.RateCardResponse;
-import com.epam.dlab.billing.azure.usage.AzureUsageAggregateClient;
-import com.epam.dlab.billing.azure.usage.UsageAggregateRecord;
-import com.epam.dlab.billing.azure.usage.UsageAggregateResponse;
-import com.epam.dlab.exceptions.DlabException;
-import com.microsoft.azure.AzureEnvironment;
-import com.microsoft.azure.credentials.ApplicationTokenCredentials;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * Filters billing data and calculate prices for each
- * resource using combination of Microsoft Azure RateCard API and Usage API
- */
-@Slf4j
-public class AzureInvoiceCalculationService {
-
-	/**
-	 * According to Microsoft Azure documentation
-	 * https://docs.microsoft.com/en-us/azure/active-directory/active-directory-configurable-token-lifetimes
-	 * min TTL time of token 10 minutes
-	 */
-	private static final long MAX_AUTH_TOKEN_TTL_MILLIS = 9L * 60L * 1000L;
-
-	private BillingConfigurationAzure billingConfigurationAzure;
-	private Map<String, AzureDlabBillableResource> billableResources;
-
-	/**
-	 * Constructs service class
-	 *
-	 * @param billingConfigurationAzure contains <code>billing-azure</code> module configuration
-	 */
-	public AzureInvoiceCalculationService(BillingConfigurationAzure billingConfigurationAzure) {
-		this.billingConfigurationAzure = billingConfigurationAzure;
-	}
-
-	/**
-	 * Prepares invoice records aggregated by day
-	 *
-	 * @param from start usage period
-	 * @param to   end usage period
-	 * @return list of invoice records for each meter category aggregated by day
-	 */
-	public List<AzureDailyResourceInvoice> generateInvoiceData(String from, String to) {
-
-		long refreshTokenTime = System.currentTimeMillis() + MAX_AUTH_TOKEN_TTL_MILLIS;
-
-		String authenticationToken = getNewToken();
-		AzureRateCardClient azureRateCardClient = new AzureRateCardClient(billingConfigurationAzure,
-                authenticationToken);
-		AzureUsageAggregateClient azureUsageAggregateClient = new AzureUsageAggregateClient(billingConfigurationAzure,
-                authenticationToken);
-
-		List<AzureDailyResourceInvoice> invoiceData = new ArrayList<>();
-
-		try {
-
-			UsageAggregateResponse usageAggregateResponse = null;
-			Map<String, Meter> rates = transformRates(azureRateCardClient.getRateCard());
-
-			do {
-
-				if (usageAggregateResponse != null && StringUtils.isNotEmpty(usageAggregateResponse.getNextLink())) {
-					log.info("Get usage of resources using link {}", usageAggregateResponse.getNextLink());
-					usageAggregateResponse = azureUsageAggregateClient.getUsageAggregateResponse
-                            (usageAggregateResponse.getNextLink());
-					log.info("Received usage of resources. Items {} ", usageAggregateResponse.getValue() != null ?
-							usageAggregateResponse.getValue().size() : 0);
-					log.info("Next link is {}", usageAggregateResponse.getNextLink());
-				} else if (usageAggregateResponse == null) {
-					log.info("Get usage of resources from {} to {}", from, to);
-					usageAggregateResponse = azureUsageAggregateClient.getUsageAggregateResponse(from, to);
-					log.info("Received usage of resources. Items {} ", usageAggregateResponse.getValue() != null ?
-							usageAggregateResponse.getValue().size() : 0);
-					log.info("Next link is {}", usageAggregateResponse.getNextLink());
-				}
-
-				invoiceData.addAll(generateBillingInfo(rates, usageAggregateResponse));
-
-				if (System.currentTimeMillis() > refreshTokenTime) {
-					authenticationToken = getNewToken();
-					azureUsageAggregateClient.setAuthToken(authenticationToken);
-				}
-
-			} while (StringUtils.isNotEmpty(usageAggregateResponse.getNextLink()));
-
-		} catch (IOException | RuntimeException | URISyntaxException e) {
-			log.error("Cannot calculate billing information", e);
-			throw new DlabException("Cannot prepare invoice data", e);
-		}
-
-		return invoiceData;
-	}
-
-	private List<AzureDailyResourceInvoice> generateBillingInfo(Map<String, Meter> rates, UsageAggregateResponse
-            usageAggregateResponse) {
-		List<UsageAggregateRecord> usageAggregateRecordList = usageAggregateResponse.getValue();
-		List<AzureDailyResourceInvoice> invoices = new ArrayList<>();
-
-		if (usageAggregateRecordList != null && !usageAggregateRecordList.isEmpty()) {
-			log.info("Processing {} usage records", usageAggregateRecordList.size());
-			usageAggregateRecordList = usageAggregateRecordList.stream().filter(e ->
-					matchProperStructure(e) && isBillableDlabResource(e))
-					.collect(Collectors.toList());
-
-			log.info("Applicable records number is {}", usageAggregateRecordList.size());
-
-			for (UsageAggregateRecord record : usageAggregateRecordList) {
-				invoices.add(calculateInvoice(rates, record, record.getProperties().getParsedInstanceData()
-						.getMicrosoftResources().getTags().get("Name")));
-			}
-		} else {
-			log.error("No usage records in response.");
-		}
-
-		return invoices;
-	}
-
-	private Map<String, Meter> transformRates(RateCardResponse rateCardResponse) {
-		Map<String, Meter> rates = new HashMap<>();
-		for (Meter meter : rateCardResponse.getMeters()) {
-			rates.put(meter.getMeterId(), meter);
-		}
-
-		return rates;
-	}
-
-	private boolean matchProperStructure(UsageAggregateRecord record) {
-		if (record.getProperties() == null) {
-			return false;
-		}
-
-		if (record.getProperties().getMeterId() == null || record.getProperties().getMeterId().isEmpty()) {
-			return false;
-		}
-
-		return !(record.getProperties().getParsedInstanceData() == null
-				|| record.getProperties().getParsedInstanceData().getMicrosoftResources() == null
-				|| record.getProperties().getParsedInstanceData().getMicrosoftResources().getTags() == null
-				|| record.getProperties().getParsedInstanceData().getMicrosoftResources().getTags().isEmpty());
-	}
-
-	private boolean isBillableDlabResource(UsageAggregateRecord record) {
-		String dlabId = record.getProperties().getParsedInstanceData().getMicrosoftResources().getTags().get("Name");
-		return dlabId != null && !dlabId.isEmpty() && dlabId.startsWith(billingConfigurationAzure.getSbn());
-	}
-
-	private AzureDailyResourceInvoice calculateInvoice(Map<String, Meter> rates, UsageAggregateRecord record, String dlabId) {
-		String meterId = record.getProperties().getMeterId();
-		Meter rateCard = rates.get(meterId);
-
-		if (rateCard != null) {
-			Map<String, Double> meterRates = rateCard.getMeterRates();
-			if (meterRates != null) {
-				Double rate = meterRates.get(AzureRateCardClient.MAIN_RATE_KEY);
-				if (rate != null) {
-					return AzureDailyResourceInvoice.builder()
-							.dlabId(dlabId)
-							.usageStartDate(getDay(record.getProperties().getUsageStartTime()))
-							.usageEndDate(getDay(record.getProperties().getUsageEndTime()))
-							.meterCategory(record.getProperties().getMeterCategory())
-							.cost(BillingCalculationUtils.round(rate * record.getProperties().getQuantity(), 3))
-							.day(getDay(record.getProperties().getUsageStartTime()))
-							.currencyCode(billingConfigurationAzure.getCurrency())
-							.build();
-				} else {
-					log.error("Rate Card {} has no rate for meter id {} and rate id {}. Skip record {}.",
-							rateCard, meterId, AzureRateCardClient.MAIN_RATE_KEY, record);
-				}
-			} else {
-				log.error("Rate Card {} has no meter rates fro meter id {}. Skip record {}",
-						rateCard, meterId, record);
-			}
-		} else {
-			log.error("Meter rate {} form usage aggregate is not found in rate card. Skip record {}.", meterId, record);
-		}
-
-		return null;
-	}
-
-	private String getNewToken() {
-		try {
-			log.info("Requesting authentication token ... ");
-			ApplicationTokenCredentials applicationTokenCredentials = new ApplicationTokenCredentials(
-					billingConfigurationAzure.getClientId(),
-					billingConfigurationAzure.getTenantId(),
-					billingConfigurationAzure.getClientSecret(),
-					AzureEnvironment.AZURE);
-
-			return applicationTokenCredentials.getToken(AzureEnvironment.AZURE.resourceManagerEndpoint());
-		} catch (IOException e) {
-			log.error("Cannot retrieve authentication token due to", e);
-			throw new DlabException("Cannot retrieve authentication token", e);
-		}
-	}
-
-	private String getDay(String dateTime) {
-		if (dateTime != null) {
-			String[] parts = dateTime.split("T");
-			if (parts.length == 2) {
-				return parts[0];
-			}
-		}
-
-		log.error("Wrong usage date format {} ", dateTime);
-		return null;
-	}
-
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/BillingAzureApplication.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/BillingAzureApplication.java
deleted file mode 100644
index 1a40767..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/BillingAzureApplication.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
-
-@SpringBootApplication
-@EnableMongoRepositories
-@EnableConfigurationProperties
-public class BillingAzureApplication {
-
-    public static void main(String[] args) {
-        SpringApplication.run(BillingAzureApplication.class, args);
-    }
-
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingService.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingService.java
deleted file mode 100644
index d432337..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure;
-
-import com.epam.dlab.dto.billing.BillingData;
-
-import java.util.List;
-
-public interface CalculateBillingService {
-    List<BillingData> getBillingData();
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingServiceImpl.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingServiceImpl.java
deleted file mode 100644
index 3b3d60b..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/CalculateBillingServiceImpl.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure;
-
-import com.epam.dlab.MongoKeyWords;
-import com.epam.dlab.billing.azure.config.AzureAuthFile;
-import com.epam.dlab.billing.azure.config.BillingConfigurationAzure;
-import com.epam.dlab.billing.azure.model.AzureDailyResourceInvoice;
-import com.epam.dlab.billing.azure.model.BillingPeriod;
-import com.epam.dlab.dto.billing.BillingData;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.util.mongo.modules.IsoDateModule;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.mongodb.BasicDBObject;
-import com.mongodb.client.model.Filters;
-import com.mongodb.client.model.UpdateOptions;
-import com.mongodb.client.result.UpdateResult;
-import lombok.extern.slf4j.Slf4j;
-import org.bson.Document;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.time.LocalDate;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-@Slf4j
-@Service
-public class CalculateBillingServiceImpl implements CalculateBillingService {
-    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z");
-    private static final String SCHEDULER_ID = "azureBillingScheduler";
-    private final BillingConfigurationAzure billingConfigurationAzure;
-    private final MongoDbBillingClient mongoDbBillingClient;
-    private ObjectMapper objectMapper;
-
-    @Autowired
-    public CalculateBillingServiceImpl(BillingConfigurationAzure configuration) throws IOException {
-        billingConfigurationAzure = configuration;
-        objectMapper = new ObjectMapper().registerModule(new IsoDateModule());
-        Path path = Paths.get(billingConfigurationAzure.getAuthenticationFile());
-
-        if (path.toFile().exists()) {
-            log.info("Read and override configs using auth file");
-            try {
-                AzureAuthFile azureAuthFile = new ObjectMapper().readValue(path.toFile(), AzureAuthFile.class);
-                this.billingConfigurationAzure.setClientId(azureAuthFile.getClientId());
-                this.billingConfigurationAzure.setClientSecret(azureAuthFile.getClientSecret());
-                this.billingConfigurationAzure.setTenantId(azureAuthFile.getTenantId());
-                this.billingConfigurationAzure.setSubscriptionId(azureAuthFile.getSubscriptionId());
-            } catch (IOException e) {
-                log.error("Cannot read configuration file", e);
-                throw e;
-            }
-            log.info("Configs from auth file are used");
-        } else {
-            log.info("Configs from yml file are used");
-        }
-
-        this.mongoDbBillingClient = new MongoDbBillingClient
-                (billingConfigurationAzure.getAggregationOutputMongoDataSource().getHost(),
-                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getPort(),
-                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getDatabase(),
-                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getUsername(),
-                        billingConfigurationAzure.getAggregationOutputMongoDataSource().getPassword());
-    }
-
-    @Override
-    public List<BillingData> getBillingData() {
-        try {
-            BillingPeriod billingPeriod = getBillingPeriod();
-            DateTime currentTime = new DateTime().withZone(DateTimeZone.UTC);
-            if (billingPeriod == null) {
-                saveBillingPeriod(initialSchedulerInfo(currentTime));
-            } else {
-                log.info("Billing period from db is {}", billingPeriod);
-
-                if (shouldTriggerJobByTime(currentTime, billingPeriod)) {
-                    List<BillingData> billingData = getBillingData(billingPeriod);
-                    boolean hasNew = !billingData.isEmpty();
-                    updateBillingPeriod(billingPeriod, currentTime, hasNew);
-                    return billingData;
-                }
-            }
-        } catch (RuntimeException e) {
-            log.error("Cannot update billing information", e);
-        }
-        return Collections.emptyList();
-    }
-
-    private BillingPeriod initialSchedulerInfo(DateTime currentTime) {
-
-        BillingPeriod initialBillingPeriod = new BillingPeriod();
-        initialBillingPeriod.setFrom(currentTime.minusDays(2).toDateMidnight().toDate());
-        initialBillingPeriod.setTo(currentTime.toDateMidnight().toDate());
-
-        log.info("Initial scheduler info {}", initialBillingPeriod);
-
-        return initialBillingPeriod;
-
-    }
-
-    private boolean shouldTriggerJobByTime(DateTime currentTime, BillingPeriod billingPeriod) {
-
-        DateTime dateTimeToFromBillingPeriod = new DateTime(billingPeriod.getTo()).withZone(DateTimeZone.UTC);
-
-        log.info("Comparing current time[{}, {}] and from scheduler info [{}, {}]", currentTime,
-                currentTime.toDateMidnight(),
-                dateTimeToFromBillingPeriod, dateTimeToFromBillingPeriod.toDateMidnight());
-
-        if (currentTime.toDateMidnight().isAfter(dateTimeToFromBillingPeriod.toDateMidnight())
-                || currentTime.toDateMidnight().isEqual(dateTimeToFromBillingPeriod.toDateMidnight())) {
-            log.info("Should trigger the job by time");
-            return true;
-        }
-
-        log.info("Should not trigger the job by time");
-        return false;
-    }
-
-    private List<BillingData> getBillingData(BillingPeriod billingPeriod) {
-        AzureInvoiceCalculationService azureInvoiceCalculationService
-                = new AzureInvoiceCalculationService(billingConfigurationAzure);
-
-        List<AzureDailyResourceInvoice> dailyInvoices = azureInvoiceCalculationService.generateInvoiceData(
-                DATE_TIME_FORMATTER.print(new DateTime(billingPeriod.getFrom()).withZone(DateTimeZone.UTC)),
-                DATE_TIME_FORMATTER.print(new DateTime(billingPeriod.getTo()).withZone(DateTimeZone.UTC)));
-
-        if (!dailyInvoices.isEmpty()) {
-            return dailyInvoices
-                    .stream()
-                    .map(this::toBillingData)
-                    .collect(Collectors.toList());
-        } else {
-            log.warn("Daily invoices is empty for period {}", billingPeriod);
-            return Collections.emptyList();
-        }
-    }
-
-    private void updateBillingPeriod(BillingPeriod billingPeriod, DateTime currentTime, boolean updates) {
-
-        try {
-            mongoDbBillingClient.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER_HISTORY).insertOne(
-                    Document.parse(objectMapper.writeValueAsString(billingPeriod)).append("updates", updates));
-            log.debug("History of billing periods is updated with {}",
-                    objectMapper.writeValueAsString(billingPeriod));
-        } catch (JsonProcessingException e) {
-            log.error("Cannot update history of billing periods", e);
-
-        }
-
-        billingPeriod.setFrom(billingPeriod.getTo());
-
-        if (new DateTime(billingPeriod.getFrom()).withZone(DateTimeZone.UTC).toDateMidnight()
-                .isEqual(currentTime.toDateMidnight())) {
-
-            log.info("Setting billing to one day later");
-            billingPeriod.setTo(currentTime.plusDays(1).toDateMidnight().toDate());
-
-        } else {
-            billingPeriod.setTo(currentTime.toDateMidnight().toDate());
-        }
-
-        saveBillingPeriod(billingPeriod);
-    }
-
-    private boolean saveBillingPeriod(BillingPeriod billingPeriod) {
-        log.debug("Saving billing period {}", billingPeriod);
-
-        try {
-            UpdateResult updateResult = mongoDbBillingClient.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER)
-                    .updateMany(Filters.eq(MongoKeyWords.MONGO_ID, SCHEDULER_ID),
-                            new BasicDBObject("$set",
-                                    Document.parse(objectMapper.writeValueAsString(billingPeriod))
-                                            .append(MongoKeyWords.MONGO_ID, SCHEDULER_ID))
-                            , new UpdateOptions().upsert(true)
-                    );
-
-            log.debug("Billing period save operation result is {}", updateResult);
-            return true;
-        } catch (JsonProcessingException e) {
-            log.error("Cannot save billing period", e);
-        }
-
-        return false;
-    }
-
-    private BillingPeriod getBillingPeriod() {
-        log.debug("Get billing period");
-
-        try {
-            Document document = mongoDbBillingClient.getDatabase().getCollection(MongoKeyWords.AZURE_BILLING_SCHEDULER)
-                    .find(Filters.eq(MongoKeyWords.MONGO_ID, SCHEDULER_ID)).first();
-
-            log.debug("Retrieved billing period document {}", document);
-            if (document != null) {
-                return objectMapper.readValue(document.toJson(), BillingPeriod.class);
-            }
-
-            return null;
-
-        } catch (IOException e) {
-            log.error("Cannot save billing period", e);
-            throw new DlabException("Cannot parse string", e);
-        }
-    }
-
-    private BillingData toBillingData(AzureDailyResourceInvoice billingData) {
-        return BillingData.builder()
-                .tag(billingData.getDlabId().toLowerCase())
-                .usageDateFrom(Optional.ofNullable(billingData.getUsageStartDate()).map(LocalDate::parse).orElse(null))
-                .usageDateTo(Optional.ofNullable(billingData.getUsageEndDate()).map(LocalDate::parse).orElse(null))
-                .usageDate(billingData.getDay())
-                .product(billingData.getMeterCategory())
-                .cost(billingData.getCost())
-                .currency(billingData.getCurrencyCode())
-                .build();
-    }
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/MongoDbBillingClient.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/MongoDbBillingClient.java
deleted file mode 100644
index b5ae73b..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/MongoDbBillingClient.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure;
-
-import com.google.common.collect.Lists;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoCredential;
-import com.mongodb.ServerAddress;
-import com.mongodb.client.MongoDatabase;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class MongoDbBillingClient {
-
-    private MongoClient client;
-    private MongoDatabase database;
-
-    public MongoDbBillingClient(String host, int port, String databaseName, String username, String password) {
-        this.client = new MongoClient(new ServerAddress(host, port),
-                Lists.newArrayList(MongoCredential.createCredential(username,
-                        databaseName, password.toCharArray())));
-
-        this.database = client.getDatabase(databaseName);
-    }
-
-    public MongoClient getClient() {
-        return client;
-    }
-
-    public MongoDatabase getDatabase() {
-        return database;
-    }
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/MongoDocument.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/MongoDocument.java
deleted file mode 100644
index f41de08..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/MongoDocument.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure;
-
-import com.epam.dlab.exceptions.DlabException;
-import org.bson.Document;
-
-import java.lang.reflect.Field;
-
-public abstract class MongoDocument<T> {
-
-    protected Document to() {
-        Field[] fields = this.getClass().getDeclaredFields();
-        Document document = new Document();
-
-        try {
-            for (Field field : fields) {
-                field.setAccessible(true);
-                if (field.getType().isEnum()) {
-                    document.append(field.getName(), field.get(this).toString());
-                } else {
-                    document.append(field.getName(), field.get(this));
-                }
-            }
-
-            return document;
-
-        } catch (IllegalArgumentException | IllegalAccessException e) {
-            throw new DlabException("", e);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private T from(Document document) {
-
-        Field[] fields = this.getClass().getDeclaredFields();
-
-        try {
-            for (Field field : fields) {
-                field.setAccessible(true);
-
-                if (field.getType().isEnum()) {
-                    field.set(this, Enum.valueOf((Class<Enum>) field.getType(), (String) document.get(field.getName())));
-                } else {
-                    field.set(this, document.get(field.getName()));
-                }
-            }
-            return (T) this;
-        } catch (IllegalArgumentException | IllegalAccessException e) {
-            throw new DlabException("", e);
-        }
-    }
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/AggregationOutputMongoDataSource.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/AggregationOutputMongoDataSource.java
deleted file mode 100644
index 345586d..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/AggregationOutputMongoDataSource.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.config;
-
-import lombok.Data;
-
-@Data
-public class AggregationOutputMongoDataSource {
-    private String host;
-    private int port;
-    private String username;
-    private String password;
-    private String database;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/AzureAuthFile.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/AzureAuthFile.java
deleted file mode 100644
index 1d1993c..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/AzureAuthFile.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.config;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Getter;
-import lombok.ToString;
-
-@Getter
-@ToString(exclude = {"clientSecret"})
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class AzureAuthFile {
-    @JsonProperty
-    private String clientId;
-    @JsonProperty
-    private String clientSecret;
-    @JsonProperty
-    private String tenantId;
-    @JsonProperty
-    private String subscriptionId;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/BillingConfigurationAzure.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/BillingConfigurationAzure.java
deleted file mode 100644
index 0a28828..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/BillingConfigurationAzure.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.config;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@ConfigurationProperties("dlab")
-@Data
-public class BillingConfigurationAzure {
-    private String sbn;
-    private long initialDelay;
-    private long period;
-
-    private String clientId;
-    private String clientSecret;
-    private String tenantId;
-    private String subscriptionId;
-
-    private String authenticationFile;
-
-    private String offerNumber;
-    private String currency;
-    private String locale;
-    private String regionInfo;
-    private boolean billingEnabled;
-
-    private String ssnStorageAccountTagName;
-    private String sharedStorageAccountTagName;
-    private String datalakeTagName;
-
-    private AggregationOutputMongoDataSource aggregationOutputMongoDataSource;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/LoggingConfigurationFactory.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/LoggingConfigurationFactory.java
deleted file mode 100644
index 2bd185e..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/LoggingConfigurationFactory.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.config;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.LoggerContext;
-import com.epam.dlab.billing.azure.logging.AppenderBase;
-import com.epam.dlab.exceptions.InitializationException;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import org.slf4j.LoggerFactory;
-
-/**
- * Configuration and factory for logging.
- */
-public class LoggingConfigurationFactory {
-
-	/**
-	 * Default logging level for all appenders.
-	 */
-	@JsonProperty
-	private Level level = Level.INFO;
-
-	/**
-	 * List of logging levels for appenders.
-	 */
-	@JsonIgnore
-	private ImmutableMap<String, Level> loggers = ImmutableMap.of();
-
-	/**
-	 * List of logging appenders.
-	 */
-	@JsonProperty
-	private ImmutableList<AppenderBase> appenders = ImmutableList.of();
-
-
-	/**
-	 * Return the default logging level for all appenders.
-	 */
-	public Level getLevel() {
-		return level;
-	}
-
-	/**
-	 * Set the default logging level for all appenders.
-	 */
-	public void setLevel(String level) throws InitializationException {
-		this.level = toLevel(level);
-	}
-
-	/**
-	 * Return the list of logging levels for appenders.
-	 */
-	public ImmutableMap<String, Level> getLoggers() {
-		return loggers;
-	}
-
-	/**
-	 * Set the list of logging levels for appenders.
-	 */
-	@JsonProperty
-	public void setLoggers(ImmutableMap<String, JsonNode> loggers) throws InitializationException {
-		ImmutableMap.Builder<String, Level> levels = new ImmutableMap.Builder<String, Level>();
-		for (String key : loggers.keySet()) {
-			JsonNode node = loggers.get(key);
-			levels.put(key, toLevel(node.asText()));
-		}
-		this.loggers = levels.build();
-	}
-
-	/**
-	 * Return the list of logging appenders.
-	 */
-	public ImmutableList<AppenderBase> getAppenders() {
-		return appenders;
-	}
-
-	/**
-	 * Set the list of logging appenders.
-	 */
-	public void setAppenders(ImmutableList<AppenderBase> appenders) {
-		this.appenders = appenders;
-	}
-
-
-	/**
-	 * Translate the name of logging level to {@link Level}.
-	 *
-	 * @param level the name of logging level.
-	 * @return logging level.
-	 * @throws InitializationException if given unknown logging level name.
-	 */
-	private Level toLevel(String level) throws InitializationException {
-		Level l = Level.toLevel(level, null);
-		if (l == null) {
-			throw new InitializationException("Unknown logging level: " + level);
-		}
-		return l;
-	}
-
-	/**
-	 * Configure logging appenders.
-	 *
-	 * @throws InitializationException
-	 */
-	public void configure() throws InitializationException {
-		if (appenders == null) {
-			throw new InitializationException("Configuration property logging.appenders cannot be null.");
-		}
-		LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
-		context.reset();
-
-		for (AppenderBase appender : appenders) {
-			appender.configure(context);
-		}
-
-		Logger logger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
-		logger.setLevel(level);
-		for (String name : loggers.keySet()) {
-			logger = context.getLogger(name);
-			logger.setLevel(loggers.get(name));
-		}
-	}
-
-
-	/**
-	 * Returns a string representation of the object.
-	 *
-	 * @param self the object to generate the string for (typically this), used only for its class name.
-	 */
-	public ToStringHelper toStringHelper(Object self) {
-		return MoreObjects.toStringHelper(self)
-				.add("level", level)
-				.add("loggers", loggers)
-				.add("appenders", appenders);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this)
-				.toString();
-	}
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/SecurityConfig.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/SecurityConfig.java
deleted file mode 100644
index 35e341c..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/config/SecurityConfig.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.config;
-
-import org.keycloak.adapters.KeycloakConfigResolver;
-import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
-import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
-import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
-import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
-import org.springframework.security.core.session.SessionRegistryImpl;
-import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
-import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
-
-@KeycloakConfiguration
-class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
-
-    @Autowired
-    public void configureGlobal(AuthenticationManagerBuilder auth) {
-        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
-        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
-        auth.authenticationProvider(keycloakAuthenticationProvider);
-    }
-
-    @Bean
-    public KeycloakConfigResolver KeycloakConfigResolver() {
-        return new KeycloakSpringBootConfigResolver();
-    }
-
-    @Bean
-    @Override
-    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
-        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
-    }
-
-    @Override
-    protected void configure(HttpSecurity http) throws Exception {
-        super.configure(http);
-        http
-                .anonymous().disable()
-                .authorizeRequests()
-                .anyRequest()
-                .authenticated();
-    }
-}
\ No newline at end of file
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/controller/BillingController.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/controller/BillingController.java
deleted file mode 100644
index 9018791..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/controller/BillingController.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.controller;
-
-import com.epam.dlab.billing.azure.CalculateBillingService;
-import com.epam.dlab.dto.billing.BillingData;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-@RestController
-public class BillingController {
-
-    private final CalculateBillingService billingService;
-
-    public BillingController(CalculateBillingService billingService) {
-        this.billingService = billingService;
-    }
-
-    @GetMapping
-    public ResponseEntity<List<BillingData>> getBilling() {
-        return new ResponseEntity<>(billingService.getBillingData(), HttpStatus.OK);
-    }
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/logging/AppenderBase.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/logging/AppenderBase.java
deleted file mode 100644
index 405b56b..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/logging/AppenderBase.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.logging;
-
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.OutputStreamAppender;
-import com.epam.dlab.exceptions.InitializationException;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import java.util.TimeZone;
-
-/** Abstract class provides base configuration for the log appenders.
- */
-@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
-public abstract class AppenderBase {
-
-	/** Log format pattern. */
-	private final String logFormatPattern = "%-5p [%d{ISO8601," + TimeZone.getDefault().getID() + "}] %c: %m%n%rEx";
-	
-	/** Perform configure of appender.
-	 * @param context the context of logger.
-	 */
-	public abstract void configure(LoggerContext context) throws InitializationException;
-	
-	/** Perform the base configure of appender.
-	 * @param context the context of logger.
-	 * @param appenderName the name of appender.
-	 * @param appender the class instance of appender.
-	 */
-	public void configure(LoggerContext context, String appenderName, OutputStreamAppender<ILoggingEvent> appender) {
-        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
-        encoder.setPattern(logFormatPattern);
-        encoder.setContext(context);
-        encoder.start();
-
-        appender.setContext(context);
-        appender.setName(appenderName);
-        appender.setEncoder(encoder);
-        appender.start();
-
-        Logger logger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
-        logger.addAppender(appender);
-        logger.setAdditive(true);
-	}
-
-	/** Return the name of type for appender. */
-	@JsonIgnore
-	public String getType() {
-		Class<? extends AppenderBase> clazz = this.getClass();
-		return (clazz.isAnnotationPresent(JsonTypeName.class) ?
-				clazz.getAnnotation(JsonTypeName.class).value() : clazz.getName());
-	}
-	
-	
-	/** Returns a string representation of the object.
-	 * @param self the object to generate the string for (typically this), used only for its class name.
-	 */
-	public ToStringHelper toStringHelper(Object self) {
-    	return MoreObjects.toStringHelper(self)
-    			.add("type",  getType());
-    }
-    
-    @Override
-    public String toString() {
-    	return toStringHelper(this)
-    			.toString();
-    }
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/logging/AppenderConsole.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/logging/AppenderConsole.java
deleted file mode 100644
index 262e414..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/logging/AppenderConsole.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.logging;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.ConsoleAppender;
-import com.epam.dlab.exceptions.InitializationException;
-import com.fasterxml.jackson.annotation.JsonClassDescription;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-
-/** Console appender for logging.
- */
-@JsonTypeName("console")
-@JsonClassDescription(
-	"Console log appender.\n" +
-	"Output log data to console. Does not have any properties.\n" +
-	"  - type: console"
-	)
-public class AppenderConsole extends AppenderBase {
-	
-	@Override
-    public void configure(LoggerContext context)  throws InitializationException {
-    	super.configure(context, "console-appender", new ConsoleAppender<ILoggingEvent>());
-    }
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/logging/AppenderFile.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/logging/AppenderFile.java
deleted file mode 100644
index 34a11b3..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/logging/AppenderFile.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.logging;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.CoreConstants;
-import ch.qos.logback.core.FileAppender;
-import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy;
-import ch.qos.logback.core.rolling.RollingFileAppender;
-import ch.qos.logback.core.rolling.TimeBasedFileNamingAndTriggeringPolicy;
-import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
-import com.epam.dlab.exceptions.InitializationException;
-import com.fasterxml.jackson.annotation.JsonClassDescription;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-/** File appender for logging. Support rolling files and archiving.
- */
-@JsonTypeName("file")
-@JsonClassDescription(
-	"File log appender.\n" + 
-	"Output log data to the file, if property archive is set to true then rolling\n" +
-	"mode is enabled. If archivedLogFilenamePattern ends with .gz or .zip extension\n" +
-	"then old log file will be compressed.\n" +
-	"  - type: file\n" +
-	"    currentLogFilename: <[path/]filename.log>  - pattern for log file naming.\n" +
-	"    [archive: <true | false>]                  - rolling log files or none.\n" +
-	"    [archivedLogFilenamePattern: <[path/]filename-%d{yyyy-MM-dd}.log[.gz | .zip]>]\n" +
-	"                                               - pattern for naming the archive log\n" +
-	"                                                 files.\n" +
-	"    [archivedFileCount: <number_of_days>]      - number of archive log file history."
-	)
-public class AppenderFile extends AppenderBase {
-
-	/** The name of current log file. */
-    @JsonProperty
-    private String currentLogFilename;
-
-	/** Flag for archive of old files. */
-    @JsonProperty
-    private boolean archive = false;
-    
-    /** Pattern for naming archive files. The compression mode depending on last
-	 * letters of the fileNamePatternStr. Patterns ending with .gz imply GZIP
-	 * compression, endings with '.zip' imply ZIP compression. Otherwise and by
-	 * default, there is no compression. */
-    @JsonProperty
-    private String archivedLogFilenamePattern;
-    
-    /** The maximum number of archive files to keep.. */
-    @JsonProperty
-    private int archivedFileCount = CoreConstants.UNBOUND_HISTORY;
-    
-    
-    /** Return the name of current log file. */
-    public String getCurrentLogFilename() {
-    	return currentLogFilename;
-    }
-    
-    /** Set the name of current log file. */
-    public void setCurrentLogFilename(String currentLogFilename) {
-    	this.currentLogFilename = currentLogFilename;
-    }
-    
-    /** Return the flag for archive of old files. */
-    public boolean getArchive() {
-    	return archive;
-    }
-    
-    /** Set the flag for archive of old files. */
-    public void setArchive(boolean archive) {
-    	this.archive = archive;
-    }
-    
-    /** Return the pattern for naming archive files. */
-    public String getArchivedLogFilenamePattern() {
-    	return archivedLogFilenamePattern;
-    }
-    
-    /** Set pattern for naming archive files. The compression mode depending on last
-	 * letters of the fileNamePatternStr. Patterns ending with .gz imply GZIP
-	 * compression, endings with '.zip' imply ZIP compression. Otherwise and by
-	 * default, there is no compression.
-	 * For example,
-	 * /logs/application-%d{yyyy-MM-dd}.log.gz
-	 */
-    public void setArchivedLogFilenamePattern(String archivedLogFilenamePattern) {
-    	this.archivedLogFilenamePattern = archivedLogFilenamePattern;
-    }
-    
-    /** Return the maximum number of archive files to keep.. */
-    public int getArchivedFileCount() {
-    	return archivedFileCount;
-    }
-    
-    /** Set the maximum number of archive files to keep.. */
-    public void setArchivedFileCount(int archivedFileCount) {
-    	this.archivedFileCount = archivedFileCount;
-    }
-    
-    
-    @Override
-    public void configure(LoggerContext context) throws InitializationException {
-    	if (currentLogFilename == null || currentLogFilename.trim().isEmpty()) {
-    		throw new InitializationException("Configuration property logging.appenders.currentLogFilename cannot be null.");
-    	}
-    	super.configure(context, "file-appender", (archive ? getRollingFileAppender(context) : getFileAppender()));
-    }
-
-    /** Create and return synchronous the file appender. 
-     */
-	private FileAppender<ILoggingEvent> getFileAppender() {
-		FileAppender<ILoggingEvent> appender = new FileAppender<ILoggingEvent>();
-		appender.setFile(currentLogFilename);
-		appender.setAppend(true);
-		return appender;
-	}
-	
-    /** Create and return synchronous the rolling file appender.
-     * @param context the context of logger. 
-     */
-	private RollingFileAppender<ILoggingEvent> getRollingFileAppender(LoggerContext context) throws InitializationException {
-		if (archivedLogFilenamePattern == null || archivedLogFilenamePattern.trim().isEmpty()) {
-			throw new InitializationException("Configuration property logging.appenders.archivedLogFilenamePattern cannot be null.");
-		}
-		RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<ILoggingEvent>();
-        appender.setFile(currentLogFilename);
-        appender.setAppend(true);
-
-        TimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent> triggerPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent>();
-        triggerPolicy.setContext(context);
-        
-        TimeBasedRollingPolicy<ILoggingEvent> rollPolicy = new TimeBasedRollingPolicy<ILoggingEvent>();
-        rollPolicy.setContext(context);
-        rollPolicy.setParent(appender);
-        rollPolicy.setFileNamePattern(archivedLogFilenamePattern);
-        rollPolicy.setMaxHistory(archivedFileCount);
-        rollPolicy.setTimeBasedFileNamingAndTriggeringPolicy(triggerPolicy);
-        rollPolicy.start();
-        appender.setRollingPolicy(rollPolicy);
-        
-		return appender;
-	}
-
-	
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("currentLogFilename", currentLogFilename)
-				.add("archive", archive)
-				.add("archivedLogFilenamePattern", archivedLogFilenamePattern)
-				.add("archivedFileCount", archivedFileCount);
-	}
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/model/AzureDailyResourceInvoice.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/model/AzureDailyResourceInvoice.java
deleted file mode 100644
index 486ddd5..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/model/AzureDailyResourceInvoice.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.model;
-
-import com.epam.dlab.billing.azure.MongoDocument;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@Builder
-@EqualsAndHashCode(callSuper = true)
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class AzureDailyResourceInvoice extends MongoDocument<AzureDailyResourceInvoice> {
-	@JsonProperty
-	private String dlabId;
-	@JsonProperty
-	private String meterCategory;
-	@JsonProperty
-	private String usageStartDate;
-	@JsonProperty
-	private String usageEndDate;
-	@JsonProperty
-	private String day;
-	@JsonProperty
-	private double cost;
-	@JsonProperty
-	private String currencyCode;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/model/AzureDlabBillableResource.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/model/AzureDlabBillableResource.java
deleted file mode 100644
index 639788b..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/model/AzureDlabBillableResource.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.model;
-
-import com.epam.dlab.billing.DlabResourceType;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-public class AzureDlabBillableResource {
-    private String id;
-    private DlabResourceType type;
-    private String user;
-    private String project;
-    private String notebookId;
-    private String resourceName;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/model/BillingPeriod.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/model/BillingPeriod.java
deleted file mode 100644
index e4a8647..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/model/BillingPeriod.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.model;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.Date;
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class BillingPeriod {
-    @JsonProperty
-    private Date from;
-    @JsonProperty
-    private Date to;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/rate/AzureRateCardClient.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/rate/AzureRateCardClient.java
deleted file mode 100644
index 39e2ec1..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/rate/AzureRateCardClient.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.rate;
-
-import com.epam.dlab.billing.azure.config.BillingConfigurationAzure;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.http.*;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.DefaultRedirectStrategy;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.EntityUtils;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.util.Arrays;
-import java.util.function.Predicate;
-
-@Slf4j
-public class AzureRateCardClient {
-	private ObjectMapper objectMapper = new ObjectMapper();
-	public static final String MAIN_RATE_KEY = "0";
-	private BillingConfigurationAzure billingConfigurationAzure;
-	private String authToken;
-
-	public AzureRateCardClient(BillingConfigurationAzure billingConfigurationAzure, String authToken) {
-		this.billingConfigurationAzure = billingConfigurationAzure;
-		this.authToken = authToken;
-	}
-
-	public RateCardResponse getRateCard() throws IOException, URISyntaxException {
-
-		try (CloseableHttpClient httpClient = HttpClients.custom()
-				.setRedirectStrategy(new CustomRedirectWithoutAuthorizationStrategy())
-				.build()) {
-			final URIBuilder uriBuilder = new URIBuilder("https://management.azure.com/subscriptions/" +
-					billingConfigurationAzure.getSubscriptionId() + "/providers/Microsoft.Commerce/RateCard")
-					.addParameter("api-version", "2016-08-31-preview")
-					.addParameter("$filter", String.format("OfferDurableId eq '%s' and Currency eq '%s' and Locale " +
-									"eq '%s' and RegionInfo eq '%s'", billingConfigurationAzure.getOfferNumber(),
-							billingConfigurationAzure.getCurrency(), billingConfigurationAzure.getLocale(),
-							billingConfigurationAzure.getRegionInfo()));
-
-			final HttpGet request = new HttpGet(uriBuilder.build());
-			request.addHeader("Authorization", String.format("Bearer %s", authToken));
-			request.addHeader(HttpHeaders.ACCEPT, "application/json");
-			return objectMapper.readValue(EntityUtils.toString
-					(httpClient.execute(request).getEntity()), RateCardResponse.class);
-		} catch (IOException | URISyntaxException e) {
-			log.error("Cannot retrieve rate card due to ", e);
-			throw e;
-		}
-	}
-
-	class CustomRedirectWithoutAuthorizationStrategy extends DefaultRedirectStrategy {
-		@Override
-		public HttpUriRequest getRedirect(HttpRequest request, HttpResponse response, HttpContext context) throws
-				ProtocolException {
-			if (HttpGet.METHOD_NAME.equals(request.getRequestLine().getMethod())) {
-				return httpGetWithoutAuthorization(request, response, context);
-			} else {
-				return super.getRedirect(request, response, context);
-			}
-		}
-
-		private HttpUriRequest httpGetWithoutAuthorization(HttpRequest request, HttpResponse response, HttpContext
-				context) throws ProtocolException {
-			return new HttpGet(getLocationURI(request, response, context)) {
-				@Override
-				public void setHeaders(Header[] headers) {
-					super.setHeaders(filter(headers, h -> !h.getName().equals(HttpHeaders.AUTHORIZATION)));
-				}
-
-				private Header[] filter(Header[] headers, Predicate<Header> predicate) {
-					return Arrays.stream(headers)
-							.filter(predicate)
-							.toArray(Header[]::new);
-				}
-			};
-		}
-	}
-
-
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/rate/Meter.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/rate/Meter.java
deleted file mode 100644
index 68cdd7f..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/rate/Meter.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.rate;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.List;
-import java.util.Map;
-
-@Data
-public class Meter {
-    @JsonProperty("EffectiveDate")
-    private String effectiveDate;
-    @JsonProperty("IncludedQuantity")
-    private long includedQuantity;
-    @JsonProperty("MeterCategory")
-    private String meterCategory;
-    @JsonProperty("MeterId")
-    private String meterId;
-    @JsonProperty("MeterName")
-    private String meterName;
-    @JsonProperty("MeterRates")
-    private Map<String, Double> meterRates;
-    @JsonProperty("MeterRegion")
-    private String meterRegion;
-    @JsonProperty("MeterStatus")
-    private String meterStatus;
-    @JsonProperty("MeterSubCategory")
-    private String meterSubCategory;
-    @JsonProperty("MeterTags")
-    private List<Object> meterTags;
-    @JsonProperty("Unit")
-    private String unit;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/rate/RateCardResponse.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/rate/RateCardResponse.java
deleted file mode 100644
index 3797d52..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/rate/RateCardResponse.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.rate;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.ToString;
-
-import java.util.List;
-
-@Data
-@ToString(exclude = "meters")
-public class RateCardResponse {
-    @JsonProperty("OfferTerms")
-    private List<Object> offerTerms;
-    @JsonProperty("Meters")
-    private List<Meter> meters;
-    @JsonProperty("Currency")
-    private String currency;
-    @JsonProperty("Locale")
-    private String locale;
-    @JsonProperty("IsTaxIncluded")
-    private boolean taxIncluded;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/AzureUsageAggregateClient.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/AzureUsageAggregateClient.java
deleted file mode 100644
index 9247d4f..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/AzureUsageAggregateClient.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.usage;
-
-import com.epam.dlab.billing.azure.config.BillingConfigurationAzure;
-import com.epam.dlab.exceptions.DlabException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.http.HttpHeaders;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.util.Objects;
-
-@Slf4j
-public class AzureUsageAggregateClient {
-	private ObjectMapper objectMapper = new ObjectMapper();
-	private BillingConfigurationAzure billingConfigurationAzure;
-	private String authToken;
-
-	public AzureUsageAggregateClient(BillingConfigurationAzure billingConfigurationAzure, String authToken) {
-		this.billingConfigurationAzure = billingConfigurationAzure;
-		this.authToken = authToken;
-	}
-
-	public UsageAggregateResponse getUsageAggregateResponse(String from, String to) throws IOException,
-			URISyntaxException {
-		try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
-
-			final URIBuilder uriBuilder = new URIBuilder("https://management.azure.com/subscriptions/" +
-					billingConfigurationAzure.getSubscriptionId() + "/providers/Microsoft" +
-					".Commerce/UsageAggregates")
-					.addParameter("api-version", "2015-06-01-preview")
-					.addParameter("reportedStartTime", from)
-					.addParameter("reportedEndTime", to)
-					.addParameter("aggregationGranularity", "daily")
-					.addParameter("showDetails", "false");
-			final HttpGet request = new HttpGet(uriBuilder.build());
-			request.addHeader("Authorization", String.format("Bearer %s", authToken));
-			request.addHeader(HttpHeaders.ACCEPT, "application/json");
-			final UsageAggregateResponse usageAggregateResponse = objectMapper.readValue(EntityUtils.toString
-					(httpClient.execute(request).getEntity()), UsageAggregateResponse.class);
-			return postProcess(usageAggregateResponse);
-		} catch (URISyntaxException e) {
-			log.error("Cannot retrieve usage detail due to ", e);
-			throw e;
-		}
-	}
-
-
-	public UsageAggregateResponse getUsageAggregateResponse(String nextUrl) throws IOException {
-		try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
-			final HttpGet request = new HttpGet(nextUrl);
-			request.addHeader("Authorization", String.format("Bearer %s", authToken));
-			request.addHeader(HttpHeaders.ACCEPT, "application/json");
-			final UsageAggregateResponse usageAggregateResponse = objectMapper.readValue(EntityUtils.toString
-					(httpClient.execute(request).getEntity()), UsageAggregateResponse.class);
-			return postProcess(usageAggregateResponse);
-		}
-	}
-
-	public void setAuthToken(String authToken) {
-		this.authToken = authToken;
-	}
-
-	private UsageAggregateResponse postProcess(UsageAggregateResponse usageAggregateResponse) {
-		usageAggregateResponse.getValue()
-				.stream()
-				.filter(r -> Objects.nonNull(r.getProperties().getInstanceData()))
-				.forEach(r -> r.getProperties().setParsedInstanceData(toInstanceData(r)));
-		return usageAggregateResponse;
-	}
-
-	private InstanceData toInstanceData(UsageAggregateRecord r) {
-		try {
-			return objectMapper.readValue(r.getProperties().getInstanceData(), InstanceData.class);
-		} catch (IOException e) {
-			throw new DlabException("Can not parse instance data", e);
-		}
-	}
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/InstanceData.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/InstanceData.java
deleted file mode 100644
index e175f2d..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/InstanceData.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.usage;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-@Data
-public class InstanceData {
-    @JsonProperty("Microsoft.Resources")
-    private MicrosoftResources microsoftResources;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/MicrosoftResources.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/MicrosoftResources.java
deleted file mode 100644
index 5217efb..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/MicrosoftResources.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.usage;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.Map;
-
-@Data
-public class MicrosoftResources {
-    @JsonProperty
-    private String resourceUri;
-    @JsonProperty
-    private String location;
-    @JsonProperty
-    private Map<String, String> tags;
-    @JsonProperty
-    private Map<String, String> additionalInfo;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/UsageAggregateRecord.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/UsageAggregateRecord.java
deleted file mode 100644
index 95f8e87..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/UsageAggregateRecord.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.usage;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-@Data
-public class UsageAggregateRecord {
-    @JsonProperty
-    private String id;
-    @JsonProperty
-    private String name;
-    @JsonProperty
-    private String type;
-    @JsonProperty
-    private UsageAggregateRecordProperties properties;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/UsageAggregateRecordProperties.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/UsageAggregateRecordProperties.java
deleted file mode 100644
index d0a986e..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/UsageAggregateRecordProperties.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.usage;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.Map;
-
-@Data
-public class UsageAggregateRecordProperties {
-    @JsonProperty
-    private String subscriptionId;
-    @JsonProperty
-    private String usageStartTime;
-    @JsonProperty
-    private String usageEndTime;
-    @JsonProperty
-    private String meterName;
-    @JsonProperty
-    private String meterRegion;
-    @JsonProperty
-    private String meterCategory;
-    @JsonProperty
-    private String meterSubCategory;
-    @JsonProperty
-    private String unit;
-    @JsonProperty
-    private String instanceData;
-    private InstanceData parsedInstanceData;
-    @JsonProperty
-    private String meterId;
-    @JsonProperty
-    private Map<String, String> infoFields;
-    @JsonProperty
-    private double quantity;
-}
diff --git a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/UsageAggregateResponse.java b/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/UsageAggregateResponse.java
deleted file mode 100644
index be9078b..0000000
--- a/services/billing-azure/src/main/java/com/epam/dlab/billing/azure/usage/UsageAggregateResponse.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.azure.usage;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class UsageAggregateResponse {
-    @JsonProperty
-    private List<UsageAggregateRecord> value;
-    @JsonProperty
-    private String nextLink;
-}
diff --git a/services/billing-azure/src/main/resources/application.yml b/services/billing-azure/src/main/resources/application.yml
index 482a78d..60527a3 100644
--- a/services/billing-azure/src/main/resources/application.yml
+++ b/services/billing-azure/src/main/resources/application.yml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
@@ -26,7 +26,7 @@
     mongodb:
       username: admin
       password: admin
-      database: dlabdb
+      database: datalabdb
       port: 27017
       host: localhost
 
@@ -36,25 +36,25 @@
     contextPath: /api/billing
 
 server.ssl.key-store-type: JKS
-server.ssl.key-store: /Users/ofuks/keys/dlabcert/billing.jks
+server.ssl.key-store: /home/OS_USER/keys/endpoint.keystore.jks
 server.ssl.key-store-password: KEYSTORE_PASSWORD
 server.ssl.key-alias: billing
 
 logging:
-  file: /var/opt/dlab/log/ssn/billing.log
+  file: /var/opt/datalab/log/ssn/billing.log
   level:
     com:
       epam: trace
 
 keycloak:
   bearer-only: true
-  realm: DLAB_bhliva
-  resource: sss
-  credentials.secret: cf5a484b-039b-4161-8707-ad65c0f25962
+  realm: datalab
+  resource: KEYCLOAK_CLIENT_ID
+  credentials.secret: CLIENT_SECRET
   ssl-required: none
-  auth-server-url: http://52.11.45.11:8080/auth
+  auth-server-url: KEYCLOAK_AUTH_SERVER_URL
 
-dlab:
+datalab:
   sbn: <CONF_SERVICE_BASE_NAME>
   billingEnabled: true
   clientId: <CLIENT_ID>
@@ -74,7 +74,7 @@
     port: 27017
     username: admin
     password: <MONGODB_PASSWORD>
-    database: dlabdb
+    database: datalabdb
   ssnStorageAccountTagName: <AZURE_SSN_STORAGE_ACCOUNT_TAG>
   sharedStorageAccountTagName: <AZURE_SHARED_STORAGE_ACCOUNT_TAG>
   datalakeTagName: <AZURE_DATALAKE_TAG>
\ No newline at end of file
diff --git a/services/billing-gcp/Dockerfile b/services/billing-gcp/Dockerfile
index c4e6733..74c1b0e 100644
--- a/services/billing-gcp/Dockerfile
+++ b/services/billing-gcp/Dockerfile
@@ -23,6 +23,6 @@
 
 USER root
 
-COPY billing-gcp-2.2.jar /root/
+COPY billing-gcp-*.jar /root/
 
-CMD java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 /root/billing-gcp-2.2.jar  --spring.config.location=/root/billing.yml
\ No newline at end of file
+CMD java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 /root/billing-gcp-*.jar  --spring.config.location=/root/billing.yml
\ No newline at end of file
diff --git a/services/billing-gcp/billing.yml b/services/billing-gcp/billing.yml
index ecdcc45..b3545e3 100644
--- a/services/billing-gcp/billing.yml
+++ b/services/billing-gcp/billing.yml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
@@ -26,10 +26,10 @@
     mongodb:
       username: admin
       password: MONGO_PASSWORD
-      database: dlabdb
+      database: datalabdb
       port: 27017
       host: MONGO_HOST
-dlab:
+datalab:
   sbn: SERVICE_BASE_NAME
   bigQueryDataset: DATASET_NAME
   cron: 0 0 * * * *
@@ -45,14 +45,14 @@
 server.ssl.key-alias: ssn
 
 logging:
-  file: /var/opt/dlab/log/ssn/billing.log
+  file: /var/opt/datalab/log/ssn/billing.log
   level:
     com:
       epam: trace
 
 keycloak:
   bearer-only: true
-  realm: dlab
+  realm: datalab
   resource: KEYCLOAK_CLIENT_ID
   credentials.secret: KEYCLOAK_CLIENT_SECRET
   ssl-required: none
diff --git a/services/billing-gcp/pom.xml b/services/billing-gcp/pom.xml
index 43dff3b..fa4bbcf 100644
--- a/services/billing-gcp/pom.xml
+++ b/services/billing-gcp/pom.xml
@@ -22,8 +22,8 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
-        <groupId>com.epam.dlab</groupId>
-        <artifactId>dlab</artifactId>
+        <groupId>com.epam.datalab</groupId>
+        <artifactId>datalab</artifactId>
         <version>1.0</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
@@ -94,8 +94,8 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>dlab-model</artifactId>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>datalab-model</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
         <dependency>
diff --git a/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/BillingGcpApplication.java b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/BillingGcpApplication.java
new file mode 100644
index 0000000..2fb7f80
--- /dev/null
+++ b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/BillingGcpApplication.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.gcp;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
+
+@SpringBootApplication
+@EnableMongoRepositories
+@EnableConfigurationProperties
+public class BillingGcpApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(BillingGcpApplication.class, args);
+    }
+
+}
diff --git a/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/conf/BillingApplicationConfiguration.java b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/conf/BillingApplicationConfiguration.java
new file mode 100644
index 0000000..ab00e5f
--- /dev/null
+++ b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/conf/BillingApplicationConfiguration.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.gcp.conf;
+
+import com.google.cloud.bigquery.BigQuery;
+import com.google.cloud.bigquery.BigQueryOptions;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class BillingApplicationConfiguration {
+
+    @Bean
+    public BigQuery bigQueryService() {
+        return BigQueryOptions.getDefaultInstance().getService();
+    }
+}
diff --git a/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/conf/DatalabConfiguration.java b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/conf/DatalabConfiguration.java
new file mode 100644
index 0000000..766e842
--- /dev/null
+++ b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/conf/DatalabConfiguration.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.gcp.conf;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties("datalab")
+@Data
+public class DatalabConfiguration {
+
+    private String sbn;
+    private String bigQueryDataset;
+    private String bigQueryTable;
+    private String cron;
+}
diff --git a/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/conf/SecurityConfig.java b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/conf/SecurityConfig.java
new file mode 100644
index 0000000..2027ff8
--- /dev/null
+++ b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/conf/SecurityConfig.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.gcp.conf;
+
+import org.keycloak.adapters.KeycloakConfigResolver;
+import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
+import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
+import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
+import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
+import org.springframework.security.core.session.SessionRegistryImpl;
+import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
+import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
+
+@KeycloakConfiguration
+class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
+
+    @Autowired
+    public void configureGlobal(AuthenticationManagerBuilder auth) {
+        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
+        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
+        auth.authenticationProvider(keycloakAuthenticationProvider);
+    }
+
+    @Bean
+    public KeycloakConfigResolver keycloakConfigResolver() {
+        return new KeycloakSpringBootConfigResolver();
+    }
+
+    @Bean
+    @Override
+    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
+        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
+    }
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        super.configure(http);
+        http
+                .anonymous().disable()
+                .authorizeRequests()
+                .anyRequest()
+                .authenticated();
+    }
+}
\ No newline at end of file
diff --git a/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/controller/BillingController.java b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/controller/BillingController.java
new file mode 100644
index 0000000..de1c322
--- /dev/null
+++ b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/controller/BillingController.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.gcp.controller;
+
+import com.epam.datalab.billing.gcp.service.BillingService;
+import com.epam.datalab.dto.billing.BillingData;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class BillingController {
+
+    private final BillingService billingService;
+
+    public BillingController(BillingService billingService) {
+        this.billingService = billingService;
+    }
+
+    @GetMapping
+    public ResponseEntity<List<BillingData>> getBilling() {
+        return new ResponseEntity<>(billingService.getBillingData(), HttpStatus.OK);
+    }
+}
diff --git a/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/dao/BillingDAO.java b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/dao/BillingDAO.java
new file mode 100644
index 0000000..c0f484d
--- /dev/null
+++ b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/dao/BillingDAO.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.gcp.dao;
+
+import com.epam.datalab.dto.billing.BillingData;
+
+import java.util.List;
+
+@FunctionalInterface
+public interface BillingDAO {
+    List<BillingData> getBillingData() throws InterruptedException;
+}
diff --git a/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/dao/impl/BigQueryBillingDAO.java b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/dao/impl/BigQueryBillingDAO.java
new file mode 100644
index 0000000..2a05bbe
--- /dev/null
+++ b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/dao/impl/BigQueryBillingDAO.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.gcp.dao.impl;
+
+import com.epam.datalab.billing.gcp.conf.DatalabConfiguration;
+import com.epam.datalab.billing.gcp.dao.BillingDAO;
+import com.epam.datalab.billing.gcp.model.BillingHistory;
+import com.epam.datalab.billing.gcp.repository.BillingHistoryRepository;
+import com.epam.datalab.dto.billing.BillingData;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.cloud.bigquery.BigQuery;
+import com.google.cloud.bigquery.FieldValueList;
+import com.google.cloud.bigquery.QueryJobConfiguration;
+import com.google.cloud.bigquery.QueryParameterValue;
+import com.google.cloud.bigquery.Table;
+import com.google.cloud.bigquery.TableInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+@Component
+@Slf4j
+public class BigQueryBillingDAO implements BillingDAO {
+    private static final String DATE_FORMAT = "yyyy-MM-dd";
+    private static final String SBN_PARAM = "sbn";
+    private static final String DATASET_PARAM = "dataset";
+
+    private final BillingHistoryRepository billingHistoryRepo;
+    private final BigQuery service;
+    private final String dataset;
+    private final String sbn;
+
+    private static final String GET_BILLING_DATA_QUERY = "SELECT b.sku.description usageType," +
+            "TIMESTAMP_TRUNC(usage_start_time, DAY, 'UTC') usage_date_from, TIMESTAMP_TRUNC(usage_end_time, DAY, " +
+            "'UTC')" +
+            " usage_date_to, sum(b.cost) cost, b.service.description product, label.value, currency\n" +
+            "FROM `%s` b\n" +
+            "CROSS JOIN UNNEST(b.labels) as label\n" +
+            "where label.key = 'name' and cost != 0 and label.value like @sbn\n" +
+            "group by usageType, usage_date_from, usage_date_to, product, value, currency";
+
+    @Autowired
+    public BigQueryBillingDAO(DatalabConfiguration conf, BillingHistoryRepository billingHistoryRepo,
+                              BigQuery service) {
+        dataset = conf.getBigQueryDataset();
+        this.service = service;
+        this.billingHistoryRepo = billingHistoryRepo;
+        sbn = conf.getSbn();
+    }
+
+    @Override
+    public List<BillingData> getBillingData() {
+        final Map<String, Long> processedBillingTables = billingHistoryRepo.findAll()
+                .stream()
+                .collect(Collectors.toMap(BillingHistory::getTableName, BillingHistory::getLastModified));
+        log.debug("Already processed billing data: {}", processedBillingTables);
+
+        return StreamSupport.stream(service.listTables(dataset).iterateAll().spliterator(), false)
+                .map(TableInfo::getTableId)
+                .map(service::getTable)
+                .filter(t -> processedBillingTables.getOrDefault(t.getTableId().getTable(), 0L) < t.getLastModifiedTime())
+                .peek(t -> log.info("Processing table {}", t.getTableId().getTable()))
+                .flatMap(this::bigQueryResultSetStream)
+                .collect(Collectors.toList());
+    }
+
+    private Stream<? extends BillingData> bigQueryResultSetStream(Table table) {
+        try {
+            final String tableName = table.getTableId().getTable();
+            final String tableId = table.getTableId().getDataset() + "." + tableName;
+            QueryJobConfiguration queryConfig = QueryJobConfiguration
+                    .newBuilder(String.format(GET_BILLING_DATA_QUERY, tableId))
+                    .addNamedParameter(SBN_PARAM, QueryParameterValue.string(sbn + "%"))
+                    .addNamedParameter(DATASET_PARAM, QueryParameterValue.string(tableId))
+                    .build();
+            final Stream<BillingData> gcpBillingDataStream =
+                    StreamSupport.stream(service.query(queryConfig).getValues().spliterator(), false)
+                            .map(this::toGcpBillingData);
+            billingHistoryRepo.save(new BillingHistory(tableName, table.getLastModifiedTime()));
+            return gcpBillingDataStream;
+        } catch (Exception e) {
+            log.error("Can not get billing info from BigQuery due to {}", e.getMessage(), e);
+            throw new DatalabException("Can not get billing info from BigQuery due to: " + e.getMessage(), e);
+        }
+    }
+
+    private BillingData toGcpBillingData(FieldValueList fields) {
+        return BillingData.builder()
+                .usageDateFrom(toLocalDate(fields, "usage_date_from"))
+                .usageDateTo(toLocalDate(fields, "usage_date_to"))
+                .cost(fields.get("cost").getNumericValue().doubleValue())
+                .product(fields.get("product").getStringValue())
+                .usageType(fields.get("usageType").getStringValue())
+                .currency(fields.get("currency").getStringValue())
+                .tag(fields.get("value").getStringValue().toLowerCase())
+                .usageDate(toLocalDate(fields, "usage_date_from").format((DateTimeFormatter.ofPattern(DATE_FORMAT))))
+                .build();
+    }
+
+    private LocalDate toLocalDate(FieldValueList fieldValues, String timestampFieldName) {
+        return LocalDate.from(Instant.ofEpochMilli(fieldValues.get(timestampFieldName).getTimestampValue() / 1000)
+                .atZone(ZoneId.systemDefault()));
+    }
+}
diff --git a/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/model/BillingHistory.java b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/model/BillingHistory.java
new file mode 100644
index 0000000..828cb0e
--- /dev/null
+++ b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/model/BillingHistory.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.gcp.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.springframework.data.annotation.Id;
+
+@Data
+@AllArgsConstructor
+public class BillingHistory {
+    @Id
+    private String tableName;
+    private final long lastModified;
+}
diff --git a/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/repository/BillingHistoryRepository.java b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/repository/BillingHistoryRepository.java
new file mode 100644
index 0000000..23cf85c
--- /dev/null
+++ b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/repository/BillingHistoryRepository.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.gcp.repository;
+
+import com.epam.datalab.billing.gcp.model.BillingHistory;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+public interface BillingHistoryRepository extends MongoRepository<BillingHistory, String> {
+}
diff --git a/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/service/BillingService.java b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/service/BillingService.java
new file mode 100644
index 0000000..83a44a0
--- /dev/null
+++ b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/service/BillingService.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.gcp.service;
+
+import com.epam.datalab.dto.billing.BillingData;
+
+import java.util.List;
+
+@FunctionalInterface
+public interface BillingService {
+    List<BillingData> getBillingData();
+}
diff --git a/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/service/impl/BillingServiceImpl.java b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/service/impl/BillingServiceImpl.java
new file mode 100644
index 0000000..b88caba
--- /dev/null
+++ b/services/billing-gcp/src/main/java/com/epam/datalab/billing/gcp/service/impl/BillingServiceImpl.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing.gcp.service.impl;
+
+import com.epam.datalab.billing.gcp.dao.BillingDAO;
+import com.epam.datalab.billing.gcp.service.BillingService;
+import com.epam.datalab.dto.billing.BillingData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+
+@Service
+@Slf4j
+public class BillingServiceImpl implements BillingService {
+
+    private final BillingDAO billingDAO;
+
+    @Autowired
+    public BillingServiceImpl(BillingDAO billingDAO) {
+        this.billingDAO = billingDAO;
+    }
+
+    @Override
+    public List<BillingData> getBillingData() {
+        try {
+            return billingDAO.getBillingData();
+        } catch (Exception e) {
+            log.error("Can not update billing due to: {}", e.getMessage(), e);
+            return Collections.emptyList();
+        }
+    }
+}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/BillingGcpApplication.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/BillingGcpApplication.java
deleted file mode 100644
index c454038..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/BillingGcpApplication.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
-
-@SpringBootApplication
-@EnableMongoRepositories
-@EnableConfigurationProperties
-public class BillingGcpApplication {
-
-    public static void main(String[] args) {
-        SpringApplication.run(BillingGcpApplication.class, args);
-    }
-
-}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/conf/BillingApplicationConfiguration.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/conf/BillingApplicationConfiguration.java
deleted file mode 100644
index 79c1d9e..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/conf/BillingApplicationConfiguration.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.conf;
-
-import com.google.cloud.bigquery.BigQuery;
-import com.google.cloud.bigquery.BigQueryOptions;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class BillingApplicationConfiguration {
-
-    @Bean
-    public BigQuery bigQueryService() {
-        return BigQueryOptions.getDefaultInstance().getService();
-    }
-}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/conf/DlabConfiguration.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/conf/DlabConfiguration.java
deleted file mode 100644
index 08cff97..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/conf/DlabConfiguration.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.conf;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@ConfigurationProperties("dlab")
-@Data
-public class DlabConfiguration {
-
-    private String sbn;
-    private String bigQueryDataset;
-    private String bigQueryTable;
-    private String cron;
-}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/conf/SecurityConfig.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/conf/SecurityConfig.java
deleted file mode 100644
index ad960b0..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/conf/SecurityConfig.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.conf;
-
-import org.keycloak.adapters.KeycloakConfigResolver;
-import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
-import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
-import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
-import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
-import org.springframework.security.core.session.SessionRegistryImpl;
-import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
-import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
-
-@KeycloakConfiguration
-class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
-
-    @Autowired
-    public void configureGlobal(AuthenticationManagerBuilder auth) {
-        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
-        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
-        auth.authenticationProvider(keycloakAuthenticationProvider);
-    }
-
-    @Bean
-    public KeycloakConfigResolver KeycloakConfigResolver() {
-        return new KeycloakSpringBootConfigResolver();
-    }
-
-    @Bean
-    @Override
-    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
-        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
-    }
-
-    @Override
-    protected void configure(HttpSecurity http) throws Exception {
-        super.configure(http);
-        http
-                .anonymous().disable()
-                .authorizeRequests()
-                .anyRequest()
-                .authenticated();
-    }
-}
\ No newline at end of file
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/controller/BillingController.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/controller/BillingController.java
deleted file mode 100644
index ea45d89..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/controller/BillingController.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.controller;
-
-import com.epam.dlab.billing.gcp.service.BillingService;
-import com.epam.dlab.dto.billing.BillingData;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-@RestController
-public class BillingController {
-
-    private final BillingService billingService;
-
-    public BillingController(BillingService billingService) {
-        this.billingService = billingService;
-    }
-
-    @GetMapping
-    public ResponseEntity<List<BillingData>> getBilling() {
-        return new ResponseEntity<>(billingService.getBillingData(), HttpStatus.OK);
-    }
-}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/BillingDAO.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/BillingDAO.java
deleted file mode 100644
index 7c791df..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/BillingDAO.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.dao;
-
-import com.epam.dlab.dto.billing.BillingData;
-
-import java.util.List;
-
-public interface BillingDAO {
-    List<BillingData> getBillingData() throws InterruptedException;
-}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/impl/BigQueryBillingDAO.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/impl/BigQueryBillingDAO.java
deleted file mode 100644
index 061283d..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/impl/BigQueryBillingDAO.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.dao.impl;
-
-import com.epam.dlab.billing.gcp.conf.DlabConfiguration;
-import com.epam.dlab.billing.gcp.dao.BillingDAO;
-import com.epam.dlab.billing.gcp.model.BillingHistory;
-import com.epam.dlab.billing.gcp.repository.BillingHistoryRepository;
-import com.epam.dlab.dto.billing.BillingData;
-import com.google.cloud.bigquery.BigQuery;
-import com.google.cloud.bigquery.FieldValueList;
-import com.google.cloud.bigquery.QueryJobConfiguration;
-import com.google.cloud.bigquery.QueryParameterValue;
-import com.google.cloud.bigquery.Table;
-import com.google.cloud.bigquery.TableInfo;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.stereotype.Component;
-
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-
-@Component
-@Slf4j
-public class BigQueryBillingDAO implements BillingDAO {
-	private static final String DATE_FORMAT = "yyyy-MM-dd";
-	private static final String SBN_PARAM = "sbn";
-	private static final String DATASET_PARAM = "dataset";
-
-	private final BillingHistoryRepository billingHistoryRepo;
-	private final MongoTemplate mongoTemplate;
-	private final BigQuery service;
-	private final String dataset;
-	private final String sbn;
-
-	private static final String GET_BILLING_DATA_QUERY = "SELECT b.sku.description usageType," +
-			"TIMESTAMP_TRUNC(usage_start_time, DAY, 'UTC') usage_date_from, TIMESTAMP_TRUNC(usage_end_time, DAY, " +
-			"'UTC')" +
-			" usage_date_to, sum(b.cost) cost, b.service.description product, label.value, currency\n" +
-			"FROM `%s` b\n" +
-			"CROSS JOIN UNNEST(b.labels) as label\n" +
-			"where label.key = 'name' and cost != 0 and label.value like @sbn\n" +
-			"group by usageType, usage_date_from, usage_date_to, product, value, currency";
-
-	@Autowired
-	public BigQueryBillingDAO(DlabConfiguration conf, BillingHistoryRepository billingHistoryRepo,
-							  BigQuery service, MongoTemplate mongoTemplate) {
-		dataset = conf.getBigQueryDataset();
-		this.service = service;
-		this.billingHistoryRepo = billingHistoryRepo;
-		this.mongoTemplate = mongoTemplate;
-		sbn = conf.getSbn();
-	}
-
-	@Override
-	public List<BillingData> getBillingData() {
-		final Map<String, Long> processedBillingTables = billingHistoryRepo.findAll()
-				.stream()
-				.collect(Collectors.toMap(BillingHistory::getTableName, BillingHistory::getLastModified));
-		log.debug("Already processed billing data: {}", processedBillingTables);
-
-		return StreamSupport.stream(service.listTables(dataset).iterateAll().spliterator(), false)
-				.map(TableInfo::getTableId)
-				.map(service::getTable)
-				.filter(t -> processedBillingTables.getOrDefault(t.getTableId().getTable(), 0L) < t.getLastModifiedTime())
-				.peek(t -> log.info("Processing table {}", t.getTableId().getTable()))
-				.flatMap(this::bigQueryResultSetStream)
-				.collect(Collectors.toList());
-	}
-
-	private Stream<? extends BillingData> bigQueryResultSetStream(Table table) {
-		try {
-			final String tableName = table.getTableId().getTable();
-			final String tableId = table.getTableId().getDataset() + "." + tableName;
-			QueryJobConfiguration queryConfig = QueryJobConfiguration
-					.newBuilder(String.format(GET_BILLING_DATA_QUERY, tableId))
-					.addNamedParameter(SBN_PARAM, QueryParameterValue.string(sbn + "%"))
-					.addNamedParameter(DATASET_PARAM, QueryParameterValue.string(tableId))
-					.build();
-			final Stream<BillingData> gcpBillingDataStream =
-					StreamSupport.stream(service.query(queryConfig).getValues().spliterator(), false)
-							.map(this::toGcpBillingData);
-			billingHistoryRepo.save(new BillingHistory(tableName, table.getLastModifiedTime()));
-			return gcpBillingDataStream;
-		} catch (InterruptedException e) {
-			throw new IllegalStateException("Can not get billing info from BigQuery due to: " + e.getMessage(), e);
-		}
-	}
-
-	private BillingData toGcpBillingData(FieldValueList fields) {
-		return BillingData.builder()
-				.usageDateFrom(toLocalDate(fields, "usage_date_from"))
-				.usageDateTo(toLocalDate(fields, "usage_date_to"))
-				.cost(fields.get("cost").getNumericValue().doubleValue())
-				.product(fields.get("product").getStringValue())
-				.usageType(fields.get("usageType").getStringValue())
-				.currency(fields.get("currency").getStringValue())
-				.tag(fields.get("value").getStringValue().toLowerCase())
-				.usageDate(toLocalDate(fields, "usage_date_from").format((DateTimeFormatter.ofPattern(DATE_FORMAT))))
-				.build();
-	}
-
-	private LocalDate toLocalDate(FieldValueList fieldValues, String timestampFieldName) {
-		return LocalDate.from(Instant.ofEpochMilli(fieldValues.get(timestampFieldName).getTimestampValue() / 1000)
-				.atZone(ZoneId.systemDefault()));
-	}
-}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/model/BillingHistory.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/model/BillingHistory.java
deleted file mode 100644
index a232ecc..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/model/BillingHistory.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.model;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import org.springframework.data.annotation.Id;
-
-@Data
-@AllArgsConstructor
-public class BillingHistory {
-    @Id
-    private String tableName;
-    private final long lastModified;
-}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/model/GcpBillingData.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/model/GcpBillingData.java
deleted file mode 100644
index a2bd12b..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/model/GcpBillingData.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.model;
-
-import lombok.Builder;
-import lombok.Data;
-import org.springframework.data.mongodb.core.mapping.Document;
-import org.springframework.data.mongodb.core.mapping.Field;
-
-import java.time.LocalDate;
-
-@Data
-@Builder
-@Document(collection = "billing")
-public class GcpBillingData {
-    @Field("from")
-    private final LocalDate usageDateFrom;
-    @Field("to")
-    private final LocalDate usageDateTo;
-    private final String product;
-    private final String usageType;
-    private final Double cost;
-    private final String currency;
-    @Field("dlabId")
-    private final String tag;
-    private final String usageDate;
-}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/repository/BillingHistoryRepository.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/repository/BillingHistoryRepository.java
deleted file mode 100644
index 957ced7..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/repository/BillingHistoryRepository.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.repository;
-
-import com.epam.dlab.billing.gcp.model.BillingHistory;
-import org.springframework.data.mongodb.repository.MongoRepository;
-
-public interface BillingHistoryRepository extends MongoRepository<BillingHistory, String> {
-}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/repository/BillingRepository.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/repository/BillingRepository.java
deleted file mode 100644
index 2d4c5c1..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/repository/BillingRepository.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.repository;
-
-import com.epam.dlab.billing.gcp.model.GcpBillingData;
-import org.springframework.data.mongodb.repository.MongoRepository;
-
-public interface BillingRepository extends MongoRepository<GcpBillingData, String> {
-	void deleteByUsageDateRegex(String usageDateRegex);
-}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/service/BillingService.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/service/BillingService.java
deleted file mode 100644
index 7bb3246..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/service/BillingService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.service;
-
-import com.epam.dlab.dto.billing.BillingData;
-
-import java.util.List;
-
-public interface BillingService {
-    List<BillingData> getBillingData();
-}
diff --git a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/service/impl/BillingServiceImpl.java b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/service/impl/BillingServiceImpl.java
deleted file mode 100644
index 5661dfb..0000000
--- a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/service/impl/BillingServiceImpl.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing.gcp.service.impl;
-
-import com.epam.dlab.billing.gcp.dao.BillingDAO;
-import com.epam.dlab.billing.gcp.service.BillingService;
-import com.epam.dlab.dto.billing.BillingData;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.Collections;
-import java.util.List;
-
-@Service
-@Slf4j
-public class BillingServiceImpl implements BillingService {
-
-	private final BillingDAO billingDAO;
-
-	@Autowired
-	public BillingServiceImpl(BillingDAO billingDAO) {
-		this.billingDAO = billingDAO;
-	}
-
-	@Override
-	public List<BillingData> getBillingData() {
-		try {
-			return billingDAO.getBillingData();
-		} catch (Exception e) {
-			log.error("Can not update billing due to: {}", e.getMessage(), e);
-			return Collections.emptyList();
-		}
-	}
-}
diff --git a/services/billing-gcp/src/main/resources/application.yml b/services/billing-gcp/src/main/resources/application.yml
index 45bab37..e491cd5 100644
--- a/services/billing-gcp/src/main/resources/application.yml
+++ b/services/billing-gcp/src/main/resources/application.yml
@@ -1,21 +1,21 @@
 # *****************************************************************************
 #
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
 #
-#   http://www.apache.org/licenses/LICENSE-2.0
+#  http://www.apache.org/licenses/LICENSE-2.0
 #
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
 #
 # ******************************************************************************
 
@@ -26,10 +26,10 @@
     mongodb:
       username: admin
       password: admin
-      database: dlabdb
+      database: datalabdb
       port: 27017
       host: localhost
-dlab:
+datalab:
   sbn: <CONF_SERVICE_BASE_NAME>
   bigQueryDataset: <DATASET_NAME>
   cron: 0 0 * * * *
@@ -40,20 +40,20 @@
     contextPath: /api/billing
 
 server.ssl.key-store-type: JKS
-server.ssl.key-store: /Users/ofuks/keys/dlabcert/billing.jks
+server.ssl.key-store: /home/OS_USER/keys/endpoint.keystore.jks
 server.ssl.key-store-password: KEYSTORE_PASSWORD
 server.ssl.key-alias: billing
 
 logging:
-  file: /var/opt/dlab/log/ssn/billing.log
+  file: /var/opt/datalab/log/ssn/billing.log
   level:
     com:
       epam: trace
 
 keycloak:
   bearer-only: true
-  realm: DLAB_bhliva
-  resource: sss
-  credentials.secret: cf5a484b-039b-4161-8707-ad65c0f25962
+  realm: datalab
+  resource: KEYCLOAK_CLIENT_ID
+  credentials.secret: CLIENT_SECRET
   ssl-required: none
-  auth-server-url: http://52.11.45.11:8080/auth
\ No newline at end of file
+  auth-server-url: KEYCLOAK_AUTH_SERVER_URL
\ No newline at end of file
diff --git a/services/common/pom.xml b/services/common/pom.xml
index 1bf66dd..397a106 100644
--- a/services/common/pom.xml
+++ b/services/common/pom.xml
@@ -21,8 +21,8 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
-        <groupId>com.epam.dlab</groupId>
-        <artifactId>dlab</artifactId>
+        <groupId>com.epam.datalab</groupId>
+        <artifactId>datalab</artifactId>
         <version>1.0</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
diff --git a/services/common/src/main/java/com/epam/datalab/billing/BillingCalculationUtils.java b/services/common/src/main/java/com/epam/datalab/billing/BillingCalculationUtils.java
new file mode 100644
index 0000000..1916b2f
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/billing/BillingCalculationUtils.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing;
+
+public class BillingCalculationUtils {
+    private BillingCalculationUtils() {
+    }
+
+    public static String formatDouble(Double value) {
+        return (value == null ? null : String.format("%,.2f", value));
+    }
+
+    public static double round(double value, int scale) {
+        int d = (int) Math.pow(10, scale);
+        return (double) (Math.round(value * d)) / d;
+    }
+
+    public static Double round(Double value, int scale) {
+        if (value == null) {
+            return null;
+        }
+        int d = (int) Math.pow(10, scale);
+        return (double) (Math.round(value * d)) / d;
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/billing/DatalabResourceType.java b/services/common/src/main/java/com/epam/datalab/billing/DatalabResourceType.java
new file mode 100644
index 0000000..1b1776b
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/billing/DatalabResourceType.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.billing;
+
+public enum DatalabResourceType {
+    SSN,
+    SSN_BUCKET,
+    SSN_CONTAINER,
+    SSN_STORAGE_ACCOUNT,
+    DATA_LAKE_STORE,
+    COLLABORATION_BUCKET,
+    COLLABORATION_CONTAINER,
+    COLLABORATION_STORAGE_ACCOUNT,
+    EDGE,
+    EDGE_BUCKET,
+    EDGE_CONTAINER,
+    EDGE_STORAGE_ACCOUNT,
+    EXPLORATORY,
+    COMPUTATIONAL,
+    VOLUME;
+
+    public static DatalabResourceType of(String string) {
+        if (string != null) {
+            for (DatalabResourceType value : DatalabResourceType.values()) {
+                if (string.equalsIgnoreCase(value.toString())) {
+                    return value;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return super.toString().toUpperCase();
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/AdapterException.java b/services/common/src/main/java/com/epam/datalab/exceptions/AdapterException.java
new file mode 100644
index 0000000..2cbea06
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/AdapterException.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+/**
+ * The exception thrown by the adapter when the connection or input/output errors acquired.
+ */
+public class AdapterException extends GenericException {
+
+    private static final long serialVersionUID = 7036318323246822560L;
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param message error message.
+     */
+    public AdapterException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param cause the cause.
+     */
+    public AdapterException(Exception cause) {
+        super(cause);
+    }
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param message error message.
+     * @param cause   the cause.
+     */
+    public AdapterException(String message, Exception cause) {
+        super(message, cause);
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/DatalabAuthenticationException.java b/services/common/src/main/java/com/epam/datalab/exceptions/DatalabAuthenticationException.java
new file mode 100644
index 0000000..d48ce29
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/DatalabAuthenticationException.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+public class DatalabAuthenticationException extends DatalabException {
+    public DatalabAuthenticationException(String message) {
+        super(message);
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/DatalabException.java b/services/common/src/main/java/com/epam/datalab/exceptions/DatalabException.java
new file mode 100644
index 0000000..15f8cb7
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/DatalabException.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+public class DatalabException extends RuntimeException {
+
+    private static final long serialVersionUID = 1L;
+
+    public DatalabException(String message) {
+        super(message);
+    }
+
+    public DatalabException(String message, Exception cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/DatalabValidationException.java b/services/common/src/main/java/com/epam/datalab/exceptions/DatalabValidationException.java
new file mode 100644
index 0000000..0e0abb1
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/DatalabValidationException.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+public class DatalabValidationException extends DatalabException {
+    public DatalabValidationException(String message) {
+        super(message);
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/DynamicChangePropertiesException.java b/services/common/src/main/java/com/epam/datalab/exceptions/DynamicChangePropertiesException.java
new file mode 100644
index 0000000..a43e520
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/DynamicChangePropertiesException.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+public class DynamicChangePropertiesException extends DatalabException {
+
+    public DynamicChangePropertiesException(String message) {
+        super(message);
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/GenericException.java b/services/common/src/main/java/com/epam/datalab/exceptions/GenericException.java
new file mode 100644
index 0000000..b62a7bb
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/GenericException.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+/**
+ * Base abstract class for application.
+ */
+public abstract class GenericException extends Exception {
+
+    private static final long serialVersionUID = -8245773542009692611L;
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param message error message.
+     */
+    public GenericException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param cause the cause.
+     */
+    public GenericException(Exception cause) {
+        super(cause);
+    }
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param message error message.
+     * @param cause   the cause.
+     */
+    public GenericException(String message, Exception cause) {
+        super(message, cause);
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/InitializationException.java b/services/common/src/main/java/com/epam/datalab/exceptions/InitializationException.java
new file mode 100644
index 0000000..a0b1e52
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/InitializationException.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+/**
+ * Exception for the error of initialization.
+ */
+public class InitializationException extends GenericException {
+
+    private static final long serialVersionUID = -666390278139508248L;
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param message error message.
+     */
+    public InitializationException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param cause the cause.
+     */
+    public InitializationException(Exception cause) {
+        super(cause);
+    }
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param message error message.
+     * @param cause   the cause.
+     */
+    public InitializationException(String message, Exception cause) {
+        super(message, cause);
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/ParseException.java b/services/common/src/main/java/com/epam/datalab/exceptions/ParseException.java
new file mode 100644
index 0000000..afc45fc
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/ParseException.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+/**
+ * The exception thrown by the adapter when the convert errors acquired.
+ */
+public class ParseException extends GenericException {
+
+    private static final long serialVersionUID = -5780834425131769923L;
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param message error message.
+     */
+    public ParseException(String message) {
+        super(message);
+    }
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param cause the cause.
+     */
+    public ParseException(Exception cause) {
+        super(cause);
+    }
+
+    /**
+     * Constructs a new exception.
+     *
+     * @param message error message.
+     * @param cause   the cause.
+     */
+    public ParseException(String message, Exception cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/ResourceAlreadyExistException.java b/services/common/src/main/java/com/epam/datalab/exceptions/ResourceAlreadyExistException.java
new file mode 100644
index 0000000..f7d3d5f
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/ResourceAlreadyExistException.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+public class ResourceAlreadyExistException extends ResourceConflictException {
+    public ResourceAlreadyExistException(String message) {
+        super(message);
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/ResourceConflictException.java b/services/common/src/main/java/com/epam/datalab/exceptions/ResourceConflictException.java
new file mode 100644
index 0000000..4e87db8
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/ResourceConflictException.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+public class ResourceConflictException extends DatalabException {
+    public ResourceConflictException(String message) {
+        super(message);
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/ResourceInappropriateStateException.java b/services/common/src/main/java/com/epam/datalab/exceptions/ResourceInappropriateStateException.java
new file mode 100644
index 0000000..83a10f6
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/ResourceInappropriateStateException.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+public class ResourceInappropriateStateException extends ResourceConflictException {
+    public ResourceInappropriateStateException(String message) {
+        super(message);
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/ResourceNotFoundException.java b/services/common/src/main/java/com/epam/datalab/exceptions/ResourceNotFoundException.java
new file mode 100644
index 0000000..70f001e
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/ResourceNotFoundException.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.exceptions;
+
+public class ResourceNotFoundException extends DatalabException {
+    public ResourceNotFoundException(String message) {
+        super(message);
+    }
+}
diff --git a/services/common/src/main/java/com/epam/datalab/exceptions/ResourceQuoteReachedException.java b/services/common/src/main/java/com/epam/datalab/exceptions/ResourceQuoteReachedException.java
new file mode 100644
index 0000000..33f93d3
--- /dev/null
+++ b/services/common/src/main/java/com/epam/datalab/exceptions/ResourceQuoteReachedException.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.exceptions;
+
+public class ResourceQuoteReachedException extends DatalabException {
+    public ResourceQuoteReachedException(String message) {
+        super(message);
+    }
+
+    public ResourceQuoteReachedException(String message, Exception cause) {
+        super(message, cause);
+    }
+}
diff --git a/services/common/src/main/java/com/epam/dlab/auth/conf/AzureLoginConfiguration.java b/services/common/src/main/java/com/epam/dlab/auth/conf/AzureLoginConfiguration.java
deleted file mode 100644
index cf6331c..0000000
--- a/services/common/src/main/java/com/epam/dlab/auth/conf/AzureLoginConfiguration.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.auth.conf;
-
-import lombok.Getter;
-
-@Getter
-public class AzureLoginConfiguration {
-	private boolean useLdap;
-	private boolean silent;
-	private String tenant;
-	private String authority;
-	private String clientId;
-	private String redirectUrl;
-	private String responseMode;
-	private String prompt;
-	private String loginPage;
-	private boolean validatePermissionScope;
-	private String permissionScope;
-	private String managementApiAuthFile;
-	private long maxSessionDurabilityMilliseconds = 8L * 60L * 60L * 1000L;// 8 hours
-}
diff --git a/services/common/src/main/java/com/epam/dlab/auth/conf/GcpLoginConfiguration.java b/services/common/src/main/java/com/epam/dlab/auth/conf/GcpLoginConfiguration.java
deleted file mode 100644
index 6dbaf02..0000000
--- a/services/common/src/main/java/com/epam/dlab/auth/conf/GcpLoginConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.auth.conf;
-
-import lombok.Data;
-
-@Data
-public class GcpLoginConfiguration {
-	private final boolean oauth2authenticationEnabled;
-	private final String redirectedUri;
-	private final String clientId;
-	private final String clientSecret;
-	private final String applicationName;
-	private final int userStateCacheSize;
-	private final long userStateCacheExpirationTime;
-}
diff --git a/services/common/src/main/java/com/epam/dlab/billing/BillingCalculationUtils.java b/services/common/src/main/java/com/epam/dlab/billing/BillingCalculationUtils.java
deleted file mode 100644
index 14edfc9..0000000
--- a/services/common/src/main/java/com/epam/dlab/billing/BillingCalculationUtils.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing;
-
-public class BillingCalculationUtils {
-    private BillingCalculationUtils() {
-    }
-
-    public static String formatDouble(Double value) {
-        return (value == null ? null : String.format("%,.2f", value));
-    }
-
-    public static double round(double value, int scale) {
-        int d = (int) Math.pow(10, scale);
-        return (double) (Math.round(value * d)) / d;
-    }
-
-    public static Double round(Double value, int scale) {
-        if (value == null) {
-            return null;
-        }
-        int d = (int) Math.pow(10, scale);
-        return (double) (Math.round(value * d)) / d;
-    }
-}
diff --git a/services/common/src/main/java/com/epam/dlab/billing/DlabResourceType.java b/services/common/src/main/java/com/epam/dlab/billing/DlabResourceType.java
deleted file mode 100644
index dfec0dc..0000000
--- a/services/common/src/main/java/com/epam/dlab/billing/DlabResourceType.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.billing;
-
-public enum DlabResourceType {
-	SSN,
-	SSN_BUCKET,
-	SSN_CONTAINER,
-	SSN_STORAGE_ACCOUNT,
-	DATA_LAKE_STORE,
-	COLLABORATION_BUCKET,
-	COLLABORATION_CONTAINER,
-	COLLABORATION_STORAGE_ACCOUNT,
-	EDGE,
-	EDGE_BUCKET,
-	EDGE_CONTAINER,
-	EDGE_STORAGE_ACCOUNT,
-	EXPLORATORY,
-	COMPUTATIONAL,
-	VOLUME;
-
-	public static DlabResourceType of(String string) {
-		if (string != null) {
-			for (DlabResourceType value : DlabResourceType.values()) {
-				if (string.equalsIgnoreCase(value.toString())) {
-					return value;
-				}
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public String toString() {
-		return super.toString().toUpperCase();
-	}
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/AdapterException.java b/services/common/src/main/java/com/epam/dlab/exceptions/AdapterException.java
deleted file mode 100644
index 1ee4ab1..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/AdapterException.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.exceptions;
-
-/** The exception thrown by the adapter when the connection or input/output errors acquired.
- */
-public class AdapterException extends GenericException {
-
-	private static final long serialVersionUID = 7036318323246822560L;
-
-	/** Constructs a new exception.
-	 * @param message error message.
-	 */
-	public AdapterException(String message) {
-		super(message);
-	}
-
-	/** Constructs a new exception.
-	 * @param cause the cause.
-	 */
-	public AdapterException(Exception cause) {
-		super(cause);
-	}
-
-	/** Constructs a new exception.
-	 * @param message error message.
-	 * @param cause the cause.
-	 */
-	public AdapterException(String message, Exception cause) {
-		super(message, cause);
-	}
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/DlabAuthenticationException.java b/services/common/src/main/java/com/epam/dlab/exceptions/DlabAuthenticationException.java
deleted file mode 100644
index 9db3a0a..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/DlabAuthenticationException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.exceptions;
-
-public class DlabAuthenticationException extends DlabException {
-	public DlabAuthenticationException(String message) {
-		super(message);
-	}
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/DlabException.java b/services/common/src/main/java/com/epam/dlab/exceptions/DlabException.java
deleted file mode 100644
index d6d5b6b..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/DlabException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.exceptions;
-
-public class DlabException extends RuntimeException {
-	
-	private static final long serialVersionUID = 1L;
-
-	public DlabException(String message) {
-        super(message);
-    }
-
-    public DlabException(String message, Exception cause) {
-        super(message, cause);
-    }
-
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/DlabValidationException.java b/services/common/src/main/java/com/epam/dlab/exceptions/DlabValidationException.java
deleted file mode 100644
index f4dd287..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/DlabValidationException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.exceptions;
-
-public class DlabValidationException extends DlabException {
-	public DlabValidationException(String message) {
-		super(message);
-	}
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/GenericException.java b/services/common/src/main/java/com/epam/dlab/exceptions/GenericException.java
deleted file mode 100644
index 677ea81..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/GenericException.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.exceptions;
-
-/** Base abstract class for application.  
- */
-public abstract class GenericException extends Exception {
-	
-	private static final long serialVersionUID = -8245773542009692611L;
-
-	/** Constructs a new exception.
-	 * @param message error message.
-	 */
-	public GenericException(String message) {
-		super(message);
-	}
-
-	/** Constructs a new exception.
-	 * @param cause the cause.
-	 */
-	public GenericException(Exception cause) {
-		super(cause);
-	}
-
-	/** Constructs a new exception.
-	 * @param message error message.
-	 * @param cause the cause.
-	 */
-	public GenericException(String message, Exception cause) {
-		super(message, cause);
-	}
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/InitializationException.java b/services/common/src/main/java/com/epam/dlab/exceptions/InitializationException.java
deleted file mode 100644
index 0a1e8b5..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/InitializationException.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.exceptions;
-
-/** Exception for the error of initialization.
- */
-public class InitializationException extends GenericException {
-
-	private static final long serialVersionUID = -666390278139508248L;
-
-	/** Constructs a new exception.
-	 * @param message error message.
-	 */
-	public InitializationException(String message) {
-		super(message);
-	}
-
-	/** Constructs a new exception.
-	 * @param cause the cause.
-	 */
-	public InitializationException(Exception cause) {
-		super(cause);
-	}
-
-	/** Constructs a new exception.
-	 * @param message error message.
-	 * @param cause the cause.
-	 */
-	public InitializationException(String message, Exception cause) {
-		super(message, cause);
-	}
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/ParseException.java b/services/common/src/main/java/com/epam/dlab/exceptions/ParseException.java
deleted file mode 100644
index e18d891..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/ParseException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.exceptions;
-
-/** The exception thrown by the adapter when the convert errors acquired.
- */
-public class ParseException extends GenericException {
-
-	private static final long serialVersionUID = -5780834425131769923L;
-
-	/** Constructs a new exception.
-	 * @param message error message.
-	 */
-	public ParseException(String message) {
-		super(message);
-	}
-
-	/** Constructs a new exception.
-	 * @param cause the cause.
-	 */
-	public ParseException(Exception cause) {
-		super(cause);
-	}
-
-	/** Constructs a new exception.
-	 * @param message error message.
-	 * @param cause the cause.
-	 */
-	public ParseException(String message, Exception cause) {
-		super(message, cause);
-	}
-
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/ResourceAlreadyExistException.java b/services/common/src/main/java/com/epam/dlab/exceptions/ResourceAlreadyExistException.java
deleted file mode 100644
index e4f8cb7..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/ResourceAlreadyExistException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.exceptions;
-
-public class ResourceAlreadyExistException extends ResourceConflictException {
-	public ResourceAlreadyExistException(String message) {
-		super(message);
-	}
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/ResourceConflictException.java b/services/common/src/main/java/com/epam/dlab/exceptions/ResourceConflictException.java
deleted file mode 100644
index a6c7c23..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/ResourceConflictException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.exceptions;
-
-public class ResourceConflictException extends DlabException {
-	public ResourceConflictException(String message) {
-		super(message);
-	}
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/ResourceInappropriateStateException.java b/services/common/src/main/java/com/epam/dlab/exceptions/ResourceInappropriateStateException.java
deleted file mode 100644
index 2172a0d..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/ResourceInappropriateStateException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.exceptions;
-
-public class ResourceInappropriateStateException extends ResourceConflictException {
-	public ResourceInappropriateStateException(String message) {
-		super(message);
-	}
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/ResourceNotFoundException.java b/services/common/src/main/java/com/epam/dlab/exceptions/ResourceNotFoundException.java
deleted file mode 100644
index b5722aa..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/ResourceNotFoundException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.exceptions;
-
-public class ResourceNotFoundException extends DlabException {
-	public ResourceNotFoundException(String message) {
-		super(message);
-	}
-}
diff --git a/services/common/src/main/java/com/epam/dlab/exceptions/ResourceQuoteReachedException.java b/services/common/src/main/java/com/epam/dlab/exceptions/ResourceQuoteReachedException.java
deleted file mode 100644
index 3ccdf50..0000000
--- a/services/common/src/main/java/com/epam/dlab/exceptions/ResourceQuoteReachedException.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.exceptions;
-
-public class ResourceQuoteReachedException extends DlabException {
-	public ResourceQuoteReachedException(String message) {
-		super(message);
-	}
-
-	public ResourceQuoteReachedException(String message, Exception cause) {
-		super(message, cause);
-	}
-}
diff --git a/services/datalab-model/pom.xml b/services/datalab-model/pom.xml
new file mode 100644
index 0000000..2f7878a
--- /dev/null
+++ b/services/datalab-model/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>datalab</artifactId>
+        <groupId>com.epam.datalab</groupId>
+        <version>1.0</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>datalab-model</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>datalab-utils</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.ws.rs</groupId>
+            <artifactId>javax.ws.rs-api</artifactId>
+            <version>2.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+            <version>2.0.0.Final</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.7</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>${hibernate.validator.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>io.dropwizard</groupId>
+            <artifactId>dropwizard-jackson</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/MongoKeyWords.java b/services/datalab-model/src/main/java/com/epam/datalab/MongoKeyWords.java
new file mode 100644
index 0000000..c226884
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/MongoKeyWords.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab;
+
+public abstract class MongoKeyWords {
+    public static final String AZURE_BILLING_SCHEDULER = "billingScheduler";
+    public static final String AZURE_BILLING_SCHEDULER_HISTORY = "billingSchedulerHistory";
+
+    /**
+     * Mongo DB keywords related to billing functionality
+     */
+    public static final String MONGO_ID = "_id";
+
+
+    private MongoKeyWords() {
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/InfrastructureMetaInfoDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/InfrastructureMetaInfoDTO.java
new file mode 100644
index 0000000..2b7f566
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/InfrastructureMetaInfoDTO.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class InfrastructureMetaInfoDTO {
+    private final String branch;
+    private final String version;
+    private final String commit;
+    @JsonProperty("release_notes")
+    private final String releaseNotes;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/LibListComputationalDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/LibListComputationalDTO.java
new file mode 100644
index 0000000..1ec78a0
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/LibListComputationalDTO.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+import com.epam.datalab.dto.exploratory.ExploratoryActionDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class LibListComputationalDTO extends ExploratoryActionDTO<LibListComputationalDTO> {
+    @JsonProperty("computational_id")
+    private String computationalId;
+
+    @JsonProperty("computational_image")
+    private String computationalImage;
+
+    @JsonProperty
+    private String libCacheKey;
+
+    public LibListComputationalDTO withComputationalId(String computationalId) {
+        setComputationalId(computationalId);
+        return this;
+    }
+
+    public LibListComputationalDTO withComputationalImage(String computationalImage) {
+        setComputationalImage(computationalImage);
+        return this;
+    }
+
+    public LibListComputationalDTO withLibCacheKey(String libCacheKey) {
+        setLibCacheKey(libCacheKey);
+        return this;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/LibListExploratoryDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/LibListExploratoryDTO.java
new file mode 100644
index 0000000..5b71e7f
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/LibListExploratoryDTO.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+import com.epam.datalab.dto.exploratory.ExploratoryActionDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class LibListExploratoryDTO extends ExploratoryActionDTO<LibListExploratoryDTO> {
+
+    @JsonProperty
+    private String libCacheKey;
+
+    public LibListExploratoryDTO withLibCacheKey(String libCacheKey) {
+        setLibCacheKey(libCacheKey);
+        return this;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/LibraryGroups.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/LibraryGroups.java
new file mode 100644
index 0000000..3bc772c
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/LibraryGroups.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+public enum LibraryGroups {
+    GROUP_JAVA("java"),
+    GROUP_PIP3("pip3"),
+    GROUP_R_PKG("r_pkg"),
+    GROUP_OS_PKG("os_pkg"),
+    GROUP_OTHERS("others");
+
+    private final String name;
+
+    LibraryGroups(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return name;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceBaseDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceBaseDTO.java
new file mode 100644
index 0000000..bb007b6
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceBaseDTO.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+import com.epam.datalab.dto.base.CloudSettings;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "@class")
+public abstract class ResourceBaseDTO<T extends ResourceBaseDTO<?>> {
+    @SuppressWarnings("unchecked")
+    private final T self = (T) this;
+    @JsonProperty("edge_user_name")
+    private String edgeUserName;
+    @JsonProperty
+    private CloudSettings cloudSettings;
+
+    public String getEdgeUserName() {
+        return edgeUserName;
+    }
+
+    public void setEdgeUserName(String edgeUserName) {
+        this.edgeUserName = edgeUserName;
+    }
+
+    public T withEdgeUserName(String edgeUserName) {
+        setEdgeUserName(edgeUserName);
+        return self;
+    }
+
+    public CloudSettings getCloudSettings() {
+        return cloudSettings;
+    }
+
+    public void setCloudSettings(CloudSettings cloudSettings) {
+        this.cloudSettings = cloudSettings;
+    }
+
+    public T withCloudSettings(CloudSettings cloudSettings) {
+        setCloudSettings(cloudSettings);
+        return self;
+    }
+
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("edgeUserName", edgeUserName)
+                .add("cloudSettings", cloudSettings);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceEnvBaseDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceEnvBaseDTO.java
new file mode 100644
index 0000000..f3d42ec
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceEnvBaseDTO.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+public class ResourceEnvBaseDTO<T extends ResourceEnvBaseDTO<?>> extends ResourceSysBaseDTO<T> {
+    @JsonProperty("exploratory_name")
+    private String exploratoryName;
+    @JsonProperty("application")
+    private String applicationName;
+
+    @SuppressWarnings("unchecked")
+    private final T self = (T) this;
+
+    public String getExploratoryName() {
+        return exploratoryName;
+    }
+
+    public void setExploratoryName(String exploratoryName) {
+        this.exploratoryName = exploratoryName;
+    }
+
+    public T withExploratoryName(String exploratoryName) {
+        setExploratoryName(exploratoryName);
+        return self;
+    }
+
+    public String getApplicationName() {
+        return applicationName;
+    }
+
+    public void setApplicationName(String applicationName) {
+        this.applicationName = applicationName;
+    }
+
+    public T withApplicationName(String applicationName) {
+        setApplicationName(applicationName);
+        return self;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("applicationName", applicationName)
+                .add("exploratoryName", exploratoryName);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceSysBaseDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceSysBaseDTO.java
new file mode 100644
index 0000000..2c3cf35
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceSysBaseDTO.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+public class ResourceSysBaseDTO<T extends ResourceSysBaseDTO<?>> extends ResourceBaseDTO<T> {
+    @SuppressWarnings("unchecked")
+    private final T self = (T) this;
+    @JsonProperty("conf_service_base_name")
+    private String serviceBaseName;
+    @JsonProperty("conf_os_family")
+    private String confOsFamily;
+    @JsonProperty("conf_key_dir")
+    private String confKeyDir;
+
+    public String getServiceBaseName() {
+        return serviceBaseName;
+    }
+
+    public void setServiceBaseName(String serviceBaseName) {
+        this.serviceBaseName = serviceBaseName;
+    }
+
+    public T withServiceBaseName(String serviceBaseName) {
+        setServiceBaseName(serviceBaseName);
+        return self;
+    }
+
+    public String getConfOsFamily() {
+        return confOsFamily;
+    }
+
+    public void setConfOsFamily(String confOsFamily) {
+        this.confOsFamily = confOsFamily;
+    }
+
+    public T withConfOsFamily(String confOsFamily) {
+        setConfOsFamily(confOsFamily);
+        return self;
+    }
+
+
+    public String getConfKeyDir() {
+        return confKeyDir;
+    }
+
+    public void setConfKeyDir(String confKeyDir) {
+        this.confKeyDir = confKeyDir;
+    }
+
+    public T withConfKeyDir(String confKeyDir) {
+        setConfKeyDir(confKeyDir);
+        return self;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("serviceBaseName", serviceBaseName)
+                .add("confKeyDir", confKeyDir)
+                .add("confOsFamily", confOsFamily);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceURL.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceURL.java
new file mode 100644
index 0000000..8972ff3
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/ResourceURL.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * Describe URL of resource.
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ResourceURL {
+    @JsonProperty("description")
+    private String description;
+    @JsonProperty("url")
+    private String url;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/SchedulerJobDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/SchedulerJobDTO.java
new file mode 100644
index 0000000..f152e17
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/SchedulerJobDTO.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneOffset;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Stores info about a scheduler job (general duration, days to repeat, time to start and finish).
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class SchedulerJobDTO {
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
+    @JsonProperty("begin_date")
+    private LocalDate beginDate;
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
+    @JsonProperty("finish_date")
+    private LocalDate finishDate;
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm")
+    @JsonProperty("start_time")
+    private LocalTime startTime;
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm")
+    @JsonProperty("end_time")
+    private LocalTime endTime;
+
+    @JsonProperty("start_days_repeat")
+    private List<DayOfWeek> startDaysRepeat = Collections.emptyList();
+
+    @JsonProperty("stop_days_repeat")
+    private List<DayOfWeek> stopDaysRepeat = Collections.emptyList();
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm")
+    @JsonProperty("terminate_datetime")
+    private LocalDateTime terminateDateTime;
+
+    @JsonProperty("timezone_offset")
+    private ZoneOffset timeZoneOffset;
+
+    @JsonProperty("sync_start_required")
+    private boolean syncStartRequired = true;
+
+    @JsonProperty("max_inactivity")
+    private Long maxInactivity;
+    @JsonProperty("check_inactivity_required")
+    private boolean checkInactivityRequired;
+    @JsonProperty("consider_inactivity")
+    private boolean considerInactivity = true;
+
+    public boolean inactivityScheduler() {
+        return Objects.nonNull(maxInactivity);
+    }
+
+}
\ No newline at end of file
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/StatusBaseDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/StatusBaseDTO.java
new file mode 100644
index 0000000..0001c9c
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/StatusBaseDTO.java
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package com.epam.datalab.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import java.util.Date;
+
+public abstract class StatusBaseDTO<T extends StatusBaseDTO<?>> {
+    @JsonProperty("request_id")
+    private String requestId;
+    @JsonProperty
+    private String user;
+    @JsonProperty
+    private String status;
+    @JsonProperty("error_message")
+    private String errorMessage;
+    @JsonProperty("up_time")
+    private Date uptime;
+
+    @SuppressWarnings("unchecked")
+    private final T self = (T) this;
+
+    public String getRequestId() {
+        return requestId;
+    }
+
+    public void setRequestId(String requestId) {
+        this.requestId = requestId;
+    }
+
+    public T withRequestId(String requestId) {
+        setRequestId(requestId);
+        return self;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public T withUser(String user) {
+        setUser(user);
+        return self;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public T withStatus(String status) {
+        setStatus(status);
+        return self;
+    }
+
+    public T withStatus(UserInstanceStatus status) {
+        return withStatus(status.toString());
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
+    public T withErrorMessage(String errorMessage) {
+        setErrorMessage(errorMessage);
+        return self;
+    }
+
+    public Date getUptime() {
+        return uptime;
+    }
+
+    public void setUptime(Date uptime) {
+        this.uptime = uptime;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T withUptime(Date uptime) {
+        setUptime(uptime);
+        return (T) this;
+    }
+
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("requestId", requestId)
+                .add("user", user)
+                .add("status", status)
+                .add("errorMessage", errorMessage)
+                .add("uptime", uptime);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/StatusEnvBaseDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/StatusEnvBaseDTO.java
new file mode 100644
index 0000000..a72cf0f
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/StatusEnvBaseDTO.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package com.epam.datalab.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+public abstract class StatusEnvBaseDTO<T extends StatusEnvBaseDTO<?>> extends StatusBaseDTO<T> {
+    @SuppressWarnings("unchecked")
+    private final T self = (T) this;
+    @JsonProperty("instance_id")
+    private String instanceId;
+    @JsonProperty("exploratory_name")
+    private String exploratoryName;
+    private String project;
+    @JsonProperty("exploratory_id")
+    private String exploratoryId;
+    @JsonProperty("exploratory_template_name")
+    private String exploratoryTemplateName;
+
+    public String getInstanceId() {
+        return instanceId;
+    }
+
+    private void setInstanceId(String instanceId) {
+        this.instanceId = instanceId;
+    }
+
+    public T withInstanceId(String instanceId) {
+        setInstanceId(instanceId);
+        return self;
+    }
+
+    public String getExploratoryName() {
+        return exploratoryName;
+    }
+
+    public void setExploratoryName(String exploratoryName) {
+        this.exploratoryName = exploratoryName;
+    }
+
+    public T withExploratoryName(String exploratoryName) {
+        setExploratoryName(exploratoryName);
+        return self;
+    }
+
+    public String getProject() {
+        return project;
+    }
+
+    public void setProject(String project) {
+        this.project = project;
+    }
+
+    public T withProject(String project) {
+        setProject(project);
+        return self;
+    }
+
+    public String getExploratoryId() {
+        return exploratoryId;
+    }
+
+    public void setExploratoryId(String exploratoryId) {
+        this.exploratoryId = exploratoryId;
+    }
+
+    public T withExploratoryId(String exploratoryId) {
+        setExploratoryId(exploratoryId);
+        return self;
+    }
+
+    public String getExploratoryTemplateName() {
+        return exploratoryTemplateName;
+    }
+
+    private void setExploratoryTemplateName(String exploratoryTemplateName) {
+        this.exploratoryTemplateName = exploratoryTemplateName;
+    }
+
+    public T withExploratoryTemplateName(String exploratoryTemplateName) {
+        setExploratoryTemplateName(exploratoryTemplateName);
+        return self;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("instanceId", instanceId)
+                .add("exploratoryName", exploratoryName)
+                .add("exploratoryId", exploratoryId)
+                .add("exploratoryTemplateName", exploratoryTemplateName);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/UserEnvironmentResources.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/UserEnvironmentResources.java
new file mode 100644
index 0000000..3c74d45
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/UserEnvironmentResources.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+import com.epam.datalab.dto.status.EnvResourceList;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode
+public class UserEnvironmentResources extends ResourceSysBaseDTO<UserEnvironmentResources> {
+    @JsonProperty("edge_list_resources")
+    private EnvResourceList resourceList;
+
+    /**
+     * Return the list of resources (hosts, clusters, storages).
+     */
+    public EnvResourceList getResourceList() {
+        return resourceList;
+    }
+
+    /**
+     * Set the list of resources (hosts, clusters, storages).
+     */
+    public void setResourceList(EnvResourceList resourceList) {
+        this.resourceList = resourceList;
+    }
+
+    /**
+     * Set the list of resources (hosts, clusters, storages).
+     */
+    public UserEnvironmentResources withResourceList(EnvResourceList resourceList) {
+        setResourceList(resourceList);
+        return this;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("resourceList", resourceList);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/UserInstanceDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/UserInstanceDTO.java
new file mode 100644
index 0000000..ee4d85a
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/UserInstanceDTO.java
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.dto.exploratory.LibInstallDTO;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.*;
+
+/**
+ * Stores info about the user notebook.
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class UserInstanceDTO {
+    @JsonProperty("_id")
+    private String id;
+    @JsonProperty("instance_id")
+    private String instanceId;
+    @JsonProperty
+    private String user;
+    @JsonProperty("exploratory_name")
+    private String exploratoryName;
+    @JsonProperty("exploratory_id")
+    private String exploratoryId;
+    @JsonProperty("image")
+    private String imageName;
+    @JsonProperty("version")
+    private String imageVersion;
+    @JsonProperty("project")
+    private String project;
+    @JsonProperty("endpoint")
+    private String endpoint;
+    @JsonProperty("cloud_provider")
+    private String cloudProvider;
+    @JsonProperty("template_name")
+    private String templateName;
+    @JsonProperty
+    private String status;
+    @JsonProperty
+    private String shape;
+    @JsonProperty("exploratory_url")
+    private List<ResourceURL> resourceUrl;
+    @JsonProperty("up_time")
+    private Date uptime;
+    @JsonProperty("computational_resources")
+    private List<UserComputationalResource> resources = new ArrayList<>();
+    @JsonProperty("private_ip")
+    private String privateIp;
+    @JsonProperty("scheduler_data")
+    private SchedulerJobDTO schedulerData;
+    @JsonProperty("reupload_key_required")
+    private boolean reuploadKeyRequired = false;
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<LibInstallDTO> libs = Collections.emptyList();
+    @JsonProperty("last_activity")
+    private LocalDateTime lastActivity;
+    @JsonProperty("cluster_config")
+    private List<ClusterConfig> clusterConfig;
+    @JsonProperty
+    private Map<String, String> tags;
+    @JsonProperty("gpu_enabled")
+    private boolean enabledGPU = false;
+    @JsonProperty("gpu_type")
+    private String gpuType;
+    @JsonProperty("gpu_count")
+    private String gpuCount;
+
+
+    /**
+     * Sets the user login name.
+     */
+    public UserInstanceDTO withUser(String user) {
+        setUser(user);
+        return this;
+    }
+
+    /**
+     * Sets the name of exploratory.
+     */
+    public UserInstanceDTO withExploratoryName(String exploratoryName) {
+        setExploratoryName(exploratoryName);
+        return this;
+    }
+
+    /**
+     * Sets the exploratory id.
+     */
+    public UserInstanceDTO withExploratoryId(String exploratoryId) {
+        setExploratoryId(exploratoryId);
+        return this;
+    }
+
+    /**
+     * Sets the image name.
+     */
+    public UserInstanceDTO withImageName(String imageName) {
+        setImageName(imageName);
+        return this;
+    }
+
+    public UserInstanceDTO withClusterConfig(List<ClusterConfig> config) {
+        setClusterConfig(config);
+        return this;
+    }
+
+    /**
+     * Sets the image version.
+     */
+    public UserInstanceDTO withImageVersion(String imageVersion) {
+        setImageVersion(imageVersion);
+        return this;
+    }
+
+    /**
+     * Sets the name of template.
+     */
+    public UserInstanceDTO withTemplateName(String templateName) {
+        setTemplateName(templateName);
+        return this;
+    }
+
+    /**
+     * Sets the status of notebook.
+     */
+    public UserInstanceDTO withStatus(String status) {
+        setStatus(status);
+        return this;
+    }
+
+    /**
+     * Sets the name of notebook shape.
+     */
+    public UserInstanceDTO withShape(String shape) {
+        setShape(shape);
+        return this;
+    }
+
+    public UserInstanceDTO withProject(String project) {
+        setProject(project);
+        return this;
+    }
+
+    /**
+     * Sets a list of user's computational resources for notebook.
+     */
+    public UserInstanceDTO withResources(List<UserComputationalResource> resources) {
+        setResources(resources);
+        return this;
+    }
+
+    /**
+     * Sets library list.
+     */
+    public UserInstanceDTO withLibs(List<LibInstallDTO> libs) {
+        setLibs(libs);
+        return this;
+    }
+
+    public UserInstanceDTO withEndpoint(String endpoint) {
+        setEndpoint(endpoint);
+        return this;
+    }
+
+    public UserInstanceDTO withCloudProvider(String cloudProvider) {
+        setCloudProvider(cloudProvider);
+        return this;
+    }
+
+    public UserInstanceDTO withTags(Map<String, String> tags) {
+        setTags(tags);
+        return this;
+    }
+
+    public UserInstanceDTO withGPUType(String gpuType) {
+        setGpuType(gpuType);
+        return this;
+    }
+
+    public UserInstanceDTO withGPUEnabled(boolean gpuEnabled) {
+        setEnabledGPU(gpuEnabled);
+        return this;
+    }
+
+    public UserInstanceDTO withGPUCount(String gpuCount) {
+        setGpuCount(gpuCount);
+        return this;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/UserInstanceStatus.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/UserInstanceStatus.java
new file mode 100644
index 0000000..a12428d
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/UserInstanceStatus.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto;
+
+public enum UserInstanceStatus {
+    CREATING("creating"),
+    CREATED("created"),
+    STARTING("starting"),
+    CONFIGURING("configuring"),
+    RUNNING("running"),
+    STOPPING("stopping"),
+    STOPPED("stopped"),
+    TERMINATING("terminating"),
+    TERMINATED("terminated"),
+    FAILED("failed"),
+    CREATING_IMAGE("creating image"),
+    RECONFIGURING("reconfiguring"),
+    REUPLOADING_KEY("reuploading key");
+
+    private final String name;
+
+    UserInstanceStatus(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return name;
+    }
+
+    public static UserInstanceStatus of(String status) {
+        if (status != null) {
+            for (UserInstanceStatus uis : UserInstanceStatus.values()) {
+                if (status.equalsIgnoreCase(uis.toString())) {
+                    return uis;
+                }
+            }
+        }
+        return null;
+    }
+
+    public boolean in(UserInstanceStatus... statusList) {
+        for (UserInstanceStatus status : statusList) {
+            if (this.equals(status)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/AwsCloudSettings.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/AwsCloudSettings.java
new file mode 100644
index 0000000..a3ded0c
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/AwsCloudSettings.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.aws;
+
+import com.epam.datalab.dto.base.CloudSettings;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class AwsCloudSettings extends CloudSettings {
+
+    @JsonProperty("aws_iam_user")
+    private String awsIamUser;
+    @JsonProperty("aws_region")
+    private String awsRegion;
+    @JsonProperty("aws_subnet_id")
+    private String awsSubnetId;
+    @JsonProperty("aws_security_groups_ids")
+    private String awsSecurityGroupIds;
+    @JsonProperty("aws_vpc_id")
+    private String awsVpcId;
+    @JsonProperty("conf_tag_resource_id")
+    private String confTagResourceId;
+    @JsonProperty("aws_notebook_subnet_id")
+    private String awsNotebookSubnetId;
+    @JsonProperty("aws_notebook_vpc_id")
+    private String awsNotebookVpcId;
+    @JsonProperty("aws_zone")
+    private String zone;
+    @JsonProperty("ldap_hostname")
+    protected String ldapHost;
+    @JsonProperty("ldap_dn")
+    protected String ldapDn;
+    @JsonProperty("ldap_ou")
+    protected String ldapOu;
+    @JsonProperty("ldap_service_username")
+    protected String ldapUser;
+    @JsonProperty("ldap_service_password")
+    protected String ldapPassword;
+    @JsonProperty("conf_os_family")
+    protected String os;
+    @JsonProperty("conf_cloud_provider")
+    protected String cloud;
+    @JsonProperty("conf_service_base_name")
+    protected String sbn;
+    @JsonProperty("conf_key_dir")
+    protected String confKeyDir;
+    @JsonProperty("conf_image_enabled")
+    private String imageEnabled;
+    @JsonProperty("conf_stepcerts_enabled")
+    private String stepCertsEnabled;
+    @JsonProperty("conf_stepcerts_root_ca")
+    private String stepCertsRootCA;
+    @JsonProperty("conf_stepcerts_kid")
+    private String stepCertsKid;
+    @JsonProperty("conf_stepcerts_kid_password")
+    private String stepCertsKidPassword;
+    @JsonProperty("conf_stepcerts_ca_url")
+    private String stepCertsCAURL;
+    @JsonProperty("keycloak_auth_server_url")
+    private String keycloakAuthServerUrl;
+    @JsonProperty("keycloak_realm_name")
+    private String keycloakRealmName;
+    @JsonProperty("keycloak_user")
+    private String keycloakUser;
+    @JsonProperty("keycloak_user_password")
+    private String keycloakUserPassword;
+
+    @Override
+    @JsonIgnore
+    public String getIamUser() {
+        return awsIamUser;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/AwsComputationalResource.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/AwsComputationalResource.java
new file mode 100644
index 0000000..052e08a
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/AwsComputationalResource.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.aws.computational;
+
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.ToString;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Stores info about the user's computational resources for notebook.
+ */
+@ToString(callSuper = true)
+@Getter
+@EqualsAndHashCode(callSuper = true)
+public class AwsComputationalResource extends UserComputationalResource {
+
+	@JsonProperty("instance_id")
+	private final String instanceId;
+	@JsonProperty("master_node_shape")
+	private final String masterShape;
+	@JsonProperty("slave_node_shape")
+	private final String slaveShape;
+	@JsonProperty("slave_node_spot")
+	private final Boolean slaveSpot;
+	@JsonProperty("slave_node_spot_pct_price")
+	private final Integer slaveSpotPctPrice;
+	@JsonProperty("total_instance_number")
+	private final String slaveNumber;
+	@JsonProperty("emr_version")
+	private final String version;
+
+	@Builder
+	public AwsComputationalResource(String computationalName, String computationalId, String imageName,
+									String templateName, String status, Date uptime,
+									SchedulerJobDTO schedulerJobData, boolean reuploadKeyRequired,
+									String instanceId, String masterShape, String slaveShape, Boolean slaveSpot,
+									Integer slaveSpotPctPrice, String slaveNumber, String version,
+									List<ResourceURL> resourceURL, LocalDateTime lastActivity,
+									List<ClusterConfig> config, Map<String, String> tags, int totalInstanceCount) {
+		super(computationalName, computationalId, imageName, templateName, status, uptime, schedulerJobData,
+				reuploadKeyRequired, resourceURL, lastActivity, tags, totalInstanceCount);
+		this.instanceId = instanceId;
+		this.masterShape = masterShape;
+		this.slaveShape = slaveShape;
+		this.slaveSpot = slaveSpot;
+		this.slaveSpotPctPrice = slaveSpotPctPrice;
+		this.slaveNumber = slaveNumber;
+		this.version = version;
+		this.config = config;
+	}
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/AwsComputationalTerminateDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/AwsComputationalTerminateDTO.java
new file mode 100644
index 0000000..cc0160b
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/AwsComputationalTerminateDTO.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.aws.computational;
+
+import com.epam.datalab.dto.computational.ComputationalTerminateDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString(callSuper = true)
+public class AwsComputationalTerminateDTO extends ComputationalTerminateDTO {
+
+    @JsonProperty("emr_cluster_name")
+    private String clusterName;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/ClusterConfig.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/ClusterConfig.java
new file mode 100644
index 0000000..d8a4e72
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/ClusterConfig.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.dto.aws.computational;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class ClusterConfig {
+    @JsonProperty("Classification")
+    @NotEmpty(message = "'Classification' field should not be empty")
+    private String classification;
+    @JsonProperty("Properties")
+    @NotNull(message = "'Properties' field should not be empty")
+    private Map<String, Object> properties;
+    @JsonProperty("Configurations")
+    private List<ClusterConfig> configurations;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/ComputationalConfigAws.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/ComputationalConfigAws.java
new file mode 100644
index 0000000..0a314b2
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/ComputationalConfigAws.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.aws.computational;
+
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+public class ComputationalConfigAws extends ComputationalBase<ComputationalConfigAws> {
+    @JsonProperty("emr_version")
+    private String version;
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public ComputationalConfigAws withVersion(String version) {
+        setVersion(version);
+        return this;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("version", version);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/ComputationalCreateAws.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/ComputationalCreateAws.java
new file mode 100644
index 0000000..a2b044b
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/ComputationalCreateAws.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.aws.computational;
+
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class ComputationalCreateAws extends ComputationalBase<ComputationalCreateAws> {
+    @JsonProperty("emr_instance_count")
+    private String instanceCount;
+    @JsonProperty("emr_master_instance_type")
+    private String masterInstanceType;
+    @JsonProperty("emr_slave_instance_type")
+    private String slaveInstanceType;
+    @JsonProperty("emr_slave_instance_spot")
+    private Boolean slaveInstanceSpot;
+    @JsonProperty("emr_slave_instance_spot_pct_price")
+    private Integer slaveInstanceSpotPctPrice;
+    @JsonProperty("emr_version")
+    private String version;
+    @JsonProperty("emr_configurations")
+    private List<ClusterConfig> config;
+    @JsonProperty("conf_shared_image_enabled")
+    private String sharedImageEnabled;
+
+    public String getInstanceCount() {
+        return instanceCount;
+    }
+
+    public void setInstanceCount(String instanceCount) {
+        this.instanceCount = instanceCount;
+    }
+
+    public ComputationalCreateAws withInstanceCount(String instanceCount) {
+        setInstanceCount(instanceCount);
+        return this;
+    }
+
+    public ComputationalCreateAws withMasterInstanceType(String masterInstanceType) {
+        setMasterInstanceType(masterInstanceType);
+        return this;
+    }
+
+    public ComputationalCreateAws withSlaveInstanceType(String slaveInstanceType) {
+        setSlaveInstanceType(slaveInstanceType);
+        return this;
+    }
+
+    public ComputationalCreateAws withSlaveInstanceSpot(Boolean slaveInstanceSpot) {
+        setSlaveInstanceSpot(slaveInstanceSpot);
+        return this;
+    }
+
+    public void setSlaveInstanceSpotPctPrice(Integer slaveInstanceSpotPctPrice) {
+        this.slaveInstanceSpotPctPrice = slaveInstanceSpotPctPrice;
+    }
+
+    public ComputationalCreateAws withSlaveInstanceSpotPctPrice(Integer slaveInstanceSpotPctPrice) {
+        setSlaveInstanceSpotPctPrice(slaveInstanceSpotPctPrice);
+        return this;
+    }
+
+    public ComputationalCreateAws withVersion(String version) {
+        setVersion(version);
+        return this;
+    }
+
+    public ComputationalCreateAws withConfig(List<ClusterConfig> config) {
+        setConfig(config);
+        return this;
+    }
+
+    public ComputationalCreateAws withSharedImageEnabled(String sharedImageEnabled) {
+        setSharedImageEnabled(sharedImageEnabled);
+        return this;
+    }
+
+    public ComputationalCreateAws withNotebookName(String name) {
+        setNotebookInstanceName(name);
+        return this;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("version", version)
+                .add("masterInstanceType", masterInstanceType)
+                .add("slaveInstanceType", slaveInstanceType)
+                .add("slaveInstanceSpot", slaveInstanceSpot)
+                .add("slaveInstanceSpotPctPrice", slaveInstanceSpotPctPrice)
+                .add("instanceCount", instanceCount);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/SparkComputationalConfigAws.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/SparkComputationalConfigAws.java
new file mode 100644
index 0000000..8242b9d
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/SparkComputationalConfigAws.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.aws.computational;
+
+import com.epam.datalab.dto.azure.computational.SparkComputationalConfigAzure;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+public class SparkComputationalConfigAws extends ComputationalBase<SparkComputationalConfigAzure> {
+
+    @JsonProperty("dataengine_instance_count")
+    private String dataEngineInstanceCount;
+
+    public SparkComputationalConfigAws withDataEngineInstanceCount(String dataEngineInstanceCount) {
+        this.dataEngineInstanceCount = dataEngineInstanceCount;
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("dataEngineInstanceCount", dataEngineInstanceCount);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/SparkComputationalCreateAws.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/SparkComputationalCreateAws.java
new file mode 100644
index 0000000..db2ca7b
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/computational/SparkComputationalCreateAws.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.aws.computational;
+
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+import java.util.List;
+
+public class SparkComputationalCreateAws extends ComputationalBase<SparkComputationalCreateAws> {
+
+    @JsonProperty("dataengine_instance_count")
+    private String dataEngineInstanceCount;
+    @JsonProperty("aws_dataengine_slave_shape")
+    private String dataEngineSlaveShape;
+    @JsonProperty("aws_dataengine_master_shape")
+    private String dataEngineMasterShape;
+    @JsonProperty("spark_configurations")
+    private List<ClusterConfig> config;
+    @JsonProperty("conf_shared_image_enabled")
+    private String sharedImageEnabled;
+
+    public SparkComputationalCreateAws withDataEngineInstanceCount(String dataEngineInstanceCount) {
+        this.dataEngineInstanceCount = dataEngineInstanceCount;
+        return this;
+    }
+
+    public SparkComputationalCreateAws withDataEngineSlaveShape(String dataEngineSlaveSize) {
+        this.dataEngineSlaveShape = dataEngineSlaveSize;
+        return this;
+    }
+
+    public SparkComputationalCreateAws withDataEngineMasterShape(String dataEngineMasterSize) {
+        this.dataEngineMasterShape = dataEngineMasterSize;
+        return this;
+    }
+
+    public SparkComputationalCreateAws withConfig(List<ClusterConfig> config) {
+        this.config = config;
+        return this;
+    }
+
+    public SparkComputationalCreateAws withSharedImageEnabled(String sharedImageEnabled) {
+        this.sharedImageEnabled = sharedImageEnabled;
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("dataEngineInstanceCount", dataEngineInstanceCount)
+                .add("dataEngineSlaveShape", dataEngineSlaveShape)
+                .add("dataEngineMasterShape", dataEngineMasterShape);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/edge/EdgeCreateAws.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/edge/EdgeCreateAws.java
new file mode 100644
index 0000000..2f341ac
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/edge/EdgeCreateAws.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.aws.edge;
+
+import com.epam.datalab.dto.ResourceSysBaseDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+public class EdgeCreateAws extends ResourceSysBaseDTO<EdgeCreateAws> {
+    @JsonProperty("edge_elastic_ip")
+    private String edgeElasticIp;
+
+    public String getEdgeElasticIp() {
+        return edgeElasticIp;
+    }
+
+    public void setEdgeElasticIp(String edgeElasticIp) {
+        this.edgeElasticIp = edgeElasticIp;
+    }
+
+    public EdgeCreateAws withEdgeElasticIp(String edgeElasticIp) {
+        setEdgeElasticIp(edgeElasticIp);
+        return this;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("edgeElasticIp", edgeElasticIp);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/edge/EdgeInfoAws.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/edge/EdgeInfoAws.java
new file mode 100644
index 0000000..813ad11
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/edge/EdgeInfoAws.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.aws.edge;
+
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class EdgeInfoAws extends EdgeInfo {
+    @JsonProperty("user_own_bicket_name")
+    private String userOwnBucketName;
+    @JsonProperty("notebook_profile")
+    private String notebookProfile;
+    @JsonProperty("shared_bucket_name")
+    private String sharedBucketName;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/exploratory/ExploratoryCreateAws.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/exploratory/ExploratoryCreateAws.java
new file mode 100644
index 0000000..95fe658
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/exploratory/ExploratoryCreateAws.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.aws.exploratory;
+
+import com.epam.datalab.dto.exploratory.ExploratoryCreateDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ExploratoryCreateAws extends ExploratoryCreateDTO<ExploratoryCreateAws> {
+    @JsonProperty("aws_notebook_instance_type")
+    private String notebookInstanceType;
+
+    public ExploratoryCreateAws withNotebookInstanceType(String notebookInstanceType) {
+        setNotebookInstanceType(notebookInstanceType);
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("notebookInstanceType", notebookInstanceType);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/keyload/UploadFileAws.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/keyload/UploadFileAws.java
new file mode 100644
index 0000000..393a59d
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/aws/keyload/UploadFileAws.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.aws.keyload;
+
+import com.epam.datalab.dto.aws.edge.EdgeCreateAws;
+import com.epam.datalab.dto.base.keyload.UploadFile;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Data
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class UploadFileAws extends UploadFile {
+    @JsonProperty
+    private EdgeCreateAws edge;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/AzureCloudSettings.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/AzureCloudSettings.java
new file mode 100644
index 0000000..9a1fbe3
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/AzureCloudSettings.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.azure;
+
+import com.epam.datalab.dto.base.CloudSettings;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class AzureCloudSettings extends CloudSettings {
+
+    @JsonProperty("azure_region")
+    private String azureRegion;
+    @JsonProperty("azure_iam_user")
+    private String azureIamUser;
+    @JsonProperty("conf_service_base_name")
+    protected String sbn;
+    @JsonProperty("conf_os_family")
+    protected String os;
+    @JsonProperty("conf_cloud_provider")
+    protected String cloud;
+    @JsonProperty("azure_vpc_name")
+    private String azureVpcName;
+    @JsonProperty("azure_subnet_name")
+    private String azureSubnetName;
+    @JsonProperty("azure_resource_group_name")
+    private String azureResourceGroupName;
+    @JsonProperty("azure_security_group_name")
+    private String azureSecurityGroupName;
+    @JsonProperty("ldap_hostname")
+    protected String ldapHost;
+    @JsonProperty("ldap_dn")
+    protected String ldapDn;
+    @JsonProperty("ldap_ou")
+    protected String ldapOu;
+    @JsonProperty("ldap_service_username")
+    protected String ldapUser;
+    @JsonProperty("ldap_service_password")
+    protected String ldapPassword;
+    @JsonProperty("conf_key_dir")
+    protected String confKeyDir;
+    @JsonProperty("conf_image_enabled")
+    private String imageEnabled;
+    @JsonProperty("conf_stepcerts_enabled")
+    private String stepCertsEnabled;
+    @JsonProperty("conf_stepcerts_root_ca")
+    private String stepCertsRootCA;
+    @JsonProperty("conf_stepcerts_kid")
+    private String stepCertsKid;
+    @JsonProperty("conf_stepcerts_kid_password")
+    private String stepCertsKidPassword;
+    @JsonProperty("conf_stepcerts_ca_url")
+    private String stepCertsCAURL;
+    @JsonProperty("keycloak_auth_server_url")
+    private String keycloakAuthServerUrl;
+    @JsonProperty("keycloak_realm_name")
+    private String keycloakRealmName;
+    @JsonProperty("keycloak_user")
+    private String keycloakUser;
+    @JsonProperty("keycloak_user_password")
+    private String keycloakUserPassword;
+
+    @Override
+    @JsonIgnore
+    public String getIamUser() {
+        return azureIamUser;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/auth/AuthorizationCodeFlowResponse.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/auth/AuthorizationCodeFlowResponse.java
new file mode 100644
index 0000000..467affd
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/auth/AuthorizationCodeFlowResponse.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.azure.auth;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.ToString;
+
+import javax.ws.rs.FormParam;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+@ToString(exclude = "code")
+public class AuthorizationCodeFlowResponse {
+
+    @JsonProperty
+    @FormParam("state")
+    private String state;
+    @JsonProperty
+    @FormParam("code")
+    private String code;
+    @JsonProperty
+    @FormParam("error")
+    private String error;
+    @JsonProperty("error_description")
+    @FormParam("error_description")
+    private String errorDescription;
+
+    @JsonIgnore
+    public boolean isSuccessful() {
+        return state != null && !state.isEmpty() && code != null && !code.isEmpty();
+    }
+
+    @JsonIgnore
+    public boolean isFailed() {
+        return error != null && !error.isEmpty();
+    }
+
+    @JsonIgnore
+    public boolean isValid() {
+        return isSuccessful() || isFailed();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/computational/SparkComputationalConfigAzure.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/computational/SparkComputationalConfigAzure.java
new file mode 100644
index 0000000..c7d1f16
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/computational/SparkComputationalConfigAzure.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.azure.computational;
+
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+public class SparkComputationalConfigAzure extends ComputationalBase<SparkComputationalConfigAzure> {
+
+    @JsonProperty("dataengine_instance_count")
+    private String dataEngineInstanceCount;
+
+    public SparkComputationalConfigAzure withDataEngineInstanceCount(String dataEngineInstanceCount) {
+        this.dataEngineInstanceCount = dataEngineInstanceCount;
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("dataEngineInstanceCount", dataEngineInstanceCount);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/computational/SparkComputationalCreateAzure.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/computational/SparkComputationalCreateAzure.java
new file mode 100644
index 0000000..fed622a
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/computational/SparkComputationalCreateAzure.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.azure.computational;
+
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+import java.util.List;
+
+public class SparkComputationalCreateAzure extends ComputationalBase<SparkComputationalCreateAzure> {
+    @JsonProperty("dataengine_instance_count")
+    private String dataEngineInstanceCount;
+    @JsonProperty("azure_dataengine_slave_size")
+    private String dataEngineSlaveSize;
+    @JsonProperty("azure_dataengine_master_size")
+    private String dataEngineMasterSize;
+    @JsonProperty("azure_datalake_enable")
+    private String azureDataLakeEnabled;
+    @JsonProperty("azure_user_refresh_token")
+    private String azureUserRefreshToken;
+    @JsonProperty("spark_configurations")
+    private List<ClusterConfig> config;
+    @JsonProperty("conf_shared_image_enabled")
+    private String sharedImageEnabled;
+
+    public SparkComputationalCreateAzure withDataEngineInstanceCount(String dataEngineInstanceCount) {
+        this.dataEngineInstanceCount = dataEngineInstanceCount;
+        return this;
+    }
+
+    public SparkComputationalCreateAzure withDataEngineSlaveSize(String dataEngineSlaveSize) {
+        this.dataEngineSlaveSize = dataEngineSlaveSize;
+        return this;
+    }
+
+    public SparkComputationalCreateAzure withDataEngineMasterSize(String dataEngineMasterSize) {
+        this.dataEngineMasterSize = dataEngineMasterSize;
+        return this;
+    }
+
+    public SparkComputationalCreateAzure withAzureDataLakeEnabled(String azureDataLakeEnabled) {
+        this.azureDataLakeEnabled = azureDataLakeEnabled;
+        return this;
+    }
+
+    public SparkComputationalCreateAzure withAzureUserRefreshToken(String azureUserRefreshToken) {
+        this.azureUserRefreshToken = azureUserRefreshToken;
+        return this;
+    }
+
+    public SparkComputationalCreateAzure withConfig(List<ClusterConfig> config) {
+        this.config = config;
+        return this;
+    }
+
+    public SparkComputationalCreateAzure withSharedImageEnabled(String sharedImageEnabled) {
+        this.sharedImageEnabled = sharedImageEnabled;
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("dataEngineInstanceCount", dataEngineInstanceCount)
+                .add("dataEngineSlaveSize", dataEngineSlaveSize)
+                .add("dataEngineMasterSize", dataEngineMasterSize)
+                .add("azureDataLakeEnabled", azureDataLakeEnabled)
+                .add("azureUserRefreshToken", azureUserRefreshToken != null ? "***" : null);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/edge/EdgeCreateAzure.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/edge/EdgeCreateAzure.java
new file mode 100644
index 0000000..3e4a19d
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/edge/EdgeCreateAzure.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.azure.edge;
+
+import com.epam.datalab.dto.ResourceSysBaseDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+public class EdgeCreateAzure extends ResourceSysBaseDTO<EdgeCreateAzure> {
+    @JsonProperty("azure_datalake_enable")
+    private String azureDataLakeEnable;
+
+    public EdgeCreateAzure withAzureDataLakeEnable(String azureDataLakeEnable) {
+        this.azureDataLakeEnable = azureDataLakeEnable;
+        return this;
+    }
+
+    public String getAzureDataLakeEnable() {
+        return azureDataLakeEnable;
+    }
+
+
+    public void setAzureDataLakeEnable(String azureDataLakeEnable) {
+        this.azureDataLakeEnable = azureDataLakeEnable;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(this)
+                .add("azureDataLakeEnable", azureDataLakeEnable);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/edge/EdgeInfoAzure.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/edge/EdgeInfoAzure.java
new file mode 100644
index 0000000..c5bba7e
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/edge/EdgeInfoAzure.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.azure.edge;
+
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class EdgeInfoAzure extends EdgeInfo {
+    @JsonProperty("user_storage_account_name")
+    private String userStorageAccountName;
+    @JsonProperty("user_container_name")
+    private String userContainerName;
+    @JsonProperty("shared_storage_account_name")
+    private String sharedStorageAccountName;
+    @JsonProperty("shared_container_name")
+    private String sharedContainerName;
+    @JsonProperty("user_storage_account_tag_name")
+    private String userStorageAccountTagName;
+    @JsonProperty("datalake_name")
+    private String dataLakeName;
+    @JsonProperty("datalake_user_directory_name")
+    private String dataLakeDirectoryName;
+    @JsonProperty("datalake_shared_directory_name")
+    private String dataLakeSharedDirectoryName;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/exploratory/ExploratoryActionStartAzure.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/exploratory/ExploratoryActionStartAzure.java
new file mode 100644
index 0000000..b4b9454
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/exploratory/ExploratoryActionStartAzure.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.azure.exploratory;
+
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+public class ExploratoryActionStartAzure extends ExploratoryGitCredsUpdateDTO {
+    @JsonProperty("azure_datalake_enable")
+    private String azureDataLakeEnabled;
+    @JsonProperty("azure_user_refresh_token")
+    private String azureUserRefreshToken;
+
+    public String getAzureDataLakeEnabled() {
+        return azureDataLakeEnabled;
+    }
+
+    public void setAzureDataLakeEnabled(String azureDataLakeEnabled) {
+        this.azureDataLakeEnabled = azureDataLakeEnabled;
+    }
+
+    public String getAzureUserRefreshToken() {
+        return azureUserRefreshToken;
+    }
+
+    public void setAzureUserRefreshToken(String azureUserRefreshToken) {
+        this.azureUserRefreshToken = azureUserRefreshToken;
+    }
+
+    public ExploratoryActionStartAzure withAzureDataLakeEnabled(String azureDataLakeEnabled) {
+        setAzureDataLakeEnabled(azureDataLakeEnabled);
+        return this;
+    }
+
+    public ExploratoryActionStartAzure withAzureUserRefreshToken(String azureUserRefreshToken) {
+        setAzureUserRefreshToken(azureUserRefreshToken);
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("azureDataLakeEnabled", azureDataLakeEnabled)
+                .add("azureUserRefreshToken", azureUserRefreshToken != null ? "***" : null);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/exploratory/ExploratoryActionStopAzure.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/exploratory/ExploratoryActionStopAzure.java
new file mode 100644
index 0000000..adcbd46
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/exploratory/ExploratoryActionStopAzure.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.azure.exploratory;
+
+import com.epam.datalab.dto.exploratory.ExploratoryActionDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+public class ExploratoryActionStopAzure extends ExploratoryActionDTO<ExploratoryActionStopAzure> {
+    @JsonProperty("computational_name")
+    private String computationalName;
+
+    public String getComputationalName() {
+        return computationalName;
+    }
+
+    public ExploratoryActionStopAzure setComputationalName(String computationalName) {
+        this.computationalName = computationalName;
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("computationalName", computationalName);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/exploratory/ExploratoryCreateAzure.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/exploratory/ExploratoryCreateAzure.java
new file mode 100644
index 0000000..612dbfe
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/exploratory/ExploratoryCreateAzure.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.azure.exploratory;
+
+import com.epam.datalab.dto.exploratory.ExploratoryCreateDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ExploratoryCreateAzure extends ExploratoryCreateDTO<ExploratoryCreateAzure> {
+    @JsonProperty("azure_notebook_instance_size")
+    private String notebookInstanceType;
+    @JsonProperty("azure_datalake_enable")
+    private String azureDataLakeEnabled;
+    @JsonProperty("azure_user_refresh_token")
+    private String azureUserRefreshToken;
+
+
+    public ExploratoryCreateAzure withNotebookInstanceSize(String notebookInstanceType) {
+        setNotebookInstanceType(notebookInstanceType);
+        return this;
+    }
+
+    public ExploratoryCreateAzure withAzureDataLakeEnabled(String azureDataLakeEnabled) {
+        setAzureDataLakeEnabled(azureDataLakeEnabled);
+        return this;
+    }
+
+    public ExploratoryCreateAzure withAzureUserRefreshToken(String azureUserRefreshToken) {
+        setAzureUserRefreshToken(azureUserRefreshToken);
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("notebookInstanceType", notebookInstanceType)
+                .add("azureDataLakeEnabled", azureDataLakeEnabled)
+                .add("azureUserRefreshToken", azureUserRefreshToken != null ? "***" : null);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/keyload/UploadFileAzure.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/keyload/UploadFileAzure.java
new file mode 100644
index 0000000..4148584
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/azure/keyload/UploadFileAzure.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.azure.keyload;
+
+import com.epam.datalab.dto.azure.edge.EdgeCreateAzure;
+import com.epam.datalab.dto.base.keyload.UploadFile;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Data
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class UploadFileAzure extends UploadFile {
+    @JsonProperty
+    private EdgeCreateAzure edge;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/backup/EnvBackupDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/backup/EnvBackupDTO.java
new file mode 100644
index 0000000..a662d2f
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/backup/EnvBackupDTO.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.backup;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.ToString;
+
+import java.util.List;
+
+@Data
+@Builder
+@ToString
+public class EnvBackupDTO {
+    private final List<String> configFiles;
+    private final List<String> keys;
+    private final List<String> certificates;
+    private final List<String> jars;
+    private final boolean databaseBackup;
+    private final boolean logsBackup;
+    private String backupFile;
+    private String id;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/backup/EnvBackupStatus.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/backup/EnvBackupStatus.java
new file mode 100644
index 0000000..91637ef
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/backup/EnvBackupStatus.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.backup;
+
+import java.util.Arrays;
+
+public enum EnvBackupStatus {
+    CREATING("N/A"), CREATED("N/A"), FAILED("N/A");
+
+    private String message;
+
+    EnvBackupStatus(String message) {
+        this.message = message;
+    }
+
+    public EnvBackupStatus withErrorMessage(String message) {
+        this.message = message;
+        return this;
+    }
+
+    public String message() {
+        return message;
+    }
+
+    public static EnvBackupStatus fromValue(String value) {
+        return Arrays.stream(values())
+                .filter(v -> v.name().equalsIgnoreCase(value))
+                .findAny()
+                .orElseThrow(() ->
+                        new IllegalArgumentException("Wrong value for EnvBackupStatus: " + value));
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/backup/EnvBackupStatusDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/backup/EnvBackupStatusDTO.java
new file mode 100644
index 0000000..76811f3
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/backup/EnvBackupStatusDTO.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.backup;
+
+import com.epam.datalab.dto.StatusBaseDTO;
+import com.google.common.base.MoreObjects;
+import lombok.Getter;
+
+@Getter
+public class EnvBackupStatusDTO extends StatusBaseDTO<EnvBackupStatusDTO> {
+
+    private EnvBackupDTO envBackupDTO;
+    private EnvBackupStatus envBackupStatus;
+
+
+    public EnvBackupStatusDTO withEnvBackupDTO(EnvBackupDTO envBackupDTO) {
+        this.envBackupDTO = envBackupDTO;
+        return this;
+    }
+
+    public EnvBackupStatusDTO withStatus(EnvBackupStatus status) {
+        this.envBackupStatus = status;
+        return withStatus(status.name());
+    }
+
+    public EnvBackupStatusDTO withBackupFile(String backupFile) {
+        if (envBackupDTO != null) {
+            envBackupDTO.setBackupFile(backupFile);
+        }
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("envBackupStatus", envBackupStatus)
+                .add("envBackupDTO", envBackupDTO);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/CloudSettings.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/CloudSettings.java
new file mode 100644
index 0000000..5c1ccb8
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/CloudSettings.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.base;
+
+import com.epam.datalab.util.CloudSettingsDeserializer;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.Data;
+
+@Data
+@JsonDeserialize(using = CloudSettingsDeserializer.class)
+public abstract class CloudSettings {
+    @JsonIgnore
+    public abstract String getIamUser();
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/DataEngineType.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/DataEngineType.java
new file mode 100644
index 0000000..14b13eb
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/DataEngineType.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.base;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum DataEngineType {
+    CLOUD_SERVICE("dataengine-service"),
+    SPARK_STANDALONE("dataengine");
+
+    private static final String DOCKER_IMAGE_PREFIX = "docker.datalab-";
+
+    private static final Map<String, DataEngineType> INTERNAL_MAP = new HashMap<>();
+
+    static {
+        for (DataEngineType dataEngineType : DataEngineType.values()) {
+            INTERNAL_MAP.put(dataEngineType.getName(), dataEngineType);
+        }
+    }
+
+    private final String name;
+
+    DataEngineType(String name) {
+        this.name = name;
+    }
+
+    public String getImage() {
+        return DOCKER_IMAGE_PREFIX + this.name;
+    }
+
+    public static DataEngineType fromString(String name) {
+        return INTERNAL_MAP.get(name);
+    }
+
+    public static DataEngineType fromDockerImageName(String name) {
+        return INTERNAL_MAP.get(name.replace(DOCKER_IMAGE_PREFIX, ""));
+    }
+
+    public static String getDockerImageName(DataEngineType dataEngineType) {
+        return DOCKER_IMAGE_PREFIX + dataEngineType.getName();
+    }
+
+    @JsonValue
+    public String getName() {
+        return name;
+    }
+}
\ No newline at end of file
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/computational/ComputationalBase.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/computational/ComputationalBase.java
new file mode 100644
index 0000000..cc0d6ad
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/computational/ComputationalBase.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.base.computational;
+
+import com.epam.datalab.dto.ResourceEnvBaseDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import java.util.Map;
+
+public abstract class ComputationalBase<T extends ComputationalBase<?>> extends ResourceEnvBaseDTO<T> {
+    @SuppressWarnings("unchecked")
+    private final T self = (T) this;
+
+    @JsonProperty("computational_name")
+    private String computationalName;
+
+    @JsonProperty("notebook_instance_name")
+    private String notebookInstanceName;
+
+    @JsonProperty("notebook_template_name")
+    private String notebookTemplateName;
+
+    @JsonProperty("project_name")
+    private String project;
+    @JsonProperty("endpoint_name")
+    private String ednpoint;
+
+    @JsonProperty("tags")
+    private Map<String, String> tags;
+
+    public String getComputationalName() {
+        return computationalName;
+    }
+
+    public void setComputationalName(String computationalName) {
+        this.computationalName = computationalName;
+    }
+
+    public T withComputationalName(String computationalName) {
+        setComputationalName(computationalName);
+        return self;
+    }
+
+    public String getNotebookInstanceName() {
+        return notebookInstanceName;
+    }
+
+    public void setNotebookInstanceName(String notebookInstanceName) {
+        this.notebookInstanceName = notebookInstanceName;
+    }
+
+    public T withNotebookInstanceName(String notebookInstanceName) {
+        setNotebookInstanceName(notebookInstanceName);
+        return self;
+    }
+
+    public String getNotebookTemplateName() {
+        return notebookTemplateName;
+    }
+
+    public void setNotebookTemplateName(String notebookTemplateName) {
+        this.notebookTemplateName = notebookTemplateName;
+    }
+
+    public T withNotebookTemplateName(String notebookTemplateName) {
+        setNotebookTemplateName(notebookTemplateName);
+        return self;
+    }
+
+    public T withProject(String project) {
+        this.project = project;
+        return self;
+    }
+
+    public T withTags(Map<String, String> tags) {
+        this.tags = tags;
+        return self;
+    }
+
+    public T withEndpoint(String endpoint) {
+        this.ednpoint = endpoint;
+        return self;
+    }
+
+    public String getProject() {
+        return project;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("computationalName", computationalName)
+                .add("notebookInstanceName", notebookInstanceName)
+                .add("notebookTemplateName", notebookTemplateName);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/computational/FullComputationalTemplate.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/computational/FullComputationalTemplate.java
new file mode 100644
index 0000000..bbcf652
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/computational/FullComputationalTemplate.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.base.computational;
+
+import com.epam.datalab.dto.imagemetadata.ComputationalMetadataDTO;
+import com.fasterxml.jackson.annotation.JsonUnwrapped;
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public class FullComputationalTemplate {
+    @JsonUnwrapped
+    private final ComputationalMetadataDTO computationalMetadataDTO;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/edge/EdgeInfo.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/edge/EdgeInfo.java
new file mode 100644
index 0000000..18b16a6
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/edge/EdgeInfo.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.base.edge;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
+public class EdgeInfo {
+    @JsonProperty("_id")
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private String id;
+
+    @JsonProperty("instance_id")
+    private String instanceId;
+
+    @JsonProperty
+    private String hostname;
+
+    @JsonProperty("public_ip")
+    private String publicIp;
+
+    @JsonProperty
+    private String ip;
+
+    @JsonProperty("key_name")
+    private String keyName;
+
+    @JsonProperty("tunnel_port")
+    private String tunnelPort;
+
+    @JsonProperty("socks_port")
+    private String socksPort;
+
+    @JsonProperty("notebook_sg")
+    private String notebookSg;
+
+    @JsonProperty("edge_sg")
+    private String edgeSg;
+
+    @JsonProperty("notebook_subnet")
+    private String notebookSubnet;
+
+    @JsonProperty("edge_status")
+    private String edgeStatus;
+
+    @JsonProperty("reupload_key_required")
+    private boolean reuploadKeyRequired = false;
+
+    @JsonProperty("gpu_types")
+    private List<String> gpuList;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/keyload/ReuploadFile.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/keyload/ReuploadFile.java
new file mode 100644
index 0000000..dcda54a
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/keyload/ReuploadFile.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.base.keyload;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Data
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class ReuploadFile extends UploadFile {
+    @JsonProperty
+    private String edgeUserName;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/keyload/UploadFile.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/keyload/UploadFile.java
new file mode 100644
index 0000000..7ca9810
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/keyload/UploadFile.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.base.keyload;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UploadFile {
+    @JsonProperty
+    private String content;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/keyload/UploadFileResult.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/keyload/UploadFileResult.java
new file mode 100644
index 0000000..d8e99de
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/keyload/UploadFileResult.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.base.keyload;
+
+import com.epam.datalab.dto.StatusBaseDTO;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.google.common.base.MoreObjects;
+
+public class UploadFileResult<T extends EdgeInfo> extends StatusBaseDTO<UploadFileResult<T>> {
+
+    private T edgeInfo;
+
+    public T getEdgeInfo() {
+        return edgeInfo;
+    }
+
+    public UploadFileResult<T> withEdgeInfo(T edgeInfo) {
+        this.edgeInfo = edgeInfo;
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("edgeInfo", edgeInfo);
+    }
+
+
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/odahu/OdahuResult.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/odahu/OdahuResult.java
new file mode 100644
index 0000000..0241929
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/odahu/OdahuResult.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.base.odahu;
+
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.StatusBaseDTO;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class OdahuResult extends StatusBaseDTO<OdahuResult> {
+    private String name;
+    @JsonProperty("project_name")
+    private String projectName;
+    @JsonProperty("endpoint_name")
+    private String endpointName;
+    @JsonProperty("grafana_admin")
+    private String grafanaAdmin;
+    @JsonProperty("grafana_pass")
+    private String grafanaPassword;
+    @JsonProperty("oauth_cookie_secret")
+    private String oauthCookieSecret;
+    @JsonProperty("odahuflow_connection_decrypt_token")
+    private String decryptToken;
+    @JsonProperty("odahu_urls")
+    private List<ResourceURL> resourceUrls;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/base/project/ProjectResult.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/project/ProjectResult.java
new file mode 100644
index 0000000..d355df9
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/base/project/ProjectResult.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.base.project;
+
+import com.epam.datalab.dto.StatusBaseDTO;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ProjectResult extends StatusBaseDTO<ProjectResult> {
+    private EdgeInfo edgeInfo;
+    @JsonProperty("project_name")
+    private String projectName;
+    @JsonProperty("endpoint_name")
+    private String endpointName;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/billing/BillingData.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/billing/BillingData.java
new file mode 100644
index 0000000..228fa8d
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/billing/BillingData.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.billing;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+@Builder
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class BillingData {
+    private final String tag;
+    private String application;
+    @JsonProperty("from")
+    private LocalDate usageDateFrom;
+    @JsonProperty("to")
+    private LocalDate usageDateTo;
+    private String product;
+    private String usageType;
+    private Double cost;
+    private String currency;
+    private final String usageDate;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/billing/BillingResourceType.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/billing/BillingResourceType.java
new file mode 100644
index 0000000..6b32025
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/billing/BillingResourceType.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.billing;
+
+public enum BillingResourceType {
+    EDGE,
+    SSN,
+    ENDPOINT,
+    BUCKET,
+    VOLUME,
+    EXPLORATORY,
+    COMPUTATIONAL,
+    IMAGE
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/bucket/BucketDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/bucket/BucketDTO.java
new file mode 100644
index 0000000..b2dbca7
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/bucket/BucketDTO.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.bucket;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class BucketDTO {
+    private final String bucket;
+    private final String object;
+    private final String size;
+    private final long lastModifiedDate;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/bucket/BucketDeleteDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/bucket/BucketDeleteDTO.java
new file mode 100644
index 0000000..66ef80f
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/bucket/BucketDeleteDTO.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.bucket;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class BucketDeleteDTO {
+    private final String bucket;
+    private final List<String> objects;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/bucket/FolderUploadDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/bucket/FolderUploadDTO.java
new file mode 100644
index 0000000..37f2559
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/bucket/FolderUploadDTO.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.bucket;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class FolderUploadDTO {
+    @NotBlank(message = "field cannot be empty")
+    private final String bucket;
+    @NotBlank(message = "field cannot be empty")
+    private final String folder;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/CheckInactivityCallbackDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/CheckInactivityCallbackDTO.java
new file mode 100644
index 0000000..764aab4
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/CheckInactivityCallbackDTO.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.dto.computational;
+
+import com.epam.datalab.dto.ResourceBaseDTO;
+import com.epam.datalab.dto.status.EnvResource;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Setter
+@Getter
+public class CheckInactivityCallbackDTO extends ResourceBaseDTO<CheckInactivityCallbackDTO> {
+
+    @JsonProperty
+    private List<EnvResource> resources;
+
+    @JsonProperty
+    private String id;
+
+    public CheckInactivityCallbackDTO withClusters(List<EnvResource> clusters) {
+        setResources(clusters);
+        return this;
+    }
+
+    public CheckInactivityCallbackDTO withId(String id) {
+        this.id = id;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("resources", resources)
+                .add("id", id)
+                .toString();
+    }
+
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/CheckInactivityStatus.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/CheckInactivityStatus.java
new file mode 100644
index 0000000..35d791d
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/CheckInactivityStatus.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.dto.computational;
+
+import java.util.Arrays;
+
+public enum CheckInactivityStatus {
+
+    COMPLETED("N/A"), FAILED("N/A");
+
+    private String message;
+
+    CheckInactivityStatus(String message) {
+        this.message = message;
+    }
+
+    public CheckInactivityStatus withErrorMessage(String message) {
+        this.message = message;
+        return this;
+    }
+
+    public String message() {
+        return message;
+    }
+
+    public static CheckInactivityStatus fromValue(String value) {
+        return Arrays.stream(values())
+                .filter(v -> v.name().equalsIgnoreCase(value))
+                .findAny()
+                .orElseThrow(() ->
+                        new IllegalArgumentException("Wrong value for CheckInactivityStatus: " + value));
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/CheckInactivityStatusDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/CheckInactivityStatusDTO.java
new file mode 100644
index 0000000..631be43
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/CheckInactivityStatusDTO.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.dto.computational;
+
+import com.epam.datalab.dto.StatusBaseDTO;
+import lombok.Data;
+
+@Data
+public class CheckInactivityStatusDTO extends StatusBaseDTO<CheckInactivityStatusDTO> {
+
+    private String exploratoryName;
+    private String computationalName;
+    private long lastActivityUnixTime;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalCheckInactivityDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalCheckInactivityDTO.java
new file mode 100644
index 0000000..77256f6
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalCheckInactivityDTO.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.computational;
+
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class ComputationalCheckInactivityDTO extends ComputationalBase<ComputationalCheckInactivityDTO> {
+    private String notebookImage;
+    @JsonProperty("computational_id")
+    private String computationalId;
+    private String image;
+
+    public ComputationalCheckInactivityDTO withNotebookImageName(String imageName) {
+        this.notebookImage = imageName;
+        return this;
+    }
+
+    public ComputationalCheckInactivityDTO withComputationalId(String computationalId) {
+        this.computationalId = computationalId;
+        return this;
+    }
+
+    public ComputationalCheckInactivityDTO withImage(String image) {
+        this.image = image;
+        return this;
+    }
+
+    public String getNotebookImage() {
+        return notebookImage;
+    }
+
+    public String getComputationalId() {
+        return computationalId;
+    }
+
+    public String getImage() {
+        return image;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalClusterConfigDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalClusterConfigDTO.java
new file mode 100644
index 0000000..2bc4e1b
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalClusterConfigDTO.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.computational;
+
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ComputationalClusterConfigDTO extends ComputationalBase<ComputationalClusterConfigDTO> {
+
+    @JsonProperty("computational_id")
+    private String copmutationalId;
+    @JsonProperty("spark_configurations")
+    private List<ClusterConfig> config;
+    @JsonProperty("azure_user_refresh_token")
+    private String azureUserRefreshToken;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalStartDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalStartDTO.java
new file mode 100644
index 0000000..52d0785
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalStartDTO.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.computational;
+
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+
+public class ComputationalStartDTO extends ComputationalBase<ComputationalStartDTO> {
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalStatusDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalStatusDTO.java
new file mode 100644
index 0000000..a09cb50
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalStatusDTO.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.computational;
+
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.StatusEnvBaseDTO;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import java.util.Date;
+import java.util.List;
+
+public class ComputationalStatusDTO extends StatusEnvBaseDTO<ComputationalStatusDTO> {
+    @JsonProperty("computational_url")
+    private List<ResourceURL> resourceUrl;
+    @JsonProperty("computational_id")
+    private String computationalId;
+    @JsonProperty("computational_name")
+    private String computationalName;
+    @JsonProperty("last_activity")
+    private Date lastActivity;
+    @JsonProperty
+    private List<ClusterConfig> config;
+
+    public String getComputationalId() {
+        return computationalId;
+    }
+
+    public void setComputationalId(String computationalId) {
+        this.computationalId = computationalId;
+    }
+
+    public ComputationalStatusDTO withComputationalId(String computationalId) {
+        setComputationalId(computationalId);
+        return this;
+    }
+
+    public List<ResourceURL> getResourceUrl() {
+        return resourceUrl;
+    }
+
+    public String getComputationalName() {
+        return computationalName;
+    }
+
+    public void setComputationalName(String computationalName) {
+        this.computationalName = computationalName;
+    }
+
+    public void setResourceUrl(List<ResourceURL> resourceUrl) {
+        this.resourceUrl = resourceUrl;
+    }
+
+    public void setLastActivity(Date lastActivity) {
+        this.lastActivity = lastActivity;
+    }
+
+    public ComputationalStatusDTO withComputationalUrl(List<ResourceURL> resourceUrl) {
+        setResourceUrl(resourceUrl);
+        return this;
+    }
+
+    public ComputationalStatusDTO withComputationalName(String computationalName) {
+        setComputationalName(computationalName);
+        return this;
+    }
+
+    public ComputationalStatusDTO withConfig(List<ClusterConfig> config) {
+        this.config = config;
+        return this;
+    }
+
+    public Date getLastActivity() {
+        return lastActivity;
+    }
+
+    public ComputationalStatusDTO withLastActivity(Date lastActivity) {
+        setLastActivity(lastActivity);
+        return this;
+    }
+
+    public List<ClusterConfig> getConfig() {
+        return config;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("computationalUrl", resourceUrl)
+                .add("computationalId", computationalId)
+                .add("computationalName", computationalName)
+                .add("lastActivity", lastActivity)
+                .add("config", config);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalStopDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalStopDTO.java
new file mode 100644
index 0000000..0a7978b
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalStopDTO.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.computational;
+
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+
+public class ComputationalStopDTO extends ComputationalBase<ComputationalStopDTO> {
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalTerminateDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalTerminateDTO.java
new file mode 100644
index 0000000..2c6051d
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/ComputationalTerminateDTO.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.computational;
+
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+
+public class ComputationalTerminateDTO extends ComputationalBase<ComputationalTerminateDTO> {
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/SparkStandaloneClusterResource.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/SparkStandaloneClusterResource.java
new file mode 100644
index 0000000..3cd5804
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/SparkStandaloneClusterResource.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.computational;
+
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.hibernate.validator.constraints.NotBlank;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class SparkStandaloneClusterResource extends UserComputationalResource {
+
+    @NotBlank
+    @JsonProperty("master_instance_shape")
+    private String masterDataEngineInstanceShape;
+
+    @NotBlank
+    @JsonProperty("data_engine_instance_count")
+    private String dataEngineInstanceCount;
+
+    @NotBlank
+    @JsonProperty("slave_instance_shape")
+    private String slaveDataEngineInstanceShape;
+
+    @Builder
+    public SparkStandaloneClusterResource(String computationalName, String computationalId, String imageName,
+                                          String templateName, String status, Date uptime,
+                                          SchedulerJobDTO schedulerJobData, boolean reuploadKeyRequired,
+                                          String dataEngineInstanceCount, String masterDataEngineInstanceShape,
+                                          String slaveDataEngineInstanceShape,
+                                          String masterGpuCount, String masterGpuType,
+                                          String slaveGpuCount, String slaveGpuType,
+                                          Boolean enabledGPU,
+                                          List<ResourceURL> resourceURL, LocalDateTime lastActivity,
+                                          List<ClusterConfig> config, Map<String, String> tags, int totalInstanceCount) {
+        super(computationalName, computationalId, imageName, templateName, status, uptime, schedulerJobData,
+                reuploadKeyRequired, resourceURL, lastActivity, tags, totalInstanceCount);
+        super.setMasterGpuCount(masterGpuCount);
+        super.setMasterGpuType(masterGpuType);
+        super.setSlaveGpuCount(slaveGpuCount);
+        super.setSlaveGpuType(slaveGpuType);
+        super.setEnabledGPU(enabledGPU);
+        super.setMasterNodeShape(masterDataEngineInstanceShape);
+        super.setSlaveNodeShape(slaveDataEngineInstanceShape);
+
+        this.masterDataEngineInstanceShape = masterDataEngineInstanceShape;
+        this.slaveDataEngineInstanceShape = slaveDataEngineInstanceShape;
+        this.dataEngineInstanceCount = dataEngineInstanceCount;
+
+        this.config = config;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/UserComputationalResource.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/UserComputationalResource.java
new file mode 100644
index 0000000..dbb35e2
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/computational/UserComputationalResource.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.computational;
+
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@NoArgsConstructor
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class UserComputationalResource {
+    @JsonProperty("computational_name")
+    private String computationalName;
+    @JsonProperty("computational_id")
+    private String computationalId;
+    @JsonProperty("image")
+    private String imageName;
+    @JsonProperty("template_name")
+    private String templateName;
+    @JsonProperty
+    private String status;
+    @JsonProperty("up_time")
+    private Date uptime;
+    @JsonProperty("scheduler_data")
+    private SchedulerJobDTO schedulerData;
+    @JsonProperty("reupload_key_required")
+    private boolean reuploadKeyRequired = false;
+    @JsonProperty("computational_url")
+    private List<ResourceURL> resourceUrl;
+    @JsonProperty("last_activity")
+    private LocalDateTime lastActivity;
+    @JsonProperty("master_node_shape")
+    private String masterNodeShape;
+    @JsonProperty("slave_node_shape")
+    private String slaveNodeShape;
+    @JsonProperty("dataengine_instance_shape")
+    private String dataengineShape;
+    @JsonProperty("dataengine_instance_count")
+    private int dataengineInstanceCount;
+    @JsonProperty("instance_id")
+    private String instanceId;
+    @JsonProperty("dataproc_version")
+    private String gcpClusterVersion;
+    @JsonProperty("emr_version")
+    private String awsClusterVersion;
+    private int totalInstanceCount;
+    protected List<ClusterConfig> config;
+    private Map<String, String> tags;
+    @JsonProperty("master_gpu_type")
+    private String masterGpuType;
+    @JsonProperty("master_gpu_count")
+    private String masterGpuCount;
+    @JsonProperty("slave_gpu_type")
+    private String slaveGpuType;
+    @JsonProperty("slave_gpu_count")
+    private String slaveGpuCount;
+    private boolean enabledGPU;
+
+    public UserComputationalResource(String computationalName, String computationalId, String imageName,
+                                     String templateName, String status, Date uptime, SchedulerJobDTO schedulerData,
+                                     boolean reuploadKeyRequired, List<ResourceURL> resourceUrl,
+                                     LocalDateTime lastActivity, Map<String, String> tags, int totalInstanceCount) {
+        this.computationalName = computationalName;
+        this.computationalId = computationalId;
+        this.imageName = imageName;
+        this.templateName = templateName;
+        this.status = status;
+        this.uptime = uptime;
+        this.schedulerData = schedulerData;
+        this.reuploadKeyRequired = reuploadKeyRequired;
+        this.resourceUrl = resourceUrl;
+        this.lastActivity = lastActivity;
+        this.tags = tags;
+        this.totalInstanceCount = totalInstanceCount;
+    }
+
+    public DataEngineType getDataEngineType() {
+        return DataEngineType.fromDockerImageName(imageName);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryActionDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryActionDTO.java
new file mode 100644
index 0000000..c8295cb
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryActionDTO.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+public class ExploratoryActionDTO<T extends ExploratoryActionDTO<?>> extends ExploratoryBaseDTO<T> {
+    @JsonProperty("notebook_instance_name")
+    private String notebookInstanceName;
+
+    @JsonProperty("reupload_key_required")
+    private boolean reuploadKeyRequired;
+
+
+    public boolean isReuploadKeyRequired() {
+        return reuploadKeyRequired;
+    }
+
+    public void setReuploadKeyRequired(boolean reuploadKeyRequired) {
+        this.reuploadKeyRequired = reuploadKeyRequired;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T withReuploadKeyRequired(boolean reuploadKeyRequired) {
+        setReuploadKeyRequired(reuploadKeyRequired);
+        return (T) this;
+    }
+
+    public String getNotebookInstanceName() {
+        return notebookInstanceName;
+    }
+
+    public void setNotebookInstanceName(String notebookInstanceName) {
+        this.notebookInstanceName = notebookInstanceName;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T withNotebookInstanceName(String notebookInstanceName) {
+        setNotebookInstanceName(notebookInstanceName);
+        return (T) this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("notebookInstanceName", notebookInstanceName);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryBaseDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryBaseDTO.java
new file mode 100644
index 0000000..20e50b5
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryBaseDTO.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.epam.datalab.dto.ResourceEnvBaseDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ExploratoryBaseDTO<T extends ExploratoryBaseDTO<?>> extends ResourceEnvBaseDTO<T> {
+    @JsonProperty("notebook_image")
+    private String notebookImage;
+    @JsonProperty("project_name")
+    private String project;
+    @JsonProperty("endpoint_name")
+    private String endpoint;
+
+    public String getNotebookImage() {
+        return notebookImage;
+    }
+
+    public void setNotebookImage(String notebookImage) {
+        this.notebookImage = notebookImage;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T withNotebookImage(String notebookImage) {
+        setNotebookImage(notebookImage);
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T withProject(String project) {
+        setProject(project);
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T withEndpoint(String endpoint) {
+        setEndpoint(endpoint);
+        return (T) this;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("notebookImage", notebookImage);
+    }
+
+    public String getEndpoint() {
+        return endpoint;
+    }
+
+    public void setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryCheckInactivityAction.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryCheckInactivityAction.java
new file mode 100644
index 0000000..1dc5c7e
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryCheckInactivityAction.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+public class ExploratoryCheckInactivityAction extends ExploratoryActionDTO<ExploratoryCheckInactivityAction> {
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryCreateDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryCreateDTO.java
new file mode 100644
index 0000000..98935bd
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryCreateDTO.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+import java.util.Map;
+
+@Setter
+@Getter
+public class ExploratoryCreateDTO<T extends ExploratoryCreateDTO<?>> extends ExploratoryBaseDTO<T> {
+
+
+    @JsonProperty("git_creds")
+    private List<ExploratoryGitCreds> gitCreds;
+    @JsonProperty("notebook_image_name")
+    private String imageName;
+    @JsonProperty("spark_configurations")
+    private List<ClusterConfig> clusterConfig;
+    @JsonProperty("tags")
+    private Map<String, String> tags;
+    @JsonProperty("endpoint_name")
+    private String endpoint;
+    @JsonProperty("conf_shared_image_enabled")
+    private String sharedImageEnabled;
+    @JsonProperty("gpu_enabled")
+    private Boolean enabledGPU;
+    @JsonProperty("gpuType")
+    private String gpuType;
+    @JsonProperty("gpuCount")
+    private String gpuCount;
+
+    /**
+     * Return the list of GIT credentials.
+     */
+    public List<ExploratoryGitCreds> getGitCreds() {
+        return gitCreds;
+    }
+
+    /**
+     * Set the list of GIT credentials.
+     */
+    public void setGitCreds(List<ExploratoryGitCreds> gitCreds) {
+        this.gitCreds = gitCreds;
+    }
+
+    /**
+     * Set the list of GIT credentials and return this object.
+     */
+    @SuppressWarnings("unchecked")
+    public T withGitCreds(List<ExploratoryGitCreds> gitCreds) {
+        setGitCreds(gitCreds);
+        return (T) this;
+    }
+
+    /**
+     * Set the image name and return this object.
+     */
+    @SuppressWarnings("unchecked")
+    public T withImageName(String imageName) {
+        setImageName(imageName);
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T withTags(Map<String, String> tags) {
+        this.tags = tags;
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+
+    @Override
+    public T withEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+
+    public T withSharedImageEnabled(String sharedImageEnabled) {
+        this.sharedImageEnabled = sharedImageEnabled;
+        return (T) this;
+    }
+
+    public String getImageName() {
+        return imageName;
+    }
+
+    public void setImageName(String imageName) {
+        this.imageName = imageName;
+    }
+
+    @SuppressWarnings("unchecked")
+
+    public T withClusterConfig(List<ClusterConfig> config) {
+        this.clusterConfig = config;
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+
+    public T withEnabledGPU(Boolean enabledGPU) {
+        setEnabledGPU(enabledGPU);
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T withGPUCount(String gpuCount) {
+        setGpuCount(gpuCount);
+        return (T) this;
+    }
+
+    @SuppressWarnings("unchecked")
+    public T withGPUType(String gpuType) {
+        setGpuType(gpuType);
+        return (T) this;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("gitCreds", gitCreds)
+                .add("imageName", imageName);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryGitCreds.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryGitCreds.java
new file mode 100644
index 0000000..2d251a0
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryGitCreds.java
@@ -0,0 +1,193 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import javax.annotation.Nullable;
+import javax.validation.constraints.NotNull;
+
+/**
+ * Describe GIT credentials.
+ */
+public class ExploratoryGitCreds implements Comparable<ExploratoryGitCreds> {
+
+    @NotNull
+    @JsonProperty
+    private String hostname;
+
+    @NotNull
+    @JsonProperty
+    private String username;
+
+    @NotNull
+    @JsonProperty
+    private String email;
+
+    @NotNull
+    @JsonProperty
+    private String login;
+
+    @JsonProperty
+    private String password;
+
+    /**
+     * Return the name of host.
+     */
+    public String getHostname() {
+        return hostname;
+    }
+
+    /**
+     * Set the name of host.
+     */
+    public void setHostname(String hostname) {
+        this.hostname = hostname;
+    }
+
+    /**
+     * Set the name of host.
+     */
+    public ExploratoryGitCreds withHostname(String hostname) {
+        setHostname(hostname);
+        return this;
+    }
+
+    /**
+     * Return the name of user.
+     */
+    public String getUsername() {
+        return username;
+    }
+
+    /**
+     * Set the name of user.
+     */
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    /**
+     * Set the name of user.
+     */
+    public ExploratoryGitCreds withUsername(String username) {
+        setUsername(username);
+        return this;
+    }
+
+    /**
+     * Return the email.
+     */
+    public String getEmail() {
+        return email;
+    }
+
+    /**
+     * Set the email.
+     */
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    /**
+     * Set the email.
+     */
+    public ExploratoryGitCreds withEmail(String email) {
+        setEmail(email);
+        return this;
+    }
+
+    /**
+     * Return the login.
+     */
+    public String getLogin() {
+        return login;
+    }
+
+    /**
+     * Set the login.
+     */
+    public void setLogin(String login) {
+        this.login = login;
+    }
+
+    /**
+     * Set the login.
+     */
+    public ExploratoryGitCreds withLogin(String login) {
+        setLogin(login);
+        return this;
+    }
+
+    /**
+     * Return the password.
+     */
+    public String getPassword() {
+        return password;
+    }
+
+    /**
+     * Set the password.
+     */
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    /**
+     * Set the password.
+     */
+    public ExploratoryGitCreds withPassword(String password) {
+        setPassword(password);
+        return this;
+    }
+
+    @Override
+    public int compareTo(@Nullable ExploratoryGitCreds obj) {
+        if (obj == null) {
+            return 1;
+        }
+        return this.hostname.compareToIgnoreCase(obj.hostname);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        return (obj instanceof ExploratoryGitCreds && (this.compareTo((ExploratoryGitCreds) obj) == 0));
+
+    }
+
+    @Override
+    public int hashCode() {
+        return getHostname() != null ? getHostname().hashCode() : 0;
+    }
+
+    @Override
+    public String toString() {
+        return "ExploratoryGitCreds{" +
+                "hostname='" + hostname + '\'' +
+                ", username='" + username + '\'' +
+                ", email='" + email + '\'' +
+                ", login='" + login + '\'' +
+                ", password='" + "***" + '\'' +
+                '}';
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryGitCredsDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryGitCredsDTO.java
new file mode 100644
index 0000000..6a1447b
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryGitCredsDTO.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Stores info about the GIT credentials.
+ */
+public class ExploratoryGitCredsDTO {
+    @JsonProperty("git_creds")
+    private List<ExploratoryGitCreds> gitCreds;
+
+    /**
+     * Return the list of GIT credentials.
+     */
+    public List<ExploratoryGitCreds> getGitCreds() {
+        return gitCreds;
+    }
+
+    /**
+     * Set the list of GIT credentials and check the unique for host names.
+     */
+    public void setGitCreds(List<ExploratoryGitCreds> gitCreds) {
+        if (gitCreds != null) {
+            Collections.sort(gitCreds);
+            for (int i = 1; i < gitCreds.size(); i++) {
+                if (gitCreds.get(i).equals(gitCreds.get(i - 1))) {
+                    throw new IllegalArgumentException("Duplicate found for host name in git credentials: " + gitCreds.get(i).getHostname());
+                }
+            }
+        }
+        this.gitCreds = gitCreds;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("gitCreds", gitCreds)
+                .toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryGitCredsUpdateDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryGitCredsUpdateDTO.java
new file mode 100644
index 0000000..2de41e8
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryGitCredsUpdateDTO.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import java.util.List;
+
+/**
+ * Store GIT credentials which should be updated on exploratory.
+ */
+public class ExploratoryGitCredsUpdateDTO extends ExploratoryActionDTO<ExploratoryGitCredsUpdateDTO> {
+    @JsonProperty("git_creds")
+    private List<ExploratoryGitCreds> gitCreds;
+
+    /**
+     * Return the list of GIT credentials.
+     */
+    public List<ExploratoryGitCreds> getGitCreds() {
+        return gitCreds;
+    }
+
+    /**
+     * Set the list of GIT credentials.
+     */
+    public void setGitCreds(List<ExploratoryGitCreds> gitCreds) {
+        this.gitCreds = gitCreds;
+    }
+
+    /**
+     * Set the list of GIT credentials and return this object.
+     */
+    public ExploratoryGitCredsUpdateDTO withGitCreds(List<ExploratoryGitCreds> gitCreds) {
+        setGitCreds(gitCreds);
+        return this;
+    }
+
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("gitCreds", gitCreds);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryImageDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryImageDTO.java
new file mode 100644
index 0000000..2b898c8
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryImageDTO.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class ExploratoryImageDTO extends ExploratoryActionDTO<ExploratoryImageDTO> {
+
+    @JsonProperty("notebook_image_name")
+    private String imageName;
+
+    @JsonProperty("tags")
+    private Map<String, String> tags;
+    @JsonProperty("endpoint_name")
+    private String endpoint;
+    @JsonProperty("conf_shared_image_enabled")
+    private String sharedImageEnabled;
+
+    public ExploratoryImageDTO withImageName(String imageName) {
+        this.imageName = imageName;
+        return this;
+    }
+
+    public ExploratoryImageDTO withTags(Map<String, String> tags) {
+        this.tags = tags;
+        return this;
+    }
+
+    @Override
+    public ExploratoryImageDTO withEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+        return this;
+    }
+
+    public ExploratoryImageDTO withSharedImageEnabled(String sharedImageEnabled) {
+        this.sharedImageEnabled = sharedImageEnabled;
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("imageName", imageName);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryReconfigureSparkClusterActionDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryReconfigureSparkClusterActionDTO.java
new file mode 100644
index 0000000..c0f41c7
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryReconfigureSparkClusterActionDTO.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+
+public class ExploratoryReconfigureSparkClusterActionDTO extends ExploratoryActionDTO<ExploratoryReconfigureSparkClusterActionDTO> {
+
+    @JsonProperty("spark_configurations")
+    private List<ClusterConfig> config;
+    @JsonProperty("azure_user_refresh_token")
+    private String azureUserRefreshToken;
+
+    public ExploratoryReconfigureSparkClusterActionDTO withConfig(List<ClusterConfig> config) {
+        this.config = config;
+        return this;
+    }
+
+    public ExploratoryReconfigureSparkClusterActionDTO withAzureUserRefreshToken(String azureUserRefreshToken) {
+        this.azureUserRefreshToken = azureUserRefreshToken;
+        return this;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryStatusDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryStatusDTO.java
new file mode 100644
index 0000000..cc47e46
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ExploratoryStatusDTO.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.StatusEnvBaseDTO;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import java.util.Date;
+import java.util.List;
+
+public class ExploratoryStatusDTO extends StatusEnvBaseDTO<ExploratoryStatusDTO> {
+    @JsonProperty("exploratory_url")
+    private List<ResourceURL> resourceUrl;
+    @JsonProperty("exploratory_user")
+    private String exploratoryUser;
+    @JsonProperty("exploratory_pass")
+    private String exploratoryPassword;
+    @JsonProperty("private_ip")
+    private String privateIp;
+    @JsonProperty("last_activity")
+    private Date lastActivity;
+    @JsonProperty
+    private List<ClusterConfig> config;
+
+    public String getPrivateIp() {
+        return privateIp;
+    }
+
+    public void setPrivateIp(String privateIp) {
+        this.privateIp = privateIp;
+    }
+
+    public ExploratoryStatusDTO withPrivateIp(String privateIp) {
+        setPrivateIp(privateIp);
+        return this;
+    }
+
+    public List<ResourceURL> getResourceUrl() {
+        return resourceUrl;
+    }
+
+    public void setResourceUrl(List<ResourceURL> resourceUrl) {
+        this.resourceUrl = resourceUrl;
+    }
+
+    public ExploratoryStatusDTO withExploratoryUrl(List<ResourceURL> resourceUrl) {
+        setResourceUrl(resourceUrl);
+        return this;
+    }
+
+    public String getExploratoryUser() {
+        return exploratoryUser;
+    }
+
+    public void setExploratoryUser(String exploratoryUser) {
+        this.exploratoryUser = exploratoryUser;
+    }
+
+    public ExploratoryStatusDTO withExploratoryUser(String exploratoryUser) {
+        setExploratoryUser(exploratoryUser);
+        return this;
+    }
+
+    public String getExploratoryPassword() {
+        return exploratoryPassword;
+    }
+
+    public void setExploratoryPassword(String exploratoryPassword) {
+        this.exploratoryPassword = exploratoryPassword;
+    }
+
+    public ExploratoryStatusDTO withExploratoryPassword(String exploratoryPassword) {
+        setExploratoryPassword(exploratoryPassword);
+        return this;
+    }
+
+    public ExploratoryStatusDTO withConfig(List<ClusterConfig> config) {
+        this.config = config;
+        return this;
+    }
+
+    public List<ClusterConfig> getConfig() {
+        return config;
+    }
+
+    public ExploratoryStatusDTO withLastActivity(Date lastActivity) {
+        this.lastActivity = lastActivity;
+        return this;
+    }
+
+    public Date getLastActivity() {
+        return lastActivity;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("exploratoryUrl", resourceUrl)
+                .add("exploratoryUser", exploratoryUser)
+                .add("exploratoryPassword", exploratoryPassword)
+                .add("config", config);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ImageCreateStatusDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ImageCreateStatusDTO.java
new file mode 100644
index 0000000..a175012
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ImageCreateStatusDTO.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.epam.datalab.dto.StatusBaseDTO;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+public class ImageCreateStatusDTO extends StatusBaseDTO<ImageCreateStatusDTO> {
+
+    private ImageCreateDTO imageCreateDTO;
+    private String name;
+    private String exploratoryName;
+    private String project;
+    private String endpoint;
+
+    public ImageCreateStatusDTO withImageCreateDto(ImageCreateDTO imageCreateDto) {
+        setImageCreateDTO(imageCreateDto);
+        return this;
+    }
+
+    public ImageCreateStatusDTO withoutImageCreateDto() {
+        setImageCreateDTO(new ImageCreateDTO());
+        return this;
+    }
+
+    @Data
+    @ToString
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    @NoArgsConstructor
+    public static class ImageCreateDTO {
+        private String externalName;
+        private String fullName;
+        private String user;
+        private String application;
+        private ImageStatus status;
+        private String ip;
+
+        @JsonCreator
+        public ImageCreateDTO(@JsonProperty("notebook_image_name") String externalName,
+                              @JsonProperty("full_image_name") String fullName,
+                              @JsonProperty("user_name") String user, @JsonProperty("application") String application,
+                              @JsonProperty("status") ImageStatus status, @JsonProperty("ip") String ip) {
+            this.externalName = externalName;
+            this.fullName = fullName;
+            this.user = user;
+            this.application = application;
+            this.status = status;
+            this.ip = ip;
+        }
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ImageStatus.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ImageStatus.java
new file mode 100644
index 0000000..90e3edf
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/ImageStatus.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+
+import java.util.Arrays;
+
+public enum ImageStatus {
+    CREATING,
+    CREATED,
+    FAILED;
+
+    @JsonCreator
+    public static ImageStatus fromValue(final String status) {
+        return Arrays.stream(ImageStatus.values())
+                .filter(s -> s.name().equalsIgnoreCase(status))
+                .findAny()
+                .orElseThrow(() -> new IllegalArgumentException(String.format("Wrong value for image status: %s",
+                        status)));
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibInstallDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibInstallDTO.java
new file mode 100644
index 0000000..9cec6cd
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibInstallDTO.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * Stores info about libraries.
+ */
+@Data
+@NoArgsConstructor
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class LibInstallDTO {
+    @JsonProperty
+    private String group;
+
+    @JsonProperty
+    private String name;
+
+    @JsonProperty
+    private String version;
+
+    @JsonProperty
+    private String status;
+
+    @JsonProperty("error_message")
+    private String errorMessage;
+
+    @JsonProperty
+    private boolean override;
+
+    @JsonProperty("available_versions")
+    private List<String> availableVersions;
+
+    @JsonProperty("add_pkgs")
+    private List<String> addedPackages;
+
+    public LibInstallDTO(String group, String name, String version) {
+        this.group = group;
+        this.name = name;
+        this.version = version;
+    }
+
+    public LibInstallDTO withName(String name) {
+        setName(name);
+        return this;
+    }
+
+    public LibInstallDTO withStatus(String status) {
+        setStatus(status);
+        return this;
+    }
+
+    public LibInstallDTO withErrorMessage(String errorMessage) {
+        setErrorMessage(errorMessage);
+        return this;
+    }
+
+    public LibInstallDTO withAddedPackages(List<String> addedPackages) {
+        setAddedPackages(addedPackages);
+        return this;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibInstallStatusDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibInstallStatusDTO.java
new file mode 100644
index 0000000..319f9d9
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibInstallStatusDTO.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package com.epam.datalab.dto.exploratory;
+
+import com.epam.datalab.dto.StatusEnvBaseDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class LibInstallStatusDTO extends StatusEnvBaseDTO<LibInstallStatusDTO> {
+    @JsonProperty
+    private List<LibInstallDTO> libs;
+
+    @JsonProperty
+    private String computationalName;
+
+
+    public LibInstallStatusDTO withLibs(List<LibInstallDTO> libs) {
+        setLibs(libs);
+        return this;
+    }
+
+    public LibInstallStatusDTO withComputationalName(String computationalName) {
+        setComputationalName(computationalName);
+        return this;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("libs", libs)
+                .add("computationalName", computationalName);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibListStatusDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibListStatusDTO.java
new file mode 100644
index 0000000..402e03b
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibListStatusDTO.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.epam.datalab.dto.StatusBaseDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Stores the info about group libraries.
+ */
+@Getter
+@Setter
+public class LibListStatusDTO extends StatusBaseDTO<LibListStatusDTO> {
+
+    @JsonProperty
+    private String libs;
+
+    @JsonProperty
+    private String group;
+
+    /**
+     * Set the list of libraries and return this object
+     */
+    public LibListStatusDTO withLibs(String libs) {
+        setLibs(libs);
+        return this;
+    }
+
+    /**
+     * Set the name of group and return this object
+     */
+    public LibListStatusDTO withGroup(String group) {
+        setGroup(group);
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("group", group)
+                .add("libs", (libs != null) ? "..." : null);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibStatus.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibStatus.java
new file mode 100644
index 0000000..104ff77
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibStatus.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.dto.exploratory;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+
+/**
+ * Statuses for the libraries.
+ */
+public enum LibStatus {
+    INSTALLING,
+    INSTALLED,
+    INVALID_VERSION,
+    INVALID_NAME,
+    INSTALLATION_ERROR;
+
+    @JsonCreator
+    public static LibStatus of(String status) {
+        if (status != null) {
+            for (LibStatus uis : LibStatus.values()) {
+                if (status.equalsIgnoreCase(uis.toString())) {
+                    return uis;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return super.toString().toLowerCase();
+    }
+}
\ No newline at end of file
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibraryInstallDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibraryInstallDTO.java
new file mode 100644
index 0000000..329a0ff
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/exploratory/LibraryInstallDTO.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.exploratory;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.util.List;
+
+/**
+ * Store info about libraries which user should be installed.
+ */
+@Getter
+@Setter
+@ToString(callSuper = true)
+public class LibraryInstallDTO extends ExploratoryActionDTO<LibraryInstallDTO> {
+    @JsonProperty("libs")
+    private List<LibInstallDTO> libs;
+
+    @JsonProperty("computational_id")
+    private String computationalId;
+
+    @JsonProperty("computational_image")
+    private String computationalImage;
+
+    @JsonProperty("computational_name")
+    private String computationalName;
+
+    public LibraryInstallDTO withLibs(List<LibInstallDTO> libs) {
+        setLibs(libs);
+        return this;
+    }
+
+    public LibraryInstallDTO withComputationalId(String computationalId) {
+        setComputationalId(computationalId);
+        return this;
+    }
+
+    public LibraryInstallDTO withComputationalImage(String computationalImage) {
+        setComputationalImage(computationalImage);
+        return this;
+    }
+
+    public LibraryInstallDTO withComputationalName(String computationalName) {
+        setComputationalName(computationalName);
+        return this;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/GcpCloudSettings.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/GcpCloudSettings.java
new file mode 100644
index 0000000..8d621f7
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/GcpCloudSettings.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.gcp;
+
+import com.epam.datalab.dto.base.CloudSettings;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Builder
+@AllArgsConstructor
+public class GcpCloudSettings extends CloudSettings {
+
+    @JsonProperty("gcp_iam_user")
+    private String gcpIamUser;
+    @JsonProperty("ldap_hostname")
+    protected String ldapHost;
+    @JsonProperty("ldap_dn")
+    protected String ldapDn;
+    @JsonProperty("ldap_ou")
+    protected String ldapOu;
+    @JsonProperty("ldap_service_username")
+    protected String ldapUser;
+    @JsonProperty("ldap_service_password")
+    protected String ldapPassword;
+    @JsonProperty("conf_os_family")
+    protected String os;
+    @JsonProperty("conf_cloud_provider")
+    protected String cloud;
+    @JsonProperty("conf_service_base_name")
+    protected String sbn;
+    @JsonProperty("conf_key_dir")
+    protected String confKeyDir;
+    @JsonProperty("gcp_project_id")
+    protected String projectId;
+    @JsonProperty("gcp_vpc_name")
+    protected String vpcName;
+    @JsonProperty("gcp_subnet_name")
+    protected String subnetName;
+    @JsonProperty("gcp_zone")
+    protected String zone;
+    @JsonProperty("gcp_region")
+    protected String region;
+    @JsonProperty("conf_image_enabled")
+    private String imageEnabled;
+    @JsonProperty("conf_stepcerts_enabled")
+    private String stepCertsEnabled;
+    @JsonProperty("conf_stepcerts_root_ca")
+    private String stepCertsRootCA;
+    @JsonProperty("conf_stepcerts_kid")
+    private String stepCertsKid;
+    @JsonProperty("conf_stepcerts_kid_password")
+    private String stepCertsKidPassword;
+    @JsonProperty("conf_stepcerts_ca_url")
+    private String stepCertsCAURL;
+    @JsonProperty("keycloak_auth_server_url")
+    private String keycloakAuthServerUrl;
+    @JsonProperty("keycloak_realm_name")
+    private String keycloakRealmName;
+    @JsonProperty("keycloak_user")
+    private String keycloakUser;
+    @JsonProperty("keycloak_user_password")
+    private String keycloakUserPassword;
+
+    @Override
+    @JsonIgnore
+    public String getIamUser() {
+        return gcpIamUser;
+    }
+}
\ No newline at end of file
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/auth/GcpOauth2AuthorizationCodeResponse.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/auth/GcpOauth2AuthorizationCodeResponse.java
new file mode 100644
index 0000000..28c115a
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/auth/GcpOauth2AuthorizationCodeResponse.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.gcp.auth;
+
+import lombok.Data;
+
+@Data
+public class GcpOauth2AuthorizationCodeResponse {
+    private final String code;
+    private final String state;
+    private final String errorMessage;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/ComputationalCreateGcp.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/ComputationalCreateGcp.java
new file mode 100644
index 0000000..f45da42
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/ComputationalCreateGcp.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.gcp.computational;
+
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+public class ComputationalCreateGcp extends ComputationalBase<ComputationalCreateGcp> {
+    @JsonProperty("dataproc_master_count")
+    private String masterInstanceCount;
+    @JsonProperty("dataproc_slave_count")
+    private String slaveInstanceCount;
+    @JsonProperty("dataproc_master_instance_type")
+    private String masterInstanceType;
+    @JsonProperty("dataproc_slave_instance_type")
+    private String slaveInstanceType;
+    @JsonProperty("dataproc_preemptible_count")
+    private String preemptibleCount;
+    @JsonProperty("dataproc_version")
+    private String version;
+    @JsonProperty("conf_shared_image_enabled")
+    private String sharedImageEnabled;
+    @JsonProperty("master_gpu_type")
+    private String masterGPUType;
+    @JsonProperty("slave_gpu_type")
+    private String slaveGPUType;
+    @JsonProperty("master_gpu_count")
+    private String masterGPUCount;
+    @JsonProperty("slave_gpu_count")
+    private String slaveGPUCount;
+
+
+    public ComputationalCreateGcp withMasterGPUType(String masterGPUType) {
+        this.masterGPUType = masterGPUType;
+        return this;
+    }
+
+    public ComputationalCreateGcp withSlaveGPUType(String slaveGPUType) {
+        this.slaveGPUType = slaveGPUType;
+        return this;
+    }
+
+    public ComputationalCreateGcp withMasterGPUCount(String masterGPUCount) {
+        this.masterGPUCount = masterGPUCount;
+        return this;
+    }
+
+    public ComputationalCreateGcp withSlaveGPUCount(String slaveGPUCount) {
+        this.slaveGPUCount = slaveGPUCount;
+        return this;
+    }
+
+    public String getSlaveGPUCount() {
+        return slaveGPUCount;
+    }
+
+    public String getMasterGPUCount() {
+        return masterGPUCount;
+    }
+
+    public String getSlaveGPUType() {
+        return slaveGPUType;
+    }
+
+    public String getMasterGPUType() {
+        return masterGPUType;
+    }
+
+    public ComputationalCreateGcp withMasterInstanceCount(String masterInstanceCount) {
+        this.masterInstanceCount = masterInstanceCount;
+        return this;
+    }
+
+    public ComputationalCreateGcp withSlaveInstanceCount(String slaveInstanceCount) {
+        this.slaveInstanceCount = slaveInstanceCount;
+        return this;
+    }
+
+    public ComputationalCreateGcp withMasterInstanceType(String masterInstanceType) {
+        this.masterInstanceType = masterInstanceType;
+        return this;
+    }
+
+    public ComputationalCreateGcp withSlaveInstanceType(String slaveInstanceType) {
+        this.slaveInstanceType = slaveInstanceType;
+        return this;
+    }
+
+    public ComputationalCreateGcp withPreemptibleCount(String preemptibleCount) {
+        this.preemptibleCount = preemptibleCount;
+        return this;
+    }
+
+    public ComputationalCreateGcp withVersion(String version) {
+        this.version = version;
+        return this;
+    }
+
+    public String getSharedImageEnabled() {
+        return sharedImageEnabled;
+    }
+
+    public void setSharedImageEnabled(String sharedImageEnabled) {
+        this.sharedImageEnabled = sharedImageEnabled;
+    }
+
+    public ComputationalCreateGcp withSharedImageEnabled(String sharedImageEnabled) {
+        setSharedImageEnabled(sharedImageEnabled);
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("version", version)
+                .add("masterInstanceType", masterInstanceType)
+                .add("slaveInstanceType", slaveInstanceType)
+                .add("masterInstanceCount", masterInstanceCount)
+                .add("slaveInstanceCount", slaveInstanceCount)
+                .add("preemptibleCount", preemptibleCount);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/GcpComputationalResource.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/GcpComputationalResource.java
new file mode 100644
index 0000000..d38c44f
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/GcpComputationalResource.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.gcp.computational;
+
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.ToString;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Stores info about the user's computational resources for notebook.
+ */
+@ToString(callSuper = true)
+@Getter
+@EqualsAndHashCode(callSuper = true)
+public class GcpComputationalResource extends UserComputationalResource {
+
+    @JsonProperty("instance_id")
+    private final String instanceId;
+    @JsonProperty("master_node_shape")
+    private final String masterShape;
+    @JsonProperty("slave_node_shape")
+    private final String slaveShape;
+    @JsonProperty("total_slave_instance_number")
+    private final String slaveNumber;
+    @JsonProperty("total_master_instance_number")
+    private final String masterNumber;
+    @JsonProperty("total_preemptible_number")
+    private final String preemptibleNumber;
+    @JsonProperty("dataproc_version")
+    private final String version;
+    @JsonProperty("master_gpu_type")
+    private final String masterGPUType;
+    @JsonProperty("master_gpu_count")
+    private final String masterGPUCount;
+    @JsonProperty("slave_gpu_type")
+    private final String slaveGPUType;
+    @JsonProperty("slave_gpu_count")
+    private final String slaveGPUCount;
+    private final Boolean enabledGPU;
+
+    @Builder
+    public GcpComputationalResource(String computationalName, String computationalId, String imageName,
+                                    String templateName, String status, Date uptime,
+                                    SchedulerJobDTO schedulerJobData, boolean reuploadKeyRequired,
+                                    String instanceId, String masterShape, String slaveShape, String slaveNumber,
+                                    String masterNumber, String preemptibleNumber, String version,
+                                    List<ResourceURL> resourceURL, LocalDateTime lastActivity,
+                                    Map<String, String> tags, int totalInstanceCount,
+                                    String masterGPUCount, String masterGPUType, String slaveGPUType, String slaveGPUCount, Boolean enabledGPU) {
+        super(computationalName, computationalId, imageName, templateName, status, uptime, schedulerJobData,
+                reuploadKeyRequired, resourceURL, lastActivity, tags, totalInstanceCount);
+        this.instanceId = instanceId;
+        this.masterShape = masterShape;
+        this.slaveShape = slaveShape;
+        this.slaveNumber = slaveNumber;
+        this.masterNumber = masterNumber;
+        this.version = version;
+        this.preemptibleNumber = preemptibleNumber;
+        this.masterGPUCount = masterGPUCount;
+        this.masterGPUType = masterGPUType;
+        this.slaveGPUType = slaveGPUType;
+        this.slaveGPUCount = slaveGPUCount;
+        this.enabledGPU = enabledGPU;
+        super.setMasterGpuCount(this.masterGPUCount);
+        super.setMasterGpuType(this.masterGPUType);
+        super.setSlaveGpuCount(this.slaveGPUCount);
+        super.setSlaveGpuType(this.slaveGPUType);
+        super.setEnabledGPU(enabledGPU);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/GcpComputationalTerminateDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/GcpComputationalTerminateDTO.java
new file mode 100644
index 0000000..83b20f9
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/GcpComputationalTerminateDTO.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.gcp.computational;
+
+import com.epam.datalab.dto.computational.ComputationalTerminateDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString(callSuper = true)
+public class GcpComputationalTerminateDTO extends ComputationalTerminateDTO {
+
+    @JsonProperty("dataproc_cluster_name")
+    private String clusterName;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/SparkComputationalCreateGcp.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/SparkComputationalCreateGcp.java
new file mode 100644
index 0000000..9c29196
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/computational/SparkComputationalCreateGcp.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.gcp.computational;
+
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.ToString;
+
+import java.util.List;
+
+
+@ToString
+public class SparkComputationalCreateGcp extends ComputationalBase<SparkComputationalCreateGcp> {
+
+    @JsonProperty("dataengine_instance_count")
+    private String dataengineInstanceCount;
+    @JsonProperty("gcp_dataengine_master_size")
+    private String masterDataEngineInstanceShape;
+    @JsonProperty("gcp_dataengine_slave_size")
+    private String slaveDtaEngineInstanceShape;
+
+    @JsonProperty("master_gpu_type")
+    private String masterGPUType;
+    @JsonProperty("slave_gpu_type")
+    private String slaveGPUType;
+    @JsonProperty("master_gpu_count")
+    private String masterGPUCount;
+    @JsonProperty("slave_gpu_count")
+    private String slaveGPUCount;
+
+
+    @JsonProperty("spark_configurations")
+    private List<ClusterConfig> config;
+    @JsonProperty("conf_shared_image_enabled")
+    private String sharedImageEnabled;
+
+    public SparkComputationalCreateGcp withDataengineInstanceCount(String dataengineInstanceCount) {
+        this.dataengineInstanceCount = dataengineInstanceCount;
+        return this;
+    }
+
+    public SparkComputationalCreateGcp withDataEngineSlaveSize(String dataEngineSlaveSize) {
+        this.slaveDtaEngineInstanceShape = dataEngineSlaveSize;
+        return this;
+    }
+
+    public SparkComputationalCreateGcp withDataEngineMasterSize(String dataEngineMasterSize) {
+        this.masterDataEngineInstanceShape = dataEngineMasterSize;
+        return this;
+    }
+
+    public SparkComputationalCreateGcp withMasterGPUType(String masterGPUType) {
+        this.masterGPUType = masterGPUType;
+        return this;
+    }
+
+    public SparkComputationalCreateGcp withSlaveGPUType(String slaveGPUType) {
+        this.slaveGPUType = slaveGPUType;
+        return this;
+    }
+
+    public SparkComputationalCreateGcp withMasterGPUCount(String masterGPUCount) {
+        this.masterGPUCount = masterGPUCount;
+        return this;
+    }
+
+    public SparkComputationalCreateGcp withSlaveGPUCount(String slaveGPUCount) {
+        this.slaveGPUCount = slaveGPUCount;
+        return this;
+    }
+
+    public SparkComputationalCreateGcp withConfig(List<ClusterConfig> config) {
+        this.config = config;
+        return this;
+    }
+
+    public SparkComputationalCreateGcp withSharedImageEnabled(String sharedImageEnabled) {
+        this.sharedImageEnabled = sharedImageEnabled;
+        return this;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/edge/EdgeCreateGcp.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/edge/EdgeCreateGcp.java
new file mode 100644
index 0000000..6df52f3
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/edge/EdgeCreateGcp.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.gcp.edge;
+
+import com.epam.datalab.dto.ResourceSysBaseDTO;
+
+public class EdgeCreateGcp extends ResourceSysBaseDTO<EdgeCreateGcp> {
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/edge/EdgeInfoGcp.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/edge/EdgeInfoGcp.java
new file mode 100644
index 0000000..490ce54
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/edge/EdgeInfoGcp.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.gcp.edge;
+
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class EdgeInfoGcp extends EdgeInfo {
+    @JsonProperty("user_own_bucket_name")
+    private String userOwnBucketName;
+    @JsonProperty("shared_bucket_name")
+    private String sharedBucketName;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/exploratory/ExploratoryCreateGcp.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/exploratory/ExploratoryCreateGcp.java
new file mode 100644
index 0000000..59e270b
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/exploratory/ExploratoryCreateGcp.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.gcp.exploratory;
+
+import com.epam.datalab.dto.exploratory.ExploratoryCreateDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.ws.rs.GET;
+
+@Getter
+@Setter
+public class ExploratoryCreateGcp extends ExploratoryCreateDTO<ExploratoryCreateGcp> {
+    @JsonProperty("gcp_notebook_instance_size")
+    private String notebookInstanceSize;
+
+    public ExploratoryCreateGcp withNotebookInstanceType(String notebookInstanceType) {
+        setNotebookInstanceSize(notebookInstanceType);
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("notebookInstanceSize", notebookInstanceSize);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/keyload/UploadFileGcp.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/keyload/UploadFileGcp.java
new file mode 100644
index 0000000..d10ea83
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/gcp/keyload/UploadFileGcp.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.gcp.keyload;
+
+import com.epam.datalab.dto.base.keyload.UploadFile;
+import com.epam.datalab.dto.gcp.edge.EdgeCreateGcp;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Data
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class UploadFileGcp extends UploadFile {
+    @JsonProperty
+    private final EdgeCreateGcp edge;
+
+    @JsonCreator
+    public UploadFileGcp(@JsonProperty("edge") EdgeCreateGcp edge, @JsonProperty("content") String content) {
+        super(content);
+        this.edge = edge;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ApplicationDto.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ApplicationDto.java
new file mode 100644
index 0000000..4023cab
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ApplicationDto.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.imagemetadata;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.*;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ApplicationDto {
+    @JsonProperty("Version")
+    private String version;
+    @JsonProperty("Name")
+    private String name;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalMetadataDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalMetadataDTO.java
new file mode 100644
index 0000000..eb5d540
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalMetadataDTO.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.imagemetadata;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@JsonIgnoreProperties
+public class ComputationalMetadataDTO extends ImageMetadataDTO {
+    @JsonProperty
+    protected String image;
+    @JsonProperty("template_name")
+    private String templateName;
+    @JsonProperty
+    private String description;
+    @JsonProperty("environment_type")
+    private String type;
+    @JsonProperty
+    private List<TemplateDTO> templates;
+    @JsonProperty("request_id")
+    private String requestId;
+    @JsonProperty(value = "computation_resources_shapes")
+    private Map<String, List<ComputationalResourceShapeDto>> computationResourceShapes;
+
+    private List<String> computationGPU;
+
+    public ComputationalMetadataDTO(String imageName) {
+        this.image = imageName;
+        setImageType(ImageType.COMPUTATIONAL);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalResourceShapeDto.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalResourceShapeDto.java
new file mode 100644
index 0000000..c78a5eb
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ComputationalResourceShapeDto.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.imagemetadata;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+
+public class ComputationalResourceShapeDto {
+    @JsonProperty("Type")
+    private String type;
+    @JsonProperty("Size")
+    private String size;
+    @JsonProperty("Description")
+    private String description;
+    @JsonProperty("Ram")
+    private String ram;
+    @JsonProperty("Cpu")
+    private int cpu;
+    @JsonProperty("Spot")
+    private boolean spot = false;
+
+    @JsonProperty("SpotPctPrice")
+    private int spotPctPrice = 70;
+
+
+    public ComputationalResourceShapeDto() {
+    }
+
+    public ComputationalResourceShapeDto(String type, String size, String description, String ram, int cpu) {
+        this.type = type;
+        this.size = size;
+        this.description = description;
+        this.ram = ram;
+        this.cpu = cpu;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getSize() {
+        return size;
+    }
+
+    public void setSize(String size) {
+        this.size = size;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getRam() {
+        return ram;
+    }
+
+    public void setRam(String ram) {
+        this.ram = ram;
+    }
+
+    public int getCpu() {
+        return cpu;
+    }
+
+    public void setCpu(int cpu) {
+        this.cpu = cpu;
+    }
+
+    public boolean isSpot() {
+        return spot;
+    }
+
+    public void setSpot(boolean spot) {
+        this.spot = spot;
+    }
+
+    public int getSpotPctPrice() {
+        return spotPctPrice;
+    }
+
+    public void setSpotPctPrice(int spotPctPrice) {
+        this.spotPctPrice = spotPctPrice;
+    }
+
+    @Override
+    public String toString() {
+        return ReflectionToStringBuilder.toString(this);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/EdgeGPU.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/EdgeGPU.java
new file mode 100644
index 0000000..3ac03f0
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/EdgeGPU.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.imagemetadata;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class EdgeGPU {
+
+    private String projectName;
+    private List<String> gpus = new ArrayList<>();
+}
\ No newline at end of file
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryEnvironmentImages.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryEnvironmentImages.java
new file mode 100644
index 0000000..a02a451
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryEnvironmentImages.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.imagemetadata;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class ExploratoryEnvironmentImages {
+
+    @JsonProperty("Image family")
+    private String imageFamily;
+    @JsonProperty("Description")
+    private String description;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryEnvironmentVersion.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryEnvironmentVersion.java
new file mode 100644
index 0000000..2bc34e5
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryEnvironmentVersion.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package com.epam.datalab.dto.imagemetadata;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class ExploratoryEnvironmentVersion {
+    @JsonProperty("template_name")
+    private String templateName;
+    @JsonProperty
+    private String description;
+    @JsonProperty("environment_type")
+    private String type;
+    @JsonProperty("version")
+    private String version;
+    @JsonProperty("vendor")
+    private String vendor;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryMetadataDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryMetadataDTO.java
new file mode 100644
index 0000000..6a477e5
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ExploratoryMetadataDTO.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package com.epam.datalab.dto.imagemetadata;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@JsonIgnoreProperties
+public class ExploratoryMetadataDTO extends ImageMetadataDTO {
+    protected String image;
+    @JsonProperty("exploratory_environment_versions")
+    private List<ExploratoryEnvironmentVersion> exploratoryEnvironmentVersions;
+    @JsonProperty("exploratory_environment_shapes")
+    private HashMap<String, List<ComputationalResourceShapeDto>> exploratoryEnvironmentShapes;
+    @JsonProperty("exploratory_environment_images")
+    private List<ExploratoryEnvironmentImages> exploratoryEnvironmentImages;
+    @JsonProperty("request_id")
+    private String requestId;
+    private List<String> computationGPU;
+
+    public ExploratoryMetadataDTO(String imageName) {
+        this.image = imageName;
+        setImageType(ImageType.EXPLORATORY);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ImageMetadataDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ImageMetadataDTO.java
new file mode 100644
index 0000000..61c6d2b
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ImageMetadataDTO.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.imagemetadata;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.*;
+import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+
+/**
+ * Common parent for metadata DTO. Holds type information during
+ * runtime to make life easier when working with collection of metadatas or
+ * filtering by type. Shouldnt be used to hold common attributes for upstream
+ * hierarchy as it will requite type information to be serialized within json
+ * which is not we really want.
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public abstract class ImageMetadataDTO {
+    @JsonProperty("image_type")
+    private ImageType imageType;
+
+    public abstract void setImage(String image);
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ImageType.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ImageType.java
new file mode 100644
index 0000000..3175491
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/ImageType.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.imagemetadata;
+
+public enum ImageType {
+    COMPUTATIONAL("computational"),
+    EXPLORATORY("exploratory");
+
+    private String type;
+
+    ImageType(String type) {
+        this.type = type;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public static ImageType of(String type) {
+        if (type != null) {
+            for (ImageType value : ImageType.values()) {
+                if (type.equalsIgnoreCase(value.toString())) {
+                    return value;
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/TemplateDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/TemplateDTO.java
new file mode 100644
index 0000000..58a8987
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/imagemetadata/TemplateDTO.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.imagemetadata;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.*;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TemplateDTO {
+    @JsonProperty
+    private String version;
+    @JsonProperty
+    private List<ApplicationDto> applications;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/keyload/KeyLoadStatus.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/keyload/KeyLoadStatus.java
new file mode 100644
index 0000000..12f3683
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/keyload/KeyLoadStatus.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.keyload;
+
+import javax.ws.rs.core.Response;
+import java.util.Arrays;
+
+public enum KeyLoadStatus {
+    NONE("none", null, Response.Status.NOT_FOUND),
+    NEW("new", null, Response.Status.ACCEPTED),
+    SUCCESS("success", "ok", Response.Status.OK),
+    ERROR("error", "err", Response.Status.INTERNAL_SERVER_ERROR);
+
+    private String status;
+    private String value;
+    private Response.Status httpStatus;
+
+    KeyLoadStatus(String status, String value, Response.Status httpStatus) {
+        this.status = status;
+        this.value = value;
+        this.httpStatus = httpStatus;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public Response.Status getHttpStatus() {
+        return httpStatus;
+    }
+
+    public static boolean isSuccess(String value) {
+        return SUCCESS.value.equals(value);
+    }
+
+    public static String getStatus(boolean successed) {
+        return successed ? SUCCESS.status : ERROR.status;
+    }
+
+    public static KeyLoadStatus findByStatus(String status) {
+        return Arrays.stream(values()).reduce(NONE, (result, next) -> next.status.equalsIgnoreCase(status) ? next : result);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/keyload/UserKeyDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/keyload/UserKeyDTO.java
new file mode 100644
index 0000000..f17d50e
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/keyload/UserKeyDTO.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.keyload;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class UserKeyDTO {
+    @JsonProperty
+    private String content;
+    @JsonProperty
+    private String status;
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public UserKeyDTO withContent(String content) {
+        setContent(content);
+        return this;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public UserKeyDTO withStatus(String status) {
+        setStatus(status);
+        return this;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/odahu/ActionOdahuDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/odahu/ActionOdahuDTO.java
new file mode 100644
index 0000000..8ccdb55
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/odahu/ActionOdahuDTO.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.odahu;
+
+import com.epam.datalab.dto.ResourceBaseDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class ActionOdahuDTO extends ResourceBaseDTO<ActionOdahuDTO> {
+    @JsonProperty("odahu_cluster_name")
+    private final String name;
+    @JsonProperty("project_name")
+    private final String project;
+    @JsonProperty("endpoint_name")
+    private final String endpoint;
+    @JsonProperty("ssh_key")
+    private final String key;
+    @JsonProperty("grafana_admin")
+    private String grafanaAdmin;
+    @JsonProperty("grafana_pass")
+    private String grafanaPassword;
+    @JsonProperty("oauth_cookie_secret")
+    private String oauthCookieSecret;
+    @JsonProperty("odahuflow_connection_decrypt_token")
+    private String decryptToken;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/odahu/CreateOdahuDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/odahu/CreateOdahuDTO.java
new file mode 100644
index 0000000..2fa47bf
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/odahu/CreateOdahuDTO.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.odahu;
+
+import com.epam.datalab.dto.ResourceBaseDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class CreateOdahuDTO extends ResourceBaseDTO<CreateOdahuDTO> {
+    @JsonProperty("odahu_cluster_name")
+    private final String name;
+    @JsonProperty("project_name")
+    private final String project;
+    @JsonProperty("endpoint_name")
+    private final String endpoint;
+    @JsonProperty("ssh_key")
+    private final String key;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/project/ProjectActionDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/project/ProjectActionDTO.java
new file mode 100644
index 0000000..64ccc21
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/project/ProjectActionDTO.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.project;
+
+import com.epam.datalab.dto.ResourceBaseDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class ProjectActionDTO extends ResourceBaseDTO<ProjectActionDTO> {
+    @JsonProperty("project_name")
+    private final String name;
+    @JsonProperty("endpoint_name")
+    private final String endpoint;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/project/ProjectCreateDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/project/ProjectCreateDTO.java
new file mode 100644
index 0000000..09cbd46
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/project/ProjectCreateDTO.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.project;
+
+import com.epam.datalab.dto.ResourceBaseDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class ProjectCreateDTO extends ResourceBaseDTO<ProjectCreateDTO> {
+    private final String key;
+    @JsonProperty("project_name")
+    private final String name;
+    @JsonProperty("project_tag")
+    private final String tag;
+    @JsonProperty("endpoint_name")
+    private final String endpoint;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyCallbackDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyCallbackDTO.java
new file mode 100644
index 0000000..bb1aca7
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyCallbackDTO.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.reuploadkey;
+
+import com.epam.datalab.dto.ResourceSysBaseDTO;
+import com.epam.datalab.model.ResourceData;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import lombok.Getter;
+
+@Getter
+public class ReuploadKeyCallbackDTO extends ResourceSysBaseDTO<ReuploadKeyCallbackDTO> {
+
+    @JsonProperty
+    private ResourceData resource;
+
+    @JsonProperty("resource_id")
+    private String resourceId;
+
+    @JsonProperty
+    private String id;
+
+
+    public ReuploadKeyCallbackDTO withResource(ResourceData resource) {
+        this.resource = resource;
+        return this;
+    }
+
+    public ReuploadKeyCallbackDTO withId(String id) {
+        this.id = id;
+        return this;
+    }
+
+    public ReuploadKeyCallbackDTO withResourceId(String resourceId) {
+        this.resourceId = resourceId;
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("resource", resource)
+                .add("resource_id", resourceId)
+                .add("id", id);
+    }
+}
+
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyDTO.java
new file mode 100644
index 0000000..478f408
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyDTO.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.reuploadkey;
+
+import com.epam.datalab.dto.ResourceSysBaseDTO;
+import com.epam.datalab.model.ResourceData;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class ReuploadKeyDTO extends ResourceSysBaseDTO<ReuploadKeyDTO> {
+
+    @JsonProperty
+    private String content;
+
+    @JsonProperty
+    private List<ResourceData> resources;
+
+    @JsonProperty
+    private String id;
+
+
+    public ReuploadKeyDTO withContent(String content) {
+        this.content = content;
+        return this;
+    }
+
+    public ReuploadKeyDTO withResources(List<ResourceData> resources) {
+        this.resources = resources;
+        return this;
+    }
+
+    public ReuploadKeyDTO withId(String id) {
+        this.id = id;
+        return this;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyStatus.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyStatus.java
new file mode 100644
index 0000000..aa44103
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyStatus.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.dto.reuploadkey;
+
+import java.util.Arrays;
+
+public enum ReuploadKeyStatus {
+
+    COMPLETED("N/A"), FAILED("N/A");
+
+    private String message;
+
+    ReuploadKeyStatus(String message) {
+        this.message = message;
+    }
+
+    public ReuploadKeyStatus withErrorMessage(String message) {
+        this.message = message;
+        return this;
+    }
+
+    public String message() {
+        return message;
+    }
+
+    public static ReuploadKeyStatus fromValue(String value) {
+        return Arrays.stream(values())
+                .filter(v -> v.name().equalsIgnoreCase(value))
+                .findAny()
+                .orElseThrow(() ->
+                        new IllegalArgumentException("Wrong value for ReuploadKeyStatus: " + value));
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyStatusDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyStatusDTO.java
new file mode 100644
index 0000000..481d185
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/reuploadkey/ReuploadKeyStatusDTO.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.dto.reuploadkey;
+
+import com.epam.datalab.dto.StatusBaseDTO;
+import com.google.common.base.MoreObjects;
+import lombok.Getter;
+
+@Getter
+public class ReuploadKeyStatusDTO extends StatusBaseDTO<ReuploadKeyStatusDTO> {
+
+    private ReuploadKeyCallbackDTO reuploadKeyCallbackDTO;
+    private ReuploadKeyStatus reuploadKeyStatus;
+
+
+    public ReuploadKeyStatusDTO withReuploadKeyCallbackDto(ReuploadKeyCallbackDTO reuploadKeyCallbackDTO) {
+        this.reuploadKeyCallbackDTO = reuploadKeyCallbackDTO;
+        return this;
+    }
+
+    public ReuploadKeyStatusDTO withReuploadKeyStatus(ReuploadKeyStatus status) {
+        this.reuploadKeyStatus = status;
+        return this;
+    }
+
+    @Override
+    public MoreObjects.ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("reuploadKeyStatus", reuploadKeyStatus)
+                .add("reuploadKeyCallbackDTO", reuploadKeyCallbackDTO);
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/status/EnvResource.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/status/EnvResource.java
new file mode 100644
index 0000000..10b90ac
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/status/EnvResource.java
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.status;
+
+import com.epam.datalab.model.ResourceType;
+import com.epam.datalab.util.mongo.IsoLocalDateTimeDeSerializer;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * Describe the resource (host, cluster, storage) for check status in Cloud.
+ */
+@NoArgsConstructor
+@EqualsAndHashCode
+public class EnvResource {
+    @JsonProperty
+    private String id;
+    @JsonProperty
+    private String status;
+    @JsonProperty
+    private String name;
+    @JsonProperty
+    private ResourceType resourceType;
+    @JsonProperty("project_name")
+    private String project;
+    @JsonProperty("endpoint_name")
+    private String endpoint;
+    @JsonDeserialize(using = IsoLocalDateTimeDeSerializer.class)
+    @JsonProperty
+    private LocalDateTime lastActivity;
+
+    public EnvResource(String id, String name, ResourceType resourceType, String project, String endpoint) {
+        this.id = id;
+        this.name = name;
+        this.resourceType = resourceType;
+        this.project = project;
+        this.endpoint = endpoint;
+    }
+
+    /**
+     * Return the id of resource. instanceId for host, clusterId for cluster, path for storage.
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Set the id of resource. instanceId for host, clusterId for cluster, path for storage.
+     */
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    /**
+     * Set the id of resource. instanceId for host, clusterId for cluster, path for storage.
+     */
+    public EnvResource withId(String id) {
+        setId(id);
+        return this;
+    }
+
+    /**
+     * Return the status of resource.
+     */
+    public String getStatus() {
+        return status;
+    }
+
+    /**
+     * Set the status of resource.
+     */
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    /**
+     * Set the status of resource.
+     */
+    public EnvResource withStatus(String status) {
+        setStatus(status);
+        return this;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public ResourceType getResourceType() {
+        return resourceType;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public EnvResource withName(String name) {
+        setName(name);
+        return this;
+    }
+
+    public EnvResource withResourceType(ResourceType resourceType) {
+        setResourceType(resourceType);
+        return this;
+    }
+
+    public void setResourceType(ResourceType resourceType) {
+        this.resourceType = resourceType;
+    }
+
+    public LocalDateTime getLastActivity() {
+        return lastActivity;
+    }
+
+    public void setLastActivity(LocalDateTime lastActivity) {
+        this.lastActivity = lastActivity;
+    }
+
+    public EnvResource withLastActivity(LocalDateTime lastActivity) {
+        setLastActivity(lastActivity);
+        return this;
+    }
+
+    public String getProject() {
+        return project;
+    }
+
+    public void setProject(String project) {
+        this.project = project;
+    }
+
+    public EnvResource withProject(String project) {
+        setProject(project);
+        return this;
+    }
+
+    public String getEndpoint() {
+        return endpoint;
+    }
+
+    public void setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    public EnvResource withEndpoint(String endpoint) {
+        setEndpoint(endpoint);
+        return this;
+    }
+
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("id", id)
+                .add("status", status)
+                .add("name", name)
+                .add("project", project)
+                .add("endpoint", endpoint)
+                .add("resourceType", resourceType)
+                .add("lastActivity", lastActivity);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/status/EnvResourceList.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/status/EnvResourceList.java
new file mode 100644
index 0000000..0db1930
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/status/EnvResourceList.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.status;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * Describe the lists of resources (host, cluster, storage) for check status in Cloud.
+ */
+@Data
+@Builder
+@EqualsAndHashCode
+public class EnvResourceList {
+    @JsonProperty("host")
+    private List<EnvResource> hostList;
+    @JsonProperty("cluster")
+    private List<EnvResource> clusterList;
+
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("host", hostList)
+                .add("cluster", clusterList);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/dto/status/EnvStatusDTO.java b/services/datalab-model/src/main/java/com/epam/datalab/dto/status/EnvStatusDTO.java
new file mode 100644
index 0000000..5fee995
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/dto/status/EnvStatusDTO.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.status;
+
+import com.epam.datalab.dto.StatusBaseDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+/**
+ * Describe the lists of resources (host, cluster, storage) for check status in Cloud.
+ */
+public class EnvStatusDTO extends StatusBaseDTO<EnvStatusDTO> {
+    @JsonProperty("edge_list_resources")
+    private EnvResourceList resourceList;
+
+    /**
+     * Return the list of resources (hosts, clusters, storages).
+     */
+    public EnvResourceList getResourceList() {
+        return resourceList;
+    }
+
+    /**
+     * Set the list of resources (hosts, clusters, storages).
+     */
+    public void setResourceList(EnvResourceList resourceList) {
+        this.resourceList = resourceList;
+    }
+
+    /**
+     * Set the list of resources (hosts, clusters, storages).
+     */
+    public EnvStatusDTO withResourceList(EnvResourceList resourceList) {
+        setResourceList(resourceList);
+        return this;
+    }
+
+    @Override
+    public ToStringHelper toStringHelper(Object self) {
+        return super.toStringHelper(self)
+                .add("resourceList", resourceList);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/ResourceData.java b/services/datalab-model/src/main/java/com/epam/datalab/model/ResourceData.java
new file mode 100644
index 0000000..e4a4245
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/ResourceData.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.model;
+
+import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+@EqualsAndHashCode
+public class ResourceData {
+    private ResourceType resourceType;
+    private String resourceId;
+    private String exploratoryName;
+    private String computationalName;
+
+    public static ResourceData edgeResource(String resourceId) {
+        return new ResourceData(ResourceType.EDGE, resourceId, null, null);
+    }
+
+    public static ResourceData exploratoryResource(String resourceId, String exploratoryName) {
+        return new ResourceData(ResourceType.EXPLORATORY, resourceId, exploratoryName, null);
+    }
+
+    public static ResourceData computationalResource(String resourceId, String exploratoryName,
+                                                     String computationalName) {
+        return new ResourceData(ResourceType.COMPUTATIONAL, resourceId, exploratoryName, computationalName);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        if (resourceType == ResourceType.EDGE) {
+            return sb.append(resourceType.toString()).toString();
+        } else if (resourceType == ResourceType.EXPLORATORY) {
+            return sb.append(resourceType.toString()).append(" ").append(exploratoryName).toString();
+        } else if (resourceType == ResourceType.COMPUTATIONAL) {
+            return sb.append(resourceType.toString()).append(" ").append(computationalName)
+                    .append(" affiliated with exploratory ").append(exploratoryName).toString();
+        } else return "";
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/ResourceEnum.java b/services/datalab-model/src/main/java/com/epam/datalab/model/ResourceEnum.java
new file mode 100644
index 0000000..ce6017c
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/ResourceEnum.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.model;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public enum ResourceEnum {
+    EDGE_NODE("edge node"),
+    NOTEBOOK("notebook"),
+    ODAHU("odahu");
+
+    private String name;
+
+    ResourceEnum(String name) {
+        this.name = name;
+    }
+
+    @JsonValue
+    @Override
+    public String toString() {
+        return name;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/ResourceType.java b/services/datalab-model/src/main/java/com/epam/datalab/model/ResourceType.java
new file mode 100644
index 0000000..9926fe7
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/ResourceType.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.model;
+
+public enum ResourceType {
+    COMPUTATIONAL("computational_resource"),
+    EDGE("edge_node"),
+    EXPLORATORY("exploratory");
+
+    private final String name;
+
+    ResourceType(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return name;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/StringList.java b/services/datalab-model/src/main/java/com/epam/datalab/model/StringList.java
new file mode 100644
index 0000000..a62d9e1
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/StringList.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.model;
+
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.WebApplicationException;
+import java.util.ArrayList;
+
+@Slf4j
+public class StringList extends ArrayList<String> {
+    public StringList(String s) {
+        super();
+
+        for (String v : s.split(",")) {
+            try {
+                add(v.trim());
+            } catch (Exception e) {
+                log.error("Something went wrong. Reason {}", e.getMessage(), e);
+                throw new WebApplicationException(400);
+            }
+        }
+        if (isEmpty())
+            throw new WebApplicationException(400);
+    }
+
+    public static String valueOf(String s) {
+        return s;
+    }
+}
\ No newline at end of file
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/aws/BillingResourceType.java b/services/datalab-model/src/main/java/com/epam/datalab/model/aws/BillingResourceType.java
new file mode 100644
index 0000000..261fe5e
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/aws/BillingResourceType.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.model.aws;
+
+/**
+ * Billing resource types.
+ */
+public enum BillingResourceType {
+    COMPUTER,
+    CLUSTER,
+    STORAGE,
+    STORAGE_EBS,
+    STORAGE_BUCKET,
+    IP_ADDRESS,
+    OTHER;
+
+    public static BillingResourceType of(String string) {
+        if (string != null) {
+            for (BillingResourceType value : BillingResourceType.values()) {
+                if (string.equalsIgnoreCase(value.toString())) {
+                    return value;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Return the category of resource.
+     *
+     * @param resourceType the type of resource.
+     */
+    public static String category(BillingResourceType resourceType) {
+        switch (resourceType) {
+            case COMPUTER:
+                return "EC2";
+            case CLUSTER:
+                return "Compute";
+            case STORAGE:
+                return "Storage";
+            case STORAGE_EBS:
+                return "EBS";
+            case STORAGE_BUCKET:
+                return "S3";
+            case IP_ADDRESS:
+                return "Static";
+            default:
+                return "Other";
+        }
+    }
+
+    /**
+     * Return the category of resource.
+     */
+    public String category() {
+        return category(this);
+    }
+
+    @Override
+    public String toString() {
+        return super.toString().toUpperCase();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/aws/ReportLine.java b/services/datalab-model/src/main/java/com/epam/datalab/model/aws/ReportLine.java
new file mode 100644
index 0000000..cb41a5a
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/aws/ReportLine.java
@@ -0,0 +1,233 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.model.aws;
+
+import com.epam.datalab.exceptions.ParseException;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import java.util.LinkedHashMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * The line of billing report.
+ */
+public class ReportLine {
+    /**
+     * Patterns to calculate the type of resource in report line.
+     */
+    private static final Pattern pInstancceId = Pattern.compile("^i-[a-z0-9]{17}$");
+    private static final Pattern pVolumeId = Pattern.compile("^vol-[a-z0-9]{17}$");
+    private static final Pattern pIpAddress = Pattern.compile("^[1-9][0-9]{0,2}\\.[1-9][0-9]{0,2}\\.[1-9][0-9]{0,2}\\.[1-9][0-9]{0,2}$");
+    private static final Pattern pClusterId = Pattern.compile("j-[A-Z0-9]{12,13}$");
+
+    public static final String FIELD_DATALAB_ID = "datalab_id";
+    public static final String FIELD_USER_ID = "user";
+    public static final String FIELD_USAGE_DATE = "usage_date";
+    public static final String FIELD_PRODUCT = "product";
+    public static final String FIELD_USAGE_TYPE = "usage_type";
+    public static final String FIELD_USAGE = "usage";
+    public static final String FIELD_COST = "cost";
+    public static final String FIELD_CURRENCY_CODE = "currency_code";
+    public static final String FIELD_RESOURCE_TYPE = "resource_type";
+    public static final String FIELD_RESOURCE_ID = "resource_id";
+    public static final String FIELD_TAGS = "tags";
+
+    @JsonProperty
+    private String datalabId;
+
+    @JsonProperty
+    private String user;
+
+    @JsonProperty
+    private String usageDate;
+
+    @JsonProperty
+    private String usageIntervalEnd;
+
+    @JsonProperty
+    private String product;
+
+    @JsonProperty
+    private String usageType;
+
+    @JsonProperty
+    private double usage;
+
+    @JsonProperty
+    private double cost;
+
+    @JsonProperty
+    private String currencyCode;
+
+    @JsonProperty
+    private BillingResourceType resourceType;
+
+    @JsonProperty
+    private String resourceId;
+
+    @JsonProperty
+    private LinkedHashMap<String, String> tags;
+
+
+    public String getDatalabId() {
+        return datalabId;
+    }
+
+    public void setDatalabId(String datalabId) {
+        this.datalabId = datalabId;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    public String getUsageDate() {
+        return usageDate;
+    }
+
+    public void setUsageDate(String usageDate) {
+        this.usageDate = usageDate;
+    }
+
+    public String getProduct() {
+        return product;
+    }
+
+    public void setProduct(String product) {
+        this.product = product;
+    }
+
+    public String getUsageType() {
+        return usageType;
+    }
+
+    public void setUsageType(String usageType) {
+        this.usageType = usageType;
+    }
+
+    public double getUsage() {
+        return usage;
+    }
+
+    public void setUsage(double usage) {
+        this.usage = usage;
+    }
+
+    public double getCost() {
+        return cost;
+    }
+
+    public void setCost(double cost) {
+        this.cost = cost;
+    }
+
+    public String getCurrencyCode() {
+        return currencyCode;
+    }
+
+    public void setCurrencyCode(String currencyCode) {
+        this.currencyCode = currencyCode;
+    }
+
+    public String getResourceId() {
+        return resourceId;
+    }
+
+    public BillingResourceType getResourceType() {
+        return resourceType;
+    }
+
+    public LinkedHashMap<String, String> getTags() {
+        return tags;
+    }
+
+    public void setTags(LinkedHashMap<String, String> tags) {
+        this.tags = tags;
+    }
+
+    /**
+     * Calculate and set the type of resource and resource id.
+     *
+     * @throws ParseException
+     */
+    public void setResourceTypeId(String resourceTypeId) throws ParseException {
+        if (product == null) {
+            throw new ParseException("Property product is not set");
+        }
+
+        if ("Amazon Elastic MapReduce".equals(product) ||
+                "Amazon Simple Queue Service".equals(product)) {
+            resourceType = BillingResourceType.CLUSTER;
+            Matcher m = pClusterId.matcher(resourceTypeId);
+            resourceId = (m.find() ? m.group() : null);
+        } else {
+            if ("Amazon Elastic Compute Cloud".equals(product)) {
+                if (pInstancceId.matcher(resourceTypeId).find()) {
+                    resourceType = BillingResourceType.COMPUTER;
+                } else if (pVolumeId.matcher(resourceTypeId).find()) {
+                    resourceType = BillingResourceType.STORAGE_EBS;
+                } else if (pIpAddress.matcher(resourceTypeId).find()) {
+                    resourceType = BillingResourceType.IP_ADDRESS;
+                } else {
+                    resourceType = BillingResourceType.COMPUTER;
+                }
+            } else if ("Amazon Simple Storage Service".equals(product)) {
+                resourceType = BillingResourceType.STORAGE_BUCKET;
+            } else {
+                resourceType = BillingResourceType.OTHER;
+            }
+            resourceId = resourceTypeId;
+        }
+    }
+
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @param self the object to generate the string for (typically this), used only for its class name.
+     */
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add(FIELD_DATALAB_ID, datalabId)
+                .add(FIELD_USER_ID, user)
+                .add(FIELD_USAGE_DATE, usageDate)
+                .add(FIELD_PRODUCT, product)
+                .add(FIELD_USAGE_TYPE, usageType)
+                .add(FIELD_USAGE, usage)
+                .add(FIELD_COST, cost)
+                .add(FIELD_CURRENCY_CODE, currencyCode)
+                .add(FIELD_RESOURCE_TYPE, resourceType)
+                .add(FIELD_RESOURCE_ID, resourceId)
+                .add(FIELD_TAGS, tags);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .toString();
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/azure/AzureAuthFile.java b/services/datalab-model/src/main/java/com/epam/datalab/model/azure/AzureAuthFile.java
new file mode 100644
index 0000000..3503044
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/azure/AzureAuthFile.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.model.azure;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.ToString;
+
+@Getter
+@ToString(exclude = {"clientSecret"})
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class AzureAuthFile {
+    @JsonProperty
+    private String clientId;
+    @JsonProperty
+    private String clientSecret;
+    @JsonProperty
+    private String tenantId;
+    @JsonProperty
+    private String subscriptionId;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Exploratory.java b/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Exploratory.java
new file mode 100644
index 0000000..31c0e65
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Exploratory.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.model.exploratory;
+
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@Builder
+public class Exploratory {
+    private final String name;
+    private final String dockerImage;
+    private final String version;
+    private final String templateName;
+    private final String shape;
+    private String imageName;
+    private final String endpoint;
+    private final String project;
+    private final String exploratoryTag;
+    private final List<ClusterConfig> clusterConfig;
+    private Boolean enabledGPU;
+    private String gpuType;
+    private String gpuCount;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Image.java b/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Image.java
new file mode 100644
index 0000000..c8d3b2c
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/exploratory/Image.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.model.exploratory;
+
+import com.epam.datalab.dto.exploratory.ImageStatus;
+import com.epam.datalab.model.library.Library;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+@Builder
+public class Image {
+    private final String name;
+    private final String description;
+    private final ImageStatus status;
+    private final String exploratoryId;
+    private final String project;
+    private final String endpoint;
+    private final String user;
+    private final String fullName;
+    private final String externalName;
+    private final String application;
+    private final String dockerImage;
+    private final List<Library> libraries;
+    private final Map<String, List<Library>> computationalLibraries;
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/library/Library.java b/services/datalab-model/src/main/java/com/epam/datalab/model/library/Library.java
new file mode 100644
index 0000000..28ec026
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/library/Library.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.model.library;
+
+import com.epam.datalab.dto.exploratory.LibStatus;
+import com.epam.datalab.model.ResourceType;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Library {
+    private final String group;
+    private final String name;
+    private final String version;
+    private final LibStatus status;
+    @JsonProperty("error_message")
+    private final String errorMessage;
+    @JsonProperty("available_versions")
+    private List<String> availableVersions;
+    @JsonProperty("add_pkgs")
+    private List<String> addedPackages;
+    private String resourceName;
+    private ResourceType type;
+
+    public Library withType(ResourceType type) {
+        setType(type);
+        return this;
+    }
+
+    public Library withResourceName(String name) {
+        setResourceName(name);
+        return this;
+    }
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/scheduler/SchedulerJobData.java b/services/datalab-model/src/main/java/com/epam/datalab/model/scheduler/SchedulerJobData.java
new file mode 100644
index 0000000..47aea0e
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/scheduler/SchedulerJobData.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.model.scheduler;
+
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class SchedulerJobData {
+
+    @JsonProperty
+    private final String user;
+
+    @JsonProperty("exploratory_name")
+    private final String exploratoryName;
+
+    @JsonProperty("computational_name")
+    private final String computationalName;
+
+    @JsonProperty
+    private final String project;
+
+    @JsonProperty("scheduler_data")
+    private final SchedulerJobDTO jobDTO;
+}
+
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/DiskInfo.java b/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/DiskInfo.java
new file mode 100644
index 0000000..e354269
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/DiskInfo.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.model.systeminfo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class DiskInfo {
+
+    @JsonProperty
+    private String serialNumber;
+    @JsonProperty
+    private long usedByteSpace;
+    @JsonProperty
+    private long totalByteSpace;
+
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/MemoryInfo.java b/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/MemoryInfo.java
new file mode 100644
index 0000000..7cdb73d
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/MemoryInfo.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.model.systeminfo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class MemoryInfo {
+
+    @JsonProperty
+    private long availableMemory;
+    @JsonProperty
+    private long totalMemory;
+
+    private long swapTotal;
+    private long swapUsed;
+    private long pagesPageIn;
+    private long pagesPageOut;
+
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/OsInfo.java b/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/OsInfo.java
new file mode 100644
index 0000000..83181a7
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/OsInfo.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.model.systeminfo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class OsInfo {
+
+    @JsonProperty
+    private String manufacturer;
+    @JsonProperty
+    private String family;
+    @JsonProperty
+    private String version;
+    @JsonProperty
+    private String buildNumber;
+
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/ProcessorInfo.java b/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/ProcessorInfo.java
new file mode 100644
index 0000000..771626f
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/model/systeminfo/ProcessorInfo.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.model.systeminfo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class ProcessorInfo {
+
+    private String model;
+    private String family;
+
+    @JsonProperty
+    private String name;
+
+    private String id;
+    private String vendor;
+    private int logicalCoreCount;
+    private int physicalCoreCount;
+    private boolean isCpu64Bit;
+
+    @JsonProperty
+    private double currentSystemLoad;
+    @JsonProperty
+    private double systemLoadAverage;
+
+}
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/util/CloudSettingsDeserializer.java b/services/datalab-model/src/main/java/com/epam/datalab/util/CloudSettingsDeserializer.java
new file mode 100644
index 0000000..b031163
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/util/CloudSettingsDeserializer.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util;
+
+import com.epam.datalab.dto.aws.AwsCloudSettings;
+import com.epam.datalab.dto.azure.AzureCloudSettings;
+import com.epam.datalab.dto.base.CloudSettings;
+import com.epam.datalab.dto.gcp.GcpCloudSettings;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+@Slf4j
+public class CloudSettingsDeserializer extends JsonDeserializer<CloudSettings> {
+    @Override
+    public CloudSettings deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+        JsonNode jsonNode = p.readValueAsTree();
+
+        Map<String, String> mapJson = new HashMap<>();
+        for (Iterator<String> it = jsonNode.fieldNames(); it.hasNext(); ) {
+            String s = it.next();
+            mapJson.put(s, jsonNode.get(s).textValue());
+        }
+
+        try {
+            return createFromMap(detectCloudSettings(mapJson), mapJson);
+        } catch (IllegalAccessException e) {
+            log.error("Cannot deserialize object due to {}", e.getMessage(), e);
+            throw new IllegalArgumentException("Cannot deserialize cloud settings " + mapJson);
+        }
+    }
+
+    private CloudSettings detectCloudSettings(Map<String, String> properties) {
+        for (Map.Entry<String, String> entry : properties.entrySet()) {
+            if (entry.getKey().startsWith("aws")) {
+                return new AwsCloudSettings();
+            } else if (entry.getKey().startsWith("azure")) {
+                return new AzureCloudSettings();
+            } else if (entry.getKey().startsWith("gcp")) {
+                return new GcpCloudSettings();
+            }
+        }
+        throw new IllegalArgumentException("Unknown properties " + properties);
+    }
+
+    private <T extends CloudSettings> T createFromMap(T settings, Map<String, String> map) throws
+            IllegalAccessException {
+        for (Field field : settings.getClass().getDeclaredFields()) {
+            if (field.getAnnotation(JsonProperty.class) != null) {
+                String value = map.get(field.getAnnotation(JsonProperty.class).value());
+                if (value != null) {
+                    field.setAccessible(true);
+                    field.set(settings, value);
+
+                }
+            }
+        }
+
+        return settings;
+    }
+
+}
\ No newline at end of file
diff --git a/services/datalab-model/src/main/java/com/epam/datalab/util/JsonGenerator.java b/services/datalab-model/src/main/java/com/epam/datalab/util/JsonGenerator.java
new file mode 100644
index 0000000..c558b77
--- /dev/null
+++ b/services/datalab-model/src/main/java/com/epam/datalab/util/JsonGenerator.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util;
+
+import com.epam.datalab.dto.ResourceBaseDTO;
+import com.epam.datalab.dto.base.CloudSettings;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonUnwrapped;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public final class JsonGenerator {
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
+            .setSerializationInclusion(JsonInclude.Include.NON_NULL)
+            .addMixIn(ResourceBaseDTO.class, CloudSettingsUnwrapping.class);
+
+    private JsonGenerator() {
+    }
+
+    public static String generateJson(ResourceBaseDTO<?> resourceBaseDTO) throws JsonProcessingException {
+        return generateJson(resourceBaseDTO, false);
+    }
+
+    private static String generateJson(ResourceBaseDTO<?> resourceBaseDTO, boolean pretty) throws
+            JsonProcessingException {
+        if (pretty) {
+            return OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(resourceBaseDTO);
+        } else {
+            return OBJECT_MAPPER.writeValueAsString(resourceBaseDTO);
+        }
+    }
+
+    private abstract static class CloudSettingsUnwrapping {
+        @JsonUnwrapped
+        private CloudSettings cloudSettings;
+    }
+}
diff --git a/services/datalab-model/src/test/java/com/epam/datalab/dto/status/EnvResourceDTOTest.java b/services/datalab-model/src/test/java/com/epam/datalab/dto/status/EnvResourceDTOTest.java
new file mode 100644
index 0000000..9c3470a
--- /dev/null
+++ b/services/datalab-model/src/test/java/com/epam/datalab/dto/status/EnvResourceDTOTest.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.status;
+
+import com.epam.datalab.dto.UserEnvironmentResources;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class EnvResourceDTOTest {
+
+    private static String getJsonString(Object object) throws JsonProcessingException {
+        ObjectMapper objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        return objectMapper.writeValueAsString(object);
+    }
+
+    private static <T> T getJsonObject(String string, Class<T> objectType) throws IOException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        return objectMapper.readValue(string, objectType);
+    }
+
+    @Test
+    public void serde() throws IOException {
+        List<EnvResource> hosts1 = new ArrayList<EnvResource>();
+        hosts1.add(new EnvResource().withId("1"));
+        hosts1.add(new EnvResource().withId("2"));
+        hosts1.add(new EnvResource().withId("3").withStatus("state3"));
+        assertEquals(hosts1.get(0).getId(), "1");
+        assertEquals(hosts1.get(2).getStatus(), "state3");
+
+        List<EnvResource> clusters1 = new ArrayList<EnvResource>();
+        clusters1.add(new EnvResource().withId("10"));
+        clusters1.add(new EnvResource().withId("11"));
+        assertEquals(clusters1.get(0).getId(), "10");
+
+        EnvResourceList r1 = EnvResourceList.builder()
+                .hostList(hosts1)
+                .clusterList(clusters1)
+                .build();
+        assertEquals(r1.getHostList().get(1).getId(), "2");
+        assertEquals(r1.getHostList().get(2).getId(), "3");
+        assertEquals(r1.getClusterList().get(1).getId(), "11");
+
+        UserEnvironmentResources rs1 = new UserEnvironmentResources()
+                .withResourceList(r1);
+        assertEquals(rs1.getResourceList().getHostList().get(0).getId(), "1");
+        assertEquals(rs1.getResourceList().getClusterList().get(0).getId(), "10");
+
+        String json1 = getJsonString(rs1);
+
+        UserEnvironmentResources rs2 = getJsonObject(json1, UserEnvironmentResources.class);
+        String json2 = getJsonString(rs2);
+        assertEquals(rs1.getResourceList().getHostList().size(), rs2.getResourceList().getHostList().size());
+        assertEquals(rs1.getResourceList().getClusterList().size(), rs2.getResourceList().getClusterList().size());
+
+        assertEquals("Json SerDe error", json1, json2);
+    }
+}
diff --git a/services/datalab-model/src/test/java/com/epam/datalab/dto/status/EnvStatusDTOTest.java b/services/datalab-model/src/test/java/com/epam/datalab/dto/status/EnvStatusDTOTest.java
new file mode 100644
index 0000000..d8dc69d
--- /dev/null
+++ b/services/datalab-model/src/test/java/com/epam/datalab/dto/status/EnvStatusDTOTest.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.dto.status;
+
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class EnvStatusDTOTest {
+
+    private static String getJsonString(Object object) throws JsonProcessingException {
+        ObjectMapper objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        return objectMapper.writeValueAsString(object);
+    }
+
+    private static <T> T getJsonObject(String string, Class<T> objectType) throws IOException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        return objectMapper.readValue(string, objectType);
+    }
+
+    @Test
+    public void serde() throws IOException {
+        List<EnvResource> hosts1 = new ArrayList<>();
+        hosts1.add(new EnvResource().withId("1"));
+        hosts1.add(new EnvResource().withId("2"));
+        hosts1.add(new EnvResource().withId("3").withStatus("state3"));
+        assertEquals(hosts1.get(0).getId(), "1");
+        assertEquals(hosts1.get(2).getStatus(), "state3");
+
+        List<EnvResource> clusters1 = new ArrayList<EnvResource>();
+        clusters1.add(new EnvResource().withId("10"));
+        clusters1.add(new EnvResource().withId("11"));
+        assertEquals(clusters1.get(0).getId(), "10");
+
+        EnvResourceList r1 = EnvResourceList.builder()
+                .hostList(hosts1)
+                .clusterList(clusters1)
+                .build();
+        assertEquals(r1.getHostList().get(1).getId(), "2");
+        assertEquals(r1.getHostList().get(2).getId(), "3");
+        assertEquals(r1.getClusterList().get(1).getId(), "11");
+
+        EnvStatusDTO rs1 = new EnvStatusDTO()
+                .withUser("user1")
+                .withUptime(new Date())
+                .withStatus(UserInstanceStatus.CREATED)
+                .withErrorMessage("errorMessage1")
+                .withResourceList(r1);
+        assertEquals(rs1.getResourceList().getHostList().get(0).getId(), "1");
+        assertEquals(rs1.getResourceList().getClusterList().get(0).getId(), "10");
+
+        String json1 = getJsonString(rs1);
+
+        EnvStatusDTO rs2 = getJsonObject(json1, EnvStatusDTO.class);
+        String json2 = getJsonString(rs2);
+        assertEquals(rs1.getUser(), rs2.getUser());
+        assertEquals(rs1.getUptime(), rs2.getUptime());
+        assertEquals(rs1.getStatus(), rs2.getStatus());
+        assertEquals(rs1.getErrorMessage(), rs2.getErrorMessage());
+        assertEquals(rs1.getResourceList().getHostList().size(), rs2.getResourceList().getHostList().size());
+        assertEquals(rs1.getResourceList().getClusterList().size(), rs2.getResourceList().getClusterList().size());
+
+        assertEquals("Json SerDe error", json1, json2);
+    }
+}
diff --git a/services/datalab-model/src/test/java/com/epam/datalab/util/JsonGeneratorTest.java b/services/datalab-model/src/test/java/com/epam/datalab/util/JsonGeneratorTest.java
new file mode 100644
index 0000000..a87b0ab
--- /dev/null
+++ b/services/datalab-model/src/test/java/com/epam/datalab/util/JsonGeneratorTest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.util;
+
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyDTO;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class JsonGeneratorTest {
+
+    @Test
+    public void generateJsonTest() throws JsonProcessingException {
+        ReuploadKeyDTO dto = new ReuploadKeyDTO();
+        dto.withContent("someContent").withId("someId").withEdgeUserName("edgeUserName").withServiceBaseName("SBN");
+        String actual = JsonGenerator.generateJson(dto);
+        String expected = "{\"@class\":\"com.epam.datalab.dto.reuploadkey.ReuploadKeyDTO\",\"content\":\"someContent\"," +
+                "\"id\":\"someId\",\"edge_user_name\":\"edgeUserName\",\"conf_service_base_name\":\"SBN\"}";
+        Assert.assertEquals(expected, actual);
+    }
+}
diff --git a/services/datalab-mongo-migration/pom.xml b/services/datalab-mongo-migration/pom.xml
new file mode 100644
index 0000000..56dcb90
--- /dev/null
+++ b/services/datalab-mongo-migration/pom.xml
@@ -0,0 +1,39 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.epam.datalab</groupId>
+        <artifactId>datalab</artifactId>
+        <version>1.0</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>datalab-mongo-migration</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.github.mongobee</groupId>
+            <artifactId>mongobee</artifactId>
+            <version>0.13</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/DbMigration.java b/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/DbMigration.java
new file mode 100644
index 0000000..9cf230d
--- /dev/null
+++ b/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/DbMigration.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.migration;
+
+@FunctionalInterface
+public interface DbMigration {
+
+    void migrate();
+}
diff --git a/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/exception/DatalabDbMigrationException.java b/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/exception/DatalabDbMigrationException.java
new file mode 100644
index 0000000..a99c400
--- /dev/null
+++ b/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/exception/DatalabDbMigrationException.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.migration.exception;
+
+public class DatalabDbMigrationException extends RuntimeException {
+
+    public DatalabDbMigrationException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/mongo/DatalabMongoMigration.java b/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/mongo/DatalabMongoMigration.java
new file mode 100644
index 0000000..7f4b49a
--- /dev/null
+++ b/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/mongo/DatalabMongoMigration.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.migration.mongo;
+
+import com.epam.datalab.migration.DbMigration;
+import com.epam.datalab.migration.exception.DatalabDbMigrationException;
+import com.epam.datalab.migration.mongo.changelog.DatalabChangeLog;
+import com.github.mongobee.Mongobee;
+import com.github.mongobee.exception.MongobeeException;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class DatalabMongoMigration implements DbMigration {
+    private static final String MONGODB_URI_FORMAT = "mongodb://%s:%s@%s:%d/%s";
+    private final Mongobee runner;
+
+    public DatalabMongoMigration(String host, int port, String user, String password, String db) {
+        runner = new Mongobee(String.format(MONGODB_URI_FORMAT, user, password, host, port, db));
+        runner.setDbName(db);
+        runner.setChangeLogsScanPackage(DatalabChangeLog.class.getPackage().getName());
+    }
+
+    public void migrate() {
+        try {
+            runner.execute();
+        } catch (MongobeeException e) {
+            log.error("Mongo db migration failed: {}", e.getMessage());
+            throw new DatalabDbMigrationException("Mongo db migration failed", e);
+        }
+    }
+}
diff --git a/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/mongo/changelog/DatalabChangeLog.java b/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/mongo/changelog/DatalabChangeLog.java
new file mode 100644
index 0000000..facc337
--- /dev/null
+++ b/services/datalab-mongo-migration/src/main/java/com/epam/datalab/migration/mongo/changelog/DatalabChangeLog.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.migration.mongo.changelog;
+
+import com.github.mongobee.changeset.ChangeLog;
+import com.github.mongobee.changeset.ChangeSet;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DB;
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.StreamSupport;
+
+@ChangeLog
+@Slf4j
+public class DatalabChangeLog {
+
+    public static final String ID = "_id";
+
+    @ChangeSet(order = "001", id = "001", author = "bhliva")
+    public void migrateSchedulerFields(DB db) {
+        log.info("Replacing field days_repeat with start_days_repeat and stop_days_repeat");
+        final DBCollection userInstances = db.getCollection("userInstances");
+
+        StreamSupport.stream(userInstances.find().spliterator(), false)
+                .forEach(dbObject -> updateSchedulerFieldsForExploratory(userInstances, dbObject));
+        log.info("Replacing scheduler field days_repeat finished successfully");
+    }
+
+    @SuppressWarnings("unchecked")
+    private void updateSchedulerFieldsForExploratory(DBCollection userInstances, DBObject dbObject) {
+        updateSchedulerFields(dbObject);
+        Optional.ofNullable(dbObject.get("computational_resources")).map(cr -> (List<DBObject>) cr)
+                .ifPresent(computationalResources -> computationalResources.forEach(this::updateSchedulerFields));
+        userInstances.update(new BasicDBObject(ID, dbObject.get(ID)), dbObject);
+    }
+
+    private void updateSchedulerFields(DBObject dbObject) {
+        final Object schedulerData = dbObject.get("scheduler_data");
+        if (schedulerData != null) {
+            final Object daysRepeat = ((DBObject) schedulerData).removeField("days_repeat");
+            ((DBObject) schedulerData).put("start_days_repeat", daysRepeat);
+            ((DBObject) schedulerData).put("stop_days_repeat", daysRepeat);
+        }
+    }
+}
diff --git a/services/datalab-utils/pom.xml b/services/datalab-utils/pom.xml
new file mode 100644
index 0000000..265ffb7
--- /dev/null
+++ b/services/datalab-utils/pom.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>datalab</artifactId>
+        <groupId>com.epam.datalab</groupId>
+        <version>1.0</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>datalab-utils</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.dropwizard</groupId>
+            <artifactId>dropwizard-jackson</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>${org.mockito.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/FileUtils.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/FileUtils.java
new file mode 100644
index 0000000..b7bb233
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/FileUtils.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util;
+
+import com.epam.datalab.exceptions.DatalabException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+@Slf4j
+public class FileUtils {
+
+    private FileUtils() {
+    }
+
+    public static void saveToFile(String filename, String directory, String content) throws IOException {
+        java.nio.file.Path filePath = Paths.get(directory, filename).toAbsolutePath();
+        log.debug("Saving content to {}", filePath.toString());
+        try {
+            com.google.common.io.Files.createParentDirs(new File(filePath.toString()));
+        } catch (IOException e) {
+            throw new DatalabException("Can't create folder " + filePath + ": " + e.getLocalizedMessage(), e);
+        }
+        Files.write(filePath, content.getBytes());
+    }
+
+    public static void deleteFile(String filename, String directory) throws IOException {
+        java.nio.file.Path filePath = Paths.get(directory, filename).toAbsolutePath();
+        log.debug("Deleting file from {}", filePath.toString());
+        Files.deleteIfExists(filePath);
+    }
+
+    public static void deleteFile(String absolutePath) {
+        log.debug("Deleting file from {}", absolutePath);
+        try {
+            Files.deleteIfExists(Paths.get(absolutePath));
+        } catch (IOException e) {
+            log.error("Problems occured with deleting file {} due to: {}", absolutePath, e.getLocalizedMessage(), e);
+        }
+    }
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/SecurityUtils.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/SecurityUtils.java
new file mode 100644
index 0000000..023c476
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/SecurityUtils.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.util;
+
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class SecurityUtils {
+
+    private static final String PASS_REGEX = "\"password\":\".+?\"";
+    private static final String PASS_REPLACEMENT = "\"password\":\"\\*\\*\\*\"";
+
+    private SecurityUtils() {
+    }
+
+    public static String hideCreds(String... strings) {
+        return Stream.of(strings)
+                .map(str -> str.replaceAll(PASS_REGEX, PASS_REPLACEMENT))
+                .collect(Collectors.joining(" "));
+    }
+
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/ServiceUtils.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/ServiceUtils.java
new file mode 100644
index 0000000..f571692
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/ServiceUtils.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util;
+
+import com.epam.datalab.exceptions.DatalabException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+@Slf4j
+public class ServiceUtils {
+
+    private static String includePath = null;
+
+    static {
+        includePath = System.getenv("DATALAB_CONF_DIR");
+        if (includePath == null || includePath.isEmpty()) {
+            includePath = getUserDir();
+        }
+    }
+
+    /* Return working directory.
+     */
+    public static String getUserDir() {
+        return System.getProperty("user.dir");
+    }
+
+    /**
+     * Return path to DataLab configuration directory.
+     *
+     * @return
+     */
+    public static String getConfPath() {
+        return includePath;
+    }
+
+
+    /**
+     * Return manifest for given class or empty manifest if {@link JarFile#MANIFEST_NAME} not found.
+     *
+     * @param clazz class.
+     * @throws IOException
+     */
+    private static Manifest getManifestForClass(Class<?> clazz) throws IOException {
+        URL url = clazz.getClassLoader().getResource(JarFile.MANIFEST_NAME);
+        return (url == null ? new Manifest() : new Manifest(url.openStream()));
+    }
+
+    /**
+     * Return manifest from JAR file.
+     *
+     * @param classPath path to class in JAR file.
+     * @throws IOException
+     */
+    private static Manifest getManifestFromJar(String classPath) throws IOException {
+        URL url = new URL(classPath);
+        JarURLConnection jarConnection = (JarURLConnection) url.openConnection();
+        return jarConnection.getManifest();
+    }
+
+    /**
+     * Return manifest map for given class or empty map if manifest not found or cannot be read.
+     *
+     * @param clazz class.
+     */
+    public static Map<String, String> getManifest(Class<?> clazz) {
+        String className = "/" + clazz.getName().replace('.', '/') + ".class";
+        String classPath = clazz.getResource(className).toString();
+
+        Map<String, String> map = new HashMap<>();
+        try {
+            Manifest manifest = (classPath.startsWith("jar:file:") ? getManifestFromJar(classPath) : getManifestForClass(clazz));
+            Attributes attributes = manifest.getMainAttributes();
+            for (Object key : attributes.keySet()) {
+                map.put(key.toString(), (String) attributes.get(key));
+            }
+        } catch (IOException e) {
+            log.error("Cannot found or open manifest for class {}", className, e);
+            throw new DatalabException("Cannot read manifest file", e);
+        }
+
+        return map;
+    }
+
+    /**
+     * Print to standard output the manifest info about application. If parameter <b>args</b> is not
+     * <b>null</b> and one or more arguments have value -v or --version then print version and return <b>true<b/>
+     * otherwise <b>false</b>.
+     *
+     * @param mainClass the main class of application.
+     * @param args      the arguments of main class function or null.
+     * @return if parameter <b>args</b> is not null and one or more arguments have value -v or --version
+     * then return <b>true<b/> otherwise <b>false</b>.
+     */
+    public static boolean printAppVersion(Class<?> mainClass, String... args) {
+        boolean result = false;
+        if (args != null) {
+            for (String arg : args) {
+                if ("-v".equals(arg) ||
+                        "--version".equals(arg)) {
+                    result = true;
+                }
+            }
+            if (!result) {
+                return result;
+            }
+        }
+
+        Map<String, String> manifest = getManifest(mainClass);
+        if (manifest.isEmpty()) {
+            return result;
+        }
+
+        log.info("Title       {}", manifest.get("Implementation-Title"));
+        log.info("Version     {}", manifest.get("Implementation-Version"));
+        log.info("Created By  {}", manifest.get("Created-By"));
+        log.info("Vendor      {}", manifest.get("Implementation-Vendor"));
+        log.info("GIT-Branch  {}", manifest.get("GIT-Branch"));
+        log.info("GIT-Commit  {}", manifest.get("GIT-Commit"));
+        log.info("Build JDK   {}", manifest.get("Build-Jdk"));
+        log.info("Build OS    {}", manifest.get("Build-OS"));
+        log.info("Built Time  {}", manifest.get("Build-Time"));
+        log.info("Built By    {}", manifest.get("Built-By"));
+
+        return result;
+    }
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/UsernameUtils.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/UsernameUtils.java
new file mode 100644
index 0000000..265f1b2
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/UsernameUtils.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util;
+
+public class UsernameUtils {
+
+    private static final String UNDERLINE = "_";
+
+    private UsernameUtils() {
+    }
+
+    public static String removeDomain(String username) {
+        return username != null ? username.replaceAll("@.*", "") : null;
+    }
+
+    public static String replaceWhitespaces(String username) {
+        return username.replaceAll("\\s", UNDERLINE);
+    }
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoDateDeSerializer.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoDateDeSerializer.java
new file mode 100644
index 0000000..2406d34
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoDateDeSerializer.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Deserializes {@link java.util.Date} from JSON
+ */
+public class IsoDateDeSerializer extends JsonDeserializer<Date> {
+    static final String DATE_NODE = "$date";
+    static final String ISO_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
+
+    @Override
+    public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
+        ObjectCodec oc = jsonParser.getCodec();
+        JsonNode node = oc.readTree(jsonParser);
+
+        Date date;
+        if (node.get(DATE_NODE) != null) {
+            String dateValue = node.get(DATE_NODE).asText();
+            DateFormat df = new SimpleDateFormat(ISO_DATE_FORMAT);
+            try {
+                date = df.parse(dateValue);
+            } catch (ParseException e) {
+                date = new Date(Long.valueOf(dateValue));
+            }
+        } else {
+            date = new Date(node.asLong());
+        }
+        return date;
+    }
+
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoDateSerializer.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoDateSerializer.java
new file mode 100644
index 0000000..5e88184
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoDateSerializer.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+/**
+ * Serializes the {@link java.util.Date} to JSON
+ */
+public class IsoDateSerializer extends JsonSerializer<Date> {
+
+    @Override
+    public void serialize(Date date, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+        DateFormat df = new SimpleDateFormat(IsoDateDeSerializer.ISO_DATE_FORMAT);
+        df.setTimeZone(TimeZone.getTimeZone("GMT"));
+        String dateValue = df.format(date);
+
+        gen.writeStartObject();
+        gen.writeFieldName(IsoDateDeSerializer.DATE_NODE);
+        gen.writeString(dateValue);
+        gen.writeEndObject();
+    }
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateDeSerializer.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateDeSerializer.java
new file mode 100644
index 0000000..b050e32
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateDeSerializer.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneOffset;
+
+import static com.epam.datalab.util.mongo.IsoDateDeSerializer.DATE_NODE;
+
+public class IsoLocalDateDeSerializer extends JsonDeserializer<LocalDate> {
+    @Override
+    public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+        ObjectCodec oc = p.getCodec();
+        JsonNode node = oc.readTree(p);
+        if (node.get(DATE_NODE) != null) {
+            String dateValue = node.get(DATE_NODE).asText();
+            return Instant.ofEpochMilli(Long.valueOf(dateValue)).atZone(ZoneOffset.systemDefault()).toLocalDate();
+        } else {
+            return Instant.ofEpochMilli(node.asLong()).atZone(ZoneOffset.systemDefault()).toLocalDate();
+        }
+    }
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateSerializer.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateSerializer.java
new file mode 100644
index 0000000..9fb5e10
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateSerializer.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+public class IsoLocalDateSerializer extends JsonSerializer<LocalDate> {
+    @Override
+    public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+        gen.writeStartObject();
+        gen.writeFieldName(IsoDateDeSerializer.DATE_NODE);
+        gen.writeString(value.format(DateTimeFormatter.ISO_DATE));
+        gen.writeEndObject();
+    }
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateTimeDeSerializer.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateTimeDeSerializer.java
new file mode 100644
index 0000000..66876f6
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateTimeDeSerializer.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+
+import static com.epam.datalab.util.mongo.IsoDateDeSerializer.DATE_NODE;
+
+public class IsoLocalDateTimeDeSerializer extends JsonDeserializer<LocalDateTime> {
+
+    @Override
+    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+        ObjectCodec oc = p.getCodec();
+        JsonNode node = oc.readTree(p);
+        if (node.get(DATE_NODE) != null) {
+            String dateValue = node.get(DATE_NODE).asText();
+            return Instant.ofEpochMilli(Long.valueOf(dateValue)).atZone(ZoneOffset.systemDefault()).toLocalDateTime();
+        } else {
+            return Instant.ofEpochMilli(node.asLong()).atZone(ZoneOffset.systemDefault()).toLocalDateTime();
+        }
+    }
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateTimeSerializer.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateTimeSerializer.java
new file mode 100644
index 0000000..6613279
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/IsoLocalDateTimeSerializer.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class IsoLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
+    @Override
+    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+        gen.writeStartObject();
+        gen.writeFieldName(IsoDateDeSerializer.DATE_NODE);
+        gen.writeString(value.format(DateTimeFormatter.ISO_DATE_TIME));
+        gen.writeEndObject();
+    }
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/LongDeSerializer.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/LongDeSerializer.java
new file mode 100644
index 0000000..0652aeb
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/LongDeSerializer.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import java.io.IOException;
+
+public class LongDeSerializer extends JsonDeserializer<Long> {
+    private static final String NUMBER_NODE = "$numberLong";
+
+    @Override
+    public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+        ObjectCodec oc = p.getCodec();
+        JsonNode node = oc.readTree(p);
+
+        final JsonNode numberNode = node.get(NUMBER_NODE);
+        if (numberNode != null) {
+            return numberNode.asLong();
+        } else {
+            return node.asLong();
+        }
+    }
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/MongoStringDeserializer.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/MongoStringDeserializer.java
new file mode 100644
index 0000000..06c2972
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/MongoStringDeserializer.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.KeyDeserializer;
+
+import static com.epam.datalab.util.mongo.MongoStringSerializaer.DOT_UNICODE;
+
+public class MongoStringDeserializer extends KeyDeserializer {
+
+    @Override
+    public Object deserializeKey(String key, DeserializationContext ctxt) {
+        return key.contains(DOT_UNICODE) ? key.replace(DOT_UNICODE, ".") : key;
+    }
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/MongoStringSerializaer.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/MongoStringSerializaer.java
new file mode 100644
index 0000000..f991758
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/MongoStringSerializaer.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+
+public class MongoStringSerializaer extends JsonSerializer<String> {
+    public static final String DOT_UNICODE = "U+FF0E";
+
+    @Override
+    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+        if (value.contains(".")) {
+            gen.writeFieldName(value.replace(".", DOT_UNICODE));
+        } else {
+            gen.writeFieldName(value);
+        }
+    }
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/modules/IsoDateModule.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/modules/IsoDateModule.java
new file mode 100644
index 0000000..398f8cb
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/modules/IsoDateModule.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util.mongo.modules;
+
+import com.epam.datalab.util.mongo.IsoDateDeSerializer;
+import com.epam.datalab.util.mongo.IsoDateSerializer;
+import com.epam.datalab.util.mongo.IsoLocalDateDeSerializer;
+import com.epam.datalab.util.mongo.IsoLocalDateSerializer;
+import com.epam.datalab.util.mongo.IsoLocalDateTimeDeSerializer;
+import com.epam.datalab.util.mongo.IsoLocalDateTimeSerializer;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.JSR310StringParsableDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneOffset;
+import java.util.Date;
+
+/**
+ * Serialization/Deserialization modul for {@link java.util.Date} that uses {@link IsoDateDeSerializer} and
+ * {@link IsoDateSerializer}
+ */
+public class IsoDateModule extends SimpleModule {
+	private static final long serialVersionUID = -2103066255354028256L;
+
+	public IsoDateModule() {
+		super();
+		addSerializer(Date.class, new IsoDateSerializer());
+		addDeserializer(Date.class, new IsoDateDeSerializer());
+
+		addSerializer(LocalDate.class, new IsoLocalDateSerializer());
+		addDeserializer(LocalDate.class, new IsoLocalDateDeSerializer());
+
+		addSerializer(LocalTime.class, new ToStringSerializer(LocalTime.class));
+		addDeserializer(LocalTime.class, LocalTimeDeserializer.INSTANCE);
+
+		addSerializer(LocalDateTime.class, new IsoLocalDateTimeSerializer());
+		addDeserializer(LocalDateTime.class, new IsoLocalDateTimeDeSerializer());
+
+		addSerializer(ZoneOffset.class, new ToStringSerializer(ZoneOffset.class));
+		addDeserializer(ZoneOffset.class, JSR310StringParsableDeserializer.ZONE_OFFSET);
+
+	}
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/modules/JavaPrimitiveModule.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/modules/JavaPrimitiveModule.java
new file mode 100644
index 0000000..681820a
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/modules/JavaPrimitiveModule.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.util.mongo.modules;
+
+import com.epam.datalab.util.mongo.LongDeSerializer;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+public class JavaPrimitiveModule extends SimpleModule {
+
+    public JavaPrimitiveModule() {
+        addDeserializer(Long.class, new LongDeSerializer());
+    }
+
+}
diff --git a/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/modules/MongoModule.java b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/modules/MongoModule.java
new file mode 100644
index 0000000..e6aaae2
--- /dev/null
+++ b/services/datalab-utils/src/main/java/com/epam/datalab/util/mongo/modules/MongoModule.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.util.mongo.modules;
+
+import com.epam.datalab.util.mongo.MongoStringDeserializer;
+import com.epam.datalab.util.mongo.MongoStringSerializaer;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+public class MongoModule extends SimpleModule {
+
+    public MongoModule() {
+        addKeySerializer(String.class, new MongoStringSerializaer());
+        addKeyDeserializer(String.class, new MongoStringDeserializer());
+    }
+}
diff --git a/services/datalab-utils/src/test/java/com/epam/datalab/util/SecurityUtilsTest.java b/services/datalab-utils/src/test/java/com/epam/datalab/util/SecurityUtilsTest.java
new file mode 100644
index 0000000..390a79b
--- /dev/null
+++ b/services/datalab-utils/src/test/java/com/epam/datalab/util/SecurityUtilsTest.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.util;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SecurityUtilsTest {
+
+    @Test
+    public void hideCredsTest() {
+        String[] strings = {"bash", "-c", "\"edge_user_name\":\"edgeUserName\",\"conf_service_base_name\":\"SBN\", " +
+                "\"password\":\"12345\""};
+        String actual = SecurityUtils.hideCreds(strings);
+        String expected = "bash -c \"edge_user_name\":\"edgeUserName\",\"conf_service_base_name\":\"SBN\", " +
+                "\"password\":\"***\"";
+        Assert.assertEquals(expected, actual);
+    }
+}
diff --git a/services/datalab-utils/src/test/java/com/epam/datalab/util/mongo/IsoLocalDateTimeDeSerializerTest.java b/services/datalab-utils/src/test/java/com/epam/datalab/util/mongo/IsoLocalDateTimeDeSerializerTest.java
new file mode 100644
index 0000000..12c0222
--- /dev/null
+++ b/services/datalab-utils/src/test/java/com/epam/datalab/util/mongo/IsoLocalDateTimeDeSerializerTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.io.IOException;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class IsoLocalDateTimeDeSerializerTest {
+
+    @Test
+    public void deserialize() throws IOException {
+        JsonParser jsonParser = mock(JsonParser.class);
+        DeserializationContext ctxt = mock(DeserializationContext.class);
+
+        ObjectCodec objectCodec = mock(ObjectCodec.class);
+        when(jsonParser.getCodec()).thenReturn(objectCodec);
+
+        JsonNode jsonNode = mock(JsonNode.class);
+        when(objectCodec.readTree(jsonParser)).thenReturn(jsonNode);
+
+        JsonNode jsonNode2 = mock(JsonNode.class);
+        when(jsonNode.get(anyString())).thenReturn(jsonNode2);
+        when(jsonNode2.asText()).thenReturn("1234567890");
+
+        new IsoLocalDateTimeDeSerializer().deserialize(jsonParser, ctxt);
+
+        verify(jsonParser).getCodec();
+        verify(objectCodec).readTree(jsonParser);
+        verify(jsonNode, times(2)).get("$date");
+        verify(jsonNode2).asText();
+        verify(jsonNode, never()).asLong();
+        verifyNoMoreInteractions(jsonParser, objectCodec, jsonNode, jsonNode2);
+    }
+
+    @Test
+    public void deserializeWhenMethodGetReturnsNull() throws IOException {
+        JsonParser jsonParser = mock(JsonParser.class);
+        DeserializationContext ctxt = mock(DeserializationContext.class);
+
+        ObjectCodec objectCodec = mock(ObjectCodec.class);
+        when(jsonParser.getCodec()).thenReturn(objectCodec);
+
+        JsonNode jsonNode = mock(JsonNode.class);
+        when(objectCodec.readTree(jsonParser)).thenReturn(jsonNode);
+
+        when(jsonNode.get(anyString())).thenReturn(null);
+
+        new IsoLocalDateTimeDeSerializer().deserialize(jsonParser, ctxt);
+
+        verify(jsonParser).getCodec();
+        verify(objectCodec).readTree(jsonParser);
+        verify(jsonNode).get("$date");
+        verify(jsonNode).asLong();
+        verifyNoMoreInteractions(jsonParser, objectCodec, jsonNode);
+    }
+}
\ No newline at end of file
diff --git a/services/datalab-utils/src/test/java/com/epam/datalab/util/mongo/IsoLocalDateTimeSerDeTest.java b/services/datalab-utils/src/test/java/com/epam/datalab/util/mongo/IsoLocalDateTimeSerDeTest.java
new file mode 100644
index 0000000..391238a
--- /dev/null
+++ b/services/datalab-utils/src/test/java/com/epam/datalab/util/mongo/IsoLocalDateTimeSerDeTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+
+import static org.junit.Assert.assertEquals;
+
+public class IsoLocalDateTimeSerDeTest {
+
+    private static ObjectMapper objectMapper;
+
+    @BeforeClass
+    public static void setup() {
+        objectMapper = new ObjectMapper();
+    }
+
+    @Test
+    public void shoudProperlySerializeLocalDateTimeToJson() throws JsonProcessingException {
+        String actual = objectMapper.writeValueAsString(new SampleClass());
+        assertEquals("{\"localDateTime\":{\"$date\":\"2018-04-10T15:30:45\"}}", actual);
+    }
+
+    @Test
+    public void shoudProperlyDeserializeLocalDateTimeFromJson() throws IOException {
+        LocalDateTime now = LocalDateTime.now();
+        long l = now.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+        SampleClass actual = objectMapper
+                .readValue("{\"localDateTime\":{\"$date\":" + l + "}}", SampleClass.class);
+
+        assertEquals(now, actual.getLocalDateTime());
+    }
+
+    private static class SampleClass {
+
+        @JsonSerialize(using = IsoLocalDateTimeSerializer.class)
+        @JsonDeserialize(using = IsoLocalDateTimeDeSerializer.class)
+        private final LocalDateTime localDateTime = LocalDateTime.parse("2018-04-10T15:30:45");
+
+        LocalDateTime getLocalDateTime() {
+            return localDateTime;
+        }
+    }
+}
diff --git a/services/datalab-utils/src/test/java/com/epam/datalab/util/mongo/IsoLocalDateTimeSerializerTest.java b/services/datalab-utils/src/test/java/com/epam/datalab/util/mongo/IsoLocalDateTimeSerializerTest.java
new file mode 100644
index 0000000..d50869a
--- /dev/null
+++ b/services/datalab-utils/src/test/java/com/epam/datalab/util/mongo/IsoLocalDateTimeSerializerTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.util.mongo;
+
+import com.fasterxml.jackson.databind.SerializerProvider;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+@RunWith(MockitoJUnitRunner.class)
+public class IsoLocalDateTimeSerializerTest {
+
+    @Test
+    public void serialize() throws IOException {
+        com.fasterxml.jackson.core.JsonGenerator jsonGenerator = mock(com.fasterxml.jackson.core.JsonGenerator.class);
+        SerializerProvider serializerProvider = mock(SerializerProvider.class);
+
+        LocalDateTime localDateTime = LocalDateTime.now();
+
+        new IsoLocalDateTimeSerializer().serialize(localDateTime, jsonGenerator, serializerProvider);
+
+        verify(jsonGenerator).writeStartObject();
+        verify(jsonGenerator).writeFieldName("$date");
+        verify(jsonGenerator).writeString(localDateTime.format(DateTimeFormatter.ISO_DATE_TIME));
+        verify(jsonGenerator).writeEndObject();
+        verifyNoMoreInteractions(jsonGenerator);
+        verifyZeroInteractions(serializerProvider);
+    }
+
+
+}
\ No newline at end of file
diff --git a/services/datalab-webapp-common/pom.xml b/services/datalab-webapp-common/pom.xml
new file mode 100644
index 0000000..b42da46
--- /dev/null
+++ b/services/datalab-webapp-common/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>datalab</artifactId>
+        <groupId>com.epam.datalab</groupId>
+        <version>1.0</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>datalab-webapp-common</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.mongodb</groupId>
+            <artifactId>mongo-java-driver</artifactId>
+            <version>${org.mongodb.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.dropwizard</groupId>
+            <artifactId>dropwizard-jackson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.dropwizard</groupId>
+            <artifactId>dropwizard-auth</artifactId>
+            <version>${io.dropwizard.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.dropwizard</groupId>
+            <artifactId>dropwizard-client</artifactId>
+            <version>${io.dropwizard.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.dropwizard</groupId>
+            <artifactId>dropwizard-forms</artifactId>
+            <version>${io.dropwizard.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.4</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/ModuleBase.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/ModuleBase.java
new file mode 100644
index 0000000..df6cebc
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/ModuleBase.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab;
+
+import com.google.inject.AbstractModule;
+import io.dropwizard.setup.Environment;
+
+/**
+ * The base class for an application configuration of service.
+ */
+public abstract class ModuleBase<T extends ServiceConfiguration> extends AbstractModule {
+    /**
+     * Application configuration of service.
+     */
+    protected T configuration;
+    /**
+     * Environment of service.
+     */
+    protected Environment environment;
+
+    /**
+     * Instantiates an application configuration of service.
+     *
+     * @param configuration application configuration of service.
+     * @param environment   environment of service.
+     */
+    public ModuleBase(T configuration, Environment environment) {
+        this.configuration = configuration;
+        this.environment = environment;
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/ServiceConfiguration.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/ServiceConfiguration.java
new file mode 100644
index 0000000..7d4ead2
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/ServiceConfiguration.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab;
+
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.mongo.MongoServiceFactory;
+import com.epam.datalab.rest.client.RESTServiceFactory;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.dropwizard.Configuration;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+public class ServiceConfiguration extends Configuration {
+
+    @JsonProperty
+    private long inactiveUserTimeoutMillSec = 2 * 60L * 60L * 1000L;
+
+    @NotNull
+    @JsonProperty
+    private CloudProvider cloudProvider;
+
+    @Valid
+    @JsonProperty
+    private boolean devMode = false;
+
+    @Valid
+    @NotNull
+    @JsonProperty(ServiceConsts.MONGO_NAME)
+    private MongoServiceFactory mongoFactory = new MongoServiceFactory();
+
+    @Valid
+    @NotNull
+    @JsonProperty(ServiceConsts.PROVISIONING_SERVICE_NAME)
+    private RESTServiceFactory provisioningFactory = new RESTServiceFactory();
+
+    @Valid
+    @NotNull
+    @JsonProperty(ServiceConsts.BUCKET_SERVICE_NAME)
+    private RESTServiceFactory bucketFactory = new RESTServiceFactory();
+
+    @Valid
+    @NotNull
+    @JsonProperty(ServiceConsts.BILLING_SERVICE_NAME)
+    private RESTServiceFactory billingFactory = new RESTServiceFactory();
+
+    @Valid
+    @NotNull
+    @JsonProperty(ServiceConsts.SECURITY_SERVICE_NAME)
+    private RESTServiceFactory securityFactory;
+
+    @Valid
+    @NotNull
+    @JsonProperty(ServiceConsts.SELF_SERVICE_NAME)
+    private RESTServiceFactory selfFactory = new RESTServiceFactory();
+
+    public CloudProvider getCloudProvider() {
+        return cloudProvider;
+    }
+
+    public long getInactiveUserTimeoutMillSec() {
+        return inactiveUserTimeoutMillSec;
+    }
+
+    /**
+     * Returns <b>true</b> if service is a mock.
+     */
+    public boolean isDevMode() {
+        return devMode;
+    }
+
+    public MongoServiceFactory getMongoFactory() {
+        return mongoFactory;
+    }
+
+    public RESTServiceFactory getProvisioningFactory() {
+        return provisioningFactory;
+    }
+
+    public RESTServiceFactory getBucketFactory() {
+        return bucketFactory;
+    }
+
+    public RESTServiceFactory getBillingFactory() {
+        return billingFactory;
+    }
+
+    public RESTServiceFactory getSecurityFactory() {
+        return securityFactory;
+    }
+
+    public RESTServiceFactory getSelfFactory() {
+        return selfFactory;
+    }
+
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/SecurityUnauthorizedHandler.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/SecurityUnauthorizedHandler.java
new file mode 100644
index 0000000..b74be0a
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/SecurityUnauthorizedHandler.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.auth;
+
+import io.dropwizard.auth.UnauthorizedHandler;
+
+import javax.ws.rs.core.Response;
+
+public class SecurityUnauthorizedHandler implements UnauthorizedHandler {
+    @Override
+    public Response buildResponse(String prefix, String realm) {
+        return Response.status(Response.Status.UNAUTHORIZED).build();
+    }
+
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/UserInfo.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/UserInfo.java
new file mode 100644
index 0000000..af5360d
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/UserInfo.java
@@ -0,0 +1,222 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.auth;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+
+import java.security.Principal;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class UserInfo implements Principal {
+
+    private final String username;
+    private final String accessToken;
+    private String refreshToken;
+    private final Set<String> roles = new HashSet<>();
+    private final Map<String, String> keys = new HashMap<>();
+
+    @JsonProperty
+    private String firstName;
+    @JsonProperty
+    private String lastName;
+    @JsonProperty
+    private String remoteIp;
+    @JsonProperty
+    private boolean awsUser = false;
+
+    @JsonCreator
+    public UserInfo(@JsonProperty("username") String username,
+                    @JsonProperty("access_token") String accessToken) {
+        this.username = (username == null ? null : username.toLowerCase());
+        this.accessToken = accessToken;
+    }
+
+    @Override
+    @JsonProperty("username")
+    public String getName() {
+        return username;
+    }
+
+    public String getSimpleName() {
+        return (username == null ? null : username.replaceAll("@.*", ""));
+    }
+
+    @JsonProperty("access_token")
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    @JsonProperty("refresh_token")
+    public String getRefreshToken() {
+        return refreshToken;
+    }
+
+    public void setRefreshToken(String refreshToken) {
+        this.refreshToken = refreshToken;
+    }
+
+    @JsonProperty("roles")
+    public Set<String> getRoles() {
+        return roles;
+    }
+
+    //@JsonSetter("roles")
+    public void addRoles(Collection<String> r) {
+        roles.addAll(r);
+    }
+
+    @JsonSetter("roles")
+    public void addRoles(String[] r) {
+        roles.addAll(Arrays.asList(r));
+    }
+
+    public void addRole(String role) {
+        roles.add(role);
+    }
+
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public String getRemoteIp() {
+        return remoteIp;
+    }
+
+    public void setRemoteIp(String remoteIp) {
+        this.remoteIp = remoteIp;
+    }
+
+    public UserInfo withToken(String token) {
+        UserInfo newInfo = new UserInfo(username, token);
+        roles.forEach(newInfo::addRole);
+        newInfo.firstName = this.firstName;
+        newInfo.lastName = this.lastName;
+        newInfo.remoteIp = this.remoteIp;
+        newInfo.awsUser = this.awsUser;
+        newInfo.setKeys(this.getKeys());
+        return newInfo;
+    }
+
+    public boolean isAwsUser() {
+        return awsUser;
+    }
+
+    public void setAwsUser(boolean awsUser) {
+        this.awsUser = awsUser;
+    }
+
+    public Map<String, String> getKeys() {
+        return keys;
+    }
+
+    public void addKey(String id, String status) {
+        keys.put(id, status);
+    }
+
+    @JsonSetter("keys")
+    public void setKeys(Map<String, String> awsKeys) {
+        awsKeys.forEach(keys::put);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        UserInfo userInfo = (UserInfo) o;
+
+        if (awsUser != userInfo.awsUser) {
+            return false;
+        }
+        if (username != null ? !username.equals(userInfo.username) : userInfo.username != null) {
+            return false;
+        }
+        if (accessToken != null ? !accessToken.equals(userInfo.accessToken) : userInfo.accessToken != null)
+            return false;
+        if (!roles.equals(userInfo.roles)) {
+            return false;
+        }
+        if (!keys.equals(userInfo.keys)) {
+            return false;
+        }
+        if (firstName != null ? !firstName.equals(userInfo.firstName) : userInfo.firstName != null) {
+            return false;
+        }
+        if (lastName != null ? !lastName.equals(userInfo.lastName) : userInfo.lastName != null) {
+            return false;
+        }
+        return remoteIp != null ? remoteIp.equals(userInfo.remoteIp) : userInfo.remoteIp == null;
+    }
+
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(username,
+                accessToken,
+                roles,
+                keys,
+                firstName,
+                lastName,
+                remoteIp,
+                awsUser);
+    }
+
+    @Override
+    public String toString() {
+        return "UserInfo{" +
+                "username='" + username + '\'' +
+                ", accessToken='" + accessToken + '\'' +
+                ", refreshToken='" + refreshToken + '\'' +
+                ", roles=" + roles +
+                ", keys=" + keys.keySet() +
+                ", firstName='" + firstName + '\'' +
+                ", lastName='" + lastName + '\'' +
+                ", remoteIp='" + remoteIp + '\'' +
+                ", awsUser=" + awsUser +
+                '}';
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/contract/SecurityAPI.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/contract/SecurityAPI.java
new file mode 100644
index 0000000..cddbb7a
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/contract/SecurityAPI.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.auth.contract;
+
+public interface SecurityAPI {
+	String LOGIN = "login";
+	String LOGIN_OAUTH = LOGIN + '/' + "oauth";
+	String LOGIN_OAUTH_AZURE = "user/azure/oauth";
+	String GET_USER_INFO = "getuserinfo";
+	String LOGOUT = "logout";
+	String INIT_LOGIN_OAUTH_AZURE = "/user/azure/init";
+	String INIT_LOGIN_OAUTH_GCP = "/user/gcp/init";
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/dto/UserCredentialDTO.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/dto/UserCredentialDTO.java
new file mode 100644
index 0000000..c9b393a
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/dto/UserCredentialDTO.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.auth.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import org.hibernate.validator.constraints.NotBlank;
+
+public class UserCredentialDTO {
+    @NotBlank
+    @JsonProperty
+    private String username;
+
+    @NotBlank
+    @JsonProperty
+    private String password;
+
+    @JsonProperty("access_token")
+    private String accessToken;
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = (username == null ? null : username.toLowerCase());
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    public void setAccessToken(String accessToken) {
+        this.accessToken = accessToken;
+    }
+
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("username", username)
+                .add("password", password == null ? null : "***")
+                .add("accessToken", accessToken == null ? null : "***");
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/oauth2/Oauth2AuthenticationService.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/oauth2/Oauth2AuthenticationService.java
new file mode 100644
index 0000000..9d5084f
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/oauth2/Oauth2AuthenticationService.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.auth.oauth2;
+
+public interface Oauth2AuthenticationService {
+
+    /**
+     * @return redirected ulr
+     */
+    String getRedirectedUrl();
+
+    /**
+     * Authorize user using oauth authorization code
+     *
+     * @param code  authorization code
+     * @param state state
+     * @return token
+     */
+    String authorize(String code, String state);
+
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/AbstractAuthenticationService.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/AbstractAuthenticationService.java
new file mode 100644
index 0000000..c969c68
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/AbstractAuthenticationService.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package com.epam.datalab.auth.rest;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.auth.dto.UserCredentialDTO;
+import io.dropwizard.Configuration;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Response;
+import java.util.UUID;
+
+public abstract class AbstractAuthenticationService<C extends Configuration> extends ConfigurableResource<C> {
+
+    public AbstractAuthenticationService(C config) {
+        super(config);
+    }
+
+    public static String getRandomToken() {
+        return UUID.randomUUID().toString();
+    }
+
+    public abstract Response login(UserCredentialDTO credential, HttpServletRequest request);
+
+    public abstract UserInfo getUserInfo(String accessToken, HttpServletRequest request);
+
+    public abstract Response logout(String accessToken);
+
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/ConfigurableResource.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/ConfigurableResource.java
new file mode 100644
index 0000000..d3d3e79
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/ConfigurableResource.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.auth.rest;
+
+import io.dropwizard.Configuration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class ConfigurableResource<C extends Configuration> {
+
+    protected final Logger log;
+    protected final C config;
+
+    public ConfigurableResource(C config) {
+        this.log = LoggerFactory.getLogger(getClass());
+        this.config = config;
+    }
+
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/UserSessionDurationAuthorizer.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/UserSessionDurationAuthorizer.java
new file mode 100644
index 0000000..90d8b2b
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/UserSessionDurationAuthorizer.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.auth.rest;
+
+import com.epam.datalab.auth.UserInfo;
+import io.dropwizard.auth.Authorizer;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Date;
+
+@Slf4j
+public final class UserSessionDurationAuthorizer implements Authorizer<UserInfo> {
+    public static final String SHORT_USER_SESSION_DURATION = "SHORT_USER_SESSION";
+    private final long maxSessionDurabilityMilliseconds;
+    private UserSessionDurationCallback callback;
+
+    public UserSessionDurationAuthorizer(UserSessionDurationCallback callback, long maxSessionDurabilityMilliseconds) {
+        this.callback = callback;
+        this.maxSessionDurabilityMilliseconds = maxSessionDurabilityMilliseconds;
+    }
+
+    @Override
+    public boolean authorize(UserInfo principal, String role) {
+        if (SHORT_USER_SESSION_DURATION.equalsIgnoreCase(role)) {
+            try {
+                String refreshToken = principal.getKeys().get("refresh_token");
+                String createdDateOfRefreshToken = principal.getKeys().get("created_date_of_refresh_token");
+
+                if (StringUtils.isEmpty(refreshToken)) {
+                    log.info("Refresh token is empty for user {}", principal.getName());
+                    return false;
+                }
+
+                if (StringUtils.isEmpty(createdDateOfRefreshToken)) {
+                    log.info("Created date for refresh token is empty for user {}", principal.getName());
+                    return false;
+                }
+
+                log.debug("refresh token requested {} and current date is {}",
+                        new Date(Long.valueOf(createdDateOfRefreshToken)), new Date());
+
+                long passedTime = System.currentTimeMillis() - Long.valueOf(createdDateOfRefreshToken);
+
+                log.info("Passed time of session for user {} is {} milliseconds", principal.getName(), passedTime);
+                if (passedTime > maxSessionDurabilityMilliseconds) {
+
+                    silentCallbackExecution(principal);
+
+                    log.info("Re-login required for user {}", principal.getName());
+                    return false;
+                }
+
+                return true;
+            } catch (RuntimeException e) {
+                log.error("Cannot verify durability of session for user {}", principal.getName(), e);
+                return false;
+            }
+
+        }
+
+        return true;
+    }
+
+    private void silentCallbackExecution(UserInfo principal) {
+        log.info("Log out expired user {}", principal.getName());
+        try {
+            callback.onSessionExpired(principal);
+        } catch (RuntimeException e) {
+            log.warn("Error during logout user {}", principal.getName(), e);
+        }
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/UserSessionDurationCallback.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/UserSessionDurationCallback.java
new file mode 100644
index 0000000..c3de925
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/auth/rest/UserSessionDurationCallback.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.auth.rest;
+
+import com.epam.datalab.auth.UserInfo;
+
+@FunctionalInterface
+public interface UserSessionDurationCallback {
+    void onSessionExpired(UserInfo userInfo);
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/cloud/CloudModule.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/cloud/CloudModule.java
new file mode 100644
index 0000000..7be15b1
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/cloud/CloudModule.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.cloud;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Injector;
+import io.dropwizard.setup.Environment;
+
+public abstract class CloudModule extends AbstractModule {
+
+    @Override
+    protected void configure() {
+    }
+
+    public abstract void init(Environment environment, Injector injector);
+
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/cloud/CloudProvider.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/cloud/CloudProvider.java
new file mode 100644
index 0000000..4c42ed5
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/cloud/CloudProvider.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.cloud;
+
+public enum CloudProvider {
+    AWS, AZURE, GCP, GENERAL;
+
+    public String getName() {
+        return this.toString().toLowerCase();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/constants/ServiceConsts.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/constants/ServiceConsts.java
new file mode 100644
index 0000000..c9c4b62
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/constants/ServiceConsts.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.constants;
+
+public final class ServiceConsts {
+    public static final String MONGO_NAME = "mongo";
+    public static final String PROVISIONING_SERVICE_NAME = "provisioningService";
+    public static final String BILLING_SERVICE_NAME = "billingService";
+    public static final String BUCKET_SERVICE_NAME = "bucketService";
+    public static final String MAVEN_SEARCH_API = "mavenSearchService";
+    public static final String SECURITY_SERVICE_NAME = "securityService";
+    public static final String SELF_SERVICE_NAME = "selfService";
+    public static final String PROVISIONING_USER_AGENT = "provisioning-service";
+
+    private ServiceConsts() {
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/mongo/MongoService.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/mongo/MongoService.java
new file mode 100644
index 0000000..b8b8055
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/mongo/MongoService.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.mongo;
+
+import com.mongodb.MongoClient;
+import com.mongodb.WriteConcern;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
+import org.bson.Document;
+
+public class MongoService {
+    private MongoClient client;
+    private String databaseName;
+    private MongoDatabase database;
+
+    private static final Document PING = new Document("ping", "1");
+
+    public MongoService(MongoClient client,
+                        String databaseName,
+                        WriteConcern writeConcern) {
+        this(client, databaseName);
+        database = database.withWriteConcern(writeConcern);
+    }
+
+    public MongoService(MongoClient client, String databaseName) {
+        this.client = client;
+        this.databaseName = databaseName;
+        this.database = client.getDatabase(databaseName);
+    }
+
+    public boolean collectionExists(String name) {
+        for (String c : database.listCollectionNames()) {
+            if (c.equals(name)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public MongoCollection<Document> getCollection(String name) {
+        return database.getCollection(name, Document.class);
+    }
+
+    public <T> MongoCollection<T> getCollection(String name, Class<T> c) {
+        return database.getCollection(name, c);
+    }
+
+    public void createCollection(String name) {
+        database.createCollection(name);
+    }
+
+    public String getDatabaseName() {
+        return databaseName;
+    }
+
+    public MongoClient getClient() {
+        return client;
+    }
+
+    public Document ping() {
+        return database.runCommand(PING);
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/mongo/MongoServiceFactory.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/mongo/MongoServiceFactory.java
new file mode 100644
index 0000000..fbb213e
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/mongo/MongoServiceFactory.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.mongo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.mongodb.MongoClient;
+import com.mongodb.MongoCredential;
+import com.mongodb.ServerAddress;
+import io.dropwizard.lifecycle.Managed;
+import io.dropwizard.setup.Environment;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.util.Collections;
+
+// TODO: Separate configuration and factory responsibilities
+public class MongoServiceFactory {
+    @NotEmpty
+    @JsonProperty
+    private String host;
+
+    @Min(1)
+    @Max(65535)
+    @JsonProperty
+    private int port;
+
+    @NotEmpty
+    @JsonProperty
+    private String username;
+
+    @NotEmpty
+    @JsonProperty
+    private String password;
+
+    @NotEmpty
+    @JsonProperty
+    private String database;
+
+    public MongoService build(Environment environment) {
+        MongoClient client = new MongoClient(new ServerAddress(host, port), Collections.singletonList(
+                MongoCredential.createCredential(username, database, password.toCharArray())
+        ));
+        environment.lifecycle().manage(new Managed() {
+            @Override
+            public void start() {
+            }
+
+            @Override
+            public void stop() {
+                client.close();
+            }
+        });
+        return new MongoService(client, database);
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String getDatabase() {
+        return database;
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesConst.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesConst.java
new file mode 100644
index 0000000..82cc678
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesConst.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.properties;
+
+public interface ChangePropertiesConst {
+    String GKE_SELF_SERVICE_PATH = "/root/self-service.yaml";
+    String GKE_SELF_SERVICE = "self-service.yaml";
+    String SELF_SERVICE = "self-service.yml";
+    String SELF_SERVICE_PROP_PATH = "/opt/datalab/conf/self-service.yml";
+    //    String SELF_SERVICE_PROP_PATH = "services/self-service/self-service.yml";
+    String PROVISIONING_SERVICE = "provisioning.yml";
+    String PROVISIONING_SERVICE_PROP_PATH = "/opt/datalab/conf/provisioning.yml";
+//String PROVISIONING_SERVICE_PROP_PATH = "services/provisioning-service/provisioning.yml";
+
+    String BILLING_SERVICE = "billing.yml";
+    String BILLING_SERVICE_PROP_PATH = "/opt/datalab/conf/billing.yml";
+    //            String BILLING_SERVICE_PROP_PATH = "services/billing-gcp/billing.yml";
+    //      String BILLING_SERVICE_PROP_PATH = "services/billing-azure/billing.yml";
+//    String BILLING_SERVICE_PROP_PATH = "services/billing-aws/billing.yml";
+    String GKE_BILLING_PATH = "/root/billing.yaml";
+    String GKE_BILLING_SERVICE = "billing.yml";
+    String RESTART_URL = "config/restart";
+    String LOCAL_ENDPOINT_NAME = "local";
+    String BASE_CONFIG_URL = "config";
+
+    String SELF_SERVICE_SUPERVISORCTL_RUN_NAME = " ui ";
+    String PROVISIONING_SERVICE_SUPERVISORCTL_RUN_NAME = " provserv ";
+    String BILLING_SERVICE_SUPERVISORCTL_RUN_NAME = " billing ";
+    String SECRET_REGEX = "((.*)[sS]ecret(.*)|(p|P)assword): (.*)";
+    String USER_REGEX = " *(user|username): (.*)";
+    String SECRET_REPLACEMENT_FORMAT = " ***********";
+    String SUPERVISORCTL_RESTART_SH_COMMAND = "sudo supervisorctl restart";
+    String CHANGE_CHMOD_SH_COMMAND_FORMAT = "sudo chmod %s %s";
+    String DEFAULT_CHMOD = "644";
+    String WRITE_CHMOD = "777";
+
+    String LICENCE_REGEX = "# \\*{50,}";
+    String LICENCE =
+            "# *****************************************************************************\n" +
+                    "#\n" +
+                    "# Licensed to the Apache Software Foundation (ASF) under one\n" +
+                    "# or more contributor license agreements. See the NOTICE file\n" +
+                    "# distributed with this work for additional information\n" +
+                    "# regarding copyright ownership. The ASF licenses this file\n" +
+                    "# to you under the Apache License, Version 2.0 (the\n" +
+                    "# \"License\"); you may not use this file except in compliance\n" +
+                    "# with the License. You may obtain a copy of the License at\n" +
+                    "#\n" +
+                    "# http://www.apache.org/licenses/LICENSE-2.0\n" +
+                    "#\n" +
+                    "# Unless required by applicable law or agreed to in writing,\n" +
+                    "# software distributed under the License is distributed on an\n" +
+                    "# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n" +
+                    "# KIND, either express or implied. See the License for the\n" +
+                    "# specific language governing permissions and limitations\n" +
+                    "# under the License.\n" +
+                    "#\n" +
+                    "# ******************************************************************************";
+
+    int DEFAULT_VALUE_PLACE = 1;
+    int DEFAULT_NAME_PLACE = 0;
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesService.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesService.java
new file mode 100644
index 0000000..3190afe
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ChangePropertiesService.java
@@ -0,0 +1,237 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.properties;
+
+import com.epam.datalab.exceptions.DynamicChangePropertiesException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static com.epam.datalab.properties.ChangePropertiesConst.DEFAULT_NAME_PLACE;
+import static com.epam.datalab.properties.ChangePropertiesConst.DEFAULT_VALUE_PLACE;
+
+@Slf4j
+public class ChangePropertiesService {
+
+    public String readFileAsString(String selfServicePropPath, String serviceName) {
+        try {
+            log.info("Trying to read {}, file from path {} :", serviceName, selfServicePropPath);
+            String currentConf = FileUtils.readFileToString(new File(selfServicePropPath), Charset.defaultCharset());
+            return hideSecretsAndRemoveLicence(currentConf);
+        } catch (IOException e) {
+            log.error(e.getMessage());
+            throw new DynamicChangePropertiesException(String.format("Failed while read file %s", serviceName));
+        }
+    }
+
+
+    public void writeFileFromString(String newPropFile, String serviceName, String servicePath) {
+        try {
+            changeCHMODE(serviceName, servicePath, ChangePropertiesConst.DEFAULT_CHMOD, ChangePropertiesConst.WRITE_CHMOD);
+            String oldFile = readFile(serviceName, servicePath);
+            BufferedWriter writer = new BufferedWriter(new FileWriter(servicePath));
+            log.info("Trying to overwrite {}, file for path {} :", serviceName, servicePath);
+            writer.write(addLicence());
+            writer.write(checkAndReplaceSecretIfEmpty(newPropFile, oldFile));
+            log.info("{} overwritten successfully", serviceName);
+            writer.close();
+            changeCHMODE(serviceName, servicePath, ChangePropertiesConst.WRITE_CHMOD, ChangePropertiesConst.DEFAULT_CHMOD);
+        } catch (IOException e) {
+            log.error("Failed to create writer with path {}", servicePath);
+            throw new DynamicChangePropertiesException(String.format("Failed during overwriting %s", serviceName));
+        }
+    }
+
+    private String readFile(String serviceName, String servicePath) {
+        String oldFile;
+        try {
+            oldFile = FileUtils.readFileToString(new File(servicePath), Charset.defaultCharset());
+        } catch (IOException e) {
+            log.error("Failed to read with path {}", servicePath);
+            throw new DynamicChangePropertiesException(String.format("Failed during overwriting %s", serviceName));
+        }
+        return oldFile;
+    }
+
+    public RestartAnswer restart(RestartForm restartForm) {
+        try {
+            boolean billing = restartForm.isBilling();
+            boolean provserv = restartForm.isProvserv();
+            boolean ui = restartForm.isUi();
+            String shCommand = buildSHRestartCommand(billing, provserv, ui);
+            log.info("Tying to restart ui: {}, provserv: {}, billing: {}, with command: {}", ui,
+                    provserv, billing, shCommand);
+            Runtime.getRuntime().exec(shCommand).waitFor();
+            return RestartAnswer.builder()
+                    .billingSuccess(billing)
+                    .provservSuccess(provserv)
+                    .endpoint(restartForm.getEndpoint())
+                    .build();
+        } catch (IOException | InterruptedException e) {
+            log.error(e.getMessage());
+            return RestartAnswer.builder()
+                    .billingSuccess(false)
+                    .provservSuccess(false)
+                    .endpoint(restartForm.getEndpoint())
+                    .build();
+        }
+    }
+
+
+    private String hideSecretsAndRemoveLicence(String currentConf) {
+        Matcher passMatcher = Pattern.compile(ChangePropertiesConst.SECRET_REGEX).matcher(currentConf);
+        Matcher userMatcher = Pattern.compile(ChangePropertiesConst.USER_REGEX).matcher(currentConf);
+        List<String> secretsAndUsers = new ArrayList<>();
+        final String[] confWithReplacedSecretConf = {removeLicence(currentConf)};
+        while (passMatcher.find()) {
+            String[] secret = passMatcher.group().split(":");
+            if (!(secret[DEFAULT_VALUE_PLACE].isEmpty() ||
+                    secret[DEFAULT_VALUE_PLACE].trim().isEmpty())) {
+
+                secretsAndUsers.add(secret[DEFAULT_NAME_PLACE] + ":" + secret[DEFAULT_VALUE_PLACE]);
+            }
+        }
+        while (userMatcher.find()) {
+            String[] user = userMatcher.group().split(":");
+            if (!(user[DEFAULT_VALUE_PLACE].isEmpty() ||
+                    user[DEFAULT_VALUE_PLACE].trim().isEmpty()))
+                secretsAndUsers.add(user[DEFAULT_NAME_PLACE] + ":" + user[DEFAULT_VALUE_PLACE]);
+
+        }
+        secretsAndUsers.forEach(x -> {
+            String toReplace = x.split(":")[DEFAULT_NAME_PLACE] + ":" + ChangePropertiesConst.SECRET_REPLACEMENT_FORMAT;
+            confWithReplacedSecretConf[0] = confWithReplacedSecretConf[0].replace(x, toReplace);
+        });
+        return confWithReplacedSecretConf[0];
+    }
+
+    private String removeLicence(String conf) {
+        return conf.split(ChangePropertiesConst.LICENCE_REGEX)[conf.split(ChangePropertiesConst.LICENCE_REGEX).length - 1];
+    }
+
+
+    private void changeCHMODE(String serviceName, String path, String fromMode, String toMode) throws IOException {
+        try {
+            String command = String.format(ChangePropertiesConst.CHANGE_CHMOD_SH_COMMAND_FORMAT, toMode, path);
+            log.info("Trying to change chmod for file {} {}->{}", serviceName, fromMode, toMode);
+            log.info("Execute command: {}", command);
+            Runtime.getRuntime().exec(command).waitFor();
+        } catch (InterruptedException e) {
+            log.error("Failed change chmod for file {} {}->{}", serviceName, fromMode, toMode);
+        }
+    }
+
+    private String addLicence() {
+        return ChangePropertiesConst.LICENCE;
+    }
+
+    private String checkAndReplaceSecretIfEmpty(String newPropFile, String oldProf) {
+        Map<String, Queue<String>> emptySecretsAndUserNames = findEmptySecretAndNames(newPropFile);
+        return emptySecretsAndUserNames.isEmpty() ? newPropFile : replaceOldSecret(newPropFile, oldProf, emptySecretsAndUserNames);
+    }
+
+    private String replaceOldSecret(String newPropFile, String oldProf, Map<String, Queue<String>> emptySecrets) {
+        String fileWithReplacedEmptySecrets = newPropFile;
+        Matcher oldPassMatcher = Pattern.compile(ChangePropertiesConst.SECRET_REGEX).matcher(oldProf);
+        Matcher oldUserMatcher = Pattern.compile(ChangePropertiesConst.USER_REGEX).matcher(oldProf);
+
+        while (oldPassMatcher.find()) {
+            String[] s = oldPassMatcher.group().split(":");
+            if (emptySecrets.containsKey(s[ChangePropertiesConst.DEFAULT_NAME_PLACE])) {
+
+                String poll = emptySecrets.get(s[DEFAULT_NAME_PLACE]).poll();
+                if (poll != null) {
+                    poll = poll.replace("*", "\\*");
+                    String old = oldPassMatcher.group();
+                    old = old.replace("$", "\\$");
+                    old = old.replaceFirst("\\{", "\\{");
+                    old = old.replaceFirst("}", "\\}");
+                    fileWithReplacedEmptySecrets = fileWithReplacedEmptySecrets.replaceFirst(poll, old);
+                }
+            }
+        }
+        while (oldUserMatcher.find()) {
+            String[] s = oldUserMatcher.group().split(":");
+            if (emptySecrets.containsKey(s[ChangePropertiesConst.DEFAULT_NAME_PLACE])) {
+                String poll = emptySecrets.get(s[DEFAULT_NAME_PLACE]).poll();
+                if (poll != null) {
+                    poll = poll.replace("*", "\\*");
+                    String old = oldUserMatcher.group();
+                    old = old.replace("$", "\\$");
+                    old = old.replace("{", "\\}");
+                    old = old.replace("}", "\\}");
+                    fileWithReplacedEmptySecrets = fileWithReplacedEmptySecrets.replaceFirst(poll, old);
+                }
+            }
+        }
+        return fileWithReplacedEmptySecrets;
+    }
+
+    private Map<String, Queue<String>> findEmptySecretAndNames(String newPropFile) {
+        Matcher passMatcher = Pattern.compile(ChangePropertiesConst.SECRET_REGEX).matcher(newPropFile);
+        Matcher userNameMatcher = Pattern.compile(ChangePropertiesConst.USER_REGEX).matcher(newPropFile);
+        Map<String, Queue<String>> emptySecrets = new HashMap<>();
+        while (passMatcher.find()) {
+            String[] s = passMatcher.group().split(":");
+            if (s[DEFAULT_VALUE_PLACE].equals(ChangePropertiesConst.SECRET_REPLACEMENT_FORMAT)) {
+                if (emptySecrets.get(s[DEFAULT_NAME_PLACE]) == null) {
+                    Queue<String> values = new ArrayDeque<>();
+                    values.add(passMatcher.group());
+                    emptySecrets.put(s[ChangePropertiesConst.DEFAULT_NAME_PLACE], values);
+                } else {
+                    Queue<String> values = emptySecrets.get(s[DEFAULT_NAME_PLACE]);
+                    values.add(passMatcher.group());
+                }
+            }
+        }
+
+        while (userNameMatcher.find()) {
+            String[] s = userNameMatcher.group().split(":");
+            if (s[DEFAULT_VALUE_PLACE].equals(ChangePropertiesConst.SECRET_REPLACEMENT_FORMAT)) {
+                if (emptySecrets.get(s[DEFAULT_NAME_PLACE]) == null) {
+                    Queue<String> values = new ArrayDeque<>();
+                    values.add(userNameMatcher.group());
+                    emptySecrets.put(s[ChangePropertiesConst.DEFAULT_NAME_PLACE], values);
+                } else {
+                    Queue<String> values = emptySecrets.get(s[DEFAULT_NAME_PLACE]);
+                    values.add(userNameMatcher.group());
+                }
+            }
+        }
+        return emptySecrets;
+    }
+
+    private String buildSHRestartCommand(boolean billing, boolean provserv, boolean ui) {
+        StringBuilder stringBuilder = new StringBuilder(ChangePropertiesConst.SUPERVISORCTL_RESTART_SH_COMMAND);
+        if (billing) stringBuilder.append(ChangePropertiesConst.BILLING_SERVICE_SUPERVISORCTL_RUN_NAME);
+        if (provserv) stringBuilder.append(ChangePropertiesConst.PROVISIONING_SERVICE_SUPERVISORCTL_RUN_NAME);
+        if (ui) stringBuilder.append(ChangePropertiesConst.SELF_SERVICE_SUPERVISORCTL_RUN_NAME);
+        return stringBuilder.toString();
+    }
+
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ExternalChangeProperties.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ExternalChangeProperties.java
new file mode 100644
index 0000000..d05c528
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/ExternalChangeProperties.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.properties;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.rest.client.RESTService;
+import lombok.extern.slf4j.Slf4j;
+import sun.reflect.generics.reflectiveObjects.NotImplementedException;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+public class ExternalChangeProperties implements ChangePropertiesConst {
+    private final RESTService provService;
+    private final ChangePropertiesService changePropertiesService;
+
+    @Inject
+    public ExternalChangeProperties(@Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provService,
+                                    ChangePropertiesService changePropertiesService) {
+        this.provService = provService;
+        this.changePropertiesService = changePropertiesService;
+    }
+
+    public String getProperties(String path, String name) {
+        return changePropertiesService.readFileAsString(path, name);
+    }
+
+    public void overwriteProperties(String path, String name, String ymlString) {
+        changePropertiesService.writeFileFromString(ymlString, name, path);
+    }
+
+    public Map<String, String> getPropertiesWithExternal(String endpoint, UserInfo userInfo, String url) {
+        Map<String, String> properties = new HashMap<>();
+        if (endpoint.equals(LOCAL_ENDPOINT_NAME)) {
+            properties.put(SELF_SERVICE, getProperties(SELF_SERVICE_PROP_PATH, SELF_SERVICE));
+            properties.put(PROVISIONING_SERVICE, getProperties(PROVISIONING_SERVICE_PROP_PATH, PROVISIONING_SERVICE));
+            properties.put(BILLING_SERVICE, getProperties(BILLING_SERVICE_PROP_PATH, BILLING_SERVICE));
+
+        } else {
+            log.info("Trying to read properties, for external endpoint : {} , for user: {}",
+                    endpoint, userInfo.getSimpleName());
+            String provPath = url + "/provisioning-service";
+            properties.put(PROVISIONING_SERVICE,
+                    provService.get(provPath, userInfo.getAccessToken(), String.class));
+            String billPath = url + "/billing";
+            properties.put(BILLING_SERVICE,
+                    provService.get(billPath, userInfo.getAccessToken(), String.class));
+        }
+        return properties;
+    }
+
+    public void overwritePropertiesWithExternal(String path, String name, YmlDTO ymlDTO,
+                                                UserInfo userInfo, String url) {
+        log.info("Trying to write {}, for external endpoint : {} , for user: {}",
+                name, ymlDTO.getEndpointName(), userInfo.getSimpleName());
+        if (ymlDTO.getEndpointName().equals(LOCAL_ENDPOINT_NAME)
+                || name.equals(SELF_SERVICE)
+                || name.equals(GKE_SELF_SERVICE)) {
+            changePropertiesService.writeFileFromString(ymlDTO.getYmlString(), name, path);
+        } else {
+            url += findMethodName(name);
+            provService.post(url, userInfo.getAccessToken(), ymlDTO, Void.class);
+        }
+    }
+
+
+    public RestartAnswer restartForExternal(RestartForm restartForm, UserInfo userInfo, String url) {
+        if (restartForm.getEndpoint().equals(LOCAL_ENDPOINT_NAME)) {
+            return changePropertiesService.restart(restartForm);
+        } else {
+            log.info("External request for endpoint {}, for user {}", restartForm.getEndpoint(), userInfo.getSimpleName());
+            return provService.post(url, userInfo.getAccessToken(), restartForm, RestartAnswer.class);
+        }
+    }
+
+    private String findMethodName(String name) {
+        switch (name) {
+            case "provisioning.yml":
+            case "provisioning": {
+                return "/provisioning-service";
+            }
+            case "billing.yml":
+            case "billing": {
+                return "/billing";
+            }
+            default:
+                return "";
+        }
+    }
+
+    public void restartForExternalForGKE(UserInfo userInfo, RestartForm restartForm) {
+        throw new NotImplementedException();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/RestartAnswer.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/RestartAnswer.java
new file mode 100644
index 0000000..74274c2
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/RestartAnswer.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.properties;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class RestartAnswer {
+
+    private boolean billingSuccess;
+    private boolean provservSuccess;
+    private String endpoint;
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/RestartForm.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/RestartForm.java
new file mode 100644
index 0000000..7ee69eb
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/RestartForm.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.properties;
+
+import lombok.Data;
+
+@Data
+public class RestartForm {
+
+    private boolean billing;
+    private boolean provserv;
+    private boolean ui;
+    private String endpoint;
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/YmlDTO.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/YmlDTO.java
new file mode 100644
index 0000000..aa2558a
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/properties/YmlDTO.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.properties;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+@Data
+public class YmlDTO {
+
+    @JsonIgnoreProperties
+    private String endpointName;
+    private String ymlString;
+}
\ No newline at end of file
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/client/RESTService.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/client/RESTService.java
new file mode 100644
index 0000000..a2d502d
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/client/RESTService.java
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.client;
+
+import lombok.extern.slf4j.Slf4j;
+import org.glassfish.jersey.media.multipart.Boundary;
+import org.glassfish.jersey.media.multipart.FormDataMultiPart;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import java.net.URI;
+import java.util.Collections;
+import java.util.Map;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+import static javax.ws.rs.core.MediaType.MULTIPART_FORM_DATA_TYPE;
+
+@Slf4j
+public class RESTService {
+    private Client client;
+    private String url;
+    private String userAgent;
+
+    public RESTService() {
+    }
+
+    RESTService(Client client, String url, String userAgent) {
+        this.client = client;
+        this.url = url;
+        this.userAgent = userAgent;
+    }
+
+    RESTService(Client client, String userAgent) {
+        this.client = client;
+        this.userAgent = userAgent;
+    }
+
+    public <T> T get(String path, Class<T> clazz) {
+        return get(path, null, clazz);
+    }
+
+    public <T> T get(URI path, Class<T> clazz) {
+        log.debug("REST get {}", path);
+        return client.target(URI.create(url + path.toString()))
+                .request()
+                .get(clazz);
+    }
+
+    public <T> T getWithMediaTypes(String path, String accessToken, Class<T> clazz, String requestMediaType, String acceptMediaType) {
+        return get(path, accessToken, clazz, requestMediaType, acceptMediaType);
+    }
+
+    public <T> T get(String path, String accessToken, Class<T> clazz) {
+        return get(path, accessToken, clazz, APPLICATION_JSON, APPLICATION_JSON);
+    }
+
+    private <T> T get(String path, String accessToken, Class<T> clazz, String requestMediaType, String acceptMediaType) {
+        Invocation.Builder builder = getBuilder(path, accessToken, Collections.emptyMap(), requestMediaType, acceptMediaType);
+        log.debug("REST get secured {} {}", path, accessToken);
+        return builder.get(clazz);
+    }
+
+    public <T> T get(String path, GenericType<T> genericType) {
+        return get(path, null, genericType);
+    }
+
+    public <T> T get(String path, String accessToken, GenericType<T> genericType) {
+        return get(path, accessToken, genericType, Collections.emptyMap());
+    }
+
+    public <T> T get(String path, String accessToken, GenericType<T> genericType, Map<String, Object> queryParams) {
+        Invocation.Builder builder = getBuilder(path, accessToken, queryParams, APPLICATION_JSON, APPLICATION_JSON);
+        log.debug("REST get secured {} {}", path, accessToken);
+        return builder.get(genericType);
+    }
+
+    public <T> T post(String path, Object parameter, Class<T> clazz) {
+        return post(path, null, parameter, clazz);
+    }
+
+    public <T> T post(String path, String accessToken, Object parameter, Class<T> clazz) {
+        return post(path, accessToken, parameter, clazz, Collections.emptyMap(), APPLICATION_JSON, APPLICATION_JSON);
+    }
+
+    public <T> T delete(String path, String accessToken, Class<T> clazz, String requestMediaType, String acceptMediaType) {
+        return delete(path, accessToken, clazz, Collections.emptyMap(), requestMediaType, acceptMediaType);
+    }
+
+    private <T> T delete(String path, String accessToken, Class<T> clazz, Map<String, Object> queryParams,
+                         String requestMediaType, String acceptMediaType) {
+        Invocation.Builder builder = getBuilder(path, accessToken, queryParams, requestMediaType, acceptMediaType);
+        log.debug("REST delete secured {} {}", path, accessToken);
+        return builder.delete(clazz);
+    }
+
+    private <T> T post(String path, String accessToken, Object parameter, Class<T> clazz, Map<String, Object> queryParams,
+                       String requestMediaType, String acceptMediaType) {
+        Invocation.Builder builder = getBuilder(path, accessToken, queryParams, requestMediaType, acceptMediaType);
+        log.debug("REST post secured {} {}", path, accessToken);
+        return builder.post(Entity.json(parameter), clazz);
+    }
+
+
+    private Invocation.Builder getBuilder(String path, String token, Map<String, Object> queryParams,
+                                          String requestMediaType, String acceptMediaType) {
+        WebTarget webTarget = getWebTarget(path);
+        for (Map.Entry<String, Object> entry : queryParams.entrySet()) {
+            webTarget = webTarget.queryParam(entry.getKey(), entry.getValue());
+        }
+
+        Invocation.Builder builder = webTarget
+                .request(requestMediaType)
+                .accept(acceptMediaType);
+
+        if (token != null) {
+            builder.header(HttpHeaders.AUTHORIZATION, "Bearer " + token);
+        }
+        if (userAgent != null) {
+            builder.header(HttpHeaders.USER_AGENT, userAgent);
+        }
+
+        return builder;
+    }
+
+    public <T> T postForm(String path, String token, FormDataMultiPart form, Class<T> clazz) {
+        WebTarget webTarget = getWebTarget(path);
+        Invocation.Builder builder = webTarget.request();
+        if (token != null) {
+            builder.header(HttpHeaders.AUTHORIZATION, "Bearer " + token);
+        }
+        if (userAgent != null) {
+            builder.header(HttpHeaders.USER_AGENT, userAgent);
+        }
+
+        MediaType mediaType = Boundary.addBoundary(MULTIPART_FORM_DATA_TYPE);
+        return builder.post(Entity.entity(form, mediaType), clazz);
+    }
+
+
+    private WebTarget getWebTarget(String path) {
+        return url != null ? client.target(url).path(path) : client.target(path);
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/client/RESTServiceFactory.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/client/RESTServiceFactory.java
new file mode 100644
index 0000000..cfc5269
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/client/RESTServiceFactory.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.client;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.dropwizard.client.JerseyClientBuilder;
+import io.dropwizard.client.JerseyClientConfiguration;
+import io.dropwizard.setup.Environment;
+import org.apache.commons.lang3.StringUtils;
+import org.glassfish.jersey.media.multipart.MultiPartFeature;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.client.Client;
+
+public class RESTServiceFactory {
+    @JsonProperty
+    private String protocol;
+
+    @JsonProperty
+    private String host;
+
+    @JsonProperty
+    private int port;
+
+    @Valid
+    @NotNull
+    @JsonProperty("jerseyClient")
+    private JerseyClientConfiguration jerseyClientConfiguration;
+
+    public RESTService build(Environment environment, String name) {
+        return build(environment, name, null);
+    }
+
+    public RESTService build(Environment environment, String name, String userAgent) {
+        Client client = new JerseyClientBuilder(environment).using(jerseyClientConfiguration).build(name).register(MultiPartFeature.class);
+        return StringUtils.isNotEmpty(host) ?
+                new RESTService(client, getURL(), userAgent) : new RESTService(client, userAgent);
+    }
+
+    private String getURL() {
+        return String.format("%s://%s:%d", protocol, host, port);
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/ApiCallbacks.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/ApiCallbacks.java
new file mode 100644
index 0000000..dfbdfb8
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/ApiCallbacks.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.contracts;
+
+public class ApiCallbacks {
+    public static final String API = "/api";
+    public static final String KEY_LOADER = API + "/user/access_key/callback";
+    public static final String INFRASTRUCTURE_PROVISION = API + "/infrastructure_provision";
+    public static final String COMPUTATIONAL = INFRASTRUCTURE_PROVISION + "/computational_resources";
+    public static final String EXPLORATORY = INFRASTRUCTURE_PROVISION + "/exploratory_environment";
+    public static final String LIBRARY = INFRASTRUCTURE_PROVISION + "/library";
+    public static final String UPDATE_LIBS_URI = LIBRARY + "/update_lib_list";
+    public static final String INFRASTRUCTURE = API + "/infrastructure";
+    public static final String EDGE = INFRASTRUCTURE + "/edge";
+    public static final String STATUS_URI = "/status";
+    public static final String LIB_STATUS_URI = LIBRARY + "/lib_status";
+    public static final String GIT_CREDS = API + "/user/git_creds" + STATUS_URI;
+    public static final String IMAGE = INFRASTRUCTURE_PROVISION + "/image";
+    public static final String IMAGE_STATUS_URI = IMAGE + "/image_status";
+    public static final String BACKUP_URI = API + "/infrastructure/backup" + STATUS_URI;
+    public static final String REUPLOAD_KEY_URI = API + "/infrastructure/reupload_key/callback";
+    public static final String CHECK_INACTIVITY_EXPLORATORY_URI = API + "/infrastructure/inactivity/callback/exploratory";
+    public static final String CHECK_INACTIVITY_COMPUTATIONAL_URI = API + "/infrastructure/inactivity/callback" +
+            "/computational";
+
+    private ApiCallbacks() {
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/BackupAPI.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/BackupAPI.java
new file mode 100644
index 0000000..4e1642b
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/BackupAPI.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.contracts;
+
+public class BackupAPI {
+    public static final String BACKUP = "backup";
+
+    private BackupAPI() {
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/ComputationalAPI.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/ComputationalAPI.java
new file mode 100644
index 0000000..c4c2a94
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/ComputationalAPI.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.contracts;
+
+public interface ComputationalAPI {
+    String AUDIT_MESSAGE = "Notebook name %s";
+    String AUDIT_COMPUTATIONAL_RECONFIGURE_MESSAGE = "Reconfigure compute %s, requested for notebook %s";
+    String LIBRARY = "library/";
+    String COMPUTATIONAL = "computational";
+    String COMPUTATIONAL_CREATE = COMPUTATIONAL + "/create";
+    String COMPUTATIONAL_STOP = COMPUTATIONAL + "/stop";
+    String COMPUTATIONAL_START = COMPUTATIONAL + "/start";
+    String SPARK = "/spark";
+    String COMPUTATIONAL_CREATE_SPARK = COMPUTATIONAL_CREATE + SPARK;
+    String COMPUTATIONAL_RECONFIGURE_SPARK = COMPUTATIONAL + SPARK + "/reconfigure";
+    String COMPUTATIONAL_CREATE_CLOUD_SPECIFIC = COMPUTATIONAL_CREATE + "/cloud";
+    String COMPUTATIONAL_TERMINATE = COMPUTATIONAL + "/terminate";
+    String COMPUTATIONAL_TERMINATE_SPARK = COMPUTATIONAL_TERMINATE + SPARK;
+    String COMPUTATIONAL_STOP_SPARK = COMPUTATIONAL_STOP + SPARK;
+    String COMPUTATIONAL_START_SPARK = COMPUTATIONAL_START + SPARK;
+    String COMPUTATIONAL_TERMINATE_CLOUD_SPECIFIC = COMPUTATIONAL_TERMINATE + "/cloud";
+    String COMPUTATIONAL_LIB_INSTALL = LIBRARY + COMPUTATIONAL + "/lib_install";
+    String COMPUTATIONAL_LIB_LIST = LIBRARY + COMPUTATIONAL + "/lib_list";
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/DockerAPI.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/DockerAPI.java
new file mode 100644
index 0000000..48aa0ab
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/DockerAPI.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.contracts;
+
+public interface DockerAPI {
+    String DOCKER = "docker";
+    String DOCKER_RUN = DOCKER + "/run";
+    String DOCKER_EXPLORATORY = DOCKER + "/exploratory";
+    String DOCKER_COMPUTATIONAL = DOCKER + "/computational";
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/ExploratoryAPI.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/ExploratoryAPI.java
new file mode 100644
index 0000000..d153a15
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/ExploratoryAPI.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.contracts;
+
+public interface ExploratoryAPI {
+    String LIBRARY = "library/";
+    String EXPLORATORY = "exploratory";
+    String EXPLORATORY_CREATE = EXPLORATORY + "/create";
+    String EXPLORATORY_RECONFIGURE_SPARK = EXPLORATORY + "/reconfigure_spark";
+    String EXPLORATORY_START = EXPLORATORY + "/start";
+    String EXPLORATORY_TERMINATE = EXPLORATORY + "/terminate";
+    String EXPLORATORY_STOP = EXPLORATORY + "/stop";
+    String EXPLORATORY_LIB_INSTALL = LIBRARY + EXPLORATORY + "/lib_install";
+    String EXPLORATORY_LIB_LIST = LIBRARY + EXPLORATORY + "/lib_list";
+    String EXPLORATORY_GIT_CREDS = EXPLORATORY + "/git_creds";
+    String EXPLORATORY_IMAGE = EXPLORATORY + "/image";
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/InfrasctructureAPI.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/InfrasctructureAPI.java
new file mode 100644
index 0000000..9b1c1f4
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/InfrasctructureAPI.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.rest.contracts;
+
+public final class InfrasctructureAPI {
+    public static final String INFRASTRUCTURE = "infrastructure";
+    public static final String INFRASTRUCTURE_STATUS = INFRASTRUCTURE + "/status";
+    public static final String EXPLORATORY_CHECK_INACTIVITY = INFRASTRUCTURE + "/exploratory/check_inactivity";
+    public static final String COMPUTATIONAL_CHECK_INACTIVITY = INFRASTRUCTURE + "/computational/check_inactivity";
+
+    private InfrasctructureAPI() {
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/KeyAPI.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/KeyAPI.java
new file mode 100644
index 0000000..613a72e
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/contracts/KeyAPI.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.contracts;
+
+public class KeyAPI {
+    public static final String REUPLOAD_KEY = "/key/reupload";
+    public static final String GET_ADMIN_KEY = "key";
+    public static final String KEY_EXTENTION = ".pub";
+
+    private KeyAPI() {
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/dto/ErrorDTO.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/dto/ErrorDTO.java
new file mode 100644
index 0000000..1d1c148
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/dto/ErrorDTO.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class ErrorDTO {
+
+    @JsonProperty
+    private final int code;
+    @JsonProperty
+    private final String message;
+
+    public ErrorDTO(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/AuthenticationExceptionMapper.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/AuthenticationExceptionMapper.java
new file mode 100644
index 0000000..ac37e3d
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/AuthenticationExceptionMapper.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.mappers;
+
+import com.epam.datalab.exceptions.DatalabAuthenticationException;
+import com.epam.datalab.rest.dto.ErrorDTO;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+
+public class AuthenticationExceptionMapper implements ExceptionMapper<DatalabAuthenticationException> {
+    @Override
+    public Response toResponse(DatalabAuthenticationException exception) {
+        final Response.Status unauthorized = Response.Status.UNAUTHORIZED;
+        return Response.status(unauthorized)
+                .entity(new ErrorDTO(unauthorized.getStatusCode(), exception.getMessage()))
+                .type(MediaType.APPLICATION_JSON)
+                .build();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/DatalabValidationExceptionMapper.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/DatalabValidationExceptionMapper.java
new file mode 100644
index 0000000..6abf825
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/DatalabValidationExceptionMapper.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.mappers;
+
+import com.epam.datalab.exceptions.DatalabValidationException;
+import com.epam.datalab.rest.dto.ErrorDTO;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+
+public class DatalabValidationExceptionMapper implements ExceptionMapper<DatalabValidationException> {
+    @Override
+    public Response toResponse(DatalabValidationException exception) {
+        final Response.Status badRequest = Response.Status.BAD_REQUEST;
+        return Response.status(badRequest)
+                .entity(new ErrorDTO(badRequest.getStatusCode(), exception.getMessage()))
+                .type(MediaType.APPLICATION_JSON)
+                .build();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/DynamicChangePropertiesExceptionMapper.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/DynamicChangePropertiesExceptionMapper.java
new file mode 100644
index 0000000..d0687e6
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/DynamicChangePropertiesExceptionMapper.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.mappers;
+
+import com.epam.datalab.exceptions.DynamicChangePropertiesException;
+import com.epam.datalab.rest.dto.ErrorDTO;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+
+public class DynamicChangePropertiesExceptionMapper implements ExceptionMapper<DynamicChangePropertiesException> {
+
+    @Override
+    public Response toResponse(DynamicChangePropertiesException e) {
+        final Response.Status status = Response.Status.NO_CONTENT;
+        return Response.status(status)
+                .type(MediaType.APPLICATION_JSON)
+                .entity(new ErrorDTO(status.getStatusCode(), e.getMessage()))
+                .build();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/GenericExceptionMapper.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/GenericExceptionMapper.java
new file mode 100644
index 0000000..6c97897
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/GenericExceptionMapper.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.mappers;
+
+import com.epam.datalab.rest.dto.ErrorDTO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+
+public abstract class GenericExceptionMapper<E extends Exception> implements ExceptionMapper<E> {
+    static final Logger LOGGER = LoggerFactory.getLogger(GenericExceptionMapper.class);
+
+    @Override
+    public Response toResponse(E exception) {
+        LOGGER.error("Uncaught exception in application", exception);
+
+        return Response
+                .serverError()
+                .entity(new ErrorDTO(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), exception.getMessage()))
+                .type(MediaType.APPLICATION_JSON)
+                .build();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/JsonProcessingExceptionMapper.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/JsonProcessingExceptionMapper.java
new file mode 100644
index 0000000..e19077d
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/JsonProcessingExceptionMapper.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.mappers;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class JsonProcessingExceptionMapper extends GenericExceptionMapper<JsonProcessingException> {
+}
\ No newline at end of file
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ResourceConflictExceptionMapper.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ResourceConflictExceptionMapper.java
new file mode 100644
index 0000000..2ab40b5
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ResourceConflictExceptionMapper.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.mappers;
+
+import com.epam.datalab.exceptions.ResourceConflictException;
+import com.epam.datalab.rest.dto.ErrorDTO;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class ResourceConflictExceptionMapper implements ExceptionMapper<ResourceConflictException> {
+    @Override
+    public Response toResponse(ResourceConflictException e) {
+        final Response.Status conflict = Response.Status.CONFLICT;
+        return Response.status(conflict)
+                .type(MediaType.APPLICATION_JSON)
+                .entity(new ErrorDTO(conflict.getStatusCode(), e.getMessage()))
+                .build();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ResourceNotFoundExceptionMapper.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ResourceNotFoundExceptionMapper.java
new file mode 100644
index 0000000..adcd174
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ResourceNotFoundExceptionMapper.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.mappers;
+
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.rest.dto.ErrorDTO;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+public class ResourceNotFoundExceptionMapper implements ExceptionMapper<ResourceNotFoundException> {
+    @Override
+    public Response toResponse(ResourceNotFoundException e) {
+        final Response.Status notFound = Response.Status.NOT_FOUND;
+        return Response.status(notFound)
+                .type(MediaType.APPLICATION_JSON)
+                .entity(new ErrorDTO(notFound.getStatusCode(), e.getMessage()))
+                .build();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ResourceQuoteReachedExceptionMapper.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ResourceQuoteReachedExceptionMapper.java
new file mode 100644
index 0000000..821a77d
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ResourceQuoteReachedExceptionMapper.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.rest.mappers;
+
+import com.epam.datalab.exceptions.ResourceQuoteReachedException;
+import com.epam.datalab.rest.dto.ErrorDTO;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+
+public class ResourceQuoteReachedExceptionMapper implements ExceptionMapper<ResourceQuoteReachedException> {
+    @Override
+    public Response toResponse(ResourceQuoteReachedException exception) {
+        final Response.Status forbidden = Response.Status.FORBIDDEN;
+        return Response.status(forbidden)
+                .type(MediaType.APPLICATION_JSON_TYPE)
+                .entity(new ErrorDTO(forbidden.getStatusCode(), exception.getMessage()))
+                .build();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/RuntimeExceptionMapper.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/RuntimeExceptionMapper.java
new file mode 100644
index 0000000..918729a
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/RuntimeExceptionMapper.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.mappers;
+
+import com.epam.datalab.rest.dto.ErrorDTO;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
+
+@Provider
+@Slf4j
+public class RuntimeExceptionMapper extends GenericExceptionMapper<RuntimeException> {
+
+    @Override
+    public Response toResponse(RuntimeException exception) {
+        if (exception instanceof WebApplicationException) {
+            return handleWebApplicationException(exception);
+        }
+        return super.toResponse(exception);
+    }
+
+    private Response handleWebApplicationException(RuntimeException exception) {
+        WebApplicationException webAppException = (WebApplicationException) exception;
+
+        if (webAppException.getResponse().getStatusInfo() == Response.Status.UNAUTHORIZED
+                || webAppException.getResponse().getStatusInfo() == Response.Status.FORBIDDEN) {
+
+            return web(exception, Response.Status.UNAUTHORIZED);
+        } else if (webAppException.getResponse().getStatusInfo() == Response.Status.NOT_FOUND) {
+            return web(exception, Response.Status.NOT_FOUND);
+        }
+
+        return super.toResponse(exception);
+    }
+
+    private Response web(RuntimeException exception, Response.StatusType status) {
+        log.error("Web application exception: {}", exception.getMessage(), exception);
+        return Response.status(status)
+                .type(MediaType.APPLICATION_JSON)
+                .entity(new ErrorDTO(status.getStatusCode(), exception.getMessage()))
+                .build();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ValidationExceptionMapper.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ValidationExceptionMapper.java
new file mode 100644
index 0000000..f89b10c
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/rest/mappers/ValidationExceptionMapper.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.mappers;
+
+import com.epam.datalab.rest.dto.ErrorDTO;
+import io.dropwizard.jersey.validation.ConstraintMessage;
+import io.dropwizard.jersey.validation.JerseyViolationException;
+import org.glassfish.jersey.server.model.Invocable;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import java.util.stream.Collectors;
+
+public class ValidationExceptionMapper implements ExceptionMapper<JerseyViolationException> {
+    @Override
+    public Response toResponse(JerseyViolationException exception) {
+        Invocable invocable = exception.getInvocable();
+        final String errors =
+                exception.getConstraintViolations()
+                        .stream().map(violation -> ConstraintMessage.getMessage(violation, invocable))
+                        .collect(Collectors.joining(","));
+        return Response.status(Response.Status.BAD_REQUEST)
+                .entity(new ErrorDTO(Response.Status.BAD_REQUEST.getStatusCode(), errors))
+                .type(MediaType.APPLICATION_JSON)
+                .build();
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/AwsValidation.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/AwsValidation.java
new file mode 100644
index 0000000..ba91b30
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/AwsValidation.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.validation;
+
+public interface AwsValidation {
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/AzureValidation.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/AzureValidation.java
new file mode 100644
index 0000000..e0dfd6d
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/AzureValidation.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.validation;
+
+public interface AzureValidation {
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/CloudConfigurationSequenceProvider.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/CloudConfigurationSequenceProvider.java
new file mode 100644
index 0000000..e1045c4
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/CloudConfigurationSequenceProvider.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.validation;
+
+import com.epam.datalab.ServiceConfiguration;
+import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;
+
+import java.lang.reflect.ParameterizedType;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CloudConfigurationSequenceProvider<T extends ServiceConfiguration> implements DefaultGroupSequenceProvider<T> {
+    @Override
+    public List<Class<?>> getValidationGroups(T c) {
+        List<Class<?>> sequence = new ArrayList<>();
+
+        sequence.add(initialSequenceGroup());
+
+        if (c == null) {
+            return sequence;
+        } else {
+            switch (c.getCloudProvider()) {
+                case AWS:
+                    sequence.add(AwsValidation.class);
+                    break;
+                case AZURE:
+                    sequence.add(AzureValidation.class);
+                    break;
+                case GCP:
+                    sequence.add(GcpValidation.class);
+                    break;
+                default:
+                    throw new IllegalArgumentException("Cloud provider is not supported" + c.getCloudProvider());
+            }
+        }
+
+        return sequence;
+    }
+
+    private Class<T> initialSequenceGroup() {
+        ParameterizedType parameterizedType = (ParameterizedType) getClass()
+                .getGenericSuperclass();
+
+        @SuppressWarnings("unchecked")
+        Class<T> ret = (Class<T>) parameterizedType.getActualTypeArguments()[0];
+
+        return ret;
+    }
+}
diff --git a/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/GcpValidation.java b/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/GcpValidation.java
new file mode 100644
index 0000000..6dc70d5
--- /dev/null
+++ b/services/datalab-webapp-common/src/main/java/com/epam/datalab/validation/GcpValidation.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.validation;
+
+public interface GcpValidation {
+}
diff --git a/services/dlab-model/pom.xml b/services/dlab-model/pom.xml
deleted file mode 100644
index 17e5b31..0000000
--- a/services/dlab-model/pom.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>dlab</artifactId>
-        <groupId>com.epam.dlab</groupId>
-        <version>1.0</version>
-        <relativePath>../../pom.xml</relativePath>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>dlab-model</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>dlab-utils</artifactId>
-            <version>${project.parent.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>javax.ws.rs</groupId>
-            <artifactId>javax.ws.rs-api</artifactId>
-            <version>2.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>javax.validation</groupId>
-            <artifactId>validation-api</artifactId>
-            <version>2.0.0.Final</version>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-lang3</artifactId>
-            <version>3.7</version>
-            <scope>provided</scope>
-        </dependency>
-
-        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
-        <dependency>
-            <groupId>org.hibernate</groupId>
-            <artifactId>hibernate-validator</artifactId>
-            <version>${hibernate.validator.version}</version>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>io.dropwizard</groupId>
-            <artifactId>dropwizard-jackson</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/MongoKeyWords.java b/services/dlab-model/src/main/java/com/epam/dlab/MongoKeyWords.java
deleted file mode 100644
index 6553f2a..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/MongoKeyWords.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab;
-
-public abstract class MongoKeyWords {
-    public static final String EDGE_COLLECTION = "userCloudCredentials";
-    public static final String SETTINGS_COLLECTION = "settings";
-    public static final String NOTEBOOK_COLLECTION = "userInstances";
-    public static final String SERVICE_BASE_NAME_KEY = "conf_service_base_name";
-    public static final String SSN_STORAGE_ACCOUNT_TAG_KEY = "ssn_storage_account_tag_name";
-    public static final String SHARED_STORAGE_ACCOUNT_TAG_KEY = "shared_storage_account_tag_name";
-    public static final String DATA_LAKE_TAG_NAME = "datalake_tag_name";
-    public static final String BILLING_DETAILS = "billing";
-    public static final String AZURE_BILLING_SCHEDULER = "billingScheduler";
-    public static final String AZURE_BILLING_SCHEDULER_HISTORY = "billingSchedulerHistory";
-
-    /**
-     * Mongo DB keywords related to billing functionality
-     */
-    public static final String MONGO_ID = "_id";
-    public static final String DLAB_ID = "dlabId";
-    public static final String DLAB_USER = "user";
-    public static final String EXPLORATORY_ID = "exploratoryId";
-    public static final String EXPLORATORY_ID_OLD = "exploratory_id";
-    public static final String RESOURCE_TYPE = "resourceType";
-    public static final String RESOURCE_NAME = "resourceName";
-    public static final String COMPUTATIONAL_ID = "computationalId";
-    public static final String METER_CATEGORY = "meterCategory";
-    public static final String COST = "cost";
-    public static final String COST_STRING = "costString";
-    public static final String USAGE_DAY = "day";
-    public static final String USAGE_FROM = "from";
-    public static final String USAGE_TO = "to";
-    public static final String CURRENCY_CODE = "currencyCode";
-
-
-    private MongoKeyWords() {
-    }
-
-    public static String prepend$(String value) {
-        return "$" + value;
-    }
-
-    public static String prependId(String value) {
-        return MongoKeyWords.MONGO_ID + "." + value;
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/InfrastructureMetaInfoDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/InfrastructureMetaInfoDTO.java
deleted file mode 100644
index 6c3b603..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/InfrastructureMetaInfoDTO.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Data;
-
-@Data
-@Builder
-public class InfrastructureMetaInfoDTO {
-	private final String branch;
-	private final String version;
-	private final String commit;
-	@JsonProperty("release_notes")
-	private final String releaseNotes;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/LibListComputationalDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/LibListComputationalDTO.java
deleted file mode 100644
index df92c54..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/LibListComputationalDTO.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto;
-
-import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-@Getter
-@Setter
-@ToString(callSuper = true)
-public class LibListComputationalDTO extends ExploratoryActionDTO<LibListComputationalDTO> {
-    @JsonProperty("computational_id")
-    private String computationalId;
-
-    @JsonProperty("computational_image")
-    private String computationalImage;
-
-    @JsonProperty
-    private String libCacheKey;
-
-    public LibListComputationalDTO withComputationalId(String computationalId) {
-        setComputationalId(computationalId);
-        return this;
-    }
-
-    public LibListComputationalDTO withComputationalImage(String computationalImage) {
-        setComputationalImage(computationalImage);
-        return this;
-    }
-
-    public LibListComputationalDTO withLibCacheKey(String libCacheKey) {
-        setLibCacheKey(libCacheKey);
-        return this;
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceBaseDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceBaseDTO.java
deleted file mode 100644
index de34af9..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceBaseDTO.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto;
-
-import com.epam.dlab.dto.base.CloudSettings;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "@class")
-public abstract class ResourceBaseDTO<T extends ResourceBaseDTO<?>> {
-	@SuppressWarnings("unchecked")
-	private final T self = (T) this;
-	@JsonProperty("edge_user_name")
-	private String edgeUserName;
-	@JsonProperty
-	private CloudSettings cloudSettings;
-
-	public String getEdgeUserName() {
-		return edgeUserName;
-	}
-
-	public void setEdgeUserName(String edgeUserName) {
-		this.edgeUserName = edgeUserName;
-	}
-
-	public T withEdgeUserName(String edgeUserName) {
-		setEdgeUserName(edgeUserName);
-		return self;
-	}
-
-	public CloudSettings getCloudSettings() {
-		return cloudSettings;
-	}
-
-	public void setCloudSettings(CloudSettings cloudSettings) {
-		this.cloudSettings = cloudSettings;
-	}
-
-	public T withCloudSettings(CloudSettings cloudSettings) {
-		setCloudSettings(cloudSettings);
-		return self;
-	}
-
-	public ToStringHelper toStringHelper(Object self) {
-		return MoreObjects.toStringHelper(self)
-				.add("edgeUserName", edgeUserName)
-				.add("cloudSettings", cloudSettings);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceEnvBaseDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceEnvBaseDTO.java
deleted file mode 100644
index 045cf12..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceEnvBaseDTO.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-public class ResourceEnvBaseDTO<T extends ResourceEnvBaseDTO<?>> extends ResourceSysBaseDTO<T> {
-    @JsonProperty("exploratory_name")
-    private String exploratoryName;
-    @JsonProperty("application")
-    private String applicationName;
-
-    @SuppressWarnings("unchecked")
-	private final T self = (T)this;
-
-    public String getExploratoryName() {
-        return exploratoryName;
-    }
-
-    public void setExploratoryName(String exploratoryName) {
-        this.exploratoryName = exploratoryName;
-    }
-
-    public T withExploratoryName(String exploratoryName) {
-        setExploratoryName(exploratoryName);
-        return self;
-    }
-
-    public String getApplicationName() {
-        return applicationName;
-    }
-
-    public void setApplicationName(String applicationName) {
-        this.applicationName = applicationName;
-    }
-
-    public T withApplicationName(String applicationName) {
-        setApplicationName(applicationName);
-        return self;
-    }
-    
-    @Override
-    public ToStringHelper toStringHelper(Object self) {
-    	return super.toStringHelper(self)
-    	        .add("applicationName", applicationName)
-    	        .add("exploratoryName", exploratoryName);
-    }
-    
-    @Override
-    public String toString() {
-    	return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceSysBaseDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceSysBaseDTO.java
deleted file mode 100644
index 8ed3822..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceSysBaseDTO.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-public class ResourceSysBaseDTO<T extends ResourceSysBaseDTO<?>> extends ResourceBaseDTO<T> {
-    @SuppressWarnings("unchecked")
-    private final T self = (T) this;
-    @JsonProperty("conf_service_base_name")
-    private String serviceBaseName;
-    @JsonProperty("conf_os_family")
-    private String confOsFamily;
-    @JsonProperty("conf_key_dir")
-    private String confKeyDir;
-
-	public String getServiceBaseName() {
-        return serviceBaseName;
-    }
-
-    public void setServiceBaseName(String serviceBaseName) {
-        this.serviceBaseName = serviceBaseName;
-    }
-
-    public T withServiceBaseName(String serviceBaseName) {
-        setServiceBaseName(serviceBaseName);
-        return self;
-    }
-
-    public String getConfOsFamily() {
-        return confOsFamily;
-    }
-
-    public void setConfOsFamily(String confOsFamily) {
-        this.confOsFamily = confOsFamily;
-    }
-
-    public T withConfOsFamily(String confOsFamily) {
-        setConfOsFamily(confOsFamily);
-        return self;
-    }
-
-
-    public String getConfKeyDir() {
-        return confKeyDir;
-    }
-
-    public void setConfKeyDir(String confKeyDir) {
-        this.confKeyDir = confKeyDir;
-    }
-
-    public T withConfKeyDir(String confKeyDir) {
-        setConfKeyDir(confKeyDir);
-        return self;
-    }
-
-    @Override
-    public ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("serviceBaseName", serviceBaseName)
-                .add("confKeyDir", confKeyDir)
-                .add("confOsFamily", confOsFamily);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceURL.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceURL.java
deleted file mode 100644
index fac4891..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/ResourceURL.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * Describe URL of resource.
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class ResourceURL {
-	@JsonProperty("description")
-	private String description;
-	@JsonProperty("url")
-	private String url;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/SchedulerJobDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/SchedulerJobDTO.java
deleted file mode 100644
index 8e15a59..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/SchedulerJobDTO.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.time.*;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Stores info about a scheduler job (general duration, days to repeat, time to start and finish).
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class SchedulerJobDTO {
-
-	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
-	@JsonProperty("begin_date")
-	private LocalDate beginDate;
-
-	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
-	@JsonProperty("finish_date")
-	private LocalDate finishDate;
-
-	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm")
-	@JsonProperty("start_time")
-	private LocalTime startTime;
-
-	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm")
-	@JsonProperty("end_time")
-	private LocalTime endTime;
-
-	@JsonProperty("start_days_repeat")
-	private List<DayOfWeek> startDaysRepeat = Collections.emptyList();
-
-	@JsonProperty("stop_days_repeat")
-	private List<DayOfWeek> stopDaysRepeat = Collections.emptyList();
-
-	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm")
-	@JsonProperty("terminate_datetime")
-	private LocalDateTime terminateDateTime;
-
-	@JsonProperty("timezone_offset")
-	private ZoneOffset timeZoneOffset;
-
-	@JsonProperty("sync_start_required")
-	private boolean syncStartRequired = true;
-
-	@JsonProperty("max_inactivity")
-	private Long maxInactivity;
-	@JsonProperty("check_inactivity_required")
-	private boolean checkInactivityRequired;
-	@JsonProperty("consider_inactivity")
-	private boolean considerInactivity = true;
-
-	public boolean inactivityScheduler() {
-		return Objects.nonNull(maxInactivity);
-	}
-
-}
\ No newline at end of file
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/StatusBaseDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/StatusBaseDTO.java
deleted file mode 100644
index 14dc5ce..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/StatusBaseDTO.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import java.util.Date;
-
-public abstract class StatusBaseDTO<T extends StatusBaseDTO<?>> {
-	@JsonProperty("request_id")
-	private String requestId;
-	@JsonProperty
-	private String user;
-	@JsonProperty
-	private String status;
-	@JsonProperty("error_message")
-	private String errorMessage;
-	@JsonProperty("up_time")
-	private Date uptime;
-
-	@SuppressWarnings("unchecked")
-	private final T self = (T) this;
-
-	public String getRequestId() {
-		return requestId;
-	}
-
-	public void setRequestId(String requestId) {
-		this.requestId = requestId;
-	}
-
-	public T withRequestId(String requestId) {
-		setRequestId(requestId);
-		return self;
-	}
-
-	public String getUser() {
-		return user;
-	}
-
-	public void setUser(String user) {
-		this.user = user;
-	}
-
-	public T withUser(String user) {
-		setUser(user);
-		return self;
-	}
-
-	public String getStatus() {
-		return status;
-	}
-
-	public void setStatus(String status) {
-		this.status = status;
-	}
-
-	public T withStatus(String status) {
-		setStatus(status);
-		return self;
-	}
-
-	public T withStatus(UserInstanceStatus status) {
-		return withStatus(status.toString());
-	}
-
-	public String getErrorMessage() {
-		return errorMessage;
-	}
-
-	public void setErrorMessage(String errorMessage) {
-		this.errorMessage = errorMessage;
-	}
-
-	public T withErrorMessage(String errorMessage) {
-		setErrorMessage(errorMessage);
-		return self;
-	}
-
-	public Date getUptime() {
-		return uptime;
-	}
-
-	public void setUptime(Date uptime) {
-		this.uptime = uptime;
-	}
-
-	@SuppressWarnings("unchecked")
-	public T withUptime(Date uptime) {
-		setUptime(uptime);
-		return (T) this;
-	}
-
-	public ToStringHelper toStringHelper(Object self) {
-		return MoreObjects.toStringHelper(self)
-				.add("requestId", requestId)
-				.add("user", user)
-				.add("status", status)
-				.add("errorMessage", errorMessage)
-				.add("uptime", uptime);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/StatusEnvBaseDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/StatusEnvBaseDTO.java
deleted file mode 100644
index 16d36be..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/StatusEnvBaseDTO.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-public abstract class StatusEnvBaseDTO<T extends StatusEnvBaseDTO<?>> extends StatusBaseDTO<T> {
-    @SuppressWarnings("unchecked")
-    private final T self = (T) this;
-    @JsonProperty("instance_id")
-    private String instanceId;
-    @JsonProperty("exploratory_name")
-    private String exploratoryName;
-    private String project;
-    @JsonProperty("exploratory_id")
-    private String exploratoryId;
-    @JsonProperty("exploratory_template_name")
-    private String exploratoryTemplateName;
-
-    public String getInstanceId() {
-        return instanceId;
-    }
-
-    private void setInstanceId(String instanceId) {
-        this.instanceId = instanceId;
-    }
-
-    public T withInstanceId(String instanceId) {
-        setInstanceId(instanceId);
-        return self;
-    }
-
-    public String getExploratoryName() {
-        return exploratoryName;
-    }
-
-    public void setExploratoryName(String exploratoryName) {
-        this.exploratoryName = exploratoryName;
-    }
-
-    public T withExploratoryName(String exploratoryName) {
-        setExploratoryName(exploratoryName);
-        return self;
-    }
-
-    public String getProject() {
-        return project;
-    }
-
-    public void setProject(String project) {
-        this.project = project;
-    }
-
-    public T withProject(String project) {
-        setProject(project);
-        return self;
-    }
-
-    public String getExploratoryId() {
-        return exploratoryId;
-    }
-
-    public void setExploratoryId(String exploratoryId) {
-        this.exploratoryId = exploratoryId;
-    }
-
-    public T withExploratoryId(String exploratoryId) {
-        setExploratoryId(exploratoryId);
-        return self;
-    }
-
-    public String getExploratoryTemplateName() {
-        return exploratoryTemplateName;
-    }
-
-    private void setExploratoryTemplateName(String exploratoryTemplateName) {
-        this.exploratoryTemplateName = exploratoryTemplateName;
-    }
-
-    public T withExploratoryTemplateName(String exploratoryTemplateName) {
-        setExploratoryTemplateName(exploratoryTemplateName);
-        return self;
-    }
-
-    @Override
-    public ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("instanceId", instanceId)
-                .add("exploratoryName", exploratoryName)
-                .add("exploratoryId", exploratoryId)
-                .add("exploratoryTemplateName", exploratoryTemplateName);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/UserEnvironmentResources.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/UserEnvironmentResources.java
deleted file mode 100644
index d563d14..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/UserEnvironmentResources.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto;
-
-import com.epam.dlab.dto.status.EnvResourceList;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-public class UserEnvironmentResources extends ResourceSysBaseDTO<UserEnvironmentResources> {
-    @JsonProperty("edge_list_resources")
-    private EnvResourceList resourceList;
-
-    /**
-     * Return the list of resources (hosts, clusters, storages).
-     */
-    public EnvResourceList getResourceList() {
-        return resourceList;
-    }
-
-    /**
-     * Set the list of resources (hosts, clusters, storages).
-     */
-    public void setResourceList(EnvResourceList resourceList) {
-        this.resourceList = resourceList;
-    }
-
-    /**
-     * Set the list of resources (hosts, clusters, storages).
-     */
-    public UserEnvironmentResources withResourceList(EnvResourceList resourceList) {
-        setResourceList(resourceList);
-        return this;
-    }
-
-    @Override
-    public ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("resourceList", resourceList);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/UserInstanceDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/UserInstanceDTO.java
deleted file mode 100644
index 1950312..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/UserInstanceDTO.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto;
-
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Stores info about the user notebook.
- */
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class UserInstanceDTO {
-	@JsonProperty("_id")
-	private String id;
-	@JsonProperty
-	private String user;
-	@JsonProperty("exploratory_name")
-	private String exploratoryName;
-	@JsonProperty("exploratory_id")
-	private String exploratoryId;
-	@JsonProperty("image")
-	private String imageName;
-	@JsonProperty("version")
-	private String imageVersion;
-	@JsonProperty("project")
-	private String project;
-	@JsonProperty("endpoint")
-	private String endpoint;
-	@JsonProperty("cloud_provider")
-	private String cloudProvider;
-	@JsonProperty("template_name")
-	private String templateName;
-	@JsonProperty
-	private String status;
-	@JsonProperty
-	private String shape;
-	@JsonProperty("exploratory_url")
-	private List<ResourceURL> resourceUrl;
-	@JsonProperty("up_time")
-	private Date uptime;
-	@JsonProperty("computational_resources")
-	private List<UserComputationalResource> resources = new ArrayList<>();
-	@JsonProperty("private_ip")
-	private String privateIp;
-	@JsonProperty("scheduler_data")
-	private SchedulerJobDTO schedulerData;
-	@JsonProperty("reupload_key_required")
-	private boolean reuploadKeyRequired = false;
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private List<LibInstallDTO> libs = Collections.emptyList();
-	@JsonProperty("last_activity")
-	private LocalDateTime lastActivity;
-	@JsonProperty("cluster_config")
-	private List<ClusterConfig> clusterConfig;
-	@JsonProperty
-	private Map<String, String> tags;
-
-	/**
-	 * Sets the user login name.
-	 */
-	public UserInstanceDTO withUser(String user) {
-		setUser(user);
-		return this;
-	}
-
-	/**
-	 * Sets the name of exploratory.
-	 */
-	public UserInstanceDTO withExploratoryName(String exploratoryName) {
-		setExploratoryName(exploratoryName);
-		return this;
-	}
-
-	/**
-	 * Sets the exploratory id.
-	 */
-	public UserInstanceDTO withExploratoryId(String exploratoryId) {
-		setExploratoryId(exploratoryId);
-		return this;
-	}
-
-	/**
-	 * Sets the image name.
-	 */
-	public UserInstanceDTO withImageName(String imageName) {
-		setImageName(imageName);
-		return this;
-	}
-
-	public UserInstanceDTO withClusterConfig(List<ClusterConfig> config) {
-		setClusterConfig(config);
-		return this;
-	}
-
-	/**
-	 * Sets the image version.
-	 */
-	public UserInstanceDTO withImageVersion(String imageVersion) {
-		setImageVersion(imageVersion);
-		return this;
-	}
-
-	/**
-	 * Sets the name of template.
-	 */
-	public UserInstanceDTO withTemplateName(String templateName) {
-		setTemplateName(templateName);
-		return this;
-	}
-
-	/**
-	 * Sets the status of notebook.
-	 */
-	public UserInstanceDTO withStatus(String status) {
-		setStatus(status);
-		return this;
-	}
-
-	/**
-	 * Sets the name of notebook shape.
-	 */
-	public UserInstanceDTO withShape(String shape) {
-		setShape(shape);
-		return this;
-	}
-
-	public UserInstanceDTO withProject(String project) {
-		setProject(project);
-		return this;
-	}
-
-	/**
-	 * Sets a list of user's computational resources for notebook.
-	 */
-	public UserInstanceDTO withResources(List<UserComputationalResource> resources) {
-		setResources(resources);
-		return this;
-	}
-
-	/**
-	 * Sets library list.
-	 */
-	public UserInstanceDTO withLibs(List<LibInstallDTO> libs) {
-		setLibs(libs);
-		return this;
-	}
-
-	public UserInstanceDTO withEndpoint(String endpoint) {
-		setEndpoint(endpoint);
-		return this;
-	}
-
-	public UserInstanceDTO withCloudProvider(String cloudProvider) {
-		setCloudProvider(cloudProvider);
-		return this;
-	}
-
-	public UserInstanceDTO withTags(Map<String, String> tags) {
-		setTags(tags);
-		return this;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/UserInstanceStatus.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/UserInstanceStatus.java
deleted file mode 100644
index 463a61b..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/UserInstanceStatus.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto;
-
-public enum UserInstanceStatus {
-	CREATING("creating"),
-	CREATED("created"),
-	STARTING("starting"),
-	CONFIGURING("configuring"),
-	RUNNING("running"),
-	STOPPING("stopping"),
-	STOPPED("stopped"),
-	TERMINATING("terminating"),
-	TERMINATED("terminated"),
-	FAILED("failed"),
-	CREATING_IMAGE("creating image"),
-	RECONFIGURING("reconfiguring"),
-	REUPLOADING_KEY("reuploading key");
-
-	private String name;
-
-	UserInstanceStatus(String name) {
-		this.name = name;
-	}
-
-	@Override
-	public String toString() {
-		return name;
-	}
-
-	public static UserInstanceStatus of(String status) {
-		if (status != null) {
-			for (UserInstanceStatus uis : UserInstanceStatus.values()) {
-				if (status.equalsIgnoreCase(uis.toString())) {
-					return uis;
-				}
-			}
-		}
-		return null;
-	}
-
-	public boolean in(UserInstanceStatus... statusList) {
-		for (UserInstanceStatus status : statusList) {
-			if (this.equals(status)) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/AwsCloudSettings.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/AwsCloudSettings.java
deleted file mode 100644
index 1903f30..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/AwsCloudSettings.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.aws;
-
-import com.epam.dlab.dto.base.CloudSettings;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.*;
-
-@Data
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-public class AwsCloudSettings extends CloudSettings {
-
-	@JsonProperty("aws_iam_user")
-	private String awsIamUser;
-	@JsonProperty("aws_region")
-	private String awsRegion;
-	@JsonProperty("aws_subnet_id")
-	private String awsSubnetId;
-	@JsonProperty("aws_security_groups_ids")
-	private String awsSecurityGroupIds;
-	@JsonProperty("aws_vpc_id")
-	private String awsVpcId;
-	@JsonProperty("conf_tag_resource_id")
-	private String confTagResourceId;
-	@JsonProperty("aws_notebook_subnet_id")
-	private String awsNotebookSubnetId;
-	@JsonProperty("aws_notebook_vpc_id")
-	private String awsNotebookVpcId;
-	@JsonProperty("aws_zone")
-	private String zone;
-	@JsonProperty("ldap_hostname")
-	protected String ldapHost;
-	@JsonProperty("ldap_dn")
-	protected String ldapDn;
-	@JsonProperty("ldap_ou")
-	protected String ldapOu;
-	@JsonProperty("ldap_service_username")
-	protected String ldapUser;
-	@JsonProperty("ldap_service_password")
-	protected String ldapPassword;
-	@JsonProperty("conf_os_family")
-	protected String os;
-	@JsonProperty("conf_cloud_provider")
-	protected String cloud;
-	@JsonProperty("conf_service_base_name")
-	protected String sbn;
-	@JsonProperty("conf_key_dir")
-	protected String confKeyDir;
-	@JsonProperty("conf_image_enabled")
-	private String imageEnabled;
-	@JsonProperty("conf_stepcerts_enabled")
-	private String stepCertsEnabled;
-	@JsonProperty("conf_stepcerts_root_ca")
-	private String stepCertsRootCA;
-	@JsonProperty("conf_stepcerts_kid")
-	private String stepCertsKid;
-	@JsonProperty("conf_stepcerts_kid_password")
-	private String stepCertsKidPassword;
-	@JsonProperty("conf_stepcerts_ca_url")
-	private String stepCertsCAURL;
-	@JsonProperty("keycloak_auth_server_url")
-	private String keycloakAuthServerUrl;
-	@JsonProperty("keycloak_realm_name")
-	private String keycloakRealmName;
-	@JsonProperty("keycloak_user")
-	private String keycloakUser;
-	@JsonProperty("keycloak_user_password")
-	private String keycloakUserPassword;
-
-	@Override
-	@JsonIgnore
-	public String getIamUser() {
-		return awsIamUser;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/AwsComputationalResource.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/AwsComputationalResource.java
deleted file mode 100644
index 8a268c5..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/AwsComputationalResource.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.aws.computational;
-
-import com.epam.dlab.dto.ResourceURL;
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.ToString;
-
-import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Stores info about the user's computational resources for notebook.
- */
-@ToString(callSuper = true)
-@Getter
-@EqualsAndHashCode(callSuper = true)
-public class AwsComputationalResource extends UserComputationalResource {
-
-	@JsonProperty("instance_id")
-	private String instanceId;
-	@JsonProperty("master_node_shape")
-	private String masterShape;
-	@JsonProperty("slave_node_shape")
-	private String slaveShape;
-	@JsonProperty("slave_node_spot")
-	private Boolean slaveSpot;
-	@JsonProperty("slave_node_spot_pct_price")
-	private Integer slaveSpotPctPrice;
-	@JsonProperty("total_instance_number")
-	private String slaveNumber;
-	@JsonProperty("emr_version")
-	private String version;
-
-	@Builder
-	public AwsComputationalResource(String computationalName, String computationalId, String imageName,
-									String templateName, String status, Date uptime,
-									SchedulerJobDTO schedulerJobData, boolean reuploadKeyRequired,
-									String instanceId, String masterShape, String slaveShape, Boolean slaveSpot,
-									Integer slaveSpotPctPrice, String slaveNumber, String version,
-									List<ResourceURL> resourceURL, LocalDateTime lastActivity,
-									List<ClusterConfig> config, Map<String, String> tags) {
-
-		super(computationalName, computationalId, imageName, templateName, status, uptime, schedulerJobData,
-				reuploadKeyRequired, resourceURL, lastActivity, tags);
-		this.instanceId = instanceId;
-		this.masterShape = masterShape;
-		this.slaveShape = slaveShape;
-		this.slaveSpot = slaveSpot;
-		this.slaveSpotPctPrice = slaveSpotPctPrice;
-		this.slaveNumber = slaveNumber;
-		this.version = version;
-		this.config = config;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/AwsComputationalTerminateDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/AwsComputationalTerminateDTO.java
deleted file mode 100644
index 2775f68..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/AwsComputationalTerminateDTO.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.aws.computational;
-
-import com.epam.dlab.dto.computational.ComputationalTerminateDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.ToString;
-
-@Data
-@ToString(callSuper = true)
-public class AwsComputationalTerminateDTO extends ComputationalTerminateDTO {
-
-	@JsonProperty("emr_cluster_name")
-	private String clusterName;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ClusterConfig.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ClusterConfig.java
deleted file mode 100644
index e8f791e..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ClusterConfig.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.dto.aws.computational;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import javax.validation.constraints.NotNull;
-import java.util.List;
-import java.util.Map;
-
-@Data
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class ClusterConfig {
-	@JsonProperty("Classification")
-	@NotEmpty(message = "'Classification' field should not be empty")
-	private String classification;
-	@JsonProperty("Properties")
-	@NotNull(message = "'Properties' field should not be empty")
-	private Map<String, Object> properties;
-	@JsonProperty("Configurations")
-	private List<ClusterConfig> configurations;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ComputationalConfigAws.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ComputationalConfigAws.java
deleted file mode 100644
index 87996cc..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ComputationalConfigAws.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.aws.computational;
-
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-public class ComputationalConfigAws extends ComputationalBase<ComputationalConfigAws> {
-    @JsonProperty("emr_version")
-    private String version;
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public ComputationalConfigAws withVersion(String version) {
-        setVersion(version);
-        return this;
-    }
-
-    @Override
-    public ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("version", version);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ComputationalCreateAws.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ComputationalCreateAws.java
deleted file mode 100644
index 77021e0..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/ComputationalCreateAws.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.aws.computational;
-
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import java.util.List;
-
-public class ComputationalCreateAws extends ComputationalBase<ComputationalCreateAws> {
-	@JsonProperty("emr_instance_count")
-	private String instanceCount;
-	@JsonProperty("emr_master_instance_type")
-	private String masterInstanceType;
-	@JsonProperty("emr_slave_instance_type")
-	private String slaveInstanceType;
-	@JsonProperty("emr_slave_instance_spot")
-	private Boolean slaveInstanceSpot;
-	@JsonProperty("emr_slave_instance_spot_pct_price")
-	private Integer slaveInstanceSpotPctPrice;
-	@JsonProperty("emr_version")
-	private String version;
-	@JsonProperty("emr_configurations")
-	private List<ClusterConfig> config;
-	@JsonProperty("conf_shared_image_enabled")
-	private String sharedImageEnabled;
-
-	public String getInstanceCount() {
-		return instanceCount;
-	}
-
-	public void setInstanceCount(String instanceCount) {
-		this.instanceCount = instanceCount;
-	}
-
-	public ComputationalCreateAws withInstanceCount(String instanceCount) {
-		setInstanceCount(instanceCount);
-		return this;
-	}
-
-	public String getMasterInstanceType() {
-		return masterInstanceType;
-	}
-
-	public void setMasterInstanceType(String masterInstanceType) {
-		this.masterInstanceType = masterInstanceType;
-	}
-
-	public ComputationalCreateAws withMasterInstanceType(String masterInstanceType) {
-		setMasterInstanceType(masterInstanceType);
-		return this;
-	}
-
-	public String getSlaveInstanceType() {
-		return slaveInstanceType;
-	}
-
-	public void setSlaveInstanceType(String slaveInstanceType) {
-		this.slaveInstanceType = slaveInstanceType;
-	}
-
-	public ComputationalCreateAws withSlaveInstanceType(String slaveInstanceType) {
-		setSlaveInstanceType(slaveInstanceType);
-		return this;
-	}
-
-	public Boolean getSlaveInstanceSpot() {
-		return slaveInstanceSpot;
-	}
-
-	public void setSlaveInstanceSpot(Boolean slaveInstanceSpot) {
-		this.slaveInstanceSpot = slaveInstanceSpot;
-	}
-
-	public ComputationalCreateAws withSlaveInstanceSpot(Boolean slaveInstanceSpot) {
-		setSlaveInstanceSpot(slaveInstanceSpot);
-		return this;
-	}
-
-	public Integer getSlaveInstanceSpotPctPrice() {
-		return slaveInstanceSpotPctPrice;
-	}
-
-	public void setSlaveInstanceSpotPctPrice(Integer slaveInstanceSpotPctPrice) {
-		this.slaveInstanceSpotPctPrice = slaveInstanceSpotPctPrice;
-	}
-
-	public ComputationalCreateAws withSlaveInstanceSpotPctPrice(Integer slaveInstanceSpotPctPrice) {
-		setSlaveInstanceSpotPctPrice(slaveInstanceSpotPctPrice);
-		return this;
-	}
-
-	public String getVersion() {
-		return version;
-	}
-
-	public void setVersion(String version) {
-		this.version = version;
-	}
-
-	public ComputationalCreateAws withVersion(String version) {
-		setVersion(version);
-		return this;
-	}
-
-	public List<ClusterConfig> getConfig() {
-		return config;
-	}
-
-	public void setConfig(List<ClusterConfig> config) {
-		this.config = config;
-	}
-
-	public ComputationalCreateAws withConfig(List<ClusterConfig> config) {
-		setConfig(config);
-		return this;
-	}
-
-	public String getSharedImageEnabled() {
-		return sharedImageEnabled;
-	}
-
-	public void setSharedImageEnabled(String sharedImageEnabled) {
-		this.sharedImageEnabled = sharedImageEnabled;
-	}
-
-	public ComputationalCreateAws withSharedImageEnabled(String sharedImageEnabled) {
-		setSharedImageEnabled(sharedImageEnabled);
-		return this;
-	}
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("version", version)
-				.add("masterInstanceType", masterInstanceType)
-				.add("slaveInstanceType", slaveInstanceType)
-				.add("slaveInstanceSpot", slaveInstanceSpot)
-				.add("slaveInstanceSpotPctPrice", slaveInstanceSpotPctPrice)
-				.add("instanceCount", instanceCount);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/SparkComputationalConfigAws.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/SparkComputationalConfigAws.java
deleted file mode 100644
index 51712f7..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/SparkComputationalConfigAws.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.aws.computational;
-
-import com.epam.dlab.dto.azure.computational.SparkComputationalConfigAzure;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-public class SparkComputationalConfigAws extends ComputationalBase<SparkComputationalConfigAzure> {
-
-    @JsonProperty("dataengine_instance_count")
-    private String dataEngineInstanceCount;
-
-    public SparkComputationalConfigAws withDataEngineInstanceCount(String dataEngineInstanceCount) {
-        this.dataEngineInstanceCount = dataEngineInstanceCount;
-        return this;
-    }
-
-    @Override
-    public MoreObjects.ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("dataEngineInstanceCount", dataEngineInstanceCount);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).toString();
-    }
-
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/SparkComputationalCreateAws.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/SparkComputationalCreateAws.java
deleted file mode 100644
index 539937e..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/computational/SparkComputationalCreateAws.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.aws.computational;
-
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-import java.util.List;
-
-public class SparkComputationalCreateAws extends ComputationalBase<SparkComputationalCreateAws> {
-
-	@JsonProperty("dataengine_instance_count")
-	private String dataEngineInstanceCount;
-	@JsonProperty("aws_dataengine_slave_shape")
-	private String dataEngineSlaveShape;
-	@JsonProperty("aws_dataengine_master_shape")
-	private String dataEngineMasterShape;
-	@JsonProperty("spark_configurations")
-	private List<ClusterConfig> config;
-	@JsonProperty("conf_shared_image_enabled")
-	private String sharedImageEnabled;
-
-	public SparkComputationalCreateAws withDataEngineInstanceCount(String dataEngineInstanceCount) {
-		this.dataEngineInstanceCount = dataEngineInstanceCount;
-		return this;
-	}
-
-	public SparkComputationalCreateAws withDataEngineSlaveShape(String dataEngineSlaveSize) {
-		this.dataEngineSlaveShape = dataEngineSlaveSize;
-		return this;
-	}
-
-	public SparkComputationalCreateAws withDataEngineMasterShape(String dataEngineMasterSize) {
-		this.dataEngineMasterShape = dataEngineMasterSize;
-		return this;
-	}
-
-	public SparkComputationalCreateAws withConfig(List<ClusterConfig> config) {
-		this.config = config;
-		return this;
-	}
-
-	public SparkComputationalCreateAws withSharedImageEnabled(String sharedImageEnabled) {
-		this.sharedImageEnabled = sharedImageEnabled;
-		return this;
-	}
-
-	@Override
-	public MoreObjects.ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("dataEngineInstanceCount", dataEngineInstanceCount)
-				.add("dataEngineSlaveShape", dataEngineSlaveShape)
-				.add("dataEngineMasterShape", dataEngineMasterShape);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/edge/EdgeCreateAws.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/edge/EdgeCreateAws.java
deleted file mode 100644
index 8cc787d..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/edge/EdgeCreateAws.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.aws.edge;
-
-import com.epam.dlab.dto.ResourceSysBaseDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-public class EdgeCreateAws extends ResourceSysBaseDTO<EdgeCreateAws> {
-    @JsonProperty("edge_elastic_ip")
-    private String edgeElasticIp;
-
-    public String getEdgeElasticIp() {
-        return edgeElasticIp;
-    }
-
-    public void setEdgeElasticIp(String edgeElasticIp) {
-        this.edgeElasticIp = edgeElasticIp;
-    }
-
-    public EdgeCreateAws withEdgeElasticIp(String edgeElasticIp) {
-        setEdgeElasticIp(edgeElasticIp);
-        return this;
-    }
-
-    @Override
-    public ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("edgeElasticIp", edgeElasticIp);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/edge/EdgeInfoAws.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/edge/EdgeInfoAws.java
deleted file mode 100644
index 7ba2755..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/edge/EdgeInfoAws.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.aws.edge;
-
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-@Getter
-@Setter
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class EdgeInfoAws extends EdgeInfo {
-    @JsonProperty("user_own_bicket_name")
-    private String userOwnBucketName;
-    @JsonProperty("notebook_profile")
-    private String notebookProfile;
-    @JsonProperty("shared_bucket_name")
-    private String sharedBucketName;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/exploratory/ExploratoryCreateAws.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/exploratory/ExploratoryCreateAws.java
deleted file mode 100644
index 58d83df..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/exploratory/ExploratoryCreateAws.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.aws.exploratory;
-
-import com.epam.dlab.dto.exploratory.ExploratoryCreateDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-public class ExploratoryCreateAws extends ExploratoryCreateDTO<ExploratoryCreateAws> {
-    @JsonProperty("aws_notebook_instance_type")
-    private String notebookInstanceType;
-
-    public String getNotebookInstanceType() {
-        return notebookInstanceType;
-    }
-
-    public void setNotebookInstanceType(String notebookInstanceType) {
-        this.notebookInstanceType = notebookInstanceType;
-    }
-
-    public ExploratoryCreateAws withNotebookInstanceType(String notebookInstanceType) {
-        setNotebookInstanceType(notebookInstanceType);
-        return this;
-    }
-
-    @Override
-    public MoreObjects.ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("notebookInstanceType", notebookInstanceType);
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/keyload/UploadFileAws.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/keyload/UploadFileAws.java
deleted file mode 100644
index b5bdd29..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/aws/keyload/UploadFileAws.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.aws.keyload;
-
-import com.epam.dlab.dto.aws.edge.EdgeCreateAws;
-import com.epam.dlab.dto.base.keyload.UploadFile;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-@Data
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-public class UploadFileAws extends UploadFile {
-    @JsonProperty
-    private EdgeCreateAws edge;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/AzureCloudSettings.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/AzureCloudSettings.java
deleted file mode 100644
index 07013c6..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/AzureCloudSettings.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.azure;
-
-import com.epam.dlab.dto.base.CloudSettings;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.*;
-
-@Data
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-public class AzureCloudSettings extends CloudSettings {
-
-    @JsonProperty("azure_region")
-    private String azureRegion;
-    @JsonProperty("azure_iam_user")
-    private String azureIamUser;
-    @JsonProperty("conf_service_base_name")
-    protected String sbn;
-    @JsonProperty("conf_os_family")
-    protected String os;
-    @JsonProperty("conf_cloud_provider")
-    protected String cloud;
-    @JsonProperty("azure_vpc_name")
-    private String azureVpcName;
-    @JsonProperty("azure_subnet_name")
-    private String azureSubnetName;
-    @JsonProperty("azure_resource_group_name")
-    private String azureResourceGroupName;
-    @JsonProperty("azure_security_group_name")
-    private String azureSecurityGroupName;
-    @JsonProperty("ldap_hostname")
-    protected String ldapHost;
-    @JsonProperty("ldap_dn")
-    protected String ldapDn;
-    @JsonProperty("ldap_ou")
-    protected String ldapOu;
-    @JsonProperty("ldap_service_username")
-    protected String ldapUser;
-    @JsonProperty("ldap_service_password")
-    protected String ldapPassword;
-    @JsonProperty("conf_key_dir")
-    protected String confKeyDir;
-    @JsonProperty("conf_image_enabled")
-    private String imageEnabled;
-    @JsonProperty("conf_stepcerts_enabled")
-    private String stepCertsEnabled;
-    @JsonProperty("conf_stepcerts_root_ca")
-    private String stepCertsRootCA;
-    @JsonProperty("conf_stepcerts_kid")
-    private String stepCertsKid;
-    @JsonProperty("conf_stepcerts_kid_password")
-    private String stepCertsKidPassword;
-    @JsonProperty("conf_stepcerts_ca_url")
-    private String stepCertsCAURL;
-    @JsonProperty("keycloak_auth_server_url")
-    private String keycloakAuthServerUrl;
-    @JsonProperty("keycloak_realm_name")
-    private String keycloakRealmName;
-    @JsonProperty("keycloak_user")
-    private String keycloakUser;
-    @JsonProperty("keycloak_user_password")
-    private String keycloakUserPassword;
-
-    @Override
-    @JsonIgnore
-    public String getIamUser() {
-        return azureIamUser;
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/auth/AuthorizationCodeFlowResponse.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/auth/AuthorizationCodeFlowResponse.java
deleted file mode 100644
index 14f186b..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/auth/AuthorizationCodeFlowResponse.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.azure.auth;
-
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.ToString;
-
-import javax.ws.rs.FormParam;
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-@ToString(exclude = "code")
-public class AuthorizationCodeFlowResponse {
-
-    @JsonProperty
-    @FormParam("state")
-    private String state;
-    @JsonProperty
-    @FormParam("code")
-    private String code;
-    @JsonProperty
-    @FormParam("error")
-    private String error;
-    @JsonProperty("error_description")
-    @FormParam("error_description")
-    private String errorDescription;
-
-    @JsonIgnore
-    public boolean isSuccessful() {
-        return state != null && !state.isEmpty() && code != null && !code.isEmpty();
-    }
-
-    @JsonIgnore
-    public boolean isFailed() {
-        return error != null && !error.isEmpty();
-    }
-
-    @JsonIgnore
-    public boolean isValid() {
-        return isSuccessful() || isFailed();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/computational/SparkComputationalConfigAzure.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/computational/SparkComputationalConfigAzure.java
deleted file mode 100644
index 882ddbe..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/computational/SparkComputationalConfigAzure.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.azure.computational;
-
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-public class SparkComputationalConfigAzure extends ComputationalBase<SparkComputationalConfigAzure> {
-
-    @JsonProperty("dataengine_instance_count")
-    private String dataEngineInstanceCount;
-
-    public SparkComputationalConfigAzure withDataEngineInstanceCount(String dataEngineInstanceCount) {
-        this.dataEngineInstanceCount = dataEngineInstanceCount;
-        return this;
-    }
-
-    @Override
-    public MoreObjects.ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("dataEngineInstanceCount", dataEngineInstanceCount);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/computational/SparkComputationalCreateAzure.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/computational/SparkComputationalCreateAzure.java
deleted file mode 100644
index 5902906..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/computational/SparkComputationalCreateAzure.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.azure.computational;
-
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-import java.util.List;
-
-public class SparkComputationalCreateAzure extends ComputationalBase<SparkComputationalCreateAzure> {
-	@JsonProperty("dataengine_instance_count")
-	private String dataEngineInstanceCount;
-	@JsonProperty("azure_dataengine_slave_size")
-	private String dataEngineSlaveSize;
-	@JsonProperty("azure_dataengine_master_size")
-	private String dataEngineMasterSize;
-	@JsonProperty("azure_datalake_enable")
-	private String azureDataLakeEnabled;
-	@JsonProperty("azure_user_refresh_token")
-	private String azureUserRefreshToken;
-	@JsonProperty("spark_configurations")
-	private List<ClusterConfig> config;
-	@JsonProperty("conf_shared_image_enabled")
-	private String sharedImageEnabled;
-
-	public SparkComputationalCreateAzure withDataEngineInstanceCount(String dataEngineInstanceCount) {
-		this.dataEngineInstanceCount = dataEngineInstanceCount;
-		return this;
-	}
-
-	public SparkComputationalCreateAzure withDataEngineSlaveSize(String dataEngineSlaveSize) {
-		this.dataEngineSlaveSize = dataEngineSlaveSize;
-		return this;
-	}
-
-	public SparkComputationalCreateAzure withDataEngineMasterSize(String dataEngineMasterSize) {
-		this.dataEngineMasterSize = dataEngineMasterSize;
-		return this;
-	}
-
-	public SparkComputationalCreateAzure withAzureDataLakeEnabled(String azureDataLakeEnabled) {
-		this.azureDataLakeEnabled = azureDataLakeEnabled;
-		return this;
-	}
-
-	public SparkComputationalCreateAzure withAzureUserRefreshToken(String azureUserRefreshToken) {
-		this.azureUserRefreshToken = azureUserRefreshToken;
-		return this;
-	}
-
-	public SparkComputationalCreateAzure withConfig(List<ClusterConfig> config) {
-		this.config = config;
-		return this;
-	}
-
-	public SparkComputationalCreateAzure withSharedImageEnabled(String sharedImageEnabled) {
-		this.sharedImageEnabled = sharedImageEnabled;
-		return this;
-	}
-
-	@Override
-	public MoreObjects.ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("dataEngineInstanceCount", dataEngineInstanceCount)
-				.add("dataEngineSlaveSize", dataEngineSlaveSize)
-				.add("dataEngineMasterSize", dataEngineMasterSize)
-				.add("azureDataLakeEnabled", azureDataLakeEnabled)
-				.add("azureUserRefreshToken", azureUserRefreshToken != null ? "***" : null);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/edge/EdgeCreateAzure.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/edge/EdgeCreateAzure.java
deleted file mode 100644
index 9297150..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/edge/EdgeCreateAzure.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.azure.edge;
-
-import com.epam.dlab.dto.ResourceSysBaseDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-public class EdgeCreateAzure extends ResourceSysBaseDTO<EdgeCreateAzure> {
-    @JsonProperty("azure_datalake_enable")
-    private String azureDataLakeEnable;
-
-    public EdgeCreateAzure withAzureDataLakeEnable(String azureDataLakeEnable) {
-        this.azureDataLakeEnable = azureDataLakeEnable;
-        return this;
-    }
-
-    public String getAzureDataLakeEnable() {
-        return azureDataLakeEnable;
-    }
-
-
-    public void setAzureDataLakeEnable(String azureDataLakeEnable) {
-        this.azureDataLakeEnable = azureDataLakeEnable;
-    }
-
-    @Override
-    public MoreObjects.ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(this)
-                .add("azureDataLakeEnable", azureDataLakeEnable);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/edge/EdgeInfoAzure.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/edge/EdgeInfoAzure.java
deleted file mode 100644
index 9564261..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/edge/EdgeInfoAzure.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.azure.edge;
-
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-@Getter
-@Setter
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class EdgeInfoAzure extends EdgeInfo {
-    @JsonProperty("user_storage_account_name")
-    private String userStorageAccountName;
-    @JsonProperty("user_container_name")
-    private String userContainerName;
-    @JsonProperty("shared_storage_account_name")
-    private String sharedStorageAccountName;
-    @JsonProperty("shared_container_name")
-    private String sharedContainerName;
-    @JsonProperty("user_storage_account_tag_name")
-    private String userStorageAccountTagName;
-    @JsonProperty("datalake_name")
-    private String dataLakeName;
-    @JsonProperty("datalake_user_directory_name")
-    private String dataLakeDirectoryName;
-    @JsonProperty("datalake_shared_directory_name")
-    private String dataLakeSharedDirectoryName;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/exploratory/ExploratoryActionStartAzure.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/exploratory/ExploratoryActionStartAzure.java
deleted file mode 100644
index 48c314a..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/exploratory/ExploratoryActionStartAzure.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.azure.exploratory;
-
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-public class ExploratoryActionStartAzure extends ExploratoryGitCredsUpdateDTO {
-	@JsonProperty("azure_datalake_enable")
-	private String azureDataLakeEnabled;
-	@JsonProperty("azure_user_refresh_token")
-	private String azureUserRefreshToken;
-
-	public String getAzureDataLakeEnabled() {
-		return azureDataLakeEnabled;
-	}
-
-	public void setAzureDataLakeEnabled(String azureDataLakeEnabled) {
-		this.azureDataLakeEnabled = azureDataLakeEnabled;
-	}
-
-	public String getAzureUserRefreshToken() {
-		return azureUserRefreshToken;
-	}
-
-	public void setAzureUserRefreshToken(String azureUserRefreshToken) {
-		this.azureUserRefreshToken = azureUserRefreshToken;
-	}
-
-	public ExploratoryActionStartAzure withAzureDataLakeEnabled(String azureDataLakeEnabled) {
-		setAzureDataLakeEnabled(azureDataLakeEnabled);
-		return this;
-	}
-
-	public ExploratoryActionStartAzure withAzureUserRefreshToken(String azureUserRefreshToken) {
-		setAzureUserRefreshToken(azureUserRefreshToken);
-		return this;
-	}
-
-	@Override
-	public MoreObjects.ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("azureDataLakeEnabled", azureDataLakeEnabled)
-				.add("azureUserRefreshToken", azureUserRefreshToken != null ? "***" : null);
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/exploratory/ExploratoryActionStopAzure.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/exploratory/ExploratoryActionStopAzure.java
deleted file mode 100644
index 1915106..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/exploratory/ExploratoryActionStopAzure.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.azure.exploratory;
-
-import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-public class ExploratoryActionStopAzure extends ExploratoryActionDTO<ExploratoryActionStopAzure> {
-    @JsonProperty("computational_name")
-    private String computationalName;
-
-    public String getComputationalName() {
-        return computationalName;
-    }
-
-    public ExploratoryActionStopAzure setComputationalName(String computationalName) {
-        this.computationalName = computationalName;
-        return this;
-    }
-
-    @Override
-    public MoreObjects.ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("computationalName", computationalName);
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/exploratory/ExploratoryCreateAzure.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/exploratory/ExploratoryCreateAzure.java
deleted file mode 100644
index bb2b443..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/exploratory/ExploratoryCreateAzure.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.azure.exploratory;
-
-import com.epam.dlab.dto.exploratory.ExploratoryCreateDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-public class ExploratoryCreateAzure extends ExploratoryCreateDTO<ExploratoryCreateAzure> {
-    @JsonProperty("azure_notebook_instance_size")
-    private String notebookInstanceType;
-    @JsonProperty("azure_datalake_enable")
-    private String azureDataLakeEnabled;
-    @JsonProperty("azure_user_refresh_token")
-    private String azureUserRefreshToken;
-
-    public String getNotebookInstanceType() {
-        return notebookInstanceType;
-    }
-
-    public void setNotebookInstanceType(String notebookInstanceType) {
-        this.notebookInstanceType = notebookInstanceType;
-    }
-
-    public String getAzureDataLakeEnabled() {
-        return azureDataLakeEnabled;
-    }
-
-    public void setAzureDataLakeEnabled(String azureDataLakeEnabled) {
-        this.azureDataLakeEnabled = azureDataLakeEnabled;
-    }
-
-    public String getAzureUserRefreshToken() {
-        return azureUserRefreshToken;
-    }
-
-    public void setAzureUserRefreshToken(String azureUserRefreshToken) {
-        this.azureUserRefreshToken = azureUserRefreshToken;
-    }
-
-    public ExploratoryCreateAzure withNotebookInstanceSize(String notebookInstanceType) {
-        setNotebookInstanceType(notebookInstanceType);
-        return this;
-    }
-
-    public ExploratoryCreateAzure withAzureDataLakeEnabled(String azureDataLakeEnabled) {
-        setAzureDataLakeEnabled(azureDataLakeEnabled);
-        return this;
-    }
-
-    public ExploratoryCreateAzure withAzureUserRefreshToken(String azureUserRefreshToken) {
-        setAzureUserRefreshToken(azureUserRefreshToken);
-        return this;
-    }
-
-    @Override
-    public MoreObjects.ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("notebookInstanceType", notebookInstanceType)
-                .add("azureDataLakeEnabled", azureDataLakeEnabled)
-                .add("azureUserRefreshToken", azureUserRefreshToken != null ? "***" : null);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/keyload/UploadFileAzure.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/keyload/UploadFileAzure.java
deleted file mode 100644
index 398ef6d..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/azure/keyload/UploadFileAzure.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.azure.keyload;
-
-import com.epam.dlab.dto.azure.edge.EdgeCreateAzure;
-import com.epam.dlab.dto.base.keyload.UploadFile;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-@Data
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-public class UploadFileAzure extends UploadFile {
-    @JsonProperty
-    private EdgeCreateAzure edge;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/backup/EnvBackupDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/backup/EnvBackupDTO.java
deleted file mode 100644
index 5442cb8..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/backup/EnvBackupDTO.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.backup;
-
-import lombok.Builder;
-import lombok.Data;
-import lombok.ToString;
-
-import java.util.List;
-
-@Data
-@Builder
-@ToString
-public class EnvBackupDTO {
-	private final List<String> configFiles;
-	private final List<String> keys;
-	private final List<String> certificates;
-	private final List<String> jars;
-	private final boolean databaseBackup;
-	private final boolean logsBackup;
-	private String backupFile;
-	private String id;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/backup/EnvBackupStatus.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/backup/EnvBackupStatus.java
deleted file mode 100644
index 13c3efb..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/backup/EnvBackupStatus.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.backup;
-
-import java.util.Arrays;
-
-public enum EnvBackupStatus {
-	CREATING("N/A"), CREATED("N/A"), FAILED("N/A");
-
-	private String message;
-
-	EnvBackupStatus(String message) {
-		this.message = message;
-	}
-
-	public EnvBackupStatus withErrorMessage(String message) {
-		this.message = message;
-		return this;
-	}
-
-	public String message() {
-		return message;
-	}
-
-	public static EnvBackupStatus fromValue(String value) {
-		return Arrays.stream(values())
-				.filter(v -> v.name().equalsIgnoreCase(value))
-				.findAny()
-				.orElseThrow(() ->
-						new IllegalArgumentException("Wrong value for EnvBackupStatus: " + value));
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/backup/EnvBackupStatusDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/backup/EnvBackupStatusDTO.java
deleted file mode 100644
index 6beae62..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/backup/EnvBackupStatusDTO.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.backup;
-
-import com.epam.dlab.dto.StatusBaseDTO;
-import com.google.common.base.MoreObjects;
-import lombok.Getter;
-
-@Getter
-public class EnvBackupStatusDTO extends StatusBaseDTO<EnvBackupStatusDTO> {
-
-	private EnvBackupDTO envBackupDTO;
-	private EnvBackupStatus envBackupStatus;
-
-
-	public EnvBackupStatusDTO withEnvBackupDTO(EnvBackupDTO envBackupDTO) {
-		this.envBackupDTO = envBackupDTO;
-		return this;
-	}
-
-	public EnvBackupStatusDTO withStatus(EnvBackupStatus status) {
-		this.envBackupStatus = status;
-		return withStatus(status.name());
-	}
-
-	public EnvBackupStatusDTO withBackupFile(String backupFile) {
-		if (envBackupDTO != null) {
-			envBackupDTO.setBackupFile(backupFile);
-		}
-		return this;
-	}
-
-	@Override
-	public MoreObjects.ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("envBackupStatus", envBackupStatus)
-				.add("envBackupDTO", envBackupDTO);
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/CloudSettings.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/CloudSettings.java
deleted file mode 100644
index 8e53c7d..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/CloudSettings.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.base;
-
-import com.epam.dlab.util.CloudSettingsDeserializer;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import lombok.Data;
-
-@Data
-@JsonDeserialize(using = CloudSettingsDeserializer.class)
-public abstract class CloudSettings {
-	@JsonIgnore
-	public abstract String getIamUser();
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/DataEngineType.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/DataEngineType.java
deleted file mode 100644
index a9d8b03..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/DataEngineType.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.base;
-
-import com.fasterxml.jackson.annotation.JsonValue;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public enum DataEngineType {
-	CLOUD_SERVICE("dataengine-service"), SPARK_STANDALONE("dataengine");
-
-	private static final String DOCKER_IMAGE_PREFIX = "docker.dlab-";
-
-	private static final Map<String, DataEngineType> INTERNAL_MAP = new HashMap<>();
-
-	static {
-		for (DataEngineType dataEngineType : DataEngineType.values()) {
-			INTERNAL_MAP.put(dataEngineType.getName(), dataEngineType);
-		}
-	}
-
-	private String name;
-
-	DataEngineType(String name) {
-		this.name = name;
-	}
-
-	public String getImage() {
-		return DOCKER_IMAGE_PREFIX + this.name;
-	}
-
-	public static DataEngineType fromString(String name) {
-		return INTERNAL_MAP.get(name);
-	}
-
-	public static DataEngineType fromDockerImageName(String name) {
-		return INTERNAL_MAP.get(name.replace(DOCKER_IMAGE_PREFIX, ""));
-	}
-
-	public static String getDockerImageName(DataEngineType dataEngineType) {
-		return DOCKER_IMAGE_PREFIX + dataEngineType.getName();
-	}
-
-	@JsonValue
-	public String getName() {
-		return name;
-	}
-}
\ No newline at end of file
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/ComputationalBase.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/ComputationalBase.java
deleted file mode 100644
index e3aa000..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/ComputationalBase.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.base.computational;
-
-import com.epam.dlab.dto.ResourceEnvBaseDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import java.util.Map;
-
-public abstract class ComputationalBase<T extends ComputationalBase<?>> extends ResourceEnvBaseDTO<T> {
-	@SuppressWarnings("unchecked")
-	private final T self = (T) this;
-
-	@JsonProperty("computational_name")
-	private String computationalName;
-
-	@JsonProperty("notebook_instance_name")
-	private String notebookInstanceName;
-
-	@JsonProperty("notebook_template_name")
-	private String notebookTemplateName;
-
-	@JsonProperty("project_name")
-	private String project;
-	@JsonProperty("endpoint_name")
-	private String ednpoint;
-
-	@JsonProperty("tags")
-	private Map<String, String> tags;
-
-	public String getComputationalName() {
-		return computationalName;
-	}
-
-	public void setComputationalName(String computationalName) {
-		this.computationalName = computationalName;
-	}
-
-	public T withComputationalName(String computationalName) {
-		setComputationalName(computationalName);
-		return self;
-	}
-
-	public String getNotebookInstanceName() {
-		return notebookInstanceName;
-	}
-
-	public void setNotebookInstanceName(String notebookInstanceName) {
-		this.notebookInstanceName = notebookInstanceName;
-	}
-
-	public T withNotebookInstanceName(String notebookInstanceName) {
-		setNotebookInstanceName(notebookInstanceName);
-		return self;
-	}
-
-	public String getNotebookTemplateName() {
-		return notebookTemplateName;
-	}
-
-	public void setNotebookTemplateName(String notebookTemplateName) {
-		this.notebookTemplateName = notebookTemplateName;
-	}
-
-	public T withNotebookTemplateName(String notebookTemplateName) {
-		setNotebookTemplateName(notebookTemplateName);
-		return self;
-	}
-
-	public T withProject(String project) {
-		this.project = project;
-		return self;
-	}
-
-	public T withTags(Map<String, String> tags) {
-		this.tags = tags;
-		return self;
-	}
-
-	public T withEndpoint(String endpoint) {
-		this.ednpoint = endpoint;
-		return self;
-	}
-
-	public String getProject() {
-		return project;
-	}
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("computationalName", computationalName)
-				.add("notebookInstanceName", notebookInstanceName)
-				.add("notebookTemplateName", notebookTemplateName);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/FullComputationalTemplate.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/FullComputationalTemplate.java
deleted file mode 100644
index 0c23ef2..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/computational/FullComputationalTemplate.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.base.computational;
-
-import com.epam.dlab.dto.imagemetadata.ComputationalMetadataDTO;
-import com.fasterxml.jackson.annotation.JsonUnwrapped;
-
-public class FullComputationalTemplate {
-	@JsonUnwrapped
-	private ComputationalMetadataDTO computationalMetadataDTO;
-
-
-	public FullComputationalTemplate(ComputationalMetadataDTO metadataDTO) {
-		this.computationalMetadataDTO = metadataDTO;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/edge/EdgeInfo.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/edge/EdgeInfo.java
deleted file mode 100644
index ddcf8c4..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/edge/EdgeInfo.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.base.edge;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import lombok.Data;
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
-public class EdgeInfo {
-	@JsonProperty("_id")
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private String id;
-
-	@JsonProperty("instance_id")
-	private String instanceId;
-
-	@JsonProperty
-	private String hostname;
-
-	@JsonProperty("public_ip")
-	private String publicIp;
-
-	@JsonProperty
-	private String ip;
-
-	@JsonProperty("key_name")
-	private String keyName;
-
-	@JsonProperty("tunnel_port")
-	private String tunnelPort;
-
-	@JsonProperty("socks_port")
-	private String socksPort;
-
-	@JsonProperty("notebook_sg")
-	private String notebookSg;
-
-	@JsonProperty("edge_sg")
-	private String edgeSg;
-
-	@JsonProperty("notebook_subnet")
-	private String notebookSubnet;
-
-	@JsonProperty("edge_status")
-	private String edgeStatus;
-
-	@JsonProperty("reupload_key_required")
-	private boolean reuploadKeyRequired = false;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/keyload/ReuploadFile.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/keyload/ReuploadFile.java
deleted file mode 100644
index 109f0b1..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/keyload/ReuploadFile.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.base.keyload;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-@Data
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-public class ReuploadFile extends UploadFile {
-	@JsonProperty
-	private String edgeUserName;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/keyload/UploadFile.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/keyload/UploadFile.java
deleted file mode 100644
index 65ee00c..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/keyload/UploadFile.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.base.keyload;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class UploadFile {
-    @JsonProperty
-    private String content;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/keyload/UploadFileResult.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/keyload/UploadFileResult.java
deleted file mode 100644
index 96c9943..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/keyload/UploadFileResult.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.base.keyload;
-
-import com.epam.dlab.dto.StatusBaseDTO;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.google.common.base.MoreObjects;
-
-public class UploadFileResult<T extends EdgeInfo> extends StatusBaseDTO<UploadFileResult<T>> {
-
-    private T edgeInfo;
-
-    public T getEdgeInfo() {
-        return edgeInfo;
-    }
-
-    public UploadFileResult<T> withEdgeInfo(T edgeInfo) {
-        this.edgeInfo = edgeInfo;
-        return this;
-    }
-
-    @Override
-    public MoreObjects.ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("edgeInfo", edgeInfo);
-    }
-
-
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/project/ProjectResult.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/base/project/ProjectResult.java
deleted file mode 100644
index 0c88022..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/base/project/ProjectResult.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.base.project;
-
-import com.epam.dlab.dto.StatusBaseDTO;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class ProjectResult extends StatusBaseDTO<ProjectResult> {
-    private EdgeInfo edgeInfo;
-    @JsonProperty("project_name")
-    private String projectName;
-    @JsonProperty("endpoint_name")
-    private String endpointName;
-
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/billing/BillingData.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/billing/BillingData.java
deleted file mode 100644
index c95a02e..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/billing/BillingData.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.billing;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Data;
-
-import java.time.LocalDate;
-
-@Data
-@Builder
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class BillingData {
-    private final String tag;
-    private String application;
-    @JsonProperty("from")
-    private LocalDate usageDateFrom;
-    @JsonProperty("to")
-    private LocalDate usageDateTo;
-    private String product;
-    private String usageType;
-    private Double cost;
-    private String currency;
-    private final String usageDate;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/billing/BillingResourceType.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/billing/BillingResourceType.java
deleted file mode 100644
index 7ad1082..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/billing/BillingResourceType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.billing;
-
-public enum BillingResourceType {
-    EDGE,
-    SSN,
-    ENDPOINT,
-    BUCKET,
-    VOLUME,
-    EXPLORATORY,
-    COMPUTATIONAL,
-    IMAGE
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/CheckInactivityCallbackDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/CheckInactivityCallbackDTO.java
deleted file mode 100644
index d7b790b..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/CheckInactivityCallbackDTO.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.dto.computational;
-
-import com.epam.dlab.dto.ResourceBaseDTO;
-import com.epam.dlab.dto.status.EnvResource;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.util.List;
-
-@Setter
-@Getter
-public class CheckInactivityCallbackDTO extends ResourceBaseDTO<CheckInactivityCallbackDTO> {
-
-	@JsonProperty
-	private List<EnvResource> resources;
-
-	@JsonProperty
-	private String id;
-
-	public CheckInactivityCallbackDTO withClusters(List<EnvResource> clusters) {
-		setResources(clusters);
-		return this;
-	}
-
-	public CheckInactivityCallbackDTO withId(String id) {
-		this.id = id;
-		return this;
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this)
-				.add("resources", resources)
-				.add("id", id)
-				.toString();
-	}
-
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/CheckInactivityStatus.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/CheckInactivityStatus.java
deleted file mode 100644
index 38212d9..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/CheckInactivityStatus.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.dto.computational;
-
-import java.util.Arrays;
-
-public enum CheckInactivityStatus {
-
-	COMPLETED("N/A"), FAILED("N/A");
-
-	private String message;
-
-	CheckInactivityStatus(String message) {
-		this.message = message;
-	}
-
-	public CheckInactivityStatus withErrorMessage(String message) {
-		this.message = message;
-		return this;
-	}
-
-	public String message() {
-		return message;
-	}
-
-	public static CheckInactivityStatus fromValue(String value) {
-		return Arrays.stream(values())
-				.filter(v -> v.name().equalsIgnoreCase(value))
-				.findAny()
-				.orElseThrow(() ->
-						new IllegalArgumentException("Wrong value for CheckInactivityStatus: " + value));
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/CheckInactivityStatusDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/CheckInactivityStatusDTO.java
deleted file mode 100644
index 80e57cd..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/CheckInactivityStatusDTO.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.dto.computational;
-
-import com.epam.dlab.dto.StatusBaseDTO;
-import lombok.Data;
-
-@Data
-public class CheckInactivityStatusDTO extends StatusBaseDTO<CheckInactivityStatusDTO> {
-
-	private String exploratoryName;
-	private String computationalName;
-	private long lastActivityUnixTime;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalCheckInactivityDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalCheckInactivityDTO.java
deleted file mode 100644
index 1fc3291..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalCheckInactivityDTO.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.computational;
-
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-public class ComputationalCheckInactivityDTO extends ComputationalBase<ComputationalCheckInactivityDTO> {
-	private String notebookImage;
-	@JsonProperty("computational_id")
-	private String computationalId;
-	private String image;
-
-	public ComputationalCheckInactivityDTO withNotebookImageName(String imageName) {
-		this.notebookImage = imageName;
-		return this;
-	}
-
-	public ComputationalCheckInactivityDTO withComputationalId(String computationalId) {
-		this.computationalId = computationalId;
-		return this;
-	}
-
-	public ComputationalCheckInactivityDTO withImage(String image) {
-		this.image = image;
-		return this;
-	}
-
-	public String getNotebookImage() {
-		return notebookImage;
-	}
-
-	public String getComputationalId() {
-		return computationalId;
-	}
-
-	public String getImage() {
-		return image;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalClusterConfigDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalClusterConfigDTO.java
deleted file mode 100644
index df60cb9..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalClusterConfigDTO.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.computational;
-
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class ComputationalClusterConfigDTO extends ComputationalBase<ComputationalClusterConfigDTO> {
-
-    @JsonProperty("computational_id")
-    private String copmutationalId;
-    @JsonProperty("spark_configurations")
-    private List<ClusterConfig> config;
-    @JsonProperty("azure_user_refresh_token")
-    private String azureUserRefreshToken;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalStartDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalStartDTO.java
deleted file mode 100644
index aae7f7b..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalStartDTO.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.computational;
-
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-
-public class ComputationalStartDTO extends ComputationalBase<ComputationalStartDTO> {
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalStatusDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalStatusDTO.java
deleted file mode 100644
index 241f92f..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalStatusDTO.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.computational;
-
-import com.epam.dlab.dto.ResourceURL;
-import com.epam.dlab.dto.StatusEnvBaseDTO;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import java.util.Date;
-import java.util.List;
-
-public class ComputationalStatusDTO extends StatusEnvBaseDTO<ComputationalStatusDTO> {
-	@JsonProperty("computational_url")
-	private List<ResourceURL> resourceUrl;
-	@JsonProperty("computational_id")
-	private String computationalId;
-	@JsonProperty("computational_name")
-	private String computationalName;
-	@JsonProperty("last_activity")
-	private Date lastActivity;
-	@JsonProperty
-	private List<ClusterConfig> config;
-
-	public String getComputationalId() {
-		return computationalId;
-	}
-
-	public void setComputationalId(String computationalId) {
-		this.computationalId = computationalId;
-	}
-
-	public ComputationalStatusDTO withComputationalId(String computationalId) {
-		setComputationalId(computationalId);
-		return this;
-	}
-
-	public List<ResourceURL> getResourceUrl() {
-		return resourceUrl;
-	}
-
-	public String getComputationalName() {
-		return computationalName;
-	}
-
-	public void setComputationalName(String computationalName) {
-		this.computationalName = computationalName;
-	}
-
-	public void setResourceUrl(List<ResourceURL> resourceUrl) {
-		this.resourceUrl = resourceUrl;
-	}
-
-	public void setLastActivity(Date lastActivity) {
-		this.lastActivity = lastActivity;
-	}
-
-	public ComputationalStatusDTO withComputationalUrl(List<ResourceURL> resourceUrl) {
-		setResourceUrl(resourceUrl);
-		return this;
-	}
-
-	public ComputationalStatusDTO withComputationalName(String computationalName) {
-		setComputationalName(computationalName);
-		return this;
-	}
-
-	public ComputationalStatusDTO withConfig(List<ClusterConfig> config) {
-		this.config = config;
-		return this;
-	}
-
-	public Date getLastActivity() {
-		return lastActivity;
-	}
-
-	public ComputationalStatusDTO withLastActivity(Date lastActivity) {
-		setLastActivity(lastActivity);
-		return this;
-	}
-
-	public List<ClusterConfig> getConfig() {
-		return config;
-	}
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("computationalUrl", resourceUrl)
-				.add("computationalId", computationalId)
-				.add("computationalName", computationalName)
-				.add("lastActivity", lastActivity)
-				.add("config", config);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalStopDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalStopDTO.java
deleted file mode 100644
index 7d3c5f6..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalStopDTO.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.computational;
-
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-
-public class ComputationalStopDTO extends ComputationalBase<ComputationalStopDTO> {
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalTerminateDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalTerminateDTO.java
deleted file mode 100644
index 44b6460..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/ComputationalTerminateDTO.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.computational;
-
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-
-public class ComputationalTerminateDTO extends ComputationalBase<ComputationalTerminateDTO> {
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/SparkStandaloneClusterResource.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/SparkStandaloneClusterResource.java
deleted file mode 100644
index 82f5660..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/SparkStandaloneClusterResource.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.computational;
-
-import com.epam.dlab.dto.ResourceURL;
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import org.hibernate.validator.constraints.NotBlank;
-
-import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class SparkStandaloneClusterResource extends UserComputationalResource {
-	@NotBlank
-	@JsonProperty("dataengine_instance_count")
-	private String dataEngineInstanceCount;
-
-	@NotBlank
-	@JsonProperty("dataengine_instance_shape")
-	private String dataEngineInstanceShape;
-
-	@Builder
-	public SparkStandaloneClusterResource(String computationalName, String computationalId, String imageName,
-										  String templateName, String status, Date uptime,
-										  SchedulerJobDTO schedulerJobData, boolean reuploadKeyRequired,
-										  String dataEngineInstanceCount, String dataEngineInstanceShape,
-										  List<ResourceURL> resourceURL, LocalDateTime lastActivity,
-										  List<ClusterConfig> config, Map<String, String> tags) {
-
-		super(computationalName, computationalId, imageName, templateName, status, uptime, schedulerJobData,
-				reuploadKeyRequired, resourceURL, lastActivity, tags);
-		this.dataEngineInstanceCount = dataEngineInstanceCount;
-		this.dataEngineInstanceShape = dataEngineInstanceShape;
-		this.config = config;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/UserComputationalResource.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/UserComputationalResource.java
deleted file mode 100644
index 9f8c021..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/computational/UserComputationalResource.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.computational;
-
-import com.epam.dlab.dto.ResourceURL;
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-@Data
-@NoArgsConstructor
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class UserComputationalResource {
-	@JsonProperty("computational_name")
-	private String computationalName;
-	@JsonProperty("computational_id")
-	private String computationalId;
-	@JsonProperty("image")
-	private String imageName;
-	@JsonProperty("template_name")
-	private String templateName;
-	@JsonProperty
-	private String status;
-	@JsonProperty("up_time")
-	private Date uptime;
-	@JsonProperty("scheduler_data")
-	private SchedulerJobDTO schedulerData;
-	@JsonProperty("reupload_key_required")
-	private boolean reuploadKeyRequired = false;
-	@JsonProperty("computational_url")
-	private List<ResourceURL> resourceUrl;
-	@JsonProperty("last_activity")
-	private LocalDateTime lastActivity;
-	@JsonProperty("master_node_shape")
-	private String masterNodeShape;
-	@JsonProperty("slave_node_shape")
-	private String slaveNodeShape;
-	@JsonProperty("dataengine_instance_shape")
-	private String dataengineShape;
-	@JsonProperty("dataengine_instance_count")
-	private int dataengineInstanceCount;
-	@JsonProperty("instance_id")
-	private String instanceId;
-	protected List<ClusterConfig> config;
-	private Map<String, String> tags;
-
-	public UserComputationalResource(String computationalName, String computationalId, String imageName,
-									 String templateName, String status, Date uptime, SchedulerJobDTO schedulerData,
-									 boolean reuploadKeyRequired, List<ResourceURL> resourceUrl,
-									 LocalDateTime lastActivity, Map<String, String> tags) {
-		this.computationalName = computationalName;
-		this.computationalId = computationalId;
-		this.imageName = imageName;
-		this.templateName = templateName;
-		this.status = status;
-		this.uptime = uptime;
-		this.schedulerData = schedulerData;
-		this.reuploadKeyRequired = reuploadKeyRequired;
-		this.resourceUrl = resourceUrl;
-		this.lastActivity = lastActivity;
-		this.tags = tags;
-	}
-
-	public DataEngineType getDataEngineType() {
-		return DataEngineType.fromDockerImageName(imageName);
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryActionDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryActionDTO.java
deleted file mode 100644
index 9b4ea75..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryActionDTO.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-public class ExploratoryActionDTO<T extends ExploratoryActionDTO<?>> extends ExploratoryBaseDTO<T> {
-    @JsonProperty("notebook_instance_name")
-    private String notebookInstanceName;
-
-	@JsonProperty("reupload_key_required")
-	private boolean reuploadKeyRequired;
-
-
-	public boolean isReuploadKeyRequired() {
-		return reuploadKeyRequired;
-	}
-
-	public void setReuploadKeyRequired(boolean reuploadKeyRequired) {
-		this.reuploadKeyRequired = reuploadKeyRequired;
-	}
-
-	@SuppressWarnings("unchecked")
-	public T withReuploadKeyRequired(boolean reuploadKeyRequired) {
-		setReuploadKeyRequired(reuploadKeyRequired);
-		return (T) this;
-	}
-
-	public String getNotebookInstanceName() {
-        return notebookInstanceName;
-    }
-
-    public void setNotebookInstanceName(String notebookInstanceName) {
-        this.notebookInstanceName = notebookInstanceName;
-    }
-
-    @SuppressWarnings("unchecked")
-    public T withNotebookInstanceName(String notebookInstanceName) {
-        setNotebookInstanceName(notebookInstanceName);
-        return (T) this;
-    }
-
-    @Override
-    public MoreObjects.ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-				.add("notebookInstanceName", notebookInstanceName);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryBaseDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryBaseDTO.java
deleted file mode 100644
index 7942f68..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryBaseDTO.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.epam.dlab.dto.ResourceEnvBaseDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-public class ExploratoryBaseDTO<T extends ExploratoryBaseDTO<?>> extends ResourceEnvBaseDTO<T> {
-	@SuppressWarnings("unchecked")
-	private final T self = (T) this;
-	@JsonProperty("notebook_image")
-	private String notebookImage;
-	@JsonProperty("project_name")
-	private String project;
-	@JsonProperty("endpoint_name")
-	private String endpoint;
-
-	public String getNotebookImage() {
-		return notebookImage;
-	}
-
-	public void setNotebookImage(String notebookImage) {
-		this.notebookImage = notebookImage;
-	}
-
-	public T withNotebookImage(String notebookImage) {
-		setNotebookImage(notebookImage);
-		return self;
-	}
-
-	public T withProject(String project) {
-		setProject(project);
-		return self;
-	}
-	public T withEndpoint(String endpoint) {
-		setEndpoint(endpoint);
-		return self;
-	}
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("notebookImage", notebookImage);
-	}
-
-	public String getProject() {
-		return project;
-	}
-
-	public void setProject(String project) {
-		this.project = project;
-	}
-
-	public String getEndpoint() {
-		return endpoint;
-	}
-
-	public void setEndpoint(String endpoint) {
-		this.endpoint = endpoint;
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCheckInactivityAction.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCheckInactivityAction.java
deleted file mode 100644
index 28b6e66..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCheckInactivityAction.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-public class ExploratoryCheckInactivityAction extends ExploratoryActionDTO<ExploratoryCheckInactivityAction> {
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCreateDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCreateDTO.java
deleted file mode 100644
index cb32efb..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryCreateDTO.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import java.util.List;
-import java.util.Map;
-
-public class ExploratoryCreateDTO<T extends ExploratoryCreateDTO<?>> extends ExploratoryBaseDTO<T> {
-
-	@SuppressWarnings("unchecked")
-	private final T self = (T) this;
-
-	@JsonProperty("git_creds")
-	private List<ExploratoryGitCreds> gitCreds;
-	@JsonProperty("notebook_image_name")
-	private String imageName;
-	@JsonProperty("spark_configurations")
-	private List<ClusterConfig> clusterConfig;
-	@JsonProperty("tags")
-	private Map<String, String> tags;
-	@JsonProperty("endpoint_name")
-	private String endpoint;
-	@JsonProperty("conf_shared_image_enabled")
-	private String sharedImageEnabled;
-
-	/**
-	 * Return the list of GIT credentials.
-	 */
-	public List<ExploratoryGitCreds> getGitCreds() {
-		return gitCreds;
-	}
-
-	/**
-	 * Set the list of GIT credentials.
-	 */
-	public void setGitCreds(List<ExploratoryGitCreds> gitCreds) {
-		this.gitCreds = gitCreds;
-	}
-
-	/**
-	 * Set the list of GIT credentials and return this object.
-	 */
-	public T withGitCreds(List<ExploratoryGitCreds> gitCreds) {
-		setGitCreds(gitCreds);
-		return self;
-	}
-
-	/**
-	 * Set the image name and return this object.
-	 */
-	public T withImageName(String imageName) {
-		setImageName(imageName);
-		return self;
-	}
-
-	public T withTags(Map<String, String> tags) {
-		this.tags = tags;
-		return self;
-	}
-
-	public T withEndpoint(String endpoint) {
-		this.endpoint = endpoint;
-		return self;
-	}
-
-	public T withSharedImageEnabled(String sharedImageEnabled) {
-		this.sharedImageEnabled = sharedImageEnabled;
-		return self;
-	}
-
-	public String getImageName() {
-		return imageName;
-	}
-
-	public void setImageName(String imageName) {
-		this.imageName = imageName;
-	}
-
-	public T withClusterConfig(List<ClusterConfig> config) {
-		this.clusterConfig = config;
-		return self;
-	}
-
-	public String getEndpoint() {
-		return endpoint;
-	}
-
-	public void setEndpoint(String endpoint) {
-		this.endpoint = endpoint;
-	}
-
-	public String getSharedImageEnabled() {
-		return sharedImageEnabled;
-	}
-
-	public void setSharedImageEnabled(String sharedImageEnabled) {
-		this.sharedImageEnabled = sharedImageEnabled;
-	}
-
-	public List<ClusterConfig> getClusterConfig() {
-		return clusterConfig;
-	}
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("gitCreds", gitCreds)
-				.add("imageName", imageName);
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryGitCreds.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryGitCreds.java
deleted file mode 100644
index e547bde..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryGitCreds.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import javax.annotation.Nullable;
-import javax.validation.constraints.NotNull;
-
-/**
- * Describe GIT credentials.
- */
-public class ExploratoryGitCreds implements Comparable<ExploratoryGitCreds> {
-
-	@NotNull
-	@JsonProperty
-	private String hostname;
-
-	@NotNull
-	@JsonProperty
-	private String username;
-
-	@NotNull
-	@JsonProperty
-	private String email;
-
-	@NotNull
-	@JsonProperty
-	private String login;
-
-	@JsonProperty
-	private String password;
-
-	/**
-	 * Return the name of host.
-	 */
-	public String getHostname() {
-		return hostname;
-	}
-
-	/**
-	 * Set the name of host.
-	 */
-	public void setHostname(String hostname) {
-		this.hostname = hostname;
-	}
-
-	/**
-	 * Set the name of host.
-	 */
-	public ExploratoryGitCreds withHostname(String hostname) {
-		setHostname(hostname);
-		return this;
-	}
-
-	/**
-	 * Return the name of user.
-	 */
-	public String getUsername() {
-		return username;
-	}
-
-	/**
-	 * Set the name of user.
-	 */
-	public void setUsername(String username) {
-		this.username = username;
-	}
-
-	/**
-	 * Set the name of user.
-	 */
-	public ExploratoryGitCreds withUsername(String username) {
-		setUsername(username);
-		return this;
-	}
-
-	/**
-	 * Return the email.
-	 */
-	public String getEmail() {
-		return email;
-	}
-
-	/**
-	 * Set the email.
-	 */
-	public void setEmail(String email) {
-		this.email = email;
-	}
-
-	/**
-	 * Set the email.
-	 */
-	public ExploratoryGitCreds withEmail(String email) {
-		setEmail(email);
-		return this;
-	}
-
-	/**
-	 * Return the login.
-	 */
-	public String getLogin() {
-		return login;
-	}
-
-	/**
-	 * Set the login.
-	 */
-	public void setLogin(String login) {
-		this.login = login;
-	}
-
-	/**
-	 * Set the login.
-	 */
-	public ExploratoryGitCreds withLogin(String login) {
-		setLogin(login);
-		return this;
-	}
-
-	/**
-	 * Return the password.
-	 */
-	public String getPassword() {
-		return password;
-	}
-
-	/**
-	 * Set the password.
-	 */
-	public void setPassword(String password) {
-		this.password = password;
-	}
-
-	/**
-	 * Set the password.
-	 */
-	public ExploratoryGitCreds withPassword(String password) {
-		setPassword(password);
-		return this;
-	}
-
-	@Override
-	public int compareTo(@Nullable ExploratoryGitCreds obj) {
-		if (obj == null) {
-			return 1;
-		}
-		return this.hostname.compareToIgnoreCase(obj.hostname);
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj) return true;
-		return (obj instanceof ExploratoryGitCreds && (this.compareTo((ExploratoryGitCreds) obj) == 0));
-
-	}
-
-	@Override
-	public int hashCode() {
-		return getHostname() != null ? getHostname().hashCode() : 0;
-	}
-
-	@Override
-	public String toString() {
-		return "ExploratoryGitCreds{" +
-				"hostname='" + hostname + '\'' +
-				", username='" + username + '\'' +
-				", email='" + email + '\'' +
-				", login='" + login + '\'' +
-				", password='" + "***" + '\'' +
-				'}';
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryGitCredsDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryGitCredsDTO.java
deleted file mode 100644
index 6ba903d..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryGitCredsDTO.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import java.util.Collections;
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-/** Stores info about the GIT credentials. 
- * */
-public class ExploratoryGitCredsDTO {
-    @JsonProperty("git_creds")
-    private List<ExploratoryGitCreds> gitCreds;
-
-    /** Return the list of GIT credentials.
-     */
-    public List<ExploratoryGitCreds> getGitCreds() {
-        return gitCreds;
-    }
-
-    /** Set the list of GIT credentials and check the unique for host names.
-     */
-    public void setGitCreds(List<ExploratoryGitCreds> gitCreds) {
-    	if (gitCreds != null) {
-    		Collections.sort(gitCreds);
-    		for (int i = 1; i < gitCreds.size(); i++) {
-				if (gitCreds.get(i).equals(gitCreds.get(i - 1))) {
-					throw new IllegalArgumentException("Duplicate found for host name in git credentials: " + gitCreds.get(i).getHostname());
-				}
-			}
-    	}
-        this.gitCreds = gitCreds;
-    }
-
-    @Override
-    public String toString() {
-    	return MoreObjects.toStringHelper(this)
-                .add("gitCreds", gitCreds)
-    			.toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryGitCredsUpdateDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryGitCredsUpdateDTO.java
deleted file mode 100644
index 86536f0..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryGitCredsUpdateDTO.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import java.util.List;
-
-/** Store GIT credentials which should be updated on exploratory.
- */
-public class ExploratoryGitCredsUpdateDTO extends ExploratoryActionDTO<ExploratoryGitCredsUpdateDTO> {
-    @JsonProperty("git_creds")
-    private List<ExploratoryGitCreds> gitCreds;
-
-    /** Return the list of GIT credentials.
-     */
-    public List<ExploratoryGitCreds> getGitCreds() {
-        return gitCreds;
-    }
-
-    /** Set the list of GIT credentials.
-     */
-    public void setGitCreds(List<ExploratoryGitCreds> gitCreds) {
-        this.gitCreds = gitCreds;
-    }
-
-    /** Set the list of GIT credentials and return this object.
-     */
-    public ExploratoryGitCredsUpdateDTO withGitCreds(List<ExploratoryGitCreds> gitCreds) {
-        setGitCreds(gitCreds);
-        return this;
-    }
-
-
-    @Override
-    public ToStringHelper toStringHelper(Object self) {
-            return super.toStringHelper(self)
-                    .add("gitCreds", gitCreds);
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryImageDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryImageDTO.java
deleted file mode 100644
index b41f432..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryImageDTO.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import lombok.Data;
-
-import java.util.Map;
-
-@Data
-public class ExploratoryImageDTO extends ExploratoryActionDTO<ExploratoryImageDTO> {
-
-	@JsonProperty("notebook_image_name")
-	private String imageName;
-
-	@JsonProperty("tags")
-	private Map<String, String> tags;
-	@JsonProperty("endpoint_name")
-	private String endpoint;
-	@JsonProperty("conf_shared_image_enabled")
-	private String sharedImageEnabled;
-
-	public ExploratoryImageDTO withImageName(String imageName) {
-		this.imageName = imageName;
-		return this;
-	}
-
-	public ExploratoryImageDTO withTags(Map<String, String> tags) {
-		this.tags = tags;
-		return this;
-	}
-
-	public ExploratoryImageDTO withEndpoint(String endpoint) {
-		this.endpoint = endpoint;
-		return this;
-	}
-
-	public ExploratoryImageDTO withSharedImageEnabled(String sharedImageEnabled) {
-		this.sharedImageEnabled = sharedImageEnabled;
-		return this;
-	}
-
-	@Override
-	public MoreObjects.ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("imageName", imageName);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryReconfigureSparkClusterActionDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryReconfigureSparkClusterActionDTO.java
deleted file mode 100644
index 3a7f6ab..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryReconfigureSparkClusterActionDTO.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import java.util.List;
-
-public class ExploratoryReconfigureSparkClusterActionDTO extends ExploratoryActionDTO<ExploratoryReconfigureSparkClusterActionDTO> {
-
-    @JsonProperty("spark_configurations")
-    private List<ClusterConfig> config;
-    @JsonProperty("azure_user_refresh_token")
-    private String azureUserRefreshToken;
-
-    public ExploratoryReconfigureSparkClusterActionDTO withConfig(List<ClusterConfig> config) {
-        this.config = config;
-        return this;
-    }
-
-    public ExploratoryReconfigureSparkClusterActionDTO withAzureUserRefreshToken(String azureUserRefreshToken) {
-        this.azureUserRefreshToken = azureUserRefreshToken;
-        return this;
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryStatusDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryStatusDTO.java
deleted file mode 100644
index ac2c9ed..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ExploratoryStatusDTO.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.epam.dlab.dto.ResourceURL;
-import com.epam.dlab.dto.StatusEnvBaseDTO;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import java.util.Date;
-import java.util.List;
-
-public class ExploratoryStatusDTO extends StatusEnvBaseDTO<ExploratoryStatusDTO> {
-	@JsonProperty("exploratory_url")
-	private List<ResourceURL> resourceUrl;
-	@JsonProperty("exploratory_user")
-	private String exploratoryUser;
-	@JsonProperty("exploratory_pass")
-	private String exploratoryPassword;
-	@JsonProperty("private_ip")
-	private String privateIp;
-	@JsonProperty("last_activity")
-	private Date lastActivity;
-	@JsonProperty
-	private List<ClusterConfig> config;
-
-	public String getPrivateIp() {
-		return privateIp;
-	}
-
-	public void setPrivateIp(String privateIp) {
-		this.privateIp = privateIp;
-	}
-
-	public ExploratoryStatusDTO withPrivateIp(String privateIp) {
-		setPrivateIp(privateIp);
-		return this;
-	}
-
-	public List<ResourceURL> getResourceUrl() {
-		return resourceUrl;
-	}
-
-	public void setResourceUrl(List<ResourceURL> resourceUrl) {
-		this.resourceUrl = resourceUrl;
-	}
-
-	public ExploratoryStatusDTO withExploratoryUrl(List<ResourceURL> resourceUrl) {
-		setResourceUrl(resourceUrl);
-		return this;
-	}
-
-	public String getExploratoryUser() {
-		return exploratoryUser;
-	}
-
-	public void setExploratoryUser(String exploratoryUser) {
-		this.exploratoryUser = exploratoryUser;
-	}
-
-	public ExploratoryStatusDTO withExploratoryUser(String exploratoryUser) {
-		setExploratoryUser(exploratoryUser);
-		return this;
-	}
-
-	public String getExploratoryPassword() {
-		return exploratoryPassword;
-	}
-
-	public void setExploratoryPassword(String exploratoryPassword) {
-		this.exploratoryPassword = exploratoryPassword;
-	}
-
-	public ExploratoryStatusDTO withExploratoryPassword(String exploratoryPassword) {
-		setExploratoryPassword(exploratoryPassword);
-		return this;
-	}
-
-	public ExploratoryStatusDTO withConfig(List<ClusterConfig> config) {
-		this.config = config;
-		return this;
-	}
-
-	public List<ClusterConfig> getConfig() {
-		return config;
-	}
-
-	public ExploratoryStatusDTO withLastActivity(Date lastActivity) {
-		this.lastActivity = lastActivity;
-		return this;
-	}
-
-	public Date getLastActivity() {
-		return lastActivity;
-	}
-
-	@Override
-	public ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("exploratoryUrl", resourceUrl)
-				.add("exploratoryUser", exploratoryUser)
-				.add("exploratoryPassword", exploratoryPassword)
-				.add("config", config);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ImageCreateStatusDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ImageCreateStatusDTO.java
deleted file mode 100644
index 44556a7..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ImageCreateStatusDTO.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.epam.dlab.dto.StatusBaseDTO;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.ToString;
-
-@Data
-public class ImageCreateStatusDTO extends StatusBaseDTO<ImageCreateStatusDTO> {
-
-	private ImageCreateDTO imageCreateDTO;
-	private String name;
-	private String exploratoryName;
-	private String project;
-	private String endpoint;
-
-	public ImageCreateStatusDTO withImageCreateDto(ImageCreateDTO imageCreateDto) {
-		setImageCreateDTO(imageCreateDto);
-		return this;
-	}
-
-	public ImageCreateStatusDTO withoutImageCreateDto() {
-		setImageCreateDTO(new ImageCreateDTO());
-		return this;
-	}
-
-	@Data
-	@ToString
-	@JsonIgnoreProperties(ignoreUnknown = true)
-	@NoArgsConstructor
-	public static class ImageCreateDTO {
-		private String externalName;
-		private String fullName;
-		private String user;
-		private String application;
-		private ImageStatus status;
-		private String ip;
-
-		@JsonCreator
-		public ImageCreateDTO(@JsonProperty("notebook_image_name") String externalName,
-							  @JsonProperty("full_image_name") String fullName,
-							  @JsonProperty("user_name") String user, @JsonProperty("application") String application,
-							  @JsonProperty("status") ImageStatus status, @JsonProperty("ip") String ip) {
-			this.externalName = externalName;
-			this.fullName = fullName;
-			this.user = user;
-			this.application = application;
-			this.status = status;
-			this.ip = ip;
-		}
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ImageStatus.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ImageStatus.java
deleted file mode 100644
index b25a40c..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/ImageStatus.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-
-import java.util.Arrays;
-
-public enum ImageStatus {
-	CREATING,
-	CREATED,
-	FAILED;
-
-	@JsonCreator
-	public static ImageStatus fromValue(final String status) {
-		return Arrays.stream(ImageStatus.values())
-				.filter(s -> s.name().equalsIgnoreCase(status))
-				.findAny()
-				.orElseThrow(() -> new IllegalArgumentException(String.format("Wrong value for image status: %s",
-						status)));
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibInstallDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibInstallDTO.java
deleted file mode 100644
index bcb452a..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibInstallDTO.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * Stores info about libraries.
- */
-@Data
-@NoArgsConstructor
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class LibInstallDTO {
-	@JsonProperty
-	private String group;
-
-	@JsonProperty
-	private String name;
-
-	@JsonProperty
-	private String version;
-
-	@JsonProperty
-	private String status;
-
-	@JsonProperty("error_message")
-	private String errorMessage;
-
-	@JsonProperty
-	private boolean override;
-
-	public LibInstallDTO(String group, String name, String version) {
-		this.group = group;
-		this.name = name;
-		this.version = version;
-	}
-
-	public LibInstallDTO withName(String name) {
-		setName(name);
-		return this;
-	}
-
-	public LibInstallDTO withStatus(String status) {
-		setStatus(status);
-		return this;
-	}
-
-	public LibInstallDTO withErrorMessage(String errorMessage) {
-		setErrorMessage(errorMessage);
-		return this;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibInstallStatusDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibInstallStatusDTO.java
deleted file mode 100644
index e78847c..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibInstallStatusDTO.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.dto.exploratory;
-
-import com.epam.dlab.dto.StatusEnvBaseDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.util.List;
-
-@Getter
-@Setter
-public class LibInstallStatusDTO extends StatusEnvBaseDTO<LibInstallStatusDTO> {
-    @JsonProperty
-    private List<LibInstallDTO> libs;
-
-    @JsonProperty
-    private String computationalName;
-
-
-    public LibInstallStatusDTO withLibs(List<LibInstallDTO> libs) {
-        setLibs(libs);
-        return this;
-    }
-
-    public LibInstallStatusDTO withComputationalName(String computationalName) {
-        setComputationalName(computationalName);
-        return this;
-    }
-
-    @Override
-    public ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("libs", libs)
-                .add("computationalName", computationalName);
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibListStatusDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibListStatusDTO.java
deleted file mode 100644
index 56f82af..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibListStatusDTO.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.epam.dlab.dto.StatusBaseDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * Stores the info about image libraries.
- */
-@Getter
-@Setter
-public class LibListStatusDTO extends StatusBaseDTO<LibListStatusDTO> {
-
-    @JsonProperty
-    private String libs;
-
-    @JsonProperty
-    private String imageName;
-
-    /**
-     * Set the list of libraries and return this object
-     */
-    public LibListStatusDTO withLibs(String libs) {
-        setLibs(libs);
-        return this;
-    }
-
-    /**
-     * Set the name of image and return this object
-     */
-    public LibListStatusDTO withImageName(String imageName) {
-        setImageName(imageName);
-        return this;
-    }
-
-    @Override
-    public MoreObjects.ToStringHelper toStringHelper(Object self) {
-        return MoreObjects.toStringHelper(self)
-                .add("imageName", imageName)
-                .add("libs", (libs != null) ? "..." : null);
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibStatus.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibStatus.java
deleted file mode 100644
index c5d0016..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibStatus.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.dto.exploratory;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-
-/**
- * Statuses for the libraries.
- */
-public enum LibStatus {
-	INSTALLING,
-	INSTALLED,
-	FAILED;
-
-	@JsonCreator
-	public static LibStatus of(String status) {
-		if (status != null) {
-			for (LibStatus uis : LibStatus.values()) {
-				if (status.equalsIgnoreCase(uis.toString())) {
-					return uis;
-				}
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public String toString() {
-		return super.toString().toLowerCase();
-	}
-}
\ No newline at end of file
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibraryInstallDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibraryInstallDTO.java
deleted file mode 100644
index 28cac77..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/exploratory/LibraryInstallDTO.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.exploratory;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-import java.util.List;
-
-/**
- * Store info about libraries which user should be installed.
- */
-@Getter
-@Setter
-@ToString(callSuper = true)
-public class LibraryInstallDTO extends ExploratoryActionDTO<LibraryInstallDTO> {
-    @JsonProperty("libs")
-    private List<LibInstallDTO> libs;
-
-    @JsonProperty("computational_id")
-    private String computationalId;
-
-    @JsonProperty("computational_image")
-    private String computationalImage;
-
-    @JsonProperty("computational_name")
-    private String computationalName;
-
-    public LibraryInstallDTO withLibs(List<LibInstallDTO> libs) {
-        setLibs(libs);
-        return this;
-    }
-
-    public LibraryInstallDTO withComputationalId(String computationalId) {
-        setComputationalId(computationalId);
-        return this;
-    }
-
-    public LibraryInstallDTO withComputationalImage(String computationalImage) {
-        setComputationalImage(computationalImage);
-        return this;
-    }
-
-    public LibraryInstallDTO withComputationalName(String computationalName) {
-        setComputationalName(computationalName);
-        return this;
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/GcpCloudSettings.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/GcpCloudSettings.java
deleted file mode 100644
index c12c39a..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/GcpCloudSettings.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.gcp;
-
-import com.epam.dlab.dto.base.CloudSettings;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.*;
-
-@Data
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-@NoArgsConstructor
-@Builder
-@AllArgsConstructor
-public class GcpCloudSettings extends CloudSettings {
-
-	@JsonProperty("gcp_iam_user")
-	private String gcpIamUser;
-	@JsonProperty("ldap_hostname")
-	protected String ldapHost;
-	@JsonProperty("ldap_dn")
-	protected String ldapDn;
-	@JsonProperty("ldap_ou")
-	protected String ldapOu;
-	@JsonProperty("ldap_service_username")
-	protected String ldapUser;
-	@JsonProperty("ldap_service_password")
-	protected String ldapPassword;
-	@JsonProperty("conf_os_family")
-	protected String os;
-	@JsonProperty("conf_cloud_provider")
-	protected String cloud;
-	@JsonProperty("conf_service_base_name")
-	protected String sbn;
-	@JsonProperty("conf_key_dir")
-	protected String confKeyDir;
-	@JsonProperty("gcp_project_id")
-	protected String projectId;
-	@JsonProperty("gcp_vpc_name")
-	protected String vpcName;
-	@JsonProperty("gcp_subnet_name")
-	protected String subnetName;
-	@JsonProperty("gcp_zone")
-	protected String zone;
-	@JsonProperty("gcp_region")
-	protected String region;
-	@JsonProperty("conf_image_enabled")
-	private String imageEnabled;
-	@JsonProperty("conf_stepcerts_enabled")
-	private String stepCertsEnabled;
-	@JsonProperty("conf_stepcerts_root_ca")
-	private String stepCertsRootCA;
-	@JsonProperty("conf_stepcerts_kid")
-	private String stepCertsKid;
-	@JsonProperty("conf_stepcerts_kid_password")
-	private String stepCertsKidPassword;
-	@JsonProperty("conf_stepcerts_ca_url")
-	private String stepCertsCAURL;
-	@JsonProperty("keycloak_auth_server_url")
-	private String keycloakAuthServerUrl;
-	@JsonProperty("keycloak_realm_name")
-	private String keycloakRealmName;
-	@JsonProperty("keycloak_user")
-	private String keycloakUser;
-	@JsonProperty("keycloak_user_password")
-	private String keycloakUserPassword;
-
-	@Override
-	@JsonIgnore
-	public String getIamUser() {
-		return gcpIamUser;
-	}
-}
\ No newline at end of file
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/auth/GcpOauth2AuthorizationCodeResponse.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/auth/GcpOauth2AuthorizationCodeResponse.java
deleted file mode 100644
index fbbdf83..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/auth/GcpOauth2AuthorizationCodeResponse.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.gcp.auth;
-
-import lombok.Data;
-
-@Data
-public class GcpOauth2AuthorizationCodeResponse {
-	private final String code;
-	private final String state;
-	private final String errorMessage;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/ComputationalCreateGcp.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/ComputationalCreateGcp.java
deleted file mode 100644
index 1ab5698..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/ComputationalCreateGcp.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.gcp.computational;
-
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-public class ComputationalCreateGcp extends ComputationalBase<ComputationalCreateGcp> {
-    @JsonProperty("dataproc_master_count")
-    private String masterInstanceCount;
-    @JsonProperty("dataproc_slave_count")
-    private String slaveInstanceCount;
-    @JsonProperty("dataproc_master_instance_type")
-    private String masterInstanceType;
-    @JsonProperty("dataproc_slave_instance_type")
-    private String slaveInstanceType;
-    @JsonProperty("dataproc_preemptible_count")
-    private String preemptibleCount;
-    @JsonProperty("dataproc_version")
-    private String version;
-    @JsonProperty("conf_shared_image_enabled")
-    private String sharedImageEnabled;
-
-    public ComputationalCreateGcp withMasterInstanceCount(String masterInstanceCount) {
-        this.masterInstanceCount = masterInstanceCount;
-        return this;
-    }
-
-    public ComputationalCreateGcp withSlaveInstanceCount(String slaveInstanceCount) {
-        this.slaveInstanceCount = slaveInstanceCount;
-        return this;
-    }
-
-    public ComputationalCreateGcp withMasterInstanceType(String masterInstanceType) {
-        this.masterInstanceType = masterInstanceType;
-        return this;
-    }
-
-    public ComputationalCreateGcp withSlaveInstanceType(String slaveInstanceType) {
-        this.slaveInstanceType = slaveInstanceType;
-        return this;
-    }
-
-    public ComputationalCreateGcp withPreemptibleCount(String preemptibleCount) {
-        this.preemptibleCount = preemptibleCount;
-        return this;
-    }
-
-    public ComputationalCreateGcp withVersion(String version) {
-        this.version = version;
-        return this;
-    }
-
-    public String getSharedImageEnabled() {
-        return sharedImageEnabled;
-    }
-
-    public void setSharedImageEnabled(String sharedImageEnabled) {
-        this.sharedImageEnabled = sharedImageEnabled;
-    }
-
-    public ComputationalCreateGcp withSharedImageEnabled(String sharedImageEnabled) {
-        setSharedImageEnabled(sharedImageEnabled);
-        return this;
-    }
-
-    @Override
-    public MoreObjects.ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("version", version)
-                .add("masterInstanceType", masterInstanceType)
-                .add("slaveInstanceType", slaveInstanceType)
-                .add("masterInstanceCount", masterInstanceCount)
-                .add("slaveInstanceCount", slaveInstanceCount)
-                .add("preemptibleCount", preemptibleCount);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/GcpComputationalResource.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/GcpComputationalResource.java
deleted file mode 100644
index b56bbd8..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/GcpComputationalResource.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.gcp.computational;
-
-import com.epam.dlab.dto.ResourceURL;
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.ToString;
-
-import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Stores info about the user's computational resources for notebook.
- */
-@ToString(callSuper = true)
-@Getter
-@EqualsAndHashCode(callSuper = true)
-public class GcpComputationalResource extends UserComputationalResource {
-
-	@JsonProperty("instance_id")
-	private String instanceId;
-	@JsonProperty("master_node_shape")
-	private String masterShape;
-	@JsonProperty("slave_node_shape")
-	private String slaveShape;
-	@JsonProperty("total_slave_instance_number")
-	private String slaveNumber;
-	@JsonProperty("total_master_instance_number")
-	private String masterNumber;
-	@JsonProperty("total_preemptible_number")
-	private String preemptibleNumber;
-	@JsonProperty("dataproc_version")
-	private String version;
-
-	@Builder
-	public GcpComputationalResource(String computationalName, String computationalId, String imageName,
-									String templateName, String status, Date uptime,
-									SchedulerJobDTO schedulerJobData, boolean reuploadKeyRequired,
-									String instanceId, String masterShape, String slaveShape, String slaveNumber,
-									String masterNumber, String preemptibleNumber, String version,
-									List<ResourceURL> resourceURL, LocalDateTime lastActivity,
-									Map<String, String> tags) {
-		super(computationalName, computationalId, imageName, templateName, status, uptime, schedulerJobData,
-				reuploadKeyRequired, resourceURL, lastActivity, tags);
-		this.instanceId = instanceId;
-		this.masterShape = masterShape;
-		this.slaveShape = slaveShape;
-		this.slaveNumber = slaveNumber;
-		this.masterNumber = masterNumber;
-		this.version = version;
-		this.preemptibleNumber = preemptibleNumber;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/GcpComputationalTerminateDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/GcpComputationalTerminateDTO.java
deleted file mode 100644
index 648b75f..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/GcpComputationalTerminateDTO.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.gcp.computational;
-
-import com.epam.dlab.dto.computational.ComputationalTerminateDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.ToString;
-
-@Data
-@ToString(callSuper = true)
-public class GcpComputationalTerminateDTO extends ComputationalTerminateDTO {
-
-	@JsonProperty("dataproc_cluster_name")
-	private String clusterName;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/SparkComputationalCreateGcp.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/SparkComputationalCreateGcp.java
deleted file mode 100644
index e21881b..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/computational/SparkComputationalCreateGcp.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.gcp.computational;
-
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-import java.util.List;
-
-
-public class SparkComputationalCreateGcp extends ComputationalBase<SparkComputationalCreateGcp> {
-
-	@JsonProperty("dataengine_instance_count")
-	private String dataEngineInstanceCount;
-	@JsonProperty("gcp_dataengine_slave_size")
-	private String dataEngineSlaveSize;
-	@JsonProperty("gcp_dataengine_master_size")
-	private String dataEngineMasterSize;
-	@JsonProperty("spark_configurations")
-	private List<ClusterConfig> config;
-	@JsonProperty("conf_shared_image_enabled")
-	private String sharedImageEnabled;
-
-	public SparkComputationalCreateGcp withDataEngineInstanceCount(String dataEngineInstanceCount) {
-		this.dataEngineInstanceCount = dataEngineInstanceCount;
-		return this;
-	}
-
-	public SparkComputationalCreateGcp withDataEngineSlaveSize(String dataEngineSlaveSize) {
-		this.dataEngineSlaveSize = dataEngineSlaveSize;
-		return this;
-	}
-
-	public SparkComputationalCreateGcp withDataEngineMasterSize(String dataEngineMasterSize) {
-		this.dataEngineMasterSize = dataEngineMasterSize;
-		return this;
-	}
-
-	public SparkComputationalCreateGcp withConfig(List<ClusterConfig> config) {
-		this.config = config;
-		return this;
-	}
-
-	public SparkComputationalCreateGcp withSharedImageEnabled(String sharedImageEnabled) {
-		this.sharedImageEnabled = sharedImageEnabled;
-		return this;
-	}
-
-
-	@Override
-	public MoreObjects.ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("dataEngineInstanceCount", dataEngineInstanceCount)
-				.add("dataEngineSlaveSize", dataEngineSlaveSize)
-				.add("dataEngineMasterSize", dataEngineMasterSize);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/edge/EdgeCreateGcp.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/edge/EdgeCreateGcp.java
deleted file mode 100644
index 5de6acf..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/edge/EdgeCreateGcp.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.gcp.edge;
-
-import com.epam.dlab.dto.ResourceSysBaseDTO;
-
-public class EdgeCreateGcp extends ResourceSysBaseDTO<EdgeCreateGcp> {
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/edge/EdgeInfoGcp.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/edge/EdgeInfoGcp.java
deleted file mode 100644
index b70fbfd..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/edge/EdgeInfoGcp.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.gcp.edge;
-
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-@Getter
-@Setter
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class EdgeInfoGcp extends EdgeInfo {
-    @JsonProperty("user_own_bucket_name")
-    private String userOwnBucketName;
-    @JsonProperty("shared_bucket_name")
-    private String sharedBucketName;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/exploratory/ExploratoryCreateGcp.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/exploratory/ExploratoryCreateGcp.java
deleted file mode 100644
index 2b123b8..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/exploratory/ExploratoryCreateGcp.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.gcp.exploratory;
-
-import com.epam.dlab.dto.exploratory.ExploratoryCreateDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-public class ExploratoryCreateGcp extends ExploratoryCreateDTO<ExploratoryCreateGcp> {
-    @JsonProperty("gcp_notebook_instance_size")
-    private String notebookInstanceSize;
-
-    public String getNotebookInstanceSize() {
-        return notebookInstanceSize;
-    }
-
-    public void setNotebookInstanceSize(String notebookInstanceSize) {
-        this.notebookInstanceSize = notebookInstanceSize;
-    }
-
-    public ExploratoryCreateGcp withNotebookInstanceType(String notebookInstanceType) {
-        setNotebookInstanceSize(notebookInstanceType);
-        return this;
-    }
-
-    @Override
-    public MoreObjects.ToStringHelper toStringHelper(Object self) {
-        return super.toStringHelper(self)
-                .add("notebookInstanceSize", notebookInstanceSize);
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/keyload/UploadFileGcp.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/keyload/UploadFileGcp.java
deleted file mode 100644
index 7204cae..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/gcp/keyload/UploadFileGcp.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.gcp.keyload;
-
-import com.epam.dlab.dto.base.keyload.UploadFile;
-import com.epam.dlab.dto.gcp.edge.EdgeCreateGcp;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-@Data
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-public class UploadFileGcp extends UploadFile {
-    @JsonProperty
-    private final EdgeCreateGcp edge;
-
-	@JsonCreator
-	public UploadFileGcp(@JsonProperty("edge") EdgeCreateGcp edge, @JsonProperty("content") String content) {
-        super(content);
-        this.edge = edge;
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ApplicationDto.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ApplicationDto.java
deleted file mode 100644
index 03bd04f..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ApplicationDto.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.imagemetadata;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-
-import java.util.Objects;
-
-public class ApplicationDto {
-    @JsonProperty("Version")
-    private String version;
-    @JsonProperty("Name")
-    private String name;
-
-    public ApplicationDto() {
-    }
-
-
-    public ApplicationDto(String version, String name) {
-        this.version = version;
-        this.name = name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ApplicationDto that = (ApplicationDto) o;
-
-        if (version != null ? !version.equals(that.version) : that.version != null) {
-            return false;
-        }
-        return name != null ? name.equals(that.name) : that.name == null;
-
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(version, name);
-    }
-
-    @Override
-    public String toString() {
-        return ReflectionToStringBuilder.toString(this);
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ComputationalMetadataDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ComputationalMetadataDTO.java
deleted file mode 100644
index 30f648d..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ComputationalMetadataDTO.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.imagemetadata;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-import java.util.Map;
-
-@Data
-@NoArgsConstructor
-@EqualsAndHashCode(callSuper = false)
-public class ComputationalMetadataDTO extends ImageMetadataDTO {
-	@JsonProperty
-	protected String image;
-	@JsonProperty("template_name")
-	private String templateName;
-	@JsonProperty
-	private String description;
-	@JsonProperty("environment_type")
-	private String type;
-	@JsonProperty
-	private List<TemplateDTO> templates;
-	@JsonProperty("request_id")
-	private String requestId;
-	@JsonProperty(value = "computation_resources_shapes")
-	private Map<String, List<ComputationalResourceShapeDto>> computationResourceShapes;
-
-	public ComputationalMetadataDTO(String imageName) {
-		this.image = imageName;
-		setImageType(ImageType.COMPUTATIONAL);
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ComputationalResourceShapeDto.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ComputationalResourceShapeDto.java
deleted file mode 100644
index 361c552..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ComputationalResourceShapeDto.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.imagemetadata;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-
-public class ComputationalResourceShapeDto {
-	@JsonProperty("Type")
-	private String type;
-	@JsonProperty("Size")
-	private String size;
-	@JsonProperty("Description")
-	private String description;
-	@JsonProperty("Ram")
-	private String ram;
-	@JsonProperty("Cpu")
-	private int cpu;
-	@JsonProperty("Spot")
-	private boolean spot = false;
-
-	@JsonProperty("SpotPctPrice")
-	private int spotPctPrice = 70;
-
-
-	public ComputationalResourceShapeDto() {
-	}
-
-	public ComputationalResourceShapeDto(String type, String size, String description, String ram, int cpu) {
-		this.type = type;
-		this.size = size;
-		this.description = description;
-		this.ram = ram;
-		this.cpu = cpu;
-	}
-
-	public String getType() {
-		return type;
-	}
-
-	public void setType(String type) {
-		this.type = type;
-	}
-
-	public String getSize() {
-		return size;
-	}
-
-	public void setSize(String size) {
-		this.size = size;
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public String getRam() {
-		return ram;
-	}
-
-	public void setRam(String ram) {
-		this.ram = ram;
-	}
-
-	public int getCpu() {
-		return cpu;
-	}
-
-	public void setCpu(int cpu) {
-		this.cpu = cpu;
-	}
-
-	public boolean isSpot() {
-		return spot;
-	}
-
-	public void setSpot(boolean spot) {
-		this.spot = spot;
-	}
-
-	public int getSpotPctPrice() {
-		return spotPctPrice;
-	}
-
-	public void setSpotPctPrice(int spotPctPrice) {
-		this.spotPctPrice = spotPctPrice;
-	}
-
-	@Override
-	public String toString() {
-		return ReflectionToStringBuilder.toString(this);
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ExploratoryEnvironmentVersion.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ExploratoryEnvironmentVersion.java
deleted file mode 100644
index 78bccee..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ExploratoryEnvironmentVersion.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.dto.imagemetadata;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-
-public class ExploratoryEnvironmentVersion {
-    @JsonProperty("template_name")
-    private String templateName;
-    @JsonProperty
-    private String description;
-    @JsonProperty("environment_type")
-    private String type;
-    @JsonProperty("version")
-    private String version;
-    @JsonProperty("vendor")
-    private String vendor;
-
-    public ExploratoryEnvironmentVersion() {
-    }
-
-    public ExploratoryEnvironmentVersion(String templateName, String description, String type, String version,
-                                         String vendor) {
-        this.templateName = templateName;
-        this.description = description;
-        this.type = type;
-        this.version = version;
-        this.vendor = vendor;
-    }
-
-    public String getTemplateName() {
-        return templateName;
-    }
-
-    public void setTemplateName(String templateName) {
-        this.templateName = templateName;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getVendor() {
-        return vendor;
-    }
-
-    public void setVendor(String vendor) {
-        this.vendor = vendor;
-    }
-
-    @Override
-    public String toString() {
-        return ReflectionToStringBuilder.toString(this);
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ExploratoryMetadataDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ExploratoryMetadataDTO.java
deleted file mode 100644
index dfa94a2..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ExploratoryMetadataDTO.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.dto.imagemetadata;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-import java.util.HashMap;
-import java.util.List;
-
-@Data
-@NoArgsConstructor
-@EqualsAndHashCode(callSuper = false)
-public class ExploratoryMetadataDTO extends ImageMetadataDTO {
-    @JsonProperty
-    protected String image;
-    @JsonProperty("exploratory_environment_versions")
-    private List<ExploratoryEnvironmentVersion> exploratoryEnvironmentVersions;
-    @JsonProperty("exploratory_environment_shapes")
-    private HashMap<String, List<ComputationalResourceShapeDto>> exploratoryEnvironmentShapes;
-    @JsonProperty("request_id")
-    private String requestId;
-
-    public ExploratoryMetadataDTO(String imageName) {
-        this.image = imageName;
-        setImageType(ImageType.EXPLORATORY);
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ImageMetadataDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ImageMetadataDTO.java
deleted file mode 100644
index 8fc7ba3..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ImageMetadataDTO.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.imagemetadata;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-
-/**
- * Common parent for metadata DTO. Holds type information during
- * runtime to make life easier when working with collection of metadatas or
- * filtering by type. Shouldnt be used to hold common attributes for upstream
- * hierarchy as it will requite type information to be serialized within json
- * which is not we really want.
- */
-public abstract class ImageMetadataDTO {
-    @JsonProperty("image_type")
-    private ImageType imageType;
-
-    public ImageType getImageType() {
-        return imageType;
-    }
-
-    public void setImageType(ImageType imageType) {
-        this.imageType = imageType;
-    }
-
-    public abstract void setImage(String image);
-
-    @Override
-    public String toString() {
-        return ReflectionToStringBuilder.toString(this);
-    }
-
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ImageType.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ImageType.java
deleted file mode 100644
index a030ee7..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/ImageType.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.imagemetadata;
-
-public enum ImageType {
-    COMPUTATIONAL("computational"),
-    EXPLORATORY("exploratory");
-
-    private String type;
-
-    ImageType(String type) {
-        this.type = type;
-    }
-
-    public String getType() {
-        return type;
-    }
-    
-    public static ImageType of(String type) {
-        if (type != null) {
-            for (ImageType value : ImageType.values()) {
-                if (type.equalsIgnoreCase(value.toString())) {
-                    return value;
-                }
-            }
-        }
-        return null;
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/TemplateDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/TemplateDTO.java
deleted file mode 100644
index 92c6647..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/imagemetadata/TemplateDTO.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.imagemetadata;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-
-import java.util.List;
-import java.util.Objects;
-
-public class TemplateDTO {
-    @JsonProperty
-    private String version;
-    @JsonProperty
-    private List<ApplicationDto> applications;
-
-    public TemplateDTO() {
-    }
-
-    public TemplateDTO(String version) {
-        this.version = version;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public List<ApplicationDto> getApplications() {
-        return applications;
-    }
-
-    public void setApplications(List<ApplicationDto> applications) {
-        this.applications = applications;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        TemplateDTO that = (TemplateDTO) o;
-
-        if (version != null ? !version.equals(that.version) : that.version != null) {
-            return false;
-        }
-        return applications != null ? applications.equals(that.applications) : that.applications == null;
-
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(version, applications);
-    }
-
-    @Override
-    public String toString() {
-        return ReflectionToStringBuilder.toString(this);
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/keyload/KeyLoadStatus.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/keyload/KeyLoadStatus.java
deleted file mode 100644
index 80429c4..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/keyload/KeyLoadStatus.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.keyload;
-
-import javax.ws.rs.core.Response;
-import java.util.Arrays;
-
-public enum KeyLoadStatus {
-    NONE("none", null, Response.Status.NOT_FOUND),
-    NEW("new", null, Response.Status.ACCEPTED),
-    SUCCESS("success", "ok", Response.Status.OK),
-    ERROR("error", "err", Response.Status.INTERNAL_SERVER_ERROR);
-
-    private String status;
-    private String value;
-    private Response.Status httpStatus;
-
-    KeyLoadStatus(String status, String value, Response.Status httpStatus) {
-        this.status = status;
-        this.value = value;
-        this.httpStatus = httpStatus;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public Response.Status getHttpStatus() {
-        return httpStatus;
-    }
-
-    public static boolean isSuccess(String value) {
-        return SUCCESS.value.equals(value);
-    }
-
-    public static String getStatus(boolean successed) {
-        return successed ? SUCCESS.status : ERROR.status;
-    }
-
-    public static KeyLoadStatus findByStatus(String status) {
-        return Arrays.stream(values()).reduce(NONE, (result, next) -> next.status.equalsIgnoreCase(status) ? next : result);
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/keyload/UserKeyDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/keyload/UserKeyDTO.java
deleted file mode 100644
index 5a4ecbe..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/keyload/UserKeyDTO.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.keyload;
-
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class UserKeyDTO {
-    @JsonProperty
-    private String content;
-    @JsonProperty
-    private String status;
-
-    public String getContent() {
-        return content;
-    }
-
-    public void setContent(String content) {
-        this.content = content;
-    }
-
-    public UserKeyDTO withContent(String content) {
-        setContent(content);
-        return this;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public UserKeyDTO withStatus(String status) {
-        setStatus(status);
-        return this;
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectActionDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectActionDTO.java
deleted file mode 100644
index 93b955e..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectActionDTO.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.project;
-
-import com.epam.dlab.dto.ResourceBaseDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class ProjectActionDTO extends ResourceBaseDTO<ProjectActionDTO> {
-    @JsonProperty("project_name")
-    private final String name;
-    @JsonProperty("endpoint_name")
-    private final String endpoint;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectCreateDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectCreateDTO.java
deleted file mode 100644
index 47b49b2..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/project/ProjectCreateDTO.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.project;
-
-import com.epam.dlab.dto.ResourceBaseDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Data;
-
-@Data
-@Builder
-public class ProjectCreateDTO extends ResourceBaseDTO<ProjectCreateDTO> {
-    private final String key;
-    @JsonProperty("project_name")
-    private final String name;
-    @JsonProperty("project_tag")
-    private final String tag;
-    @JsonProperty("endpoint_name")
-    private final String endpoint;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyCallbackDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyCallbackDTO.java
deleted file mode 100644
index fa0f49b..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyCallbackDTO.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.reuploadkey;
-
-import com.epam.dlab.dto.ResourceSysBaseDTO;
-import com.epam.dlab.model.ResourceData;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import lombok.Getter;
-
-@Getter
-public class ReuploadKeyCallbackDTO extends ResourceSysBaseDTO<ReuploadKeyCallbackDTO> {
-
-	@JsonProperty
-	private ResourceData resource;
-
-	@JsonProperty("resource_id")
-	private String resourceId;
-
-	@JsonProperty
-	private String id;
-
-
-	public ReuploadKeyCallbackDTO withResource(ResourceData resource) {
-		this.resource = resource;
-		return this;
-	}
-
-	public ReuploadKeyCallbackDTO withId(String id) {
-		this.id = id;
-		return this;
-	}
-
-	public ReuploadKeyCallbackDTO withResourceId(String resourceId) {
-		this.resourceId = resourceId;
-		return this;
-	}
-
-	@Override
-	public MoreObjects.ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("resource", resource)
-				.add("resource_id", resourceId)
-				.add("id", id);
-	}
-}
-
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyDTO.java
deleted file mode 100644
index 7fd4e04..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyDTO.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.reuploadkey;
-
-import com.epam.dlab.dto.ResourceSysBaseDTO;
-import com.epam.dlab.model.ResourceData;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Getter;
-
-import java.util.List;
-
-@Getter
-public class ReuploadKeyDTO extends ResourceSysBaseDTO<ReuploadKeyDTO> {
-
-	@JsonProperty
-	private String content;
-
-	@JsonProperty
-	private List<ResourceData> resources;
-
-	@JsonProperty
-	private String id;
-
-
-	public ReuploadKeyDTO withContent(String content){
-		this.content = content;
-		return this;
-	}
-
-	public ReuploadKeyDTO withResources(List<ResourceData> resources) {
-		this.resources = resources;
-		return this;
-	}
-
-	public ReuploadKeyDTO withId(String id){
-		this.id = id;
-		return this;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyStatus.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyStatus.java
deleted file mode 100644
index 49203ba..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyStatus.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.dto.reuploadkey;
-
-import java.util.Arrays;
-
-public enum ReuploadKeyStatus {
-
-	COMPLETED("N/A"), FAILED("N/A");
-
-	private String message;
-
-	ReuploadKeyStatus(String message) {
-		this.message = message;
-	}
-
-	public ReuploadKeyStatus withErrorMessage(String message) {
-		this.message = message;
-		return this;
-	}
-
-	public String message() {
-		return message;
-	}
-
-	public static ReuploadKeyStatus fromValue(String value) {
-		return Arrays.stream(values())
-				.filter(v -> v.name().equalsIgnoreCase(value))
-				.findAny()
-				.orElseThrow(() ->
-						new IllegalArgumentException("Wrong value for ReuploadKeyStatus: " + value));
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyStatusDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyStatusDTO.java
deleted file mode 100644
index 72a790a..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/reuploadkey/ReuploadKeyStatusDTO.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.dto.reuploadkey;
-
-import com.epam.dlab.dto.StatusBaseDTO;
-import com.google.common.base.MoreObjects;
-import lombok.Getter;
-
-@Getter
-public class ReuploadKeyStatusDTO extends StatusBaseDTO<ReuploadKeyStatusDTO> {
-
-	private ReuploadKeyCallbackDTO reuploadKeyCallbackDTO;
-	private ReuploadKeyStatus reuploadKeyStatus;
-
-
-	public ReuploadKeyStatusDTO withReuploadKeyCallbackDto(ReuploadKeyCallbackDTO reuploadKeyCallbackDTO) {
-		this.reuploadKeyCallbackDTO = reuploadKeyCallbackDTO;
-		return this;
-	}
-
-	public ReuploadKeyStatusDTO withReuploadKeyStatus(ReuploadKeyStatus status) {
-		this.reuploadKeyStatus = status;
-		return this;
-	}
-
-	@Override
-	public MoreObjects.ToStringHelper toStringHelper(Object self) {
-		return super.toStringHelper(self)
-				.add("reuploadKeyStatus", reuploadKeyStatus)
-				.add("reuploadKeyCallbackDTO", reuploadKeyCallbackDTO);
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/status/EnvResource.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/status/EnvResource.java
deleted file mode 100644
index 808581f..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/status/EnvResource.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.status;
-
-import com.epam.dlab.model.ResourceType;
-import com.epam.dlab.util.mongo.IsoLocalDateTimeDeSerializer;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDateTime;
-
-/**
- * Describe the resource (host, cluster, storage) for check status in Cloud.
- */
-@NoArgsConstructor
-public class EnvResource {
-	@JsonProperty
-	private String id;
-	@JsonProperty
-	private String status;
-	@JsonProperty
-	private String name;
-	@JsonProperty
-	private ResourceType resourceType;
-	@JsonProperty("project_name")
-	private String project;
-	@JsonProperty("endpoint_name")
-	private String endpoint;
-	@JsonDeserialize(using = IsoLocalDateTimeDeSerializer.class)
-	@JsonProperty
-	private LocalDateTime lastActivity;
-
-	public EnvResource(String id, String name, ResourceType resourceType, String project, String endpoint) {
-		this.id = id;
-		this.name = name;
-		this.resourceType = resourceType;
-		this.project = project;
-		this.endpoint = endpoint;
-	}
-
-	/**
-	 * Return the id of resource. instanceId for host, clusterId for cluster, path for storage.
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * Set the id of resource. instanceId for host, clusterId for cluster, path for storage.
-	 */
-	public void setId(String id) {
-		this.id = id;
-	}
-
-	/**
-	 * Set the id of resource. instanceId for host, clusterId for cluster, path for storage.
-	 */
-	public EnvResource withId(String id) {
-		setId(id);
-		return this;
-	}
-
-	/**
-	 * Return the status of resource.
-	 */
-	public String getStatus() {
-		return status;
-	}
-
-	/**
-	 * Set the status of resource.
-	 */
-	public void setStatus(String status) {
-		this.status = status;
-	}
-
-	/**
-	 * Set the status of resource.
-	 */
-	public EnvResource withStatus(String status) {
-		setStatus(status);
-		return this;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public ResourceType getResourceType() {
-		return resourceType;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public EnvResource withName(String name) {
-		setName(name);
-		return this;
-	}
-
-	public EnvResource withResourceType(ResourceType resourceType) {
-		setResourceType(resourceType);
-		return this;
-	}
-
-	public void setResourceType(ResourceType resourceType) {
-		this.resourceType = resourceType;
-	}
-
-	public LocalDateTime getLastActivity() {
-		return lastActivity;
-	}
-
-	public void setLastActivity(LocalDateTime lastActivity) {
-		this.lastActivity = lastActivity;
-	}
-
-	public EnvResource withLastActivity(LocalDateTime lastActivity) {
-		setLastActivity(lastActivity);
-		return this;
-	}
-
-	public String getEndpoint() {
-		return endpoint;
-	}
-
-	public ToStringHelper toStringHelper(Object self) {
-		return MoreObjects.toStringHelper(self)
-				.add("id", id)
-				.add("status", status)
-				.add("name", name)
-				.add("resourceType", resourceType)
-				.add("lastActivity", lastActivity);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/status/EnvResourceList.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/status/EnvResourceList.java
deleted file mode 100644
index 1deb175..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/status/EnvResourceList.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.status;
-
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-/** Describe the lists of resources (host, cluster, storage) for check status in Cloud.
- */
-public class EnvResourceList {
-    @JsonProperty("host")
-    private List<EnvResource> hostList;
-    @JsonProperty("cluster")
-    private List<EnvResource> clusterList;
-
-    /** Return the list of hosts. */
-    public List<EnvResource> getHostList() {
-        return hostList;
-    }
-
-    /** Set the list of hosts. */
-    public void setHostList(List<EnvResource> hostList) {
-        this.hostList = hostList;
-    }
-
-    /** Set the list of hosts. */
-    public EnvResourceList withHostList(List<EnvResource> hostList) {
-        setHostList(hostList);
-        return this;
-    }
-
-    /** Return the list of clusters. */
-    public List<EnvResource> getClusterList() {
-        return clusterList;
-    }
-
-    /** Set the list of clusters. */
-    public void setClusterList(List<EnvResource> clusterList) {
-        this.clusterList = clusterList;
-    }
-
-    /** Set the list of clusters. */
-    public EnvResourceList withClusterList(List<EnvResource> clusterList) {
-        setClusterList(clusterList);
-        return this;
-    }
-
-    public ToStringHelper toStringHelper(Object self) {
-    	return MoreObjects.toStringHelper(self)
-    	        .add("host", hostList)
-    	        .add("cluster", clusterList);
-    }
-    
-    @Override
-    public String toString() {
-    	return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/status/EnvStatusDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/status/EnvStatusDTO.java
deleted file mode 100644
index caf3cf3..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/status/EnvStatusDTO.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.status;
-
-import com.epam.dlab.dto.StatusBaseDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-/** Describe the lists of resources (host, cluster, storage) for check status in Cloud.
- */
-public class EnvStatusDTO extends StatusBaseDTO<EnvStatusDTO> {
-    @JsonProperty("edge_list_resources")
-    private EnvResourceList resourceList;
-    
-    /** Return the list of resources (hosts, clusters, storages). */
-    public EnvResourceList getResourceList() {
-        return resourceList;
-    }
-
-    /** Set the list of resources (hosts, clusters, storages). */
-    public void setResourceList(EnvResourceList resourceList) {
-        this.resourceList = resourceList;
-    }
-
-    /** Set the list of resources (hosts, clusters, storages). */
-	public EnvStatusDTO withResourceList(EnvResourceList resourceList) {
-        setResourceList(resourceList);
-        return this;
-    }
-
-    @Override
-    public ToStringHelper toStringHelper(Object self) {
-    	return super.toStringHelper(self)
-    	        .add("resourceList", resourceList);
-    }
-    
-    @Override
-    public String toString() {
-    	return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/ResourceData.java b/services/dlab-model/src/main/java/com/epam/dlab/model/ResourceData.java
deleted file mode 100644
index dc4526d..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/ResourceData.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.model;
-
-import lombok.AllArgsConstructor;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-
-@AllArgsConstructor
-@Getter
-@EqualsAndHashCode
-public class ResourceData {
-	private ResourceType resourceType;
-	private String resourceId;
-	private String exploratoryName;
-	private String computationalName;
-
-	public static ResourceData edgeResource(String resourceId) {
-		return new ResourceData(ResourceType.EDGE, resourceId, null, null);
-	}
-
-	public static ResourceData exploratoryResource(String resourceId, String exploratoryName) {
-		return new ResourceData(ResourceType.EXPLORATORY, resourceId, exploratoryName, null);
-	}
-
-	public static ResourceData computationalResource(String resourceId, String exploratoryName,
-													 String computationalName) {
-		return new ResourceData(ResourceType.COMPUTATIONAL, resourceId, exploratoryName, computationalName);
-	}
-
-	@Override
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		if (resourceType == ResourceType.EDGE) {
-			return sb.append(resourceType.toString()).toString();
-		} else if (resourceType == ResourceType.EXPLORATORY) {
-			return sb.append(resourceType.toString()).append(" ").append(exploratoryName).toString();
-		} else if (resourceType == ResourceType.COMPUTATIONAL) {
-			return sb.append(resourceType.toString()).append(" ").append(computationalName)
-					.append(" affiliated with exploratory ").append(exploratoryName).toString();
-		} else return "";
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/ResourceEnum.java b/services/dlab-model/src/main/java/com/epam/dlab/model/ResourceEnum.java
deleted file mode 100644
index 4ee7d2c..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/ResourceEnum.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.model;
-
-import com.fasterxml.jackson.annotation.JsonValue;
-
-public enum ResourceEnum {
-	EDGE_NODE("edge node"),
-	NOTEBOOK("notebook");
-
-	private String name;
-
-	ResourceEnum(String name) {
-		this.name = name;
-	}
-
-	@JsonValue
-	@Override
-	public String toString() {
-		return name;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/ResourceType.java b/services/dlab-model/src/main/java/com/epam/dlab/model/ResourceType.java
deleted file mode 100644
index 2baf91d..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/ResourceType.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.model;
-
-public enum ResourceType {
-	COMPUTATIONAL("computational_resource"),
-	EDGE("edge_node"),
-	EXPLORATORY("exploratory");
-
-	private String name;
-
-	ResourceType(String name) {
-		this.name = name;
-	}
-
-	@Override
-	public String toString() {
-		return name;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/aws/BillingResourceType.java b/services/dlab-model/src/main/java/com/epam/dlab/model/aws/BillingResourceType.java
deleted file mode 100644
index ce3803a..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/aws/BillingResourceType.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.model.aws;
-
-/** Billing resource types.
- */
-public enum BillingResourceType {
-	COMPUTER,
-	CLUSTER,
-	STORAGE,
-	STORAGE_EBS,
-	STORAGE_BUCKET,
-	IP_ADDRESS,
-	OTHER;
-	
-    public static BillingResourceType of(String string) {
-        if (string != null) {
-            for (BillingResourceType value : BillingResourceType.values()) {
-                if (string.equalsIgnoreCase(value.toString())) {
-                    return value;
-                }
-            }
-        }
-        return null;
-    }
-    
-    /** Return the category of resource.
-     * @param resourceType the type of resource.
-     */
-    public static String category(BillingResourceType resourceType) {
-    	switch (resourceType) {
-		case COMPUTER:
-			return "EC2";
-		case CLUSTER:
-			return "Compute";
-		case STORAGE:
-			return "Storage";
-		case STORAGE_EBS:
-			return "EBS";
-		case STORAGE_BUCKET:
-			return "S3";
-		case IP_ADDRESS:
-			return "Static";
-		default:
-			return "Other";
-		}
-	}
-    
-    /** Return the category of resource. */
-    public String category() {
-    	return category(this);
-    }
-
-    @Override
-    public String toString() {
-    	return super.toString().toUpperCase();
-    }
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/aws/ReportLine.java b/services/dlab-model/src/main/java/com/epam/dlab/model/aws/ReportLine.java
deleted file mode 100644
index 46c82f0..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/aws/ReportLine.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.model.aws;
-
-import com.epam.dlab.exceptions.ParseException;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import java.util.LinkedHashMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/** The line of billing report.
- */
-public class ReportLine {
-	public static final String FIELD_DLAB_ID = "dlab_id";
-	public static final String FIELD_USER_ID = "user";
-	public static final String FIELD_PROJECT = "project";
-	public static final String FIELD_USAGE_DATE = "usage_date";
-	public static final String FIELD_PRODUCT = "product";
-	public static final String FIELD_USAGE_TYPE = "usage_type";
-	public static final String FIELD_USAGE = "usage";
-	public static final String FIELD_COST = "cost";
-	public static final String FIELD_CURRENCY_CODE = "currency_code";
-	public static final String FIELD_RESOURCE_TYPE = "resource_type";
-	public static final String FIELD_RESOURCE_ID = "resource_id";
-	public static final String FIELD_TAGS = "tags";
-	
-	@JsonProperty
-	private String dlabId;
-	
-	@JsonProperty
-	private String user;
-
-	@JsonProperty
-	private String usageDate;
-
-	@JsonProperty
-	private String usageIntervalEnd;
-
-	@JsonProperty
-	private String product;
-
-	@JsonProperty
-	private String usageType;
-
-	@JsonProperty
-	private double usage;
-	
-	@JsonProperty
-	private double cost;
-	
-	@JsonProperty
-	private String currencyCode;
-
-	@JsonProperty
-	private BillingResourceType resourceType;
-
-	@JsonProperty
-	private String resourceId;
-
-	@JsonProperty
-	private LinkedHashMap<String, String> tags;
-
-	
-	public String getDlabId() {
-		return dlabId;
-	}
-
-	public void setDlabId(String dlabId) {
-		this.dlabId = dlabId;
-	}
-
-	public String getUser() {
-		return user;
-	}
-
-	public void setUser(String user) {
-		this.user = user;
-	}
-
-	public String getUsageDate() {
-		return usageDate;
-	}
-
-	public void setUsageDate(String usageDate) {
-		this.usageDate = usageDate;
-	}
-
-	public String getProduct() {
-		return product;
-	}
-
-	public void setProduct(String product) {
-		this.product = product;
-	}
-
-	public String getUsageType() {
-		return usageType;
-	}
-
-	public void setUsageType(String usageType) {
-		this.usageType = usageType;
-	}
-
-	public double getUsage() {
-		return usage;
-	}
-
-	public void setUsage(double usage) {
-		this.usage = usage;
-	}
-
-	public double getCost() {
-		return cost;
-	}
-
-	public void setCost(double cost) {
-		this.cost = cost;
-	}
-
-	public String getCurrencyCode() {
-		return currencyCode;
-	}
-
-	public void setCurrencyCode(String currencyCode) {
-		this.currencyCode = currencyCode;
-	}
-
-	public String getResourceId() {
-		return resourceId;
-	}
-
-	public BillingResourceType getResourceType() {
-		return resourceType;
-	}
-
-	public LinkedHashMap<String, String> getTags() {
-		return tags;
-	}
-
-	public void setTags(LinkedHashMap<String, String> tags) {
-		this.tags = tags;
-	}
-
-	
-	/** Patterns to calculate the type of resource in report line. */
-	private static final Pattern pInstancceId = Pattern.compile("^i-[a-z0-9]{17}$");
-	private static final Pattern pVolumeId = Pattern.compile("^vol-[a-z0-9]{17}$");
-	private static final Pattern pIpAddress = Pattern.compile("^[1-9][0-9]{0,2}\\.[1-9][0-9]{0,2}\\.[1-9][0-9]{0,2}\\.[1-9][0-9]{0,2}$");
-	private static final Pattern pClusterId = Pattern.compile("j-[A-Z0-9]{12,13}$");
-	
-	/** Calculate and set the type of resource and resource id.
-	 * @throws ParseException */
-	public void setResourceTypeId(String resourceTypeId) throws ParseException {
-		if (product == null) {
-			throw new ParseException("Property product is not set");
-		}
-		
-		if ("Amazon Elastic MapReduce".equals(product) ||
-				   "Amazon Simple Queue Service".equals(product)) {
-			resourceType = BillingResourceType.CLUSTER;
-			Matcher m = pClusterId.matcher(resourceTypeId);
-			resourceId = (m.find() ? m.group() : null);
-		} else {
-			if ("Amazon Elastic Compute Cloud".equals(product)) {
-				if (pInstancceId.matcher(resourceTypeId).find()) {
-					resourceType = BillingResourceType.COMPUTER;
-				} else if(pVolumeId.matcher(resourceTypeId).find()) {
-					resourceType = BillingResourceType.STORAGE_EBS;
-				} else if (pIpAddress.matcher(resourceTypeId).find()) {
-					resourceType = BillingResourceType.IP_ADDRESS;
-				} else {
-					resourceType = BillingResourceType.COMPUTER;
-				}
-			} else if ("Amazon Simple Storage Service".equals(product)) {
-				resourceType = BillingResourceType.STORAGE_BUCKET;
-			} else {
-				resourceType = BillingResourceType.OTHER;
-			}
-			resourceId = resourceTypeId;
-		}
-	}
-
-
-	/** Returns a string representation of the object.
-	 * @param self the object to generate the string for (typically this), used only for its class name.
-	 */
-	public ToStringHelper toStringHelper(Object self) {
-		return MoreObjects.toStringHelper(self)
-				.add(FIELD_DLAB_ID, dlabId)
-				.add(FIELD_USER_ID, user)
-				.add(FIELD_USAGE_DATE, usageDate)
-				.add(FIELD_PRODUCT, product)
-				.add(FIELD_USAGE_TYPE, usageType)
-				.add(FIELD_USAGE, usage)
-				.add(FIELD_COST, cost)
-				.add(FIELD_CURRENCY_CODE, currencyCode)
-				.add(FIELD_RESOURCE_TYPE, resourceType)
-				.add(FIELD_RESOURCE_ID, resourceId)
-				.add(FIELD_TAGS, tags);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this)
-				.toString();
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/exploratory/Exploratory.java b/services/dlab-model/src/main/java/com/epam/dlab/model/exploratory/Exploratory.java
deleted file mode 100644
index 4b67f70..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/exploratory/Exploratory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.model.exploratory;
-
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import lombok.Builder;
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-@Builder
-public class Exploratory {
-	private final String name;
-	private final String dockerImage;
-	private final String version;
-	private final String templateName;
-	private final String shape;
-	private final String imageName;
-	private final String endpoint;
-	private final String project;
-	private final String exploratoryTag;
-	private final List<ClusterConfig> clusterConfig;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/exploratory/Image.java b/services/dlab-model/src/main/java/com/epam/dlab/model/exploratory/Image.java
deleted file mode 100644
index c1a4f4a..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/exploratory/Image.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.model.exploratory;
-
-import com.epam.dlab.dto.exploratory.ImageStatus;
-import com.epam.dlab.model.library.Library;
-import lombok.Builder;
-import lombok.Data;
-
-import java.util.List;
-import java.util.Map;
-
-@Data
-@Builder
-public class Image {
-	private final String name;
-	private final String description;
-	private final ImageStatus status;
-	private final String exploratoryId;
-	private final String project;
-	private final String endpoint;
-	private final String user;
-	private final String fullName;
-	private final String externalName;
-	private final String application;
-	private final String dockerImage;
-	private final List<Library> libraries;
-	private final Map<String, List<Library>> computationalLibraries;
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/library/Library.java b/services/dlab-model/src/main/java/com/epam/dlab/model/library/Library.java
deleted file mode 100644
index 0ca4562..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/library/Library.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.model.library;
-
-import com.epam.dlab.dto.exploratory.LibStatus;
-import com.epam.dlab.model.ResourceType;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class Library {
-	private final String group;
-	private final String name;
-	private final String version;
-	private final LibStatus status;
-	@JsonProperty("error_message")
-	private final String errorMessage;
-	private String resourceName;
-	private ResourceType type;
-
-	public Library withType(ResourceType type) {
-		setType(type);
-		return this;
-	}
-
-	public Library withResourceName(String name) {
-		setResourceName(name);
-		return this;
-	}
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/scheduler/SchedulerJobData.java b/services/dlab-model/src/main/java/com/epam/dlab/model/scheduler/SchedulerJobData.java
deleted file mode 100644
index 222d684..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/scheduler/SchedulerJobData.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.model.scheduler;
-
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-@Data
-public class SchedulerJobData {
-
-	@JsonProperty
-	private final String user;
-
-	@JsonProperty("exploratory_name")
-	private final String exploratoryName;
-
-	@JsonProperty("computational_name")
-	private final String computationalName;
-
-    @JsonProperty
-    private final String project;
-
-	@JsonProperty("scheduler_data")
-	private final SchedulerJobDTO jobDTO;
-}
-
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/DiskInfo.java b/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/DiskInfo.java
deleted file mode 100644
index 0a8527b..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/DiskInfo.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.model.systeminfo;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Getter;
-
-@Builder
-@Getter
-public class DiskInfo {
-
-	@JsonProperty
-	private String serialNumber;
-	@JsonProperty
-	private long usedByteSpace;
-	@JsonProperty
-	private long totalByteSpace;
-
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/MemoryInfo.java b/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/MemoryInfo.java
deleted file mode 100644
index 1930386..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/MemoryInfo.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.model.systeminfo;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Getter;
-
-@Builder
-@Getter
-public class MemoryInfo {
-
-	@JsonProperty
-	private long availableMemory;
-	@JsonProperty
-	private long totalMemory;
-
-	private long swapTotal;
-	private long swapUsed;
-	private long pagesPageIn;
-	private long pagesPageOut;
-
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/OsInfo.java b/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/OsInfo.java
deleted file mode 100644
index 533605c..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/OsInfo.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.model.systeminfo;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Getter;
-
-@Builder
-@Getter
-public class OsInfo {
-
-	@JsonProperty
-	private String manufacturer;
-	@JsonProperty
-	private String family;
-	@JsonProperty
-	private String version;
-	@JsonProperty
-	private String buildNumber;
-
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/ProcessorInfo.java b/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/ProcessorInfo.java
deleted file mode 100644
index 735f814..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/model/systeminfo/ProcessorInfo.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.model.systeminfo;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Getter;
-
-@Builder
-@Getter
-public class ProcessorInfo {
-
-	private String model;
-	private String family;
-
-	@JsonProperty
-	private String name;
-
-	private String id;
-	private String vendor;
-	private int logicalCoreCount;
-	private int physicalCoreCount;
-	private boolean isCpu64Bit;
-
-	@JsonProperty
-	private double currentSystemLoad;
-	@JsonProperty
-	private double systemLoadAverage;
-
-}
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/util/CloudSettingsDeserializer.java b/services/dlab-model/src/main/java/com/epam/dlab/util/CloudSettingsDeserializer.java
deleted file mode 100644
index 86d7468..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/util/CloudSettingsDeserializer.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util;
-
-import com.epam.dlab.dto.aws.AwsCloudSettings;
-import com.epam.dlab.dto.azure.AzureCloudSettings;
-import com.epam.dlab.dto.base.CloudSettings;
-import com.epam.dlab.dto.gcp.GcpCloudSettings;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.JsonNode;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-@Slf4j
-public class CloudSettingsDeserializer extends JsonDeserializer<CloudSettings> {
-	@Override
-	public CloudSettings deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
-		JsonNode jsonNode = p.readValueAsTree();
-
-		Map<String, String> mapJson = new HashMap<>();
-		for (Iterator<String> it = jsonNode.fieldNames(); it.hasNext(); ) {
-			String s = it.next();
-			mapJson.put(s, jsonNode.get(s).textValue());
-		}
-
-		try {
-			return createFromMap(detectCloudSettings(mapJson), mapJson);
-		} catch (IllegalAccessException e) {
-			log.error("Cannot deserialize object due to {}", e.getMessage(), e);
-			throw new IllegalArgumentException("Cannot deserialize cloud settings " + mapJson);
-		}
-	}
-
-	private CloudSettings detectCloudSettings(Map<String, String> properties) {
-		for (Map.Entry<String, String> entry : properties.entrySet()) {
-			if (entry.getKey().startsWith("aws")) {
-				return new AwsCloudSettings();
-			} else if (entry.getKey().startsWith("azure")) {
-				return new AzureCloudSettings();
-			} else if (entry.getKey().startsWith("gcp")) {
-				return new GcpCloudSettings();
-			}
-		}
-		throw new IllegalArgumentException("Unknown properties " + properties);
-	}
-
-	private <T extends CloudSettings> T createFromMap(T settings, Map<String, String> map) throws
-			IllegalAccessException {
-		for (Field field : settings.getClass().getDeclaredFields()) {
-			if (field.getAnnotation(JsonProperty.class) != null) {
-				String value = map.get(field.getAnnotation(JsonProperty.class).value());
-				if (value != null) {
-					field.setAccessible(true);
-					field.set(settings, value);
-
-				}
-			}
-		}
-
-		return settings;
-	}
-
-}
\ No newline at end of file
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/util/JsonGenerator.java b/services/dlab-model/src/main/java/com/epam/dlab/util/JsonGenerator.java
deleted file mode 100644
index 366fed9..0000000
--- a/services/dlab-model/src/main/java/com/epam/dlab/util/JsonGenerator.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util;
-
-import com.epam.dlab.dto.ResourceBaseDTO;
-import com.epam.dlab.dto.base.CloudSettings;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonUnwrapped;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-public final class JsonGenerator {
-	private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
-			.setSerializationInclusion(JsonInclude.Include.NON_NULL)
-			.addMixIn(ResourceBaseDTO.class, CloudSettingsUnwrapping.class);
-
-	private JsonGenerator() {
-	}
-
-	public static String generateJson(ResourceBaseDTO<?> resourceBaseDTO) throws JsonProcessingException {
-		return generateJson(resourceBaseDTO, false);
-	}
-
-	private static String generateJson(ResourceBaseDTO<?> resourceBaseDTO, boolean pretty) throws
-            JsonProcessingException {
-		if (pretty) {
-			return OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(resourceBaseDTO);
-		} else {
-			return OBJECT_MAPPER.writeValueAsString(resourceBaseDTO);
-		}
-	}
-
-	private abstract static class CloudSettingsUnwrapping {
-		@JsonUnwrapped
-		private CloudSettings cloudSettings;
-	}
-}
diff --git a/services/dlab-model/src/test/java/com/epam/dlab/dto/status/EnvResourceDTOTest.java b/services/dlab-model/src/test/java/com/epam/dlab/dto/status/EnvResourceDTOTest.java
deleted file mode 100644
index 3017bb8..0000000
--- a/services/dlab-model/src/test/java/com/epam/dlab/dto/status/EnvResourceDTOTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.status;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.epam.dlab.dto.UserEnvironmentResources;
-import org.junit.Test;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-public class EnvResourceDTOTest {
-	
-	private static String getJsonString(Object object) throws JsonProcessingException {
-        ObjectMapper objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
-        return objectMapper.writeValueAsString(object);
-    }
-	
-	private static <T> T getJsonObject(String string, Class<T> objectType) throws IOException {
-        ObjectMapper objectMapper = new ObjectMapper();
-        return objectMapper.readValue(string, objectType);
-    }
-
-	@Test
-    public void serde() throws IOException {
-    	List<EnvResource> hosts1 = new ArrayList<EnvResource>();
-    	hosts1.add(new EnvResource().withId("1"));
-    	hosts1.add(new EnvResource().withId("2"));
-    	hosts1.add(new EnvResource().withId("3").withStatus("state3"));
-    	assertEquals(hosts1.get(0).getId(), "1");
-    	assertEquals(hosts1.get(2).getStatus(), "state3");
-    	
-    	List<EnvResource> clusters1 = new ArrayList<EnvResource>();
-    	clusters1.add(new EnvResource().withId("10"));
-    	clusters1.add(new EnvResource().withId("11"));
-    	assertEquals(clusters1.get(0).getId(), "10");
-    	
-    	EnvResourceList r1 = new EnvResourceList()
-    			.withHostList(hosts1).withClusterList(clusters1);
-    	assertEquals(r1.getHostList().get(1).getId(), "2");
-    	assertEquals(r1.getHostList().get(2).getId(), "3");
-    	assertEquals(r1.getClusterList().get(1).getId(), "11");
-    	
-    	UserEnvironmentResources rs1 = new UserEnvironmentResources()
-    			.withResourceList(r1);
-    	assertEquals(rs1.getResourceList().getHostList().get(0).getId(), "1");
-    	assertEquals(rs1.getResourceList().getClusterList().get(0).getId(), "10");
-    	
-    	String json1 = getJsonString(rs1);
-    	
-    	UserEnvironmentResources rs2 = getJsonObject(json1, UserEnvironmentResources.class);
-    	String json2 = getJsonString(rs2);
-    	assertEquals(rs1.getResourceList().getHostList().size(), rs2.getResourceList().getHostList().size());
-    	assertEquals(rs1.getResourceList().getClusterList().size(), rs2.getResourceList().getClusterList().size());
-    	
-    	assertEquals("Json SerDe error", json1, json2);
-    }
-}
diff --git a/services/dlab-model/src/test/java/com/epam/dlab/dto/status/EnvStatusDTOTest.java b/services/dlab-model/src/test/java/com/epam/dlab/dto/status/EnvStatusDTOTest.java
deleted file mode 100644
index c2e0ab6..0000000
--- a/services/dlab-model/src/test/java/com/epam/dlab/dto/status/EnvStatusDTOTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.dto.status;
-
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-public class EnvStatusDTOTest {
-
-	private static String getJsonString(Object object) throws JsonProcessingException {
-		ObjectMapper objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
-		return objectMapper.writeValueAsString(object);
-	}
-
-	private static <T> T getJsonObject(String string, Class<T> objectType) throws IOException {
-		ObjectMapper objectMapper = new ObjectMapper();
-		return objectMapper.readValue(string, objectType);
-	}
-
-	@Test
-	public void serde() throws IOException {
-		List<EnvResource> hosts1 = new ArrayList<EnvResource>();
-		hosts1.add(new EnvResource().withId("1"));
-		hosts1.add(new EnvResource().withId("2"));
-		hosts1.add(new EnvResource().withId("3").withStatus("state3"));
-		assertEquals(hosts1.get(0).getId(), "1");
-		assertEquals(hosts1.get(2).getStatus(), "state3");
-
-		List<EnvResource> clusters1 = new ArrayList<EnvResource>();
-		clusters1.add(new EnvResource().withId("10"));
-		clusters1.add(new EnvResource().withId("11"));
-		assertEquals(clusters1.get(0).getId(), "10");
-
-		EnvResourceList r1 = new EnvResourceList()
-				.withHostList(hosts1).withClusterList(clusters1);
-		assertEquals(r1.getHostList().get(1).getId(), "2");
-		assertEquals(r1.getHostList().get(2).getId(), "3");
-		assertEquals(r1.getClusterList().get(1).getId(), "11");
-
-		EnvStatusDTO rs1 = new EnvStatusDTO()
-				.withUser("user1")
-				.withUptime(new Date())
-				.withStatus(UserInstanceStatus.CREATED)
-				.withErrorMessage("errorMessage1")
-				.withResourceList(r1);
-		assertEquals(rs1.getResourceList().getHostList().get(0).getId(), "1");
-		assertEquals(rs1.getResourceList().getClusterList().get(0).getId(), "10");
-
-		String json1 = getJsonString(rs1);
-
-		EnvStatusDTO rs2 = getJsonObject(json1, EnvStatusDTO.class);
-		String json2 = getJsonString(rs2);
-		assertEquals(rs1.getUser(), rs2.getUser());
-		assertEquals(rs1.getUptime(), rs2.getUptime());
-		assertEquals(rs1.getStatus(), rs2.getStatus());
-		assertEquals(rs1.getErrorMessage(), rs2.getErrorMessage());
-		assertEquals(rs1.getResourceList().getHostList().size(), rs2.getResourceList().getHostList().size());
-		assertEquals(rs1.getResourceList().getClusterList().size(), rs2.getResourceList().getClusterList().size());
-
-		assertEquals("Json SerDe error", json1, json2);
-	}
-}
diff --git a/services/dlab-model/src/test/java/com/epam/dlab/util/JsonGeneratorTest.java b/services/dlab-model/src/test/java/com/epam/dlab/util/JsonGeneratorTest.java
deleted file mode 100644
index 55327ba..0000000
--- a/services/dlab-model/src/test/java/com/epam/dlab/util/JsonGeneratorTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.util;
-
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyDTO;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class JsonGeneratorTest {
-
-	@Test
-	public void generateJsonTest() throws JsonProcessingException {
-		ReuploadKeyDTO dto = new ReuploadKeyDTO();
-		dto.withContent("someContent").withId("someId").withEdgeUserName("edgeUserName").withServiceBaseName("SBN");
-		String actual = JsonGenerator.generateJson(dto);
-		String expected = "{\"@class\":\"com.epam.dlab.dto.reuploadkey.ReuploadKeyDTO\",\"content\":\"someContent\"," +
-				"\"id\":\"someId\",\"edge_user_name\":\"edgeUserName\",\"conf_service_base_name\":\"SBN\"}";
-		Assert.assertEquals(expected, actual);
-	}
-}
diff --git a/services/dlab-mongo-migration/pom.xml b/services/dlab-mongo-migration/pom.xml
deleted file mode 100644
index 1f7b38f..0000000
--- a/services/dlab-mongo-migration/pom.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.epam.dlab</groupId>
-        <artifactId>dlab</artifactId>
-        <version>1.0</version>
-        <relativePath>../../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>dlab-mongo-migration</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>com.github.mongobee</groupId>
-            <artifactId>mongobee</artifactId>
-            <version>0.13</version>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/DbMigration.java b/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/DbMigration.java
deleted file mode 100644
index 492b2a7..0000000
--- a/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/DbMigration.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.migration;
-
-@FunctionalInterface
-public interface DbMigration {
-
-	void migrate();
-}
diff --git a/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/exception/DlabDbMigrationException.java b/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/exception/DlabDbMigrationException.java
deleted file mode 100644
index 75034df..0000000
--- a/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/exception/DlabDbMigrationException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.migration.exception;
-
-public class DlabDbMigrationException extends RuntimeException {
-
-	public DlabDbMigrationException(String message, Throwable cause) {
-		super(message, cause);
-	}
-}
diff --git a/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/mongo/DlabMongoMigration.java b/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/mongo/DlabMongoMigration.java
deleted file mode 100644
index 36c6288..0000000
--- a/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/mongo/DlabMongoMigration.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.migration.mongo;
-
-import com.epam.dlab.migration.DbMigration;
-import com.epam.dlab.migration.exception.DlabDbMigrationException;
-import com.epam.dlab.migration.mongo.changelog.DlabChangeLog;
-import com.github.mongobee.Mongobee;
-import com.github.mongobee.exception.MongobeeException;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class DlabMongoMigration implements DbMigration {
-	private static final String MONGODB_URI_FORMAT = "mongodb://%s:%s@%s:%d/%s";
-	private final Mongobee runner;
-
-	public DlabMongoMigration(String host, int port, String user, String password, String db) {
-		runner = new Mongobee(String.format(MONGODB_URI_FORMAT, user, password, host, port, db));
-		runner.setDbName(db);
-		runner.setChangeLogsScanPackage(DlabChangeLog.class.getPackage().getName());
-	}
-
-	public void migrate() {
-		try {
-			runner.execute();
-		} catch (MongobeeException e) {
-			log.error("Mongo db migration failed: {}", e.getMessage());
-			throw new DlabDbMigrationException("Mongo db migration failed", e);
-		}
-	}
-}
diff --git a/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/mongo/changelog/DlabChangeLog.java b/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/mongo/changelog/DlabChangeLog.java
deleted file mode 100644
index c718378..0000000
--- a/services/dlab-mongo-migration/src/main/java/com/epam/dlab/migration/mongo/changelog/DlabChangeLog.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.migration.mongo.changelog;
-
-import com.github.mongobee.changeset.ChangeLog;
-import com.github.mongobee.changeset.ChangeSet;
-import com.mongodb.BasicDBObject;
-import com.mongodb.DB;
-import com.mongodb.DBCollection;
-import com.mongodb.DBObject;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.StreamSupport;
-
-@ChangeLog
-@Slf4j
-public class DlabChangeLog {
-
-	public static final String ID = "_id";
-
-	@ChangeSet(order = "001", id = "001", author = "bhliva")
-	public void migrateSchedulerFields(DB db) {
-		log.info("Replacing field days_repeat with start_days_repeat and stop_days_repeat");
-		final DBCollection userInstances = db.getCollection("userInstances");
-
-		StreamSupport.stream(userInstances.find().spliterator(), false)
-				.forEach(dbObject -> updateSchedulerFieldsForExploratory(userInstances, dbObject));
-		log.info("Replacing scheduler field days_repeat finished successfully");
-	}
-
-	@SuppressWarnings("unchecked")
-	private void updateSchedulerFieldsForExploratory(DBCollection userInstances, DBObject dbObject) {
-		updateSchedulerFields(dbObject);
-		Optional.ofNullable(dbObject.get("computational_resources")).map(cr -> (List<DBObject>) cr)
-				.ifPresent(computationalResources -> computationalResources.forEach(this::updateSchedulerFields));
-		userInstances.update(new BasicDBObject(ID, dbObject.get(ID)), dbObject);
-	}
-
-	private void updateSchedulerFields(DBObject dbObject) {
-		final Object schedulerData = dbObject.get("scheduler_data");
-		if (schedulerData != null) {
-			final Object daysRepeat = ((DBObject) schedulerData).removeField("days_repeat");
-			((DBObject) schedulerData).put("start_days_repeat", daysRepeat);
-			((DBObject) schedulerData).put("stop_days_repeat", daysRepeat);
-		}
-	}
-}
diff --git a/services/dlab-utils/pom.xml b/services/dlab-utils/pom.xml
deleted file mode 100644
index d79a326..0000000
--- a/services/dlab-utils/pom.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>dlab</artifactId>
-        <groupId>com.epam.dlab</groupId>
-        <version>1.0</version>
-        <relativePath>../../pom.xml</relativePath>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>dlab-utils</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.dropwizard</groupId>
-            <artifactId>dropwizard-jackson</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <version>${org.mockito.version}</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/FileUtils.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/FileUtils.java
deleted file mode 100644
index f48a5af..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/FileUtils.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util;
-
-import com.epam.dlab.exceptions.DlabException;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-
-@Slf4j
-public class FileUtils {
-
-	private FileUtils() {
-	}
-
-	public static void saveToFile(String filename, String directory, String content) throws IOException {
-		java.nio.file.Path filePath = Paths.get(directory, filename).toAbsolutePath();
-		log.debug("Saving content to {}", filePath.toString());
-		try {
-			com.google.common.io.Files.createParentDirs(new File(filePath.toString()));
-		} catch (IOException e) {
-			throw new DlabException("Can't create folder " + filePath + ": " + e.getLocalizedMessage(), e);
-		}
-		Files.write(filePath, content.getBytes());
-	}
-
-	public static void deleteFile(String filename, String directory) throws IOException {
-		java.nio.file.Path filePath = Paths.get(directory, filename).toAbsolutePath();
-		log.debug("Deleting file from {}", filePath.toString());
-		Files.deleteIfExists(filePath);
-	}
-
-	public static void deleteFile(String absolutePath) {
-		log.debug("Deleting file from {}", absolutePath);
-		try {
-			Files.deleteIfExists(Paths.get(absolutePath));
-		} catch (IOException e) {
-			log.error("Problems occured with deleting file {} due to: {}", absolutePath, e.getLocalizedMessage());
-		}
-	}
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/SecurityUtils.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/SecurityUtils.java
deleted file mode 100644
index 03c2760..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/SecurityUtils.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.util;
-
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-public class SecurityUtils {
-
-	private static final String PASS_REGEX = "\"password\":\".+?\"";
-	private static final String PASS_REPLACEMENT = "\"password\":\"\\*\\*\\*\"";
-
-	private SecurityUtils() {
-	}
-
-	public static String hideCreds(String... strings) {
-		return Stream.of(strings)
-				.map(str -> str.replaceAll(PASS_REGEX, PASS_REPLACEMENT))
-				.collect(Collectors.joining(" "));
-	}
-
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/ServiceUtils.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/ServiceUtils.java
deleted file mode 100644
index 5a2beeb..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/ServiceUtils.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util;
-
-import com.epam.dlab.exceptions.DlabException;
-
-import java.io.IOException;
-import java.net.JarURLConnection;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.jar.Attributes;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-
-public class ServiceUtils {
-
-	private static String includePath = null;
-	
-	static {
-        includePath = System.getenv("DLAB_CONF_DIR");
-        if ( includePath == null || includePath.isEmpty() ) {
-        	includePath = getUserDir();
-        }
-	}
-	
-	/* Return working directory.
-	 */
-	public static String getUserDir() {
-		return System.getProperty("user.dir");
-	}
-	
-	/** Return path to DLab configuration directory.
-	 * @return
-	 */
-	public static String getConfPath() {
-        return includePath;
-	}
-	
-	
-	/** Return manifest for given class or empty manifest if {@link JarFile#MANIFEST_NAME} not found.
-	 * @param clazz class.
-	 * @throws IOException
-	 */
-	private static Manifest getManifestForClass(Class<?> clazz) throws IOException {
-		URL url = clazz.getClassLoader().getResource(JarFile.MANIFEST_NAME);
-		return (url == null ? new Manifest() : new Manifest(url.openStream()));
-	}
-
-	/** Return manifest from JAR file.
-	 * @param classPath path to class in JAR file.
-	 * @throws IOException
-	 */
-	private static Manifest getManifestFromJar(String classPath) throws IOException {
-		URL url = new URL(classPath);
-		JarURLConnection jarConnection = (JarURLConnection) url.openConnection();
-		return jarConnection.getManifest();
-	}
-	
-	/** Return manifest map for given class or empty map if manifest not found or cannot be read.
-	 * @param clazz class.
-	 */
-	public static Map<String, String> getManifest(Class<?> clazz) {
-		String className = "/" + clazz.getName().replace('.', '/') + ".class";
-		String classPath = clazz.getResource(className).toString();
-
-		Map<String, String> map = new HashMap<>();
-		try {
-			Manifest manifest = (classPath.startsWith("jar:file:") ? getManifestFromJar(classPath) : getManifestForClass(clazz));
-			Attributes attributes = manifest.getMainAttributes();
-			for (Object key : attributes.keySet()) {
-				map.put(key.toString(), (String) attributes.get(key));
-			}
-		} catch (IOException e) {
-			System.err.println("Cannot found or open manifest for class " + className);
-			throw new DlabException("Cannot read manifest file", e);
-		}
-		
-		return map;
-	}
-	
-	/** Print to standard output the manifest info about application. If parameter <b>args</b> is not
-	 * <b>null</b> and one or more arguments have value -v or --version then print version and return <b>true<b/>
-	 * otherwise <b>false</b>.
-	 * @param mainClass the main class of application.
-	 * @param args the arguments of main class function or null.
-	 * @return if parameter <b>args</b> is not null and one or more arguments have value -v or --version
-	 * then return <b>true<b/> otherwise <b>false</b>.
-	 */
-	public static boolean printAppVersion(Class<?> mainClass, String ... args) {
-		boolean result = false;
-		if (args != null) {
-			for (String arg : args) {
-	            if (arg.equals("-v") ||
-	            	arg.equals("--version")) {
-	            	result = true;
-	            }
-	        }
-			if (!result) {
-				return result;
-			}
-		}
-		
-		Map<String, String> manifest = getManifest(mainClass);
-		if (manifest.isEmpty()) {
-			return result;
-		}
-		
-		System.out.println("Title       " + manifest.get("Implementation-Title"));
-		System.out.println("Version     " + manifest.get("Implementation-Version"));
-		System.out.println("Created By  " + manifest.get("Created-By"));
-		System.out.println("Vendor      " + manifest.get("Implementation-Vendor"));
-		System.out.println("GIT-Branch  " + manifest.get("GIT-Branch"));
-		System.out.println("GIT-Commit  " + manifest.get("GIT-Commit"));
-		System.out.println("Build JDK   " + manifest.get("Build-Jdk"));
-		System.out.println("Build OS    " + manifest.get("Build-OS"));
-		System.out.println("Built Time  " + manifest.get("Build-Time"));
-		System.out.println("Built By    " + manifest.get("Built-By"));
-		
-		return result;
-	}
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/UsernameUtils.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/UsernameUtils.java
deleted file mode 100644
index 32488a4..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/UsernameUtils.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util;
-
-public class UsernameUtils {
-
-	private static final String UNDERLINE = "_";
-
-	public static String removeDomain(String username) {
-		return username.replaceAll("@.*", "");
-	}
-
-	public static String replaceWhitespaces(String username) {
-		return username.replaceAll("\\s", UNDERLINE);
-	}
-
-	private UsernameUtils() {
-	}
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoDateDeSerializer.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoDateDeSerializer.java
deleted file mode 100644
index 1a337ea..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoDateDeSerializer.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.ObjectCodec;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * Deserializes {@link java.util.Date} from JSON
- */
-public class IsoDateDeSerializer extends JsonDeserializer<Date> {
-    static final String DATE_NODE = "$date";
-    static final String ISO_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
-
-    @Override
-    public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
-        ObjectCodec oc = jsonParser.getCodec();
-        JsonNode node = oc.readTree(jsonParser);
-
-        Date date;
-        if (node.get(DATE_NODE) != null) {
-            String dateValue = node.get(DATE_NODE).asText();
-            DateFormat df = new SimpleDateFormat(ISO_DATE_FORMAT);
-            try {
-                date = df.parse(dateValue);
-            } catch (ParseException e) {
-                date = new Date(Long.valueOf(dateValue));
-            }
-        } else {
-            date = new Date(node.asLong());
-        }
-        return date;
-    }
-
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoDateSerializer.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoDateSerializer.java
deleted file mode 100644
index 4ffee23..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoDateSerializer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.TimeZone;
-
-/**
- * Serializes the {@link java.util.Date} to JSON
- */
-public class IsoDateSerializer extends JsonSerializer<Date> {
-
-    @Override
-    public void serialize(Date date, JsonGenerator gen, SerializerProvider serializers) throws IOException {
-        DateFormat df = new SimpleDateFormat(IsoDateDeSerializer.ISO_DATE_FORMAT);
-        df.setTimeZone(TimeZone.getTimeZone("GMT"));
-        String dateValue = df.format(date);
-
-        gen.writeStartObject();
-        gen.writeFieldName(IsoDateDeSerializer.DATE_NODE);
-        gen.writeString(dateValue);
-        gen.writeEndObject();
-    }
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateDeSerializer.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateDeSerializer.java
deleted file mode 100644
index f6803cf..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateDeSerializer.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.ObjectCodec;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.io.IOException;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.ZoneOffset;
-
-import static com.epam.dlab.util.mongo.IsoDateDeSerializer.DATE_NODE;
-
-public class IsoLocalDateDeSerializer extends JsonDeserializer<LocalDate> {
-	@Override
-	public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
-		ObjectCodec oc = p.getCodec();
-		JsonNode node = oc.readTree(p);
-		if (node.get(DATE_NODE) != null) {
-			String dateValue = node.get(DATE_NODE).asText();
-			return Instant.ofEpochMilli(Long.valueOf(dateValue)).atZone(ZoneOffset.systemDefault()).toLocalDate();
-		} else {
-			return Instant.ofEpochMilli(node.asLong()).atZone(ZoneOffset.systemDefault()).toLocalDate();
-		}
-	}
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateSerializer.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateSerializer.java
deleted file mode 100644
index c5e428e..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateSerializer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-import java.io.IOException;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-
-public class IsoLocalDateSerializer extends JsonSerializer<LocalDate> {
-	@Override
-	public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
-		gen.writeStartObject();
-		gen.writeFieldName(IsoDateDeSerializer.DATE_NODE);
-		gen.writeString(value.format(DateTimeFormatter.ISO_DATE));
-		gen.writeEndObject();
-	}
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateTimeDeSerializer.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateTimeDeSerializer.java
deleted file mode 100644
index 0e271ed..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateTimeDeSerializer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.ObjectCodec;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.io.IOException;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
-
-import static com.epam.dlab.util.mongo.IsoDateDeSerializer.DATE_NODE;
-
-public class IsoLocalDateTimeDeSerializer extends JsonDeserializer<LocalDateTime> {
-
-	@Override
-	public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
-		ObjectCodec oc = p.getCodec();
-		JsonNode node = oc.readTree(p);
-		if (node.get(DATE_NODE) != null) {
-			String dateValue = node.get(DATE_NODE).asText();
-			return Instant.ofEpochMilli(Long.valueOf(dateValue)).atZone(ZoneOffset.systemDefault()).toLocalDateTime();
-		} else {
-			return Instant.ofEpochMilli(node.asLong()).atZone(ZoneOffset.systemDefault()).toLocalDateTime();
-		}
-	}
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateTimeSerializer.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateTimeSerializer.java
deleted file mode 100644
index 87e0608..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/IsoLocalDateTimeSerializer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-import java.io.IOException;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-
-public class IsoLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
-	@Override
-	public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
-		gen.writeStartObject();
-		gen.writeFieldName(IsoDateDeSerializer.DATE_NODE);
-		gen.writeString(value.format(DateTimeFormatter.ISO_DATE_TIME));
-		gen.writeEndObject();
-	}
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/LongDeSerializer.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/LongDeSerializer.java
deleted file mode 100644
index c7a5ee3..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/LongDeSerializer.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.ObjectCodec;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.io.IOException;
-
-public class LongDeSerializer extends JsonDeserializer<Long> {
-	private static final String NUMBER_NODE = "$numberLong";
-
-	@Override
-	public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
-		ObjectCodec oc = p.getCodec();
-		JsonNode node = oc.readTree(p);
-
-		final JsonNode numberNode = node.get(NUMBER_NODE);
-		if (numberNode != null) {
-			return numberNode.asLong();
-		} else {
-			return node.asLong();
-		}
-	}
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/MongoStringDeserializer.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/MongoStringDeserializer.java
deleted file mode 100644
index 4c1a37a..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/MongoStringDeserializer.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.KeyDeserializer;
-
-import static com.epam.dlab.util.mongo.MongoStringSerializaer.DOT_UNICODE;
-
-public class MongoStringDeserializer extends KeyDeserializer {
-
-	@Override
-	public Object deserializeKey(String key, DeserializationContext ctxt) {
-		return key.contains(DOT_UNICODE) ? key.replace(DOT_UNICODE, ".") : key;
-	}
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/MongoStringSerializaer.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/MongoStringSerializaer.java
deleted file mode 100644
index 5b9fdca..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/MongoStringSerializaer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-import java.io.IOException;
-
-public class MongoStringSerializaer extends JsonSerializer<String> {
-	public static final String DOT_UNICODE = "U+FF0E";
-
-	@Override
-	public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
-		if (value.contains(".")) {
-			gen.writeFieldName(value.replace(".", DOT_UNICODE));
-		} else {
-			gen.writeFieldName(value);
-		}
-	}
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/modules/IsoDateModule.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/modules/IsoDateModule.java
deleted file mode 100644
index 290f5ab..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/modules/IsoDateModule.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util.mongo.modules;
-
-import com.epam.dlab.util.mongo.*;
-import com.fasterxml.jackson.databind.module.SimpleModule;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.fasterxml.jackson.datatype.jsr310.deser.JSR310StringParsableDeserializer;
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
-
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.ZoneOffset;
-import java.util.Date;
-
-/**
- * Serialization/Deserialization modul for {@link java.util.Date} that uses {@link IsoDateDeSerializer} and
- * {@link IsoDateSerializer}
- */
-public class IsoDateModule extends SimpleModule {
-	private static final long serialVersionUID = -2103066255354028256L;
-
-	public IsoDateModule() {
-		super();
-		addSerializer(Date.class, new IsoDateSerializer());
-		addDeserializer(Date.class, new IsoDateDeSerializer());
-
-		addSerializer(LocalDate.class, new IsoLocalDateSerializer());
-		addDeserializer(LocalDate.class, new IsoLocalDateDeSerializer());
-
-		addSerializer(LocalTime.class, new ToStringSerializer(LocalTime.class));
-		addDeserializer(LocalTime.class, LocalTimeDeserializer.INSTANCE);
-
-		addSerializer(LocalDateTime.class, new IsoLocalDateTimeSerializer());
-		addDeserializer(LocalDateTime.class, new IsoLocalDateTimeDeSerializer());
-
-		addSerializer(ZoneOffset.class, new ToStringSerializer(ZoneOffset.class));
-		addDeserializer(ZoneOffset.class, JSR310StringParsableDeserializer.ZONE_OFFSET);
-
-	}
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/modules/JavaPrimitiveModule.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/modules/JavaPrimitiveModule.java
deleted file mode 100644
index 83011ff..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/modules/JavaPrimitiveModule.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.util.mongo.modules;
-
-import com.epam.dlab.util.mongo.LongDeSerializer;
-import com.fasterxml.jackson.databind.module.SimpleModule;
-
-public class JavaPrimitiveModule extends SimpleModule {
-
-	public JavaPrimitiveModule() {
-		addDeserializer(Long.class, new LongDeSerializer());
-	}
-
-}
diff --git a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/modules/MongoModule.java b/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/modules/MongoModule.java
deleted file mode 100644
index 2218b6f..0000000
--- a/services/dlab-utils/src/main/java/com/epam/dlab/util/mongo/modules/MongoModule.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.util.mongo.modules;
-
-import com.epam.dlab.util.mongo.MongoStringDeserializer;
-import com.epam.dlab.util.mongo.MongoStringSerializaer;
-import com.fasterxml.jackson.databind.module.SimpleModule;
-
-public class MongoModule extends SimpleModule {
-
-	public MongoModule() {
-		addKeySerializer(String.class, new MongoStringSerializaer());
-		addKeyDeserializer(String.class, new MongoStringDeserializer());
-	}
-}
diff --git a/services/dlab-utils/src/test/java/com/epam/dlab/util/SecurityUtilsTest.java b/services/dlab-utils/src/test/java/com/epam/dlab/util/SecurityUtilsTest.java
deleted file mode 100644
index b77429a..0000000
--- a/services/dlab-utils/src/test/java/com/epam/dlab/util/SecurityUtilsTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.util;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class SecurityUtilsTest {
-
-	@Test
-	public void hideCredsTest() {
-		String[] strings = {"bash", "-c", "\"edge_user_name\":\"edgeUserName\",\"conf_service_base_name\":\"SBN\", " +
-				"\"password\":\"12345\""};
-		String actual = SecurityUtils.hideCreds(strings);
-		String expected = "bash -c \"edge_user_name\":\"edgeUserName\",\"conf_service_base_name\":\"SBN\", " +
-				"\"password\":\"***\"";
-		Assert.assertEquals(expected, actual);
-	}
-}
diff --git a/services/dlab-utils/src/test/java/com/epam/dlab/util/mongo/IsoLocalDateTimeDeSerializerTest.java b/services/dlab-utils/src/test/java/com/epam/dlab/util/mongo/IsoLocalDateTimeDeSerializerTest.java
deleted file mode 100644
index 8d2d7af..0000000
--- a/services/dlab-utils/src/test/java/com/epam/dlab/util/mongo/IsoLocalDateTimeDeSerializerTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.ObjectCodec;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonNode;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.io.IOException;
-
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class IsoLocalDateTimeDeSerializerTest {
-
-	@Test
-	public void deserialize() throws IOException {
-		JsonParser jsonParser = mock(JsonParser.class);
-		DeserializationContext ctxt = mock(DeserializationContext.class);
-
-		ObjectCodec objectCodec = mock(ObjectCodec.class);
-		when(jsonParser.getCodec()).thenReturn(objectCodec);
-
-		JsonNode jsonNode = mock(JsonNode.class);
-		when(objectCodec.readTree(jsonParser)).thenReturn(jsonNode);
-
-		JsonNode jsonNode2 = mock(JsonNode.class);
-		when(jsonNode.get(anyString())).thenReturn(jsonNode2);
-		when(jsonNode2.asText()).thenReturn("1234567890");
-
-		new IsoLocalDateTimeDeSerializer().deserialize(jsonParser, ctxt);
-
-		verify(jsonParser).getCodec();
-		verify(objectCodec).readTree(jsonParser);
-		verify(jsonNode, times(2)).get("$date");
-		verify(jsonNode2).asText();
-		verify(jsonNode, never()).asLong();
-		verifyNoMoreInteractions(jsonParser, objectCodec, jsonNode, jsonNode2);
-	}
-
-	@Test
-	public void deserializeWhenMethodGetReturnsNull() throws IOException {
-		JsonParser jsonParser = mock(JsonParser.class);
-		DeserializationContext ctxt = mock(DeserializationContext.class);
-
-		ObjectCodec objectCodec = mock(ObjectCodec.class);
-		when(jsonParser.getCodec()).thenReturn(objectCodec);
-
-		JsonNode jsonNode = mock(JsonNode.class);
-		when(objectCodec.readTree(jsonParser)).thenReturn(jsonNode);
-
-		when(jsonNode.get(anyString())).thenReturn(null);
-
-		new IsoLocalDateTimeDeSerializer().deserialize(jsonParser, ctxt);
-
-		verify(jsonParser).getCodec();
-		verify(objectCodec).readTree(jsonParser);
-		verify(jsonNode).get("$date");
-		verify(jsonNode).asLong();
-		verifyNoMoreInteractions(jsonParser, objectCodec, jsonNode);
-	}
-}
\ No newline at end of file
diff --git a/services/dlab-utils/src/test/java/com/epam/dlab/util/mongo/IsoLocalDateTimeSerDeTest.java b/services/dlab-utils/src/test/java/com/epam/dlab/util/mongo/IsoLocalDateTimeSerDeTest.java
deleted file mode 100644
index 96a6e4c..0000000
--- a/services/dlab-utils/src/test/java/com/epam/dlab/util/mongo/IsoLocalDateTimeSerDeTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-
-import static org.junit.Assert.assertEquals;
-
-public class IsoLocalDateTimeSerDeTest {
-
-	private static ObjectMapper objectMapper;
-
-	@BeforeClass
-	public static void setup() {
-		objectMapper = new ObjectMapper();
-	}
-
-	@Test
-	public void shoudProperlySerializeLocalDateTimeToJson() throws JsonProcessingException {
-		String actual = objectMapper.writeValueAsString(new SampleClass());
-		assertEquals("{\"localDateTime\":{\"$date\":\"2018-04-10T15:30:45\"}}", actual);
-	}
-
-	@Test
-	public void shoudProperlyDeserializeLocalDateTimeFromJson() throws IOException {
-		LocalDateTime now = LocalDateTime.now();
-		long l = now.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
-		SampleClass actual = objectMapper
-				.readValue("{\"localDateTime\":{\"$date\":" + l + "}}", SampleClass.class);
-
-		assertEquals(now, actual.getLocalDateTime());
-	}
-
-	private static class SampleClass {
-
-		@JsonSerialize(using = IsoLocalDateTimeSerializer.class)
-		@JsonDeserialize(using = IsoLocalDateTimeDeSerializer.class)
-		private final LocalDateTime localDateTime = LocalDateTime.parse("2018-04-10T15:30:45");
-
-		LocalDateTime getLocalDateTime() {
-			return localDateTime;
-		}
-	}
-}
diff --git a/services/dlab-utils/src/test/java/com/epam/dlab/util/mongo/IsoLocalDateTimeSerializerTest.java b/services/dlab-utils/src/test/java/com/epam/dlab/util/mongo/IsoLocalDateTimeSerializerTest.java
deleted file mode 100644
index a588bb5..0000000
--- a/services/dlab-utils/src/test/java/com/epam/dlab/util/mongo/IsoLocalDateTimeSerializerTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.util.mongo;
-
-import com.fasterxml.jackson.databind.SerializerProvider;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.io.IOException;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class IsoLocalDateTimeSerializerTest {
-
-	@Test
-	public void serialize() throws IOException {
-		com.fasterxml.jackson.core.JsonGenerator jsonGenerator = mock(com.fasterxml.jackson.core.JsonGenerator.class);
-		SerializerProvider serializerProvider = mock(SerializerProvider.class);
-
-		LocalDateTime localDateTime = LocalDateTime.now();
-
-		new IsoLocalDateTimeSerializer().serialize(localDateTime, jsonGenerator, serializerProvider);
-
-		verify(jsonGenerator).writeStartObject();
-		verify(jsonGenerator).writeFieldName("$date");
-		verify(jsonGenerator).writeString(localDateTime.format(DateTimeFormatter.ISO_DATE_TIME));
-		verify(jsonGenerator).writeEndObject();
-		verifyNoMoreInteractions(jsonGenerator);
-		verifyZeroInteractions(serializerProvider);
-	}
-
-
-}
\ No newline at end of file
diff --git a/services/dlab-webapp-common/pom.xml b/services/dlab-webapp-common/pom.xml
deleted file mode 100644
index 6c846d6..0000000
--- a/services/dlab-webapp-common/pom.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>dlab</artifactId>
-        <groupId>com.epam.dlab</groupId>
-        <version>1.0</version>
-        <relativePath>../../pom.xml</relativePath>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>dlab-webapp-common</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.mongodb</groupId>
-            <artifactId>mongo-java-driver</artifactId>
-            <version>${org.mongodb.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.google.inject</groupId>
-            <artifactId>guice</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.dropwizard</groupId>
-            <artifactId>dropwizard-jackson</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>io.dropwizard</groupId>
-            <artifactId>dropwizard-auth</artifactId>
-            <version>${io.dropwizard.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.dropwizard</groupId>
-            <artifactId>dropwizard-client</artifactId>
-            <version>${io.dropwizard.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>common</artifactId>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/ModuleBase.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/ModuleBase.java
deleted file mode 100644
index 8aa9eb2..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/ModuleBase.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab;
-
-import com.google.inject.AbstractModule;
-
-import io.dropwizard.setup.Environment;
-
-/** The base class for an application configuration of service.
- */
-abstract public class ModuleBase<T extends ServiceConfiguration> extends AbstractModule {
-	/** Application configuration of service. */
-    protected T configuration;
-    /** Environment of service. */
-    protected Environment environment;
-
-    /** Instantiates an application configuration of service.
-     * @param configuration application configuration of service.
-     * @param environment environment of service.
-     */
-    public ModuleBase(T configuration, Environment environment) {
-        this.configuration = configuration;
-        this.environment = environment;
-    }
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/ServiceConfiguration.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/ServiceConfiguration.java
deleted file mode 100644
index 3297abd..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/ServiceConfiguration.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab;
-
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.mongo.MongoServiceFactory;
-import com.epam.dlab.rest.client.RESTServiceFactory;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.dropwizard.Configuration;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-
-public class ServiceConfiguration extends Configuration {
-
-    @JsonProperty
-    private long inactiveUserTimeoutMillSec = 2 * 60L * 60L * 1000L;
-
-    @NotNull
-    @JsonProperty
-    private CloudProvider cloudProvider;
-
-    @Valid
-    @JsonProperty
-    private boolean devMode = false;
-
-    @Valid
-    @NotNull
-    @JsonProperty(ServiceConsts.MONGO_NAME)
-    private MongoServiceFactory mongoFactory = new MongoServiceFactory();
-
-    @Valid
-    @NotNull
-    @JsonProperty(ServiceConsts.PROVISIONING_SERVICE_NAME)
-    private RESTServiceFactory provisioningFactory = new RESTServiceFactory();
-
-    @Valid
-    @NotNull
-    @JsonProperty(ServiceConsts.BILLING_SERVICE_NAME)
-    private RESTServiceFactory billingFactory = new RESTServiceFactory();
-
-    @Valid
-    @NotNull
-    @JsonProperty(ServiceConsts.SECURITY_SERVICE_NAME)
-    private RESTServiceFactory securityFactory;
-
-    @Valid
-    @NotNull
-    @JsonProperty(ServiceConsts.SELF_SERVICE_NAME)
-    private RESTServiceFactory selfFactory = new RESTServiceFactory();
-
-    public CloudProvider getCloudProvider() {
-        return cloudProvider;
-    }
-
-    public long getInactiveUserTimeoutMillSec() {
-        return inactiveUserTimeoutMillSec;
-    }
-
-    /**
-     * Returns <b>true</b> if service is a mock.
-     */
-    public boolean isDevMode() {
-        return devMode;
-    }
-
-    public MongoServiceFactory getMongoFactory() {
-        return mongoFactory;
-    }
-
-    public RESTServiceFactory getProvisioningFactory() {
-        return provisioningFactory;
-    }
-
-    public RESTServiceFactory getBillingFactory() {
-        return billingFactory;
-    }
-
-    public RESTServiceFactory getSecurityFactory() {
-        return securityFactory;
-    }
-
-    public RESTServiceFactory getSelfFactory() {
-        return selfFactory;
-    }
-
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/SecurityUnauthorizedHandler.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/SecurityUnauthorizedHandler.java
deleted file mode 100644
index 91df79f..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/SecurityUnauthorizedHandler.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.auth;
-
-import io.dropwizard.auth.UnauthorizedHandler;
-
-import javax.ws.rs.core.Response;
-
-public class SecurityUnauthorizedHandler implements UnauthorizedHandler {
-    @Override
-    public Response buildResponse(String prefix, String realm) {
-        return Response.status(Response.Status.UNAUTHORIZED).build();
-    }
-
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/UserInfo.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/UserInfo.java
deleted file mode 100644
index 5c6a74f..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/UserInfo.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.auth;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonSetter;
-
-import java.security.Principal;
-import java.util.*;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class UserInfo implements Principal {
-
-    private final String username;
-    private final String accessToken;
-    private String refreshToken;
-    private final Set<String> roles = new HashSet<>();
-    private final Map<String,String> keys = new HashMap<>();
-
-    @JsonProperty
-    private String firstName;
-    @JsonProperty
-    private String lastName;
-    @JsonProperty
-    private String remoteIp;
-    @JsonProperty
-    private boolean awsUser = false;
-
-    @JsonCreator
-    public UserInfo(@JsonProperty("username") String username,
-    				@JsonProperty("access_token") String accessToken) {
-        this.username = (username == null ? null : username.toLowerCase());
-        this.accessToken = accessToken;
-    }
-
-    @Override
-    @JsonProperty("username")
-    public String getName() {
-        return username;
-    }
-
-    public String getSimpleName() {
-        return (username == null ? null : username.replaceAll("@.*", ""));
-    }
-
-    @JsonProperty("access_token")
-    public String getAccessToken() {
-        return accessToken;
-    }
-
-    @JsonProperty("refresh_token")
-    public String getRefreshToken() {
-        return refreshToken;
-    }
-
-    public void setRefreshToken(String refreshToken) {
-        this.refreshToken = refreshToken;
-    }
-
-    @JsonProperty("roles")
-    public Set<String> getRoles() {
-        return roles;
-    }
-
-    //@JsonSetter("roles")
-    public void addRoles(Collection<String> r) {
-        roles.addAll(r);
-    }
-
-    @JsonSetter("roles")
-    public void addRoles(String[] r) {
-        roles.addAll(Arrays.asList(r));
-    }
-
-    public void addRole(String role) {
-        roles.add(role);
-    }
-
-
-    public String getFirstName() {
-        return firstName;
-    }
-
-    public void setFirstName(String firstName) {
-        this.firstName = firstName;
-    }
-
-    public String getLastName() {
-        return lastName;
-    }
-
-    public void setLastName(String lastName) {
-        this.lastName = lastName;
-    }
-
-    public String getRemoteIp() {
-		return remoteIp;
-	}
-
-	public void setRemoteIp(String remoteIp) {
-		this.remoteIp = remoteIp;
-	}
-
-	public UserInfo withToken(String token) {
-        UserInfo newInfo  = new UserInfo(username, token);
-        roles.forEach(newInfo::addRole);
-        newInfo.firstName = this.firstName;
-        newInfo.lastName  = this.lastName;
-        newInfo.remoteIp  = this.remoteIp;
-        newInfo.awsUser   = this.awsUser;
-        newInfo.setKeys(this.getKeys());
-        return newInfo;
-    }
-
-    public boolean isAwsUser() {
-        return awsUser;
-    }
-
-    public void setAwsUser(boolean awsUser) {
-        this.awsUser = awsUser;
-    }
-
-    public Map<String, String> getKeys() {
-        return keys;
-    }
-
-    public void addKey(String id, String status) {
-        keys.put(id,status);
-    }
-
-    @JsonSetter("keys")
-    public void setKeys(Map<String,String> awsKeys) {
-        awsKeys.forEach(keys::put);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        UserInfo userInfo = (UserInfo) o;
-
-        if (awsUser != userInfo.awsUser) return false;
-        if (username != null ? !username.equals(userInfo.username) : userInfo.username != null) return false;
-        if (accessToken != null ? !accessToken.equals(userInfo.accessToken) : userInfo.accessToken != null)
-            return false;
-        if (!roles.equals(userInfo.roles)) return false;
-        if (!keys.equals(userInfo.keys)) return false;
-        if (firstName != null ? !firstName.equals(userInfo.firstName) : userInfo.firstName != null) return false;
-        if (lastName != null ? !lastName.equals(userInfo.lastName) : userInfo.lastName != null) return false;
-        return remoteIp != null ? remoteIp.equals(userInfo.remoteIp) : userInfo.remoteIp == null;
-
-    }
-
-
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(username,
-                accessToken,
-                roles,
-                keys,
-                firstName,
-                lastName,
-                remoteIp,
-                awsUser);
-    }
-
-    @Override
-    public String toString() {
-        return "UserInfo{" +
-                "username='" + username + '\'' +
-                ", accessToken='" + accessToken + '\'' +
-                ", refreshToken='" + refreshToken + '\'' +
-                ", roles=" + roles +
-                ", keys=" + keys.keySet() +
-                ", firstName='" + firstName + '\'' +
-                ", lastName='" + lastName + '\'' +
-                ", remoteIp='" + remoteIp + '\'' +
-                ", awsUser=" + awsUser +
-                '}';
-    }
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/contract/SecurityAPI.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/contract/SecurityAPI.java
deleted file mode 100644
index 9ce14c3..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/contract/SecurityAPI.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.auth.contract;
-
-public interface SecurityAPI {
-	String LOGIN = "login";
-	String LOGIN_OAUTH = LOGIN + '/' + "oauth";
-	String LOGIN_OAUTH_AZURE = "user/azure/oauth";
-	String GET_USER_INFO = "getuserinfo";
-	String LOGOUT = "logout";
-	String INIT_LOGIN_OAUTH_AZURE = "/user/azure/init";
-	String INIT_LOGIN_OAUTH_GCP = "/user/gcp/init";
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/dto/UserCredentialDTO.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/dto/UserCredentialDTO.java
deleted file mode 100644
index 80f130f..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/dto/UserCredentialDTO.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.auth.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import org.hibernate.validator.constraints.NotBlank;
-
-public class UserCredentialDTO {
-    @NotBlank
-    @JsonProperty
-    private String username;
-
-    @NotBlank
-    @JsonProperty
-    private String password;
-
-    @JsonProperty("access_token")
-    private String accessToken;
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-    	this.username = (username == null ? null : username.toLowerCase());
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public String getAccessToken() {
-        return accessToken;
-    }
-
-    public void setAccessToken(String accessToken) {
-        this.accessToken = accessToken;
-    }
-
-    public ToStringHelper toStringHelper(Object self) {
-    	return MoreObjects.toStringHelper(self)
-    	        .add("username", username)
-    	        .add("password", password == null ? null : "***")
-    	        .add("accessToken", accessToken == null ? null : "***");
-    }
-    
-    @Override
-    public String toString() {
-    	return toStringHelper(this).toString();
-    }
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/oauth2/Oauth2AuthenticationService.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/oauth2/Oauth2AuthenticationService.java
deleted file mode 100644
index e998772..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/oauth2/Oauth2AuthenticationService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.auth.oauth2;
-
-public interface Oauth2AuthenticationService {
-
-	/**
-	 * @return redirected ulr
-	 */
-	String getRedirectedUrl();
-
-	/**
-	 * Authorize user using oauth authorization code
-	 *
-	 * @param code  authorization code
-	 * @param state state
-	 * @return token
-	 */
-	String authorize(String code, String state);
-
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/AbstractAuthenticationService.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/AbstractAuthenticationService.java
deleted file mode 100644
index 1ef65f7..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/AbstractAuthenticationService.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.auth.rest;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.auth.dto.UserCredentialDTO;
-import io.dropwizard.Configuration;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.Response;
-import java.util.UUID;
-
-public abstract class AbstractAuthenticationService<C extends Configuration> extends ConfigurableResource<C> {
-
-	public AbstractAuthenticationService(C config) {
-		super(config);
-	}
-
-	public static String getRandomToken() {
-		return UUID.randomUUID().toString();
-	}
-
-	public abstract Response login(UserCredentialDTO credential, HttpServletRequest request);
-
-	public abstract UserInfo getUserInfo(String accessToken, HttpServletRequest request);
-
-	public abstract Response logout(String accessToken);
-
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/ConfigurableResource.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/ConfigurableResource.java
deleted file mode 100644
index e7af37d..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/ConfigurableResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.auth.rest;
-
-import io.dropwizard.Configuration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class ConfigurableResource<C extends Configuration> {
-
-	protected final Logger log;
-	protected final C config;
-	
-	public ConfigurableResource(C config) {
-		this.log    = LoggerFactory.getLogger(getClass());
-		this.config = config;
-	}
-	
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/UserSessionDurationAuthorizer.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/UserSessionDurationAuthorizer.java
deleted file mode 100644
index 2f346e8..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/UserSessionDurationAuthorizer.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.auth.rest;
-
-import com.epam.dlab.auth.UserInfo;
-import io.dropwizard.auth.Authorizer;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Date;
-
-@Slf4j
-public final class UserSessionDurationAuthorizer implements Authorizer<UserInfo> {
-    public static final String SHORT_USER_SESSION_DURATION = "SHORT_USER_SESSION";
-    private final long maxSessionDurabilityMilliseconds;
-    private UserSessionDurationCallback callback;
-
-    public UserSessionDurationAuthorizer(UserSessionDurationCallback callback, long maxSessionDurabilityMilliseconds) {
-        this.callback = callback;
-        this.maxSessionDurabilityMilliseconds = maxSessionDurabilityMilliseconds;
-    }
-
-    @Override
-    public boolean authorize(UserInfo principal, String role) {
-        if (SHORT_USER_SESSION_DURATION.equalsIgnoreCase(role)) {
-            try {
-                String refreshToken = principal.getKeys().get("refresh_token");
-                String createdDateOfRefreshToken = principal.getKeys().get("created_date_of_refresh_token");
-
-                if (StringUtils.isEmpty(refreshToken)) {
-                    log.info("Refresh token is empty for user {}", principal.getName());
-                    return false;
-                }
-
-                if (StringUtils.isEmpty(createdDateOfRefreshToken)) {
-                    log.info("Created date for refresh token is empty for user {}", principal.getName());
-                    return false;
-                }
-
-                log.debug("refresh token requested {} and current date is {}",
-                        new Date(Long.valueOf(createdDateOfRefreshToken)), new Date());
-
-                long passedTime = System.currentTimeMillis() - Long.valueOf(createdDateOfRefreshToken);
-
-                log.info("Passed time of session for user {} is {} milliseconds", principal.getName(), passedTime);
-                if (passedTime > maxSessionDurabilityMilliseconds) {
-
-                    silentCallbackExecution(principal);
-
-                    log.info("Re-login required for user {}", principal.getName());
-                    return false;
-                }
-
-                return true;
-            } catch (RuntimeException e) {
-                log.error("Cannot verify durability of session for user {}", principal.getName(), e);
-                return false;
-            }
-
-        }
-
-        return true;
-    }
-
-    private void silentCallbackExecution(UserInfo principal) {
-        log.info("Log out expired user {}", principal.getName());
-        try {
-            callback.onSessionExpired(principal);
-        } catch (RuntimeException e) {
-            log.warn("Error during logout user {}", principal.getName(), e);
-        }
-    }
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/UserSessionDurationCallback.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/UserSessionDurationCallback.java
deleted file mode 100644
index 9f1cb28..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/auth/rest/UserSessionDurationCallback.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.auth.rest;
-
-import com.epam.dlab.auth.UserInfo;
-
-@FunctionalInterface
-public interface UserSessionDurationCallback {
-    void onSessionExpired(UserInfo userInfo);
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/cloud/CloudModule.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/cloud/CloudModule.java
deleted file mode 100644
index 806e7e0..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/cloud/CloudModule.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.cloud;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Injector;
-import io.dropwizard.setup.Environment;
-
-public abstract class CloudModule extends AbstractModule {
-
-    @Override
-    protected void configure() {
-    }
-
-    public abstract void init(Environment environment, Injector injector);
-
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/cloud/CloudProvider.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/cloud/CloudProvider.java
deleted file mode 100644
index f148e29..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/cloud/CloudProvider.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.cloud;
-
-public enum CloudProvider {
-    AWS, AZURE, GCP;
-
-    public String getName() {
-        return this.toString().toLowerCase();
-    }
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/constants/ServiceConsts.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/constants/ServiceConsts.java
deleted file mode 100644
index e1bcf23..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/constants/ServiceConsts.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.constants;
-
-public final class ServiceConsts {
-    public static final String MONGO_NAME = "mongo";
-    public static final String PROVISIONING_SERVICE_NAME = "provisioningService";
-    public static final String BILLING_SERVICE_NAME = "billingService";
-    public static final String MAVEN_SEARCH_API = "mavenSearchService";
-    public static final String SECURITY_SERVICE_NAME = "securityService";
-    public static final String SELF_SERVICE_NAME = "selfService";
-    public static final String PROVISIONING_USER_AGENT = "provisioning-service";
-
-    private ServiceConsts() {
-    }
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/mongo/MongoService.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/mongo/MongoService.java
deleted file mode 100644
index e232551..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/mongo/MongoService.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.mongo;
-
-import com.mongodb.MongoClient;
-import com.mongodb.WriteConcern;
-import com.mongodb.client.MongoCollection;
-import com.mongodb.client.MongoDatabase;
-import org.bson.Document;
-
-public class MongoService {
-    private MongoClient client;
-    private String databaseName;
-    private MongoDatabase database;
-
-    private static final Document PING = new Document("ping", "1");
-
-    public MongoService(MongoClient client,
-                        String databaseName,
-                        WriteConcern writeConcern) {
-        this(client, databaseName);
-        database = database.withWriteConcern(writeConcern);
-    }
-
-    public MongoService(MongoClient client, String databaseName) {
-        this.client = client;
-        this.databaseName = databaseName;
-        this.database = client.getDatabase(databaseName);
-    }
-
-    public boolean collectionExists(String name) {
-        for (String c : database.listCollectionNames()) {
-        	if (c.equals(name)) {
-        		return true;
-        	}
-        }
-        return false;
-    }
-
-    public MongoCollection<Document> getCollection(String name) {
-        return database.getCollection(name, Document.class);
-    }
-
-    public <T> MongoCollection<T> getCollection(String name, Class<T> c) {
-        return database.getCollection(name, c);
-    }
-
-    public void createCollection(String name) {
-        database.createCollection(name);
-    }
-    
-    public String getDatabaseName() {
-    	return databaseName;
-    }
-
-    public MongoClient getClient() {
-    	return client;
-    }
-    
-    public Document ping() {
-        return database.runCommand(PING);
-    }
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/mongo/MongoServiceFactory.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/mongo/MongoServiceFactory.java
deleted file mode 100644
index b0194df..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/mongo/MongoServiceFactory.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.mongo;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoCredential;
-import com.mongodb.ServerAddress;
-import io.dropwizard.lifecycle.Managed;
-import io.dropwizard.setup.Environment;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import java.util.Collections;
-
-// TODO: Separate configuration and factory responsibilities
-public class MongoServiceFactory {
-    @NotEmpty
-    @JsonProperty
-    private String host;
-
-    @Min(1)
-    @Max(65535)
-    @JsonProperty
-    private int port;
-
-    @NotEmpty
-    @JsonProperty
-    private String username;
-
-    @NotEmpty
-    @JsonProperty
-    private String password;
-
-    @NotEmpty
-    @JsonProperty
-    private String database;
-
-    public MongoService build(Environment environment) {
-        MongoClient client = new MongoClient(new ServerAddress(host, port), Collections.singletonList(
-                MongoCredential.createCredential(username, database, password.toCharArray())
-        ));
-        environment.lifecycle().manage(new Managed() {
-            @Override
-            public void start() {
-            }
-
-            @Override
-            public void stop() {
-                client.close();
-            }
-        });
-        return new MongoService(client, database);
-    }
-
-    public String getHost() {
-        return host;
-    }
-
-    public int getPort() {
-        return port;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public String getDatabase() {
-        return database;
-    }
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/client/RESTService.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/client/RESTService.java
deleted file mode 100644
index 5b4dbba..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/client/RESTService.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.client;
-
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.Invocation;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import java.net.URI;
-import java.util.Collections;
-import java.util.Map;
-
-@Slf4j
-public class RESTService {
-	private Client client;
-	private String url;
-	private String userAgent;
-
-	public RESTService() {
-	}
-
-	RESTService(Client client, String url, String userAgent) {
-		this.client = client;
-		this.url = url;
-		this.userAgent = userAgent;
-	}
-
-	RESTService(Client client, String userAgent) {
-		this.client = client;
-		this.userAgent = userAgent;
-	}
-
-	public <T> T get(String path, Class<T> clazz) {
-		return get(path, null, clazz);
-	}
-
-	public <T> T get(URI path, Class<T> clazz) {
-		log.debug("REST get {}", path);
-		return client.target(URI.create(url + path.toString()))
-				.request()
-				.get(clazz);
-	}
-
-	public <T> T get(String path, String accessToken, Class<T> clazz) {
-		Invocation.Builder builder = getBuilder(path, accessToken, Collections.emptyMap());
-		log.debug("REST get secured {} {}", path, accessToken);
-		return builder.get(clazz);
-	}
-
-	public <T> T get(String path, GenericType<T> genericType) {
-		return get(path, null, genericType);
-	}
-
-	public <T> T get(String path, String accessToken, GenericType<T> genericType) {
-		return get(path, accessToken, genericType, Collections.emptyMap());
-	}
-
-	public <T> T get(String path, String accessToken, GenericType<T> genericType, Map<String, Object> queryParams) {
-		Invocation.Builder builder = getBuilder(path, accessToken, queryParams);
-		log.debug("REST get secured {} {}", path, accessToken);
-		return builder.get(genericType);
-	}
-
-	public <T> T post(String path, Object parameter, Class<T> clazz) {
-		return post(path, null, parameter, clazz);
-	}
-
-	public <T> T post(String path, String accessToken, Object parameter, Class<T> clazz) {
-		return post(path, accessToken, parameter, clazz, Collections.emptyMap());
-	}
-
-	public <T> T post(String path, String accessToken, Object parameter, Class<T> clazz,
-					  Map<String, Object> queryParams) {
-		Invocation.Builder builder = getBuilder(path, accessToken, queryParams);
-		log.debug("REST post secured {} {}", path, accessToken);
-		return builder.post(Entity.json(parameter), clazz);
-	}
-
-
-	private Invocation.Builder getBuilder(String path, String token, Map<String, Object> queryParams) {
-		WebTarget webTarget = getWebTarget(path);
-		for (Map.Entry<String, Object> entry : queryParams.entrySet()) {
-			webTarget = webTarget.queryParam(entry.getKey(), entry.getValue());
-		}
-
-		Invocation.Builder builder = webTarget
-				.request(MediaType.APPLICATION_JSON)
-				.accept(MediaType.APPLICATION_JSON);
-
-		if (token != null) {
-			builder.header(HttpHeaders.AUTHORIZATION, "Bearer " + token);
-		}
-
-		if (userAgent != null) {
-			builder.header(HttpHeaders.USER_AGENT, userAgent);
-		}
-
-		return builder;
-	}
-
-	private WebTarget getWebTarget(String path) {
-		return url != null ?
-				client.target(url).path(path) : client.target(path);
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/client/RESTServiceFactory.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/client/RESTServiceFactory.java
deleted file mode 100644
index a7aa942..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/client/RESTServiceFactory.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.client;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.dropwizard.client.JerseyClientBuilder;
-import io.dropwizard.client.JerseyClientConfiguration;
-import io.dropwizard.setup.Environment;
-import org.apache.commons.lang3.StringUtils;
-
-import javax.validation.Valid;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.client.Client;
-
-public class RESTServiceFactory {
-	@JsonProperty
-	private String protocol;
-
-	@JsonProperty
-	private String host;
-
-	@JsonProperty
-	private int port;
-
-	@Valid
-	@NotNull
-	@JsonProperty("jerseyClient")
-	private JerseyClientConfiguration jerseyClientConfiguration;
-
-	public RESTService build(Environment environment, String name) {
-		return build(environment, name, null);
-	}
-
-	public RESTService build(Environment environment, String name, String userAgent) {
-		Client client = new JerseyClientBuilder(environment).using(jerseyClientConfiguration).build(name);
-		return StringUtils.isNotEmpty(host) ?
-				new RESTService(client, getURL(), userAgent) : new RESTService(client, userAgent);
-	}
-
-	private String getURL() {
-		return String.format("%s://%s:%d", protocol, host, port);
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ApiCallbacks.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ApiCallbacks.java
deleted file mode 100644
index a1dd121..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ApiCallbacks.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.contracts;
-
-public class ApiCallbacks {
-	public static final String API = "/api";
-	public static final String KEY_LOADER = API + "/user/access_key/callback";
-	public static final String INFRASTRUCTURE_PROVISION = API + "/infrastructure_provision";
-	public static final String COMPUTATIONAL = INFRASTRUCTURE_PROVISION + "/computational_resources";
-	public static final String EXPLORATORY = INFRASTRUCTURE_PROVISION + "/exploratory_environment";
-	public static final String LIBRARY = INFRASTRUCTURE_PROVISION + "/library";
-	public static final String UPDATE_LIBS_URI = LIBRARY + "/update_lib_list";
-	public static final String INFRASTRUCTURE = API + "/infrastructure";
-	public static final String EDGE = INFRASTRUCTURE + "/edge";
-	public static final String STATUS_URI = "/status";
-	public static final String LIB_STATUS_URI = LIBRARY + "/lib_status";
-	public static final String GIT_CREDS = API + "/user/git_creds" + STATUS_URI;
-	public static final String IMAGE = INFRASTRUCTURE_PROVISION + "/image";
-	public static final String IMAGE_STATUS_URI = IMAGE + "/image_status";
-	public static final String BACKUP_URI = API + "/infrastructure/backup" + STATUS_URI;
-	public static final String REUPLOAD_KEY_URI = API + "/infrastructure/reupload_key/callback";
-	public static final String CHECK_INACTIVITY_EXPLORATORY_URI = API + "/infrastructure/inactivity/callback/exploratory";
-	public static final String CHECK_INACTIVITY_COMPUTATIONAL_URI = API + "/infrastructure/inactivity/callback" +
-			"/computational";
-
-	private ApiCallbacks() {
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/BackupAPI.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/BackupAPI.java
deleted file mode 100644
index 8217089..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/BackupAPI.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.contracts;
-
-public class BackupAPI {
-	public static final String BACKUP = "backup";
-
-	private BackupAPI(){}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ComputationalAPI.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ComputationalAPI.java
deleted file mode 100644
index a909635..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ComputationalAPI.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.contracts;
-
-public interface ComputationalAPI {
-	String LIBRARY = "library/";
-	String COMPUTATIONAL = "computational";
-	String COMPUTATIONAL_CREATE = COMPUTATIONAL + "/create";
-	String COMPUTATIONAL_STOP = COMPUTATIONAL + "/stop";
-	String COMPUTATIONAL_START = COMPUTATIONAL + "/start";
-	String SPARK = "/spark";
-	String COMPUTATIONAL_CREATE_SPARK = COMPUTATIONAL_CREATE + SPARK;
-	String COMPUTATIONAL_RECONFIGURE_SPARK = COMPUTATIONAL + SPARK + "/reconfigure";
-	String COMPUTATIONAL_CREATE_CLOUD_SPECIFIC = COMPUTATIONAL_CREATE + "/cloud";
-	String COMPUTATIONAL_TERMINATE = COMPUTATIONAL + "/terminate";
-	String COMPUTATIONAL_TERMINATE_SPARK = COMPUTATIONAL_TERMINATE + SPARK;
-	String COMPUTATIONAL_STOP_SPARK = COMPUTATIONAL_STOP + SPARK;
-	String COMPUTATIONAL_START_SPARK = COMPUTATIONAL_START + SPARK;
-	String COMPUTATIONAL_TERMINATE_CLOUD_SPECIFIC = COMPUTATIONAL_TERMINATE + "/cloud";
-	String COMPUTATIONAL_LIB_INSTALL = LIBRARY + COMPUTATIONAL + "/lib_install";
-	String COMPUTATIONAL_LIB_LIST = LIBRARY + COMPUTATIONAL + "/lib_list";
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/DockerAPI.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/DockerAPI.java
deleted file mode 100644
index 4fe59a2..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/DockerAPI.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.contracts;
-
-public interface DockerAPI {
-    String DOCKER = "docker";
-    String DOCKER_RUN = DOCKER + "/run";
-    String DOCKER_EXPLORATORY = DOCKER + "/exploratory";
-    String DOCKER_COMPUTATIONAL = DOCKER + "/computational";
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/EdgeAPI.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/EdgeAPI.java
deleted file mode 100644
index 2fce5cc..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/EdgeAPI.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.contracts;
-
-public interface EdgeAPI {
-	String EDGE = "infrastructure/edge";
-	String EDGE_CREATE = EDGE + "/create";
-	String EDGE_START = EDGE + "/start";
-	String EDGE_STOP = EDGE + "/stop";
-	String EDGE_TERMINATE = EDGE + "/terminate";
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ExploratoryAPI.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ExploratoryAPI.java
deleted file mode 100644
index 0191a20..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/ExploratoryAPI.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.contracts;
-
-public interface ExploratoryAPI {
-    String LIBRARY = "library/";
-    String EXPLORATORY = "exploratory";
-    String EXPLORATORY_CREATE = EXPLORATORY + "/create";
-    String EXPLORATORY_RECONFIGURE_SPARK = EXPLORATORY + "/reconfigure_spark";
-    String EXPLORATORY_START = EXPLORATORY + "/start";
-    String EXPLORATORY_TERMINATE = EXPLORATORY + "/terminate";
-    String EXPLORATORY_STOP = EXPLORATORY + "/stop";
-    String EXPLORATORY_LIB_INSTALL = LIBRARY + EXPLORATORY + "/lib_install";
-    String EXPLORATORY_LIB_LIST = LIBRARY + EXPLORATORY + "/lib_list";
-    String EXPLORATORY_GIT_CREDS = EXPLORATORY + "/git_creds";
-    String EXPLORATORY_IMAGE = EXPLORATORY + "/image";
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/InfrasctructureAPI.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/InfrasctructureAPI.java
deleted file mode 100644
index 38bf959..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/InfrasctructureAPI.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.rest.contracts;
-
-public final class InfrasctructureAPI {
-	public static final String INFRASTRUCTURE = "infrastructure";
-	public static final String INFRASTRUCTURE_STATUS = INFRASTRUCTURE + "/status";
-	public static final String EXPLORATORY_CHECK_INACTIVITY = INFRASTRUCTURE + "/exploratory/check_inactivity";
-	public static final String COMPUTATIONAL_CHECK_INACTIVITY = INFRASTRUCTURE + "/computational/check_inactivity";
-
-	private InfrasctructureAPI() {
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/KeyAPI.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/KeyAPI.java
deleted file mode 100644
index d93d440..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/contracts/KeyAPI.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.contracts;
-
-public class KeyAPI {
-	public static final String REUPLOAD_KEY = "/key/reupload";
-	public static final String GET_ADMIN_KEY = "key";
-	public static final String KEY_EXTENTION = ".pub";
-
-	private KeyAPI() {
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/dto/ErrorDTO.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/dto/ErrorDTO.java
deleted file mode 100644
index c800c9b..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/dto/ErrorDTO.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-public class ErrorDTO {
-
-	@JsonProperty
-	private final int code;
-	@JsonProperty
-	private final String message;
-
-	public ErrorDTO(int code, String message) {
-		this.code = code;
-		this.message = message;
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/AuthenticationExceptionMapper.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/AuthenticationExceptionMapper.java
deleted file mode 100644
index db2bc61..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/AuthenticationExceptionMapper.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.mappers;
-
-import com.epam.dlab.exceptions.DlabAuthenticationException;
-import com.epam.dlab.rest.dto.ErrorDTO;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-
-public class AuthenticationExceptionMapper implements ExceptionMapper<DlabAuthenticationException> {
-	@Override
-	public Response toResponse(DlabAuthenticationException exception) {
-		final Response.Status unauthorized = Response.Status.UNAUTHORIZED;
-		return Response.status(unauthorized)
-				.entity(new ErrorDTO(unauthorized.getStatusCode(), exception.getMessage()))
-				.type(MediaType.APPLICATION_JSON)
-				.build();
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/DlabValidationExceptionMapper.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/DlabValidationExceptionMapper.java
deleted file mode 100644
index f3ce67f..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/DlabValidationExceptionMapper.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.mappers;
-
-import com.epam.dlab.exceptions.DlabValidationException;
-import com.epam.dlab.rest.dto.ErrorDTO;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-
-public class DlabValidationExceptionMapper implements ExceptionMapper<DlabValidationException> {
-	@Override
-	public Response toResponse(DlabValidationException exception) {
-		final Response.Status badRequest = Response.Status.BAD_REQUEST;
-		return Response.status(badRequest)
-				.entity(new ErrorDTO(badRequest.getStatusCode(), exception.getMessage()))
-				.type(MediaType.APPLICATION_JSON)
-				.build();
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/GenericExceptionMapper.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/GenericExceptionMapper.java
deleted file mode 100644
index bd12539..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/GenericExceptionMapper.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.mappers;
-
-import com.epam.dlab.rest.dto.ErrorDTO;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-
-public abstract class GenericExceptionMapper<E extends Exception> implements ExceptionMapper<E> {
-	static final Logger LOGGER = LoggerFactory.getLogger(GenericExceptionMapper.class);
-
-	@Override
-	public Response toResponse(E exception) {
-		LOGGER.error("Uncaught exception in application", exception);
-
-		return Response
-				.serverError()
-				.entity(new ErrorDTO(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), exception.getMessage()))
-				.type(MediaType.APPLICATION_JSON)
-				.build();
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/JsonProcessingExceptionMapper.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/JsonProcessingExceptionMapper.java
deleted file mode 100644
index 24cf850..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/JsonProcessingExceptionMapper.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.mappers;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-
-import javax.ws.rs.ext.Provider;
-
-@Provider
-public class JsonProcessingExceptionMapper extends GenericExceptionMapper<JsonProcessingException> {
-}
\ No newline at end of file
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ResourceConflictExceptionMapper.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ResourceConflictExceptionMapper.java
deleted file mode 100644
index 1f4e35e..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ResourceConflictExceptionMapper.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.mappers;
-
-import com.epam.dlab.exceptions.ResourceConflictException;
-import com.epam.dlab.rest.dto.ErrorDTO;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-@Provider
-public class ResourceConflictExceptionMapper implements ExceptionMapper<ResourceConflictException> {
-	@Override
-	public Response toResponse(ResourceConflictException e) {
-		final Response.Status conflict = Response.Status.CONFLICT;
-		return Response.status(conflict)
-				.type(MediaType.APPLICATION_JSON)
-				.entity(new ErrorDTO(conflict.getStatusCode(), e.getMessage()))
-				.build();
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ResourceNotFoundExceptionMapper.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ResourceNotFoundExceptionMapper.java
deleted file mode 100644
index d98a57f..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ResourceNotFoundExceptionMapper.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.mappers;
-
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.rest.dto.ErrorDTO;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-@Provider
-public class ResourceNotFoundExceptionMapper implements ExceptionMapper<ResourceNotFoundException> {
-	@Override
-	public Response toResponse(ResourceNotFoundException e) {
-		final Response.Status notFound = Response.Status.NOT_FOUND;
-		return Response.status(notFound)
-				.type(MediaType.APPLICATION_JSON)
-				.entity(new ErrorDTO(notFound.getStatusCode(), e.getMessage()))
-				.build();
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ResourceQuoteReachedExceptionMapper.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ResourceQuoteReachedExceptionMapper.java
deleted file mode 100644
index 7a60907..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ResourceQuoteReachedExceptionMapper.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.rest.mappers;
-
-import com.epam.dlab.exceptions.ResourceQuoteReachedException;
-import com.epam.dlab.rest.dto.ErrorDTO;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-
-public class ResourceQuoteReachedExceptionMapper implements ExceptionMapper<ResourceQuoteReachedException> {
-	@Override
-	public Response toResponse(ResourceQuoteReachedException exception) {
-		final Response.Status forbidden = Response.Status.FORBIDDEN;
-		return Response.status(forbidden)
-				.type(MediaType.APPLICATION_JSON_TYPE)
-				.entity(new ErrorDTO(forbidden.getStatusCode(), exception.getMessage()))
-				.build();
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/RuntimeExceptionMapper.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/RuntimeExceptionMapper.java
deleted file mode 100644
index e2eaa4d..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/RuntimeExceptionMapper.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.mappers;
-
-import com.epam.dlab.rest.dto.ErrorDTO;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.Provider;
-
-@Provider
-@Slf4j
-public class RuntimeExceptionMapper extends GenericExceptionMapper<RuntimeException> {
-
-	@Override
-	public Response toResponse(RuntimeException exception) {
-		if (exception instanceof WebApplicationException) {
-			return handleWebApplicationException(exception);
-		}
-		return super.toResponse(exception);
-	}
-
-	private Response handleWebApplicationException(RuntimeException exception) {
-		WebApplicationException webAppException = (WebApplicationException) exception;
-
-		if (webAppException.getResponse().getStatusInfo() == Response.Status.UNAUTHORIZED
-				|| webAppException.getResponse().getStatusInfo() == Response.Status.FORBIDDEN) {
-
-			return web(exception, Response.Status.UNAUTHORIZED);
-		} else if (webAppException.getResponse().getStatusInfo() == Response.Status.NOT_FOUND) {
-			return web(exception, Response.Status.NOT_FOUND);
-		}
-
-		return super.toResponse(exception);
-	}
-
-	private Response web(RuntimeException exception, Response.StatusType status) {
-		log.error("Web application exception: {}", exception.getMessage(), exception);
-		return Response.status(status)
-				.type(MediaType.APPLICATION_JSON)
-				.entity(new ErrorDTO(status.getStatusCode(), exception.getMessage()))
-				.build();
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ValidationExceptionMapper.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ValidationExceptionMapper.java
deleted file mode 100644
index 700ce4d..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/rest/mappers/ValidationExceptionMapper.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.mappers;
-
-import com.epam.dlab.rest.dto.ErrorDTO;
-import io.dropwizard.jersey.validation.ConstraintMessage;
-import io.dropwizard.jersey.validation.JerseyViolationException;
-import org.glassfish.jersey.server.model.Invocable;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import java.util.stream.Collectors;
-
-public class ValidationExceptionMapper implements ExceptionMapper<JerseyViolationException> {
-	@Override
-	public Response toResponse(JerseyViolationException exception) {
-		Invocable invocable = exception.getInvocable();
-		final String errors =
-				exception.getConstraintViolations()
-						.stream().map(violation -> ConstraintMessage.getMessage(violation, invocable))
-						.collect(Collectors.joining(","));
-		return Response.status(Response.Status.BAD_REQUEST)
-				.entity(new ErrorDTO(Response.Status.BAD_REQUEST.getStatusCode(), errors))
-				.type(MediaType.APPLICATION_JSON)
-				.build();
-	}
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/AwsValidation.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/AwsValidation.java
deleted file mode 100644
index 715f27f..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/AwsValidation.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.validation;
-
-public interface AwsValidation {
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/AzureValidation.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/AzureValidation.java
deleted file mode 100644
index 14ec7d5..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/AzureValidation.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.validation;
-
-public interface AzureValidation {
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/CloudConfigurationSequenceProvider.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/CloudConfigurationSequenceProvider.java
deleted file mode 100644
index 37503f4..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/CloudConfigurationSequenceProvider.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.validation;
-
-import com.epam.dlab.ServiceConfiguration;
-import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;
-
-import java.lang.reflect.ParameterizedType;
-import java.util.ArrayList;
-import java.util.List;
-
-public class CloudConfigurationSequenceProvider<T extends ServiceConfiguration> implements DefaultGroupSequenceProvider<T> {
-    @Override
-    public List<Class<?>> getValidationGroups(T c) {
-        List<Class<?>> sequence = new ArrayList<>();
-
-        sequence.add(initialSequenceGroup());
-
-        if (c == null) {
-            return sequence;
-        } else {
-            switch (c.getCloudProvider()) {
-                case AWS:
-                    sequence.add(AwsValidation.class);
-                    break;
-                case AZURE:
-                    sequence.add(AzureValidation.class);
-                    break;
-                case GCP:
-                    sequence.add(GcpValidation.class);
-                    break;
-                default:
-                    throw new IllegalArgumentException("Cloud provider is not supported" + c.getCloudProvider());
-            }
-        }
-
-        return sequence;
-    }
-
-    private Class<T> initialSequenceGroup() {
-        ParameterizedType parameterizedType = (ParameterizedType) getClass()
-                .getGenericSuperclass();
-
-        @SuppressWarnings("unchecked")
-        Class<T> ret = (Class<T>) parameterizedType.getActualTypeArguments()[0];
-
-        return ret;
-    }
-}
diff --git a/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/GcpValidation.java b/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/GcpValidation.java
deleted file mode 100644
index b2e2435..0000000
--- a/services/dlab-webapp-common/src/main/java/com/epam/dlab/validation/GcpValidation.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.validation;
-
-public interface GcpValidation {
-}
diff --git a/services/provisioning-service/pom.xml b/services/provisioning-service/pom.xml
index 1a6548e..eda6624 100644
--- a/services/provisioning-service/pom.xml
+++ b/services/provisioning-service/pom.xml
@@ -21,17 +21,36 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
-        <groupId>com.epam.dlab</groupId>
-        <artifactId>dlab</artifactId>
+        <groupId>com.epam.datalab</groupId>
+        <artifactId>datalab</artifactId>
         <version>1.0</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
     <artifactId>provisioning-service</artifactId>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.google.cloud</groupId>
+                <artifactId>libraries-bom</artifactId>
+                <version>5.3.0</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>software.amazon.awssdk</groupId>
+                <artifactId>bom</artifactId>
+                <version>2.13.9</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
     <dependencies>
         <dependency>
-            <groupId>com.epam.dlab</groupId>
+            <groupId>com.epam.datalab</groupId>
             <artifactId>common</artifactId>
         </dependency>
         <dependency>
@@ -44,18 +63,18 @@
             <artifactId>dropwizard-template-config</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>dlab-model</artifactId>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>datalab-model</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
         <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>dlab-utils</artifactId>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>datalab-utils</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
         <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>dlab-webapp-common</artifactId>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>datalab-webapp-common</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
         <dependency>
@@ -63,7 +82,55 @@
             <artifactId>conveyor</artifactId>
             <version>${com.aegisql.conveyor.version}</version>
         </dependency>
-
+        <dependency>
+            <groupId>io.dropwizard</groupId>
+            <artifactId>dropwizard-forms</artifactId>
+            <version>${io.dropwizard.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.cloud</groupId>
+            <artifactId>google-cloud-storage</artifactId>
+            <version>1.107.0</version>
+        </dependency>
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>s3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.9</version>
+        </dependency>
+        <dependency>
+            <groupId>com.azure</groupId>
+            <artifactId>azure-storage-blob</artifactId>
+            <version>12.6.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.azure</groupId>
+            <artifactId>azure-identity</artifactId>
+            <version>1.0.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>2.11.0</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>${commons-fileupload.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.4</version>
+        </dependency>
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
@@ -100,12 +167,12 @@
                                         implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                                 <transformer
                                         implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <mainClass>com.epam.dlab.backendapi.ProvisioningServiceApplication</mainClass>
+                                    <mainClass>com.epam.datalab.backendapi.ProvisioningServiceApplication</mainClass>
                                     <manifestEntries>
                                         <Created-By>&lt;EPAM&gt; Systems</Created-By>
-                                        <Name>com/epam/dlab</Name>
-                                        <Implementation-Title>DLab Provisioning Service</Implementation-Title>
-                                        <Implementation-Version>${dlab.version}</Implementation-Version>
+                                        <Name>com/epam/datalab</Name>
+                                        <Implementation-Title>DataLab Provisioning Service</Implementation-Title>
+                                        <Implementation-Version>${datalab.version}</Implementation-Version>
                                         <Implementation-Vendor>&lt;EPAM&gt; Systems</Implementation-Vendor>
                                         <Build-Time>${maven.build.timestamp}</Build-Time>
                                         <Build-OS>${os.name}</Build-OS>
@@ -118,6 +185,20 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>**/*Configuration.*</exclude>
+                        <exclude>**/*Module.*</exclude>
+                        <exclude>**/*Form.*</exclude>
+                        <exclude>com/epam/datalab/process/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/modules/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/validation/**/*</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/services/provisioning-service/provisioning.yml b/services/provisioning-service/provisioning.yml
index 53c303e..b6ced32 100644
--- a/services/provisioning-service/provisioning.yml
+++ b/services/provisioning-service/provisioning.yml
@@ -19,23 +19,23 @@
 #
 # ******************************************************************************
 
-<#include "ssn.yml">
+  <#include "ssn.yml">
 
-backupScriptPath: /opt/dlab/tmp/backup.py
-backupDirectory: /opt/dlab/tmp/result
+backupScriptPath: /opt/datalab/tmp/backup.py
+backupDirectory: /opt/datalab/tmp/result
 keyDirectory: ${KEYS_DIR}
-responseDirectory: /opt/dlab/tmp
-handlerDirectory: /opt/dlab/handlers
+responseDirectory: /opt/datalab/tmp
+handlerDirectory: /opt/datalab/handlers
 dockerLogDirectory: ${LOG_ROOT_DIR}
 warmupPollTimeout: 2m
-resourceStatusPollTimeout: 300m
+resourceStatusPollTimeout: 400m
 keyLoaderPollTimeout: 30m
 requestEnvStatusTimeout: 50s
 adminKey: KEYNAME
-edgeImage: docker.dlab-edge
+edgeImage: docker.datalab-edge
 fileLengthCheckDelay: 500ms
 
-<#if CLOUD_TYPE == "aws">
+  <#if CLOUD_TYPE == "aws">
 emrEC2RoleDefault: EMR_EC2_DefaultRole
 emrServiceRoleDefault: EMR_DefaultRole
 </#if>
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/DropwizardBearerTokenFilterImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/DropwizardBearerTokenFilterImpl.java
new file mode 100644
index 0000000..d0a36ba
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/DropwizardBearerTokenFilterImpl.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi;
+
+import org.keycloak.adapters.AdapterDeploymentContext;
+import org.keycloak.adapters.KeycloakDeployment;
+import org.keycloak.adapters.NodesRegistrationManagement;
+import org.keycloak.jaxrs.JaxrsBearerTokenFilterImpl;
+
+import javax.annotation.Priority;
+import javax.ws.rs.Priorities;
+import javax.ws.rs.container.PreMatching;
+
+@PreMatching
+@Priority(Priorities.AUTHENTICATION)
+public class DropwizardBearerTokenFilterImpl extends JaxrsBearerTokenFilterImpl {
+
+    public DropwizardBearerTokenFilterImpl(KeycloakDeployment keycloakDeployment) {
+        deploymentContext = new AdapterDeploymentContext(keycloakDeployment);
+        nodesRegistrationManagement = new NodesRegistrationManagement();
+    }
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplication.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplication.java
new file mode 100644
index 0000000..b147fd1
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplication.java
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.DirectoriesCreator;
+import com.epam.datalab.backendapi.core.DockerWarmuper;
+import com.epam.datalab.backendapi.core.response.handlers.ComputationalConfigure;
+import com.epam.datalab.backendapi.modules.CloudModuleConfigurator;
+import com.epam.datalab.backendapi.modules.ModuleFactory;
+import com.epam.datalab.backendapi.resources.*;
+import com.epam.datalab.backendapi.resources.base.KeyResource;
+import com.epam.datalab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
+import com.epam.datalab.cloud.CloudModule;
+import com.epam.datalab.process.model.DatalabProcess;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.mappers.JsonProcessingExceptionMapper;
+import com.epam.datalab.rest.mappers.RuntimeExceptionMapper;
+import com.epam.datalab.util.ServiceUtils;
+import com.fasterxml.jackson.databind.InjectableValues;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import de.ahus1.keycloak.dropwizard.AbstractKeycloakAuthenticator;
+import de.ahus1.keycloak.dropwizard.KeycloakBundle;
+import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
+import de.thomaskrille.dropwizard_template_config.TemplateConfigBundle;
+import de.thomaskrille.dropwizard_template_config.TemplateConfigBundleConfiguration;
+import io.dropwizard.Application;
+import io.dropwizard.auth.Authenticator;
+import io.dropwizard.auth.Authorizer;
+import io.dropwizard.forms.MultiPartBundle;
+import io.dropwizard.jersey.setup.JerseyEnvironment;
+import io.dropwizard.setup.Bootstrap;
+import io.dropwizard.setup.Environment;
+import org.keycloak.KeycloakSecurityContext;
+
+import javax.servlet.http.HttpServletRequest;
+import java.security.Principal;
+
+public class ProvisioningServiceApplication extends Application<ProvisioningServiceApplicationConfiguration> {
+
+    public static void main(String[] args) throws Exception {
+        if (ServiceUtils.printAppVersion(ProvisioningServiceApplication.class, args)) {
+            return;
+        }
+        new ProvisioningServiceApplication().run(args);
+    }
+
+    @Override
+    public void initialize(Bootstrap<ProvisioningServiceApplicationConfiguration> bootstrap) {
+        bootstrap.addBundle(new MultiPartBundle());
+        bootstrap.addBundle(new TemplateConfigBundle(
+                new TemplateConfigBundleConfiguration().fileIncludePath(ServiceUtils.getConfPath())
+        ));
+        bootstrap.addBundle(new KeycloakBundle<ProvisioningServiceApplicationConfiguration>() {
+            @Override
+            protected KeycloakConfiguration getKeycloakConfiguration(ProvisioningServiceApplicationConfiguration configuration) {
+                return configuration.getKeycloakConfiguration();
+            }
+
+            @Override
+            protected Class<? extends Principal> getUserClass() {
+                return UserInfo.class;
+            }
+
+            @Override
+            protected Authorizer createAuthorizer() {
+                return (Authorizer<UserInfo>) (principal, role) -> principal.getRoles().contains(role);
+            }
+
+            @Override
+            protected Authenticator createAuthenticator(KeycloakConfiguration configuration) {
+                class KeycloakAuthenticator extends AbstractKeycloakAuthenticator<UserInfo> {
+
+                    private KeycloakAuthenticator(KeycloakConfiguration keycloakConfiguration) {
+                        super(keycloakConfiguration);
+                    }
+
+                    @Override
+                    protected UserInfo prepareAuthentication(KeycloakSecurityContext keycloakSecurityContext,
+                                                             HttpServletRequest httpServletRequest,
+                                                             KeycloakConfiguration keycloakConfiguration) {
+                        return new UserInfo(keycloakSecurityContext.getToken().getPreferredUsername(),
+                                keycloakSecurityContext.getIdTokenString());
+                    }
+                }
+                return new KeycloakAuthenticator(configuration);
+            }
+        });
+    }
+
+    @Override
+    public void run(ProvisioningServiceApplicationConfiguration configuration, Environment environment) {
+        DatalabProcess.getInstance().setProcessTimeout(configuration.getProcessTimeout());
+        DatalabProcess.getInstance().setMaxProcessesPerBox(configuration.getProcessMaxThreadsPerJvm());
+        DatalabProcess.getInstance().setMaxProcessesPerUser(configuration.getProcessMaxThreadsPerUser());
+
+        CloudModule cloudModule = CloudModuleConfigurator.getCloudModule(configuration);
+        Injector injector = Guice.createInjector(ModuleFactory.getModule(configuration, environment), cloudModule);
+        cloudModule.init(environment, injector);
+
+
+        final ObjectMapper mapper = injector.getInstance(ObjectMapper.class);
+        final InjectableValues.Std injectableValues = new InjectableValues.Std();
+        injectableValues.addValue(RESTService.class, injector.getInstance(RESTService.class));
+        injectableValues.addValue(ComputationalConfigure.class, injector.getInstance(ComputationalConfigure.class));
+        mapper.setInjectableValues(injectableValues);
+
+        environment.lifecycle().manage(injector.getInstance(DirectoriesCreator.class));
+        if (configuration.isHandlersPersistenceEnabled()) {
+            environment.lifecycle().manage(injector.getInstance(RestoreCallbackHandlerServiceImpl.class));
+        }
+        environment.lifecycle().manage(injector.getInstance(DockerWarmuper.class));
+
+
+        JerseyEnvironment jersey = environment.jersey();
+        jersey.register(configuration.getCloudProvider());
+        jersey.register(new RuntimeExceptionMapper());
+        jersey.register(new JsonProcessingExceptionMapper());
+
+        jersey.register(injector.getInstance(ChangePropertiesResource.class));
+        jersey.register(injector.getInstance(DockerResource.class));
+        jersey.register(injector.getInstance(GitExploratoryResource.class));
+        jersey.register(injector.getInstance(LibraryResource.class));
+        jersey.register(injector.getInstance(InfrastructureResource.class));
+        jersey.register(injector.getInstance(ImageResource.class));
+        jersey.register(injector.getInstance(BackupResource.class));
+        jersey.register(injector.getInstance(KeyResource.class));
+        jersey.register(injector.getInstance(CallbackHandlerResource.class));
+        jersey.register(injector.getInstance(ProjectResource.class));
+        jersey.register(injector.getInstance(OdahuResource.class));
+        jersey.register(injector.getInstance(ProvisioningHealthCheckResource.class));
+        environment.jersey().register(injector.getInstance(BucketResource.class));
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplicationConfiguration.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplicationConfiguration.java
new file mode 100644
index 0000000..84ff288
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/ProvisioningServiceApplicationConfiguration.java
@@ -0,0 +1,198 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi;
+
+import com.epam.datalab.ServiceConfiguration;
+import com.epam.datalab.backendapi.conf.CloudConfiguration;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.validation.ProvisioningServiceCloudConfigurationSequenceProvider;
+import com.epam.datalab.validation.AwsValidation;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
+import io.dropwizard.util.Duration;
+import org.hibernate.validator.constraints.NotEmpty;
+import org.hibernate.validator.group.GroupSequenceProvider;
+
+@GroupSequenceProvider(ProvisioningServiceCloudConfigurationSequenceProvider.class)
+public class ProvisioningServiceApplicationConfiguration extends ServiceConfiguration implements Directories {
+
+    @NotEmpty
+    @JsonProperty
+    private String keyDirectory;
+
+    @NotEmpty
+    @JsonProperty
+    private String responseDirectory;
+
+    @NotEmpty
+    @JsonProperty
+    private String dockerLogDirectory;
+
+    @NotEmpty
+    @JsonProperty
+    private String handlerDirectory;
+
+    @JsonProperty
+    private Duration warmupPollTimeout;
+
+    @JsonProperty
+    private Duration resourceStatusPollTimeout = Duration.minutes(3);
+
+    @JsonProperty
+    private Duration keyLoaderPollTimeout = Duration.minutes(2);
+
+    @JsonProperty
+    private Duration requestEnvStatusTimeout = Duration.seconds(30);
+
+    @NotEmpty
+    @JsonProperty
+    private String adminKey;
+
+    @NotEmpty
+    @JsonProperty
+    private String edgeImage;
+
+    @JsonProperty
+    private Duration fileLengthCheckDelay = Duration.seconds(3);
+
+    @NotEmpty(groups = AwsValidation.class)
+    @JsonProperty
+    private String emrEC2RoleDefault;
+
+    @NotEmpty(groups = AwsValidation.class)
+    @JsonProperty
+    private String emrServiceRoleDefault;
+
+    @JsonProperty
+    private int processMaxThreadsPerJvm = 50;
+
+    @JsonProperty
+    private int processMaxThreadsPerUser = 5;
+
+    @JsonProperty
+    private Duration processTimeout = Duration.hours(3);
+    @JsonProperty
+    private String backupScriptPath;
+    @JsonProperty
+    private String backupDirectory;
+    @JsonProperty
+    private boolean handlersPersistenceEnabled;
+
+    private KeycloakConfiguration keycloakConfiguration = new KeycloakConfiguration();
+
+    @JsonProperty("cloudProperties")
+    private CloudConfiguration cloudConfiguration;
+
+    public boolean isHandlersPersistenceEnabled() {
+        return handlersPersistenceEnabled;
+    }
+
+    public String getKeyDirectory() {
+        return keyDirectory;
+    }
+
+    public Duration getWarmupPollTimeout() {
+        return warmupPollTimeout;
+    }
+
+    public Duration getResourceStatusPollTimeout() {
+        return resourceStatusPollTimeout;
+    }
+
+    public Duration getKeyLoaderPollTimeout() {
+        return keyLoaderPollTimeout;
+    }
+
+    /**
+     * Return the timeout for the check the status of environment resources.
+     */
+    public Duration getRequestEnvStatusTimeout() {
+        return requestEnvStatusTimeout;
+    }
+
+    public String getAdminKey() {
+        return adminKey;
+    }
+
+    public String getEdgeImage() {
+        return edgeImage;
+    }
+
+    public Duration getFileLengthCheckDelay() {
+        return fileLengthCheckDelay;
+    }
+
+    public String getEmrEC2RoleDefault() {
+        return emrEC2RoleDefault;
+    }
+
+    public String getEmrServiceRoleDefault() {
+        return emrServiceRoleDefault;
+    }
+
+    public String getWarmupDirectory() {
+        return responseDirectory + WARMUP_DIRECTORY;
+    }
+
+    public String getImagesDirectory() {
+        return responseDirectory + IMAGES_DIRECTORY;
+    }
+
+    public String getKeyLoaderDirectory() {
+        return responseDirectory + KEY_LOADER_DIRECTORY;
+    }
+
+    public String getDockerLogDirectory() {
+        return dockerLogDirectory;
+    }
+
+    public int getProcessMaxThreadsPerJvm() {
+        return processMaxThreadsPerJvm;
+    }
+
+    public int getProcessMaxThreadsPerUser() {
+        return processMaxThreadsPerUser;
+    }
+
+    public Duration getProcessTimeout() {
+        return processTimeout;
+    }
+
+    public String getBackupScriptPath() {
+        return backupScriptPath;
+    }
+
+    public String getBackupDirectory() {
+        return backupDirectory;
+    }
+
+    public String getHandlerDirectory() {
+        return handlerDirectory;
+    }
+
+    public KeycloakConfiguration getKeycloakConfiguration() {
+        return keycloakConfiguration;
+    }
+
+    public CloudConfiguration getCloudConfiguration() {
+        return cloudConfiguration;
+    }
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/conf/CloudConfiguration.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/conf/CloudConfiguration.java
new file mode 100644
index 0000000..1e90716
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/conf/CloudConfiguration.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.conf;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class CloudConfiguration {
+
+    private final String os;
+    private final String serviceBaseName;
+    private final String edgeInstanceSize;
+    private final String subnetId;
+    private final String region;
+    private final String zone;
+    private final String confTagResourceId;
+    private final String securityGroupIds;
+    private final String ssnInstanceSize;
+    private final String notebookVpcId;
+    private final String notebookSubnetId;
+    private final String confKeyDir;
+    private final String vpcId;
+    private final String azureResourceGroupName;
+    private final String ssnStorageAccountTagName;
+    private final String sharedStorageAccountTagName;
+    private final String datalakeTagName;
+    private final String azureAuthFile;
+    private final String azureClientId;
+    private final String peeringId;
+    private final String gcpProjectId;
+    private final boolean imageEnabled;
+    @JsonProperty("ldap")
+    private final LdapConfig ldapConfig;
+    private final StepCerts stepCerts;
+    private final Keycloak keycloak;
+
+    @Data
+    public static class LdapConfig {
+        private final String host;
+        private final String dn;
+        private final String ou;
+        private final String user;
+        private final String password;
+    }
+
+    @Data
+    public static class StepCerts {
+        private final boolean enabled;
+        private final String rootCA;
+        private final String kid;
+        private final String kidPassword;
+        private final String caURL;
+    }
+
+    @Data
+    public static class Keycloak {
+        @JsonProperty("auth_server_url")
+        private final String authServerUrl;
+        @JsonProperty("realm_name")
+        private final String realmName;
+        private final String user;
+        @JsonProperty("user_password")
+        private final String userPassword;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/Constants.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/Constants.java
new file mode 100644
index 0000000..04cf0d4
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/Constants.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core;
+
+public class Constants {
+
+    public static final String JSON_EXTENSION = ".json";
+    public static final String LOG_EXTENSION = ".log";
+
+    private Constants() {
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/Directories.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/Directories.java
new file mode 100644
index 0000000..d281ee8
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/Directories.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core;
+
+public interface Directories {
+    String WARMUP_DIRECTORY = "/result";
+    String IMAGES_DIRECTORY = "/result";
+    String KEY_LOADER_DIRECTORY = "/result";
+    String EDGE_LOG_DIRECTORY = "edge";
+    String NOTEBOOK_LOG_DIRECTORY = "notebook";
+    String DATA_ENGINE_LOG_DIRECTORY = "dataengine";
+    String DATA_ENGINE_SERVICE_LOG_DIRECTORY = "dataengine-service";
+    String IMAGE_LOG_DIRECTORY = "image";
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DirectoriesCreator.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DirectoriesCreator.java
new file mode 100644
index 0000000..40da2c2
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DirectoriesCreator.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import io.dropwizard.lifecycle.Managed;
+
+import java.io.File;
+
+@Singleton
+public class DirectoriesCreator implements Managed {
+    @Inject
+    private ProvisioningServiceApplicationConfiguration configuration;
+
+    @Override
+    public void start() throws Exception {
+        createDirectory(configuration.getWarmupDirectory());
+        createDirectory(configuration.getImagesDirectory());
+        createDirectory(configuration.getKeyLoaderDirectory());
+        createDirectory(configuration.getHandlerDirectory());
+    }
+
+    private boolean createDirectory(String directory) {
+        return new File(directory).mkdirs();
+    }
+
+    @Override
+    public void stop() throws Exception {
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DockerWarmuper.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DockerWarmuper.java
new file mode 100644
index 0000000..eebb032
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/DockerWarmuper.java
@@ -0,0 +1,184 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.datalab.dto.imagemetadata.ComputationalMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ExploratoryMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ImageMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ImageType;
+import com.epam.datalab.process.model.ProcessInfo;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import io.dropwizard.lifecycle.Managed;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+@Singleton
+@Slf4j
+public class DockerWarmuper implements Managed, DockerCommands, MetadataHolder {
+    private static final Logger LOGGER = LoggerFactory.getLogger(DockerWarmuper.class);
+    public static final String EXPLORATORY_RESPONSE_MARKER = "exploratory_environment_shapes";
+
+    @Inject
+    private ProvisioningServiceApplicationConfiguration configuration;
+    @Inject
+    private FolderListenerExecutor folderListenerExecutor;
+    @Inject
+    private ICommandExecutor commandExecutor;
+    private final Map<String, String> imageList = new ConcurrentHashMap<>();
+    private final Set<ImageMetadataDTO> metadataDTOs = ConcurrentHashMap.newKeySet();
+
+
+    @Override
+    public void start() throws Exception {
+        LOGGER.debug("warming up docker");
+        final ProcessInfo processInfo = commandExecutor.executeSync("warmup", DockerCommands.generateUUID(),
+                GET_IMAGES);
+        String[] images = processInfo.getStdOut().split("\n");
+        for (String image : images) {
+            String uuid = UUID.randomUUID().toString();
+            LOGGER.debug("warming up image: {} with uid {}", image, uuid);
+            imageList.put(uuid, image);
+            folderListenerExecutor.start(configuration.getWarmupDirectory(),
+                    configuration.getWarmupPollTimeout(),
+                    getFileHandlerCallback(uuid));
+            String command = new RunDockerCommand()
+                    .withVolumeForRootKeys(configuration.getKeyDirectory())
+                    .withVolumeForResponse(configuration.getWarmupDirectory())
+                    .withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
+                    .withResource(getResourceType())
+                    .withRequestId(uuid)
+                    .withActionDescribe(image)
+                    .toCMD();
+            commandExecutor.executeAsync("warmup", uuid, command);
+        }
+    }
+
+    public class DockerFileHandlerCallback implements FileHandlerCallback {
+        private final String uuid;
+
+        @JsonCreator
+        public DockerFileHandlerCallback(@JsonProperty("uuid") String uuid) {
+            this.uuid = uuid;
+        }
+
+        @Override
+        public String getUUID() {
+            return uuid;
+        }
+
+        @Override
+        public boolean checkUUID(String uuid) {
+            return this.uuid.equals(uuid);
+        }
+
+        @Override
+        public boolean handle(String fileName, byte[] content) {
+            String uuid = DockerCommands.extractUUID(fileName);
+            try {
+                LOGGER.debug("processing response file {} with content {}", fileName, new String(content));
+                addMetadata(content, uuid);
+            } catch (IOException e) {
+                LOGGER.error("processing response file {} fails", fileName, e);
+                return false;
+            }
+            return true;
+        }
+
+        @Override
+        public void handleError(String errorMessage) {
+            LOGGER.warn("docker warmupper returned no result: {}", errorMessage);
+        }
+
+        @Override
+        public String getUser() {
+            return "DATALAB";
+        }
+    }
+
+    public DockerFileHandlerCallback getFileHandlerCallback(String uuid) {
+        return new DockerFileHandlerCallback(uuid);
+    }
+
+    private void addMetadata(byte[] content, String uuid) throws IOException {
+        final JsonNode jsonNode = MAPPER.readTree(content);
+        ImageMetadataDTO metadata;
+        if (jsonNode != null) {
+            if (jsonNode.has(EXPLORATORY_RESPONSE_MARKER)) {
+                metadata = MAPPER.readValue(content, ExploratoryMetadataDTO.class);
+                metadata.setImageType(ImageType.EXPLORATORY);
+            } else {
+                metadata = MAPPER.readValue(content, ComputationalMetadataDTO.class);
+                metadata.setImageType(ImageType.COMPUTATIONAL);
+            }
+            String image = imageList.get(uuid);
+            metadata.setImage(image);
+            LOGGER.debug("caching metadata for image {}: {}", image, metadata);
+            metadataDTOs.add(metadata);
+        } else {
+            log.info("Cannot parse element: \n {}", new String(content, StandardCharsets.UTF_8));
+        }
+    }
+
+    @Override
+    public void stop() throws Exception {
+        //do nothing
+    }
+
+    @Override
+    public String getResourceType() {
+        return Directories.NOTEBOOK_LOG_DIRECTORY;
+    }
+
+    public Map<String, String> getUuids() {
+        return Collections.unmodifiableMap(imageList);
+    }
+
+    public Set<ImageMetadataDTO> getMetadata(ImageType type) {
+        Set<ImageMetadataDTO> collect = metadataDTOs.stream()
+                .filter(m -> m.getImageType().equals(type))
+                .collect(Collectors.toSet());
+        log.info("TEST: type: {}, set: {}", type, collect);
+        return collect;
+    }
+
+    @Override
+    public String toString() {
+        return "DockerWarmuper{" +
+                ", imageList=" + imageList +
+                ", metadataDTOs=" + metadataDTOs +
+                '}';
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/FileHandlerCallback.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/FileHandlerCallback.java
new file mode 100644
index 0000000..bbcf771
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/FileHandlerCallback.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "@class")
+public interface FileHandlerCallback {
+    String getUUID();
+
+    boolean checkUUID(String uuid);
+
+    boolean handle(String fileName, byte[] content) throws Exception;
+
+    void handleError(String errorMessage);
+
+    String getUser();
+
+    @JsonIgnore
+    default String getId() {
+        return this.getClass().getSimpleName() + "_" + getUUID();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/MetadataHolder.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/MetadataHolder.java
new file mode 100644
index 0000000..c5a5cea
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/MetadataHolder.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core;
+
+import com.epam.datalab.dto.imagemetadata.ImageMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ImageType;
+
+import java.util.Set;
+
+@FunctionalInterface
+public interface MetadataHolder {
+    Set<ImageMetadataDTO> getMetadata(ImageType metadataType);
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CmdCommand.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CmdCommand.java
new file mode 100644
index 0000000..16fdfce
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CmdCommand.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+@FunctionalInterface
+public interface CmdCommand {
+    String toCMD();
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandBuilder.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandBuilder.java
new file mode 100644
index 0000000..f0a75eb
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandBuilder.java
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.conf.CloudConfiguration;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.ResourceBaseDTO;
+import com.epam.datalab.dto.aws.AwsCloudSettings;
+import com.epam.datalab.dto.azure.AzureCloudSettings;
+import com.epam.datalab.dto.base.CloudSettings;
+import com.epam.datalab.dto.gcp.GcpCloudSettings;
+import com.epam.datalab.util.JsonGenerator;
+import com.epam.datalab.util.SecurityUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Singleton
+public class CommandBuilder {
+
+    private final ProvisioningServiceApplicationConfiguration conf;
+
+    @Inject
+    public CommandBuilder(ProvisioningServiceApplicationConfiguration conf) {
+        this.conf = conf;
+    }
+
+    public String buildCommand(RunDockerCommand runDockerCommand, ResourceBaseDTO<?> resourceBaseDTO) throws JsonProcessingException {
+        StringBuilder builder = new StringBuilder();
+        if (resourceBaseDTO != null) {
+            builder.append("echo -e '");
+            try {
+                resourceBaseDTO.setCloudSettings(getCloudSettings(resourceBaseDTO.getCloudSettings()));
+                String str = JsonGenerator.generateJson(resourceBaseDTO);
+                log.info("Serialized DTO to: {}", SecurityUtils.hideCreds(str));
+                builder.append(str);
+            } catch (JsonProcessingException e) {
+                log.error("ERROR generating json from dockerRunParameters: {}", e.getMessage());
+                throw e;
+            }
+            builder.append('\'');
+            builder.append(" | ");
+        }
+        builder.append(runDockerCommand.toCMD());
+        return builder.toString();
+    }
+
+    private CloudSettings getCloudSettings(CloudSettings settings) {
+        final CloudProvider cloudProvider = conf.getCloudProvider();
+        final CloudConfiguration cloudConfiguration = conf.getCloudConfiguration();
+        final CloudConfiguration.LdapConfig ldapConfig = cloudConfiguration.getLdapConfig();
+        final CloudConfiguration.StepCerts stepCerts = cloudConfiguration.getStepCerts();
+        final CloudConfiguration.Keycloak keycloak = cloudConfiguration.getKeycloak();
+        if (cloudProvider == CloudProvider.AWS) {
+            return awsCloudSettings(settings, cloudConfiguration, ldapConfig, stepCerts, keycloak);
+        } else if (cloudProvider == CloudProvider.GCP) {
+            return gcpCloudSettings(settings, cloudConfiguration, ldapConfig, stepCerts, keycloak);
+        } else if (cloudProvider == CloudProvider.AZURE) {
+            return azureCloudSettings(settings, cloudConfiguration, ldapConfig, stepCerts, keycloak);
+        } else {
+            throw new UnsupportedOperationException("Unsupported cloud provider " + cloudProvider.getName());
+        }
+    }
+
+    private AzureCloudSettings azureCloudSettings(CloudSettings settings, CloudConfiguration cloudConfiguration,
+                                                  CloudConfiguration.LdapConfig ldapConfig,
+                                                  CloudConfiguration.StepCerts stepCerts,
+                                                  CloudConfiguration.Keycloak keycloak) {
+        return AzureCloudSettings.builder()
+                .azureRegion(cloudConfiguration.getRegion())
+                .azureResourceGroupName(cloudConfiguration.getAzureResourceGroupName())
+                .azureSecurityGroupName(cloudConfiguration.getSecurityGroupIds())
+                .ldapDn(ldapConfig.getDn())
+                .ldapHost(ldapConfig.getHost())
+                .ldapOu(ldapConfig.getOu())
+                .ldapUser(ldapConfig.getUser())
+                .ldapPassword(ldapConfig.getPassword())
+                .azureSubnetName(cloudConfiguration.getSubnetId())
+                .azureVpcName(cloudConfiguration.getVpcId())
+                .confKeyDir(cloudConfiguration.getConfKeyDir())
+                .azureIamUser(settings.getIamUser())
+                .sbn(cloudConfiguration.getServiceBaseName())
+                .os(cloudConfiguration.getOs())
+                .cloud(conf.getCloudProvider().getName())
+                .imageEnabled(String.valueOf(cloudConfiguration.isImageEnabled()))
+                .stepCertsEnabled(String.valueOf(stepCerts.isEnabled()))
+                .stepCertsRootCA(stepCerts.getRootCA())
+                .stepCertsKid(stepCerts.getKid())
+                .stepCertsKidPassword(stepCerts.getKidPassword())
+                .stepCertsCAURL(stepCerts.getCaURL())
+                .keycloakAuthServerUrl(keycloak.getAuthServerUrl())
+                .keycloakRealmName(keycloak.getRealmName())
+                .keycloakUser(keycloak.getUser())
+                .keycloakUserPassword(keycloak.getUserPassword())
+                .build();
+    }
+
+    private GcpCloudSettings gcpCloudSettings(CloudSettings settings, CloudConfiguration cloudConfiguration,
+                                              CloudConfiguration.LdapConfig ldapConfig,
+                                              CloudConfiguration.StepCerts stepCerts,
+                                              CloudConfiguration.Keycloak keycloak) {
+        return GcpCloudSettings.builder()
+                .projectId(cloudConfiguration.getGcpProjectId())
+                .vpcName(cloudConfiguration.getVpcId())
+                .subnetName(cloudConfiguration.getSubnetId())
+                .zone(cloudConfiguration.getZone())
+                .region(cloudConfiguration.getRegion())
+                .ldapDn(ldapConfig.getDn())
+                .ldapHost(ldapConfig.getHost())
+                .ldapOu(ldapConfig.getOu())
+                .ldapUser(ldapConfig.getUser())
+                .ldapPassword(ldapConfig.getPassword())
+                .sbn(cloudConfiguration.getServiceBaseName())
+                .cloud(conf.getCloudProvider().getName())
+                .os(cloudConfiguration.getOs())
+                .confKeyDir(cloudConfiguration.getConfKeyDir())
+                .gcpIamUser(settings.getIamUser())
+                .imageEnabled(String.valueOf(cloudConfiguration.isImageEnabled()))
+                .stepCertsEnabled(String.valueOf(stepCerts.isEnabled()))
+                .stepCertsRootCA(stepCerts.getRootCA())
+                .stepCertsKid(stepCerts.getKid())
+                .stepCertsKidPassword(stepCerts.getKidPassword())
+                .stepCertsCAURL(stepCerts.getCaURL())
+                .keycloakAuthServerUrl(keycloak.getAuthServerUrl())
+                .keycloakRealmName(keycloak.getRealmName())
+                .keycloakUser(keycloak.getUser())
+                .keycloakUserPassword(keycloak.getUserPassword())
+                .build();
+    }
+
+    private AwsCloudSettings awsCloudSettings(CloudSettings settings, CloudConfiguration cloudConfiguration,
+                                              CloudConfiguration.LdapConfig ldapConfig,
+                                              CloudConfiguration.StepCerts stepCerts,
+                                              CloudConfiguration.Keycloak keycloak) {
+        return AwsCloudSettings.builder()
+                .awsRegion(cloudConfiguration.getRegion())
+                .awsSecurityGroupIds(cloudConfiguration.getSecurityGroupIds())
+                .awsSubnetId(cloudConfiguration.getSubnetId())
+                .awsVpcId(cloudConfiguration.getVpcId())
+                .confTagResourceId(cloudConfiguration.getConfTagResourceId())
+                .awsNotebookSubnetId(cloudConfiguration.getNotebookSubnetId())
+                .awsNotebookVpcId(cloudConfiguration.getNotebookVpcId())
+                .awsIamUser(settings.getIamUser())
+                .zone(cloudConfiguration.getZone())
+                .ldapDn(ldapConfig.getDn())
+                .ldapHost(ldapConfig.getHost())
+                .ldapOu(ldapConfig.getOu())
+                .ldapUser(ldapConfig.getUser())
+                .ldapPassword(ldapConfig.getPassword())
+                .sbn(cloudConfiguration.getServiceBaseName())
+                .cloud(conf.getCloudProvider().getName())
+                .os(cloudConfiguration.getOs())
+                .confKeyDir(cloudConfiguration.getConfKeyDir())
+                .imageEnabled(String.valueOf(cloudConfiguration.isImageEnabled()))
+                .stepCertsEnabled(String.valueOf(stepCerts.isEnabled()))
+                .stepCertsRootCA(stepCerts.getRootCA())
+                .stepCertsKid(stepCerts.getKid())
+                .stepCertsKidPassword(stepCerts.getKidPassword())
+                .stepCertsCAURL(stepCerts.getCaURL())
+                .keycloakAuthServerUrl(keycloak.getAuthServerUrl())
+                .keycloakRealmName(keycloak.getRealmName())
+                .keycloakUser(keycloak.getUser())
+                .keycloakUserPassword(keycloak.getUserPassword())
+                .build();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandExecutor.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandExecutor.java
new file mode 100644
index 0000000..dee78ea
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandExecutor.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import com.epam.datalab.process.model.DatalabProcess;
+import com.epam.datalab.process.model.ProcessId;
+import com.epam.datalab.process.model.ProcessInfo;
+import com.google.inject.Singleton;
+
+@Singleton
+public class CommandExecutor implements ICommandExecutor {
+
+    public ProcessInfo executeSync(final String username, final String uuid, String command) throws Exception {
+        return DatalabProcess.getInstance().start(new ProcessId(username, uuid), "bash", "-c", command).get();
+
+    }
+
+    public void executeAsync(final String username, final String uuid, final String command) {
+        DatalabProcess.getInstance().start(new ProcessId(username, uuid), "bash", "-c", command);
+    }
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandExecutorMock.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandExecutorMock.java
new file mode 100644
index 0000000..33bd495
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandExecutorMock.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.process.builder.ProcessInfoBuilder;
+import com.epam.datalab.process.model.ProcessId;
+import com.epam.datalab.process.model.ProcessInfo;
+import com.google.common.collect.Lists;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+public class CommandExecutorMock implements ICommandExecutor {
+    private static final Logger LOGGER = LoggerFactory.getLogger(CommandExecutorMock.class);
+    public static final String DOCKER_DATALAB_DATAENGINE = "docker.datalab-dataengine:latest";
+    public static final String DOCKER_DATALAB_DATAENGINE_SERVICE = "docker.datalab-dataengine-service:latest";
+
+    private CommandExecutorMockAsync execAsync = null;
+    private CompletableFuture<Boolean> future;
+
+    private CloudProvider cloudProvider;
+
+    public CommandExecutorMock(CloudProvider cloudProvider) {
+        this.cloudProvider = cloudProvider;
+    }
+
+    /**
+     * Return result of execution.
+     *
+     * @throws ExecutionException
+     * @throws InterruptedException
+     */
+    public boolean getResultSync() throws InterruptedException, ExecutionException {
+        return (future == null ? true : future.get());
+    }
+
+    /**
+     * Return variables for substitution into Json response file.
+     */
+    public Map<String, String> getVariables() {
+        return (execAsync == null ? null : execAsync.getParser().getVariables());
+    }
+
+    /**
+     * Response file name.
+     */
+    public String getResponseFileName() {
+        return (execAsync == null ? null : execAsync.getResponseFileName());
+    }
+
+    @Override
+    public ProcessInfo executeSync(String user, String uuid, String command) {
+        LOGGER.debug("Run OS command for user {} with UUID {}: {}", user, uuid, command);
+        ProcessInfoBuilder builder = new ProcessInfoBuilder(new ProcessId(user, command), 1000l);
+        if (command.startsWith("docker images |")) {
+            List<String> list = Lists.newArrayList(
+                    "docker.datalab-deeplearning:latest",
+                    "docker.datalab-jupyter:latest",
+                    "docker.datalab-jupyterlab:latest",
+                    "docker.datalab-superset:latest",
+                    "docker.datalab-rstudio:latest",
+                    "docker.datalab-tensor:latest",
+                    "docker.datalab-zeppelin:latest",
+                    "docker.datalab-tensor-rstudio:latest");
+
+            list.addAll(getComputationalDockerImage());
+
+            ProcessInfoBuilder.stdOut(builder, String.join("\n", list));
+        }
+        return builder.get();
+    }
+
+    @Override
+    public void executeAsync(String user, String uuid, String command) {
+        execAsync = new CommandExecutorMockAsync(user, uuid, command, cloudProvider);
+        future = CompletableFuture.supplyAsync(execAsync);
+    }
+
+    private List<String> getComputationalDockerImage() {
+        switch (cloudProvider) {
+            case AWS:
+                return Lists.newArrayList(DOCKER_DATALAB_DATAENGINE_SERVICE, DOCKER_DATALAB_DATAENGINE);
+            case AZURE:
+                return Lists.newArrayList(DOCKER_DATALAB_DATAENGINE);
+            case GCP:
+                return Lists.newArrayList(DOCKER_DATALAB_DATAENGINE_SERVICE, DOCKER_DATALAB_DATAENGINE);
+            default:
+                throw new IllegalArgumentException("Unsupported cloud provider " + cloudProvider);
+        }
+    }
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandExecutorMockAsync.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandExecutorMockAsync.java
new file mode 100644
index 0000000..b65d891
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandExecutorMockAsync.java
@@ -0,0 +1,407 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.exploratory.LibInstallDTO;
+import com.epam.datalab.dto.exploratory.LibStatus;
+import com.epam.datalab.dto.status.EnvResource;
+import com.epam.datalab.dto.status.EnvResourceList;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.util.SecurityUtils;
+import com.epam.datalab.util.ServiceUtils;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
+import com.google.common.io.ByteStreams;
+import com.google.common.io.Files;
+import com.google.common.io.Resources;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.Charsets;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Supplier;
+
+@Slf4j
+public class CommandExecutorMockAsync implements Supplier<Boolean> {
+    private static final String JSON_FILE_ENDING = ".json";
+
+    private static final ObjectMapper MAPPER = new ObjectMapper()
+            .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true)
+            .setSerializationInclusion(JsonInclude.Include.NON_NULL);
+
+    private String user;
+    private String uuid;
+    private String command;
+
+    private CommandParserMock parser = new CommandParserMock();
+    private String responseFileName;
+
+    private CloudProvider cloudProvider;
+
+    public CommandExecutorMockAsync(String user, String uuid, String command, CloudProvider cloudProvider) {
+        this.user = user;
+        this.uuid = uuid;
+        this.command = command;
+        this.cloudProvider = cloudProvider;
+    }
+
+    @Override
+    public Boolean get() {
+        try {
+            run();
+        } catch (Exception e) {
+            log.error("Command with UUID {} fails: {}", uuid, e.getLocalizedMessage(), e);
+            return false;
+        }
+        return true;
+    }
+
+
+    /**
+     * Return parser of command line.
+     */
+    public CommandParserMock getParser() {
+        return parser;
+    }
+
+    /**
+     * Return variables for substitution into Json response file.
+     */
+    public Map<String, String> getVariables() {
+        return parser.getVariables();
+    }
+
+    /**
+     * Response file name.
+     */
+    public String getResponseFileName() {
+        return responseFileName;
+    }
+
+    public void run() {
+        log.debug("Run OS command for user {} with UUID {}: {}", user, uuid, SecurityUtils.hideCreds(command));
+
+        responseFileName = null;
+        parser = new CommandParserMock(command, uuid);
+        log.debug("Parser is {}", SecurityUtils.hideCreds(parser.toString()));
+        DockerAction action = DockerAction.of(parser.getAction());
+        log.debug("Action is {}", action);
+
+        if (parser.isDockerCommand()) {
+            if (action == null) {
+                throw new DatalabException("Docker action not defined");
+            }
+
+            sleep(500);
+
+            try {
+                switch (action) {
+                    case DESCRIBE:
+                        describe();
+                        break;
+                    case CREATE:
+                    case RECREATE:
+                    case START:
+                    case STOP:
+                    case TERMINATE:
+                    case GIT_CREDS:
+                    case CREATE_IMAGE:
+                    case RECONFIGURE_SPARK:
+                    case CHECK_INACTIVITY:
+                        action(user, action);
+                        break;
+                    case CONFIGURE:
+                    case REUPLOAD_KEY:
+                        sleep(1000);
+                        action(user, action);
+                        break;
+                    case STATUS:
+                        parser.getVariables().put("list_resources", getResponseStatus(true));
+                        action(user, action);
+                        break;
+                    case LIB_LIST:
+                        action(user, action);
+                        copyFile(String.format("mock_response/%s/notebook_lib_list_pkgs.json",
+                                cloudProvider.getName()),
+                                String.join("_", "notebook", uuid, "all_pkgs") +
+                                        JSON_FILE_ENDING, parser.getResponsePath());
+                        break;
+                    case LIB_INSTALL:
+                        parser.getVariables().put("lib_install", getResponseLibInstall(true));
+                        action(user, action);
+                        break;
+                    default:
+                        break;
+                }
+            } catch (Exception e) {
+                String msg = "Cannot execute command for user " + user + " with UUID " + uuid + ". " +
+                        e.getLocalizedMessage();
+                log.error(msg, e);
+                throw new DatalabException(msg, e);
+            }
+        } else {
+            final String scriptName = StringUtils.substringBefore(Paths.get(parser.getCommand()).getFileName()
+                    .toString(), ".");
+            String templateFileName = "mock_response/" + cloudProvider.getName() + '/' + scriptName + JSON_FILE_ENDING;
+            responseFileName = getAbsolutePath(parser.getResponsePath(), scriptName + user + "_" +
+                    parser.getRequestId() + JSON_FILE_ENDING);
+            setResponse(templateFileName, responseFileName);
+        }
+
+    }
+
+    private void sleep(int ms) {
+        try {
+            Thread.sleep(ms);
+        } catch (InterruptedException e) {
+            log.error("InterruptedException occurred: {}", e.getMessage());
+            Thread.currentThread().interrupt();
+        }
+    }
+
+    private static void copyFile(String sourceFilePath, String destinationFileName, String destinationFolder) throws
+            IOException {
+        File to = new File(getAbsolutePath(destinationFolder, destinationFileName));
+
+        try (InputStream inputStream =
+                     CommandExecutorMockAsync.class.getClassLoader().getResourceAsStream(sourceFilePath);
+             OutputStream outputStream = new FileOutputStream(to)) {
+            ByteStreams.copy(inputStream, outputStream);
+        }
+
+        log.debug("File {} copied to {}", sourceFilePath, to);
+    }
+
+    /**
+     * Return absolute path to the file or folder.
+     *
+     * @param first part of path.
+     * @param more  next path components.
+     */
+    private static String getAbsolutePath(String first, String... more) {
+        return Paths.get(first, more).toAbsolutePath().toString();
+    }
+
+    /**
+     * Tests the directory exists.
+     *
+     * @param dir the name of directory.
+     * @return <b>true</b> if the directory exists otherwise return <b>false</b>.
+     */
+    private boolean dirExists(String dir) {
+        File file = new File(dir);
+        return (file.exists() && file.isDirectory());
+    }
+
+    /**
+     * Find and return the directory "infrastructure-provisioning/src".
+     *
+     * @throws FileNotFoundException may be thrown
+     */
+    private String findTemplatesDir() throws FileNotFoundException {
+        String dir = System.getProperty("docker.dir");
+
+        if (dir != null) {
+            dir = getAbsolutePath(dir);
+            if (dirExists(dir)) {
+                return dir;
+            }
+            throw new FileNotFoundException("Directory \"" + dir + "\" not found. " +
+                    "Please set JVM argument -Ddocker.dir to the " +
+                    "\".../infrastructure-provisioning/src/general/files/" + cloudProvider.getName() + "\" directory");
+        }
+        dir = getAbsolutePath(
+                ".",
+                "../../infrastructure-provisioning/src/general/files/" + cloudProvider.getName());
+        if (dirExists(dir)) {
+            return dir;
+        }
+        dir = getAbsolutePath(
+                ServiceUtils.getUserDir(),
+                "../../infrastructure-provisioning/src/general/files/" + cloudProvider.getName());
+        if (dirExists(dir)) {
+            return dir;
+        }
+        throw new FileNotFoundException("Directory \"" + dir + "\" not found. " +
+                "Please set the value docker.dir property to the " +
+                "\".../infrastructure-provisioning/src/general/files/" + cloudProvider.getName() + "\" directory");
+    }
+
+    /**
+     * Describe action.
+     */
+    private void describe() {
+        String templateFileName;
+        try {
+            templateFileName = getAbsolutePath(findTemplatesDir(), parser.getImageType() + "_description.json");
+        } catch (FileNotFoundException e) {
+            throw new DatalabException("Cannot describe image " + parser.getImageType() + ". " + e.getLocalizedMessage(),
+                    e);
+        }
+        responseFileName = getAbsolutePath(parser.getResponsePath(), parser.getRequestId() + JSON_FILE_ENDING);
+
+        log.debug("Create response file from {} to {}", templateFileName, responseFileName);
+        File fileResponse = new File(responseFileName);
+        File fileTemplate = new File(templateFileName);
+        try {
+            if (!fileTemplate.exists()) {
+                throw new FileNotFoundException("File \"" + fileTemplate + "\" not found.");
+            }
+            if (!fileTemplate.canRead()) {
+                throw new IOException("Cannot read file \"" + fileTemplate + "\".");
+            }
+            Files.createParentDirs(fileResponse);
+            Files.copy(fileTemplate, fileResponse);
+        } catch (IOException e) {
+            throw new DatalabException("Can't create response file " + responseFileName + ": " + e.getLocalizedMessage(),
+                    e);
+        }
+    }
+
+    /**
+     * Perform docker action.
+     *
+     * @param user   the name of user.
+     * @param action docker action.
+     */
+    private void action(String user, DockerAction action) {
+        String resourceType = parser.getResourceType();
+
+        String prefixFileName = (Lists.newArrayList("project", "edge", "odahu", "dataengine", "dataengine-service")
+                .contains(resourceType) ? resourceType : "notebook") + "_";
+        String templateFileName = "mock_response/" + cloudProvider.getName() + '/' + prefixFileName +
+                action.toString() + JSON_FILE_ENDING;
+        responseFileName = getAbsolutePath(parser.getResponsePath(), prefixFileName + user + "_" +
+                parser.getRequestId() + JSON_FILE_ENDING);
+        setResponse(templateFileName, responseFileName);
+    }
+
+    /**
+     * Return the section of resource statuses for docker action status.
+     */
+    private String getResponseStatus(boolean noUpdate) {
+        if (noUpdate) {
+            return "{}";
+        }
+        EnvResourceList resourceList;
+        try {
+            JsonNode json = MAPPER.readTree(parser.getJson());
+            json = json.get("edge_list_resources");
+            resourceList = MAPPER.readValue(json.toString(), EnvResourceList.class);
+        } catch (IOException e) {
+            throw new DatalabException("Can't parse json content: " + e.getLocalizedMessage(), e);
+        }
+
+        if (resourceList.getHostList() != null) {
+            for (EnvResource host : resourceList.getHostList()) {
+                host.setStatus(UserInstanceStatus.RUNNING.toString());
+            }
+        }
+        if (resourceList.getClusterList() != null) {
+            for (EnvResource host : resourceList.getClusterList()) {
+                host.setStatus(UserInstanceStatus.RUNNING.toString());
+            }
+        }
+
+        try {
+            return MAPPER.writeValueAsString(resourceList);
+        } catch (JsonProcessingException e) {
+            throw new DatalabException("Can't generate json content: " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Return the section of resource statuses for docker action status.
+     */
+    private String getResponseLibInstall(boolean isSuccess) {
+        List<LibInstallDTO> list;
+        try {
+            JsonNode json = MAPPER.readTree(parser.getJson());
+            json = json.get("libs");
+            list = MAPPER.readValue(json.toString(), new TypeReference<List<LibInstallDTO>>() {
+            });
+        } catch (IOException e) {
+            throw new DatalabException("Can't parse json content: " + e.getLocalizedMessage(), e);
+        }
+
+        for (LibInstallDTO lib : list) {
+            if (isSuccess) {
+                lib.setStatus(LibStatus.INSTALLED.toString());
+            } else {
+                lib.setStatus(LibStatus.INSTALLATION_ERROR.toString());
+                lib.setErrorMessage("Mock error message");
+            }
+        }
+
+        try {
+            return MAPPER.writeValueAsString(list);
+        } catch (JsonProcessingException e) {
+            throw new DatalabException("Can't generate json content: " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Write response file.
+     *
+     * @param sourceFileName template file name.
+     * @param targetFileName response file name.
+     */
+    private void setResponse(String sourceFileName, String targetFileName) {
+        String content;
+        URL url = Resources.getResource(sourceFileName);
+        try {
+            content = Resources.toString(url, Charsets.UTF_8);
+        } catch (IOException e) {
+            throw new DatalabException("Can't read resource " + sourceFileName + ": " + e.getLocalizedMessage(), e);
+        }
+
+        for (String key : parser.getVariables().keySet()) {
+            String value = parser.getVariables().get(key);
+            content = content.replace("${" + key.toUpperCase() + "}", value);
+        }
+
+        File fileResponse = new File(responseFileName);
+        try (BufferedWriter out = new BufferedWriter(new FileWriter(fileResponse))) {
+            Files.createParentDirs(fileResponse);
+            out.write(content);
+        } catch (IOException e) {
+            throw new DatalabException("Can't write response file " + targetFileName + ": " + e.getLocalizedMessage(), e);
+        }
+        log.debug("Create response file from {} to {}", sourceFileName, targetFileName);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandParserMock.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandParserMock.java
new file mode 100644
index 0000000..e61f06b
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/CommandParserMock.java
@@ -0,0 +1,375 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import com.epam.datalab.exceptions.DatalabException;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.MoreObjects;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Parse command for emulate commands of Docker.
+ */
+public class CommandParserMock {
+    private ObjectMapper MAPPER = new ObjectMapper()
+            .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true)
+            .setSerializationInclusion(JsonInclude.Include.NON_NULL);
+
+    private String command;
+    private String action;
+    private String resourceType;
+    private String imageType;
+    private String requestId;
+    private String responsePath;
+    private String name;
+    private String json;
+    private Map<String, String> envMap = new HashMap<>();
+    private Map<String, String> varMap = new HashMap<>();
+    private List<String> otherArgs = new ArrayList<>();
+    private Map<String, String> variables = new HashMap<>();
+    private boolean dockerCommand;
+
+    public CommandParserMock() {
+    }
+
+    public CommandParserMock(String command, String uuid) {
+        parse(command, uuid);
+    }
+
+
+    /**
+     * Return the name of docker command.
+     */
+    public String getCommand() {
+        return command;
+    }
+
+    /**
+     * Return the name of docker action.
+     */
+    public String getAction() {
+        return action;
+    }
+
+    /**
+     * Return the type of resource.
+     */
+    public String getResourceType() {
+        return resourceType;
+    }
+
+    /**
+     * Return the image type.
+     */
+    public String getImageType() {
+        return imageType;
+    }
+
+    /**
+     * Return the request id.
+     */
+    public String getRequestId() {
+        return requestId;
+    }
+
+    /**
+     * Return the path for response files.
+     */
+    public String getResponsePath() {
+        return responsePath;
+    }
+
+    /**
+     * Return name of docker container.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Return content of Json if present otherwise <b>null</b>.
+     */
+    public String getJson() {
+        return json;
+    }
+
+    /**
+     * Return map of environment variables.
+     */
+    public Map<String, String> getVariables() {
+        return variables;
+    }
+
+    /**
+     * Add argument to list.
+     *
+     * @param args list of arguments.
+     * @param arg  argument.
+     */
+    private void addArgToList(List<String> args, String arg) {
+        if (arg == null) {
+            return;
+        }
+        if (arg.length() > 1) {
+            if (arg.startsWith("'") && arg.endsWith("'")) {
+                arg = arg.substring(1, arg.length() - 1);
+            }
+            if (arg.startsWith("\"") && arg.endsWith("\"")) {
+                arg = arg.substring(1, arg.length() - 1);
+            }
+        }
+        arg = arg.trim();
+        if (arg.isEmpty()) {
+            return;
+        }
+
+        args.add(arg);
+    }
+
+    /**
+     * Extract arguments from command line.
+     *
+     * @param cmd command line.
+     * @return List of arguments.
+     */
+    private List<String> extractArgs(String cmd) {
+        boolean isQuote = false;
+        boolean isDoubleQuote = false;
+        List<String> args = new ArrayList<>();
+        int pos = 0;
+
+        for (int i = 0; i < cmd.length(); i++) {
+            final char c = cmd.charAt(i);
+            if (c == '\'') {
+                isQuote = !isQuote;
+                continue;
+            }
+            if (c == '"') {
+                isDoubleQuote = !isDoubleQuote;
+                continue;
+            }
+
+            if (!isQuote && !isDoubleQuote && c == ' ') {
+                addArgToList(args, cmd.substring(pos, i));
+                pos = i + 1;
+            }
+        }
+        if (!isQuote && !isDoubleQuote) {
+            addArgToList(args, cmd.substring(pos));
+        }
+
+        return args;
+    }
+
+    /**
+     * Return the value of argument.
+     *
+     * @param args    list of arguments.
+     * @param index   index of named arguments
+     * @param argName name of argument.
+     */
+    private String getArgValue(List<String> args, int index, String argName) {
+        if (!args.get(index).equals(argName)) {
+            return null;
+        }
+        args.remove(index);
+        if (index < args.size()) {
+            String value = args.get(index);
+            args.remove(index);
+            return value;
+        }
+        throw new DatalabException("Argument \"" + argName + "\" detected but not have value");
+    }
+
+    /**
+     * Return pair name/value separated.
+     *
+     * @param argName   name of argument.
+     * @param value     value.
+     * @param separator separator.
+     */
+    private Pair<String, String> getPair(String argName, String value, String separator) {
+        String[] array = value.split(separator);
+        if (array.length == 2) {
+            return new ImmutablePair<>(array[0], array[1]);
+        } else if (array.length == 3) {
+            return new ImmutablePair<>(array[1], array[2]);
+        }
+        throw new DatalabException("Invalid value for \"" + argName + "\": " + value);
+    }
+
+    /**
+     * Return name of docker image.
+     *
+     * @param args list of arguments.
+     * @throws if image name not found.
+     */
+    public static String getImageName(List<String> args) {
+        for (String s : args) {
+            if (s.startsWith("docker.datalab-")) {
+                return s;
+            }
+        }
+        throw new DatalabException("Name of docker image not found");
+    }
+
+    /**
+     * Extract Json properties from Json content.
+     *
+     * @param jsonContent Json content.
+     * @return
+     */
+    private Map<String, String> getJsonVariables(String jsonContent) {
+        Map<String, String> vars = new HashMap<>();
+        if (jsonContent == null) {
+            return vars;
+        }
+
+        JsonNode json;
+        try {
+            json = MAPPER.readTree(jsonContent);
+        } catch (IOException e) {
+            throw new DatalabException("Can't parse json content: " + e.getLocalizedMessage(), e);
+        }
+
+        Iterator<String> keys = json.fieldNames();
+        while (keys.hasNext()) {
+            String key = keys.next();
+            String value = getTextValue(json.get(key));
+            if (value != null) {
+                vars.put(key, value);
+            }
+        }
+        return vars;
+    }
+
+    /**
+     * Return the value of json property or <b>null</b>.
+     *
+     * @param jsonNode - Json node.
+     */
+    private String getTextValue(JsonNode jsonNode) {
+        return jsonNode != null ? jsonNode.textValue() : null;
+    }
+
+    /**
+     * Parse command line.
+     *
+     * @param cmd command line.
+     */
+    public void parse(String cmd, String uuid) {
+        command = null;
+        action = null;
+        resourceType = null;
+        imageType = null;
+        requestId = uuid;
+        responsePath = null;
+        name = null;
+        json = null;
+
+        envMap.clear();
+        varMap.clear();
+        otherArgs.clear();
+        variables.clear();
+
+        List<String> args = extractArgs(cmd);
+        dockerCommand = args.contains("docker");
+        int i = 0;
+        String s;
+        Pair<String, String> p;
+
+        while (i < args.size()) {
+            if ((s = getArgValue(args, i, "-v")) != null) {
+                p = getPair("-v", s, ":");
+                varMap.put(p.getValue(), p.getKey());
+            } else if ((s = getArgValue(args, i, "-e")) != null) {
+                p = getPair("-e", s, "=");
+                envMap.put(p.getKey(), p.getValue());
+            } else if ((s = getArgValue(args, i, "docker")) != null || (s = getArgValue(args, i, "python")) != null) {
+                command = s;
+            } else if ((s = getArgValue(args, i, "--action")) != null) {
+                action = s;
+            } else if ((s = getArgValue(args, i, "--name")) != null) {
+                name = s;
+            } else if ((s = getArgValue(args, i, "echo")) != null) {
+                if (s.equals("-e")) {
+                    if (i >= args.size()) {
+                        throw new DatalabException("Argument \"echo -e\" detected but not have value");
+                    }
+                    s = args.get(i);
+                    args.remove(i);
+                }
+                json = s;
+            } else if ((s = getArgValue(args, i, "--result_path")) != null) {
+                responsePath = s;
+                varMap.put("/response", responsePath);
+                args.remove(i);
+            } else {
+                i++;
+            }
+        }
+
+        if (args.size() > 0) {
+            otherArgs.addAll(args);
+        }
+
+        resourceType = envMap.get("conf_resource");
+        if (isDockerCommand()) {
+            imageType = getImageName(args);
+            imageType = imageType.replace("docker.datalab-", "").replace(":latest", "");
+        }
+        responsePath = varMap.get("/response");
+
+        variables.putAll(envMap);
+        variables.putAll(getJsonVariables(json));
+        variables.put("request_id", requestId);
+        variables.put("instance_id", "i-" + requestId.replace("-", "").substring(0, 17));
+        variables.put("cluster_id", "j-" + requestId.replace("-", "").substring(0, 13).toUpperCase());
+        variables.put("notebook_id", requestId.replace("-", "").substring(17, 22));
+    }
+
+    public boolean isDockerCommand() {
+        return dockerCommand;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("command", command)
+                .add("action", action)
+                .add("resourceType", resourceType)
+                .add("imageType", imageType)
+                .add("requestId", requestId)
+                .add("responsePath", responsePath)
+                .add("name", name)
+                .add("environment", envMap)
+                .add("variable", varMap)
+                .add("others", otherArgs)
+                .add("json", json)
+                .toString();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/DockerAction.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/DockerAction.java
new file mode 100644
index 0000000..d61bac6
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/DockerAction.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+public enum DockerAction {
+	DESCRIBE,
+	CREATE,
+	RECREATE,
+	START,
+	CONFIGURE,
+	RUN,
+	STOP,
+	TERMINATE,
+	LIB_LIST,
+	LIB_INSTALL,
+	GIT_CREDS,
+	CREATE_IMAGE,
+	STATUS,
+    REUPLOAD_KEY,
+    RECONFIGURE_SPARK,
+    CHECK_INACTIVITY;
+
+    public static DockerAction of(String action) {
+        if (action != null) {
+            for (DockerAction uis : DockerAction.values()) {
+                if (action.equalsIgnoreCase(uis.toString())) {
+                    return uis;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return super.toString().toLowerCase();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/DockerCommands.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/DockerCommands.java
new file mode 100644
index 0000000..0d4b8dd
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/DockerCommands.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.util.UUID;
+
+@FunctionalInterface
+public interface DockerCommands {
+    String GET_IMAGES = new ImagesDockerCommand()
+            .pipe(UnixCommand.awk("{print $1\":\"$2}"))
+            .pipe(UnixCommand.sort())
+            .pipe(UnixCommand.uniq())
+            .pipe(UnixCommand.grep("datalab"))
+            .pipe(UnixCommand.grep("none", "-v"))
+            .pipe(UnixCommand.grep("base", "-v"))
+            .pipe(UnixCommand.grep("ssn", "-v"))
+            .pipe(UnixCommand.grep("edge", "-v"))
+            .pipe(UnixCommand.grep("project", "-v"))
+            .toCMD();
+
+    String GET_RUNNING_CONTAINERS_FOR_USER = "docker ps --format \"{{.Names}}\" -f name=%s";
+
+    ObjectMapper MAPPER = new ObjectMapper()
+            .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true)
+            .configure(JsonParser.Feature.ALLOW_COMMENTS, true);
+
+    static String generateUUID() {
+        return UUID.randomUUID().toString();
+    }
+
+    static String extractUUID(String fileName) {
+        int beginIndex = fileName.lastIndexOf('_');
+        int endIndex = fileName.lastIndexOf('.');
+        beginIndex = beginIndex < 0 ? 0 : beginIndex + 1;
+        if (endIndex < 0) {
+            endIndex = fileName.length();
+        }
+        if (beginIndex > endIndex) {
+            beginIndex = endIndex;
+        }
+        return fileName.substring(beginIndex, endIndex);
+    }
+
+    default String nameContainer(String... names) {
+        return String.join("_", names) + "_" + System.currentTimeMillis();
+    }
+
+    String getResourceType();
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/ICommandExecutor.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/ICommandExecutor.java
new file mode 100644
index 0000000..3054492
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/ICommandExecutor.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import com.epam.datalab.process.model.ProcessInfo;
+
+public interface ICommandExecutor {
+    ProcessInfo executeSync(String username, String uuid, String command) throws Exception;
+
+    void executeAsync(String username, String uuid, String command);
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/ImagesDockerCommand.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/ImagesDockerCommand.java
new file mode 100644
index 0000000..773f206
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/ImagesDockerCommand.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class ImagesDockerCommand implements CmdCommand {
+    private String command = "docker images";
+
+    private List<UnixCommand> unixCommands;
+
+    public ImagesDockerCommand pipe(UnixCommand unixCommand) {
+        if (unixCommands == null) {
+            unixCommands = new LinkedList<>();
+        }
+        unixCommands.add(unixCommand);
+        return this;
+    }
+
+    @Override
+    public String toCMD() {
+        StringBuilder sb = new StringBuilder(command);
+        if (unixCommands != null) {
+            for (UnixCommand unixCommand : unixCommands) {
+                sb.append(" | ").append(unixCommand.getCommand());
+            }
+        }
+        return sb.toString();
+    }
+
+    @Override
+    public String toString() {
+        return toCMD();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/PythonBackupCommand.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/PythonBackupCommand.java
new file mode 100644
index 0000000..8f1f8ab
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/PythonBackupCommand.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import java.util.List;
+
+public class PythonBackupCommand extends PythonCommand {
+
+    private static final String ARG_DELIMITER = ",";
+    private static final String USER_NAME_SYSTEM_PROPERTY = "user.name";
+
+    public PythonBackupCommand(String fileName) {
+        super(fileName);
+    }
+
+    public PythonBackupCommand withConfig(List<String> configs) {
+        withOption("--config", String.join(ARG_DELIMITER, configs));
+        return this;
+    }
+
+    public PythonBackupCommand withKeys(List<String> keys) {
+        withOption("--keys", String.join(ARG_DELIMITER, keys));
+        return this;
+    }
+
+    public PythonBackupCommand withJars(List<String> jars) {
+        withOption("--jars", String.join(ARG_DELIMITER, jars));
+        return this;
+    }
+
+    public PythonBackupCommand withDBBackup(boolean dbBackup) {
+        if (dbBackup) {
+            withOption("--db");
+        }
+        return this;
+    }
+
+    public PythonBackupCommand withCertificates(List<String> certificates) {
+        withOption("--certs", String.join(ARG_DELIMITER, certificates));
+        return this;
+    }
+
+    public PythonBackupCommand withSystemUser() {
+        withOption("--user", System.getProperty(USER_NAME_SYSTEM_PROPERTY));
+        return this;
+    }
+
+    public PythonBackupCommand withLogsBackup(boolean logsBackup) {
+        if (logsBackup) {
+            withOption("--logs");
+        }
+        return this;
+    }
+
+    public PythonBackupCommand withRequestId(String requestId) {
+        withOption("--request_id", requestId);
+        return this;
+    }
+
+    public PythonBackupCommand withResponsePath(String responsePath) {
+        withOption("--result_path", responsePath);
+        return this;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/PythonCommand.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/PythonCommand.java
new file mode 100644
index 0000000..d6a302d
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/PythonCommand.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PythonCommand implements CmdCommand {
+    private static final String PYTHON = "python ";
+    private final String fileName;
+    private List<String> options = new ArrayList<>();
+
+    public PythonCommand(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public PythonCommand withOption(String option) {
+        options.add(option);
+        return this;
+    }
+
+    public PythonCommand withOption(String key, String value) {
+        options.add(key + " " + value);
+        return this;
+    }
+
+    @Override
+    public String toCMD() {
+        return PYTHON + fileName + StringUtils.SPACE + String.join(StringUtils.SPACE, options);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/RunDockerCommand.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/RunDockerCommand.java
new file mode 100644
index 0000000..3643bad
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/RunDockerCommand.java
@@ -0,0 +1,286 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import java.nio.file.Paths;
+import java.util.LinkedList;
+import java.util.List;
+
+public class RunDockerCommand implements CmdCommand {
+    public static final String EDGE_USER_NAME_FORMAT = "-e \"edge_user_name=%s\"";
+    private final String command = "docker run";
+    private final List<String> options = new LinkedList<>();
+    private String image;
+    private DockerAction action;
+
+    private static final String ROOT_KEYS_PATH = "/root/keys";
+    private static final String RESPONSE_PATH = "/response";
+    private static final String LOG_PATH = "/logs";
+    private static final String AZURE_AUTH_FILE = "/root/azure_auth.json";
+
+    public RunDockerCommand withVolume(String hostSrcPath, String bindPath) {
+        options.add(String.format("-v %s:%s", hostSrcPath, bindPath));
+        return this;
+    }
+
+    public RunDockerCommand withVolumeForRootKeys(String hostSrcPath) {
+        return withVolume(hostSrcPath, ROOT_KEYS_PATH);
+    }
+
+    public RunDockerCommand withVolumeForResponse(String hostSrcPath) {
+        return withVolume(hostSrcPath, RESPONSE_PATH);
+    }
+
+    public RunDockerCommand withVolumeFoAzureAuthFile(String hostSrcPath) {
+        return withVolume(hostSrcPath, AZURE_AUTH_FILE);
+    }
+
+    public RunDockerCommand withVolumeForLog(String hostSrcPath, String logDirectory) {
+        return withVolume(Paths.get(hostSrcPath, logDirectory).toString(),
+                Paths.get(LOG_PATH, logDirectory).toString());
+    }
+
+    public RunDockerCommand withName(String name) {
+        options.add(String.format("--name %s", name));
+        return this;
+    }
+
+    public RunDockerCommand withRequestId(String requestId) {
+        options.add(String.format("-e \"request_id=%s\"", requestId));
+        return this;
+    }
+
+    public RunDockerCommand withAtach(String value) {
+        options.add(String.format("-a %s", value));
+        return this;
+    }
+
+    public RunDockerCommand withInteractive() {
+        options.add("-i");
+        return this;
+    }
+
+    public RunDockerCommand withDetached() {
+        options.add("-d");
+        return this;
+    }
+
+    public RunDockerCommand withPseudoTTY() {
+        options.add("-t");
+        return this;
+    }
+
+    public RunDockerCommand withImage(String image) {
+        this.image = image;
+        return this;
+    }
+
+    public RunDockerCommand withAction(DockerAction action) {
+        this.action = action;
+        return this;
+    }
+
+    public RunDockerCommand withActionDescribe(String toDescribe) {
+        this.image = toDescribe;
+        this.action = DockerAction.DESCRIBE;
+        return this;
+    }
+
+    public RunDockerCommand withActionCreate(String toCreate) {
+        this.image = toCreate;
+        this.action = DockerAction.CREATE;
+        return this;
+    }
+
+    public RunDockerCommand withActionConfigure(String toConfigue) {
+        this.image = toConfigue;
+        this.action = DockerAction.CONFIGURE;
+        return this;
+    }
+
+    public RunDockerCommand withActionStatus(String toStatus) {
+        this.options.add("--label edge_status");
+        this.image = toStatus;
+        this.action = DockerAction.STATUS;
+        return this;
+    }
+
+    public RunDockerCommand withActionStart(String toStart) {
+        this.image = toStart;
+        this.action = DockerAction.START;
+        return this;
+    }
+
+    public RunDockerCommand withActionRun(String toRun) {
+        this.image = toRun;
+        this.action = DockerAction.RUN;
+        return this;
+    }
+
+    public RunDockerCommand withActionTerminate(String toTerminate) {
+        this.image = toTerminate;
+        this.action = DockerAction.TERMINATE;
+        return this;
+    }
+
+    public RunDockerCommand withActionStop(String toStop) {
+        this.image = toStop;
+        this.action = DockerAction.STOP;
+        return this;
+    }
+
+    public RunDockerCommand withConfKeyName(String confKeyName) {
+        options.add(String.format("-e \"conf_key_name=%s\"", confKeyName));
+        return this;
+    }
+
+    public RunDockerCommand withConfServiceBaseName(String confServiceBaseName) {
+        options.add(String.format("-e \"conf_service_base_name=%s\"", confServiceBaseName));
+        return this;
+    }
+
+    public RunDockerCommand withConfOsFamily(String confOsFamily) {
+        options.add(String.format("-e \"conf_os_family=%s\"", confOsFamily));
+        return this;
+    }
+
+    public RunDockerCommand withEmrInstanceCount(String emrInstanceCount) {
+        options.add(String.format("-e \"emr_instance_count=%s\"", emrInstanceCount));
+        return this;
+    }
+
+    public RunDockerCommand withAwsVpcId(String awsVpcId) {
+        options.add(String.format("-e \"aws_vpc_id=%s\"", awsVpcId));
+        return this;
+    }
+
+    public RunDockerCommand withAwsSubnetId(String awsSubnetId) {
+        options.add(String.format("-e \"aws_subnet_id=%s\"", awsSubnetId));
+        return this;
+    }
+
+    public RunDockerCommand withEmrInstanceType(String emrInstanceType) {
+        options.add(String.format("-e \"emr_instance_type=%s\"", emrInstanceType));
+        return this;
+    }
+
+    public RunDockerCommand withEmrVersion(String emrVersion) {
+        options.add(String.format("-e \"emr_version=%s\"", emrVersion));
+        return this;
+    }
+
+    public RunDockerCommand withEmrTimeout(String emrTimeout) {
+        options.add(String.format("-e \"emr_timeout=%s\"", emrTimeout));
+        return this;
+    }
+
+    public RunDockerCommand withEc2Role(String ec2Role) {
+        options.add(String.format("-e \"ec2_role=%s\"", ec2Role));
+        return this;
+    }
+
+    public RunDockerCommand withServiceRole(String serviceRole) {
+        options.add(String.format("-e \"service_role=%s\"", serviceRole));
+        return this;
+    }
+
+    public RunDockerCommand withNotebookName(String notebookName) {
+        options.add(String.format("-e \"notebook_name=%s\"", notebookName));
+        return this;
+    }
+
+    public RunDockerCommand withEdgeSubnetCidr(String edgeSubnetCidr) {
+        options.add(String.format("-e \"edge_subnet_cidr=%s\"", edgeSubnetCidr));
+        return this;
+    }
+
+    public RunDockerCommand withAwsRegion(String awsRegion) {
+        options.add(String.format("-e \"aws_region=%s\"", awsRegion));
+        return this;
+    }
+
+    public RunDockerCommand withEdgeUserName(String edgeUserName) {
+        options.add(String.format(EDGE_USER_NAME_FORMAT, edgeUserName));
+        return this;
+    }
+
+    public RunDockerCommand withEmrClusterName(String emrClusterName) {
+        options.add(String.format("-e \"emr_cluster_name=%s\"", emrClusterName));
+        return this;
+    }
+
+    public RunDockerCommand withNotebookUserName(String notebookUserName) {
+        options.add(String.format(EDGE_USER_NAME_FORMAT, notebookUserName));
+        return this;
+    }
+
+    public RunDockerCommand withNotebookSubnetCidr(String notebookSubnetCidr) {
+        options.add(String.format("-e \"notebook_subnet_cidr=%s\"", notebookSubnetCidr));
+        return this;
+    }
+
+    public RunDockerCommand withAwsSecurityGroupsIds(String awsSecurityGroupsIds) {
+        options.add(String.format("-e \"aws_security_groups_ids=%s\"", awsSecurityGroupsIds));
+        return this;
+    }
+
+    public RunDockerCommand withNotebookInstanceName(String notebookInstanceName) {
+        options.add(String.format("-e \"notebook_instance_name=%s\"", notebookInstanceName));
+        return this;
+    }
+
+    public RunDockerCommand withUserKeyName(String userKeyName) {
+        options.add(String.format(EDGE_USER_NAME_FORMAT, userKeyName));
+        return this;
+    }
+
+    public RunDockerCommand withDryRun() {
+        options.add("-e \"dry_run=true\"");
+        return this;
+    }
+
+    public RunDockerCommand withResource(String resourceType) {
+        options.add(String.format("-e \"conf_resource=%s\"", resourceType));
+        return this;
+    }
+
+    public RunDockerCommand withRemove() {
+        options.add("--rm");
+        return this;
+    }
+
+    @Override
+    public String toCMD() {
+        StringBuilder sb = new StringBuilder(command);
+        for (String option : options) {
+            sb.append(" ").append(option);
+        }
+        if (image != null && action != null) {
+            sb.append(" ").append(image).append(" --action ").append(action.toString());
+        }
+        return sb.toString();
+    }
+
+    @Override
+    public String toString() {
+        return toCMD();
+    }
+
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/UnixCommand.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/UnixCommand.java
new file mode 100644
index 0000000..18165cb
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/commands/UnixCommand.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+public class UnixCommand {
+    private String command;
+
+    public UnixCommand(String command) {
+        this.command = command;
+    }
+
+    public static UnixCommand awk(String txt) {
+        return new UnixCommand("awk '" + txt + "'");
+    }
+
+    public static UnixCommand sort() {
+        return new UnixCommand("sort");
+    }
+
+    public static UnixCommand uniq() {
+        return new UnixCommand("uniq");
+    }
+
+    public static UnixCommand grep(String searchFor, String... options) {
+        StringBuilder sb = new StringBuilder("grep");
+        for (String option : options) {
+            sb.append(' ').append(option);
+        }
+        sb.append(" \"" + searchFor + "\"");
+        return new UnixCommand(sb.toString());
+    }
+
+    public String getCommand() {
+        return command;
+    }
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/AsyncFileHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/AsyncFileHandler.java
new file mode 100644
index 0000000..e2fe9c2
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/AsyncFileHandler.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.folderlistener;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import io.dropwizard.util.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.function.Supplier;
+
+import static com.epam.datalab.backendapi.core.Constants.JSON_EXTENSION;
+import static com.epam.datalab.backendapi.core.Constants.LOG_EXTENSION;
+
+/* Handler for the file processing.
+ */
+public final class AsyncFileHandler implements Supplier<Boolean> {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AsyncFileHandler.class);
+
+    /**
+     * File name.
+     */
+    private final String fileName;
+    /**
+     * Directory name.
+     */
+    private final String directory;
+    /**
+     * Implement of the file handler.
+     */
+    private final FileHandlerCallback fileHandlerCallback;
+    /**
+     * Timeout waiting for the file writing.
+     */
+    private final Duration fileLengthCheckDelay;
+
+    /**
+     * Create instance of the file handler.
+     *
+     * @param fileName             file name.
+     * @param directory            directory name.
+     * @param fileHandlerCallback  file handler for processing
+     * @param fileLengthCheckDelay timeout waiting for the file writing.
+     */
+    public AsyncFileHandler(String fileName, String directory, FileHandlerCallback fileHandlerCallback,
+                            Duration fileLengthCheckDelay) {
+        this.fileName = fileName;
+        this.directory = directory;
+        this.fileHandlerCallback = fileHandlerCallback;
+        this.fileLengthCheckDelay = fileLengthCheckDelay;
+    }
+
+    @Override
+    public Boolean get() {
+        Path path = Paths.get(directory, fileName);
+        try {
+            boolean result = fileHandlerCallback.handle(fileName, readBytes(path));
+            if (result) {
+                try {
+                    Files.deleteIfExists(path);
+                    Files.deleteIfExists(getLogFile());
+                    LOGGER.trace("Response {} and log files has been deleted", path.toAbsolutePath());
+                } catch (IOException e) {
+                    LOGGER.warn("Can't delete file {}", path.toAbsolutePath(), e);
+                }
+            }
+            return result;
+        } catch (Exception e) {
+            LOGGER.error("Could not handle file {} async", path.toAbsolutePath(), e);
+            fileHandlerCallback.handleError(e.getLocalizedMessage());
+        }
+        return false;
+    }
+
+    /**
+     * Returns the name of log file.
+     */
+    private Path getLogFile() {
+        return Paths.get(directory, fileName.replaceAll(JSON_EXTENSION, LOG_EXTENSION));
+    }
+
+    /**
+     * Returns the content of file.
+     *
+     * @param path source file.
+     * @return File content.
+     * @throws IOException
+     * @throws InterruptedException
+     */
+    private byte[] readBytes(Path path) throws IOException, InterruptedException {
+        File file = path.toFile();
+        waitFileCompletelyWritten(file);
+        return Files.readAllBytes(path);
+    }
+
+    /**
+     * Waiting for the file writing. This method is blocking and return control when
+     * the file will no longer resize.
+     *
+     * @param file source file.
+     */
+    private void waitFileCompletelyWritten(File file) throws InterruptedException {
+        long before;
+        long after = file.length();
+        do {
+            before = after;
+            Thread.sleep(fileLengthCheckDelay.toMilliseconds());
+            after = file.length();
+        } while (before != after);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListener.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListener.java
new file mode 100644
index 0000000..b936dcd
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListener.java
@@ -0,0 +1,433 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.folderlistener;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.response.folderlistener.WatchItem.ItemStatus;
+import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
+import com.epam.datalab.exceptions.DatalabException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.epam.datalab.backendapi.core.Constants.JSON_EXTENSION;
+
+/**
+ * Listen the directories for the files creation and runs the file processing by {@link AsyncFileHandler}.
+ */
+public class FolderListener implements Runnable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(FolderListener.class);
+    /**
+     * Timeout of the check the file creation in milliseconds.
+     */
+    public static final long LISTENER_TIMEOUT_MILLLIS = 1000;
+    /**
+     * Timeout of the idle for the folder listener in milliseconds.
+     */
+    public static final long LISTENER_IDLE_TIMEOUT_MILLLIS = 600L * 1000L;
+    /**
+     * Timeout of waiting for the directory creation in milliseconds.
+     */
+    private static final long WAIT_DIR_TIMEOUT_MILLIS = 500;
+
+    /**
+     * List of the folder listeners.
+     */
+    private static final List<FolderListener> listeners = new ArrayList<>();
+    /**
+     * Thread of the folder listener.
+     */
+    private Thread thread;
+    /**
+     * List of the file handles.
+     */
+    private WatchItemList itemList;
+    /**
+     * Flag of listening status.
+     */
+    private boolean isListen = false;
+    /**
+     * Time when expired of idle for folder listener in milliseconds.
+     */
+    private long expiredIdleMillis = 0;
+
+
+    private FolderListener() {
+    }
+
+    /**
+     * Creates thread of the folder listener
+     *
+     * @param directoryName Name of directory.
+     * @param dao
+     */
+    private FolderListener(String directoryName, CallbackHandlerDao dao) {
+        itemList = new WatchItemList(directoryName, dao);
+    }
+
+    /**
+     * Appends the file handler for processing to the folder listener and returns instance of the file handler.
+     *
+     * @param directoryName        Name of directory for listen.
+     * @param fileHandlerCallback  File handler for processing.
+     * @param timeoutMillis        Timeout waiting for the file creation in milliseconds.
+     * @param fileLengthCheckDelay Timeout waiting for the file writing in milliseconds.
+     * @param callbackHandlerDao   callbackHandlerDao for handlers
+     * @return Instance of the file handler.
+     */
+    public static WatchItem listen(String directoryName, FileHandlerCallback fileHandlerCallback,
+                                   long timeoutMillis, long fileLengthCheckDelay,
+                                   CallbackHandlerDao callbackHandlerDao) {
+        return listen(directoryName, fileHandlerCallback, timeoutMillis, fileLengthCheckDelay, null,
+                callbackHandlerDao);
+    }
+
+    /**
+     * Appends the file handler for processing to the folder listener for the existing file and returns
+     * instance of the file handler. If the file name is <b>null</b> this means that file does not exist
+     * and equal to call method
+     * {@link FolderListener#listen(String, FileHandlerCallback, long, long, CallbackHandlerDao)}.
+     *
+     * @param directoryName        Name of directory for listen.
+     * @param fileHandlerCallback  File handler for processing.
+     * @param timeoutMillis        Timeout waiting for the file creation in milliseconds.
+     * @param fileLengthCheckDelay Timeout waiting for the file writing in milliseconds.
+     * @param fileName             file name.
+     * @param callbackHandlerDao   callbackHandlerDao for handlers
+     * @return Instance of the file handler.
+     */
+    public static WatchItem listen(String directoryName, FileHandlerCallback fileHandlerCallback, long timeoutMillis,
+                                   long fileLengthCheckDelay, String fileName, CallbackHandlerDao callbackHandlerDao) {
+        FolderListener listener;
+        WatchItem item;
+
+        LOGGER.trace("Looking for folder listener to folder \"{}\" ...", directoryName);
+        synchronized (listeners) {
+            for (int i = 0; i < listeners.size(); i++) {
+                listener = listeners.get(i);
+                if (listener.itemList.getDirectoryName().equals(directoryName)) {
+                    if (listener.isAlive()) {
+                        LOGGER.debug("Folder listener \"{}\" found. Append file handler for UUID {}",
+                                directoryName, fileHandlerCallback.getUUID());
+                        item = listener.itemList.append(fileHandlerCallback, timeoutMillis, fileLengthCheckDelay,
+                                fileName);
+                        return item;
+                    } else {
+                        LOGGER.warn("Folder listener \"{}\" is dead and will be removed", directoryName);
+                        listeners.remove(i);
+                        break;
+                    }
+                }
+            }
+            LOGGER.debug("Folder listener \"{}\" not found. Create new listener and append file handler for UUID {}",
+                    directoryName, fileHandlerCallback.getUUID());
+            listener = new FolderListener(directoryName, callbackHandlerDao);
+            item = listener.itemList.append(fileHandlerCallback, timeoutMillis, fileLengthCheckDelay, fileName);
+            listeners.add(listener);
+            listener.start();
+        }
+        return item;
+    }
+
+    /**
+     * Terminates all the folder listeners.
+     */
+    public static void terminateAll() {
+        FolderListener[] array;
+        synchronized (listeners) {
+            array = listeners.toArray(new FolderListener[listeners.size()]);
+        }
+        for (int i = 0; i < array.length; i++) {
+            array[i].terminate();
+        }
+    }
+
+    /**
+     * Returns the list of folder listeners.
+     */
+    public static List<FolderListener> getListeners() {
+        return listeners;
+    }
+
+    /**
+     * Starts the thread of the folder listener.
+     */
+    protected void start() {
+        thread = new Thread(this, getClass().getSimpleName() + "-" + listeners.size());
+        thread.start();
+    }
+
+    /**
+     * Terminates the thread of the folder listener.
+     */
+    protected void terminate() {
+        if (thread != null) {
+            LOGGER.debug("Folder listener \"{}\" will be terminate", getDirectoryName());
+            thread.interrupt();
+        }
+    }
+
+    /**
+     * Returns <b>true</b> if the folder listener thread is running and is alive, otherwise <b>false</b>.
+     */
+    public boolean isAlive() {
+        return (thread != null && thread.isAlive());
+    }
+
+    /**
+     * Returns <b>true</b> if the folder listener is listening the folder.
+     */
+    public boolean isListen() {
+        return isListen;
+    }
+
+
+    /**
+     * Returns the list of the file handlers.
+     */
+    public WatchItemList getItemList() {
+        return itemList;
+    }
+
+    /**
+     * Returns the full name of directory.
+     */
+    public String getDirectoryName() {
+        return itemList.getDirectoryFullName();
+    }
+
+    /**
+     * Waiting for the directory creation and returns <b>true</b> if it exists or created.
+     * If timeout has expired and directory was not created returns <b>false</b>
+     */
+    private boolean waitForDirectory() throws InterruptedException {
+        File file = new File(getDirectoryName());
+        if (file.exists()) {
+            return true;
+        } else {
+            LOGGER.trace("Folder listener \"{}\" waiting for the directory creation", getDirectoryName());
+        }
+
+        long expiredTimeMillis = itemList.get(0).getExpiredTimeMillis();
+        while (expiredTimeMillis >= System.currentTimeMillis()) {
+            Thread.sleep(WAIT_DIR_TIMEOUT_MILLIS);
+            if (file.exists()) {
+                return true;
+            }
+        }
+        LOGGER.error("Folder listener \"{}\" error. Timeout has expired and directory does not exist",
+                getDirectoryName());
+        return false;
+    }
+
+    /**
+     * Initializes the thread of the folder listener. Returns <b>true</b> if the initialization
+     * completed successfully. Returns <b>false</b> if all the file handlers has been processed
+     * or initialization fails.
+     */
+    private boolean init() {
+        LOGGER.trace("Folder listener initializing for \"{}\" ...", getDirectoryName());
+
+        try {
+            if (!waitForDirectory()) {
+                return false;
+            }
+        } catch (InterruptedException e) {
+            LOGGER.debug("Folder listener \"{}\" has been interrupted", getDirectoryName());
+            Thread.currentThread().interrupt();
+            return false;
+        }
+
+        processStatusItems();
+        if (itemList.size() == 0) {
+            LOGGER.debug("Folder listener \"{}\" have no files and will be finished", getDirectoryName());
+            return false;
+        }
+
+        LOGGER.trace("Folder listener has been initialized for \"{}\" ...", getDirectoryName());
+        return true;
+    }
+
+    /**
+     * Process all the file handlers if need and removes all expired, processed or interrupted
+     * the file handlers from the list of the file handlers.
+     */
+    private void processStatusItems() {
+        int i = 0;
+
+        if (itemList.size() > 0) {
+            expiredIdleMillis = 0;
+        }
+        itemList.processItemAll();
+
+        synchronized (itemList) {
+            while (i < itemList.size()) {
+                final WatchItem item = itemList.get(i);
+                final ItemStatus status = item.getStatus();
+                final String uuid = item.getFileHandlerCallback().getUUID();
+
+                switch (status) {
+                    case WAIT_FOR_FILE:
+                    case FILE_CAPTURED:
+                    case INPROGRESS:
+                        // Skip
+                        i++;
+                        continue;
+                    case TIMEOUT_EXPIRED:
+                        LOGGER.warn("Folder listener \"{}\" remove expired file handler for UUID {}", getDirectoryName
+                                (), uuid);
+                        try {
+                            item.getFileHandlerCallback().handleError("Request timeout expired");
+                        } catch (Exception e) {
+                            LOGGER.error("Folder listener \"{}\" caused exception for UUID {}", getDirectoryName(),
+                                    uuid, e);
+                        }
+                        break;
+                    case IS_DONE:
+                        if (item.getFutureResult()) {
+                            LOGGER.trace("Folder listener \"{}\" remove processed file handler for UUID {}, handler " +
+                                    "result is {}", getDirectoryName(), uuid, item.getFutureResult());
+                        } else {
+                            LOGGER.warn("Folder listener \"{}\" remove processed file handler for UUID {}, handler " +
+                                    "result is {}", getDirectoryName(), uuid, item.getFutureResult());
+                        }
+                        break;
+                    case IS_CANCELED:
+                        LOGGER.debug("Folder listener \"{}\" remove canceled file handler for UUID {}",
+                                getDirectoryName(), uuid);
+                        break;
+                    case IS_FAILED:
+                        LOGGER.warn("Folder listener \"{}\" remove failed file handler for UUID {}", getDirectoryName
+                                (), uuid);
+                        break;
+                    case IS_INTERRUPTED:
+                        LOGGER.debug("Folder listener \"{}\" remove iterrupted file handler for UUID {}",
+                                getDirectoryName(), uuid);
+                        break;
+                    default:
+                        continue;
+                }
+                itemList.remove(i);
+            }
+        }
+
+        if (expiredIdleMillis == 0 && itemList.size() == 0) {
+            expiredIdleMillis = System.currentTimeMillis() + LISTENER_IDLE_TIMEOUT_MILLLIS;
+        }
+    }
+
+    /**
+     * Removes the listener from the list of folder listeners if the the file handler list is empty
+     * and idle time has expired or if <b>force</b> flag has been set to <b>true</b>.
+     *
+     * @param force the flag of remove the folder listener immediately.
+     * @return <b>true</b> if the folder listener has been removed otherwise <b>false</>.
+     */
+    private boolean removeListener(boolean force) {
+        synchronized (listeners) {
+            if (force || (expiredIdleMillis != 0 && expiredIdleMillis < System.currentTimeMillis())) {
+                for (int i = 0; i < listeners.size(); i++) {
+                    if (listeners.get(i) == this) {
+                        isListen = false;
+                        listeners.remove(i);
+                        LOGGER.debug("Folder listener \"{}\" has been removed from pool", getDirectoryName());
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Find and return the list of files to process.
+     */
+    private String[] getNewFiles() {
+        File dir = new File(getDirectoryName());
+        return dir.list((File dir1, String name) -> {
+            if (name.toLowerCase().endsWith(JSON_EXTENSION)) {
+                WatchItem item = itemList.getItem(name);
+                return (item != null && item.getStatus() == ItemStatus.WAIT_FOR_FILE);
+            }
+            return false;
+        });
+    }
+
+    /**
+     * Waiting for files and process it.
+     */
+    private void pollFile() {
+        try {
+            isListen = true;
+            while (true) {
+                String[] fileList = getNewFiles();
+                if (fileList != null) {
+                    for (String fileName : fileList) {
+                        LOGGER.trace("Folder listener \"{}\" handes the file {}", getDirectoryName(), fileName);
+                        processItem(fileName);
+                    }
+                }
+
+                processStatusItems();
+                if (removeListener(false)) {
+                    LOGGER.debug("Folder listener \"{}\" have no files and will be finished", getDirectoryName());
+                    break;
+                }
+                Thread.sleep(LISTENER_TIMEOUT_MILLLIS);
+            }
+        } catch (InterruptedException e) {
+            removeListener(true);
+            LOGGER.debug("Folder listener \"{}\" has been interrupted", getDirectoryName());
+            Thread.currentThread().interrupt();
+        } catch (Exception e) {
+            removeListener(true);
+            LOGGER.error("Folder listener for \"{}\" closed with error.", getDirectoryName(), e);
+            throw new DatalabException("Folder listener for \"" + getDirectoryName() + "\" closed with error. " + e
+                    .getLocalizedMessage(), e);
+        }
+    }
+
+    private void processItem(String fileName) {
+        try {
+            WatchItem item = itemList.getItem(fileName);
+            item.setFileName(fileName);
+            if (itemList.processItem(item)) {
+                LOGGER.debug("Folder listener \"{}\" processes the file {}", getDirectoryName(),
+                        fileName);
+            }
+        } catch (Exception e) {
+            LOGGER.warn("Folder listener \"{}\" has got exception for check or process the file {}",
+                    getDirectoryName(), fileName, e);
+        }
+    }
+
+    @Override
+    public void run() {
+        if (init()) {
+            pollFile();
+        } else {
+            LOGGER.warn("Folder listener has not been initialized for \"{}\"", getDirectoryName());
+            removeListener(true);
+        }
+    }
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListenerExecutor.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListenerExecutor.java
new file mode 100644
index 0000000..7462b80
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListenerExecutor.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.folderlistener;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import io.dropwizard.util.Duration;
+
+import static com.epam.datalab.backendapi.core.response.folderlistener.FolderListener.listen;
+
+/**
+ * Starts asynchronously of waiting for file creation and processing this file.
+ */
+@Singleton
+public class FolderListenerExecutor {
+    @Inject
+    private ProvisioningServiceApplicationConfiguration configuration;
+    @Inject
+    private CallbackHandlerDao handlerDao;
+
+    /**
+     * Starts asynchronously of waiting for file creation and processes this file if the timeout
+     * has not expired. If timeout has been expired then writes warning message to log file and
+     * finishes waiting. This method is <b>non-blocking</b>.
+     *
+     * @param directory           name of directory for waiting for the file creation.
+     * @param timeout             timeout for waiting.
+     * @param fileHandlerCallback handler for the file processing.
+     */
+    public void start(String directory, Duration timeout, FileHandlerCallback fileHandlerCallback) {
+        CallbackHandlerDao dao = configuration.isHandlersPersistenceEnabled() ? handlerDao : null;
+        listen(directory, fileHandlerCallback, timeout.toMilliseconds(),
+                configuration.getFileLengthCheckDelay().toMilliseconds(), dao);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItem.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItem.java
new file mode 100644
index 0000000..55ffa05
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItem.java
@@ -0,0 +1,257 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.folderlistener;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.google.common.base.MoreObjects;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * Class to store the file handler for processing.
+ */
+@Slf4j
+public class WatchItem implements Comparable<WatchItem> {
+
+    /**
+     * Status of file processing.
+     * <pre>
+     * WAIT_FOR_FILE waiting for the file creation.
+     * TIMEOUT_EXPIRED the timeout expired for the file creation.
+     * FILE_CAPTURED the file created and handled.
+     * INPROGRESS the file processing is running.
+     * IS_DONE the file processing is done. You can check the result of processing {@link WatchItem#getFutureResult()}
+     * IS_CANCELED the file processing has been canceled.
+     * IS_INTERRUPTED the file processing has been interrupted.
+     * IS_FAILED the file processing is failed.
+     * </pre>
+     */
+    public enum ItemStatus {
+        WAIT_FOR_FILE,
+        TIMEOUT_EXPIRED,
+        FILE_CAPTURED,
+        INPROGRESS,
+        IS_DONE,
+        IS_CANCELED,
+        IS_INTERRUPTED,
+        IS_FAILED
+    }
+
+    /**
+     * File handler for processing.
+     */
+    private final FileHandlerCallback fileHandlerCallback;
+    /**
+     * Timeout waiting for the file creation in milliseconds.
+     */
+    private final long timeoutMillis;
+    /**
+     * Timeout waiting for the file writing in milliseconds.
+     */
+    private final long fileLengthCheckDelay;
+
+    /**
+     * Time when expired for the file creation in milliseconds.
+     */
+    private long expiredTimeMillis;
+    /**
+     * File name.
+     */
+    private String fileName;
+    /**
+     * Future for asynchronously the file processing.
+     */
+    private CompletableFuture<Boolean> future;
+    /**
+     * Result of the file processing.
+     */
+    private Boolean futureResult = null;
+
+    /**
+     * Creates instance of the file handler.
+     *
+     * @param fileHandlerCallback  File handler for processing.
+     * @param timeoutMillis        Timeout waiting for the file creation in milliseconds.
+     * @param fileLengthCheckDelay Timeout waiting for the file writing in milliseconds.
+     */
+    public WatchItem(FileHandlerCallback fileHandlerCallback, long timeoutMillis, long fileLengthCheckDelay) {
+        this.fileHandlerCallback = fileHandlerCallback;
+        this.timeoutMillis = timeoutMillis;
+        this.fileLengthCheckDelay = fileLengthCheckDelay;
+        setExpiredTimeMillis(timeoutMillis);
+    }
+
+    @Override
+    public int compareTo(WatchItem o) {
+        if (o == null) {
+            return -1;
+        }
+        return (fileHandlerCallback.checkUUID(o.fileHandlerCallback.getUUID()) ?
+                0 : fileHandlerCallback.getUUID().compareTo(o.fileHandlerCallback.getUUID()));
+    }
+
+    /**
+     * Returns the file handler for processing.
+     */
+    public FileHandlerCallback getFileHandlerCallback() {
+        return fileHandlerCallback;
+    }
+
+    /**
+     * Returns the timeout waiting for the file creation in milliseconds.
+     */
+    public long getTimeoutMillis() {
+        return timeoutMillis;
+    }
+
+    /**
+     * Returns the timeout waiting for the file writing in milliseconds.
+     */
+    public long getFileLengthCheckDelay() {
+        return fileLengthCheckDelay;
+    }
+
+
+    /**
+     * Returns the time when expired for the file creation in milliseconds.
+     */
+    public long getExpiredTimeMillis() {
+        return expiredTimeMillis;
+    }
+
+    /**
+     * Sets time when expired for file creation in milliseconds.
+     *
+     * @param expiredTimeMillis time expired for file creation in milliseconds.
+     */
+    private void setExpiredTimeMillis(long expiredTimeMillis) {
+        this.expiredTimeMillis = System.currentTimeMillis() + expiredTimeMillis;
+    }
+
+    /**
+     * Returns the file name.
+     */
+    public String getFileName() {
+        return fileName;
+    }
+
+    /**
+     * Sets the file name.
+     *
+     * @param fileName file name.
+     */
+    protected void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    /**
+     * Returns the status of the file processing.
+     * See {@link ItemStatus} for details.
+     */
+    public ItemStatus getStatus() {
+        if (fileName == null) {
+            return (expiredTimeMillis < System.currentTimeMillis() ? ItemStatus.TIMEOUT_EXPIRED : ItemStatus.WAIT_FOR_FILE);
+        } else if (future == null) {
+            return ItemStatus.FILE_CAPTURED;
+        } else if (future.isCancelled()) {
+            return ItemStatus.IS_CANCELED;
+        }
+
+        if (future.isDone()) {
+            try {
+                futureResult = future.get();
+                return ItemStatus.IS_DONE;
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                return ItemStatus.IS_INTERRUPTED;
+            } catch (ExecutionException e) {
+                log.error("Execution exception occurred", e);
+                return ItemStatus.IS_FAILED;
+            }
+        }
+
+        return ItemStatus.INPROGRESS;
+    }
+
+    /**
+     * Returns <b>true</> if the time has expired for the file creation.
+     */
+    public boolean isExpired() {
+        return (fileName == null && expiredTimeMillis < System.currentTimeMillis());
+    }
+
+
+    /**
+     * Returns the future for asynchronously the file processing.
+     */
+    public CompletableFuture<Boolean> getFuture() {
+        return future;
+    }
+
+    /**
+     * Sets the future for the file processing.
+     *
+     * @param future completable future for file processing.
+     */
+    protected void setFuture(CompletableFuture<Boolean> future) {
+        this.future = future;
+    }
+
+    /**
+     * Returns the result of the file processing. This method is non-blocking and returns <b>true</b>
+     * or <b>false</b> if the file processing has done, otherwise returns <b>null</b>.
+     */
+    public Boolean getFutureResult() {
+        if (futureResult == null && future != null && future.isDone()) {
+            try {
+                futureResult = future.get();
+            } catch (Exception e) {
+                log.error("Exception occurred during getting result: {}", e.getMessage(), e);
+            }
+        }
+        return futureResult;
+    }
+
+    /**
+     * Returns the result of the file processing. This method is blocking and returns <b>true</b> or
+     * <b>false</b> when the file processing has done.
+     */
+    public Boolean getFutureResultSync() throws InterruptedException, ExecutionException {
+        if (futureResult == null && future != null) {
+            futureResult = future.get();
+        }
+        return futureResult;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("fileHandlerCallback", fileHandlerCallback)
+                .add("timeoutMillis", timeoutMillis)
+                .add("fileLengthCheckDelay", fileLengthCheckDelay)
+                .add("expiredTimeMillis", expiredTimeMillis)
+                .add("fileName", fileName)
+                .add("future", future)
+                .add("futureResult", futureResult)
+                .toString();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemList.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemList.java
new file mode 100644
index 0000000..76418ae
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemList.java
@@ -0,0 +1,276 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.folderlistener;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.response.folderlistener.WatchItem.ItemStatus;
+import com.epam.datalab.backendapi.core.response.handlers.PersistentFileHandler;
+import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
+import io.dropwizard.util.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.nio.file.Paths;
+import java.util.Collections;
+import java.util.Objects;
+import java.util.Vector;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ForkJoinPool;
+
+/**
+ * List of the file handlers for processing.
+ */
+public class WatchItemList {
+    private static final Logger LOGGER = LoggerFactory.getLogger(WatchItemList.class);
+
+    /**
+     * Directory name.
+     */
+    private final String directoryName;
+    /**
+     * Directory full name.
+     */
+    private final String directoryFullName;
+    private final CallbackHandlerDao handlerDao;
+
+    /**
+     * List of the file handlers.
+     */
+    private final Vector<WatchItem> list = new Vector<>();
+
+    /**
+     * UUID of the file handler for search.
+     */
+    private String uuidSearch;
+
+    /**
+     * File handler for search.
+     */
+    private final FileHandlerCallback handlerSearch = new FileHandlerCallback() {
+        @Override
+        public String getUUID() {
+            return uuidSearch;
+        }
+
+        @Override
+        public boolean checkUUID(String uuid) {
+            return uuidSearch.equals(uuid);
+        }
+
+        @Override
+        public void handleError(String errorMessage) {
+        }
+
+        @Override
+        public String getUser() {
+            return "DATALAB";
+        }
+
+        @Override
+        public boolean handle(String fileName, byte[] content) throws Exception {
+            return false;
+        }
+    };
+
+    /**
+     * Creates instance of the file handlers for processing.
+     *
+     * @param directoryName listener directory name.
+     * @param handlerDao    data access object for callback handler
+     */
+    public WatchItemList(String directoryName, CallbackHandlerDao handlerDao) {
+        this.directoryName = directoryName;
+        this.directoryFullName = Paths.get(directoryName).toAbsolutePath().toString();
+        this.handlerDao = handlerDao;
+    }
+
+    /**
+     * Returns directory name.
+     */
+    public String getDirectoryName() {
+        return directoryName;
+    }
+
+    /**
+     * Returns directory full name.
+     */
+    public String getDirectoryFullName() {
+        return directoryFullName;
+    }
+
+
+    /**
+     * Appends the file handler to the list and returns it.
+     *
+     * @param fileHandlerCallback  File handler for processing.
+     * @param timeoutMillis        Timeout waiting for the file creation in milliseconds.
+     * @param fileLengthCheckDelay Timeout waiting for the file writing in milliseconds.
+     * @return Instance of the file handler.
+     */
+    public WatchItem append(FileHandlerCallback fileHandlerCallback, long timeoutMillis, long fileLengthCheckDelay) {
+        if (Objects.nonNull(handlerDao)) {
+            handlerDao.upsert(new PersistentFileHandler(fileHandlerCallback, timeoutMillis, directoryName));
+        }
+        WatchItem item = new WatchItem(fileHandlerCallback, timeoutMillis, fileLengthCheckDelay);
+        synchronized (this) {
+            int index = Collections.binarySearch(list, item);
+            if (index < 0) {
+                index = -index;
+                if (index > list.size()) {
+                    list.add(item);
+                } else {
+                    list.add(index - 1, item);
+                }
+            } else {
+                LOGGER.warn("Handler for UUID {} for folder {} will be replaced. Old item is: {}",
+                        fileHandlerCallback.getUUID(), directoryFullName, get(index));
+                list.set(index, item);
+            }
+        }
+        return item;
+    }
+
+    /**
+     * Appends the file handler to the list for the existing file and returns it. If the file name
+     * is <b>null</b> this means that file does not exist and equal to call method
+     * {@link WatchItemList#append(FileHandlerCallback, long, long)}.
+     *
+     * @param fileHandlerCallback  File handler for processing.
+     * @param timeoutMillis        Timeout waiting for the file creation in milliseconds.
+     * @param fileLengthCheckDelay Timeout waiting for the file writing in milliseconds.
+     * @param fileName             file name.
+     * @return Instance of file handler.
+     */
+    public WatchItem append(FileHandlerCallback fileHandlerCallback, long timeoutMillis, long fileLengthCheckDelay,
+                            String fileName) {
+        WatchItem item = append(fileHandlerCallback, timeoutMillis, fileLengthCheckDelay);
+        if (fileName != null) {
+            item.setFileName(fileName);
+        }
+        return item;
+    }
+
+    /**
+     * Removes the file handler from list.
+     *
+     * @param index index of the file handler.
+     */
+    public void remove(int index) {
+
+        final WatchItem watchItem = list.remove(index);
+        if (Objects.nonNull(handlerDao) && watchItem.getStatus() != ItemStatus.IS_FAILED) {
+            handlerDao.remove(watchItem.getFileHandlerCallback().getId());
+        }
+    }
+
+    /**
+     * Returns the number of the file handlers in list.
+     */
+    public int size() {
+        return list.size();
+    }
+
+    /**
+     * Returns the file handler.
+     *
+     * @param index index of the file handler.
+     */
+    public WatchItem get(int index) {
+        return list.get(index);
+    }
+
+    /**
+     * Returns the index of the file handler in the list if it is contained in the list,
+     * otherwise returns (-(insertion point) - 1).
+     *
+     * @param uuid UUID of the file handler.
+     */
+    public int getIndex(String uuid) {
+        uuidSearch = uuid;
+        return Collections.binarySearch(list, new WatchItem(handlerSearch, 0, 0));
+    }
+
+    /**
+     * Returns the instance of the file handler if it contained in the list,
+     * otherwise returns <b>null</b>.
+     */
+    public WatchItem getItem(String fileName) {
+        String uuid = DockerCommands.extractUUID(fileName);
+        int index = getIndex(uuid);
+        if (index < 0) {
+            return null;
+        }
+        return get(index);
+    }
+
+    /**
+     * Runs asynchronously the file handler in the {@link ForkJoinPool#commonPool()}.
+     *
+     * @param item the file handler.
+     */
+    private void runAsync(WatchItem item) {
+        LOGGER.trace("Process file {} for folder {}", item.getFileName(), directoryFullName);
+        item.setFuture(CompletableFuture.supplyAsync(
+                new AsyncFileHandler(item.getFileName(), getDirectoryName(),
+                        item.getFileHandlerCallback(), Duration.milliseconds(item.getFileLengthCheckDelay()))));
+    }
+
+    /**
+     * Runs the file processing asynchronously if it have status {@link ItemStatus#FILE_CAPTURED} and returns
+     * <b>true</b>,
+     * otherwise <b>false</b>.
+     *
+     * @param item the file handler.
+     */
+    public boolean processItem(WatchItem item) {
+        if (item.getStatus() == ItemStatus.FILE_CAPTURED) {
+            runAsync(item);
+            return true;
+        }
+
+        if (item.isExpired()) {
+            LOGGER.warn("Watch time has expired for UUID {} in folder {}", item.getFileHandlerCallback().getUUID(),
+                    directoryFullName);
+        }
+        return false;
+    }
+
+    /**
+     * Checks all the file handlers and runs the file processing for it if have status
+     * {@link ItemStatus#FILE_CAPTURED}.
+     */
+    public int processItemAll() {
+        int count = 0;
+        synchronized (list) {
+            for (int i = 0; i < size(); i++) {
+                WatchItem item = list.get(i);
+                if (item.getStatus() == ItemStatus.FILE_CAPTURED && processItem(item)) {
+                    count++;
+                }
+            }
+        }
+        if (count > 0) {
+            LOGGER.trace("Starts processing {} files for folder {}", count, directoryName);
+        }
+        return count;
+    }
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/BackupCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/BackupCallbackHandler.java
new file mode 100644
index 0000000..d8309b5
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/BackupCallbackHandler.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.dto.backup.EnvBackupDTO;
+import com.epam.datalab.dto.backup.EnvBackupStatus;
+import com.epam.datalab.dto.backup.EnvBackupStatusDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.core.Response;
+
+@Slf4j
+public class BackupCallbackHandler implements FileHandlerCallback {
+    private static final ObjectMapper MAPPER = new ObjectMapper()
+            .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
+    private static final String STATUS_FIELD = "status";
+    private static final String BACKUP_FILE_FIELD = "backup_file";
+    private static final String ERROR_MESSAGE_FIELD = "error_message";
+    @JsonProperty
+    private final String uuid;
+    @JsonProperty
+    private final EnvBackupDTO dto;
+    private final RESTService selfService;
+    @JsonProperty
+    private final String callbackUrl;
+    @JsonProperty
+    private final String user;
+
+    @JsonCreator
+    public BackupCallbackHandler(
+            @JacksonInject RESTService selfService,
+            @JsonProperty("callbackUrl") String callbackUrl, @JsonProperty("user") String user,
+            @JsonProperty("dto") EnvBackupDTO dto) {
+        this.selfService = selfService;
+        this.uuid = dto.getId();
+        this.callbackUrl = callbackUrl;
+        this.user = user;
+        this.dto = dto;
+    }
+
+    @Override
+    public String getUUID() {
+        return uuid;
+    }
+
+    @Override
+    public boolean checkUUID(String uuid) {
+        return this.uuid.equals(uuid);
+    }
+
+    @Override
+    public boolean handle(String fileName, byte[] content) throws Exception {
+        final String fileContent = new String(content);
+        log.debug("Got file {} while waiting for UUID {}, backup response: {}", fileName, uuid, fileContent);
+
+        final JsonNode jsonNode = MAPPER.readTree(fileContent);
+        final EnvBackupStatus status = EnvBackupStatus.fromValue(jsonNode.get(STATUS_FIELD).textValue());
+        EnvBackupStatusDTO envBackupStatusDTO;
+        if (EnvBackupStatus.CREATED == status) {
+            envBackupStatusDTO = buildBackupStatusDto(EnvBackupStatus.CREATED)
+                    .withBackupFile(jsonNode.get(BACKUP_FILE_FIELD).textValue());
+        } else {
+            envBackupStatusDTO = buildBackupStatusDto(EnvBackupStatus.FAILED)
+                    .withErrorMessage(jsonNode.get(ERROR_MESSAGE_FIELD).textValue());
+        }
+        selfServicePost(envBackupStatusDTO);
+        return EnvBackupStatus.CREATED == status;
+    }
+
+    private void selfServicePost(EnvBackupStatusDTO statusDTO) {
+        log.debug("Send post request to self service {} for UUID {}, object is {}", uuid, statusDTO);
+        try {
+            selfService.post(callbackUrl, statusDTO, Response.class);
+        } catch (Exception e) {
+            log.error("Send request or response error for UUID {}: {}", uuid, e.getLocalizedMessage(), e);
+            throw new DatalabException("Send request or response error for UUID " + uuid + ": " + e.getLocalizedMessage()
+                    , e);
+        }
+    }
+
+    @Override
+    public void handleError(String errorMessage) {
+        buildBackupStatusDto(EnvBackupStatus.FAILED)
+                .withErrorMessage(errorMessage);
+    }
+
+    @Override
+    public String getUser() {
+        return user;
+    }
+
+    protected EnvBackupStatusDTO buildBackupStatusDto(EnvBackupStatus status) {
+        return new EnvBackupStatusDTO()
+                .withRequestId(uuid)
+                .withEnvBackupDTO(dto)
+                .withStatus(status)
+                .withUser(user);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/CheckInactivityCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/CheckInactivityCallbackHandler.java
new file mode 100644
index 0000000..c2c9820
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/CheckInactivityCallbackHandler.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.computational.CheckInactivityStatusDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Singleton;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.core.Response;
+
+@Slf4j
+@Singleton
+public class CheckInactivityCallbackHandler implements FileHandlerCallback {
+    private static final ObjectMapper MAPPER = new ObjectMapper()
+            .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
+    private static final String STATUS_FIELD = "status";
+    private static final String ERROR_MESSAGE_FIELD = "error_message";
+    private static final String RESPONSE = "response";
+    private static final String OK_STATUS_STRING = "ok";
+    private static final String RESULT_NODE = "result";
+    @JsonProperty
+    private final String uuid;
+    private final RESTService selfService;
+    @JsonProperty
+    private final String callbackUrl;
+    @JsonProperty
+    private final String user;
+    @JsonProperty
+    private final String exploratoryName;
+    @JsonProperty
+    private final String computationalName;
+
+    @JsonCreator
+    public CheckInactivityCallbackHandler(@JacksonInject RESTService selfService,
+                                          @JsonProperty("callbackUrl") String callbackUrl,
+                                          @JsonProperty("user") String user, String uuid, String exploratoryName,
+                                          String computationalName) {
+        this.selfService = selfService;
+        this.uuid = uuid;
+        this.callbackUrl = callbackUrl;
+        this.user = user;
+        this.exploratoryName = exploratoryName;
+        this.computationalName = computationalName;
+    }
+
+    public CheckInactivityCallbackHandler(RESTService selfService,
+                                          String callbackUrl, String user, String uuid, String exploratoryName) {
+        this(selfService, callbackUrl, user, uuid, exploratoryName, null);
+    }
+
+    @Override
+    public String getUUID() {
+        return uuid;
+    }
+
+    @Override
+    public boolean checkUUID(String uuid) {
+        return this.uuid.equals(uuid);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public boolean handle(String fileName, byte[] content) throws Exception {
+        final String fileContent = new String(content);
+        log.debug("Got file {} while waiting for UUID {}, check inactivity resources response: {}", fileName, uuid,
+                fileContent);
+
+        final JsonNode treeNode = MAPPER.readTree(fileContent);
+        final String status = treeNode.get(STATUS_FIELD).textValue();
+        CheckInactivityStatusDTO checkInactivityStatusDTO = OK_STATUS_STRING.equals(status) ?
+                getOkStatusDto(treeNode) : getFailedStatusDto(treeNode.get(ERROR_MESSAGE_FIELD).textValue());
+        selfServicePost(checkInactivityStatusDTO);
+        return OK_STATUS_STRING.equals(status);
+    }
+
+    @Override
+    public void handleError(String errorMessage) {
+        log.error(errorMessage);
+        selfServicePost(getFailedStatusDto(errorMessage).withErrorMessage(errorMessage));
+    }
+
+    @Override
+    public String getUser() {
+        return user;
+    }
+
+    private CheckInactivityStatusDTO getOkStatusDto(JsonNode jsonNode) {
+        final CheckInactivityStatusDTO statusDTO = new CheckInactivityStatusDTO().withStatus(OK_STATUS_STRING)
+                .withRequestId(uuid);
+        statusDTO.setComputationalName(computationalName);
+        statusDTO.setExploratoryName(exploratoryName);
+        final long lastActivity = Long.parseLong(jsonNode.get(RESPONSE).get(RESULT_NODE).textValue());
+        statusDTO.setLastActivityUnixTime(lastActivity);
+        return statusDTO;
+    }
+
+    private CheckInactivityStatusDTO getFailedStatusDto(String errorMessage) {
+        return new CheckInactivityStatusDTO().withStatus(UserInstanceStatus.FAILED)
+                .withRequestId(uuid)
+                .withErrorMessage(errorMessage);
+    }
+
+    private void selfServicePost(CheckInactivityStatusDTO statusDTO) {
+        log.debug("Send post request to self service for UUID {}, object is {}", uuid, statusDTO);
+        try {
+            selfService.post(callbackUrl, statusDTO, Response.class);
+        } catch (Exception e) {
+            log.error("Send request or response error for UUID {}: {}", uuid, e.getLocalizedMessage(), e);
+            throw new DatalabException("Send request or response error for UUID " + uuid + ": "
+                    + e.getLocalizedMessage(), e);
+        }
+    }
+
+}
+
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalCallbackHandler.java
new file mode 100644
index 0000000..416eda7
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalCallbackHandler.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.epam.datalab.dto.computational.ComputationalStatusDTO;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+@Slf4j
+public class ComputationalCallbackHandler extends ResourceCallbackHandler<ComputationalStatusDTO> {
+    private static final String INSTANCE_ID_FIELD = "instance_id";
+    private static final String COMPUTATIONAL_ID_FIELD = "hostname";
+    private static final String COMPUTATIONAL_URL_FIELD = "computational_url";
+
+    @JsonProperty
+    private final ComputationalBase<?> dto;
+    private ComputationalConfigure computationalConfigure;
+
+    @JsonCreator
+    public ComputationalCallbackHandler(@JacksonInject ComputationalConfigure computationalConfigure,
+                                        @JacksonInject RESTService selfService,
+                                        @JsonProperty("action") DockerAction action,
+                                        @JsonProperty("uuid") String uuid,
+                                        @JsonProperty("dto") ComputationalBase<?> dto) {
+
+        super(selfService, dto.getCloudSettings().getIamUser(), uuid, action);
+        this.computationalConfigure = computationalConfigure;
+        this.dto = dto;
+    }
+
+    protected ComputationalBase<?> getDto() {
+        return dto;
+    }
+
+    @Override
+    protected String getCallbackURI() {
+        return ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI;
+    }
+
+    @Override
+    protected ComputationalStatusDTO parseOutResponse(JsonNode resultNode, ComputationalStatusDTO baseStatus) {
+
+        if (resultNode == null) {
+            return baseStatus;
+        }
+        baseStatus.withComputationalUrl(extractUrl(resultNode));
+        baseStatus.withLastActivity(Date.from(Instant.now()));
+
+        if (DockerAction.CREATE == getAction()) {
+            baseStatus
+                    .withInstanceId(instanceId(resultNode.get(INSTANCE_ID_FIELD)))
+                    .withComputationalId(getTextValue(resultNode.get(COMPUTATIONAL_ID_FIELD)));
+            if (UserInstanceStatus.of(baseStatus.getStatus()) == UserInstanceStatus.RUNNING) {
+                baseStatus.withStatus(UserInstanceStatus.CONFIGURING);
+                computationalConfigure.configure(getUUID(), getDto());
+            }
+        }
+        return baseStatus;
+    }
+
+    @Override
+    protected ComputationalStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
+        return super.getBaseStatusDTO(status)
+                .withExploratoryName(dto.getExploratoryName())
+                .withComputationalName(dto.getComputationalName())
+                .withProject(dto.getProject());
+    }
+
+    private String instanceId(JsonNode jsonNode) {
+        if (jsonNode != null && jsonNode.isArray()) {
+            return StreamSupport.stream(jsonNode.spliterator(), false)
+                    .map(JsonNode::textValue)
+                    .collect(Collectors.joining(";"));
+        } else {
+            return getTextValue(jsonNode);
+        }
+
+    }
+
+    private List<ResourceURL> extractUrl(JsonNode resultNode) {
+        final JsonNode nodeUrl = resultNode.get(COMPUTATIONAL_URL_FIELD);
+        return Optional.ofNullable(nodeUrl)
+                .map(this::getUrls)
+                .orElse(Collections.emptyList());
+    }
+
+    private List<ResourceURL> getUrls(JsonNode nodeUrl) {
+        try {
+            return mapper.readValue(nodeUrl.toString(), new TypeReference<List<ResourceURL>>() {
+            });
+        } catch (IOException e) {
+            log.warn("Cannot parse field {} for UUID {} in JSON", RESPONSE_NODE + "." + RESULT_NODE + "." +
+                    COMPUTATIONAL_URL_FIELD, getUUID(), e);
+        }
+        return Collections.emptyList();
+    }
+}
+
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalConfigure.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalConfigure.java
new file mode 100644
index 0000000..3cdfcf2
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalConfigure.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.CommandBuilder;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.aws.computational.SparkComputationalCreateAws;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.epam.datalab.dto.gcp.computational.SparkComputationalCreateGcp;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Objects;
+
+import static com.epam.datalab.backendapi.core.commands.DockerAction.CONFIGURE;
+
+@Slf4j
+@Singleton
+public class ComputationalConfigure implements DockerCommands {
+    @Inject
+    private ProvisioningServiceApplicationConfiguration configuration;
+    @Inject
+    private FolderListenerExecutor folderListenerExecutor;
+    @Inject
+    private ICommandExecutor commandExecutor;
+    @Inject
+    private CommandBuilder commandBuilder;
+    @Inject
+    private RESTService selfService;
+
+    public String configure(String uuid, ComputationalBase<?> dto) {
+        switch (configuration.getCloudProvider()) {
+            case AWS:
+                if (dto instanceof SparkComputationalCreateAws) {
+                    return runConfigure(uuid, dto, DataEngineType.SPARK_STANDALONE);
+                } else {
+                    return runConfigure(uuid, dto, DataEngineType.CLOUD_SERVICE);
+                }
+            case AZURE:
+                return runConfigure(uuid, dto, DataEngineType.SPARK_STANDALONE);
+            case GCP:
+                if (dto instanceof SparkComputationalCreateGcp) {
+                    return runConfigure(uuid, dto, DataEngineType.SPARK_STANDALONE);
+                } else {
+                    return runConfigure(uuid, dto, DataEngineType.CLOUD_SERVICE);
+                }
+
+            default:
+                throw new IllegalStateException(String.format("Wrong configuration of cloud provider %s %s",
+                        configuration.getCloudProvider(), dto));
+        }
+    }
+
+    private String runConfigure(String uuid, ComputationalBase<?> dto, DataEngineType dataEngineType) {
+        log.debug("Configure computational resources {} for user {}: {}", dto.getComputationalName(), dto
+                .getEdgeUserName(), dto);
+        folderListenerExecutor.start(
+                configuration.getImagesDirectory(),
+                configuration.getResourceStatusPollTimeout(),
+                getFileHandlerCallback(CONFIGURE, uuid, dto));
+        try {
+            RunDockerCommand runDockerCommand = new RunDockerCommand()
+                    .withInteractive()
+                    .withName(nameContainer(dto.getEdgeUserName(), CONFIGURE,
+                            dto.getExploratoryName(), dto.getComputationalName()))
+                    .withVolumeForRootKeys(configuration.getKeyDirectory())
+                    .withVolumeForResponse(configuration.getImagesDirectory())
+                    .withVolumeForLog(configuration.getDockerLogDirectory(), dataEngineType.getName())
+                    .withResource(dataEngineType.getName())
+                    .withRequestId(uuid)
+                    .withConfKeyName(configuration.getAdminKey())
+                    .withActionConfigure(getImageConfigure(dto.getApplicationName(), dataEngineType));
+            if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                    Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                    !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+                runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+            }
+
+            commandExecutor.executeAsync(
+                    dto.getEdgeUserName(),
+                    uuid,
+                    commandBuilder.buildCommand(runDockerCommand, dto));
+        } catch (Exception t) {
+            throw new DatalabException("Could not configure computational resource cluster", t);
+        }
+        return uuid;
+    }
+
+    private FileHandlerCallback getFileHandlerCallback(DockerAction action, String originalUuid, ComputationalBase<?>
+            dto) {
+        return new ComputationalConfigureCallbackHandler(selfService, action, originalUuid, dto);
+    }
+
+    private String nameContainer(String user, DockerAction action, String exploratoryName, String name) {
+        return nameContainer(user, action.toString(), "computational", exploratoryName, name);
+    }
+
+    private String getImageConfigure(String application, DataEngineType dataEngineType) {
+        String imageName = DataEngineType.getDockerImageName(dataEngineType);
+        int pos = imageName.indexOf('-');
+        if (pos > 0) {
+            return imageName.substring(0, pos + 1) + application;
+        }
+        throw new DatalabException("Could not describe the image name for computational resources from image " +
+                imageName + " and application " + application);
+    }
+
+    public String getResourceType() {
+        return Directories.DATA_ENGINE_SERVICE_LOG_DIRECTORY;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java
new file mode 100644
index 0000000..a32f634
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.epam.datalab.dto.computational.ComputationalStatusDTO;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import java.time.Instant;
+import java.util.Date;
+
+public class ComputationalConfigureCallbackHandler extends ResourceCallbackHandler<ComputationalStatusDTO> {
+
+    @JsonProperty
+    private final ComputationalBase<?> dto;
+
+    @JsonCreator
+    public ComputationalConfigureCallbackHandler(@JacksonInject RESTService selfService,
+                                                 @JsonProperty("action") DockerAction action,
+                                                 @JsonProperty("uuid") String uuid,
+                                                 @JsonProperty("dto") ComputationalBase<?> dto) {
+        super(selfService, dto.getCloudSettings().getIamUser(), uuid, action);
+        this.dto = dto;
+    }
+
+    @Override
+    protected String getCallbackURI() {
+        return ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI;
+    }
+
+    @Override
+    protected ComputationalStatusDTO parseOutResponse(JsonNode resultNode, ComputationalStatusDTO baseStatus) {
+        return baseStatus
+                .withExploratoryName(dto.getExploratoryName())
+                .withComputationalName(dto.getComputationalName())
+                .withProject(dto.getProject())
+                .withUptime(null)
+                .withLastActivity(Date.from(Instant.now()));
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/EdgeCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/EdgeCallbackHandler.java
new file mode 100644
index 0000000..22ffa31
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/EdgeCallbackHandler.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.epam.datalab.dto.base.keyload.UploadFileResult;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+
+@Slf4j
+public class EdgeCallbackHandler<E extends EdgeInfo, T extends UploadFileResult<E>> extends ResourceCallbackHandler<T> {
+    @JsonProperty
+    private final String callbackURI;
+    @JsonProperty
+    private final Class<E> responseType;
+
+    @JsonCreator
+    public EdgeCallbackHandler(
+            @JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action,
+            @JsonProperty("uuid") String uuid, @JsonProperty("user") String user,
+            @JsonProperty("callbackURI") String callbackURI,
+            @JsonProperty("responseType") Class<E> responseType,
+            @JsonProperty("resultType") Class<T> enclosingType) {
+
+        super(selfService, user, uuid, action, enclosingType);
+        this.callbackURI = callbackURI;
+        this.responseType = responseType;
+    }
+
+    @Override
+    protected String getCallbackURI() {
+        return callbackURI;
+    }
+
+    protected T parseOutResponse(JsonNode resultNode, T baseStatus) {
+        if (resultNode != null && (getAction() == DockerAction.CREATE || getAction() == DockerAction.START)
+                && UserInstanceStatus.of(baseStatus.getStatus()) != UserInstanceStatus.FAILED) {
+            try {
+                E credential = mapper.readValue(resultNode.toString(), responseType);
+                credential.setEdgeStatus(UserInstanceStatus.RUNNING.toString());
+                baseStatus.withEdgeInfo(credential);
+            } catch (IOException e) {
+                throw new DatalabException("Cannot parse the EDGE info in JSON: " + e.getLocalizedMessage(), e);
+            }
+        }
+
+        return baseStatus;
+    }
+
+    @Override
+    public void handleError(String errorMessage) {
+        super.handleError("Could not upload the user key: " + errorMessage);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java
new file mode 100644
index 0000000..8bdabe1
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.exploratory.ExploratoryStatusDTO;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.List;
+
+import static com.epam.datalab.rest.contracts.ApiCallbacks.EXPLORATORY;
+import static com.epam.datalab.rest.contracts.ApiCallbacks.STATUS_URI;
+
+public class ExploratoryCallbackHandler extends ResourceCallbackHandler<ExploratoryStatusDTO> {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ExploratoryCallbackHandler.class);
+
+    private static final String INSTANCE_ID_FIELD = "instance_id";
+    private static final String EXPLORATORY_ID_FIELD = "notebook_name";
+    private static final String EXPLORATORY_PRIVATE_IP_FIELD = "ip";
+    private static final String EXPLORATORY_URL_FIELD = "exploratory_url";
+    private static final String EXPLORATORY_USER_FIELD = "exploratory_user";
+    private static final String EXPLORATORY_PASSWORD_FIELD = "exploratory_pass";
+
+    @JsonProperty
+    private final String exploratoryName;
+    private final String project;
+
+    @JsonCreator
+    public ExploratoryCallbackHandler(@JacksonInject RESTService selfService,
+                                      @JsonProperty("action") DockerAction action,
+                                      @JsonProperty("uuid") String uuid, @JsonProperty("user") String user,
+                                      String project, @JsonProperty("exploratoryName") String exploratoryName) {
+        super(selfService, user, uuid, action);
+        this.exploratoryName = exploratoryName;
+        this.project = project;
+    }
+
+    @Override
+    protected String getCallbackURI() {
+        return EXPLORATORY + STATUS_URI;
+    }
+
+    @Override
+    protected ExploratoryStatusDTO parseOutResponse(JsonNode resultNode, ExploratoryStatusDTO baseStatus) {
+        if (resultNode == null) {
+            return baseStatus;
+        }
+        final JsonNode nodeUrl = resultNode.get(EXPLORATORY_URL_FIELD);
+        List<ResourceURL> url = null;
+        if (nodeUrl != null) {
+            try {
+                url = mapper.readValue(nodeUrl.toString(), new TypeReference<List<ResourceURL>>() {
+                });
+            } catch (IOException e) {
+                LOGGER.warn("Cannot parse field {} for UUID {} in JSON",
+                        RESPONSE_NODE + "." + RESULT_NODE + "." + EXPLORATORY_URL_FIELD, getUUID(), e);
+            }
+        }
+
+        String exploratoryId = getTextValue(resultNode.get(EXPLORATORY_ID_FIELD));
+        if (getAction() == DockerAction.CREATE && exploratoryId == null) {
+            LOGGER.warn("Empty field {} for UUID {} in JSON", String.format("%s.%s.%s", RESPONSE_NODE, RESULT_NODE,
+                    EXPLORATORY_ID_FIELD), getUUID());
+        }
+
+        return baseStatus
+                .withInstanceId(getTextValue(resultNode.get(INSTANCE_ID_FIELD)))
+                .withExploratoryId(exploratoryId)
+                .withExploratoryUrl(url)
+                .withPrivateIp(getTextValue(resultNode.get(EXPLORATORY_PRIVATE_IP_FIELD)))
+                .withExploratoryUser(getTextValue(resultNode.get(EXPLORATORY_USER_FIELD)))
+                .withExploratoryPassword(getTextValue(resultNode.get(EXPLORATORY_PASSWORD_FIELD)));
+    }
+
+    @Override
+    protected ExploratoryStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
+        return super.getBaseStatusDTO(status)
+                .withExploratoryName(exploratoryName)
+                .withProject(project);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java
new file mode 100644
index 0000000..8cde822
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.exploratory.ExploratoryStatusDTO;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class ExploratoryGitCredsCallbackHandler extends ResourceCallbackHandler<ExploratoryStatusDTO> {
+
+    @JsonProperty
+    private final String exploratoryName;
+
+    @JsonCreator
+    public ExploratoryGitCredsCallbackHandler(@JacksonInject RESTService selfService,
+                                              @JsonProperty("action") DockerAction action,
+                                              @JsonProperty("uuid") String uuid,
+                                              @JsonProperty("user") String user,
+                                              @JsonProperty("exploratoryName") String exploratoryName) {
+        super(selfService, user, uuid, action);
+        this.exploratoryName = exploratoryName;
+    }
+
+    @Override
+    protected String getCallbackURI() {
+        return ApiCallbacks.GIT_CREDS;
+    }
+
+    @Override
+    protected ExploratoryStatusDTO parseOutResponse(JsonNode resultNode, ExploratoryStatusDTO baseStatus) {
+        log.trace("Parse GIT Creds: {}", resultNode);
+        return baseStatus;
+    }
+
+    @Override
+    protected ExploratoryStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
+        return super.getBaseStatusDTO(status)
+                .withExploratoryName(exploratoryName);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java
new file mode 100644
index 0000000..2b15b0a
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.exploratory.ExploratoryImageDTO;
+import com.epam.datalab.dto.exploratory.ImageCreateStatusDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+
+@Slf4j
+public class ImageCreateCallbackHandler extends ResourceCallbackHandler<ImageCreateStatusDTO> {
+    @JsonProperty
+    private final String imageName;
+    @JsonProperty
+    private final String exploratoryName;
+    @JsonProperty
+    private final String project;
+    @JsonProperty
+    private final String endpoint;
+
+    public ImageCreateCallbackHandler(RESTService selfService, String uuid, DockerAction action,
+                                      ExploratoryImageDTO image) {
+        super(selfService, image.getCloudSettings().getIamUser(), uuid, action);
+        this.imageName = image.getImageName();
+        this.exploratoryName = image.getExploratoryName();
+        this.project = image.getProject();
+        this.endpoint = image.getEndpoint();
+    }
+
+    @JsonCreator
+    private ImageCreateCallbackHandler(
+            @JacksonInject RESTService selfService, @JsonProperty("uuid") String uuid,
+            @JsonProperty("action") DockerAction action,
+            @JsonProperty("user") String user,
+            @JsonProperty("imageName") String imageName,
+            @JsonProperty("exploratoryName") String exploratoryName,
+            @JsonProperty("project") String projectName,
+            @JsonProperty("endpoint") String endpoint) {
+        super(selfService, user, uuid, action);
+        this.imageName = imageName;
+        this.exploratoryName = exploratoryName;
+        this.project = projectName;
+        this.endpoint = endpoint;
+    }
+
+    @Override
+    protected String getCallbackURI() {
+        return ApiCallbacks.IMAGE_STATUS_URI;
+    }
+
+    @Override
+    protected ImageCreateStatusDTO parseOutResponse(JsonNode document, ImageCreateStatusDTO statusDTO) {
+        if (document != null) {
+            statusDTO.withImageCreateDto(toImageCreateDto(document.toString()));
+        }
+        return statusDTO;
+    }
+
+    @Override
+    protected ImageCreateStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
+        final ImageCreateStatusDTO statusDTO = super.getBaseStatusDTO(status);
+        statusDTO.setExploratoryName(exploratoryName);
+        statusDTO.setName(imageName);
+        statusDTO.setProject(project);
+        statusDTO.setEndpoint(endpoint);
+        statusDTO.withoutImageCreateDto();
+        return statusDTO;
+    }
+
+    private ImageCreateStatusDTO.ImageCreateDTO toImageCreateDto(String content) {
+        try {
+            return mapper.readValue(content, ImageCreateStatusDTO.ImageCreateDTO.class);
+        } catch (IOException e) {
+            log.error("Can't parse create image response with content {} for uuid {}", content, getUUID());
+            throw new DatalabException(String.format("Can't parse create image response with content %s for uuid %s",
+                    content, getUUID()), e);
+        }
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/LibInstallCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/LibInstallCallbackHandler.java
new file mode 100644
index 0000000..6ddfc00
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/LibInstallCallbackHandler.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.exploratory.LibInstallDTO;
+import com.epam.datalab.dto.exploratory.LibInstallStatusDTO;
+import com.epam.datalab.dto.exploratory.LibraryInstallDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Handler of docker response for the request for libraries installation.
+ */
+@Slf4j
+public class LibInstallCallbackHandler extends ResourceCallbackHandler<LibInstallStatusDTO> {
+
+    /**
+     * Name of node in response "Libs".
+     */
+    private static final String LIBS = "Libs";
+
+    /**
+     * Full name of node in response "Libs".
+     */
+    private static final String LIBS_ABSOLUTE_PATH = RESPONSE_NODE + "." + RESULT_NODE + "." + LIBS;
+
+    /**
+     * Exploratory DTO.
+     */
+    @JsonProperty
+    private final LibraryInstallDTO dto;
+
+    /**
+     * Instantiate handler for process of docker response for libraries installation.
+     *
+     * @param selfService REST pointer for Self Service.
+     * @param action      docker action.
+     * @param uuid        request UID.
+     * @param dto         contains libraries to instal
+     */
+    @JsonCreator
+    public LibInstallCallbackHandler(
+            @JacksonInject RESTService selfService,
+            @JsonProperty("action") DockerAction action,
+            @JsonProperty("uuid") String uuid, @JsonProperty("user") String user,
+            @JsonProperty("dto") LibraryInstallDTO dto) {
+        super(selfService, user, uuid, action);
+        this.dto = dto;
+    }
+
+    @Override
+    protected String getCallbackURI() {
+        return ApiCallbacks.LIB_STATUS_URI;
+    }
+
+    @Override
+    protected LibInstallStatusDTO parseOutResponse(JsonNode resultNode, LibInstallStatusDTO status) {
+
+        if (UserInstanceStatus.FAILED == UserInstanceStatus.of(status.getStatus()) || resultNode == null) {
+            throw new DatalabException("Can't handle response result node is null or response status is failed");
+        }
+
+        JsonNode nodeLibs = resultNode.get(LIBS);
+        if (nodeLibs == null) {
+            throw new DatalabException("Can't handle response without property " + LIBS_ABSOLUTE_PATH);
+        }
+        try {
+            final List<LibInstallDTO> libs = mapper.readValue(nodeLibs.toString(),
+                    new TypeReference<List<LibInstallDTO>>() {
+                    });
+            status.withLibs(libs);
+        } catch (IOException e) {
+            log.warn("Can't parse field {} for UUID {} in JSON", LIBS_ABSOLUTE_PATH, getUUID(), e);
+        }
+
+        return status;
+    }
+
+    @Override
+    protected LibInstallStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
+        return super.getBaseStatusDTO(status)
+                .withExploratoryName(dto.getExploratoryName())
+                .withComputationalName(dto.getComputationalName())
+                .withProject(dto.getProject())
+                .withUptime(Date.from(Instant.now()));
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/LibListCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/LibListCallbackHandler.java
new file mode 100644
index 0000000..04efa6a
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/LibListCallbackHandler.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.exploratory.LibListStatusDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+/**
+ * Handler of docker response for the request the list of libraries.
+ */
+public class LibListCallbackHandler extends ResourceCallbackHandler<LibListStatusDTO> {
+
+    /**
+     * Name of node in response "file".
+     */
+    private static final String FILE = "file";
+
+    /**
+     * The name of docker image.
+     */
+    @JsonProperty
+    private final String group;
+
+    /**
+     * Instantiate handler for process of docker response for list of libraries.
+     *
+     * @param selfService REST pointer for Self Service.
+     * @param action      docker action.
+     * @param uuid        request UID.
+     * @param user        the name of user.
+     * @param group       the name of a group.
+     */
+    @JsonCreator
+    public LibListCallbackHandler(
+            @JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action,
+            @JsonProperty("uuid") String uuid, @JsonProperty("user") String user,
+            @JsonProperty("group") String group) {
+        super(selfService, user, uuid, action);
+        this.group = group;
+    }
+
+    @Override
+    protected String getCallbackURI() {
+        return ApiCallbacks.UPDATE_LIBS_URI;
+    }
+
+    @Override
+    protected LibListStatusDTO parseOutResponse(JsonNode resultNode, LibListStatusDTO status) {
+        if (UserInstanceStatus.FAILED == UserInstanceStatus.of(status.getStatus())) {
+            return status;
+        }
+        if (resultNode == null) {
+            throw new DatalabException("Can't handle response result node is null");
+        }
+
+        JsonNode resultFileNode = resultNode.get(FILE);
+        if (resultFileNode == null) {
+            throw new DatalabException("Can't handle response without property " + FILE);
+        }
+
+        Path path = Paths.get(resultFileNode.asText()).toAbsolutePath();
+        if (path.toFile().exists()) {
+            try {
+                status.withLibs(new String(Files.readAllBytes(path)));
+                Files.delete(path);
+                return status;
+            } catch (IOException e) {
+                throw new DatalabException("Can't read file " + path + " : " + e.getLocalizedMessage(), e);
+            }
+        } else {
+            throw new DatalabException("Can't handle response. The file " + path + " does not exist");
+        }
+    }
+
+    @Override
+    protected LibListStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
+        return super.getBaseStatusDTO(status)
+                .withGroup(group);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/OdahuCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/OdahuCallbackHandler.java
new file mode 100644
index 0000000..494a93b
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/OdahuCallbackHandler.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.base.odahu.OdahuResult;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+public class OdahuCallbackHandler extends ResourceCallbackHandler<OdahuResult> {
+
+    private static final String ODAHU_URLS_FIELD = "odahu_urls";
+    private static final String GRAFANA_ADMIN = "grafana_admin";
+    private static final String GRAFANA_PASSWORD = "grafana_pass";
+    private static final String OAUTH_COOKIE_SECRET = "oauth_cookie_secret";
+    private static final String DECRYPT_TOKEN = "odahuflow_connection_decrypt_token";
+    private final String callbackUri;
+    private final String name;
+    private final String projectName;
+    private final String endpointName;
+
+    public OdahuCallbackHandler(RESTService selfService, String user, String uuid, DockerAction action,
+                                String callbackUri, String name, String projectName, String endpointName) {
+        super(selfService, user, uuid, action);
+        this.callbackUri = callbackUri;
+        this.name = name;
+        this.projectName = projectName;
+        this.endpointName = endpointName;
+    }
+
+    @Override
+    protected String getCallbackURI() {
+        return callbackUri;
+    }
+
+    @Override
+    protected OdahuResult parseOutResponse(JsonNode resultNode, OdahuResult result) {
+        result.setName(name);
+        result.setProjectName(projectName);
+        result.setEndpointName(endpointName);
+
+        if (resultNode == null) {
+            return result;
+        }
+        result.setGrafanaAdmin(getTextValue(resultNode.get(GRAFANA_ADMIN)));
+        result.setGrafanaPassword(getTextValue(resultNode.get(GRAFANA_PASSWORD)));
+        result.setOauthCookieSecret(getTextValue(resultNode.get(OAUTH_COOKIE_SECRET)));
+        result.setDecryptToken(getTextValue(resultNode.get(DECRYPT_TOKEN)));
+
+        final JsonNode odahuUrls = resultNode.get(ODAHU_URLS_FIELD);
+        List<ResourceURL> urls = null;
+        if (odahuUrls != null) {
+            try {
+                urls = mapper.readValue(odahuUrls.toString(), new TypeReference<List<ResourceURL>>() {
+                });
+                result.setResourceUrls(urls);
+            } catch (IOException e) {
+                log.warn("Cannot parse field {} for UUID {} in JSON",
+                        RESPONSE_NODE + "." + RESULT_NODE + "." + ODAHU_URLS_FIELD, getUUID(), e);
+            }
+        }
+
+        if (getAction() == DockerAction.CREATE && Objects.isNull(urls)) {
+            log.warn("There are no odahu urls in response file while creating {}", result);
+        }
+
+        return result;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/PersistentFileHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/PersistentFileHandler.java
new file mode 100644
index 0000000..f7f9625
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/PersistentFileHandler.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public final class PersistentFileHandler {
+
+    private final FileHandlerCallback handler;
+    private final long timeout;
+    private final String directory;
+
+    @JsonCreator
+    public PersistentFileHandler(@JsonProperty("handler") FileHandlerCallback handler, @JsonProperty("timeout")
+            long timeout, @JsonProperty("directory") String directory) {
+        this.handler = handler;
+        this.timeout = timeout;
+        this.directory = directory;
+    }
+
+    public FileHandlerCallback getHandler() {
+        return handler;
+    }
+
+    public long getTimeout() {
+        return timeout;
+    }
+
+    public String getDirectory() {
+        return directory;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ProjectCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ProjectCallbackHandler.java
new file mode 100644
index 0000000..a0c699e
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ProjectCallbackHandler.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.epam.datalab.dto.base.project.ProjectResult;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.databind.JsonNode;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+@Slf4j
+public class ProjectCallbackHandler extends ResourceCallbackHandler<ProjectResult> {
+
+
+    private final String callbackUri;
+    private final String projectName;
+    private final Class<? extends EdgeInfo> clazz;
+    private final String endpointName;
+
+    public ProjectCallbackHandler(RESTService selfService, String user,
+                                  String uuid, DockerAction action, String callbackUri, String projectName,
+                                  Class<? extends EdgeInfo> clazz, String endpointName) {
+        super(selfService, user, uuid, action);
+        this.callbackUri = callbackUri;
+        this.projectName = projectName;
+        this.clazz = clazz;
+        this.endpointName = endpointName;
+    }
+
+    @Override
+    protected String getCallbackURI() {
+        return callbackUri;
+    }
+
+    @Override
+    protected ProjectResult parseOutResponse(JsonNode resultNode, ProjectResult baseStatus) {
+
+        baseStatus.setProjectName(projectName);
+        baseStatus.setEndpointName(endpointName);
+        if (resultNode != null &&
+                Arrays.asList(DockerAction.CREATE, DockerAction.RECREATE, DockerAction.START).contains(getAction()) &&
+                UserInstanceStatus.of(baseStatus.getStatus()) != UserInstanceStatus.FAILED) {
+            try {
+                final EdgeInfo projectEdgeInfo = mapper.readValue(resultNode.toString(), clazz);
+                baseStatus.setEdgeInfo(projectEdgeInfo);
+            } catch (IOException e) {
+                throw new DatalabException("Cannot parse the EDGE info in JSON: " + e.getLocalizedMessage(), e);
+            }
+        }
+        return baseStatus;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourceCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourceCallbackHandler.java
new file mode 100644
index 0000000..677a658
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourceCallbackHandler.java
@@ -0,0 +1,211 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.StatusBaseDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.ParameterizedType;
+import java.time.Instant;
+import java.util.Date;
+
+public abstract class ResourceCallbackHandler<T extends StatusBaseDTO<?>> implements FileHandlerCallback {
+    private static final Logger log = LoggerFactory.getLogger(ResourceCallbackHandler.class);
+    final ObjectMapper mapper = new ObjectMapper().configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
+
+    private static final String STATUS_FIELD = "status";
+    protected static final String RESPONSE_NODE = "response";
+    protected static final String RESULT_NODE = "result";
+    private static final String ERROR_NODE = "error";
+
+    private static final String OK_STATUS = "ok";
+
+    @JsonIgnore
+    private final RESTService selfService;
+    @JsonProperty
+    private final String user;
+    @JsonProperty
+    private final String uuid;
+    @JsonProperty
+    private final DockerAction action;
+    @JsonProperty
+    private final Class<T> resultType;
+
+    @SuppressWarnings("unchecked")
+    public ResourceCallbackHandler(RESTService selfService, String user,
+                                   String uuid, DockerAction action) {
+        this.selfService = selfService;
+        this.user = user;
+        this.uuid = uuid;
+        this.action = action;
+        this.resultType =
+                (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
+    }
+
+    public ResourceCallbackHandler(RESTService selfService, String user,
+                                   String uuid,
+                                   DockerAction action,
+                                   Class<T> resultType) {
+        this.selfService = selfService;
+        this.user = user;
+        this.uuid = uuid;
+        this.action = action;
+        this.resultType = resultType;
+    }
+
+    @Override
+    public String getUUID() {
+        return uuid;
+    }
+
+    @Override
+    public boolean checkUUID(String uuid) {
+        return this.uuid.equals(uuid);
+    }
+
+    @Override
+    public String getUser() {
+        return user;
+    }
+
+    public DockerAction getAction() {
+        return action;
+    }
+
+    private void selfServicePost(T object) {
+        debugMessage("Send post request to self service {} for UUID {}, object is {}",
+                getCallbackURI(), uuid, object);
+        try {
+            selfService.post(getCallbackURI(), object, resultType);
+        } catch (Exception e) {
+            log.error("{} Send request or response error for UUID {}: {}", this.getClass().toString(), uuid, e.getLocalizedMessage(), e);
+            throw new DatalabException("Send request or response error for UUID " + uuid + ": " + e.getLocalizedMessage()
+                    , e);
+        }
+    }
+
+    @Override
+    public boolean handle(String fileName, byte[] content) throws Exception {
+        debugMessage("Got file {} while waiting for UUID {}, for action {}, docker response: {}",
+                fileName, uuid, action.name(), new String(content));
+        JsonNode document = mapper.readTree(content);
+        boolean success = isSuccess(document);
+        UserInstanceStatus status = calcStatus(action, success);
+        T result = getBaseStatusDTO(status);
+
+        JsonNode resultNode = document.get(RESPONSE_NODE).get(RESULT_NODE);
+        if (success) {
+            debugMessage("Did {} resource for user: {}, UUID: {}", action, user, uuid);
+        } else {
+            log.error("Could not {} resource for user: {}, UUID: {}", action, user, uuid);
+            result.setErrorMessage(getTextValue(resultNode.get(ERROR_NODE)));
+        }
+        result = parseOutResponse(resultNode, result);
+        selfServicePost(result);
+        return !UserInstanceStatus.FAILED.equals(status);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public void handleError(String errorMessage) {
+        try {
+            selfServicePost((T) getBaseStatusDTO(UserInstanceStatus.FAILED)
+                    .withErrorMessage(errorMessage));
+        } catch (Exception t) {
+            throw new DatalabException("Could not send error message to Self Service for UUID "
+                    + uuid + ", user " + user + ": " + errorMessage, t);
+        }
+    }
+
+    protected abstract String getCallbackURI();
+
+    protected abstract T parseOutResponse(JsonNode document, T baseStatus);
+
+    @SuppressWarnings("unchecked")
+    protected T getBaseStatusDTO(UserInstanceStatus status) {
+        try {
+            return (T) resultType.newInstance()
+                    .withRequestId(uuid)
+                    .withUser(user)
+                    .withStatus(status)
+                    .withUptime(getUptime(status));
+        } catch (Exception t) {
+            throw new DatalabException("Something went wrong", t);
+        }
+    }
+
+    private boolean isSuccess(JsonNode document) {
+        return OK_STATUS.equals(document.get(STATUS_FIELD).textValue());
+    }
+
+    private UserInstanceStatus calcStatus(DockerAction action, boolean success) {
+        if (success) {
+            switch (action) {
+                case STATUS:
+                case GIT_CREDS:
+                case LIB_LIST:
+                case LIB_INSTALL:
+                case CREATE_IMAGE:
+                    return UserInstanceStatus.CREATED; // Any status besides failed
+                case CREATE:
+                case RECREATE:
+                case CONFIGURE:
+                case START:
+                case RECONFIGURE_SPARK:
+                    return UserInstanceStatus.RUNNING;
+                case STOP:
+                    return UserInstanceStatus.STOPPED;
+                case TERMINATE:
+                    return UserInstanceStatus.TERMINATED;
+                default:
+                    break;
+            }
+        }
+        return UserInstanceStatus.FAILED;
+    }
+
+    protected Date getUptime(UserInstanceStatus status) {
+        return UserInstanceStatus.RUNNING == status ? Date.from(Instant.now()) : null;
+    }
+
+    protected String getTextValue(JsonNode jsonNode) {
+        return jsonNode != null ? jsonNode.textValue() : null;
+    }
+
+    private void debugMessage(String format, Object... arguments) {
+        if (action == DockerAction.STATUS) {
+            log.trace(format, arguments);
+        } else {
+            log.debug(format, arguments);
+        }
+    }
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourcesStatusCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourcesStatusCallbackHandler.java
new file mode 100644
index 0000000..bc0a34c
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ResourcesStatusCallbackHandler.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.status.EnvResource;
+import com.epam.datalab.dto.status.EnvResourceList;
+import com.epam.datalab.dto.status.EnvStatusDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.JsonNode;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.epam.datalab.rest.contracts.ApiCallbacks.INFRASTRUCTURE;
+import static com.epam.datalab.rest.contracts.ApiCallbacks.STATUS_URI;
+
+@Slf4j
+public class ResourcesStatusCallbackHandler extends ResourceCallbackHandler<EnvStatusDTO> {
+
+    private final Map<String, EnvResource> datalabHostResources;
+
+    @JsonCreator
+    public ResourcesStatusCallbackHandler(@JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action,
+                                          @JsonProperty("uuid") String uuid, @JsonProperty("user") String user,
+                                          EnvResourceList resourceList) {
+        super(selfService, user, uuid, action);
+        this.datalabHostResources = getEnvResources(resourceList);
+    }
+
+    @Override
+    protected EnvStatusDTO parseOutResponse(JsonNode resultNode, EnvStatusDTO baseStatus) {
+        log.trace("Trying to parse: {}, with {}", resultNode, baseStatus);
+        if (resultNode == null) {
+            return baseStatus;
+        }
+
+        EnvResourceList cloudResourceList;
+        try {
+            cloudResourceList = mapper.readValue(resultNode.toString(), EnvResourceList.class);
+        } catch (IOException e) {
+            throw new DatalabException("Docker response for UUID " + getUUID() + " not valid: " + e.getLocalizedMessage(), e);
+        }
+
+        EnvResourceList envResourceList = EnvResourceList.builder()
+                .hostList(getListOrEmpty(cloudResourceList.getHostList()))
+                .clusterList(getListOrEmpty(cloudResourceList.getClusterList()))
+                .build();
+
+        baseStatus
+                .withResourceList(envResourceList)
+                .withUptime(Date.from(Instant.now()));
+
+        log.trace("Inner status {}", baseStatus);
+
+        return baseStatus;
+    }
+
+    private String checkAndMapStatus(String status) {
+        if (status.equalsIgnoreCase ("terminated_with_errors")) {
+            log.trace("While parsing response changed: {} -> {}", status, UserInstanceStatus.TERMINATED);
+            return UserInstanceStatus.TERMINATED.toString();
+        } else {
+            return status;
+        }
+    }
+
+    @Override
+    public boolean handle(String fileName, byte[] content) {
+        try {
+            return super.handle(fileName, content);
+        } catch (Exception e) {
+            log.warn("Could not retrieve the status of resources for UUID {} and user {}: {}",
+                    getUUID(), getUser(), e.getLocalizedMessage(), e);
+        }
+        return true; // Always necessary return true for status response
+    }
+
+    @Override
+    protected String getCallbackURI() {
+        return INFRASTRUCTURE + STATUS_URI;
+    }
+
+    @Override
+    public void handleError(String errorMessage) {
+        // Nothing action for status response
+    }
+
+    private List<EnvResource> getChangedEnvResources(List<EnvResource> envResources) {
+        return envResources
+                .stream()
+                .filter(e -> !e.getStatus().equals(datalabHostResources.get(e.getId()).getStatus()))
+                .map(e -> datalabHostResources.get(e.getId())
+                        .withStatus(checkAndMapStatus(e.getStatus())))
+                .collect(Collectors.toList());
+    }
+
+    private Map<String, EnvResource> getEnvResources(EnvResourceList envResources) {
+        return Stream.concat(envResources.getClusterList().stream(), envResources.getHostList().stream())
+                .collect(Collectors.toMap(EnvResource::getId, e -> e));
+    }
+
+    private List<EnvResource> getListOrEmpty(List<EnvResource> source) {
+        return getChangedEnvResources(Optional.of(source).orElse(Collections.emptyList()));
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ReuploadKeyCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ReuploadKeyCallbackHandler.java
new file mode 100644
index 0000000..1840052
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/ReuploadKeyCallbackHandler.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyCallbackDTO;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyStatus;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyStatusDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.core.Response;
+
+@Slf4j
+public class ReuploadKeyCallbackHandler implements FileHandlerCallback {
+    private static final ObjectMapper MAPPER = new ObjectMapper()
+            .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
+    private static final String STATUS_FIELD = "status";
+    private static final String ERROR_MESSAGE_FIELD = "error_message";
+    @JsonProperty
+    private final String uuid;
+    @JsonProperty
+    private final ReuploadKeyCallbackDTO dto;
+    private final RESTService selfService;
+    @JsonProperty
+    private final String callbackUrl;
+    @JsonProperty
+    private final String user;
+
+    @JsonCreator
+    public ReuploadKeyCallbackHandler(@JacksonInject RESTService selfService,
+                                      @JsonProperty("callbackUrl") String callbackUrl,
+                                      @JsonProperty("user") String user,
+                                      @JsonProperty("dto") ReuploadKeyCallbackDTO dto) {
+        this.selfService = selfService;
+        this.uuid = dto.getId();
+        this.callbackUrl = callbackUrl;
+        this.user = user;
+        this.dto = dto;
+    }
+
+    @Override
+    public String getUUID() {
+        return uuid;
+    }
+
+    @Override
+    public boolean checkUUID(String uuid) {
+        return this.uuid.equals(uuid);
+    }
+
+    @Override
+    public boolean handle(String fileName, byte[] content) throws Exception {
+        final String fileContent = new String(content);
+        log.debug("Got file {} while waiting for UUID {}, reupload key response: {}", fileName, uuid, fileContent);
+
+        final JsonNode jsonNode = MAPPER.readTree(fileContent);
+        final String status = jsonNode.get(STATUS_FIELD).textValue();
+        ReuploadKeyStatusDTO reuploadKeyStatusDTO;
+        if ("ok".equals(status)) {
+            reuploadKeyStatusDTO = buildReuploadKeyStatusDto(ReuploadKeyStatus.COMPLETED);
+        } else {
+            reuploadKeyStatusDTO = buildReuploadKeyStatusDto(ReuploadKeyStatus.FAILED)
+                    .withErrorMessage(jsonNode.get(ERROR_MESSAGE_FIELD).textValue());
+        }
+        selfServicePost(reuploadKeyStatusDTO);
+        return "ok".equals(status);
+    }
+
+    private void selfServicePost(ReuploadKeyStatusDTO statusDTO) {
+        log.debug("Send post request to self service for UUID {}, object is {}", uuid, statusDTO);
+        try {
+            selfService.post(callbackUrl, statusDTO, Response.class);
+        } catch (Exception e) {
+            log.error("Send request or response error for UUID {}: {}", uuid, e.getLocalizedMessage(), e);
+            throw new DatalabException("Send request or response error for UUID " + uuid + ": "
+                    + e.getLocalizedMessage(), e);
+        }
+    }
+
+    @Override
+    public void handleError(String errorMessage) {
+        buildReuploadKeyStatusDto(ReuploadKeyStatus.FAILED)
+                .withErrorMessage(errorMessage);
+    }
+
+    @Override
+    public String getUser() {
+        return user;
+    }
+
+    private ReuploadKeyStatusDTO buildReuploadKeyStatusDto(ReuploadKeyStatus status) {
+        return new ReuploadKeyStatusDTO()
+                .withRequestId(uuid)
+                .withReuploadKeyCallbackDto(dto)
+                .withReuploadKeyStatus(status)
+                .withUser(user);
+    }
+
+}
+
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/CallbackHandlerDao.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/CallbackHandlerDao.java
new file mode 100644
index 0000000..ba8144a
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/CallbackHandlerDao.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers.dao;
+
+import com.epam.datalab.backendapi.core.response.handlers.PersistentFileHandler;
+
+import java.util.List;
+
+public interface CallbackHandlerDao {
+
+    void upsert(PersistentFileHandler handlerCallback);
+
+    List<PersistentFileHandler> findAll();
+
+    void remove(String handlerId);
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
new file mode 100644
index 0000000..6e39555
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers.dao;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.response.handlers.PersistentFileHandler;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.util.FileUtils;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import static java.util.stream.Collectors.toList;
+
+@Singleton
+@Slf4j
+public class FileSystemCallbackHandlerDao implements CallbackHandlerDao {
+
+    @Inject
+    private ProvisioningServiceApplicationConfiguration configuration;
+    @Inject
+    private ObjectMapper mapper;
+
+    @Override
+    public void upsert(PersistentFileHandler handlerCallback) {
+        removeWithUUID(handlerCallback.getHandler().getUUID());
+        final String fileName = fileName(handlerCallback.getHandler().getId());
+        final String absolutePath = getAbsolutePath(fileName);
+        saveToFile(handlerCallback, fileName, absolutePath);
+    }
+
+    @Override
+    public List<PersistentFileHandler> findAll() {
+        try (final Stream<Path> pathStream = Files.list(Paths.get(configuration.getHandlerDirectory()))) {
+            return pathStream.map(this::toPersistentFileHandler)
+                    .filter(Optional::isPresent)
+                    .map(Optional::get)
+                    .collect(toList());
+        } catch (IOException e) {
+            log.error("Can not restore handlers due to: {}", e.getMessage(), e);
+        }
+        return Collections.emptyList();
+    }
+
+    @Override
+    public void remove(String handlerId) {
+        try {
+            Files.delete(Paths.get(getAbsolutePath(fileName(handlerId))));
+        } catch (Exception e) {
+            log.error("Can not remove handler {} due to: {}", handlerId, e.getMessage(), e);
+            throw new DatalabException("Can not remove handler " + handlerId + " due to: " + e.getMessage());
+        }
+    }
+
+    private void removeWithUUID(String uuid) {
+        try (final Stream<Path> pathStream = Files.list(Paths.get(configuration.getHandlerDirectory()))) {
+            pathStream.map(Path::toString)
+                    .filter(path -> path.contains(uuid))
+                    .findAny()
+                    .ifPresent(FileUtils::deleteFile);
+        } catch (IOException e) {
+            log.error("Problem occurred with accessing directory {} due to: {}", configuration.getHandlerDirectory(),
+                    e.getLocalizedMessage(), e);
+        }
+    }
+
+    private String getAbsolutePath(String fileName) {
+        return configuration.getHandlerDirectory() + File.separator + fileName;
+    }
+
+    private void saveToFile(PersistentFileHandler handlerCallback, String fileName, String absolutePath) {
+        try {
+            log.trace("Persisting callback handler to file {}", absolutePath);
+            Files.write(Paths.get(absolutePath), mapper.writeValueAsBytes(handlerCallback), StandardOpenOption.CREATE);
+        } catch (Exception e) {
+            log.warn("Can not persist file handler {} due to {}", fileName, e.getMessage(), e);
+        }
+    }
+
+    private String fileName(String handlerId) {
+        return handlerId + ".json";
+    }
+
+    private Optional<PersistentFileHandler> toPersistentFileHandler(Path path) {
+        try {
+            return Optional.of(mapper.readValue(path.toFile(), PersistentFileHandler.class));
+        } catch (Exception e) {
+            log.warn("Can not deserialize file handler from file: {}", path.toString(), e);
+        }
+        return Optional.empty();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/AwsProvisioningModule.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/AwsProvisioningModule.java
new file mode 100644
index 0000000..bced6b7
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/AwsProvisioningModule.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.modules;
+
+import com.epam.datalab.backendapi.resources.aws.ComputationalResourceAws;
+import com.epam.datalab.backendapi.resources.aws.EdgeResourceAws;
+import com.epam.datalab.backendapi.resources.aws.ExploratoryResourceAws;
+import com.epam.datalab.backendapi.resources.aws.InfrastructureResourceAws;
+import com.epam.datalab.cloud.CloudModule;
+import com.google.inject.Injector;
+import io.dropwizard.setup.Environment;
+
+public class AwsProvisioningModule extends CloudModule {
+
+    @Override
+    public void init(Environment environment, Injector injector) {
+        environment.jersey().register(injector.getInstance(EdgeResourceAws.class));
+        environment.jersey().register(injector.getInstance(InfrastructureResourceAws.class));
+        environment.jersey().register(injector.getInstance(ExploratoryResourceAws.class));
+        environment.jersey().register(injector.getInstance(ComputationalResourceAws.class));
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/AzureProvisioningModule.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/AzureProvisioningModule.java
new file mode 100644
index 0000000..b0f2555
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/AzureProvisioningModule.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.modules;
+
+import com.epam.datalab.backendapi.resources.azure.ComputationalResourceAzure;
+import com.epam.datalab.backendapi.resources.azure.EdgeResourceAzure;
+import com.epam.datalab.backendapi.resources.azure.ExploratoryResourceAzure;
+import com.epam.datalab.backendapi.resources.azure.InfrastructureResourceAzure;
+import com.epam.datalab.cloud.CloudModule;
+import com.google.inject.Injector;
+import io.dropwizard.setup.Environment;
+
+public class AzureProvisioningModule extends CloudModule {
+
+    @Override
+    public void init(Environment environment, Injector injector) {
+        environment.jersey().register(injector.getInstance(EdgeResourceAzure.class));
+        environment.jersey().register(injector.getInstance(InfrastructureResourceAzure.class));
+        environment.jersey().register(injector.getInstance(ExploratoryResourceAzure.class));
+        environment.jersey().register(injector.getInstance(ComputationalResourceAzure.class));
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/CloudModuleConfigurator.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/CloudModuleConfigurator.java
new file mode 100644
index 0000000..ba1595b
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/CloudModuleConfigurator.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.modules;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.cloud.CloudModule;
+
+public class CloudModuleConfigurator {
+
+    private CloudModuleConfigurator() {
+    }
+
+    public static CloudModule getCloudModule(ProvisioningServiceApplicationConfiguration configuration) {
+        switch (configuration.getCloudProvider()) {
+            case AWS:
+                return new AwsProvisioningModule();
+            case AZURE:
+                return new AzureProvisioningModule();
+            case GCP:
+                return new GcpProvisioningModule();
+            default:
+                throw new UnsupportedOperationException("Unsupported cloud provider " + configuration.getCloudProvider());
+        }
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/GcpProvisioningModule.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/GcpProvisioningModule.java
new file mode 100644
index 0000000..2e07e39
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/GcpProvisioningModule.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.modules;
+
+import com.epam.datalab.backendapi.resources.gcp.ComputationalResourceGcp;
+import com.epam.datalab.backendapi.resources.gcp.EdgeResourceGcp;
+import com.epam.datalab.backendapi.resources.gcp.ExploratoryResourceGcp;
+import com.epam.datalab.backendapi.resources.gcp.InfrastructureResourceGcp;
+import com.epam.datalab.cloud.CloudModule;
+import com.google.inject.Injector;
+import io.dropwizard.setup.Environment;
+
+public class GcpProvisioningModule extends CloudModule {
+
+    @Override
+    public void init(Environment environment, Injector injector) {
+        environment.jersey().register(injector.getInstance(EdgeResourceGcp.class));
+        environment.jersey().register(injector.getInstance(InfrastructureResourceGcp.class));
+        environment.jersey().register(injector.getInstance(ExploratoryResourceGcp.class));
+        environment.jersey().register(injector.getInstance(ComputationalResourceGcp.class));
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/ModuleFactory.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/ModuleFactory.java
new file mode 100644
index 0000000..e55ee25
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/ModuleFactory.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.modules;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.google.inject.AbstractModule;
+import io.dropwizard.setup.Environment;
+
+public class ModuleFactory {
+
+    private ModuleFactory() {
+    }
+
+    /**
+     * Instantiates an application configuration of Provisioning Service for production or tests if
+     * the mock property of configuration is set to <b>true</b> and method {@link ProvisioningServiceApplicationConfiguration#isDevMode()}}
+     * returns <b>true</b> value.
+     *
+     * @param configuration application configuration of Provisioning Service.
+     * @param environment   environment of Provisioning Service.
+     */
+    public static AbstractModule getModule(ProvisioningServiceApplicationConfiguration configuration, Environment environment) {
+        return configuration.isDevMode()
+                ? new ProvisioningDevModule(configuration, environment)
+                : new ProductionModule(configuration, environment);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/ProductionModule.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/ProductionModule.java
new file mode 100644
index 0000000..18d38d8
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/ProductionModule.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.modules;
+
+import com.epam.datalab.ModuleBase;
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.DockerWarmuper;
+import com.epam.datalab.backendapi.core.MetadataHolder;
+import com.epam.datalab.backendapi.core.commands.CommandExecutor;
+import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
+import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
+import com.epam.datalab.backendapi.core.response.handlers.dao.FileSystemCallbackHandlerDao;
+import com.epam.datalab.backendapi.service.BucketService;
+import com.epam.datalab.backendapi.service.CheckInactivityService;
+import com.epam.datalab.backendapi.service.OdahuService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.service.RestoreCallbackHandlerService;
+import com.epam.datalab.backendapi.service.impl.CheckInactivityServiceImpl;
+import com.epam.datalab.backendapi.service.impl.OdahuServiceImpl;
+import com.epam.datalab.backendapi.service.impl.ProjectServiceImpl;
+import com.epam.datalab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
+import com.epam.datalab.backendapi.service.impl.aws.BucketServiceAwsImpl;
+import com.epam.datalab.backendapi.service.impl.azure.BucketServiceAzureImpl;
+import com.epam.datalab.backendapi.service.impl.gcp.BucketServiceGcpImpl;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.name.Names;
+import io.dropwizard.setup.Environment;
+
+/**
+ * Production class for an application configuration of SelfService.
+ */
+public class ProductionModule extends ModuleBase<ProvisioningServiceApplicationConfiguration> {
+
+    /**
+     * Instantiates an application configuration of SelfService for production environment.
+     *
+     * @param configuration application configuration of SelfService.
+     * @param environment   environment of SelfService.
+     */
+    ProductionModule(ProvisioningServiceApplicationConfiguration configuration, Environment environment) {
+        super(configuration, environment);
+    }
+
+    @Override
+    protected void configure() {
+        bind(ProvisioningServiceApplicationConfiguration.class).toInstance(configuration);
+
+        bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.SECURITY_SERVICE_NAME))
+                .toInstance(configuration.getSecurityFactory()
+                        .build(environment, ServiceConsts.SECURITY_SERVICE_NAME, ServiceConsts
+                                .PROVISIONING_USER_AGENT));
+
+        bind(RESTService.class).toInstance(configuration.getSelfFactory().build(environment, ServiceConsts
+                .SELF_SERVICE_NAME));
+        bind(MetadataHolder.class).to(DockerWarmuper.class);
+        bind(ICommandExecutor.class).to(CommandExecutor.class).asEagerSingleton();
+        bind(ObjectMapper.class).toInstance(new ObjectMapper().configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true));
+        bind(CallbackHandlerDao.class).to(FileSystemCallbackHandlerDao.class);
+        bind(RestoreCallbackHandlerService.class).to(RestoreCallbackHandlerServiceImpl.class);
+        bind(CheckInactivityService.class).to(CheckInactivityServiceImpl.class);
+        bind(ProjectService.class).to(ProjectServiceImpl.class);
+        bind(OdahuService.class).to(OdahuServiceImpl.class);
+        if (configuration.getCloudProvider() == CloudProvider.GCP) {
+            bind(BucketService.class).to(BucketServiceGcpImpl.class);
+        } else if (configuration.getCloudProvider() == CloudProvider.AWS) {
+            bind(BucketService.class).to(BucketServiceAwsImpl.class);
+        } else if (configuration.getCloudProvider() == CloudProvider.AZURE) {
+            bind(BucketService.class).to(BucketServiceAzureImpl.class);
+        }
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/ProvisioningDevModule.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/ProvisioningDevModule.java
new file mode 100644
index 0000000..f1b3319
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/modules/ProvisioningDevModule.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.modules;
+
+import com.epam.datalab.ModuleBase;
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.auth.contract.SecurityAPI;
+import com.epam.datalab.auth.dto.UserCredentialDTO;
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.DockerWarmuper;
+import com.epam.datalab.backendapi.core.MetadataHolder;
+import com.epam.datalab.backendapi.core.commands.CommandExecutorMock;
+import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
+import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
+import com.epam.datalab.backendapi.core.response.handlers.dao.FileSystemCallbackHandlerDao;
+import com.epam.datalab.backendapi.service.BucketService;
+import com.epam.datalab.backendapi.service.CheckInactivityService;
+import com.epam.datalab.backendapi.service.OdahuService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.service.RestoreCallbackHandlerService;
+import com.epam.datalab.backendapi.service.impl.CheckInactivityServiceImpl;
+import com.epam.datalab.backendapi.service.impl.OdahuServiceImpl;
+import com.epam.datalab.backendapi.service.impl.ProjectServiceImpl;
+import com.epam.datalab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
+import com.epam.datalab.backendapi.service.impl.aws.BucketServiceAwsImpl;
+import com.epam.datalab.backendapi.service.impl.azure.BucketServiceAzureImpl;
+import com.epam.datalab.backendapi.service.impl.gcp.BucketServiceGcpImpl;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.DockerAPI;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.name.Names;
+import io.dropwizard.setup.Environment;
+
+import javax.ws.rs.core.Response;
+
+/**
+ * Mock class for an application configuration of Provisioning Service for tests.
+ */
+public class ProvisioningDevModule extends ModuleBase<ProvisioningServiceApplicationConfiguration> implements
+        SecurityAPI, DockerAPI {
+
+    private static final String TOKEN = "token123";
+    private static final String OPERATION_IS_NOT_SUPPORTED = "Operation is not supported";
+
+    /**
+     * Instantiates an application configuration of Provisioning Service for tests.
+     *
+     * @param configuration application configuration of Provisioning Service.
+     * @param environment   environment of Provisioning Service.
+     */
+    ProvisioningDevModule(ProvisioningServiceApplicationConfiguration configuration, Environment environment) {
+        super(configuration, environment);
+    }
+
+    @Override
+    protected void configure() {
+        bind(ProvisioningServiceApplicationConfiguration.class).toInstance(configuration);
+        bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.SECURITY_SERVICE_NAME)).toInstance
+                (createAuthenticationService());
+        bind(RESTService.class).toInstance(configuration.getSelfFactory().build(environment, ServiceConsts
+                .SELF_SERVICE_NAME));
+        bind(MetadataHolder.class).to(DockerWarmuper.class);
+        bind(ICommandExecutor.class).toInstance(new CommandExecutorMock(configuration.getCloudProvider()));
+        bind(ObjectMapper.class).toInstance(new ObjectMapper().configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true));
+        bind(CallbackHandlerDao.class).to(FileSystemCallbackHandlerDao.class);
+        bind(RestoreCallbackHandlerService.class).to(RestoreCallbackHandlerServiceImpl.class);
+        bind(CheckInactivityService.class).to(CheckInactivityServiceImpl.class);
+        bind(ProjectService.class).to(ProjectServiceImpl.class);
+        bind(OdahuService.class).to(OdahuServiceImpl.class);
+        if (configuration.getCloudProvider() == CloudProvider.GCP) {
+            bind(BucketService.class).to(BucketServiceGcpImpl.class);
+        } else if (configuration.getCloudProvider() == CloudProvider.AWS) {
+            bind(BucketService.class).to(BucketServiceAwsImpl.class);
+        } else if (configuration.getCloudProvider() == CloudProvider.AZURE) {
+            bind(BucketService.class).to(BucketServiceAzureImpl.class);
+        }
+    }
+
+    /**
+     * Creates and returns the mock object for authentication service.
+     */
+    @SuppressWarnings("unchecked")
+    private RESTService createAuthenticationService() {
+        return new RESTService() {
+            @Override
+            public <T> T post(String path, Object parameter, Class<T> clazz) {
+                if (LOGIN.equals(path)) {
+                    return authorize((UserCredentialDTO) parameter);
+                } else if (GET_USER_INFO.equals(path) && TOKEN.equals(parameter) && clazz.equals(UserInfo.class)) {
+                    return (T) getUserInfo();
+                }
+                throw new UnsupportedOperationException(OPERATION_IS_NOT_SUPPORTED);
+            }
+
+            private <T> T authorize(UserCredentialDTO credential) {
+                if ("test".equals(credential.getUsername())) {
+                    return (T) Response.ok(TOKEN).build();
+                } else {
+                    return (T) Response.status(Response.Status.UNAUTHORIZED)
+                            .entity("Username or password is invalid")
+                            .build();
+                }
+            }
+
+            @Override
+            public <T> T get(String path, Class<T> clazz) {
+                throw new UnsupportedOperationException(OPERATION_IS_NOT_SUPPORTED);
+            }
+
+            @Override
+            public <T> T get(String path, String accessToken, Class<T> clazz) {
+                throw new UnsupportedOperationException(OPERATION_IS_NOT_SUPPORTED);
+            }
+
+            @Override
+            public <T> T post(String path, String accessToken, Object parameter, Class<T> clazz) {
+                throw new UnsupportedOperationException(OPERATION_IS_NOT_SUPPORTED);
+            }
+        };
+    }
+
+    /**
+     * Create and return UserInfo object.
+     */
+    private UserInfo getUserInfo() {
+        UserInfo userInfo = new UserInfo("test", TOKEN);
+        userInfo.addRole("test");
+        userInfo.addRole("dev");
+        return userInfo;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/BackupResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/BackupResource.java
new file mode 100644
index 0000000..4b0cce7
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/BackupResource.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
+import com.epam.datalab.backendapi.core.commands.PythonBackupCommand;
+import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.datalab.backendapi.core.response.handlers.BackupCallbackHandler;
+import com.epam.datalab.dto.backup.EnvBackupDTO;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.epam.datalab.rest.contracts.BackupAPI;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path(BackupAPI.BACKUP)
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class BackupResource {
+
+    @Inject
+    private ProvisioningServiceApplicationConfiguration configuration;
+    @Inject
+    protected FolderListenerExecutor folderListenerExecutor;
+    @Inject
+    protected ICommandExecutor commandExecutor;
+    @Inject
+    protected RESTService selfService;
+
+
+    @POST
+    public Response createBackup(@Auth UserInfo ui, EnvBackupDTO dto) {
+        folderListenerExecutor.start(configuration.getBackupDirectory(), configuration.getProcessTimeout(),
+                new BackupCallbackHandler(selfService, ApiCallbacks.BACKUP_URI, ui.getName(), dto));
+        String command = new PythonBackupCommand(configuration.getBackupScriptPath())
+                .withConfig(dto.getConfigFiles())
+                .withJars(dto.getJars())
+                .withKeys(dto.getKeys())
+                .withDBBackup(dto.isDatabaseBackup())
+                .withLogsBackup(dto.isLogsBackup())
+                .withResponsePath(configuration.getBackupDirectory())
+                .withRequestId(dto.getId())
+                .withSystemUser()
+                .withCertificates(dto.getCertificates()).toCMD();
+        commandExecutor.executeAsync(ui.getName(), dto.getId(), command);
+        return Response.accepted(dto.getId()).build();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/BucketResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/BucketResource.java
new file mode 100644
index 0000000..71716b0
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/BucketResource.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.BucketService;
+import com.epam.datalab.dto.bucket.BucketDeleteDTO;
+import com.epam.datalab.dto.bucket.FolderUploadDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.fileupload.FileItemIterator;
+import org.apache.commons.fileupload.FileItemStream;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.fileupload.util.Streams;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+
+@Slf4j
+@Path("/bucket")
+public class BucketResource {
+    private static final String OBJECT_FORM_FIELD = "object";
+    private static final String BUCKET_FORM_FIELD = "bucket";
+    private static final String SIZE_FORM_FIELD = "file-size";
+
+    private final BucketService bucketService;
+
+    @Inject
+    public BucketResource(BucketService bucketService) {
+        this.bucketService = bucketService;
+    }
+
+    @GET
+    @Path("/{bucket}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getListOfObjects(@Auth UserInfo userInfo,
+                                     @PathParam("bucket") String bucket) {
+        return Response.ok(bucketService.getObjects(bucket)).build();
+    }
+
+    @POST
+    @Path("/upload")
+    @Consumes(MediaType.MULTIPART_FORM_DATA)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response uploadObject(@Auth UserInfo userInfo, @Context HttpServletRequest request) {
+        upload(request);
+        return Response.ok().build();
+    }
+
+    @POST
+    @Path("/folder/upload")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response uploadFolder(@Auth UserInfo userInfo, @Valid FolderUploadDTO dto) {
+        bucketService.uploadFolder(userInfo, dto.getBucket(), dto.getFolder());
+        return Response.ok().build();
+    }
+
+    @GET
+    @Path("/{bucket}/object/{object}/download")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_OCTET_STREAM)
+    public Response downloadObject(@Auth UserInfo userInfo, @Context HttpServletResponse resp,
+                                   @PathParam("object") String object,
+                                   @PathParam("bucket") String bucket) {
+        bucketService.downloadObject(bucket, object, resp);
+        return Response.ok().build();
+    }
+
+    @POST
+    @Path("/objects/delete")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response uploadObject(@Auth UserInfo userInfo, BucketDeleteDTO bucketDeleteDTO) {
+        bucketService.deleteObjects(bucketDeleteDTO.getBucket(), bucketDeleteDTO.getObjects());
+        return Response.ok().build();
+    }
+
+    private void upload(HttpServletRequest request) {
+        String object = null;
+        String bucket = null;
+        long fileSize = 0;
+
+        ServletFileUpload upload = new ServletFileUpload();
+        try {
+            FileItemIterator iterStream = upload.getItemIterator(request);
+            while (iterStream.hasNext()) {
+                FileItemStream item = iterStream.next();
+                try (InputStream stream = item.openStream()) {
+                    if (item.isFormField()) {
+                        if (OBJECT_FORM_FIELD.equals(item.getFieldName())) {
+                            object = Streams.asString(stream);
+                        }
+                        if (BUCKET_FORM_FIELD.equals(item.getFieldName())) {
+                            bucket = Streams.asString(stream);
+                        }
+                        if (SIZE_FORM_FIELD.equals(item.getFieldName())) {
+                            fileSize = Long.parseLong(Streams.asString(stream));
+                        }
+                    } else {
+                        bucketService.uploadObject(bucket, object, stream, item.getContentType(), fileSize);
+                    }
+                } catch (Exception e) {
+                    log.error("Cannot upload object {} to bucket {}. {}", object, bucket, e.getMessage(), e);
+                    throw new DatalabException(String.format("Cannot upload object %s to bucket %s. %s", object, bucket, e.getMessage()));
+                }
+            }
+        } catch (Exception e) {
+            log.error("Cannot upload object {} to bucket {}. {}", object, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot upload object %s to bucket %s. %s", object, bucket, e.getMessage()));
+        }
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/CallbackHandlerResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/CallbackHandlerResource.java
new file mode 100644
index 0000000..8062dd6
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/CallbackHandlerResource.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.backendapi.service.RestoreCallbackHandlerService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Response;
+
+@Path("/handler")
+@Slf4j
+public class CallbackHandlerResource {
+    private final RestoreCallbackHandlerService restoreCallbackHandlerService;
+
+    @Inject
+    public CallbackHandlerResource(RestoreCallbackHandlerService restoreCallbackHandlerService) {
+        this.restoreCallbackHandlerService = restoreCallbackHandlerService;
+    }
+
+    @POST
+    @Path("/restore")
+    public Response restoreHandlers() {
+        restoreCallbackHandlerService.restore();
+        return Response.ok().build();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java
new file mode 100644
index 0000000..e9ad2bf
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.response.folderlistener.WatchItem;
+import com.epam.datalab.properties.ChangePropertiesConst;
+import com.epam.datalab.properties.ChangePropertiesService;
+import com.epam.datalab.properties.RestartForm;
+import com.epam.datalab.properties.YmlDTO;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.inject.Inject;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Arrays;
+import java.util.List;
+
+import static com.epam.datalab.backendapi.core.response.folderlistener.WatchItem.ItemStatus.INPROGRESS;
+import static com.epam.datalab.backendapi.core.response.folderlistener.WatchItem.ItemStatus.WAIT_FOR_FILE;
+
+@Path("/config")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ChangePropertiesResource implements ChangePropertiesConst {
+
+    private final ChangePropertiesService changePropertiesService;
+    private final List<WatchItem.ItemStatus> inProgressStatuses = Arrays.asList(INPROGRESS, WAIT_FOR_FILE);
+
+    @Inject
+    public ChangePropertiesResource(ChangePropertiesService changePropertiesService) {
+        this.changePropertiesService = changePropertiesService;
+    }
+
+    @GET
+    @Path("/provisioning-service")
+    public Response getProvisioningServiceProperties(@Auth UserInfo userInfo) {
+        return Response
+                .ok(changePropertiesService.readFileAsString(PROVISIONING_SERVICE_PROP_PATH, PROVISIONING_SERVICE))
+                .build();
+    }
+
+    @GET
+    @Path("/billing")
+    public Response getBillingServiceProperties(@Auth UserInfo userInfo) {
+        return Response
+                .ok(changePropertiesService.readFileAsString(BILLING_SERVICE_PROP_PATH, BILLING_SERVICE))
+                .build();
+    }
+
+    @POST
+    @Path("/provisioning-service")
+    public Response overwriteProvisioningServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
+        changePropertiesService.writeFileFromString(ymlDTO.getYmlString(), PROVISIONING_SERVICE, PROVISIONING_SERVICE_PROP_PATH);
+        return Response.ok().build();
+    }
+
+    @POST
+    @Path("/billing")
+    public Response overwriteBillingServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
+        changePropertiesService.writeFileFromString(ymlDTO.getYmlString(), BILLING_SERVICE, BILLING_SERVICE_PROP_PATH);
+        return Response.ok().build();
+    }
+
+    @POST
+    @Path("/restart")
+    public Response restart(@Auth UserInfo userInfo, RestartForm restartForm) {
+        return Response.ok(changePropertiesService.restart(restartForm))
+                .build();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/DockerResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/DockerResource.java
new file mode 100644
index 0000000..4301cd0
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/DockerResource.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.MetadataHolder;
+import com.epam.datalab.backendapi.core.commands.CommandBuilder;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.dto.imagemetadata.ImageMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ImageType;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import java.util.Set;
+
+@Path("/docker")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class DockerResource implements DockerCommands {
+    private static final Logger LOGGER = LoggerFactory.getLogger(DockerResource.class);
+
+    @Inject
+    private ProvisioningServiceApplicationConfiguration configuration;
+    @Inject
+    private MetadataHolder metadataHolder;
+    @Inject
+    private ICommandExecutor commandExecutor;
+    @Inject
+    private CommandBuilder commandBuilder;
+
+    @GET
+    @Path("{type}")
+    public Set<ImageMetadataDTO> getDockerImages(@Auth UserInfo ui, @PathParam("type") String type) {
+        LOGGER.debug("docker statuses asked for {}", type);
+        LOGGER.info("meta {}", metadataHolder);
+        return metadataHolder
+                .getMetadata(ImageType.valueOf(type.toUpperCase()));
+    }
+
+    @Path("/run")
+    @POST
+    public String run(@Auth UserInfo ui, String image) {
+        LOGGER.debug("run docker image {}", image);
+        String uuid = DockerCommands.generateUUID();
+        commandExecutor.executeAsync(
+                ui.getName(),
+                uuid,
+                new RunDockerCommand()
+                        .withName(nameContainer("image", "runner"))
+                        .withVolumeForRootKeys(configuration.getKeyDirectory())
+                        .withVolumeForResponse(configuration.getImagesDirectory())
+                        .withRequestId(uuid)
+                        .withDryRun()
+                        .withActionRun(image)
+                        .toCMD()
+        );
+        return uuid;
+    }
+
+    public String getResourceType() {
+        return Directories.NOTEBOOK_LOG_DIRECTORY;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/GitExploratoryResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/GitExploratoryResource.java
new file mode 100644
index 0000000..aeedc24
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/GitExploratoryResource.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.handlers.ExploratoryGitCredsCallbackHandler;
+import com.epam.datalab.backendapi.service.impl.DockerService;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.exploratory.ExploratoryBaseDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import java.util.Objects;
+
+@Path("/exploratory")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class GitExploratoryResource extends DockerService implements DockerCommands {
+
+    @Path("/git_creds")
+    @POST
+    public String gitCredsUpdate(@Auth UserInfo ui, ExploratoryGitCredsUpdateDTO dto) throws JsonProcessingException {
+        return action(ui.getName(), dto, DockerAction.GIT_CREDS);
+    }
+
+    private String action(String username, ExploratoryBaseDTO<?> dto, DockerAction action) throws JsonProcessingException {
+        log.debug("{} exploratory environment", action);
+        String uuid = DockerCommands.generateUUID();
+        folderListenerExecutor.start(configuration.getImagesDirectory(),
+                configuration.getResourceStatusPollTimeout(),
+                getFileHandlerCallback(action, uuid, dto));
+
+        RunDockerCommand runDockerCommand = new RunDockerCommand()
+                .withInteractive()
+                .withName(nameContainer(dto.getEdgeUserName(), action, dto.getExploratoryName()))
+                .withVolumeForRootKeys(configuration.getKeyDirectory())
+                .withVolumeForResponse(configuration.getImagesDirectory())
+                .withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
+                .withResource(getResourceType())
+                .withRequestId(uuid)
+                .withConfKeyName(configuration.getAdminKey())
+                .withImage(dto.getNotebookImage())
+                .withAction(action);
+        if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+            runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+        }
+
+        commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
+        return uuid;
+    }
+
+    private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ExploratoryBaseDTO<?> dto) {
+        return new ExploratoryGitCredsCallbackHandler(selfService, action, uuid, dto.getCloudSettings().getIamUser(), dto.getExploratoryName());
+    }
+
+    private String nameContainer(String user, DockerAction action, String name) {
+        return nameContainer(user, action.toString(), "exploratory", name);
+    }
+
+    public String getResourceType() {
+        return Directories.NOTEBOOK_LOG_DIRECTORY;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ImageResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ImageResource.java
new file mode 100644
index 0000000..b565556
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ImageResource.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.handlers.ImageCreateCallbackHandler;
+import com.epam.datalab.backendapi.service.impl.DockerService;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.exploratory.ExploratoryImageDTO;
+import com.epam.datalab.rest.contracts.ExploratoryAPI;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Objects;
+
+@Path(ExploratoryAPI.EXPLORATORY_IMAGE)
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ImageResource extends DockerService implements DockerCommands {
+
+    @POST
+    public Response createImage(@Auth UserInfo ui, ExploratoryImageDTO image) throws JsonProcessingException {
+        final String uuid = DockerCommands.generateUUID();
+
+        folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(),
+                new ImageCreateCallbackHandler(selfService, uuid, DockerAction.CREATE_IMAGE, image));
+        String command = commandBuilder.buildCommand(getDockerCommand(DockerAction.CREATE_IMAGE, uuid, image), image);
+        commandExecutor.executeAsync(ui.getName(), uuid, command);
+        log.debug("Docker command: " + command);
+        return Response.accepted(uuid).build();
+    }
+
+
+    @Override
+    public String getResourceType() {
+        return Directories.NOTEBOOK_LOG_DIRECTORY;
+    }
+
+    private RunDockerCommand getDockerCommand(DockerAction action, String uuid, ExploratoryImageDTO image) {
+        RunDockerCommand runDockerCommand = new RunDockerCommand()
+                .withInteractive()
+                .withVolumeForRootKeys(configuration.getKeyDirectory())
+                .withVolumeForResponse(configuration.getImagesDirectory())
+                .withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
+                .withRequestId(uuid)
+                .withConfKeyName(configuration.getAdminKey())
+                .withAction(action)
+                .withResource(getResourceType())
+                .withImage(image.getNotebookImage())
+                .withName(nameContainer(image.getEdgeUserName(), action.toString(), image.getImageName()));
+        if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+            runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+        }
+
+        return runDockerCommand;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/InfrastructureResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/InfrastructureResource.java
new file mode 100644
index 0000000..cab836a
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/InfrastructureResource.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.CheckInactivityService;
+import com.epam.datalab.dto.computational.ComputationalCheckInactivityDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryCheckInactivityAction;
+import com.epam.datalab.rest.contracts.InfrasctructureAPI;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path(InfrasctructureAPI.INFRASTRUCTURE)
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class InfrastructureResource {
+
+    @Inject
+    private CheckInactivityService checkInactivityService;
+
+    /**
+     * Return status of provisioning service.
+     */
+    @GET
+    public Response status(@Auth UserInfo ui) {
+        return Response.status(Response.Status.OK).build();
+    }
+
+    @POST
+    @Path("/exploratory/check_inactivity")
+    public String checkExploratoryInactivity(@Auth UserInfo ui, ExploratoryCheckInactivityAction dto) {
+        return checkInactivityService.checkExploratoryInactivity(ui.getName(), dto);
+    }
+
+    @POST
+    @Path("/computational/check_inactivity")
+    public String checkComputationalInactivity(@Auth UserInfo ui, ComputationalCheckInactivityDTO dto) {
+        return checkInactivityService.checkComputationalInactivity(ui.getName(), dto);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/LibraryResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/LibraryResource.java
new file mode 100644
index 0000000..efe7ca2
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/LibraryResource.java
@@ -0,0 +1,195 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.handlers.LibInstallCallbackHandler;
+import com.epam.datalab.backendapi.core.response.handlers.LibListCallbackHandler;
+import com.epam.datalab.backendapi.service.impl.DockerService;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.LibListComputationalDTO;
+import com.epam.datalab.dto.LibListExploratoryDTO;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.exploratory.ExploratoryActionDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryBaseDTO;
+import com.epam.datalab.dto.exploratory.LibraryInstallDTO;
+import com.epam.datalab.rest.contracts.ComputationalAPI;
+import com.epam.datalab.rest.contracts.ExploratoryAPI;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import java.util.Objects;
+
+@Path("/library")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class LibraryResource extends DockerService implements DockerCommands {
+
+
+    @POST
+    @Path(ExploratoryAPI.EXPLORATORY + "/lib_list")
+    public String getLibList(@Auth UserInfo ui, LibListExploratoryDTO dto) throws JsonProcessingException {
+        return actionExploratory(ui.getName(), dto, DockerAction.LIB_LIST);
+    }
+
+    @POST
+    @Path(ExploratoryAPI.EXPLORATORY + "/lib_install")
+    public String libInstall(@Auth UserInfo ui, LibraryInstallDTO dto) throws JsonProcessingException {
+        return actionExploratory(ui.getName(), dto, DockerAction.LIB_INSTALL);
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL + "/lib_list")
+    public String getLibList(@Auth UserInfo ui, LibListComputationalDTO dto) throws JsonProcessingException {
+        return actionComputational(ui.getName(), dto, DockerAction.LIB_LIST);
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL + "/lib_install")
+    public String getLibList(@Auth UserInfo ui, LibraryInstallDTO dto) throws JsonProcessingException {
+        return actionComputational(ui.getName(), dto, DockerAction.LIB_INSTALL);
+    }
+
+    private String actionExploratory(String username, ExploratoryBaseDTO<?> dto, DockerAction action) throws JsonProcessingException {
+        log.debug("{} user {} exploratory environment {}", action, username, dto);
+        String uuid = DockerCommands.generateUUID();
+        folderListenerExecutor.start(configuration.getImagesDirectory(),
+                configuration.getResourceStatusPollTimeout(),
+                getFileHandlerCallbackExploratory(action, uuid, dto));
+
+        RunDockerCommand runDockerCommand = getDockerCommandExploratory(dto, action, uuid);
+
+        commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
+        return uuid;
+    }
+
+    private String actionComputational(String username, ExploratoryActionDTO<?> dto, DockerAction action) throws JsonProcessingException {
+        log.debug("{} user {} exploratory environment {}", action, username, dto);
+        String uuid = DockerCommands.generateUUID();
+        folderListenerExecutor.start(configuration.getImagesDirectory(),
+                configuration.getResourceStatusPollTimeout(),
+                getFileHandlerCallbackComputational(action, uuid, dto));
+
+        RunDockerCommand runDockerCommand = getDockerCommandComputational(dto, action, uuid);
+
+        commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
+        return uuid;
+    }
+
+    private RunDockerCommand getDockerCommandExploratory(ExploratoryBaseDTO<?> dto, DockerAction action, String uuid) {
+        return getDockerCommand(action, uuid)
+                .withName(nameContainer(dto.getEdgeUserName(), action.toString(), "exploratory",
+                        dto.getExploratoryName()))
+                .withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
+                .withResource(getResourceType())
+                .withImage(dto.getNotebookImage());
+    }
+
+    private RunDockerCommand getDockerCommandComputational(ExploratoryActionDTO<?> dto, DockerAction action,
+                                                           String uuid) {
+        RunDockerCommand runDockerCommand = getDockerCommand(action, uuid);
+        if (dto instanceof LibraryInstallDTO) {
+            LibraryInstallDTO newDTO = (LibraryInstallDTO) dto;
+            runDockerCommand.withName(nameContainer(dto.getEdgeUserName(), action.toString(),
+                    "computational", newDTO.getComputationalId()))
+                    .withVolumeForLog(configuration.getDockerLogDirectory(),
+                            DataEngineType.fromDockerImageName(newDTO.getComputationalImage()).getName())
+                    .withResource(DataEngineType.fromDockerImageName(newDTO.getComputationalImage()).getName())
+
+                    .withImage(newDTO.getComputationalImage());
+
+        } else {
+            LibListComputationalDTO newDTO = (LibListComputationalDTO) dto;
+
+            runDockerCommand.withName(nameContainer(dto.getEdgeUserName(), action.toString(),
+                    "computational", newDTO.getComputationalId()))
+                    .withVolumeForLog(configuration.getDockerLogDirectory(),
+                            DataEngineType.fromDockerImageName(newDTO.getComputationalImage()).getName())
+                    .withResource(DataEngineType.fromDockerImageName(newDTO.getComputationalImage()).getName())
+                    .withImage(newDTO.getComputationalImage());
+
+        }
+        return runDockerCommand;
+    }
+
+    private RunDockerCommand getDockerCommand(DockerAction action, String uuid) {
+        RunDockerCommand runDockerCommand = new RunDockerCommand()
+                .withInteractive()
+                .withVolumeForRootKeys(configuration.getKeyDirectory())
+                .withVolumeForResponse(configuration.getImagesDirectory())
+                .withRequestId(uuid)
+                .withConfKeyName(configuration.getAdminKey())
+                .withAction(action);
+        if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+            runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+        }
+
+        return runDockerCommand;
+    }
+
+    private FileHandlerCallback getFileHandlerCallbackExploratory(DockerAction action, String uuid,
+                                                                  ExploratoryBaseDTO<?> dto) {
+        switch (action) {
+            case LIB_LIST:
+                final String group = ((LibListExploratoryDTO) dto).getLibCacheKey();
+                return new LibListCallbackHandler(selfService, DockerAction.LIB_LIST, uuid,
+                        dto.getCloudSettings().getIamUser(), group);
+            case LIB_INSTALL:
+                return new LibInstallCallbackHandler(selfService, action, uuid,
+                        dto.getCloudSettings().getIamUser(),
+                        (LibraryInstallDTO) dto);
+            default:
+                throw new IllegalArgumentException("Unknown action " + action);
+        }
+    }
+
+    private FileHandlerCallback getFileHandlerCallbackComputational(DockerAction action, String uuid,
+                                                                    ExploratoryBaseDTO<?> dto) {
+        switch (action) {
+            case LIB_LIST:
+                return new LibListCallbackHandler(selfService, action, uuid,
+                        dto.getCloudSettings().getIamUser(), ((LibListComputationalDTO) dto).getLibCacheKey());
+            case LIB_INSTALL:
+                return new LibInstallCallbackHandler(selfService, action, uuid,
+                        dto.getCloudSettings().getIamUser(), ((LibraryInstallDTO) dto));
+
+            default:
+                throw new IllegalArgumentException("Unknown action " + action);
+        }
+    }
+
+    public String getResourceType() {
+        return Directories.NOTEBOOK_LOG_DIRECTORY;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/OdahuResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/OdahuResource.java
new file mode 100644
index 0000000..69969df
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/OdahuResource.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.OdahuService;
+import com.epam.datalab.dto.odahu.ActionOdahuDTO;
+import com.epam.datalab.dto.odahu.CreateOdahuDTO;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("infrastructure/odahu")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class OdahuResource {
+
+    private final OdahuService odahuService;
+
+    @Inject
+    public OdahuResource(OdahuService odahuService) {
+        this.odahuService = odahuService;
+    }
+
+    @POST
+    public Response createProject(@Auth UserInfo userInfo, CreateOdahuDTO dto) {
+        return Response.ok(odahuService.create(userInfo, dto)).build();
+    }
+
+    @Path("start")
+    @POST
+    public Response startProject(@Auth UserInfo userInfo, ActionOdahuDTO dto) {
+        return Response.ok(odahuService.start(userInfo, dto)).build();
+    }
+
+    @Path("stop")
+    @POST
+    public Response stopProject(@Auth UserInfo userInfo, ActionOdahuDTO dto) {
+        return Response.ok(odahuService.stop(userInfo, dto)).build();
+    }
+
+    @Path("terminate")
+    @POST
+    public Response terminateProject(@Auth UserInfo userInfo, ActionOdahuDTO dto) {
+        return Response.ok(odahuService.terminate(userInfo, dto)).build();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ProjectResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ProjectResource.java
new file mode 100644
index 0000000..ae4c3e0
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ProjectResource.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.dto.project.ProjectActionDTO;
+import com.epam.datalab.dto.project.ProjectCreateDTO;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("infrastructure/project")
+public class ProjectResource {
+
+    private final ProjectService projectService;
+
+    @Inject
+    public ProjectResource(ProjectService projectService) {
+        this.projectService = projectService;
+    }
+
+	@Path("/create")
+	@POST
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response createProject(@Auth UserInfo userInfo, ProjectCreateDTO dto) {
+		return Response.ok(projectService.create(userInfo, dto)).build();
+	}
+
+	@Path("/recreate")
+	@POST
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response recreateProject(@Auth UserInfo userInfo, ProjectCreateDTO dto) {
+		return Response.ok(projectService.recreate(userInfo, dto)).build();
+	}
+
+	@Path("/terminate")
+	@POST
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response terminateProject(@Auth UserInfo userInfo, ProjectActionDTO dto) {
+		return Response.ok(projectService.terminate(userInfo, dto)).build();
+	}
+
+	@Path("/start")
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response startProject(@Auth UserInfo userInfo, ProjectActionDTO dto) {
+        return Response.ok(projectService.start(userInfo, dto)).build();
+    }
+
+    @Path("/stop")
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response stopProject(@Auth UserInfo userInfo, ProjectActionDTO dto) {
+        return Response.ok(projectService.stop(userInfo, dto)).build();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ProvisioningHealthCheckResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ProvisioningHealthCheckResource.java
new file mode 100644
index 0000000..0693c09
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/ProvisioningHealthCheckResource.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("/healthcheck")
+@Produces(MediaType.APPLICATION_JSON)
+public class ProvisioningHealthCheckResource {
+    @Inject
+    private ProvisioningServiceApplicationConfiguration configuration;
+
+    @GET
+    public Response status(@Auth UserInfo ui) {
+        return Response.ok(configuration.getCloudProvider()).build();
+    }
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ComputationalResourceAws.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ComputationalResourceAws.java
new file mode 100644
index 0000000..9af68b3
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ComputationalResourceAws.java
@@ -0,0 +1,198 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.aws;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.handlers.ComputationalCallbackHandler;
+import com.epam.datalab.backendapi.core.response.handlers.ComputationalConfigure;
+import com.epam.datalab.backendapi.service.impl.DockerService;
+import com.epam.datalab.backendapi.service.impl.SparkClusterService;
+import com.epam.datalab.dto.aws.computational.AwsComputationalTerminateDTO;
+import com.epam.datalab.dto.aws.computational.ComputationalCreateAws;
+import com.epam.datalab.dto.aws.computational.SparkComputationalCreateAws;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.epam.datalab.dto.computational.ComputationalClusterConfigDTO;
+import com.epam.datalab.dto.computational.ComputationalStartDTO;
+import com.epam.datalab.dto.computational.ComputationalStopDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.contracts.ComputationalAPI;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import static com.epam.datalab.backendapi.core.commands.DockerAction.CREATE;
+import static com.epam.datalab.backendapi.core.commands.DockerAction.TERMINATE;
+
+@Path("/")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ComputationalResourceAws extends DockerService implements DockerCommands {
+
+    private static final DataEngineType EMR_DATA_ENGINE = DataEngineType.CLOUD_SERVICE;
+    @Inject
+    private ComputationalConfigure computationalConfigure;
+    @Inject
+    private SparkClusterService sparkClusterService;
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC)
+    public String create(@Auth UserInfo ui, ComputationalCreateAws dto) {
+
+        log.info("Create computational resources {} for user {}: {}", dto.getComputationalName(), ui.getName(), dto);
+        String uuid = DockerCommands.generateUUID();
+        folderListenerExecutor.start(configuration.getImagesDirectory(),
+                configuration.getResourceStatusPollTimeout(),
+                getFileHandlerCallback(CREATE, uuid, dto));
+        try {
+            long timeout = configuration.getResourceStatusPollTimeout().toSeconds();
+            commandExecutor.executeAsync(
+                    ui.getName(),
+                    uuid,
+                    commandBuilder.buildCommand(
+                            new RunDockerCommand()
+                                    .withInteractive()
+                                    .withName(nameContainer(dto.getEdgeUserName(), CREATE, dto.getExploratoryName(),
+                                            dto.getComputationalName()))
+                                    .withVolumeForRootKeys(configuration.getKeyDirectory())
+                                    .withVolumeForResponse(configuration.getImagesDirectory())
+                                    .withVolumeForLog(configuration.getDockerLogDirectory(), EMR_DATA_ENGINE.getName())
+                                    .withResource(EMR_DATA_ENGINE.getName())
+                                    .withRequestId(uuid)
+                                    .withEc2Role(configuration.getEmrEC2RoleDefault())
+                                    .withEmrTimeout(Long.toString(timeout))
+                                    .withServiceRole(configuration.getEmrServiceRoleDefault())
+                                    .withConfKeyName(configuration.getAdminKey())
+                                    .withActionCreate(DataEngineType.getDockerImageName(EMR_DATA_ENGINE)),
+                            dto
+                    )
+            );
+        } catch (Exception t) {
+            throw new DatalabException("Could not create computational resource cluster", t);
+        }
+        return uuid;
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_TERMINATE_CLOUD_SPECIFIC)
+    public String terminate(@Auth UserInfo ui, AwsComputationalTerminateDTO dto) {
+
+        log.debug("Terminate computational resources {} for user {}: {}", dto.getComputationalName(), ui.getName(),
+                dto);
+        String uuid = DockerCommands.generateUUID();
+        folderListenerExecutor.start(configuration.getImagesDirectory(),
+                configuration.getResourceStatusPollTimeout(),
+                getFileHandlerCallback(TERMINATE, uuid, dto));
+        try {
+            commandExecutor.executeAsync(
+                    ui.getName(),
+                    uuid,
+                    commandBuilder.buildCommand(
+                            new RunDockerCommand()
+                                    .withInteractive()
+                                    .withName(nameContainer(dto.getEdgeUserName(), TERMINATE,
+                                            dto.getExploratoryName(), dto.getComputationalName()))
+                                    .withVolumeForRootKeys(configuration.getKeyDirectory())
+                                    .withVolumeForResponse(configuration.getImagesDirectory())
+                                    .withVolumeForLog(configuration.getDockerLogDirectory(), EMR_DATA_ENGINE.getName())
+                                    .withResource(EMR_DATA_ENGINE.getName())
+                                    .withRequestId(uuid)
+                                    .withConfKeyName(configuration.getAdminKey())
+                                    .withActionTerminate(DataEngineType.getDockerImageName(EMR_DATA_ENGINE)),
+                            dto
+                    )
+            );
+        } catch (JsonProcessingException t) {
+            throw new DatalabException("Could not terminate computational resources cluster", t);
+        }
+
+        return uuid;
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_CREATE_SPARK)
+    public String createSparkCluster(@Auth UserInfo ui, SparkComputationalCreateAws dto) {
+        log.debug("Create computational Spark resources {} for user {}: {}", dto.getComputationalName(), ui.getName(),
+                dto);
+
+        return sparkClusterService.create(ui, dto);
+    }
+
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_TERMINATE_SPARK)
+    public String terminateSparkCluster(@Auth UserInfo ui, AwsComputationalTerminateDTO dto) {
+        log.debug("Terminate computational Spark resource {} for user {}: {}", dto.getComputationalName(), ui.getName
+                (), dto);
+
+        return sparkClusterService.terminate(ui, dto);
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_STOP_SPARK)
+    public String stopSparkCluster(@Auth UserInfo ui, ComputationalStopDTO dto) {
+        log.debug("Stop computational Spark resources {} for user {}: {}",
+                dto.getComputationalName(), ui.getName(), dto);
+
+        return sparkClusterService.stop(ui, dto);
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_START_SPARK)
+    public String startSparkCluster(@Auth UserInfo ui, ComputationalStartDTO dto) {
+        log.debug("Start computational Spark resource {} for user {}: {}",
+                dto.getComputationalName(), ui.getName(), dto);
+
+        return sparkClusterService.start(ui, dto);
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_RECONFIGURE_SPARK)
+    public String reconfigureSparkCluster(@Auth UserInfo ui, ComputationalClusterConfigDTO config) {
+        log.debug("User is reconfiguring {} spark cluster for exploratory {}", ui.getName(),
+                config.getComputationalName(), config.getNotebookInstanceName());
+        return sparkClusterService.updateConfig(ui, config);
+    }
+
+    private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto) {
+        return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto);
+    }
+
+    private String nameContainer(String user, DockerAction action, String exploratoryName, String name) {
+        return nameContainer(user, action.toString(), "computational", exploratoryName, name);
+    }
+
+    public String getResourceType() {
+        return Directories.DATA_ENGINE_SERVICE_LOG_DIRECTORY;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/EdgeResourceAws.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/EdgeResourceAws.java
new file mode 100644
index 0000000..1e0565b
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/EdgeResourceAws.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.aws;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.response.handlers.EdgeCallbackHandler;
+import com.epam.datalab.backendapi.resources.base.EdgeService;
+import com.epam.datalab.dto.ResourceSysBaseDTO;
+import com.epam.datalab.dto.aws.edge.EdgeInfoAws;
+import com.epam.datalab.dto.aws.keyload.UploadFileAws;
+import com.epam.datalab.dto.base.keyload.UploadFileResult;
+import com.epam.datalab.util.FileUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import java.io.IOException;
+
+import static com.epam.datalab.rest.contracts.ApiCallbacks.EDGE;
+import static com.epam.datalab.rest.contracts.ApiCallbacks.KEY_LOADER;
+import static com.epam.datalab.rest.contracts.ApiCallbacks.STATUS_URI;
+
+/**
+ * Provides API to manage Edge node on AWS
+ */
+@Path("infrastructure/edge")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class EdgeResourceAws extends EdgeService {
+
+    public EdgeResourceAws() {
+        log.info("{} is initialized", getClass().getSimpleName());
+    }
+
+    @POST
+    @Path("/create")
+    public String create(@Auth UserInfo ui, UploadFileAws dto) throws IOException {
+        FileUtils.saveToFile(getKeyFilename(dto.getEdge().getEdgeUserName()), getKeyDirectory(), dto.getContent());
+        return action(ui.getName(), dto.getEdge(), dto.getEdge().getCloudSettings().getIamUser(), KEY_LOADER,
+                DockerAction.CREATE);
+    }
+
+    @POST
+    @Path("/start")
+    public String start(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.START);
+    }
+
+    @POST
+    @Path("/stop")
+    public String stop(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.STOP);
+    }
+
+    @POST
+    @Path("/terminate")
+    public String terminate(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI,
+                DockerAction.TERMINATE);
+    }
+
+    @SuppressWarnings("unchecked")
+    protected FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, String user, String
+            callbackURI) {
+        return new EdgeCallbackHandler(selfService, action, uuid, user, callbackURI,
+                EdgeInfoAws.class,
+                UploadFileResult.class);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ExploratoryResourceAws.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ExploratoryResourceAws.java
new file mode 100644
index 0000000..f036880
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ExploratoryResourceAws.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.aws;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.resources.base.ExploratoryService;
+import com.epam.datalab.dto.aws.exploratory.ExploratoryCreateAws;
+import com.epam.datalab.dto.exploratory.ExploratoryActionDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryReconfigureSparkClusterActionDTO;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+@Path("/exploratory")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class ExploratoryResourceAws {
+
+    @Inject
+    private ExploratoryService exploratoryService;
+
+
+    @Path("/create")
+    @POST
+    public String create(@Auth UserInfo ui, ExploratoryCreateAws dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.CREATE);
+    }
+
+    @Path("/start")
+    @POST
+    public String start(@Auth UserInfo ui, ExploratoryGitCredsUpdateDTO dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.START);
+    }
+
+    @Path("/terminate")
+    @POST
+    public String terminate(@Auth UserInfo ui, ExploratoryActionDTO<?> dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.TERMINATE);
+    }
+
+    @Path("/stop")
+    @POST
+    public String stop(@Auth UserInfo ui, ExploratoryActionDTO<?> dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.STOP);
+    }
+
+    @Path("/reconfigure_spark")
+    @POST
+    public String reconfigureSpark(@Auth UserInfo ui, ExploratoryReconfigureSparkClusterActionDTO dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.RECONFIGURE_SPARK);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/InfrastructureResourceAws.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/InfrastructureResourceAws.java
new file mode 100644
index 0000000..c88002c
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/aws/InfrastructureResourceAws.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.aws;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.resources.base.InfrastructureService;
+import com.epam.datalab.dto.UserEnvironmentResources;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+@Path("/infrastructure")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class InfrastructureResourceAws extends InfrastructureService {
+    public InfrastructureResourceAws() {
+        log.info("{} is initialized", getClass().getSimpleName());
+    }
+
+    @Path("/status")
+    @POST
+    public String status(@Auth UserInfo ui, UserEnvironmentResources dto) {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), DockerAction.STATUS);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/ComputationalResourceAzure.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/ComputationalResourceAzure.java
new file mode 100644
index 0000000..effed2d
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/ComputationalResourceAzure.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.azure;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.impl.SparkClusterService;
+import com.epam.datalab.dto.azure.computational.SparkComputationalCreateAzure;
+import com.epam.datalab.dto.computational.ComputationalClusterConfigDTO;
+import com.epam.datalab.dto.computational.ComputationalStartDTO;
+import com.epam.datalab.dto.computational.ComputationalStopDTO;
+import com.epam.datalab.dto.computational.ComputationalTerminateDTO;
+import com.epam.datalab.rest.contracts.ComputationalAPI;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+@Path("/")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ComputationalResourceAzure implements ComputationalAPI {
+
+    @Inject
+    private SparkClusterService sparkClusterService;
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_CREATE_SPARK)
+    public String create(@Auth UserInfo ui, SparkComputationalCreateAzure dto) {
+        log.debug("Create computational Spark resources {} for user {}: {}",
+                dto.getComputationalName(), ui.getName(), dto);
+
+        return sparkClusterService.create(ui, dto);
+    }
+
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_TERMINATE_SPARK)
+    public String terminate(@Auth UserInfo ui, ComputationalTerminateDTO dto) {
+        log.debug("Terminate computational Spark resources {} for user {}: {}",
+                dto.getComputationalName(), ui.getName(), dto);
+
+        return sparkClusterService.terminate(ui, dto);
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_STOP_SPARK)
+    public String stopSparkCluster(@Auth UserInfo ui, ComputationalStopDTO dto) {
+        log.debug("Stop computational Spark resources {} for user {}: {}",
+                dto.getComputationalName(), ui.getName(), dto);
+
+        return sparkClusterService.stop(ui, dto);
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_START_SPARK)
+    public String startSparkCluster(@Auth UserInfo ui, ComputationalStartDTO dto) {
+        log.debug("Start computational Spark resource {} for user {}: {}",
+                dto.getComputationalName(), ui.getName(), dto);
+
+        return sparkClusterService.start(ui, dto);
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_RECONFIGURE_SPARK)
+    public String reconfigureSparkCluster(@Auth UserInfo ui, ComputationalClusterConfigDTO config) {
+        log.debug("User is reconfiguring {} spark cluster for exploratory {}", ui.getName(),
+                config.getComputationalName(), config.getNotebookInstanceName());
+        return sparkClusterService.updateConfig(ui, config);
+    }
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/EdgeResourceAzure.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/EdgeResourceAzure.java
new file mode 100644
index 0000000..0d8a258
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/EdgeResourceAzure.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.azure;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.response.handlers.EdgeCallbackHandler;
+import com.epam.datalab.backendapi.resources.base.EdgeService;
+import com.epam.datalab.dto.ResourceSysBaseDTO;
+import com.epam.datalab.dto.azure.edge.EdgeInfoAzure;
+import com.epam.datalab.dto.azure.keyload.UploadFileAzure;
+import com.epam.datalab.dto.base.keyload.UploadFileResult;
+import com.epam.datalab.util.FileUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import java.io.IOException;
+
+import static com.epam.datalab.rest.contracts.ApiCallbacks.EDGE;
+import static com.epam.datalab.rest.contracts.ApiCallbacks.KEY_LOADER;
+import static com.epam.datalab.rest.contracts.ApiCallbacks.STATUS_URI;
+
+/**
+ * Provides API to manage Edge node on Azure
+ */
+@Path("infrastructure/edge")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class EdgeResourceAzure extends EdgeService {
+
+    public EdgeResourceAzure() {
+        log.info("{} is initialized", getClass().getSimpleName());
+    }
+
+    @POST
+    @Path("/create")
+    public String create(@Auth UserInfo ui, UploadFileAzure dto) throws IOException {
+        FileUtils.saveToFile(getKeyFilename(dto.getEdge().getEdgeUserName()), getKeyDirectory(), dto.getContent());
+        return action(ui.getName(), dto.getEdge(), dto.getEdge().getCloudSettings().getIamUser(), KEY_LOADER,
+                DockerAction.CREATE);
+    }
+
+    @POST
+    @Path("/start")
+    public String start(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.START);
+    }
+
+    @POST
+    @Path("/stop")
+    public String stop(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.STOP);
+    }
+
+    @POST
+    @Path("/terminate")
+    public String terminate(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI,
+                DockerAction.TERMINATE);
+    }
+
+    @SuppressWarnings("unchecked")
+    protected FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, String user, String
+            callbackURI) {
+        return new EdgeCallbackHandler(selfService, action, uuid, user, callbackURI,
+                EdgeInfoAzure.class,
+                UploadFileResult.class);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/ExploratoryResourceAzure.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/ExploratoryResourceAzure.java
new file mode 100644
index 0000000..d078239
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/ExploratoryResourceAzure.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.azure;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.resources.base.ExploratoryService;
+import com.epam.datalab.dto.azure.exploratory.ExploratoryActionStartAzure;
+import com.epam.datalab.dto.azure.exploratory.ExploratoryActionStopAzure;
+import com.epam.datalab.dto.azure.exploratory.ExploratoryCreateAzure;
+import com.epam.datalab.dto.exploratory.ExploratoryReconfigureSparkClusterActionDTO;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+@Path("/exploratory")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class ExploratoryResourceAzure {
+    @Inject
+    private ExploratoryService exploratoryService;
+
+    @Path("/create")
+    @POST
+    public String create(@Auth UserInfo ui, ExploratoryCreateAzure dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.CREATE);
+    }
+
+    @Path("/start")
+    @POST
+    public String start(@Auth UserInfo ui, ExploratoryActionStartAzure dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.START);
+    }
+
+    @Path("/terminate")
+    @POST
+    public String terminate(@Auth UserInfo ui, ExploratoryActionStopAzure dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.TERMINATE);
+    }
+
+    @Path("/stop")
+    @POST
+    public String stop(@Auth UserInfo ui, ExploratoryActionStopAzure dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.STOP);
+    }
+
+    @Path("/reconfigure_spark")
+    @POST
+    public String reconfigureSpark(@Auth UserInfo ui, ExploratoryReconfigureSparkClusterActionDTO dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.RECONFIGURE_SPARK);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/InfrastructureResourceAzure.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/InfrastructureResourceAzure.java
new file mode 100644
index 0000000..01650b7
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/azure/InfrastructureResourceAzure.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.azure;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.resources.base.InfrastructureService;
+import com.epam.datalab.dto.UserEnvironmentResources;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+@Path("/infrastructure")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class InfrastructureResourceAzure extends InfrastructureService {
+
+    public InfrastructureResourceAzure() {
+        log.info("{} is initialized", getClass().getSimpleName());
+    }
+
+    @Path("/status")
+    @POST
+    public String status(@Auth UserInfo ui, UserEnvironmentResources dto) {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), DockerAction.STATUS);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/EdgeService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/EdgeService.java
new file mode 100644
index 0000000..2b5aee8
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/EdgeService.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.base;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.CommandBuilder;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.ResourceSysBaseDTO;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.KeyAPI;
+import com.epam.datalab.util.UsernameUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Objects;
+
+public abstract class EdgeService implements DockerCommands {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Inject
+    protected RESTService selfService;
+    @Inject
+    private ProvisioningServiceApplicationConfiguration configuration;
+    @Inject
+    private FolderListenerExecutor folderListenerExecutor;
+    @Inject
+    private ICommandExecutor commandExecutor;
+    @Inject
+    private CommandBuilder commandBuilder;
+
+    @Override
+    public String getResourceType() {
+        return Directories.EDGE_LOG_DIRECTORY;
+    }
+
+    protected String action(String username, ResourceSysBaseDTO<?> dto, String iamUser, String callbackURI,
+                            DockerAction action) throws JsonProcessingException {
+        logger.debug("{} EDGE node for user {}: {}", action, username, dto);
+        String uuid = DockerCommands.generateUUID();
+
+        folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
+                configuration.getKeyLoaderPollTimeout(),
+                getFileHandlerCallback(action, uuid, iamUser, callbackURI));
+
+        RunDockerCommand runDockerCommand = new RunDockerCommand()
+                .withInteractive()
+                .withName(nameContainer(dto.getEdgeUserName(), action))
+                .withVolumeForRootKeys(getKeyDirectory())
+                .withVolumeForResponse(configuration.getKeyLoaderDirectory())
+                .withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
+                .withResource(getResourceType())
+                .withRequestId(uuid)
+                .withConfKeyName(configuration.getAdminKey())
+                .withImage(configuration.getEdgeImage())
+                .withAction(action);
+        if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+            runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+        }
+
+        commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
+        return uuid;
+    }
+
+    protected abstract FileHandlerCallback getFileHandlerCallback(DockerAction action,
+                                                                  String uuid, String user, String callbackURI);
+
+    private String nameContainer(String user, DockerAction action) {
+        return nameContainer(user, action.toString(), getResourceType());
+    }
+
+    protected String getKeyDirectory() {
+        return configuration.getKeyDirectory();
+    }
+
+    protected String getKeyFilename(String edgeUserName) {
+        return UsernameUtils.replaceWhitespaces(edgeUserName) + KeyAPI.KEY_EXTENTION;
+    }
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/ExploratoryService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/ExploratoryService.java
new file mode 100644
index 0000000..1399579
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/ExploratoryService.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.base;
+
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.handlers.ExploratoryCallbackHandler;
+import com.epam.datalab.backendapi.service.impl.DockerService;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.exploratory.ExploratoryBaseDTO;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Objects;
+
+@Slf4j
+public class ExploratoryService extends DockerService implements DockerCommands {
+
+    public String action(String username, ExploratoryBaseDTO<?> dto, DockerAction action) throws JsonProcessingException {
+        log.debug("{} exploratory environment", action);
+        String uuid = DockerCommands.generateUUID();
+        folderListenerExecutor.start(configuration.getImagesDirectory(),
+                configuration.getResourceStatusPollTimeout(),
+                getFileHandlerCallback(action, uuid, dto));
+
+        RunDockerCommand runDockerCommand = new RunDockerCommand()
+                .withInteractive()
+                .withName(nameContainer(dto.getEdgeUserName(), action, dto.getExploratoryName()))
+                .withVolumeForRootKeys(configuration.getKeyDirectory())
+                .withVolumeForResponse(configuration.getImagesDirectory())
+                .withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
+                .withResource(getResourceType())
+                .withRequestId(uuid)
+                .withConfKeyName(configuration.getAdminKey())
+                .withImage(dto.getNotebookImage())
+                .withAction(action);
+
+        if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+            runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+        }
+
+        commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
+        return uuid;
+    }
+
+    public String getResourceType() {
+        return Directories.NOTEBOOK_LOG_DIRECTORY;
+    }
+
+    private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ExploratoryBaseDTO<?> dto) {
+        return new ExploratoryCallbackHandler(selfService, action, uuid, dto.getCloudSettings().getIamUser(),
+                dto.getProject(), dto.getExploratoryName());
+    }
+
+    private String nameContainer(String user, DockerAction action, String name) {
+        return nameContainer(user, action.toString(), "exploratory", name);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/InfrastructureService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/InfrastructureService.java
new file mode 100644
index 0000000..9087c79
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/InfrastructureService.java
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.base;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.CommandBuilder;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.datalab.backendapi.core.response.handlers.ResourcesStatusCallbackHandler;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.UserEnvironmentResources;
+import com.epam.datalab.dto.status.EnvResource;
+import com.epam.datalab.dto.status.EnvResourceList;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.process.model.ProcessInfo;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import static com.epam.datalab.backendapi.core.commands.DockerAction.STATUS;
+import static java.util.stream.Collectors.toList;
+
+@Slf4j
+public abstract class InfrastructureService implements DockerCommands {
+    @Inject
+    private RESTService selfService;
+    @Inject
+    private ProvisioningServiceApplicationConfiguration configuration;
+    @Inject
+    private FolderListenerExecutor folderListenerExecutor;
+    @Inject
+    private ICommandExecutor commandExecutor;
+    @Inject
+    private CommandBuilder commandBuilder;
+
+    private static final String CONTAINER_NAME_REGEX_FORMAT = "%s_[^_\\W]+_%s(|_%s)_\\d+";
+
+    public String action(String username, UserEnvironmentResources dto, String iamUser, DockerAction dockerAction) {
+        log.trace("Request the status of resources for user {}: {}", username, dto);
+        String uuid = DockerCommands.generateUUID();
+        folderListenerExecutor.start(configuration.getImagesDirectory(),
+                configuration.getRequestEnvStatusTimeout(),
+                getFileHandlerCallback(dockerAction, uuid, iamUser, dto.getResourceList()));
+        try {
+
+            removeResourcesWithRunningContainers(username, dto);
+
+            if (!(dto.getResourceList().getHostList().isEmpty() && dto.getResourceList().getClusterList().isEmpty())) {
+                log.trace("Request the status of resources for user {} after filtering: {}", username, dto);
+                RunDockerCommand runDockerCommand = new RunDockerCommand()
+                        .withInteractive()
+                        .withName(nameContainer(dto.getEdgeUserName(), STATUS, "resources"))
+                        .withVolumeForRootKeys(configuration.getKeyDirectory())
+                        .withVolumeForResponse(configuration.getImagesDirectory())
+                        .withVolumeForLog(configuration.getDockerLogDirectory(), Directories.EDGE_LOG_DIRECTORY)
+                        .withResource(getResourceType())
+                        .withRequestId(uuid)
+                        .withConfKeyName(configuration.getAdminKey())
+                        .withActionStatus(configuration.getEdgeImage());
+                if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                        Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                        !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+                    runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+                }
+
+                commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
+            } else {
+                log.debug("Skipping calling status command. Resource lists are empty");
+            }
+        } catch (Exception e) {
+            throw new DatalabException("Docker's command \"" + getResourceType() + "\" is fail: " + e.getLocalizedMessage
+                    (), e);
+        }
+        return uuid;
+    }
+
+    private void removeResourcesWithRunningContainers(String username, UserEnvironmentResources dto)
+            throws Exception {
+
+        final ProcessInfo processInfo = commandExecutor.executeSync(username, DockerCommands.generateUUID(),
+                String.format(DockerCommands.GET_RUNNING_CONTAINERS_FOR_USER, dto.getEdgeUserName()));
+        final String processInfoStdOut = processInfo.getStdOut();
+
+        if (StringUtils.isNoneEmpty(processInfoStdOut)) {
+            final List<String> runningContainerNames = Arrays.asList(processInfoStdOut.split("\n"));
+            log.info("Running containers for users: {}", runningContainerNames);
+            final List<EnvResource> hostList = filter(dto.getEdgeUserName(), runningContainerNames, dto
+                    .getResourceList()
+                    .getHostList());
+            final List<EnvResource> clusterList = filter(dto.getEdgeUserName(), runningContainerNames, dto
+                    .getResourceList()
+                    .getClusterList());
+
+            dto.getResourceList().setHostList(hostList);
+            dto.getResourceList().setClusterList(clusterList);
+        }
+    }
+
+    private List<EnvResource> filter(String username, List<String> runningContainerNames, List<EnvResource> hostList) {
+        return hostList
+                .stream()
+                .filter(envResource -> hasNotCorrespondingRunningContainer(username, runningContainerNames,
+                        envResource))
+                .map(envResource -> new EnvResource().withId(envResource.getId()).withStatus(envResource.getStatus()))
+                .collect(toList());
+    }
+
+    private boolean hasNotCorrespondingRunningContainer(String username, List<String> runningContainerNames,
+                                                        EnvResource
+                                                                envResource) {
+        final String regex = String.format(CONTAINER_NAME_REGEX_FORMAT, username, envResource
+                .getResourceType().name().toLowerCase(), Optional.ofNullable(envResource.getName()).orElse(""));
+        return runningContainerNames.stream().noneMatch(container -> container.matches(regex));
+    }
+
+    protected FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, String user, EnvResourceList resourceList) {
+        return new ResourcesStatusCallbackHandler(selfService, action, uuid, user, resourceList);
+    }
+
+    private String nameContainer(String user, DockerAction action, String name) {
+        return nameContainer(user, action.toString(), name);
+    }
+
+    public String getResourceType() {
+        return "status";
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/KeyResource.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/KeyResource.java
new file mode 100644
index 0000000..96404e0
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/base/KeyResource.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.base;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.service.impl.KeyService;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyDTO;
+import com.epam.datalab.rest.contracts.KeyAPI;
+import com.epam.datalab.util.FileUtils;
+import com.epam.datalab.util.UsernameUtils;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import java.io.IOException;
+import java.util.UUID;
+
+/**
+ * Provides API for reuploading keys
+ */
+@Path("key")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class KeyResource {
+
+    private final KeyService keyService;
+    private final ProvisioningServiceApplicationConfiguration configuration;
+
+    @Inject
+    public KeyResource(KeyService keyService, ProvisioningServiceApplicationConfiguration configuration) {
+        this.keyService = keyService;
+        this.configuration = configuration;
+    }
+
+
+    @Path("/reupload")
+    @POST
+    public String reuploadKey(@Auth UserInfo ui, @DefaultValue("true") @QueryParam("is_primary_reuploading")
+            boolean isPrimaryReuploading, ReuploadKeyDTO dto) throws IOException {
+        if (isPrimaryReuploading) {
+            replaceKeyfile(dto);
+        }
+        keyService.reuploadKeyAction(ui.getName(), dto, DockerAction.REUPLOAD_KEY);
+        return UUID.randomUUID().toString();
+    }
+
+    @GET
+    public String getAdminKey(@Auth UserInfo userInfo) {
+        return keyService.getAdminKey();
+    }
+
+    private void replaceKeyfile(ReuploadKeyDTO dto) throws IOException {
+        String edgeUserName = dto.getEdgeUserName();
+        String filename = UsernameUtils.replaceWhitespaces(edgeUserName) + KeyAPI.KEY_EXTENTION;
+        FileUtils.deleteFile(filename, configuration.getKeyDirectory());
+        FileUtils.saveToFile(filename, configuration.getKeyDirectory(), dto.getContent());
+    }
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java
new file mode 100644
index 0000000..0ff68f0
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java
@@ -0,0 +1,197 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.gcp;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.handlers.ComputationalCallbackHandler;
+import com.epam.datalab.backendapi.core.response.handlers.ComputationalConfigure;
+import com.epam.datalab.backendapi.service.impl.DockerService;
+import com.epam.datalab.backendapi.service.impl.SparkClusterService;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.epam.datalab.dto.computational.ComputationalClusterConfigDTO;
+import com.epam.datalab.dto.computational.ComputationalStartDTO;
+import com.epam.datalab.dto.computational.ComputationalStopDTO;
+import com.epam.datalab.dto.gcp.computational.ComputationalCreateGcp;
+import com.epam.datalab.dto.gcp.computational.GcpComputationalTerminateDTO;
+import com.epam.datalab.dto.gcp.computational.SparkComputationalCreateGcp;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.contracts.ComputationalAPI;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import static com.epam.datalab.backendapi.core.commands.DockerAction.CREATE;
+import static com.epam.datalab.backendapi.core.commands.DockerAction.TERMINATE;
+
+
+@Path("/")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ComputationalResourceGcp extends DockerService implements DockerCommands {
+
+    @Inject
+    private ComputationalConfigure computationalConfigure;
+    @Inject
+    private SparkClusterService sparkClusterService;
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC)
+    public String create(@Auth UserInfo ui, ComputationalCreateGcp dto) {
+        log.debug("Create computational resources {} for user {}: {}", dto.getComputationalName(), ui.getName(), dto);
+        String uuid = DockerCommands.generateUUID();
+        folderListenerExecutor.start(configuration.getImagesDirectory(),
+                configuration.getResourceStatusPollTimeout(),
+                getFileHandlerCallback(CREATE, uuid, dto));
+        try {
+            commandExecutor.executeAsync(
+                    ui.getName(),
+                    uuid,
+                    commandBuilder.buildCommand(
+                            new RunDockerCommand()
+                                    .withInteractive()
+                                    .withName(nameContainer(dto.getEdgeUserName(), CREATE,
+                                            dto.getExploratoryName(), dto.getComputationalName()))
+                                    .withVolumeForRootKeys(configuration.getKeyDirectory())
+                                    .withVolumeForResponse(configuration.getImagesDirectory())
+                                    .withVolumeForLog(configuration.getDockerLogDirectory(), DataEngineType
+                                            .CLOUD_SERVICE.getName())
+                                    .withResource(DataEngineType.CLOUD_SERVICE.getName())
+                                    .withRequestId(uuid)
+                                    .withConfKeyName(configuration.getAdminKey())
+                                    .withActionCreate(DataEngineType.getDockerImageName(DataEngineType.CLOUD_SERVICE)),
+                            dto
+                    )
+            );
+        } catch (Exception t) {
+            throw new DatalabException("Could not create computational resource cluster", t);
+        }
+        return uuid;
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_TERMINATE_CLOUD_SPECIFIC)
+    public String terminate(@Auth UserInfo ui, GcpComputationalTerminateDTO dto) {
+
+        log.debug("Terminate computational resources {} for user {}: {}", dto.getComputationalName(), ui.getName(),
+                dto);
+        String uuid = DockerCommands.generateUUID();
+        folderListenerExecutor.start(configuration.getImagesDirectory(),
+                configuration.getResourceStatusPollTimeout(),
+                getFileHandlerCallback(TERMINATE, uuid, dto));
+        try {
+            commandExecutor.executeAsync(
+                    ui.getName(),
+                    uuid,
+                    commandBuilder.buildCommand(
+                            new RunDockerCommand()
+                                    .withInteractive()
+                                    .withName(nameContainer(dto.getEdgeUserName(), TERMINATE,
+                                            dto.getExploratoryName(), dto.getComputationalName()))
+                                    .withVolumeForRootKeys(configuration.getKeyDirectory())
+                                    .withVolumeForResponse(configuration.getImagesDirectory())
+                                    .withVolumeForLog(configuration.getDockerLogDirectory(), DataEngineType
+                                            .CLOUD_SERVICE.getName())
+                                    .withResource(DataEngineType.CLOUD_SERVICE.getName())
+                                    .withRequestId(uuid)
+                                    .withConfKeyName(configuration.getAdminKey())
+                                    .withActionTerminate(DataEngineType.getDockerImageName(DataEngineType
+                                            .CLOUD_SERVICE)),
+                            dto
+                    )
+            );
+        } catch (JsonProcessingException t) {
+            throw new DatalabException("Could not terminate computational resources cluster", t);
+        }
+
+        return uuid;
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_CREATE_SPARK)
+    public String createSparkCluster(@Auth UserInfo ui, SparkComputationalCreateGcp dto) {
+        log.debug("Create computational Spark resources {} for user {}: {}", dto.getComputationalName(), ui.getName(),
+                dto);
+
+        return sparkClusterService.create(ui, dto);
+    }
+
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_TERMINATE_SPARK)
+    public String terminateSparkCluster(@Auth UserInfo ui, GcpComputationalTerminateDTO dto) {
+        log.debug("Terminate computational Spark resources {} for user {}: {}", dto.getComputationalName(), ui.getName
+                (), dto);
+
+        return sparkClusterService.terminate(ui, dto);
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_STOP_SPARK)
+    public String stopSparkCluster(@Auth UserInfo ui, ComputationalStopDTO dto) {
+        log.debug("Stop computational Spark resources {} for user {}: {}",
+                dto.getComputationalName(), ui.getName(), dto);
+
+        return sparkClusterService.stop(ui, dto);
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_START_SPARK)
+    public String startSparkCluster(@Auth UserInfo ui, ComputationalStartDTO dto) {
+        log.debug("Start computational Spark resource {} for user {}: {}",
+                dto.getComputationalName(), ui.getName(), dto);
+
+        return sparkClusterService.start(ui, dto);
+    }
+
+    @POST
+    @Path(ComputationalAPI.COMPUTATIONAL_RECONFIGURE_SPARK)
+    public String reconfigureSparkCluster(@Auth UserInfo ui, ComputationalClusterConfigDTO config) {
+        log.debug("User is reconfiguring {} spark cluster for exploratory {}", ui.getName(),
+                config.getComputationalName(), config.getNotebookInstanceName());
+        return sparkClusterService.updateConfig(ui, config);
+    }
+
+    private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto) {
+        return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto);
+    }
+
+    private String nameContainer(String user, DockerAction action, String exploratoryName, String name) {
+        return nameContainer(user, action.toString(), "computational", exploratoryName, name);
+    }
+
+    @Override
+    public String getResourceType() {
+        return Directories.DATA_ENGINE_SERVICE_LOG_DIRECTORY;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/EdgeResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/EdgeResourceGcp.java
new file mode 100644
index 0000000..654f660
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/EdgeResourceGcp.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.gcp;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.response.handlers.EdgeCallbackHandler;
+import com.epam.datalab.backendapi.resources.base.EdgeService;
+import com.epam.datalab.dto.ResourceSysBaseDTO;
+import com.epam.datalab.dto.base.keyload.UploadFileResult;
+import com.epam.datalab.dto.gcp.edge.EdgeInfoGcp;
+import com.epam.datalab.dto.gcp.keyload.UploadFileGcp;
+import com.epam.datalab.util.FileUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import java.io.IOException;
+
+import static com.epam.datalab.rest.contracts.ApiCallbacks.EDGE;
+import static com.epam.datalab.rest.contracts.ApiCallbacks.KEY_LOADER;
+import static com.epam.datalab.rest.contracts.ApiCallbacks.STATUS_URI;
+
+/**
+ * Provides API to manage Edge node on GCP
+ */
+@Path("infrastructure/edge")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class EdgeResourceGcp extends EdgeService {
+
+    public EdgeResourceGcp() {
+        log.info("{} is initialized", getClass().getSimpleName());
+    }
+
+    @POST
+    @Path("/create")
+    public String create(@Auth UserInfo ui, UploadFileGcp dto) throws IOException {
+        FileUtils.saveToFile(getKeyFilename(dto.getEdge().getEdgeUserName()), getKeyDirectory(), dto.getContent());
+        return action(ui.getName(), dto.getEdge(), dto.getEdge().getCloudSettings().getIamUser(), KEY_LOADER,
+                DockerAction.CREATE);
+    }
+
+    @POST
+    @Path("/start")
+    public String start(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.START);
+    }
+
+    @POST
+    @Path("/stop")
+    public String stop(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.STOP);
+    }
+
+
+    @POST
+    @Path("/terminate")
+    public String terminate(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI,
+                DockerAction.TERMINATE);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    protected FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, String user, String
+            callbackURI) {
+        return new EdgeCallbackHandler(selfService, action, uuid, user, callbackURI,
+                EdgeInfoGcp.class,
+                UploadFileResult.class);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ExploratoryResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ExploratoryResourceGcp.java
new file mode 100644
index 0000000..c946ff7
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ExploratoryResourceGcp.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.gcp;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.resources.base.ExploratoryService;
+import com.epam.datalab.dto.exploratory.ExploratoryActionDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryReconfigureSparkClusterActionDTO;
+import com.epam.datalab.dto.gcp.exploratory.ExploratoryCreateGcp;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+@Path("/exploratory")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class ExploratoryResourceGcp {
+
+    @Inject
+    private ExploratoryService exploratoryService;
+
+
+    @Path("/create")
+    @POST
+    public String create(@Auth UserInfo ui, ExploratoryCreateGcp dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.CREATE);
+    }
+
+    @Path("/start")
+    @POST
+    public String start(@Auth UserInfo ui, ExploratoryGitCredsUpdateDTO dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.START);
+    }
+
+    @Path("/terminate")
+    @POST
+    public String terminate(@Auth UserInfo ui, ExploratoryActionDTO<?> dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.TERMINATE);
+    }
+
+    @Path("/stop")
+    @POST
+    public String stop(@Auth UserInfo ui, ExploratoryActionDTO<?> dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.STOP);
+    }
+
+    @Path("/reconfigure_spark")
+    @POST
+    public String reconfigureSpark(@Auth UserInfo ui, ExploratoryReconfigureSparkClusterActionDTO dto) throws JsonProcessingException {
+        return exploratoryService.action(ui.getName(), dto, DockerAction.RECONFIGURE_SPARK);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/InfrastructureResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/InfrastructureResourceGcp.java
new file mode 100644
index 0000000..f15f63f
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/InfrastructureResourceGcp.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.gcp;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.resources.base.InfrastructureService;
+import com.epam.datalab.dto.UserEnvironmentResources;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+@Path("/infrastructure")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class InfrastructureResourceGcp extends InfrastructureService {
+    public InfrastructureResourceGcp() {
+        log.info("{} is initialized", getClass().getSimpleName());
+    }
+
+    @Path("/status")
+    @POST
+    public String status(@Auth UserInfo ui, UserEnvironmentResources dto) {
+        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), DockerAction.STATUS);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/BucketService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/BucketService.java
new file mode 100644
index 0000000..e632ac5
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/BucketService.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.dto.bucket.BucketDTO;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.util.List;
+
+public interface BucketService {
+
+    List<BucketDTO> getObjects(String bucket);
+
+    void uploadObject(String bucket, String object, InputStream stream, String contentType, long fileSize);
+
+    void uploadFolder(UserInfo userInfo, String bucket, String folder);
+
+    void downloadObject(String bucket, String object, HttpServletResponse resp);
+
+    void deleteObjects(String bucket, List<String> objects);
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/CheckInactivityService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/CheckInactivityService.java
new file mode 100644
index 0000000..0086d8e
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/CheckInactivityService.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.dto.computational.ComputationalCheckInactivityDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryCheckInactivityAction;
+
+public interface CheckInactivityService {
+    String checkComputationalInactivity(String userName, ComputationalCheckInactivityDTO dto);
+
+    String checkExploratoryInactivity(String userName, ExploratoryCheckInactivityAction dto);
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/OdahuService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/OdahuService.java
new file mode 100644
index 0000000..46c23cf
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/OdahuService.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.dto.odahu.ActionOdahuDTO;
+import com.epam.datalab.dto.odahu.CreateOdahuDTO;
+
+public interface OdahuService {
+    String create(UserInfo userInfo, CreateOdahuDTO odahuCreateDTO);
+
+    String start(UserInfo userInfo, ActionOdahuDTO dto);
+
+    String stop(UserInfo userInfo, ActionOdahuDTO dto);
+
+    String terminate(UserInfo userInfo, ActionOdahuDTO dto);
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/ProjectService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/ProjectService.java
new file mode 100644
index 0000000..1f20c52
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/ProjectService.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.dto.project.ProjectActionDTO;
+import com.epam.datalab.dto.project.ProjectCreateDTO;
+
+public interface ProjectService {
+
+	String create(UserInfo userInfo, ProjectCreateDTO projectCreateDTO);
+
+	String recreate(UserInfo userInfo, ProjectCreateDTO dto);
+
+	String terminate(UserInfo userInfo, ProjectActionDTO dto);
+
+	String start(UserInfo userInfo, ProjectActionDTO dto);
+
+	String stop(UserInfo userInfo, ProjectActionDTO dto);
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/RestoreCallbackHandlerService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/RestoreCallbackHandlerService.java
new file mode 100644
index 0000000..e619dc6
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/RestoreCallbackHandlerService.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+@FunctionalInterface
+public interface RestoreCallbackHandlerService {
+    void restore();
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/CheckInactivityServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/CheckInactivityServiceImpl.java
new file mode 100644
index 0000000..1d9aa16
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/CheckInactivityServiceImpl.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.handlers.CheckInactivityCallbackHandler;
+import com.epam.datalab.backendapi.service.CheckInactivityService;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.ResourceBaseDTO;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.computational.ComputationalCheckInactivityDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryCheckInactivityAction;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.google.inject.Singleton;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Objects;
+
+@Slf4j
+@Singleton
+public class CheckInactivityServiceImpl extends DockerService implements CheckInactivityService, DockerCommands {
+
+
+    @Override
+    public String checkComputationalInactivity(String userName, ComputationalCheckInactivityDTO dto) {
+        String uuid = DockerCommands.generateUUID();
+        startComputationalCallbackListener(userName, dto, uuid);
+        final RunDockerCommand runDockerCommand = new RunDockerCommand()
+                .withInteractive()
+                .withRemove()
+                .withName(nameContainer(uuid, DockerAction.CHECK_INACTIVITY.toString()))
+                .withVolumeForRootKeys(configuration.getKeyDirectory())
+                .withVolumeForResponse(configuration.getKeyLoaderDirectory())
+                .withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
+                .withResource(DataEngineType.fromDockerImageName(dto.getImage()) == DataEngineType.SPARK_STANDALONE ?
+                        Directories.DATA_ENGINE_LOG_DIRECTORY :
+                        Directories.DATA_ENGINE_SERVICE_LOG_DIRECTORY)
+                .withRequestId(uuid)
+                .withConfKeyName(configuration.getAdminKey())
+                .withImage(dto.getNotebookImage())
+                .withAction(DockerAction.CHECK_INACTIVITY);
+        if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+            runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+        }
+
+        runDockerCmd(userName, uuid, runDockerCommand, dto);
+        return uuid;
+    }
+
+    @Override
+    public String checkExploratoryInactivity(String userName, ExploratoryCheckInactivityAction dto) {
+        String uuid = DockerCommands.generateUUID();
+        startExploratoryCallbackListener(userName, dto, uuid);
+        final RunDockerCommand runDockerCommand = new RunDockerCommand()
+                .withInteractive()
+                .withRemove()
+                .withName(nameContainer(uuid, DockerAction.CHECK_INACTIVITY.toString()))
+                .withVolumeForRootKeys(configuration.getKeyDirectory())
+                .withVolumeForResponse(configuration.getKeyLoaderDirectory())
+                .withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
+                .withResource(Directories.NOTEBOOK_LOG_DIRECTORY)
+                .withRequestId(uuid)
+                .withConfKeyName(configuration.getAdminKey())
+                .withImage(dto.getNotebookImage())
+                .withAction(DockerAction.CHECK_INACTIVITY);
+        if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+            runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+        }
+
+        runDockerCmd(userName, uuid, runDockerCommand, dto);
+        return uuid;
+    }
+
+    private void startComputationalCallbackListener(String userName, ComputationalCheckInactivityDTO dto,
+                                                    String uuid) {
+        final CheckInactivityCallbackHandler handler = new CheckInactivityCallbackHandler(
+                selfService, ApiCallbacks.CHECK_INACTIVITY_COMPUTATIONAL_URI, userName, uuid,
+                dto.getExploratoryName(), dto.getComputationalName());
+        folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
+                configuration.getKeyLoaderPollTimeout(), handler);
+    }
+
+    private void startExploratoryCallbackListener(String userName, ExploratoryCheckInactivityAction dto, String uuid) {
+        final CheckInactivityCallbackHandler handler = new CheckInactivityCallbackHandler(
+                selfService, ApiCallbacks.CHECK_INACTIVITY_EXPLORATORY_URI, userName, uuid,
+                dto.getExploratoryName());
+        folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
+                configuration.getKeyLoaderPollTimeout(), handler);
+    }
+
+    private void runDockerCmd(String userName, String uuid, RunDockerCommand dockerCmd, ResourceBaseDTO<?> dto) {
+        try {
+            final String command = commandBuilder.buildCommand(dockerCmd, dto);
+            log.trace("Docker command: {}", command);
+            commandExecutor.executeAsync(userName, uuid, command);
+        } catch (Exception e) {
+            log.error("Exception occured during reuploading key: {} for command {}", e.getLocalizedMessage(),
+                    dockerCmd.toCMD(), e);
+        }
+    }
+
+    @Override
+    public String getResourceType() {
+        return Directories.NOTEBOOK_LOG_DIRECTORY;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/DockerService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/DockerService.java
new file mode 100644
index 0000000..4a08f69
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/DockerService.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.commands.CommandBuilder;
+import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
+import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+
+public abstract class DockerService {
+
+    @Inject
+    protected ProvisioningServiceApplicationConfiguration configuration;
+    @Inject
+    protected FolderListenerExecutor folderListenerExecutor;
+    @Inject
+    protected ICommandExecutor commandExecutor;
+    @Inject
+    protected CommandBuilder commandBuilder;
+    @Inject
+    protected RESTService selfService;
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/KeyService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/KeyService.java
new file mode 100644
index 0000000..443d6a4
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/KeyService.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.handlers.ReuploadKeyCallbackHandler;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyCallbackDTO;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.model.ResourceData;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+
+import static java.lang.String.format;
+import static java.nio.file.Files.readAllBytes;
+import static java.nio.file.Paths.get;
+
+@Slf4j
+@Singleton
+public class KeyService extends DockerService implements DockerCommands {
+
+    private static final String REUPLOAD_KEY_ACTION = "reupload_key";
+
+    private final ProvisioningServiceApplicationConfiguration conf;
+
+    @Inject
+    public KeyService(ProvisioningServiceApplicationConfiguration conf) {
+        this.conf = conf;
+    }
+
+
+    public void reuploadKeyAction(String userName, ReuploadKeyDTO dto, DockerAction action) {
+        log.debug("{} for edge user {}", action, dto.getEdgeUserName());
+
+        long count = dto.getResources()
+                .stream()
+                .map(resourceData -> buildCallbackDTO(resourceData, getUuid(), dto))
+                .peek(callbackDto -> startCallbackListener(userName, callbackDto))
+                .peek(callbackDto ->
+                        runDockerCmd(userName, callbackDto.getId(), buildRunDockerCommand(callbackDto, action),
+                                buildDockerCommandDTO(callbackDto)))
+                .count();
+        log.debug("Executed {} Docker commands", count);
+    }
+
+    public String getAdminKey() {
+        try {
+            return new String(readAllBytes(get(format("%s/%s.pem", conf.getKeyDirectory(), conf.getAdminKey()))));
+        } catch (IOException e) {
+            log.error("Can not read admin key: {}", e.getMessage());
+            throw new DatalabException("Can not read admin key: " + e.getMessage(), e);
+        }
+    }
+
+    private String getUuid() {
+        return DockerCommands.generateUUID();
+    }
+
+    private void runDockerCmd(String userName, String uuid, RunDockerCommand runDockerCommand,
+                              ReuploadKeyCallbackDTO callbackDto) {
+        try {
+            final String command = commandBuilder.buildCommand(runDockerCommand, callbackDto);
+            log.trace("Docker command: {}", command);
+            commandExecutor.executeAsync(userName, uuid, command);
+        } catch (Exception e) {
+            log.error("Exception occured during reuploading key: {} for command {}", e.getLocalizedMessage(),
+                    runDockerCommand.toCMD(), e);
+        }
+    }
+
+    private void startCallbackListener(String userName, ReuploadKeyCallbackDTO dto) {
+        folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
+                configuration.getKeyLoaderPollTimeout(),
+                new ReuploadKeyCallbackHandler(selfService, ApiCallbacks.REUPLOAD_KEY_URI,
+                        userName, dto));
+    }
+
+    @Override
+    public String getResourceType() {
+        return Directories.EDGE_LOG_DIRECTORY;
+    }
+
+    private RunDockerCommand buildRunDockerCommand(ReuploadKeyCallbackDTO callbackDto, DockerAction action) {
+        return new RunDockerCommand()
+                .withInteractive()
+                .withName(getContainerName(callbackDto))
+                .withVolumeForRootKeys(configuration.getKeyDirectory())
+                .withVolumeForResponse(configuration.getKeyLoaderDirectory())
+                .withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
+                .withResource(callbackDto.getResource().getResourceType().toString())
+                .withRequestId(callbackDto.getId())
+                .withConfKeyName(configuration.getAdminKey())
+                .withImage(configuration.getEdgeImage())
+                .withAction(action);
+    }
+
+    private ReuploadKeyCallbackDTO buildCallbackDTO(ResourceData resource, String uuid, ReuploadKeyDTO dto) {
+        return new ReuploadKeyCallbackDTO()
+                .withId(uuid)
+                .withEdgeUserName(dto.getEdgeUserName())
+                .withServiceBaseName(dto.getServiceBaseName())
+                .withConfOsFamily(dto.getConfOsFamily())
+                .withResourceId(resource.getResourceId())
+                .withResource(resource);
+    }
+
+    private ReuploadKeyCallbackDTO buildDockerCommandDTO(ReuploadKeyCallbackDTO dto) {
+        return new ReuploadKeyCallbackDTO()
+                .withEdgeUserName(dto.getEdgeUserName())
+                .withServiceBaseName(dto.getServiceBaseName())
+                .withConfOsFamily(dto.getConfOsFamily())
+                .withResourceId(dto.getResourceId());
+    }
+
+    private String getContainerName(ReuploadKeyCallbackDTO callbackDto) {
+        return nameContainer(callbackDto.getEdgeUserName(), REUPLOAD_KEY_ACTION,
+                callbackDto.getResource().getResourceType().toString(),
+                callbackDto.getResource().getResourceId());
+    }
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImpl.java
new file mode 100644
index 0000000..6be8ece
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImpl.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.commands.CommandBuilder;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.datalab.backendapi.core.response.handlers.OdahuCallbackHandler;
+import com.epam.datalab.backendapi.service.OdahuService;
+import com.epam.datalab.dto.ResourceBaseDTO;
+import com.epam.datalab.dto.odahu.ActionOdahuDTO;
+import com.epam.datalab.dto.odahu.CreateOdahuDTO;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
+
+public class OdahuServiceImpl implements OdahuService {
+
+    private static final String CALLBACK_URI = "/api/odahu/status";
+    private static final String ODAHU_RESOURCE_TYPE = "odahu";
+    private static final String ODAHU_IMAGE = "docker.datalab-odahu";
+
+    private final ProvisioningServiceApplicationConfiguration configuration;
+    private final FolderListenerExecutor folderListenerExecutor;
+    private final CommandBuilder commandBuilder;
+    private final ICommandExecutor commandExecutor;
+    private final RESTService selfService;
+
+    @Inject
+    public OdahuServiceImpl(ProvisioningServiceApplicationConfiguration configuration,
+                            FolderListenerExecutor folderListenerExecutor, CommandBuilder commandBuilder,
+                            ICommandExecutor commandExecutor, RESTService selfService) {
+        this.configuration = configuration;
+        this.folderListenerExecutor = folderListenerExecutor;
+        this.commandBuilder = commandBuilder;
+        this.commandExecutor = commandExecutor;
+        this.selfService = selfService;
+    }
+
+    @Override
+    public String create(UserInfo userInfo, CreateOdahuDTO dto) {
+        return executeDocker(userInfo, dto, DockerAction.CREATE, ODAHU_RESOURCE_TYPE, ODAHU_IMAGE, dto.getName(),
+                dto.getProject(), dto.getEndpoint());
+    }
+
+    @Override
+    public String start(UserInfo userInfo, ActionOdahuDTO dto) {
+        return executeDocker(userInfo, dto, DockerAction.START, ODAHU_RESOURCE_TYPE, ODAHU_IMAGE, dto.getName(),
+                dto.getProject(), dto.getEndpoint());
+    }
+
+    @Override
+    public String stop(UserInfo userInfo, ActionOdahuDTO dto) {
+        return executeDocker(userInfo, dto, DockerAction.STOP, ODAHU_RESOURCE_TYPE, ODAHU_IMAGE, dto.getName(),
+                dto.getProject(), dto.getEndpoint());
+    }
+
+    @Override
+    public String terminate(UserInfo userInfo, ActionOdahuDTO dto) {
+        return executeDocker(userInfo, dto, DockerAction.TERMINATE, ODAHU_RESOURCE_TYPE, ODAHU_IMAGE, dto.getName(),
+                dto.getProject(), dto.getEndpoint());
+    }
+
+
+    private String executeDocker(UserInfo userInfo, ResourceBaseDTO dto, DockerAction action, String resourceType,
+                                 String image, String name, String project, String endpoint) {
+        String uuid = DockerCommands.generateUUID();
+
+        folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
+                configuration.getKeyLoaderPollTimeout(),
+                new OdahuCallbackHandler(selfService, userInfo.getName(), uuid, action, CALLBACK_URI, name, project, endpoint));
+
+        RunDockerCommand runDockerCommand = new RunDockerCommand()
+                .withInteractive()
+                .withName(String.join("_", userInfo.getSimpleName(), name, resourceType, action.toString(),
+                        Long.toString(System.currentTimeMillis())))
+                .withVolumeForRootKeys(configuration.getKeyDirectory())
+                .withVolumeForResponse(configuration.getKeyLoaderDirectory())
+                .withVolumeForLog(configuration.getDockerLogDirectory(), resourceType)
+                .withResource(resourceType)
+                .withRequestId(uuid)
+                .withConfKeyName(configuration.getAdminKey())
+                .withImage(image)
+                .withAction(action);
+
+        try {
+            commandExecutor.executeAsync(userInfo.getName(), uuid, commandBuilder.buildCommand(runDockerCommand, dto));
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+        return uuid;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
new file mode 100644
index 0000000..f92e1f4
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.commands.*;
+import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.datalab.backendapi.core.response.handlers.ProjectCallbackHandler;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.ResourceBaseDTO;
+import com.epam.datalab.dto.aws.edge.EdgeInfoAws;
+import com.epam.datalab.dto.azure.edge.EdgeInfoAzure;
+import com.epam.datalab.dto.gcp.edge.EdgeInfoGcp;
+import com.epam.datalab.dto.project.ProjectActionDTO;
+import com.epam.datalab.dto.project.ProjectCreateDTO;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Objects;
+
+@Slf4j
+public class ProjectServiceImpl implements ProjectService {
+    private static final String PROJECT_IMAGE = "docker.datalab-project";
+    private static final String EDGE_IMAGE = "docker.datalab-edge";
+    private static final String CALLBACK_URI = "/api/project/status";
+    private static final String PROJECT_RESOURCE_TYPE = "project";
+    private static final String EDGE_RESOURCE_TYPE = "edge";
+
+    protected final RESTService selfService;
+    private final ProvisioningServiceApplicationConfiguration configuration;
+    private final FolderListenerExecutor folderListenerExecutor;
+    private final ICommandExecutor commandExecutor;
+    private final CommandBuilder commandBuilder;
+
+    @Inject
+    public ProjectServiceImpl(RESTService selfService, ProvisioningServiceApplicationConfiguration configuration,
+                              FolderListenerExecutor folderListenerExecutor, ICommandExecutor commandExecutor, CommandBuilder commandBuilder) {
+        this.selfService = selfService;
+        this.configuration = configuration;
+        this.folderListenerExecutor = folderListenerExecutor;
+        this.commandExecutor = commandExecutor;
+        this.commandBuilder = commandBuilder;
+    }
+
+    @Override
+    public String create(UserInfo userInfo, ProjectCreateDTO dto) {
+        log.info("Trying to create project: {}", dto);
+        return executeDocker(userInfo, dto, DockerAction.CREATE, dto.getName(), PROJECT_RESOURCE_TYPE, PROJECT_IMAGE, dto.getEndpoint());
+    }
+
+    @Override
+    public String recreate(UserInfo userInfo, ProjectCreateDTO dto) {
+        log.info("Trying to recreate project: {}", dto);
+        return executeDocker(userInfo, dto, DockerAction.RECREATE, dto.getName(), PROJECT_RESOURCE_TYPE, PROJECT_IMAGE, dto.getEndpoint());
+    }
+
+    @Override
+    public String terminate(UserInfo userInfo, ProjectActionDTO dto) {
+        log.info("Trying to terminate project: {}", dto);
+        return executeDocker(userInfo, dto, DockerAction.TERMINATE, dto.getName(), PROJECT_RESOURCE_TYPE, PROJECT_IMAGE, dto.getEndpoint());
+    }
+
+    @Override
+    public String start(UserInfo userInfo, ProjectActionDTO dto) {
+        log.info("Trying to start project: {}", dto);
+        return executeDocker(userInfo, dto, DockerAction.START, dto.getName(), EDGE_RESOURCE_TYPE, EDGE_IMAGE, dto.getEndpoint());
+    }
+
+    @Override
+    public String stop(UserInfo userInfo, ProjectActionDTO dto) {
+        log.info("Trying to stop project: {}", dto);
+        return executeDocker(userInfo, dto, DockerAction.STOP, dto.getName(), EDGE_RESOURCE_TYPE, EDGE_IMAGE, dto.getEndpoint());
+    }
+
+    private String executeDocker(UserInfo userInfo, ResourceBaseDTO dto, DockerAction action, String projectName,
+                                 String resourceType, String image, String endpoint) {
+        String uuid = DockerCommands.generateUUID();
+
+        folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
+                configuration.getKeyLoaderPollTimeout(),
+                new ProjectCallbackHandler(selfService, userInfo.getName(), uuid,
+                        action, CALLBACK_URI, projectName, getEdgeClass(), endpoint));
+
+        RunDockerCommand runDockerCommand = new RunDockerCommand()
+                .withInteractive()
+                .withName(String.join("_", userInfo.getSimpleName(), projectName, resourceType, action.toString(),
+                        Long.toString(System.currentTimeMillis())))
+                .withVolumeForRootKeys(configuration.getKeyDirectory())
+                .withVolumeForResponse(configuration.getKeyLoaderDirectory())
+                .withVolumeForLog(configuration.getDockerLogDirectory(), resourceType)
+                .withResource(resourceType)
+                .withRequestId(uuid)
+                .withConfKeyName(configuration.getAdminKey())
+                .withImage(image)
+                .withAction(action);
+        log.info("Docker command : {}", runDockerCommand);
+        if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+            runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+        }
+
+        try {
+            commandExecutor.executeAsync(userInfo.getName(), uuid, commandBuilder.buildCommand(runDockerCommand, dto));
+        } catch (JsonProcessingException e) {
+            log.error("Something went wrong. Reason {}", e.getMessage(), e);
+        }
+        return uuid;
+    }
+
+    private <T> Class<T> getEdgeClass() {
+        if (configuration.getCloudProvider() == CloudProvider.AWS) {
+            return (Class<T>) EdgeInfoAws.class;
+        } else if (configuration.getCloudProvider() == CloudProvider.AZURE) {
+            return (Class<T>) EdgeInfoAzure.class;
+        } else if (configuration.getCloudProvider() == CloudProvider.GCP) {
+            return (Class<T>) EdgeInfoGcp.class;
+        }
+        throw new IllegalArgumentException();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/RestoreCallbackHandlerServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/RestoreCallbackHandlerServiceImpl.java
new file mode 100644
index 0000000..4e21d0d
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/RestoreCallbackHandlerServiceImpl.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
+import com.epam.datalab.backendapi.service.RestoreCallbackHandlerService;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import io.dropwizard.lifecycle.Managed;
+import io.dropwizard.util.Duration;
+import lombok.extern.slf4j.Slf4j;
+
+@Singleton
+@Slf4j
+public class RestoreCallbackHandlerServiceImpl implements Managed, RestoreCallbackHandlerService {
+
+    @Inject
+    private CallbackHandlerDao callbackHandlerDao;
+    @Inject
+    private FolderListenerExecutor folderListenerExecutor;
+
+    @Override
+    public void start() {
+        restore();
+    }
+
+    @Override
+    public void stop() {
+        log.info("RestoreCallbackHandlerServiceImpl stopped");
+    }
+
+    public void restore() {
+        log.info("Restoring callback handlers");
+        callbackHandlerDao.findAll().forEach(persistentFileHandler ->
+                folderListenerExecutor.start(persistentFileHandler.getDirectory(),
+                        Duration.milliseconds(persistentFileHandler.getTimeout()),
+                        persistentFileHandler.getHandler()));
+        log.info("Successfully restored file handlers");
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/SparkClusterService.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/SparkClusterService.java
new file mode 100644
index 0000000..62ae5b1
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/SparkClusterService.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.core.Directories;
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.commands.DockerCommands;
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import com.epam.datalab.backendapi.core.response.handlers.ComputationalCallbackHandler;
+import com.epam.datalab.backendapi.core.response.handlers.ComputationalConfigure;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.epam.datalab.dto.computational.ComputationalClusterConfigDTO;
+import com.epam.datalab.dto.computational.ComputationalStartDTO;
+import com.epam.datalab.dto.computational.ComputationalStopDTO;
+import com.epam.datalab.dto.computational.ComputationalTerminateDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import java.util.Objects;
+
+import static com.epam.datalab.backendapi.core.commands.DockerAction.CREATE;
+import static com.epam.datalab.backendapi.core.commands.DockerAction.RECONFIGURE_SPARK;
+import static com.epam.datalab.backendapi.core.commands.DockerAction.START;
+import static com.epam.datalab.backendapi.core.commands.DockerAction.STOP;
+import static com.epam.datalab.backendapi.core.commands.DockerAction.TERMINATE;
+
+@Singleton
+public class SparkClusterService extends DockerService implements DockerCommands {
+
+    private static final DataEngineType SPARK_ENGINE = DataEngineType.SPARK_STANDALONE;
+
+    @Inject
+    private ComputationalConfigure computationalConfigure;
+
+    public String create(UserInfo ui, ComputationalBase<?> dto) {
+        return action(ui, dto, CREATE);
+    }
+
+    public String terminate(UserInfo ui, ComputationalTerminateDTO dto) {
+        return action(ui, dto, TERMINATE);
+    }
+
+    public String stop(UserInfo ui, ComputationalStopDTO dto) {
+        return action(ui, dto, STOP);
+    }
+
+    public String start(UserInfo ui, ComputationalStartDTO dto) {
+        return action(ui, dto, START);
+    }
+
+    public String updateConfig(UserInfo ui, ComputationalClusterConfigDTO clusterConfigDTO) {
+        String uuid = DockerCommands.generateUUID();
+        folderListenerExecutor.start(configuration.getImagesDirectory(),
+                configuration.getResourceStatusPollTimeout(),
+                getFileHandlerCallback(RECONFIGURE_SPARK, uuid, clusterConfigDTO));
+        runReconfigureSparkDockerCommand(ui, clusterConfigDTO, uuid);
+        return uuid;
+    }
+
+    private void runReconfigureSparkDockerCommand(UserInfo ui, ComputationalClusterConfigDTO clusterConfigDTO,
+                                                  String uuid) {
+        try {
+            final RunDockerCommand runDockerCommand = new RunDockerCommand()
+                    .withInteractive()
+                    .withName(nameContainer(clusterConfigDTO.getEdgeUserName(), RECONFIGURE_SPARK,
+                            clusterConfigDTO.getExploratoryName(),
+                            clusterConfigDTO.getComputationalName()))
+                    .withVolumeForRootKeys(configuration.getKeyDirectory())
+                    .withVolumeForResponse(configuration.getImagesDirectory())
+                    .withVolumeForLog(configuration.getDockerLogDirectory(), SPARK_ENGINE.getName())
+                    .withResource(SPARK_ENGINE.getName())
+                    .withRequestId(uuid)
+                    .withConfKeyName(configuration.getAdminKey())
+                    .withImage(DataEngineType.getDockerImageName(SPARK_ENGINE))
+                    .withAction(RECONFIGURE_SPARK);
+            if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                    Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                    !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+                runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+            }
+
+            commandExecutor.executeAsync(ui.getName(), uuid, commandBuilder.buildCommand(runDockerCommand,
+                    clusterConfigDTO));
+        } catch (JsonProcessingException e) {
+            throw new DatalabException("Could not" + RECONFIGURE_SPARK.toString() + "computational resources cluster", e);
+        }
+    }
+
+    private String action(UserInfo ui, ComputationalBase<?> dto, DockerAction action) {
+        String uuid = DockerCommands.generateUUID();
+        folderListenerExecutor.start(configuration.getImagesDirectory(),
+                configuration.getResourceStatusPollTimeout(),
+                getFileHandlerCallback(action, uuid, dto));
+        try {
+            final RunDockerCommand runDockerCommand = new RunDockerCommand()
+                    .withInteractive()
+                    .withName(nameContainer(dto.getEdgeUserName(), action, dto.getExploratoryName(),
+                            dto.getComputationalName()))
+                    .withVolumeForRootKeys(configuration.getKeyDirectory())
+                    .withVolumeForResponse(configuration.getImagesDirectory())
+                    .withVolumeForLog(configuration.getDockerLogDirectory(), SPARK_ENGINE.getName())
+                    .withResource(SPARK_ENGINE.getName())
+                    .withRequestId(uuid)
+                    .withConfKeyName(configuration.getAdminKey())
+                    .withImage(DataEngineType.getDockerImageName(SPARK_ENGINE))
+                    .withAction(action);
+            if (configuration.getCloudProvider() == CloudProvider.AZURE &&
+                    Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
+                    !configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
+                runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
+            }
+
+            commandExecutor.executeAsync(ui.getName(), uuid, commandBuilder.buildCommand(runDockerCommand, dto));
+        } catch (JsonProcessingException e) {
+            throw new DatalabException("Could not" + action.toString() + "computational resources cluster", e);
+        }
+
+        return uuid;
+    }
+
+    private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto) {
+        return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto);
+    }
+
+    private String nameContainer(String user, DockerAction action, String exploratoryName, String name) {
+        return nameContainer(user, action.toString(), "computational", exploratoryName, name);
+    }
+
+    @Override
+    public String getResourceType() {
+        return Directories.DATA_ENGINE_LOG_DIRECTORY;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/aws/BucketServiceAwsImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
new file mode 100644
index 0000000..2999df9
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl.aws;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.BucketService;
+import com.epam.datalab.dto.bucket.BucketDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import lombok.extern.slf4j.Slf4j;
+import software.amazon.awssdk.core.sync.RequestBody;
+import software.amazon.awssdk.core.sync.ResponseTransformer;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.model.Delete;
+import software.amazon.awssdk.services.s3.model.DeleteObjectsRequest;
+import software.amazon.awssdk.services.s3.model.GetObjectRequest;
+import software.amazon.awssdk.services.s3.model.ListObjectsRequest;
+import software.amazon.awssdk.services.s3.model.ObjectIdentifier;
+import software.amazon.awssdk.services.s3.model.PutObjectRequest;
+import software.amazon.awssdk.services.s3.model.S3Object;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class BucketServiceAwsImpl implements BucketService {
+
+    @Override
+    public List<BucketDTO> getObjects(String bucket) {
+        try (S3Client s3 = S3Client.create()) {
+            ListObjectsRequest getRequest = ListObjectsRequest
+                    .builder()
+                    .bucket(bucket)
+                    .build();
+
+            return s3.listObjects(getRequest).contents()
+                    .stream()
+                    .map(o -> toBucketDTO(bucket, o))
+                    .collect(Collectors.toList());
+        } catch (Exception e) {
+            log.error("Cannot retrieve objects from bucket {}. Reason: {}", bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot retrieve objects from bucket %s. Reason: %s", bucket, e.getMessage()));
+        }
+    }
+
+    @Override
+    public void uploadObject(String bucket, String object, InputStream stream, String contentType, long fileSize) {
+        log.info("Uploading file {} to bucket {}", object, bucket);
+        try (S3Client s3 = S3Client.create()) {
+            PutObjectRequest uploadRequest = PutObjectRequest
+                    .builder()
+                    .bucket(bucket)
+                    .key(object)
+                    .contentType(contentType)
+                    .build();
+            s3.putObject(uploadRequest, RequestBody.fromInputStream(stream, fileSize));
+        } catch (Exception e) {
+            log.error("Cannot upload object {} to bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot upload object %s to bucket %s. Reason: %s", object, bucket, e.getMessage()));
+        }
+        log.info("Finished uploading file {} to bucket {}", object, bucket);
+    }
+
+    @Override
+    public void uploadFolder(UserInfo userInfo, String bucket, String folder) {
+        log.info("Uploading folder {} to bucket {}", folder, bucket);
+        try (S3Client s3 = S3Client.create()) {
+            PutObjectRequest uploadRequest = PutObjectRequest
+                    .builder()
+                    .bucket(bucket)
+                    .key(folder)
+                    .build();
+            s3.putObject(uploadRequest, RequestBody.empty());
+        } catch (Exception e) {
+            log.error("Cannot upload folder {} to bucket {}. Reason: {}", folder, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot upload folder %s to bucket %s. Reason: %s", folder, bucket, e.getMessage()));
+        }
+        log.info("Finished uploading folder {} to bucket {}", folder, bucket);
+    }
+
+    @Override
+    public void downloadObject(String bucket, String object, HttpServletResponse resp) {
+        log.info("Downloading file {} from bucket {}", object, bucket);
+        try (ServletOutputStream outputStream = resp.getOutputStream(); S3Client s3 = S3Client.create()) {
+            GetObjectRequest downloadRequest = GetObjectRequest
+                    .builder()
+                    .bucket(bucket)
+                    .key(object)
+                    .build();
+            s3.getObject(downloadRequest, ResponseTransformer.toOutputStream(outputStream));
+        } catch (Exception e) {
+            log.error("Cannot download object {} from bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot download object %s from bucket %s. Reason: %s", object, bucket, e.getMessage()));
+        }
+        log.info("Finished downloading file {} from bucket {}", object, bucket);
+    }
+
+    @Override
+    public void deleteObjects(String bucket, List<String> objects) {
+        try (S3Client s3 = S3Client.create()) {
+            List<ObjectIdentifier> objectsToDelete = objects
+                    .stream()
+                    .map(o -> ObjectIdentifier.builder()
+                            .key(o)
+                            .build())
+                    .collect(Collectors.toList());
+
+            DeleteObjectsRequest deleteObjectsRequests = DeleteObjectsRequest.builder()
+                    .bucket(bucket)
+                    .delete(Delete.builder()
+                            .objects(objectsToDelete)
+                            .build())
+                    .build();
+
+            s3.deleteObjects(deleteObjectsRequests);
+        } catch (Exception e) {
+            log.error("Cannot delete objects {} from bucket {}. Reason: {}", objects, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot delete objects %s from bucket %s. Reason: %s", objects, bucket, e.getMessage()));
+        }
+    }
+
+    private BucketDTO toBucketDTO(String bucket, S3Object s3Object) {
+        return BucketDTO.builder()
+                .bucket(bucket)
+                .object(s3Object.key())
+                .size(String.valueOf(s3Object.size()))
+                .lastModifiedDate(s3Object.lastModified().toEpochMilli())
+                .build();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/azure/BucketServiceAzureImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/azure/BucketServiceAzureImpl.java
new file mode 100644
index 0000000..0782aa8
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/azure/BucketServiceAzureImpl.java
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl.azure;
+
+import com.azure.identity.ClientSecretCredentialBuilder;
+import com.azure.storage.blob.BlobClient;
+import com.azure.storage.blob.BlobContainerClient;
+import com.azure.storage.blob.BlobServiceClient;
+import com.azure.storage.blob.BlobServiceClientBuilder;
+import com.azure.storage.blob.models.BlobItem;
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.service.BucketService;
+import com.epam.datalab.dto.bucket.BucketDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.model.azure.AzureAuthFile;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Inject;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class BucketServiceAzureImpl implements BucketService {
+
+    private final AzureAuthFile azureAuthFile;
+
+    @Inject
+    public BucketServiceAzureImpl(ProvisioningServiceApplicationConfiguration configuration) throws Exception {
+        azureAuthFile = getAzureAuthFile(configuration);
+    }
+
+    @Override
+    public List<BucketDTO> getObjects(String bucket) {
+        try {
+            AzureStorageAccount account = getAzureStorageAccount(bucket);
+            BlobServiceClient blobServiceClient = getBlobServiceClient(account.getStorageAccount());
+            BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient(account.getContainer());
+            return blobContainerClient.listBlobs()
+                    .stream()
+                    .map(blob -> toBucketDTO(account.getContainer(), blob))
+                    .collect(Collectors.toList());
+        } catch (Exception e) {
+            log.error("Cannot retrieve objects from bucket {}. Reason: {}", bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot retrieve objects from bucket %s. Reason: %s", bucket, e.getMessage()));
+        }
+    }
+
+    @Override
+    public void uploadObject(String bucket, String object, InputStream stream, String contentType, long fileSize) {
+        log.info("Uploading file {} to bucket {}", object, bucket);
+        try {
+            AzureStorageAccount account = getAzureStorageAccount(bucket);
+            BlobServiceClient blobServiceClient = getBlobServiceClient(account.getStorageAccount());
+            BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient(account.getContainer());
+            BlobClient blobClient = blobContainerClient.getBlobClient(object);
+            blobClient.upload(stream, fileSize);
+        } catch (Exception e) {
+            log.error("Cannot upload object {} to bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot upload object %s to bucket %s. Reason: %s", object, bucket, e.getMessage()));
+        }
+        log.info("Finished uploading file {} to bucket {}", object, bucket);
+    }
+
+    @Override
+    public void uploadFolder(UserInfo userInfo, String bucket, String folder) {
+        // Azure doesn't support this feature
+    }
+
+    @Override
+    public void downloadObject(String bucket, String object, HttpServletResponse resp) {
+        log.info("Downloading file {} from bucket {}", object, bucket);
+        try (ServletOutputStream outputStream = resp.getOutputStream()) {
+            AzureStorageAccount account = getAzureStorageAccount(bucket);
+            BlobServiceClient blobServiceClient = getBlobServiceClient(account.getStorageAccount());
+            BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient(account.getContainer());
+            BlobClient blobClient = blobContainerClient.getBlobClient(object);
+            blobClient.download(outputStream);
+        } catch (Exception e) {
+            log.error("Cannot download object {} from bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot download object %s from bucket %s. Reason: %s", object, bucket, e.getMessage()));
+        }
+        log.info("Finished downloading file {} from bucket {}", object, bucket);
+    }
+
+    @Override
+    public void deleteObjects(String bucket, List<String> objects) {
+        try {
+            AzureStorageAccount account = getAzureStorageAccount(bucket);
+            BlobServiceClient blobServiceClient = getBlobServiceClient(account.getStorageAccount());
+            BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient(account.getContainer());
+            objects.forEach(object -> blobContainerClient.getBlobClient(object).delete());
+        } catch (Exception e) {
+            log.error("Cannot delete objects {} from bucket {}. Reason: {}", objects, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot delete objects %s from bucket %s. Reason: %s", objects, bucket, e.getMessage()));
+        }
+    }
+
+    private BucketDTO toBucketDTO(String bucket, BlobItem blob) {
+        return BucketDTO.builder()
+                .bucket(bucket)
+                .object(blob.getName())
+                .size(String.valueOf(blob.getProperties().getContentLength()))
+                .lastModifiedDate(blob.getProperties().getLastModified().toEpochSecond())
+                .build();
+    }
+
+    private AzureAuthFile getAzureAuthFile(ProvisioningServiceApplicationConfiguration configuration) throws Exception {
+        final String authFile = configuration.getCloudConfiguration().getAzureAuthFile();
+        Path path = Paths.get(authFile);
+        if (path.toFile().exists()) {
+            try {
+                return new ObjectMapper().readValue(path.toFile(), AzureAuthFile.class);
+            } catch (IOException e) {
+                log.error("Cannot parse azure auth file {}", authFile, e);
+                throw new IOException("Cannot parse azure auth file " + authFile);
+            } catch (Exception e) {
+                log.error("Something went wrong while parsing azure auth file {}", authFile, e);
+                throw new Exception("Something went wrong while parsing azure auth file " + authFile);
+            }
+        } else {
+            throw new FileNotFoundException("Cannot find azure auth file for path" + authFile);
+        }
+    }
+
+    private BlobServiceClient getBlobServiceClient(String storageAccount) {
+        final String endpoint = String.format("https://%s.blob.core.windows.net", storageAccount);
+        return new BlobServiceClientBuilder()
+                .endpoint(endpoint)
+                .credential(new ClientSecretCredentialBuilder()
+                        .clientId(azureAuthFile.getClientId())
+                        .clientSecret(azureAuthFile.getClientSecret())
+                        .tenantId(azureAuthFile.getTenantId())
+                        .build())
+                .buildClient();
+    }
+
+    private AzureStorageAccount getAzureStorageAccount(String bucket) {
+        String[] a = bucket.split("\\.");
+        return new AzureStorageAccount(a[0], a[1]);
+    }
+
+    @Getter
+    @AllArgsConstructor
+    private static class AzureStorageAccount {
+        private final String storageAccount;
+        private final String container;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
new file mode 100644
index 0000000..65e9fe6
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl.gcp;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.BucketService;
+import com.epam.datalab.dto.bucket.BucketDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.cloud.storage.Blob;
+import com.google.cloud.storage.BlobId;
+import com.google.cloud.storage.BlobInfo;
+import com.google.cloud.storage.Bucket;
+import com.google.cloud.storage.Storage;
+import com.google.cloud.storage.StorageOptions;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+@Slf4j
+public class BucketServiceGcpImpl implements BucketService {
+
+    @Override
+    public List<BucketDTO> getObjects(String bucket) {
+        try {
+            Storage storage = StorageOptions.getDefaultInstance().getService();
+            Bucket gcpBucket = storage.get(bucket);
+            return StreamSupport.stream(gcpBucket.list().getValues().spliterator(), false)
+                    .map(this::toBucketDTO)
+                    .collect(Collectors.toList());
+        } catch (Exception e) {
+            log.error("Cannot retrieve objects from bucket {}. Reason: {}", bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot retrieve objects from bucket %s. Reason: %s", bucket, e.getMessage()));
+        }
+    }
+
+    @Override
+    public void uploadObject(String bucket, String object, InputStream stream, String contentType, long fileSize) {
+        log.info("Uploading file {} to bucket {}", object, bucket);
+        try {
+            Storage storage = StorageOptions.getDefaultInstance().getService();
+            BlobId blobId = BlobId.of(bucket, object);
+            BlobInfo blobInfo = BlobInfo.newBuilder(blobId)
+                    .setContentType(contentType)
+                    .build();
+            storage.create(blobInfo, stream);
+        } catch (Exception e) {
+            log.error("Cannot upload object {} to bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot upload object %s to bucket %s. Reason: %s", object, bucket, e.getMessage()));
+        }
+        log.info("Finished uploading file {} to bucket {}", object, bucket);
+    }
+
+    @Override
+    public void uploadFolder(UserInfo userInfo, String bucket, String folder) {
+        log.info("Uploading file {} to bucket {}", folder, bucket);
+        try {
+            Storage storage = StorageOptions.getDefaultInstance().getService();
+            BlobId blobId = BlobId.of(bucket, folder);
+            BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build();
+            storage.create(blobInfo);
+        } catch (Exception e) {
+            log.error("Cannot upload folder {} to bucket {}. Reason: {}", folder, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot upload folder %s to bucket %s. Reason: %s", folder, bucket, e.getMessage()));
+        }
+        log.info("Finished uploading folder {} to bucket {}", folder, bucket);
+    }
+
+    @Override
+    public void downloadObject(String bucket, String object, HttpServletResponse resp) {
+        log.info("Downloading file {} from bucket {}", object, bucket);
+        try (ServletOutputStream outputStream = resp.getOutputStream()) {
+            Storage storage = StorageOptions.getDefaultInstance().getService();
+            Blob blob = storage.get(BlobId.of(bucket, object));
+            blob.downloadTo(outputStream);
+            log.info("Finished downloading file {} from bucket {}", object, bucket);
+        } catch (Exception e) {
+            log.error("Cannot download object {} from bucket {}. Reason: {}", object, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot download object %s from bucket %s. Reason: %s", object, bucket, e.getMessage()));
+        }
+        log.info("Finished downloading file {} from bucket {}", object, bucket);
+    }
+
+    @Override
+    public void deleteObjects(String bucket, List<String> objects) {
+        try {
+            Storage storage = StorageOptions.getDefaultInstance().getService();
+            List<BlobId> blobIds = objects
+                    .stream()
+                    .map(o -> BlobId.of(bucket, o))
+                    .collect(Collectors.toList());
+            storage.delete(blobIds);
+        } catch (Exception e) {
+            log.error("Cannot delete objects {} from bucket {}. Reason: {}", objects, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot delete objects %s from bucket %s. Reason: %s", objects, bucket, e.getMessage()));
+        }
+    }
+
+    private BucketDTO toBucketDTO(BlobInfo blobInfo) {
+        return BucketDTO.builder()
+                .bucket(blobInfo.getBucket())
+                .object(blobInfo.getName())
+                .size(String.valueOf(blobInfo.getSize()))
+                .lastModifiedDate(blobInfo.getUpdateTime())
+                .build();
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/validation/ProvisioningServiceCloudConfigurationSequenceProvider.java b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/validation/ProvisioningServiceCloudConfigurationSequenceProvider.java
new file mode 100644
index 0000000..435c5b4
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/backendapi/validation/ProvisioningServiceCloudConfigurationSequenceProvider.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.validation;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.validation.CloudConfigurationSequenceProvider;
+
+public class ProvisioningServiceCloudConfigurationSequenceProvider
+        extends CloudConfigurationSequenceProvider<ProvisioningServiceApplicationConfiguration> {
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/process/ProcessConveyor.java b/services/provisioning-service/src/main/java/com/epam/datalab/process/ProcessConveyor.java
new file mode 100644
index 0000000..0d741f4
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/process/ProcessConveyor.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.process;
+
+import com.aegisql.conveyor.AssemblingConveyor;
+import com.aegisql.conveyor.BuildingSite;
+import com.aegisql.conveyor.cart.Cart;
+import com.aegisql.conveyor.cart.FutureCart;
+import com.epam.datalab.process.model.ProcessId;
+import com.epam.datalab.process.model.ProcessInfo;
+import com.epam.datalab.process.model.ProcessStep;
+
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+
+public class ProcessConveyor extends AssemblingConveyor<ProcessId, ProcessStep, ProcessInfo> {
+
+    public ProcessConveyor() {
+        super();
+        this.setName("ProcessConveyor");
+        this.setIdleHeartBeat(1, TimeUnit.SECONDS);
+        this.enablePostponeExpiration(true);
+        this.enablePostponeExpirationOnTimeout(true);
+        this.setDefaultCartConsumer((l, v, b) -> {
+            LOG.warn("default processor for {} {} {}", l, v, b.get());
+            if (v instanceof FutureCart) {
+                @SuppressWarnings("rawtypes")
+                FutureCart fc = (FutureCart) v;
+                fc.get().cancel(true);
+            }
+        });
+        this.setResultConsumer(bin -> LOG.debug("process finished: {}", bin));
+    }
+
+    public Supplier<? extends ProcessInfo> getInfoSupplier(ProcessId id) {
+        BuildingSite<ProcessId, ProcessStep, Cart<ProcessId, ?, ProcessStep>, ? extends ProcessInfo> bs = this.collector.get(id);
+        if (bs == null) {
+            return () -> null;
+        } else {
+            return bs.getProductSupplier();
+        }
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/process/builder/ProcessInfoBuilder.java b/services/provisioning-service/src/main/java/com/epam/datalab/process/builder/ProcessInfoBuilder.java
new file mode 100644
index 0000000..fb27f5b
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/process/builder/ProcessInfoBuilder.java
@@ -0,0 +1,289 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.process.builder;
+
+import com.aegisql.conveyor.Expireable;
+import com.aegisql.conveyor.Testing;
+import com.aegisql.conveyor.TimeoutAction;
+import com.epam.datalab.process.model.DatalabProcess;
+import com.epam.datalab.process.model.ProcessId;
+import com.epam.datalab.process.model.ProcessInfo;
+import com.epam.datalab.process.model.ProcessStatus;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.Field;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import static com.epam.datalab.process.model.ProcessStatus.CREATED;
+import static com.epam.datalab.process.model.ProcessStatus.FAILED;
+import static com.epam.datalab.process.model.ProcessStatus.FINISHED;
+import static com.epam.datalab.process.model.ProcessStatus.KILLED;
+import static com.epam.datalab.process.model.ProcessStatus.LAUNCHING;
+import static com.epam.datalab.process.model.ProcessStatus.REJECTED;
+import static com.epam.datalab.process.model.ProcessStatus.RUNNING;
+import static com.epam.datalab.process.model.ProcessStatus.SCHEDULED;
+import static com.epam.datalab.process.model.ProcessStatus.STOPPED;
+import static com.epam.datalab.process.model.ProcessStatus.TIMEOUT;
+
+@Slf4j
+public class ProcessInfoBuilder implements Supplier<ProcessInfo>, Testing, TimeoutAction, Expireable {
+
+    private static Function<Process, Integer> pidSupplier = null;
+    private final ProcessId processId;
+    private final long startTimeStamp = System.currentTimeMillis();
+    private final StringBuilder stdOut = new StringBuilder();
+    private final StringBuilder stdErr = new StringBuilder();
+    private ProcessStatus status = CREATED;
+    private int exitCode = -1;
+    private String[] command = new String[]{"N/A"};
+    private Collection<ProcessInfo> rejected = null;
+    private int pid = -1;
+    private boolean finished = false;
+    private boolean stdOutClosed = false;
+    private boolean stdErrClosed = false;
+    private Process p = null;
+    private CompletableFuture<ProcessInfo> future;
+    private long expirationTime;
+
+    public ProcessInfoBuilder(ProcessId processId, long ttl) {
+        this.processId = processId;
+        this.expirationTime = System.currentTimeMillis() + ttl;
+    }
+
+    public static void schedule(ProcessInfoBuilder b, String[] command) {
+        b.status = SCHEDULED;
+        b.command = command;
+    }
+
+    public static void start(ProcessInfoBuilder b, String[] command) {
+        if (b.status == CREATED) {
+            b.status = LAUNCHING;
+            b.command = command;
+            b.launch();
+        } else {
+            if (b.rejected == null) {
+                b.rejected = new LinkedList<>();
+            }
+            long timeStamp = System.currentTimeMillis();
+            b.rejected.add(new ProcessInfo(
+                    b.processId,
+                    REJECTED,
+                    command,
+                    "",
+                    "rejected duplicated command",
+                    REJECTED.ordinal(),
+                    timeStamp,
+                    timeStamp, null, b.pid));
+        }
+    }
+
+    public static void failed(ProcessInfoBuilder b, Object dummy) {
+        b.status = FAILED;
+        b.setReady();
+    }
+
+    public static void stop(ProcessInfoBuilder b, Object dummy) {
+        if (b.p != null) {
+            b.p.destroy();
+        }
+        if (b.status != LAUNCHING && b.status != RUNNING) {
+            b.setReady();
+        }
+        b.status = STOPPED;
+    }
+
+    public static void kill(ProcessInfoBuilder b, Object dummy) {
+        if (b.p != null) {
+            b.p.destroyForcibly();
+        }
+        if (b.status != LAUNCHING && b.status != RUNNING) {
+            b.setReady();
+        }
+        b.status = KILLED;
+    }
+
+    public static void finish(ProcessInfoBuilder b, Integer exitCode) {
+        if (b.status != STOPPED && b.status != KILLED && b.status != TIMEOUT) {
+            b.status = FINISHED;
+        }
+        b.exitCode = exitCode;
+        b.finished = true;
+    }
+
+    public static void stdOut(ProcessInfoBuilder b, Object msg) {
+        if (msg == null) {
+            b.stdOutClosed = true;
+        } else {
+            b.stdOut.append(msg).append("\n");
+        }
+    }
+
+    public static void stdErr(ProcessInfoBuilder b, Object msg) {
+        if (msg == null) {
+            b.stdErrClosed = true;
+        } else {
+            b.stdErr.append(msg).append("\n");
+        }
+    }
+
+    public static void future(ProcessInfoBuilder b, CompletableFuture<ProcessInfo> future) {
+        if (b.future == null) {
+            b.future = future;
+        } else {
+            future.cancel(true);
+        }
+    }
+
+    public static int getPid(Process process) {
+        try {
+            if (pidSupplier == null) {
+                Class<?> cProcessImpl = process.getClass();
+                final Field fPid = cProcessImpl.getDeclaredField("pid");
+                log.debug("PID field found");
+                if (!fPid.isAccessible()) {
+                    fPid.setAccessible(true);
+                }
+                pidSupplier = p -> {
+                    try {
+                        return fPid.getInt(p);
+                    } catch (IllegalAccessException e) {
+                        log.error("Unable to access PID. {}", e.getMessage(), e);
+                        return -1;
+                    }
+                };
+            }
+            return pidSupplier.apply(process);
+        } catch (NoSuchFieldException e) {
+            log.debug("PID field not found", e);
+            pidSupplier = p -> -1;
+            return -1;
+        }
+    }
+
+    private void launch() {
+        DatalabProcess.getInstance().getUsersExecutorService(processId.getUser()).submit(() -> {
+            status = SCHEDULED;
+            DatalabProcess.getInstance().getExecutorService().execute(() -> {
+                try {
+                    p = new ProcessBuilder(command).start();
+                    pid = getPid(p);
+                    InputStream stdOutStream = p.getInputStream();
+                    DatalabProcess.getInstance().getExecutorService().execute(() -> print(stdOutStream));
+                    InputStream stdErrStream = p.getErrorStream();
+                    DatalabProcess.getInstance().getExecutorService().execute(() -> printError(stdErrStream));
+                    status = RUNNING;
+                    int exit = p.waitFor();
+                    DatalabProcess.getInstance().finish(processId, exit);
+                } catch (IOException e) {
+                    DatalabProcess.getInstance().toStdErr(processId, "Command launch failed. " + get().getCommand(), e);
+                    DatalabProcess.getInstance().failed(processId);
+                } catch (InterruptedException e) {
+                    DatalabProcess.getInstance().toStdErr(processId, "Command interrupted. " + get().getCommand(), e);
+                    DatalabProcess.getInstance().failed(processId);
+                    Thread.currentThread().interrupt();
+                }
+            });
+            try {
+                future.get();
+            } catch (Exception e) {
+                log.error("Exception occurred during getting future result: {}", e.getMessage(), e);
+            }
+        });
+    }
+
+    private void printError(InputStream stdErrStream) {
+        BufferedReader reader = new BufferedReader(new InputStreamReader(stdErrStream));
+        String line;
+        try {
+            while ((line = reader.readLine()) != null) {
+                DatalabProcess.getInstance().toStdErr(processId, line);
+            }
+            DatalabProcess.getInstance().toStdErr(processId, null);
+        } catch (IOException e) {
+            DatalabProcess.getInstance().toStdErr(processId, "Failed process STDERR reader", e);
+            DatalabProcess.getInstance().failed(processId);
+        }
+    }
+
+    private void print(InputStream stdOutStream) {
+        BufferedReader reader = new BufferedReader(new InputStreamReader(stdOutStream));
+        String line;
+        try {
+            while ((line = reader.readLine()) != null) {
+                DatalabProcess.getInstance().toStdOut(processId, line);
+            }
+            DatalabProcess.getInstance().toStdOut(processId, null);
+        } catch (IOException e) {
+            DatalabProcess.getInstance().toStdErr(processId, "Failed process STDOUT reader", e);
+            DatalabProcess.getInstance().failed(processId);
+        }
+    }
+
+    @Override
+    public ProcessInfo get() {
+        return new ProcessInfo(
+                processId,
+                status,
+                command,
+                stdOut.toString(),
+                stdErr.toString(),
+                exitCode,
+                startTimeStamp, System.currentTimeMillis(), rejected, pid);
+    }
+
+    @Override
+    public boolean test() {
+        return finished && stdOutClosed && stdErrClosed;
+    }
+
+    private void setReady() {
+        finished = true;
+        stdOutClosed = true;
+        stdErrClosed = true;
+    }
+
+    @Override
+    public void onTimeout() {
+        if (status != TIMEOUT) {
+            log.debug("Stopping on timeout ...");
+            stop(this, "STOP");
+            status = TIMEOUT;
+            expirationTime += 60_000;
+        } else {
+            log.debug("Killing on timeout ...");
+            kill(this, "KILL");
+            status = TIMEOUT;
+            setReady();
+        }
+    }
+
+    @Override
+    public long getExpirationTime() {
+        return expirationTime;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/process/exception/DatalabProcessException.java b/services/provisioning-service/src/main/java/com/epam/datalab/process/exception/DatalabProcessException.java
new file mode 100644
index 0000000..572e976
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/process/exception/DatalabProcessException.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.process.exception;
+
+public class DatalabProcessException extends RuntimeException {
+    private static final long serialVersionUID = 1L;
+
+    public DatalabProcessException() {
+    }
+
+    public DatalabProcessException(String message) {
+        super(message);
+    }
+
+    public DatalabProcessException(String message, Exception cause) {
+        super(message, cause);
+    }
+
+    public DatalabProcessException(Exception cause) {
+        super(cause);
+    }
+
+    public DatalabProcessException(String message, Exception cause, boolean enableSuppression, boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/process/model/DatalabProcess.java b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/DatalabProcess.java
new file mode 100644
index 0000000..9722ab6
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/DatalabProcess.java
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.process.model;
+
+import com.epam.datalab.process.ProcessConveyor;
+import com.epam.datalab.process.builder.ProcessInfoBuilder;
+import com.epam.datalab.util.SecurityUtils;
+import io.dropwizard.util.Duration;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class DatalabProcess {
+
+    private final static DatalabProcess INSTANCE = new DatalabProcess();
+    private final ProcessConveyor processConveyor;
+    private ExecutorService executorService = Executors.newFixedThreadPool(50 * 3);
+    private Map<String, ExecutorService> perUserService = new ConcurrentHashMap<>();
+    private int userMaxparallelism = 5;
+    private long expirationTime = TimeUnit.HOURS.toMillis(3);
+
+    private DatalabProcess() {
+        this.processConveyor = new ProcessConveyor();
+    }
+
+    public static DatalabProcess getInstance() {
+        return INSTANCE;
+    }
+
+    public ExecutorService getExecutorService() {
+        return executorService;
+    }
+
+    public void setMaxProcessesPerBox(int parallelism) {
+        this.executorService.shutdown();
+        this.executorService = Executors.newFixedThreadPool(3 * parallelism);
+    }
+
+    public void setMaxProcessesPerUser(int parallelism) {
+        this.userMaxparallelism = parallelism;
+        this.perUserService.forEach((k, e) -> e.shutdown());
+        this.perUserService = new ConcurrentHashMap<>();
+    }
+
+    public ExecutorService getUsersExecutorService(String user) {
+        perUserService.putIfAbsent(user, Executors.newFixedThreadPool(userMaxparallelism));
+        return perUserService.get(user);
+    }
+
+    public CompletableFuture<ProcessInfo> start(ProcessId id, String... command) {
+        log.debug("Run OS command for user {} with UUID {}: {}", id.getUser(), id.getCommand(),
+                SecurityUtils.hideCreds(command));
+        CompletableFuture<ProcessInfo> future = processConveyor.createBuildFuture(id, () -> new ProcessInfoBuilder(id,
+                expirationTime));
+        processConveyor.add(id, future, ProcessStep.FUTURE);
+        processConveyor.add(id, command, ProcessStep.START);
+        return future;
+    }
+
+    public CompletableFuture<ProcessInfo> start(String username, String uniqDescriptor, String... command) {
+        return start(new ProcessId(username, uniqDescriptor), command);
+    }
+
+    public CompletableFuture<ProcessInfo> start(String username, String... command) {
+        return start(new ProcessId(username, String.join(" ", command)), command);
+    }
+
+
+    public CompletableFuture<Boolean> stop(ProcessId id) {
+        return processConveyor.add(id, "STOP", ProcessStep.STOP);
+    }
+
+    public CompletableFuture<Boolean> stop(String username, String command) {
+        return stop(new ProcessId(username, command));
+    }
+
+    public CompletableFuture<Boolean> kill(ProcessId id) {
+        return processConveyor.add(id, "KILL", ProcessStep.KILL);
+    }
+
+    public CompletableFuture<Boolean> kill(String username, String command) {
+        return kill(new ProcessId(username, command));
+    }
+
+    public CompletableFuture<Boolean> failed(ProcessId id) {
+        return processConveyor.add(id, "FAILED", ProcessStep.FAILED);
+    }
+
+    public CompletableFuture<Boolean> finish(ProcessId id, Integer exitStatus) {
+        return processConveyor.add(id, exitStatus, ProcessStep.FINISH);
+    }
+
+    public CompletableFuture<Boolean> toStdOut(ProcessId id, String msg) {
+        return processConveyor.add(id, msg, ProcessStep.STD_OUT);
+    }
+
+    public CompletableFuture<Boolean> toStdErr(ProcessId id, String msg) {
+        return processConveyor.add(id, msg, ProcessStep.STD_ERR);
+    }
+
+    public CompletableFuture<Boolean> toStdErr(ProcessId id, String msg, Exception err) {
+        StringWriter sw = new StringWriter();
+        sw.append(msg);
+        sw.append("\n");
+        PrintWriter pw = new PrintWriter(sw);
+        err.printStackTrace(pw);
+        return processConveyor.add(id, sw.toString(), ProcessStep.STD_ERR);
+    }
+
+    public Collection<ProcessId> getActiveProcesses() {
+        Collection<ProcessId> pList = new ArrayList<>();
+        processConveyor.forEachKeyAndBuilder((k, b) -> pList.add(k));
+        return pList;
+    }
+
+    public Collection<ProcessId> getActiveProcesses(String username) {
+        return getActiveProcesses()
+                .stream()
+                .filter(id -> id.getUser().equals(username))
+                .collect(Collectors.toList());
+    }
+
+    public Supplier<? extends ProcessInfo> getProcessInfoSupplier(ProcessId id) {
+        return processConveyor.getInfoSupplier(id);
+    }
+
+    public Supplier<? extends ProcessInfo> getProcessInfoSupplier(String username, String command) {
+        return getProcessInfoSupplier(new ProcessId(username, command));
+    }
+
+    public void setProcessTimeout(long time, TimeUnit unit) {
+        this.expirationTime = unit.toMillis(time);
+    }
+
+    public void setProcessTimeout(Duration duration) {
+        this.expirationTime = duration.toMilliseconds();
+    }
+
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessId.java b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessId.java
new file mode 100644
index 0000000..2aaf90d
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessId.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.process.model;
+
+public class ProcessId {
+
+    private final String user;
+    private final String command;
+
+    public ProcessId(String user, String command) {
+        this.user = user;
+        this.command = command;
+    }
+
+    public String getCommand() {
+        return command;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        ProcessId processId = (ProcessId) o;
+
+        if (user != null ? !user.equals(processId.user) : processId.user != null) {
+            return false;
+        }
+        return command != null ? command.equals(processId.command) : processId.command == null;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = user != null ? user.hashCode() : 0;
+        result = 31 * result + (command != null ? command.hashCode() : 0);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "ProcessId{" +
+                "user='" + user + '\'' +
+                ", command='" + command + '\'' +
+                '}';
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessInfo.java b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessInfo.java
new file mode 100644
index 0000000..624ed8e
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessInfo.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.process.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+public class ProcessInfo {
+
+    private final ProcessId id;
+    private final String[] command;
+    private final ProcessStatus status;
+    private final String stdOut;
+    private final String stdErr;
+    private final int exitCode;
+    private final long startTimeStamp;
+    private final long infoTimeStamp;
+    private final int pid;
+
+    private final Collection<ProcessInfo> rejectedCommands;
+
+    public ProcessInfo(ProcessId id, ProcessStatus status, String[] command, String stdOut, String stdErr, int exitCode,
+                       long startTimeStamp, long infoTimeStamp, Collection<ProcessInfo> rejected, int pid) {
+        this.id = id;
+        this.status = status;
+        this.command = command;
+        this.stdOut = stdOut;
+        this.stdErr = stdErr;
+        this.exitCode = exitCode;
+        this.startTimeStamp = startTimeStamp;
+        this.infoTimeStamp = infoTimeStamp;
+        this.pid = pid;
+
+        if (rejected != null && rejected.size() > 0) {
+            Collection<ProcessInfo> r = new ArrayList<>();
+            for (ProcessInfo info : rejected) {
+                if (info != null) {
+                    r.add(info);
+                }
+            }
+            this.rejectedCommands = Collections.unmodifiableCollection(r);
+        } else {
+            this.rejectedCommands = null;
+        }
+
+    }
+
+    public String getCommand() {
+        return String.join(" ", command);
+    }
+
+    public ProcessStatus getStatus() {
+        return status;
+    }
+
+    public String getStdOut() {
+        return stdOut;
+    }
+
+    public String getStdErr() {
+        return stdErr;
+    }
+
+    public int getExitCode() {
+        return exitCode;
+    }
+
+    public long getStartTimeStamp() {
+        return startTimeStamp;
+    }
+
+    public long getInfoTimeStamp() {
+        return infoTimeStamp;
+    }
+
+    public ProcessId getId() {
+        return id;
+    }
+
+    public int getPid() {
+        return pid;
+    }
+
+    public Collection<ProcessInfo> getRejectedCommands() {
+        return Collections.unmodifiableCollection(rejectedCommands);
+    }
+
+    @Override
+    public String toString() {
+        return "ProcessInfo{" +
+                "id='" + id + '\'' +
+                ", command='" + getCommand() + '\'' +
+                ", pid=" + pid +
+                ", status=" + status +
+                ", stdOut='" + stdOut + '\'' +
+                ", stdErr='" + stdErr + '\'' +
+                ", exitCode=" + exitCode +
+                ", startTimeStamp=" + startTimeStamp +
+                ", infoTimeStamp=" + infoTimeStamp +
+                ", rejectedCommands=" + rejectedCommands +
+                '}';
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessStatus.java b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessStatus.java
new file mode 100644
index 0000000..dee1b6b
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessStatus.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.process.model;
+
+public enum ProcessStatus {
+    CREATED,
+    LAUNCHING,
+    RUNNING,
+    STOPPED,
+    KILLED,
+    TIMEOUT,
+    FINISHED,
+    REJECTED,
+    FAILED,
+    SCHEDULED
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessStep.java b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessStep.java
new file mode 100644
index 0000000..fa9111c
--- /dev/null
+++ b/services/provisioning-service/src/main/java/com/epam/datalab/process/model/ProcessStep.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.process.model;
+
+import com.aegisql.conveyor.SmartLabel;
+import com.epam.datalab.process.builder.ProcessInfoBuilder;
+
+import java.util.function.BiConsumer;
+
+public enum ProcessStep implements SmartLabel<ProcessInfoBuilder> {
+    START(ProcessInfoBuilder::start),
+    STOP(ProcessInfoBuilder::stop),
+    KILL(ProcessInfoBuilder::kill),
+    FINISH(ProcessInfoBuilder::finish),
+    STD_OUT(ProcessInfoBuilder::stdOut),
+    STD_ERR(ProcessInfoBuilder::stdErr),
+    FAILED(ProcessInfoBuilder::failed),
+    FUTURE(ProcessInfoBuilder::future),
+    ;
+    private BiConsumer<ProcessInfoBuilder, Object> consumer;
+
+    @SuppressWarnings("unchecked")
+    <T> ProcessStep(BiConsumer<ProcessInfoBuilder, T> consumer) {
+        this.consumer = (BiConsumer<ProcessInfoBuilder, Object>) consumer;
+    }
+
+    @Override
+    public BiConsumer<ProcessInfoBuilder, Object> get() {
+        return consumer;
+    }
+}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/CloudConfiguration.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/CloudConfiguration.java
deleted file mode 100644
index 9d61210..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/CloudConfiguration.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-@Data
-public class CloudConfiguration {
-
-	private final String os;
-	private final String serviceBaseName;
-	private final String edgeInstanceSize;
-	private final String subnetId;
-	private final String region;
-	private final String zone;
-	private final String confTagResourceId;
-	private final String securityGroupIds;
-	private final String ssnInstanceSize;
-	private final String notebookVpcId;
-	private final String notebookSubnetId;
-	private final String confKeyDir;
-	private final String vpcId;
-	private final String azureResourceGroupName;
-	private final String ssnStorageAccountTagName;
-	private final String sharedStorageAccountTagName;
-	private final String datalakeTagName;
-	private final String azureAuthFile;
-	private final String azureClientId;
-	private final String peeringId;
-	private final String gcpProjectId;
-	private final boolean imageEnabled;
-	@JsonProperty("ldap")
-	private final LdapConfig ldapConfig;
-	private final StepCerts stepCerts;
-	private final Keycloak keycloak;
-
-	@Data
-	public static class LdapConfig {
-		private final String host;
-		private final String dn;
-		private final String ou;
-		private final String user;
-		private final String password;
-	}
-
-	@Data
-	public static class StepCerts {
-		private final boolean enabled;
-		private final String rootCA;
-		private final String kid;
-		private final String kidPassword;
-		private final String caURL;
-	}
-
-	@Data
-	public static class Keycloak {
-		@JsonProperty("auth_server_url")
-		private final String authServerUrl;
-		@JsonProperty("realm_name")
-		private final String realmName;
-		private final String user;
-		@JsonProperty("user_password")
-		private final String userPassword;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/DropwizardBearerTokenFilterImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/DropwizardBearerTokenFilterImpl.java
deleted file mode 100644
index fc2659c..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/DropwizardBearerTokenFilterImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi;
-
-import org.keycloak.adapters.AdapterDeploymentContext;
-import org.keycloak.adapters.KeycloakDeployment;
-import org.keycloak.adapters.NodesRegistrationManagement;
-import org.keycloak.jaxrs.JaxrsBearerTokenFilterImpl;
-
-import javax.annotation.Priority;
-import javax.ws.rs.Priorities;
-import javax.ws.rs.container.PreMatching;
-
-@PreMatching
-@Priority(Priorities.AUTHENTICATION)
-public class DropwizardBearerTokenFilterImpl extends JaxrsBearerTokenFilterImpl {
-
-	public DropwizardBearerTokenFilterImpl(KeycloakDeployment keycloakDeployment) {
-		deploymentContext = new AdapterDeploymentContext(keycloakDeployment);
-		nodesRegistrationManagement = new NodesRegistrationManagement();
-	}
-}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplication.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplication.java
deleted file mode 100644
index 6f1047b..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplication.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.DirectoriesCreator;
-import com.epam.dlab.backendapi.core.DockerWarmuper;
-import com.epam.dlab.backendapi.core.response.handlers.ComputationalConfigure;
-import com.epam.dlab.backendapi.modules.CloudModuleConfigurator;
-import com.epam.dlab.backendapi.modules.ModuleFactory;
-import com.epam.dlab.backendapi.resources.*;
-import com.epam.dlab.backendapi.resources.base.KeyResource;
-import com.epam.dlab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
-import com.epam.dlab.cloud.CloudModule;
-import com.epam.dlab.process.model.DlabProcess;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.mappers.JsonProcessingExceptionMapper;
-import com.epam.dlab.rest.mappers.RuntimeExceptionMapper;
-import com.epam.dlab.util.ServiceUtils;
-import com.fasterxml.jackson.databind.InjectableValues;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import de.ahus1.keycloak.dropwizard.AbstractKeycloakAuthenticator;
-import de.ahus1.keycloak.dropwizard.KeycloakBundle;
-import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
-import de.thomaskrille.dropwizard_template_config.TemplateConfigBundle;
-import de.thomaskrille.dropwizard_template_config.TemplateConfigBundleConfiguration;
-import io.dropwizard.Application;
-import io.dropwizard.auth.Authenticator;
-import io.dropwizard.auth.Authorizer;
-import io.dropwizard.jersey.setup.JerseyEnvironment;
-import io.dropwizard.setup.Bootstrap;
-import io.dropwizard.setup.Environment;
-import org.keycloak.KeycloakSecurityContext;
-
-import javax.servlet.http.HttpServletRequest;
-import java.security.Principal;
-
-public class ProvisioningServiceApplication extends Application<ProvisioningServiceApplicationConfiguration> {
-
-	public static void main(String[] args) throws Exception {
-		if (ServiceUtils.printAppVersion(ProvisioningServiceApplication.class, args)) {
-			return;
-		}
-		new ProvisioningServiceApplication().run(args);
-	}
-
-	@Override
-	public void initialize(Bootstrap<ProvisioningServiceApplicationConfiguration> bootstrap) {
-		bootstrap.addBundle(new TemplateConfigBundle(
-				new TemplateConfigBundleConfiguration().fileIncludePath(ServiceUtils.getConfPath())
-		));
-		bootstrap.addBundle(new KeycloakBundle<ProvisioningServiceApplicationConfiguration>() {
-			@Override
-			protected KeycloakConfiguration getKeycloakConfiguration(ProvisioningServiceApplicationConfiguration configuration) {
-				return configuration.getKeycloakConfiguration();
-			}
-
-			@Override
-			protected Class<? extends Principal> getUserClass() {
-				return UserInfo.class;
-			}
-
-			@Override
-			protected Authorizer createAuthorizer() {
-				return (Authorizer<UserInfo>) (principal, role) -> principal.getRoles().contains(role);
-			}
-
-			@Override
-			protected Authenticator createAuthenticator(KeycloakConfiguration configuration) {
-				class KeycloakAuthenticator extends AbstractKeycloakAuthenticator<UserInfo> {
-
-					private KeycloakAuthenticator(KeycloakConfiguration keycloakConfiguration) {
-						super(keycloakConfiguration);
-					}
-
-					@Override
-					protected UserInfo prepareAuthentication(KeycloakSecurityContext keycloakSecurityContext,
-															 HttpServletRequest httpServletRequest,
-															 KeycloakConfiguration keycloakConfiguration) {
-						return new UserInfo(keycloakSecurityContext.getToken().getPreferredUsername(),
-								keycloakSecurityContext.getIdTokenString());
-					}
-				}
-				return new KeycloakAuthenticator(configuration);
-			}
-		});
-	}
-
-	@Override
-	public void run(ProvisioningServiceApplicationConfiguration configuration, Environment environment) {
-		DlabProcess.getInstance().setProcessTimeout(configuration.getProcessTimeout());
-		DlabProcess.getInstance().setMaxProcessesPerBox(configuration.getProcessMaxThreadsPerJvm());
-		DlabProcess.getInstance().setMaxProcessesPerUser(configuration.getProcessMaxThreadsPerUser());
-
-		CloudModule cloudModule = CloudModuleConfigurator.getCloudModule(configuration);
-		Injector injector = Guice.createInjector(ModuleFactory.getModule(configuration, environment), cloudModule);
-		cloudModule.init(environment, injector);
-
-
-		final ObjectMapper mapper = injector.getInstance(ObjectMapper.class);
-		final InjectableValues.Std injectableValues = new InjectableValues.Std();
-		injectableValues.addValue(RESTService.class, injector.getInstance(RESTService.class));
-		injectableValues.addValue(ComputationalConfigure.class, injector.getInstance(ComputationalConfigure.class));
-		mapper.setInjectableValues(injectableValues);
-
-		environment.lifecycle().manage(injector.getInstance(DirectoriesCreator.class));
-		if (configuration.isHandlersPersistenceEnabled()) {
-			environment.lifecycle().manage(injector.getInstance(RestoreCallbackHandlerServiceImpl.class));
-		}
-		environment.lifecycle().manage(injector.getInstance(DockerWarmuper.class));
-
-
-		JerseyEnvironment jersey = environment.jersey();
-		jersey.register(configuration.getCloudProvider());
-		jersey.register(new RuntimeExceptionMapper());
-		jersey.register(new JsonProcessingExceptionMapper());
-
-		jersey.register(injector.getInstance(DockerResource.class));
-		jersey.register(injector.getInstance(GitExploratoryResource.class));
-		jersey.register(injector.getInstance(LibraryResource.class));
-		jersey.register(injector.getInstance(InfrastructureResource.class));
-		jersey.register(injector.getInstance(ImageResource.class));
-		jersey.register(injector.getInstance(BackupResource.class));
-		jersey.register(injector.getInstance(KeyResource.class));
-		jersey.register(injector.getInstance(CallbackHandlerResource.class));
-		jersey.register(injector.getInstance(ProjectResource.class));
-		jersey.register(injector.getInstance(ProvisioningHealthCheckResource.class));
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplicationConfiguration.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplicationConfiguration.java
deleted file mode 100644
index 1025ad6..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/ProvisioningServiceApplicationConfiguration.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi;
-
-import com.epam.dlab.ServiceConfiguration;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.validation.ProvisioningServiceCloudConfigurationSequenceProvider;
-import com.epam.dlab.validation.AwsValidation;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
-import io.dropwizard.util.Duration;
-import org.hibernate.validator.constraints.NotEmpty;
-import org.hibernate.validator.group.GroupSequenceProvider;
-
-@GroupSequenceProvider(ProvisioningServiceCloudConfigurationSequenceProvider.class)
-public class ProvisioningServiceApplicationConfiguration extends ServiceConfiguration implements Directories {
-
-	@NotEmpty
-	@JsonProperty
-	private String keyDirectory;
-
-	@NotEmpty
-	@JsonProperty
-	private String responseDirectory;
-
-	@NotEmpty
-	@JsonProperty
-	private String dockerLogDirectory;
-
-	@NotEmpty
-	@JsonProperty
-	private String handlerDirectory;
-
-	@JsonProperty
-	private Duration warmupPollTimeout;
-
-	@JsonProperty
-	private Duration resourceStatusPollTimeout = Duration.minutes(3);
-
-	@JsonProperty
-	private Duration keyLoaderPollTimeout = Duration.minutes(2);
-
-	@JsonProperty
-	private Duration requestEnvStatusTimeout = Duration.seconds(30);
-
-	@NotEmpty
-	@JsonProperty
-	private String adminKey;
-
-	@NotEmpty
-	@JsonProperty
-	private String edgeImage;
-
-	@JsonProperty
-	private Duration fileLengthCheckDelay = Duration.seconds(3);
-
-	@NotEmpty(groups = AwsValidation.class)
-	@JsonProperty
-	private String emrEC2RoleDefault;
-
-	@NotEmpty(groups = AwsValidation.class)
-	@JsonProperty
-	private String emrServiceRoleDefault;
-
-	@JsonProperty
-	private int processMaxThreadsPerJvm = 50;
-
-	@JsonProperty
-	private int processMaxThreadsPerUser = 5;
-
-	@JsonProperty
-	private Duration processTimeout = Duration.hours(3);
-	@JsonProperty
-	private String backupScriptPath;
-	@JsonProperty
-	private String backupDirectory;
-	@JsonProperty
-	private boolean handlersPersistenceEnabled;
-
-	private KeycloakConfiguration keycloakConfiguration = new KeycloakConfiguration();
-
-	@JsonProperty("cloudProperties")
-	private CloudConfiguration cloudConfiguration;
-
-	public boolean isHandlersPersistenceEnabled() {
-		return handlersPersistenceEnabled;
-	}
-
-	public String getKeyDirectory() {
-		return keyDirectory;
-	}
-
-	public Duration getWarmupPollTimeout() {
-		return warmupPollTimeout;
-	}
-
-	public Duration getResourceStatusPollTimeout() {
-		return resourceStatusPollTimeout;
-	}
-
-	public Duration getKeyLoaderPollTimeout() {
-		return keyLoaderPollTimeout;
-	}
-
-	/**
-	 * Return the timeout for the check the status of environment resources.
-	 */
-	public Duration getRequestEnvStatusTimeout() {
-		return requestEnvStatusTimeout;
-	}
-
-	public String getAdminKey() {
-		return adminKey;
-	}
-
-	public String getEdgeImage() {
-		return edgeImage;
-	}
-
-	public Duration getFileLengthCheckDelay() {
-		return fileLengthCheckDelay;
-	}
-
-	public String getEmrEC2RoleDefault() {
-		return emrEC2RoleDefault;
-	}
-
-	public String getEmrServiceRoleDefault() {
-		return emrServiceRoleDefault;
-	}
-
-	public String getWarmupDirectory() {
-		return responseDirectory + WARMUP_DIRECTORY;
-	}
-
-	public String getImagesDirectory() {
-		return responseDirectory + IMAGES_DIRECTORY;
-	}
-
-	public String getKeyLoaderDirectory() {
-		return responseDirectory + KEY_LOADER_DIRECTORY;
-	}
-
-	public String getDockerLogDirectory() {
-		return dockerLogDirectory;
-	}
-
-	public int getProcessMaxThreadsPerJvm() {
-		return processMaxThreadsPerJvm;
-	}
-
-	public int getProcessMaxThreadsPerUser() {
-		return processMaxThreadsPerUser;
-	}
-
-	public Duration getProcessTimeout() {
-		return processTimeout;
-	}
-
-	public String getBackupScriptPath() {
-		return backupScriptPath;
-	}
-
-	public String getBackupDirectory() {
-		return backupDirectory;
-	}
-
-	public String getHandlerDirectory() {
-		return handlerDirectory;
-	}
-
-	public KeycloakConfiguration getKeycloakConfiguration() {
-		return keycloakConfiguration;
-	}
-
-	public CloudConfiguration getCloudConfiguration() {
-		return cloudConfiguration;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/Constants.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/Constants.java
deleted file mode 100644
index 1c31d5a..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/Constants.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core;
-
-public class Constants {
-
-    public static final String JSON_EXTENSION = ".json";
-    public static final String LOG_EXTENSION = ".log";
-
-    private Constants() {
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/Directories.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/Directories.java
deleted file mode 100644
index 1966f47..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/Directories.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core;
-
-public interface Directories {
-    String WARMUP_DIRECTORY = "/result";
-    String IMAGES_DIRECTORY = "/result";
-    String KEY_LOADER_DIRECTORY = "/result";
-    String EDGE_LOG_DIRECTORY = "edge";
-    String NOTEBOOK_LOG_DIRECTORY = "notebook";
-    String DATA_ENGINE_LOG_DIRECTORY = "dataengine";
-    String DATA_ENGINE_SERVICE_LOG_DIRECTORY = "dataengine-service";
-    String IMAGE_LOG_DIRECTORY = "image";
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/DirectoriesCreator.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/DirectoriesCreator.java
deleted file mode 100644
index e8a17a0..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/DirectoriesCreator.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import io.dropwizard.lifecycle.Managed;
-
-import java.io.File;
-
-@Singleton
-public class DirectoriesCreator implements Managed {
-	@Inject
-	private ProvisioningServiceApplicationConfiguration configuration;
-
-	@Override
-	public void start() throws Exception {
-		createDirectory(configuration.getWarmupDirectory());
-		createDirectory(configuration.getImagesDirectory());
-		createDirectory(configuration.getKeyLoaderDirectory());
-		createDirectory(configuration.getHandlerDirectory());
-	}
-
-	private boolean createDirectory(String directory) {
-		return new File(directory).mkdirs();
-	}
-
-	@Override
-	public void stop() throws Exception {
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/DockerWarmuper.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/DockerWarmuper.java
deleted file mode 100644
index 74cc4ad..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/DockerWarmuper.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
-import com.epam.dlab.dto.imagemetadata.ComputationalMetadataDTO;
-import com.epam.dlab.dto.imagemetadata.ExploratoryMetadataDTO;
-import com.epam.dlab.dto.imagemetadata.ImageMetadataDTO;
-import com.epam.dlab.dto.imagemetadata.ImageType;
-import com.epam.dlab.process.model.ProcessInfo;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import io.dropwizard.lifecycle.Managed;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
-
-
-@Singleton
-public class DockerWarmuper implements Managed, DockerCommands, MetadataHolder {
-	private static final Logger LOGGER = LoggerFactory.getLogger(DockerWarmuper.class);
-	public static final String EXPLORATORY_RESPONSE_MARKER = "exploratory_environment_shapes";
-
-	@Inject
-	private ProvisioningServiceApplicationConfiguration configuration;
-	@Inject
-	private FolderListenerExecutor folderListenerExecutor;
-	@Inject
-	private ICommandExecutor commandExecutor;
-	private Map<String, String> imageList = new ConcurrentHashMap<>();
-	private Set<ImageMetadataDTO> metadataDTOs = ConcurrentHashMap.newKeySet();
-
-
-	@Override
-	public void start() throws Exception {
-		LOGGER.debug("warming up docker");
-		final ProcessInfo processInfo = commandExecutor.executeSync("warmup", DockerCommands.generateUUID(),
-				GET_IMAGES);
-		List<String> images = Arrays.asList(processInfo.getStdOut().split("\n"));
-		for (String image : images) {
-			String uuid = UUID.randomUUID().toString();
-			LOGGER.debug("warming up image: {} with uid {}", image, uuid);
-			imageList.put(uuid, image);
-			folderListenerExecutor.start(configuration.getWarmupDirectory(),
-					configuration.getWarmupPollTimeout(),
-					getFileHandlerCallback(uuid));
-			String command = new RunDockerCommand()
-					.withVolumeForRootKeys(configuration.getKeyDirectory())
-					.withVolumeForResponse(configuration.getWarmupDirectory())
-					.withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
-					.withResource(getResourceType())
-					.withRequestId(uuid)
-					.withActionDescribe(image)
-					.toCMD();
-			commandExecutor.executeAsync("warmup", uuid, command);
-		}
-	}
-
-	public class DockerFileHandlerCallback implements FileHandlerCallback {
-		private final String uuid;
-
-		@JsonCreator
-		public DockerFileHandlerCallback(@JsonProperty("uuid") String uuid) {
-			this.uuid = uuid;
-		}
-
-		@Override
-		public String getUUID() {
-			return uuid;
-		}
-
-		@Override
-		public boolean checkUUID(String uuid) {
-			return this.uuid.equals(uuid);
-		}
-
-		@Override
-		public boolean handle(String fileName, byte[] content) {
-			String uuid = DockerCommands.extractUUID(fileName);
-			try {
-				LOGGER.debug("processing response file {} with content {}", fileName, new String(content));
-				addMetadata(content, uuid);
-			} catch (IOException e) {
-				LOGGER.error("processing response file {} fails", fileName, e);
-				return false;
-			}
-			return true;
-		}
-
-		@Override
-		public void handleError(String errorMessage) {
-			LOGGER.warn("docker warmupper returned no result: {}", errorMessage);
-		}
-
-		@Override
-		public String getUser() {
-			return "DLAB";
-		}
-	}
-
-	public DockerFileHandlerCallback getFileHandlerCallback(String uuid) {
-		return new DockerFileHandlerCallback(uuid);
-	}
-
-	private void addMetadata(byte[] content, String uuid) throws IOException {
-		final JsonNode jsonNode = MAPPER.readTree(content);
-		ImageMetadataDTO metadata;
-		if (jsonNode.has(EXPLORATORY_RESPONSE_MARKER)) {
-			metadata = MAPPER.readValue(content, ExploratoryMetadataDTO.class);
-			metadata.setImageType(ImageType.EXPLORATORY);
-		} else {
-			metadata = MAPPER.readValue(content, ComputationalMetadataDTO.class);
-			metadata.setImageType(ImageType.COMPUTATIONAL);
-		}
-		String image = imageList.get(uuid);
-		metadata.setImage(image);
-		LOGGER.debug("caching metadata for image {}: {}", image, metadata);
-		metadataDTOs.add(metadata);
-	}
-
-	@Override
-	public void stop() throws Exception {
-		//do nothing
-	}
-
-	public Map<String, String> getUuids() {
-		return Collections.unmodifiableMap(imageList);
-	}
-
-	public Set<ImageMetadataDTO> getMetadata(ImageType type) {
-		return metadataDTOs.stream().filter(m -> m.getImageType().equals(type))
-				.collect(Collectors.toSet());
-	}
-
-	@Override
-	public String getResourceType() {
-		return Directories.NOTEBOOK_LOG_DIRECTORY;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/FileHandlerCallback.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/FileHandlerCallback.java
deleted file mode 100644
index 7e7df74..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/FileHandlerCallback.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "@class")
-public interface FileHandlerCallback {
-	String getUUID();
-
-	boolean checkUUID(String uuid);
-
-	boolean handle(String fileName, byte[] content) throws Exception;
-
-	void handleError(String errorMessage);
-
-	String getUser();
-
-	@JsonIgnore
-	default String getId() {
-		return this.getClass().getSimpleName() + "_" + getUUID();
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/MetadataHolder.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/MetadataHolder.java
deleted file mode 100644
index 7ad52d7..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/MetadataHolder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core;
-
-
-import com.epam.dlab.dto.imagemetadata.ImageMetadataDTO;
-import com.epam.dlab.dto.imagemetadata.ImageType;
-
-import java.util.Set;
-
-public interface MetadataHolder {
-    Set<ImageMetadataDTO> getMetadata(ImageType metadataType);
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CmdCommand.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CmdCommand.java
deleted file mode 100644
index d8fb126..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CmdCommand.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-public interface CmdCommand {
-    String toCMD();
-}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandBuilder.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandBuilder.java
deleted file mode 100644
index a212d0a..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandBuilder.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-import com.epam.dlab.backendapi.CloudConfiguration;
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.ResourceBaseDTO;
-import com.epam.dlab.dto.aws.AwsCloudSettings;
-import com.epam.dlab.dto.azure.AzureCloudSettings;
-import com.epam.dlab.dto.base.CloudSettings;
-import com.epam.dlab.dto.gcp.GcpCloudSettings;
-import com.epam.dlab.util.JsonGenerator;
-import com.epam.dlab.util.SecurityUtils;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Singleton
-public class CommandBuilder {
-
-	private final ProvisioningServiceApplicationConfiguration conf;
-
-	@Inject
-	public CommandBuilder(ProvisioningServiceApplicationConfiguration conf) {
-		this.conf = conf;
-	}
-
-	public String buildCommand(RunDockerCommand runDockerCommand, ResourceBaseDTO<?> resourceBaseDTO) throws JsonProcessingException {
-		StringBuilder builder = new StringBuilder();
-		if (resourceBaseDTO != null) {
-			builder.append("echo -e '");
-			try {
-				resourceBaseDTO.setCloudSettings(getCloudSettings(resourceBaseDTO.getCloudSettings()));
-				String str = JsonGenerator.generateJson(resourceBaseDTO);
-				log.info("Serialized DTO to: {}", SecurityUtils.hideCreds(str));
-				builder.append(str);
-			} catch (JsonProcessingException e) {
-				log.error("ERROR generating json from dockerRunParameters: {}", e.getMessage());
-				throw e;
-			}
-			builder.append('\'');
-			builder.append(" | ");
-		}
-		builder.append(runDockerCommand.toCMD());
-		return builder.toString();
-	}
-
-	private CloudSettings getCloudSettings(CloudSettings settings) {
-		final CloudProvider cloudProvider = conf.getCloudProvider();
-		final CloudConfiguration cloudConfiguration = conf.getCloudConfiguration();
-		final CloudConfiguration.LdapConfig ldapConfig = cloudConfiguration.getLdapConfig();
-		final CloudConfiguration.StepCerts stepCerts = cloudConfiguration.getStepCerts();
-		final CloudConfiguration.Keycloak keycloak = cloudConfiguration.getKeycloak();
-		if (cloudProvider == CloudProvider.AWS) {
-			return awsCloudSettings(settings, cloudConfiguration, ldapConfig, stepCerts, keycloak);
-		} else if (cloudProvider == CloudProvider.GCP) {
-			return gcpCloudSettings(settings, cloudConfiguration, ldapConfig, stepCerts, keycloak);
-		} else if (cloudProvider == CloudProvider.AZURE) {
-			return azureCloudSettings(settings, cloudConfiguration, ldapConfig, stepCerts, keycloak);
-		} else {
-			throw new UnsupportedOperationException("Unsupported cloud provider " + cloudProvider.getName());
-		}
-	}
-
-	private AzureCloudSettings azureCloudSettings(CloudSettings settings, CloudConfiguration cloudConfiguration,
-												  CloudConfiguration.LdapConfig ldapConfig,
-												  CloudConfiguration.StepCerts stepCerts,
-												  CloudConfiguration.Keycloak keycloak) {
-		return AzureCloudSettings.builder()
-				.azureRegion(cloudConfiguration.getRegion())
-				.azureResourceGroupName(cloudConfiguration.getAzureResourceGroupName())
-				.azureSecurityGroupName(cloudConfiguration.getSecurityGroupIds())
-				.ldapDn(ldapConfig.getDn())
-				.ldapHost(ldapConfig.getHost())
-				.ldapOu(ldapConfig.getOu())
-				.ldapUser(ldapConfig.getUser())
-				.ldapPassword(ldapConfig.getPassword())
-				.azureSubnetName(cloudConfiguration.getSubnetId())
-				.azureVpcName(cloudConfiguration.getVpcId())
-				.confKeyDir(cloudConfiguration.getConfKeyDir())
-				.azureIamUser(settings.getIamUser())
-				.sbn(cloudConfiguration.getServiceBaseName())
-				.os(cloudConfiguration.getOs())
-				.cloud(conf.getCloudProvider().getName())
-				.imageEnabled(String.valueOf(cloudConfiguration.isImageEnabled()))
-				.stepCertsEnabled(String.valueOf(stepCerts.isEnabled()))
-				.stepCertsRootCA(stepCerts.getRootCA())
-				.stepCertsKid(stepCerts.getKid())
-				.stepCertsKidPassword(stepCerts.getKidPassword())
-				.stepCertsCAURL(stepCerts.getCaURL())
-				.keycloakAuthServerUrl(keycloak.getAuthServerUrl())
-				.keycloakRealmName(keycloak.getRealmName())
-				.keycloakUser(keycloak.getUser())
-				.keycloakUserPassword(keycloak.getUserPassword())
-				.build();
-	}
-
-	private GcpCloudSettings gcpCloudSettings(CloudSettings settings, CloudConfiguration cloudConfiguration,
-											  CloudConfiguration.LdapConfig ldapConfig,
-											  CloudConfiguration.StepCerts stepCerts,
-											  CloudConfiguration.Keycloak keycloak) {
-		return GcpCloudSettings.builder()
-				.projectId(cloudConfiguration.getGcpProjectId())
-				.vpcName(cloudConfiguration.getVpcId())
-				.subnetName(cloudConfiguration.getSubnetId())
-				.zone(cloudConfiguration.getZone())
-				.region(cloudConfiguration.getRegion())
-				.ldapDn(ldapConfig.getDn())
-				.ldapHost(ldapConfig.getHost())
-				.ldapOu(ldapConfig.getOu())
-				.ldapUser(ldapConfig.getUser())
-				.ldapPassword(ldapConfig.getPassword())
-				.sbn(cloudConfiguration.getServiceBaseName())
-				.cloud(conf.getCloudProvider().getName())
-				.os(cloudConfiguration.getOs())
-				.confKeyDir(cloudConfiguration.getConfKeyDir())
-				.gcpIamUser(settings.getIamUser())
-				.imageEnabled(String.valueOf(cloudConfiguration.isImageEnabled()))
-				.stepCertsEnabled(String.valueOf(stepCerts.isEnabled()))
-				.stepCertsRootCA(stepCerts.getRootCA())
-				.stepCertsKid(stepCerts.getKid())
-				.stepCertsKidPassword(stepCerts.getKidPassword())
-				.stepCertsCAURL(stepCerts.getCaURL())
-				.keycloakAuthServerUrl(keycloak.getAuthServerUrl())
-				.keycloakRealmName(keycloak.getRealmName())
-				.keycloakUser(keycloak.getUser())
-				.keycloakUserPassword(keycloak.getUserPassword())
-				.build();
-	}
-
-	private AwsCloudSettings awsCloudSettings(CloudSettings settings, CloudConfiguration cloudConfiguration,
-											  CloudConfiguration.LdapConfig ldapConfig,
-											  CloudConfiguration.StepCerts stepCerts,
-											  CloudConfiguration.Keycloak keycloak) {
-		return AwsCloudSettings.builder()
-				.awsRegion(cloudConfiguration.getRegion())
-				.awsSecurityGroupIds(cloudConfiguration.getSecurityGroupIds())
-				.awsSubnetId(cloudConfiguration.getSubnetId())
-				.awsVpcId(cloudConfiguration.getVpcId())
-				.confTagResourceId(cloudConfiguration.getConfTagResourceId())
-				.awsNotebookSubnetId(cloudConfiguration.getNotebookSubnetId())
-				.awsNotebookVpcId(cloudConfiguration.getNotebookVpcId())
-				.awsIamUser(settings.getIamUser())
-				.zone(cloudConfiguration.getZone())
-				.ldapDn(ldapConfig.getDn())
-				.ldapHost(ldapConfig.getHost())
-				.ldapOu(ldapConfig.getOu())
-				.ldapUser(ldapConfig.getUser())
-				.ldapPassword(ldapConfig.getPassword())
-				.sbn(cloudConfiguration.getServiceBaseName())
-				.cloud(conf.getCloudProvider().getName())
-				.os(cloudConfiguration.getOs())
-				.confKeyDir(cloudConfiguration.getConfKeyDir())
-				.imageEnabled(String.valueOf(cloudConfiguration.isImageEnabled()))
-				.stepCertsEnabled(String.valueOf(stepCerts.isEnabled()))
-				.stepCertsRootCA(stepCerts.getRootCA())
-				.stepCertsKid(stepCerts.getKid())
-				.stepCertsKidPassword(stepCerts.getKidPassword())
-				.stepCertsCAURL(stepCerts.getCaURL())
-				.keycloakAuthServerUrl(keycloak.getAuthServerUrl())
-				.keycloakRealmName(keycloak.getRealmName())
-				.keycloakUser(keycloak.getUser())
-				.keycloakUserPassword(keycloak.getUserPassword())
-				.build();
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandExecutor.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandExecutor.java
deleted file mode 100644
index c74968f..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandExecutor.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-import com.epam.dlab.process.model.DlabProcess;
-import com.epam.dlab.process.model.ProcessId;
-import com.epam.dlab.process.model.ProcessInfo;
-import com.google.inject.Singleton;
-
-@Singleton
-public class CommandExecutor implements ICommandExecutor {
-
-	public ProcessInfo executeSync(final String username, final String uuid, String command) throws Exception {
-		return DlabProcess.getInstance().start(new ProcessId(username, uuid), "bash", "-c", command).get();
-
-	}
-
-	public void executeAsync(final String username, final String uuid, final String command) {
-		DlabProcess.getInstance().start(new ProcessId(username, uuid), "bash", "-c", command);
-	}
-}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMock.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMock.java
deleted file mode 100644
index 1cb6e43..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMock.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.process.builder.ProcessInfoBuilder;
-import com.epam.dlab.process.model.ProcessId;
-import com.epam.dlab.process.model.ProcessInfo;
-import com.google.common.collect.Lists;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-
-public class CommandExecutorMock implements ICommandExecutor {
-	private static final Logger LOGGER = LoggerFactory.getLogger(CommandExecutorMock.class);
-	public static final String DOCKER_DLAB_DATAENGINE = "docker.dlab-dataengine:latest";
-	public static final String DOCKER_DLAB_DATAENGINE_SERVICE = "docker.dlab-dataengine-service:latest";
-
-	private CommandExecutorMockAsync execAsync = null;
-	private CompletableFuture<Boolean> future;
-
-	private CloudProvider cloudProvider;
-
-	public CommandExecutorMock(CloudProvider cloudProvider) {
-		this.cloudProvider = cloudProvider;
-	}
-
-	/**
-	 * Return result of execution.
-	 *
-	 * @throws ExecutionException
-	 * @throws InterruptedException
-	 */
-	public boolean getResultSync() throws InterruptedException, ExecutionException {
-		return (future == null ? true : future.get());
-	}
-
-	/**
-	 * Return variables for substitution into Json response file.
-	 */
-	public Map<String, String> getVariables() {
-		return (execAsync == null ? null : execAsync.getParser().getVariables());
-	}
-
-	/**
-	 * Response file name.
-	 */
-	public String getResponseFileName() {
-		return (execAsync == null ? null : execAsync.getResponseFileName());
-	}
-
-	@Override
-	public ProcessInfo executeSync(String user, String uuid, String command) {
-		LOGGER.debug("Run OS command for user {} with UUID {}: {}", user, uuid, command);
-		ProcessInfoBuilder builder = new ProcessInfoBuilder(new ProcessId(user, command), 1000l);
-		if (command.startsWith("docker images |")) {
-			List<String> list = Lists.newArrayList(
-					"docker.dlab-deeplearning:latest",
-					"docker.dlab-jupyter:latest",
-					"docker.dlab-jupyterlab:latest",
-					"docker.dlab-superset:latest",
-					"docker.dlab-rstudio:latest",
-					"docker.dlab-tensor:latest",
-					"docker.dlab-zeppelin:latest",
-					"docker.dlab-tensor-rstudio:latest");
-
-			list.addAll(getComputationalDockerImage());
-
-			ProcessInfoBuilder.stdOut(builder, String.join("\n", list));
-		}
-		return builder.get();
-	}
-
-	@Override
-	public void executeAsync(String user, String uuid, String command) {
-		execAsync = new CommandExecutorMockAsync(user, uuid, command, cloudProvider);
-		future = CompletableFuture.supplyAsync(execAsync);
-	}
-
-	private List<String> getComputationalDockerImage() {
-		switch (cloudProvider) {
-			case AWS:
-				return Lists.newArrayList(DOCKER_DLAB_DATAENGINE_SERVICE, DOCKER_DLAB_DATAENGINE);
-			case AZURE:
-				return Lists.newArrayList(DOCKER_DLAB_DATAENGINE);
-			case GCP:
-				return Lists.newArrayList(DOCKER_DLAB_DATAENGINE_SERVICE, DOCKER_DLAB_DATAENGINE);
-			default:
-				throw new IllegalArgumentException("Unsupported cloud provider " + cloudProvider);
-		}
-	}
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockAsync.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockAsync.java
deleted file mode 100644
index 7277961..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockAsync.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import com.epam.dlab.dto.exploratory.LibStatus;
-import com.epam.dlab.dto.status.EnvResource;
-import com.epam.dlab.dto.status.EnvResourceList;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.util.SecurityUtils;
-import com.epam.dlab.util.ServiceUtils;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.collect.Lists;
-import com.google.common.io.ByteStreams;
-import com.google.common.io.Files;
-import com.google.common.io.Resources;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.codec.Charsets;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.*;
-import java.net.URL;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Supplier;
-
-@Slf4j
-public class CommandExecutorMockAsync implements Supplier<Boolean> {
-	private static final String JSON_FILE_ENDING = ".json";
-
-	private static final ObjectMapper MAPPER = new ObjectMapper()
-			.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true)
-			.setSerializationInclusion(JsonInclude.Include.NON_NULL);
-
-	private String user;
-	private String uuid;
-	private String command;
-
-	private CommandParserMock parser = new CommandParserMock();
-	private String responseFileName;
-
-	private CloudProvider cloudProvider;
-
-	public CommandExecutorMockAsync(String user, String uuid, String command, CloudProvider cloudProvider) {
-		this.user = user;
-		this.uuid = uuid;
-		this.command = command;
-		this.cloudProvider = cloudProvider;
-	}
-
-	@Override
-	public Boolean get() {
-		try {
-			run();
-		} catch (Exception e) {
-			log.error("Command with UUID {} fails: {}", uuid, e.getLocalizedMessage(), e);
-			return false;
-		}
-		return true;
-	}
-
-
-	/**
-	 * Return parser of command line.
-	 */
-	public CommandParserMock getParser() {
-		return parser;
-	}
-
-	/**
-	 * Return variables for substitution into Json response file.
-	 */
-	public Map<String, String> getVariables() {
-		return parser.getVariables();
-	}
-
-	/**
-	 * Response file name.
-	 */
-	public String getResponseFileName() {
-		return responseFileName;
-	}
-
-	public void run() {
-		log.debug("Run OS command for user {} with UUID {}: {}", user, uuid, SecurityUtils.hideCreds(command));
-
-		responseFileName = null;
-		parser = new CommandParserMock(command, uuid);
-		log.debug("Parser is {}", SecurityUtils.hideCreds(parser.toString()));
-		DockerAction action = DockerAction.of(parser.getAction());
-		log.debug("Action is {}", action);
-
-		if (parser.isDockerCommand()) {
-			if (action == null) {
-				throw new DlabException("Docker action not defined");
-			}
-
-			sleep(500);
-
-			try {
-				switch (action) {
-					case DESCRIBE:
-						describe();
-						break;
-					case CREATE:
-					case START:
-					case STOP:
-					case TERMINATE:
-					case GIT_CREDS:
-					case CREATE_IMAGE:
-					case RECONFIGURE_SPARK:
-					case CHECK_INACTIVITY:
-						action(user, action);
-						break;
-					case CONFIGURE:
-					case REUPLOAD_KEY:
-						sleep(1000);
-						action(user, action);
-						break;
-					case STATUS:
-						parser.getVariables().put("list_resources", getResponseStatus(true));
-						action(user, action);
-						break;
-					case LIB_LIST:
-						action(user, action);
-						copyFile(String.format("mock_response/%s/notebook_lib_list_pkgs.json",
-								cloudProvider.getName()),
-								String.join("_", "notebook", uuid, "all_pkgs") +
-										JSON_FILE_ENDING, parser.getResponsePath());
-						break;
-					case LIB_INSTALL:
-						parser.getVariables().put("lib_install", getResponseLibInstall(true));
-						action(user, action);
-						break;
-					default:
-						break;
-				}
-			} catch (Exception e) {
-				String msg = "Cannot execute command for user " + user + " with UUID " + uuid + ". " +
-						e.getLocalizedMessage();
-				log.error(msg, e);
-				throw new DlabException(msg, e);
-			}
-		} else {
-			final String scriptName = StringUtils.substringBefore(Paths.get(parser.getCommand()).getFileName()
-					.toString(), ".");
-			String templateFileName = "mock_response/" + cloudProvider.getName() + '/' + scriptName + JSON_FILE_ENDING;
-			responseFileName = getAbsolutePath(parser.getResponsePath(), scriptName + user + "_" +
-					parser.getRequestId() + JSON_FILE_ENDING);
-			setResponse(templateFileName, responseFileName);
-		}
-
-	}
-
-	private void sleep(int ms) {
-		try {
-			Thread.sleep(ms);
-		} catch (InterruptedException e) {
-			log.error("InterruptedException occurred: {}", e.getMessage());
-			Thread.currentThread().interrupt();
-		}
-	}
-
-	private static void copyFile(String sourceFilePath, String destinationFileName, String destinationFolder) throws
-			IOException {
-		File to = new File(getAbsolutePath(destinationFolder, destinationFileName));
-
-		try (InputStream inputStream =
-					 CommandExecutorMockAsync.class.getClassLoader().getResourceAsStream(sourceFilePath);
-			 OutputStream outputStream = new FileOutputStream(to)) {
-			ByteStreams.copy(inputStream, outputStream);
-		}
-
-		log.debug("File {} copied to {}", sourceFilePath, to);
-	}
-
-	/**
-	 * Return absolute path to the file or folder.
-	 *
-	 * @param first part of path.
-	 * @param more  next path components.
-	 */
-	private static String getAbsolutePath(String first, String... more) {
-		return Paths.get(first, more).toAbsolutePath().toString();
-	}
-
-	/**
-	 * Tests the directory exists.
-	 *
-	 * @param dir the name of directory.
-	 * @return <b>true</b> if the directory exists otherwise return <b>false</b>.
-	 */
-	private boolean dirExists(String dir) {
-		File file = new File(dir);
-		return (file.exists() && file.isDirectory());
-	}
-
-	/**
-	 * Find and return the directory "infrastructure-provisioning/src".
-	 *
-	 * @throws FileNotFoundException may be thrown
-	 */
-	private String findTemplatesDir() throws FileNotFoundException {
-		String dir = System.getProperty("docker.dir");
-
-		if (dir != null) {
-			dir = getAbsolutePath(dir);
-			if (dirExists(dir)) {
-				return dir;
-			}
-			throw new FileNotFoundException("Directory \"" + dir + "\" not found. " +
-					"Please set JVM argument -Ddocker.dir to the " +
-					"\".../infrastructure-provisioning/src/general/files/" + cloudProvider.getName() + "\" directory");
-		}
-		dir = getAbsolutePath(
-				".",
-				"../../infrastructure-provisioning/src/general/files/" + cloudProvider.getName());
-		if (dirExists(dir)) {
-			return dir;
-		}
-		dir = getAbsolutePath(
-				ServiceUtils.getUserDir(),
-				"../../infrastructure-provisioning/src/general/files/" + cloudProvider.getName());
-		if (dirExists(dir)) {
-			return dir;
-		}
-		throw new FileNotFoundException("Directory \"" + dir + "\" not found. " +
-				"Please set the value docker.dir property to the " +
-				"\".../infrastructure-provisioning/src/general/files/" + cloudProvider.getName() + "\" directory");
-	}
-
-	/**
-	 * Describe action.
-	 */
-	private void describe() {
-		String templateFileName;
-		try {
-			templateFileName = getAbsolutePath(findTemplatesDir(), parser.getImageType() + "_description.json");
-		} catch (FileNotFoundException e) {
-			throw new DlabException("Cannot describe image " + parser.getImageType() + ". " + e.getLocalizedMessage(),
-					e);
-		}
-		responseFileName = getAbsolutePath(parser.getResponsePath(), parser.getRequestId() + JSON_FILE_ENDING);
-
-		log.debug("Create response file from {} to {}", templateFileName, responseFileName);
-		File fileResponse = new File(responseFileName);
-		File fileTemplate = new File(templateFileName);
-		try {
-			if (!fileTemplate.exists()) {
-				throw new FileNotFoundException("File \"" + fileTemplate + "\" not found.");
-			}
-			if (!fileTemplate.canRead()) {
-				throw new IOException("Cannot read file \"" + fileTemplate + "\".");
-			}
-			Files.createParentDirs(fileResponse);
-			Files.copy(fileTemplate, fileResponse);
-		} catch (IOException e) {
-			throw new DlabException("Can't create response file " + responseFileName + ": " + e.getLocalizedMessage(),
-					e);
-		}
-	}
-
-	/**
-	 * Perform docker action.
-	 *
-	 * @param user   the name of user.
-	 * @param action docker action.
-	 */
-	private void action(String user, DockerAction action) {
-		String resourceType = parser.getResourceType();
-
-		String prefixFileName = (Lists.newArrayList("project", "edge", "dataengine", "dataengine-service")
-				.contains(resourceType) ? resourceType : "notebook") + "_";
-		String templateFileName = "mock_response/" + cloudProvider.getName() + '/' + prefixFileName +
-				action.toString() + JSON_FILE_ENDING;
-		responseFileName = getAbsolutePath(parser.getResponsePath(), prefixFileName + user + "_" +
-				parser.getRequestId() + JSON_FILE_ENDING);
-		setResponse(templateFileName, responseFileName);
-	}
-
-	/**
-	 * Return the section of resource statuses for docker action status.
-	 */
-	private String getResponseStatus(boolean noUpdate) {
-		if (noUpdate) {
-			return "{}";
-		}
-		EnvResourceList resourceList;
-		try {
-			JsonNode json = MAPPER.readTree(parser.getJson());
-			json = json.get("edge_list_resources");
-			resourceList = MAPPER.readValue(json.toString(), EnvResourceList.class);
-		} catch (IOException e) {
-			throw new DlabException("Can't parse json content: " + e.getLocalizedMessage(), e);
-		}
-
-		if (resourceList.getHostList() != null) {
-			for (EnvResource host : resourceList.getHostList()) {
-				host.setStatus(UserInstanceStatus.RUNNING.toString());
-			}
-		}
-		if (resourceList.getClusterList() != null) {
-			for (EnvResource host : resourceList.getClusterList()) {
-				host.setStatus(UserInstanceStatus.RUNNING.toString());
-			}
-		}
-
-		try {
-			return MAPPER.writeValueAsString(resourceList);
-		} catch (JsonProcessingException e) {
-			throw new DlabException("Can't generate json content: " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Return the section of resource statuses for docker action status.
-	 */
-	private String getResponseLibInstall(boolean isSuccess) {
-		List<LibInstallDTO> list;
-		try {
-			JsonNode json = MAPPER.readTree(parser.getJson());
-			json = json.get("libs");
-			list = MAPPER.readValue(json.toString(), new TypeReference<List<LibInstallDTO>>() {
-			});
-		} catch (IOException e) {
-			throw new DlabException("Can't parse json content: " + e.getLocalizedMessage(), e);
-		}
-
-		for (LibInstallDTO lib : list) {
-			if (isSuccess) {
-				lib.setStatus(LibStatus.INSTALLED.toString());
-			} else {
-				lib.setStatus(LibStatus.FAILED.toString());
-				lib.setErrorMessage("Mock error message");
-			}
-		}
-
-		try {
-			return MAPPER.writeValueAsString(list);
-		} catch (JsonProcessingException e) {
-			throw new DlabException("Can't generate json content: " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Write response file.
-	 *
-	 * @param sourceFileName template file name.
-	 * @param targetFileName response file name.
-	 */
-	private void setResponse(String sourceFileName, String targetFileName) {
-		String content;
-		URL url = Resources.getResource(sourceFileName);
-		try {
-			content = Resources.toString(url, Charsets.UTF_8);
-		} catch (IOException e) {
-			throw new DlabException("Can't read resource " + sourceFileName + ": " + e.getLocalizedMessage(), e);
-		}
-
-		for (String key : parser.getVariables().keySet()) {
-			String value = parser.getVariables().get(key);
-			content = content.replace("${" + key.toUpperCase() + "}", value);
-		}
-
-		File fileResponse = new File(responseFileName);
-		try (BufferedWriter out = new BufferedWriter(new FileWriter(fileResponse))) {
-			Files.createParentDirs(fileResponse);
-			out.write(content);
-		} catch (IOException e) {
-			throw new DlabException("Can't write response file " + targetFileName + ": " + e.getLocalizedMessage(), e);
-		}
-		log.debug("Create response file from {} to {}", sourceFileName, targetFileName);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandParserMock.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandParserMock.java
deleted file mode 100644
index fe20912..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/CommandParserMock.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-import com.epam.dlab.exceptions.DlabException;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.base.MoreObjects;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.io.IOException;
-import java.util.*;
-
-/**
- * Parse command for emulate commands of Docker.
- */
-public class CommandParserMock {
-    private ObjectMapper MAPPER = new ObjectMapper()
-            .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true)
-            .setSerializationInclusion(JsonInclude.Include.NON_NULL);
-
-    private String command;
-    private String action;
-    private String resourceType;
-    private String imageType;
-    private String requestId;
-    private String responsePath;
-    private String name;
-    private String json;
-    private Map<String, String> envMap = new HashMap<>();
-    private Map<String, String> varMap = new HashMap<>();
-    private List<String> otherArgs = new ArrayList<>();
-    private Map<String, String> variables = new HashMap<>();
-    private boolean dockerCommand;
-
-    public CommandParserMock() {
-    }
-
-    public CommandParserMock(String command, String uuid) {
-        parse(command, uuid);
-    }
-
-
-    /**
-     * Return the name of docker command.
-     */
-    public String getCommand() {
-        return command;
-    }
-
-    /**
-     * Return the name of docker action.
-     */
-    public String getAction() {
-        return action;
-    }
-
-    /**
-     * Return the type of resource.
-     */
-    public String getResourceType() {
-        return resourceType;
-    }
-
-    /**
-     * Return the image type.
-     */
-    public String getImageType() {
-        return imageType;
-    }
-
-    /**
-     * Return the request id.
-     */
-    public String getRequestId() {
-        return requestId;
-    }
-
-    /**
-     * Return the path for response files.
-     */
-    public String getResponsePath() {
-        return responsePath;
-    }
-
-    /**
-     * Return name of docker container.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Return content of Json if present otherwise <b>null</b>.
-     */
-    public String getJson() {
-        return json;
-    }
-
-    /**
-     * Return map of environment variables.
-     */
-    public Map<String, String> getVariables() {
-        return variables;
-    }
-
-    /**
-     * Add argument to list.
-     *
-     * @param args list of arguments.
-     * @param arg  argument.
-     */
-    private void addArgToList(List<String> args, String arg) {
-        if (arg == null) {
-            return;
-        }
-        if (arg.length() > 1) {
-            if (arg.startsWith("'") && arg.endsWith("'")) {
-                arg = arg.substring(1, arg.length() - 1);
-            }
-            if (arg.startsWith("\"") && arg.endsWith("\"")) {
-                arg = arg.substring(1, arg.length() - 1);
-            }
-        }
-        arg = arg.trim();
-        if (arg.isEmpty()) {
-            return;
-        }
-
-        args.add(arg);
-    }
-
-    /**
-     * Extract arguments from command line.
-     *
-     * @param cmd command line.
-     * @return List of arguments.
-     */
-    private List<String> extractArgs(String cmd) {
-        boolean isQuote = false;
-        boolean isDoubleQuote = false;
-        List<String> args = new ArrayList<>();
-        int pos = 0;
-
-        for (int i = 0; i < cmd.length(); i++) {
-            final char c = cmd.charAt(i);
-            if (c == '\'') {
-                isQuote = !isQuote;
-                continue;
-            }
-            if (c == '"') {
-                isDoubleQuote = !isDoubleQuote;
-                continue;
-            }
-
-            if (!isQuote && !isDoubleQuote && c == ' ') {
-                addArgToList(args, cmd.substring(pos, i));
-                pos = i + 1;
-            }
-        }
-        if (!isQuote && !isDoubleQuote) {
-            addArgToList(args, cmd.substring(pos));
-        }
-
-        return args;
-    }
-
-    /**
-     * Return the value of argument.
-     *
-     * @param args    list of arguments.
-     * @param index   index of named arguments
-     * @param argName name of argument.
-     */
-    private String getArgValue(List<String> args, int index, String argName) {
-        if (!args.get(index).equals(argName)) {
-            return null;
-        }
-        args.remove(index);
-        if (index < args.size()) {
-            String value = args.get(index);
-            args.remove(index);
-            return value;
-        }
-        throw new DlabException("Argument \"" + argName + "\" detected but not have value");
-    }
-
-    /**
-     * Return pair name/value separated.
-     *
-     * @param argName   name of argument.
-     * @param value     value.
-     * @param separator separator.
-     */
-    private Pair<String, String> getPair(String argName, String value, String separator) {
-        String[] array = value.split(separator);
-        if (array.length != 2) {
-            throw new DlabException("Invalid value for \"" + argName + "\": " + value);
-        }
-        return new ImmutablePair<>(array[0], array[1]);
-    }
-
-    /**
-     * Return name of docker image.
-     *
-     * @param args list of arguments.
-     * @throws if image name not found.
-     */
-    public static String getImageName(List<String> args) {
-        for (String s : args) {
-            if (s.startsWith("docker.dlab-")) {
-                return s;
-            }
-        }
-        throw new DlabException("Name of docker image not found");
-    }
-
-    /**
-     * Extract Json properties from Json content.
-     *
-     * @param jsonContent Json content.
-     * @return
-     */
-    private Map<String, String> getJsonVariables(String jsonContent) {
-        Map<String, String> vars = new HashMap<>();
-        if (jsonContent == null) {
-            return vars;
-        }
-
-        JsonNode json;
-        try {
-            json = MAPPER.readTree(jsonContent);
-        } catch (IOException e) {
-            throw new DlabException("Can't parse json content: " + e.getLocalizedMessage(), e);
-        }
-
-        Iterator<String> keys = json.fieldNames();
-        while (keys.hasNext()) {
-            String key = keys.next();
-            String value = getTextValue(json.get(key));
-            if (value != null) {
-                vars.put(key, value);
-            }
-        }
-        return vars;
-    }
-
-    /**
-     * Return the value of json property or <b>null</b>.
-     *
-     * @param jsonNode - Json node.
-     */
-    private String getTextValue(JsonNode jsonNode) {
-        return jsonNode != null ? jsonNode.textValue() : null;
-    }
-
-    /**
-     * Parse command line.
-     *
-     * @param cmd command line.
-     */
-    public void parse(String cmd, String uuid) {
-        command = null;
-        action = null;
-        resourceType = null;
-        imageType = null;
-        requestId = uuid;
-        responsePath = null;
-        name = null;
-        json = null;
-
-        envMap.clear();
-        varMap.clear();
-        otherArgs.clear();
-        variables.clear();
-
-        List<String> args = extractArgs(cmd);
-        dockerCommand = args.contains("docker");
-        int i = 0;
-        String s;
-        Pair<String, String> p;
-
-        while (i < args.size()) {
-            if ((s = getArgValue(args, i, "-v")) != null) {
-                p = getPair("-v", s, ":");
-                varMap.put(p.getValue(), p.getKey());
-            } else if ((s = getArgValue(args, i, "-e")) != null) {
-                p = getPair("-e", s, "=");
-                envMap.put(p.getKey(), p.getValue());
-            } else if ((s = getArgValue(args, i, "docker")) != null || (s = getArgValue(args, i, "python")) != null) {
-                command = s;
-            } else if ((s = getArgValue(args, i, "--action")) != null) {
-                action = s;
-            } else if ((s = getArgValue(args, i, "--name")) != null) {
-                name = s;
-            } else if ((s = getArgValue(args, i, "echo")) != null) {
-                if (s.equals("-e")) {
-                    if (i >= args.size()) {
-                        throw new DlabException("Argument \"echo -e\" detected but not have value");
-                    }
-                    s = args.get(i);
-                    args.remove(i);
-                }
-                json = s;
-            } else if ((s = getArgValue(args, i, "--result_path")) != null) {
-                responsePath = s;
-                varMap.put("/response", responsePath);
-                args.remove(i);
-            } else {
-                i++;
-            }
-        }
-
-        if (args.size() > 0) {
-            otherArgs.addAll(args);
-        }
-
-        resourceType = envMap.get("conf_resource");
-        if (isDockerCommand()) {
-            imageType = getImageName(args);
-            imageType = imageType.replace("docker.dlab-", "").replace(":latest", "");
-        }
-        responsePath = varMap.get("/response");
-
-        variables.putAll(envMap);
-        variables.putAll(getJsonVariables(json));
-        variables.put("request_id", requestId);
-        variables.put("instance_id", "i-" + requestId.replace("-", "").substring(0, 17));
-        variables.put("cluster_id", "j-" + requestId.replace("-", "").substring(0, 13).toUpperCase());
-        variables.put("notebook_id", requestId.replace("-", "").substring(17, 22));
-    }
-
-    public boolean isDockerCommand() {
-        return dockerCommand;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("command", command)
-                .add("action", action)
-                .add("resourceType", resourceType)
-                .add("imageType", imageType)
-                .add("requestId", requestId)
-                .add("responsePath", responsePath)
-                .add("name", name)
-                .add("environment", envMap)
-                .add("variable", varMap)
-                .add("others", otherArgs)
-                .add("json", json)
-                .toString();
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/DockerAction.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/DockerAction.java
deleted file mode 100644
index dea80e9..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/DockerAction.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-public enum DockerAction {
-    DESCRIBE,
-    CREATE,
-    START,
-    CONFIGURE,
-    RUN,
-    STOP,
-    TERMINATE,
-    LIB_LIST,
-    LIB_INSTALL,
-    GIT_CREDS,
-    CREATE_IMAGE,
-    STATUS,
-	REUPLOAD_KEY,
-    RECONFIGURE_SPARK,
-	CHECK_INACTIVITY;
-
-    public static DockerAction of(String action) {
-        if (action != null) {
-            for (DockerAction uis : DockerAction.values()) {
-                if (action.equalsIgnoreCase(uis.toString())) {
-                    return uis;
-                }
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public String toString() {
-        return super.toString().toLowerCase();
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/DockerCommands.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/DockerCommands.java
deleted file mode 100644
index dec60af..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/DockerCommands.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.core.commands;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import java.util.UUID;
-
-public interface DockerCommands {
-    String GET_IMAGES = new ImagesDockerCommand()
-            .pipe(UnixCommand.awk("{print $1\":\"$2}"))
-            .pipe(UnixCommand.sort())
-            .pipe(UnixCommand.uniq())
-            .pipe(UnixCommand.grep("dlab"))
-            .pipe(UnixCommand.grep("none", "-v"))
-            .pipe(UnixCommand.grep("base", "-v"))
-            .pipe(UnixCommand.grep("ssn", "-v"))
-            .pipe(UnixCommand.grep("edge", "-v"))
-            .pipe(UnixCommand.grep("project", "-v"))
-            .toCMD();
-
-    String GET_RUNNING_CONTAINERS_FOR_USER = "docker ps --format \"{{.Names}}\" -f name=%s";
-
-    ObjectMapper MAPPER = new ObjectMapper()
-            .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
-
-    static String generateUUID() {
-        return UUID.randomUUID().toString();
-    }
-
-    static String extractUUID(String fileName) {
-        Integer beginIndex = fileName.lastIndexOf('_');
-        Integer endIndex = fileName.lastIndexOf('.');
-        beginIndex = beginIndex < 0 ? 0 : beginIndex + 1;
-        if (endIndex < 0) endIndex = fileName.length();
-        if (beginIndex > endIndex) beginIndex = endIndex;
-        return fileName.substring(beginIndex, endIndex);
-    }
-
-    default String nameContainer(String... names) {
-        return String.join("_", names) + "_" + System.currentTimeMillis();
-    }
-
-    String getResourceType();
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/ICommandExecutor.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/ICommandExecutor.java
deleted file mode 100644
index 454bc05..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/ICommandExecutor.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.core.commands;
-
-import com.epam.dlab.process.model.ProcessInfo;
-
-public interface ICommandExecutor {
-    ProcessInfo executeSync(String username, String uuid, String command) throws Exception;
-    void executeAsync(String username, String uuid, String command);
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/ImagesDockerCommand.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/ImagesDockerCommand.java
deleted file mode 100644
index ebff5c0..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/ImagesDockerCommand.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-import java.util.LinkedList;
-import java.util.List;
-
-public class ImagesDockerCommand implements CmdCommand {
-    private String command = "docker images";
-
-    private List<UnixCommand> unixCommands;
-
-    public ImagesDockerCommand pipe(UnixCommand unixCommand) {
-        if (unixCommands == null) {
-            unixCommands = new LinkedList<>();
-        }
-        unixCommands.add(unixCommand);
-        return this;
-    }
-
-    @Override
-    public String toCMD() {
-        StringBuilder sb = new StringBuilder(command);
-        if (unixCommands != null) {
-            for (UnixCommand unixCommand : unixCommands) {
-                sb.append(" | ").append(unixCommand.getCommand());
-            }
-        }
-        return sb.toString();
-    }
-
-    @Override
-    public String toString() {
-        return toCMD();
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/PythonBackupCommand.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/PythonBackupCommand.java
deleted file mode 100644
index 20ab144..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/PythonBackupCommand.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-import java.util.List;
-
-public class PythonBackupCommand extends PythonCommand {
-
-	private static final String ARG_DELIMITER = ",";
-	private static final String USER_NAME_SYSTEM_PROPERTY = "user.name";
-
-	public PythonBackupCommand(String fileName) {
-		super(fileName);
-	}
-
-	public PythonBackupCommand withConfig(List<String> configs) {
-		withOption("--config", String.join(ARG_DELIMITER, configs));
-		return this;
-	}
-
-	public PythonBackupCommand withKeys(List<String> keys) {
-		withOption("--keys", String.join(ARG_DELIMITER, keys));
-		return this;
-	}
-
-	public PythonBackupCommand withJars(List<String> jars) {
-		withOption("--jars", String.join(ARG_DELIMITER, jars));
-		return this;
-	}
-
-	public PythonBackupCommand withDBBackup(boolean dbBackup) {
-		if (dbBackup) {
-			withOption("--db");
-		}
-		return this;
-	}
-
-	public PythonBackupCommand withCertificates(List<String> certificates) {
-		withOption("--certs", String.join(ARG_DELIMITER, certificates));
-		return this;
-	}
-
-	public PythonBackupCommand withSystemUser() {
-		withOption("--user", System.getProperty(USER_NAME_SYSTEM_PROPERTY));
-		return this;
-	}
-
-	public PythonBackupCommand withLogsBackup(boolean logsBackup) {
-		if (logsBackup) {
-			withOption("--logs");
-		}
-		return this;
-	}
-
-	public PythonBackupCommand withRequestId(String requestId) {
-		withOption("--request_id", requestId);
-		return this;
-	}
-
-	public PythonBackupCommand withResponsePath(String responsePath) {
-		withOption("--result_path", responsePath);
-		return this;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/PythonCommand.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/PythonCommand.java
deleted file mode 100644
index c3bfe3c..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/PythonCommand.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class PythonCommand implements CmdCommand {
-	private static final String PYTHON = "python ";
-	private final String fileName;
-	private List<String> options = new ArrayList<>();
-
-	public PythonCommand(String fileName) {
-		this.fileName = fileName;
-	}
-
-	public PythonCommand withOption(String option) {
-		options.add(option);
-		return this;
-	}
-
-	public PythonCommand withOption(String key, String value) {
-		options.add(key + " " + value);
-		return this;
-	}
-
-	@Override
-	public String toCMD() {
-		return PYTHON + fileName + StringUtils.SPACE + String.join(StringUtils.SPACE, options);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/RunDockerCommand.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/RunDockerCommand.java
deleted file mode 100644
index 4c466dc..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/RunDockerCommand.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-import java.nio.file.Paths;
-import java.util.LinkedList;
-import java.util.List;
-
-public class RunDockerCommand implements CmdCommand {
-    public static final String EDGE_USER_NAME_FORMAT = "-e \"edge_user_name=%s\"";
-    private String command = "docker run";
-    private List<String> options = new LinkedList<>();
-    private String image;
-    private DockerAction action;
-
-    private static final String ROOT_KEYS_PATH = "/root/keys";
-    private static final String RESPONSE_PATH = "/response";
-    private static final String LOG_PATH = "/logs";
-    private static final String AZURE_AUTH_FILE = "/root/azure_auth.json";
-
-    public RunDockerCommand withVolume(String hostSrcPath, String bindPath) {
-        options.add(String.format("-v %s:%s", hostSrcPath, bindPath));
-        return this;
-    }
-
-    public RunDockerCommand withVolumeForRootKeys(String hostSrcPath) {
-        return withVolume(hostSrcPath, ROOT_KEYS_PATH);
-    }
-
-    public RunDockerCommand withVolumeForResponse(String hostSrcPath) {
-        return withVolume(hostSrcPath, RESPONSE_PATH);
-    }
-
-    public RunDockerCommand withVolumeFoAzureAuthFile(String hostSrcPath) {
-        return withVolume(hostSrcPath, AZURE_AUTH_FILE);
-    }
-
-    public RunDockerCommand withVolumeForLog(String hostSrcPath, String logDirectory) {
-        return withVolume(Paths.get(hostSrcPath, logDirectory).toString(),
-                Paths.get(LOG_PATH, logDirectory).toString());
-    }
-
-    public RunDockerCommand withName(String name) {
-        options.add(String.format("--name %s", name));
-        return this;
-    }
-
-    public RunDockerCommand withRequestId(String requestId) {
-        options.add(String.format("-e \"request_id=%s\"", requestId));
-        return this;
-    }
-
-    public RunDockerCommand withAtach(String value) {
-        options.add(String.format("-a %s", value));
-        return this;
-    }
-
-    public RunDockerCommand withInteractive() {
-        options.add("-i");
-        return this;
-    }
-
-    public RunDockerCommand withDetached() {
-        options.add("-d");
-        return this;
-    }
-
-    public RunDockerCommand withPseudoTTY() {
-        options.add("-t");
-        return this;
-    }
-
-    public RunDockerCommand withImage(String image) {
-        this.image = image;
-        return this;
-    }
-
-    public RunDockerCommand withAction(DockerAction action) {
-        this.action = action;
-        return this;
-    }
-
-    public RunDockerCommand withActionDescribe(String toDescribe) {
-        this.image = toDescribe;
-        this.action = DockerAction.DESCRIBE;
-        return this;
-    }
-
-    public RunDockerCommand withActionCreate(String toCreate) {
-        this.image = toCreate;
-        this.action = DockerAction.CREATE;
-        return this;
-    }
-
-    public RunDockerCommand withActionConfigure(String toConfigue) {
-        this.image = toConfigue;
-        this.action = DockerAction.CONFIGURE;
-        return this;
-    }
-
-    public RunDockerCommand withActionStatus(String toStatus) {
-        this.image = toStatus;
-        this.action = DockerAction.STATUS;
-        return this;
-    }
-
-    public RunDockerCommand withActionStart(String toStart) {
-        this.image = toStart;
-        this.action = DockerAction.START;
-        return this;
-    }
-
-    public RunDockerCommand withActionRun(String toRun) {
-        this.image = toRun;
-        this.action = DockerAction.RUN;
-        return this;
-    }
-
-    public RunDockerCommand withActionTerminate(String toTerminate) {
-        this.image = toTerminate;
-        this.action = DockerAction.TERMINATE;
-        return this;
-    }
-
-    public RunDockerCommand withActionStop(String toStop) {
-        this.image = toStop;
-        this.action = DockerAction.STOP;
-        return this;
-    }
-
-    public RunDockerCommand withConfKeyName(String confKeyName) {
-        options.add(String.format("-e \"conf_key_name=%s\"", confKeyName));
-        return this;
-    }
-
-    public RunDockerCommand withConfServiceBaseName(String confServiceBaseName) {
-        options.add(String.format("-e \"conf_service_base_name=%s\"", confServiceBaseName));
-        return this;
-    }
-
-    public RunDockerCommand withConfOsFamily(String confOsFamily) {
-        options.add(String.format("-e \"conf_os_family=%s\"", confOsFamily));
-        return this;
-    }
-
-    public RunDockerCommand withEmrInstanceCount(String emrInstanceCount) {
-        options.add(String.format("-e \"emr_instance_count=%s\"", emrInstanceCount));
-        return this;
-    }
-
-    public RunDockerCommand withAwsVpcId(String awsVpcId) {
-        options.add(String.format("-e \"aws_vpc_id=%s\"", awsVpcId));
-        return this;
-    }
-
-    public RunDockerCommand withAwsSubnetId(String awsSubnetId) {
-        options.add(String.format("-e \"aws_subnet_id=%s\"", awsSubnetId));
-        return this;
-    }
-
-    public RunDockerCommand withEmrInstanceType(String emrInstanceType) {
-        options.add(String.format("-e \"emr_instance_type=%s\"", emrInstanceType));
-        return this;
-    }
-
-    public RunDockerCommand withEmrVersion(String emrVersion) {
-        options.add(String.format("-e \"emr_version=%s\"", emrVersion));
-        return this;
-    }
-
-    public RunDockerCommand withEmrTimeout(String emrTimeout) {
-        options.add(String.format("-e \"emr_timeout=%s\"", emrTimeout));
-        return this;
-    }
-
-    public RunDockerCommand withEc2Role(String ec2Role) {
-        options.add(String.format("-e \"ec2_role=%s\"", ec2Role));
-        return this;
-    }
-
-    public RunDockerCommand withServiceRole(String serviceRole) {
-        options.add(String.format("-e \"service_role=%s\"", serviceRole));
-        return this;
-    }
-
-    public RunDockerCommand withNotebookName(String notebookName) {
-        options.add(String.format("-e \"notebook_name=%s\"", notebookName));
-        return this;
-    }
-
-    public RunDockerCommand withEdgeSubnetCidr(String edgeSubnetCidr) {
-        options.add(String.format("-e \"edge_subnet_cidr=%s\"", edgeSubnetCidr));
-        return this;
-    }
-
-    public RunDockerCommand withAwsRegion(String awsRegion) {
-        options.add(String.format("-e \"aws_region=%s\"", awsRegion));
-        return this;
-    }
-
-    public RunDockerCommand withEdgeUserName(String edgeUserName) {
-        options.add(String.format(EDGE_USER_NAME_FORMAT, edgeUserName));
-        return this;
-    }
-
-    public RunDockerCommand withEmrClusterName(String emrClusterName) {
-        options.add(String.format("-e \"emr_cluster_name=%s\"", emrClusterName));
-        return this;
-    }
-
-    public RunDockerCommand withNotebookUserName(String notebookUserName) {
-        options.add(String.format(EDGE_USER_NAME_FORMAT, notebookUserName));
-        return this;
-    }
-
-    public RunDockerCommand withNotebookSubnetCidr(String notebookSubnetCidr) {
-        options.add(String.format("-e \"notebook_subnet_cidr=%s\"", notebookSubnetCidr));
-        return this;
-    }
-
-    public RunDockerCommand withAwsSecurityGroupsIds(String awsSecurityGroupsIds) {
-        options.add(String.format("-e \"aws_security_groups_ids=%s\"", awsSecurityGroupsIds));
-        return this;
-    }
-
-    public RunDockerCommand withNotebookInstanceName(String notebookInstanceName) {
-        options.add(String.format("-e \"notebook_instance_name=%s\"", notebookInstanceName));
-        return this;
-    }
-
-    public RunDockerCommand withUserKeyName(String userKeyName) {
-        options.add(String.format(EDGE_USER_NAME_FORMAT, userKeyName));
-        return this;
-    }
-
-    public RunDockerCommand withDryRun() {
-        options.add("-e \"dry_run=true\"");
-        return this;
-    }
-
-    public RunDockerCommand withResource(String resourceType) {
-        options.add(String.format("-e \"conf_resource=%s\"", resourceType));
-        return this;
-    }
-
-    public RunDockerCommand withRemove(){
-        options.add("--rm");
-        return this;
-    }
-
-    @Override
-    public String toCMD() {
-        StringBuilder sb = new StringBuilder(command);
-        for (String option : options) {
-            sb.append(" ").append(option);
-        }
-        if (image != null && action != null) {
-            sb.append(" ").append(image).append(" --action ").append(action.toString());
-        }
-        return sb.toString();
-    }
-
-    @Override
-    public String toString() {
-        return toCMD();
-    }
-    
-}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/UnixCommand.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/UnixCommand.java
deleted file mode 100644
index 9a9095a..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/commands/UnixCommand.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-public class UnixCommand {
-    private String command;
-
-    public UnixCommand(String command) {
-        this.command = command;
-    }
-
-    public static UnixCommand awk(String txt) {
-        return new UnixCommand("awk '" + txt + "'");
-    }
-
-    public static UnixCommand sort() {
-        return new UnixCommand("sort");
-    }
-
-    public static UnixCommand uniq() {
-        return new UnixCommand("uniq");
-    }
-
-    public static UnixCommand grep(String searchFor, String... options) {
-        StringBuilder sb = new StringBuilder("grep");
-        for (String option : options) {
-            sb.append(' ').append(option);
-        }
-        sb.append(" \"" + searchFor + "\"");
-        return new UnixCommand(sb.toString());
-    }
-
-    public String getCommand() {
-        return command;
-    }
-}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/AsyncFileHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/AsyncFileHandler.java
deleted file mode 100644
index 52a2066..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/AsyncFileHandler.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.core.response.folderlistener;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import io.dropwizard.util.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.function.Supplier;
-
-import static com.epam.dlab.backendapi.core.Constants.JSON_EXTENSION;
-import static com.epam.dlab.backendapi.core.Constants.LOG_EXTENSION;
-
-/* Handler for the file processing.
- */
-public final class AsyncFileHandler implements Supplier<Boolean> {
-
-	private static final Logger LOGGER = LoggerFactory.getLogger(AsyncFileHandler.class);
-
-	/**
-	 * File name.
-	 */
-	private final String fileName;
-	/**
-	 * Directory name.
-	 */
-	private final String directory;
-	/**
-	 * Implement of the file handler.
-	 */
-	private final FileHandlerCallback fileHandlerCallback;
-	/**
-	 * Timeout waiting for the file writing.
-	 */
-	private final Duration fileLengthCheckDelay;
-
-	/**
-	 * Create instance of the file handler.
-	 *
-	 * @param fileName             file name.
-	 * @param directory            directory name.
-	 * @param fileHandlerCallback  file handler for processing
-	 * @param fileLengthCheckDelay timeout waiting for the file writing.
-	 */
-	public AsyncFileHandler(String fileName, String directory, FileHandlerCallback fileHandlerCallback,
-							Duration fileLengthCheckDelay) {
-		this.fileName = fileName;
-		this.directory = directory;
-		this.fileHandlerCallback = fileHandlerCallback;
-		this.fileLengthCheckDelay = fileLengthCheckDelay;
-	}
-
-	@Override
-	public Boolean get() {
-		Path path = Paths.get(directory, fileName);
-		try {
-			boolean result = fileHandlerCallback.handle(fileName, readBytes(path));
-			if (result) {
-				try {
-					Files.deleteIfExists(path);
-					Files.deleteIfExists(getLogFile());
-					LOGGER.trace("Response {} and log files has been deleted", path.toAbsolutePath());
-				} catch (IOException e) {
-					LOGGER.warn("Can't delete file {}", path.toAbsolutePath(), e);
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			LOGGER.error("Could not handle file {} async", path.toAbsolutePath(), e);
-			fileHandlerCallback.handleError(e.getLocalizedMessage());
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the name of log file.
-	 */
-	private Path getLogFile() {
-		return Paths.get(directory, fileName.replaceAll(JSON_EXTENSION, LOG_EXTENSION));
-	}
-
-	/**
-	 * Returns the content of file.
-	 *
-	 * @param path source file.
-	 * @return File content.
-	 * @throws IOException
-	 * @throws InterruptedException
-	 */
-	private byte[] readBytes(Path path) throws IOException, InterruptedException {
-		File file = path.toFile();
-		waitFileCompletelyWritten(file);
-		return Files.readAllBytes(path);
-	}
-
-	/**
-	 * Waiting for the file writing. This method is blocking and return control when
-	 * the file will no longer resize.
-	 *
-	 * @param file source file.
-	 */
-	private void waitFileCompletelyWritten(File file) throws InterruptedException {
-		long before;
-		long after = file.length();
-		do {
-			before = after;
-			Thread.sleep(fileLengthCheckDelay.toMilliseconds());
-			after = file.length();
-		} while (before != after);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/FolderListener.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/FolderListener.java
deleted file mode 100644
index 3856a92..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/FolderListener.java
+++ /dev/null
@@ -1,440 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.core.response.folderlistener;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.response.folderlistener.WatchItem.ItemStatus;
-import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
-import com.epam.dlab.exceptions.DlabException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import static com.epam.dlab.backendapi.core.Constants.JSON_EXTENSION;
-
-/**
- * Listen the directories for the files creation and runs the file processing by {@link AsyncFileHandler}.
- */
-public class FolderListener implements Runnable {
-	private static final Logger LOGGER = LoggerFactory.getLogger(FolderListener.class);
-
-	/**
-	 * Timeout of the check the file creation in milliseconds.
-	 */
-	public static final long LISTENER_TIMEOUT_MILLLIS = 1000;
-
-	/**
-	 * Timeout of the idle for the folder listener in milliseconds.
-	 */
-	public static final long LISTENER_IDLE_TIMEOUT_MILLLIS = 600L * 1000L;
-
-	/**
-	 * Timeout of waiting for the directory creation in milliseconds.
-	 */
-	private static final long WAIT_DIR_TIMEOUT_MILLIS = 500;
-
-	/**
-	 * List of the folder listeners.
-	 */
-	private static final List<FolderListener> listeners = new ArrayList<>();
-
-
-	/**
-	 * Appends the file handler for processing to the folder listener and returns instance of the file handler.
-	 *
-	 * @param directoryName        Name of directory for listen.
-	 * @param fileHandlerCallback  File handler for processing.
-	 * @param timeoutMillis        Timeout waiting for the file creation in milliseconds.
-	 * @param fileLengthCheckDelay Timeout waiting for the file writing in milliseconds.
-	 * @param callbackHandlerDao   callbackHandlerDao for handlers
-	 * @return Instance of the file handler.
-	 */
-	public static WatchItem listen(String directoryName, FileHandlerCallback fileHandlerCallback,
-								   long timeoutMillis, long fileLengthCheckDelay,
-								   CallbackHandlerDao callbackHandlerDao) {
-		return listen(directoryName, fileHandlerCallback, timeoutMillis, fileLengthCheckDelay, null,
-				callbackHandlerDao);
-	}
-
-	/**
-	 * Appends the file handler for processing to the folder listener for the existing file and returns
-	 * instance of the file handler. If the file name is <b>null</b> this means that file does not exist
-	 * and equal to call method
-	 * {@link FolderListener#listen(String, FileHandlerCallback, long, long, CallbackHandlerDao)}.
-	 *
-	 * @param directoryName        Name of directory for listen.
-	 * @param fileHandlerCallback  File handler for processing.
-	 * @param timeoutMillis        Timeout waiting for the file creation in milliseconds.
-	 * @param fileLengthCheckDelay Timeout waiting for the file writing in milliseconds.
-	 * @param fileName             file name.
-	 * @param callbackHandlerDao   callbackHandlerDao for handlers
-	 * @return Instance of the file handler.
-	 */
-	public static WatchItem listen(String directoryName, FileHandlerCallback fileHandlerCallback, long timeoutMillis,
-								   long fileLengthCheckDelay, String fileName, CallbackHandlerDao callbackHandlerDao) {
-		FolderListener listener;
-		WatchItem item;
-
-		LOGGER.trace("Looking for folder listener to folder \"{}\" ...", directoryName);
-		synchronized (listeners) {
-			for (int i = 0; i < listeners.size(); i++) {
-				listener = listeners.get(i);
-				if (listener.itemList.getDirectoryName().equals(directoryName)) {
-					if (listener.isAlive()) {
-						LOGGER.debug("Folder listener \"{}\" found. Append file handler for UUID {}",
-								directoryName, fileHandlerCallback.getUUID());
-						item = listener.itemList.append(fileHandlerCallback, timeoutMillis, fileLengthCheckDelay,
-								fileName);
-						return item;
-					} else {
-						LOGGER.warn("Folder listener \"{}\" is dead and will be removed", directoryName);
-						listeners.remove(i);
-						break;
-					}
-				}
-			}
-			LOGGER.debug("Folder listener \"{}\" not found. Create new listener and append file handler for UUID {}",
-					directoryName, fileHandlerCallback.getUUID());
-			listener = new FolderListener(directoryName, callbackHandlerDao);
-			item = listener.itemList.append(fileHandlerCallback, timeoutMillis, fileLengthCheckDelay, fileName);
-			listeners.add(listener);
-			listener.start();
-		}
-		return item;
-	}
-
-	/**
-	 * Terminates all the folder listeners.
-	 */
-	public static void terminateAll() {
-		FolderListener[] array;
-		synchronized (listeners) {
-			array = listeners.toArray(new FolderListener[listeners.size()]);
-		}
-		for (int i = 0; i < array.length; i++) {
-			array[i].terminate();
-		}
-	}
-
-	/**
-	 * Returns the list of folder listeners.
-	 */
-	public static List<FolderListener> getListeners() {
-		return listeners;
-	}
-
-
-	/**
-	 * Thread of the folder listener.
-	 */
-	private Thread thread;
-	/**
-	 * List of the file handles.
-	 */
-	private WatchItemList itemList;
-	/**
-	 * Flag of listening status.
-	 */
-	private boolean isListen = false;
-	/**
-	 * Time when expired of idle for folder listener in milliseconds.
-	 */
-	private long expiredIdleMillis = 0;
-
-
-	private FolderListener() {
-	}
-
-	/**
-	 * Creates thread of the folder listener
-	 *
-	 * @param directoryName Name of directory.
-	 * @param dao
-	 */
-	private FolderListener(String directoryName, CallbackHandlerDao dao) {
-		itemList = new WatchItemList(directoryName, dao);
-	}
-
-	/**
-	 * Starts the thread of the folder listener.
-	 */
-	protected void start() {
-		thread = new Thread(this, getClass().getSimpleName() + "-" + listeners.size());
-		thread.start();
-	}
-
-	/**
-	 * Terminates the thread of the folder listener.
-	 */
-	protected void terminate() {
-		if (thread != null) {
-			LOGGER.debug("Folder listener \"{}\" will be terminate", getDirectoryName());
-			thread.interrupt();
-		}
-	}
-
-	/**
-	 * Returns <b>true</b> if the folder listener thread is running and is alive, otherwise <b>false</b>.
-	 */
-	public boolean isAlive() {
-		return (thread != null ? thread.isAlive() : false);
-	}
-
-	/**
-	 * Returns <b>true</b> if the folder listener is listening the folder.
-	 */
-	public boolean isListen() {
-		return isListen;
-	}
-
-
-	/**
-	 * Returns the list of the file handlers.
-	 */
-	public WatchItemList getItemList() {
-		return itemList;
-	}
-
-	/**
-	 * Returns the full name of directory.
-	 */
-	public String getDirectoryName() {
-		return itemList.getDirectoryFullName();
-	}
-
-	/**
-	 * Waiting for the directory creation and returns <b>true</b> if it exists or created.
-	 * If timeout has expired and directory was not created returns <b>false</b>
-	 */
-	private boolean waitForDirectory() throws InterruptedException {
-		File file = new File(getDirectoryName());
-		if (file.exists()) {
-			return true;
-		} else {
-			LOGGER.trace("Folder listener \"{}\" waiting for the directory creation", getDirectoryName());
-		}
-
-		long expiredTimeMillis = itemList.get(0).getExpiredTimeMillis();
-		while (expiredTimeMillis >= System.currentTimeMillis()) {
-			Thread.sleep(WAIT_DIR_TIMEOUT_MILLIS);
-			if (file.exists()) {
-				return true;
-			}
-		}
-		LOGGER.error("Folder listener \"{}\" error. Timeout has expired and directory does not exist",
-				getDirectoryName());
-		return false;
-	}
-
-	/**
-	 * Initializes the thread of the folder listener. Returns <b>true</b> if the initialization
-	 * completed successfully. Returns <b>false</b> if all the file handlers has been processed
-	 * or initialization fails.
-	 */
-	private boolean init() {
-		LOGGER.trace("Folder listener initializing for \"{}\" ...", getDirectoryName());
-
-		try {
-			if (!waitForDirectory()) {
-				return false;
-			}
-		} catch (InterruptedException e) {
-			LOGGER.debug("Folder listener \"{}\" has been interrupted", getDirectoryName());
-			Thread.currentThread().interrupt();
-			return false;
-		}
-
-		processStatusItems();
-		if (itemList.size() == 0) {
-			LOGGER.debug("Folder listener \"{}\" have no files and will be finished", getDirectoryName());
-			return false;
-		}
-
-		LOGGER.trace("Folder listener has been initialized for \"{}\" ...", getDirectoryName());
-		return true;
-	}
-
-	/**
-	 * Process all the file handlers if need and removes all expired, processed or interrupted
-	 * the file handlers from the list of the file handlers.
-	 */
-	private void processStatusItems() {
-		int i = 0;
-
-		if (itemList.size() > 0) {
-			expiredIdleMillis = 0;
-		}
-		itemList.processItemAll();
-
-		synchronized (itemList) {
-			while (i < itemList.size()) {
-				final WatchItem item = itemList.get(i);
-				final ItemStatus status = item.getStatus();
-				final String uuid = item.getFileHandlerCallback().getUUID();
-
-				switch (status) {
-					case WAIT_FOR_FILE:
-					case FILE_CAPTURED:
-					case INPROGRESS:
-						// Skip
-						i++;
-						continue;
-					case TIMEOUT_EXPIRED:
-						LOGGER.warn("Folder listener \"{}\" remove expired file handler for UUID {}", getDirectoryName
-								(), uuid);
-						try {
-							item.getFileHandlerCallback().handleError("Request timeout expired");
-						} catch (Exception e) {
-							LOGGER.error("Folder listener \"{}\" caused exception for UUID {}", getDirectoryName(),
-									uuid, e);
-						}
-						break;
-					case IS_DONE:
-						if (item.getFutureResult()) {
-							LOGGER.trace("Folder listener \"{}\" remove processed file handler for UUID {}, handler " +
-									"result is {}", getDirectoryName(), uuid, item.getFutureResult());
-						} else {
-							LOGGER.warn("Folder listener \"{}\" remove processed file handler for UUID {}, handler " +
-									"result is {}", getDirectoryName(), uuid, item.getFutureResult());
-						}
-						break;
-					case IS_CANCELED:
-						LOGGER.debug("Folder listener \"{}\" remove canceled file handler for UUID {}",
-								getDirectoryName(), uuid);
-						break;
-					case IS_FAILED:
-						LOGGER.warn("Folder listener \"{}\" remove failed file handler for UUID {}", getDirectoryName
-								(), uuid);
-						break;
-					case IS_INTERRUPTED:
-						LOGGER.debug("Folder listener \"{}\" remove iterrupted file handler for UUID {}",
-								getDirectoryName(), uuid);
-						break;
-					default:
-						continue;
-				}
-				itemList.remove(i);
-			}
-		}
-
-		if (expiredIdleMillis == 0 && itemList.size() == 0) {
-			expiredIdleMillis = System.currentTimeMillis() + LISTENER_IDLE_TIMEOUT_MILLLIS;
-		}
-	}
-
-	/**
-	 * Removes the listener from the list of folder listeners if the the file handler list is empty
-	 * and idle time has expired or if <b>force</b> flag has been set to <b>true</b>.
-	 *
-	 * @param force the flag of remove the folder listener immediately.
-	 * @return <b>true</b> if the folder listener has been removed otherwise <b>false</>.
-	 */
-	private boolean removeListener(boolean force) {
-		synchronized (listeners) {
-			if (force || (expiredIdleMillis != 0 && expiredIdleMillis < System.currentTimeMillis())) {
-				for (int i = 0; i < listeners.size(); i++) {
-					if (listeners.get(i) == this) {
-						isListen = false;
-						listeners.remove(i);
-						LOGGER.debug("Folder listener \"{}\" has been removed from pool", getDirectoryName());
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Find and return the list of files to process.
-	 */
-	private String[] getNewFiles() {
-		File dir = new File(getDirectoryName());
-		return dir.list((File dir1, String name) -> {
-			if (name.toLowerCase().endsWith(JSON_EXTENSION)) {
-				WatchItem item = itemList.getItem(name);
-				return (item != null && item.getStatus() == ItemStatus.WAIT_FOR_FILE);
-			}
-			return false;
-		});
-	}
-
-	/**
-	 * Waiting for files and process it.
-	 */
-	private void pollFile() {
-		try {
-			isListen = true;
-			while (true) {
-				String[] fileList = getNewFiles();
-				if (fileList != null) {
-					for (String fileName : fileList) {
-						LOGGER.trace("Folder listener \"{}\" handes the file {}", getDirectoryName(), fileName);
-						processItem(fileName);
-					}
-				}
-
-				processStatusItems();
-				if (removeListener(false)) {
-					LOGGER.debug("Folder listener \"{}\" have no files and will be finished", getDirectoryName());
-					break;
-				}
-				Thread.sleep(LISTENER_TIMEOUT_MILLLIS);
-			}
-		} catch (InterruptedException e) {
-			removeListener(true);
-			LOGGER.debug("Folder listener \"{}\" has been interrupted", getDirectoryName());
-			Thread.currentThread().interrupt();
-		} catch (Exception e) {
-			removeListener(true);
-			LOGGER.error("Folder listener for \"{}\" closed with error.", getDirectoryName(), e);
-			throw new DlabException("Folder listener for \"" + getDirectoryName() + "\" closed with error. " + e
-					.getLocalizedMessage(), e);
-		}
-	}
-
-	private void processItem(String fileName) {
-		try {
-			WatchItem item = itemList.getItem(fileName);
-			item.setFileName(fileName);
-			if (itemList.processItem(item)) {
-				LOGGER.debug("Folder listener \"{}\" processes the file {}", getDirectoryName(),
-						fileName);
-			}
-		} catch (Exception e) {
-			LOGGER.warn("Folder listener \"{}\" has got exception for check or process the file {}",
-					getDirectoryName(), fileName, e);
-		}
-	}
-
-	@Override
-	public void run() {
-		if (init()) {
-			pollFile();
-		} else {
-			LOGGER.warn("Folder listener has not been initialized for \"{}\"", getDirectoryName());
-			removeListener(true);
-		}
-	}
-}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/FolderListenerExecutor.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/FolderListenerExecutor.java
deleted file mode 100644
index 30d8157..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/FolderListenerExecutor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.folderlistener;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import io.dropwizard.util.Duration;
-
-import static com.epam.dlab.backendapi.core.response.folderlistener.FolderListener.listen;
-
-/**
- * Starts asynchronously of waiting for file creation and processing this file.
- */
-@Singleton
-public class FolderListenerExecutor {
-	@Inject
-	private ProvisioningServiceApplicationConfiguration configuration;
-	@Inject
-	private CallbackHandlerDao handlerDao;
-
-	/**
-	 * Starts asynchronously of waiting for file creation and processes this file if the timeout
-	 * has not expired. If timeout has been expired then writes warning message to log file and
-	 * finishes waiting. This method is <b>non-blocking</b>.
-	 *
-	 * @param directory           name of directory for waiting for the file creation.
-	 * @param timeout             timeout for waiting.
-	 * @param fileHandlerCallback handler for the file processing.
-	 */
-	public void start(String directory, Duration timeout, FileHandlerCallback fileHandlerCallback) {
-		CallbackHandlerDao dao = configuration.isHandlersPersistenceEnabled() ? handlerDao : null;
-		listen(directory, fileHandlerCallback, timeout.toMilliseconds(),
-				configuration.getFileLengthCheckDelay().toMilliseconds(), dao);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItem.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItem.java
deleted file mode 100644
index ba72555..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItem.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.core.response.folderlistener;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.google.common.base.MoreObjects;
-import lombok.extern.slf4j.Slf4j;
-
-/** Class to store the file handler for processing.
- */
-@Slf4j
-public class WatchItem implements Comparable<WatchItem> {
-	
-	/** Status of file processing.
-	 * <pre>
-	 * WAIT_FOR_FILE waiting for the file creation.
-	 * TIMEOUT_EXPIRED the timeout expired for the file creation.
-	 * FILE_CAPTURED the file created and handled.
-	 * INPROGRESS the file processing is running.
-	 * IS_DONE the file processing is done. You can check the result of processing {@link WatchItem#getFutureResult()}
-	 * IS_CANCELED the file processing has been canceled.
-	 * IS_INTERRUPTED the file processing has been interrupted.
-	 * IS_FAILED the file processing is failed.
-	 * </pre>
-	 *  */
-	public enum ItemStatus {
-		WAIT_FOR_FILE,
-		TIMEOUT_EXPIRED,
-		FILE_CAPTURED,
-		INPROGRESS,
-		IS_DONE,
-		IS_CANCELED,
-		IS_INTERRUPTED,
-		IS_FAILED
-	}
-	
-	/** File handler for processing. */
-	private final FileHandlerCallback fileHandlerCallback;
-	/** Timeout waiting for the file creation in milliseconds. */
-    private final long timeoutMillis;
-    /** Timeout waiting for the file writing in milliseconds. */
-    private final long fileLengthCheckDelay;
-
-    /** Time when expired for the file creation in milliseconds. */
-    private long expiredTimeMillis;
-    /** File name. */
-	private String fileName;
-	/** Future for asynchronously the file processing. */
-	private CompletableFuture<Boolean> future;
-	/** Result of the file processing. */
-	private Boolean futureResult = null;
-
-	/** Creates instance of the file handler.
-	 * @param fileHandlerCallback File handler for processing.
-	 * @param timeoutMillis Timeout waiting for the file creation in milliseconds.
-	 * @param fileLengthCheckDelay Timeout waiting for the file writing in milliseconds.
-	 */
-	public WatchItem(FileHandlerCallback fileHandlerCallback, long timeoutMillis, long fileLengthCheckDelay) {
-		this.fileHandlerCallback = fileHandlerCallback;
-		this.timeoutMillis = timeoutMillis;
-		this.fileLengthCheckDelay = fileLengthCheckDelay;
-	    setExpiredTimeMillis(timeoutMillis);
-	}
-
-	@Override
-	public int compareTo(WatchItem o) {
-		if (o == null) {
-			return -1;
-		}
-		return (fileHandlerCallback.checkUUID(o.fileHandlerCallback.getUUID()) ?
-					0 : fileHandlerCallback.getUUID().compareTo(o.fileHandlerCallback.getUUID()));
-	}
-	
-	/** Returns the file handler for processing. */
-	public FileHandlerCallback getFileHandlerCallback() {
-		return fileHandlerCallback;
-	}
-	
-	/** Returns the timeout waiting for the file creation in milliseconds. */
-	public long getTimeoutMillis() {
-		return timeoutMillis;
-	}
-
-	/** Returns the timeout waiting for the file writing in milliseconds. */
-	public long getFileLengthCheckDelay() {
-		return fileLengthCheckDelay;
-	}
-
-
-	/** Returns the time when expired for the file creation in milliseconds. */
-	public long getExpiredTimeMillis() {
-		return expiredTimeMillis;
-	}
-	
-	/** Sets time when expired for file creation in milliseconds.
-	 * @param expiredTimeMillis time expired for file creation in milliseconds. */
-	private void setExpiredTimeMillis(long expiredTimeMillis) {
-		this.expiredTimeMillis = System.currentTimeMillis() + expiredTimeMillis;
-	}
-
-	/** Returns the file name. */
-	public String getFileName() {
-		return fileName;
-	}
-
-	/** Sets the file name.
-	 * @param fileName file name.
-	 */
-	protected void setFileName(String fileName) {
-		this.fileName = fileName;
-	}
-
-	/** Returns the status of the file processing.
-	 *  See {@link ItemStatus} for details. */
-    public ItemStatus getStatus() {
-		if (fileName == null) {
-    		return (expiredTimeMillis < System.currentTimeMillis() ? ItemStatus.TIMEOUT_EXPIRED : ItemStatus.WAIT_FOR_FILE); 
-    	} else if (future == null) {
-    		return ItemStatus.FILE_CAPTURED;
-    	} else if (future.isCancelled()) {
-    		return ItemStatus.IS_CANCELED;
-    	}
-    	
-    	if (future.isDone()) {
-    		try {
-				futureResult = future.get();
-				return ItemStatus.IS_DONE;
-			} catch (InterruptedException e) {
-    			Thread.currentThread().interrupt();
-				return ItemStatus.IS_INTERRUPTED;
-			} catch (ExecutionException e) {
-				return ItemStatus.IS_FAILED;
-			}
-    	}
-    	
-    	return ItemStatus.INPROGRESS;
-    }
-
-	/** Returns <b>true</> if the time has expired for the file creation. */
-	public boolean isExpired() {
-		return (fileName == null && expiredTimeMillis < System.currentTimeMillis());
-	}
-
-
-	/** Returns the future for asynchronously the file processing. */
-	public CompletableFuture<Boolean> getFuture() {
-		return future;
-	}
-	
-	/** Sets the future for the file processing.
-	 * @param future completable future for file processing. 
-	 */
-	protected void setFuture(CompletableFuture<Boolean> future) {
-		this.future = future;
-	}
-	
-	/** Returns the result of the file processing. This method is non-blocking and returns <b>true</b>
-	 * or <b>false</b> if the file processing has done, otherwise returns <b>null</b>. */
-	public Boolean getFutureResult() {
-		if (futureResult == null && future != null && future.isDone()) {
-			try {
-				futureResult = future.get();
-			} catch (Exception e) {
-				log.error("Exception occurred during getting result: {}", e.getMessage());
-			}
-		}
-		return futureResult; 
-	}
-	
-	/** Returns the result of the file processing. This method is blocking and returns <b>true</b> or
-	 * <b>false</b> when the file processing has done. */
-	public Boolean getFutureResultSync() throws InterruptedException, ExecutionException {
-		if (futureResult == null && future != null) {
-			futureResult = future.get();
-		}
-		return futureResult;
-	}
-	
-	@Override
-	public String toString() {
-		return MoreObjects.toStringHelper(this)
-				.add("fileHandlerCallback", fileHandlerCallback)
-				.add("timeoutMillis", timeoutMillis)
-				.add("fileLengthCheckDelay", fileLengthCheckDelay)
-				.add("expiredTimeMillis", expiredTimeMillis)
-				.add("fileName", fileName)
-				.add("future", future)
-				.add("futureResult", futureResult)
-				.toString();
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItemList.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItemList.java
deleted file mode 100644
index 25141d9..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItemList.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.core.response.folderlistener;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.response.folderlistener.WatchItem.ItemStatus;
-import com.epam.dlab.backendapi.core.response.handlers.PersistentFileHandler;
-import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
-import io.dropwizard.util.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.nio.file.Paths;
-import java.util.Collections;
-import java.util.Objects;
-import java.util.Vector;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ForkJoinPool;
-
-/**
- * List of the file handlers for processing.
- */
-public class WatchItemList {
-	private static final Logger LOGGER = LoggerFactory.getLogger(WatchItemList.class);
-
-	/**
-	 * Directory name.
-	 */
-	private final String directoryName;
-	/**
-	 * Directory full name.
-	 */
-	private final String directoryFullName;
-	private final CallbackHandlerDao handlerDao;
-
-	/**
-	 * List of the file handlers.
-	 */
-	private final Vector<WatchItem> list = new Vector<>();
-
-	/**
-	 * UUID of the file handler for search.
-	 */
-	private String uuidSearch;
-
-	/**
-	 * File handler for search.
-	 */
-	private final FileHandlerCallback handlerSearch = new FileHandlerCallback() {
-		@Override
-		public String getUUID() {
-			return uuidSearch;
-		}
-
-		@Override
-		public boolean checkUUID(String uuid) {
-			return uuidSearch.equals(uuid);
-		}
-
-		@Override
-		public void handleError(String errorMessage) {
-		}
-
-		@Override
-		public String getUser() {
-			return "DLAB";
-		}
-
-		@Override
-		public boolean handle(String fileName, byte[] content) throws Exception {
-			return false;
-		}
-	};
-
-	/**
-	 * Creates instance of the file handlers for processing.
-	 *
-	 * @param directoryName listener directory name.
-	 * @param handlerDao    data access object for callback handler
-	 */
-	public WatchItemList(String directoryName, CallbackHandlerDao handlerDao) {
-		this.directoryName = directoryName;
-		this.directoryFullName = Paths.get(directoryName).toAbsolutePath().toString();
-		this.handlerDao = handlerDao;
-	}
-
-	/**
-	 * Returns directory name.
-	 */
-	public String getDirectoryName() {
-		return directoryName;
-	}
-
-	/**
-	 * Returns directory full name.
-	 */
-	public String getDirectoryFullName() {
-		return directoryFullName;
-	}
-
-
-	/**
-	 * Appends the file handler to the list and returns it.
-	 *
-	 * @param fileHandlerCallback  File handler for processing.
-	 * @param timeoutMillis        Timeout waiting for the file creation in milliseconds.
-	 * @param fileLengthCheckDelay Timeout waiting for the file writing in milliseconds.
-	 * @return Instance of the file handler.
-	 */
-	public WatchItem append(FileHandlerCallback fileHandlerCallback, long timeoutMillis, long fileLengthCheckDelay) {
-		if (Objects.nonNull(handlerDao)) {
-			handlerDao.upsert(new PersistentFileHandler(fileHandlerCallback, timeoutMillis, directoryName));
-		}
-		WatchItem item = new WatchItem(fileHandlerCallback, timeoutMillis, fileLengthCheckDelay);
-		synchronized (this) {
-			int index = Collections.binarySearch(list, item);
-			if (index < 0) {
-				index = -index;
-				if (index > list.size()) {
-					list.add(item);
-				} else {
-					list.add(index - 1, item);
-				}
-			} else {
-				LOGGER.warn("Handler for UUID {} for folder {} will be replaced. Old item is: {}",
-						fileHandlerCallback.getUUID(), directoryFullName, get(index));
-				list.set(index, item);
-			}
-		}
-		return item;
-	}
-
-	/**
-	 * Appends the file handler to the list for the existing file and returns it. If the file name
-	 * is <b>null</b> this means that file does not exist and equal to call method
-	 * {@link WatchItemList#append(FileHandlerCallback, long, long)}.
-	 *
-	 * @param fileHandlerCallback  File handler for processing.
-	 * @param timeoutMillis        Timeout waiting for the file creation in milliseconds.
-	 * @param fileLengthCheckDelay Timeout waiting for the file writing in milliseconds.
-	 * @param fileName             file name.
-	 * @return Instance of file handler.
-	 */
-	public WatchItem append(FileHandlerCallback fileHandlerCallback, long timeoutMillis, long fileLengthCheckDelay,
-							String fileName) {
-		WatchItem item = append(fileHandlerCallback, timeoutMillis, fileLengthCheckDelay);
-		if (fileName != null) {
-			item.setFileName(fileName);
-		}
-		return item;
-	}
-
-	/**
-	 * Removes the file handler from list.
-	 *
-	 * @param index index of the file handler.
-	 */
-	public void remove(int index) {
-
-		final WatchItem watchItem = list.remove(index);
-		if (Objects.nonNull(handlerDao) && watchItem.getStatus() != ItemStatus.IS_FAILED) {
-			handlerDao.remove(watchItem.getFileHandlerCallback().getId());
-		}
-	}
-
-	/**
-	 * Returns the number of the file handlers in list.
-	 */
-	public int size() {
-		return list.size();
-	}
-
-	/**
-	 * Returns the file handler.
-	 *
-	 * @param index index of the file handler.
-	 */
-	public WatchItem get(int index) {
-		return list.get(index);
-	}
-
-	/**
-	 * Returns the index of the file handler in the list if it is contained in the list,
-	 * otherwise returns (-(insertion point) - 1).
-	 *
-	 * @param uuid UUID of the file handler.
-	 */
-	public int getIndex(String uuid) {
-		uuidSearch = uuid;
-		return Collections.binarySearch(list, new WatchItem(handlerSearch, 0, 0));
-	}
-
-	/**
-	 * Returns the instance of the file handler if it contained in the list,
-	 * otherwise returns <b>null</b>.
-	 */
-	public WatchItem getItem(String fileName) {
-		String uuid = DockerCommands.extractUUID(fileName);
-		int index = getIndex(uuid);
-		if (index < 0) {
-			return null;
-		}
-		return get(index);
-	}
-
-	/**
-	 * Runs asynchronously the file handler in the {@link ForkJoinPool#commonPool()}.
-	 *
-	 * @param item the file handler.
-	 */
-	private void runAsync(WatchItem item) {
-		LOGGER.trace("Process file {} for folder {}", item.getFileName(), directoryFullName);
-		item.setFuture(CompletableFuture.supplyAsync(
-				new AsyncFileHandler(item.getFileName(), getDirectoryName(),
-						item.getFileHandlerCallback(), Duration.milliseconds(item.getFileLengthCheckDelay()))));
-	}
-
-	/**
-	 * Runs the file processing asynchronously if it have status {@link ItemStatus#FILE_CAPTURED} and returns
-	 * <b>true</b>,
-	 * otherwise <b>false</b>.
-	 *
-	 * @param item the file handler.
-	 */
-	public boolean processItem(WatchItem item) {
-		if (item.getStatus() == ItemStatus.FILE_CAPTURED) {
-			runAsync(item);
-			return true;
-		}
-
-		if (item.isExpired()) {
-			LOGGER.warn("Watch time has expired for UUID {} in folder {}", item.getFileHandlerCallback().getUUID(),
-					directoryFullName);
-		}
-		return false;
-	}
-
-	/**
-	 * Checks all the file handlers and runs the file processing for it if have status
-	 * {@link ItemStatus#FILE_CAPTURED}.
-	 */
-	public int processItemAll() {
-		int count = 0;
-		synchronized (list) {
-			for (int i = 0; i < size(); i++) {
-				WatchItem item = list.get(i);
-				if (item.getStatus() == ItemStatus.FILE_CAPTURED && processItem(item)) {
-					count++;
-				}
-			}
-		}
-		if (count > 0) {
-			LOGGER.trace("Starts processing {} files for folder {}", count, directoryName);
-		}
-		return count;
-	}
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/BackupCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/BackupCallbackHandler.java
deleted file mode 100644
index 193d4d7..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/BackupCallbackHandler.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.dto.backup.EnvBackupDTO;
-import com.epam.dlab.dto.backup.EnvBackupStatus;
-import com.epam.dlab.dto.backup.EnvBackupStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.core.Response;
-
-@Slf4j
-public class BackupCallbackHandler implements FileHandlerCallback {
-	private static final ObjectMapper MAPPER = new ObjectMapper()
-			.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
-	private static final String STATUS_FIELD = "status";
-	private static final String BACKUP_FILE_FIELD = "backup_file";
-	private static final String ERROR_MESSAGE_FIELD = "error_message";
-	@JsonProperty
-	private final String uuid;
-	@JsonProperty
-	private final EnvBackupDTO dto;
-	private final RESTService selfService;
-	@JsonProperty
-	private final String callbackUrl;
-	@JsonProperty
-	private final String user;
-
-	@JsonCreator
-	public BackupCallbackHandler(
-			@JacksonInject RESTService selfService,
-			@JsonProperty("callbackUrl") String callbackUrl, @JsonProperty("user") String user,
-			@JsonProperty("dto") EnvBackupDTO dto) {
-		this.selfService = selfService;
-		this.uuid = dto.getId();
-		this.callbackUrl = callbackUrl;
-		this.user = user;
-		this.dto = dto;
-	}
-
-	@Override
-	public String getUUID() {
-		return uuid;
-	}
-
-	@Override
-	public boolean checkUUID(String uuid) {
-		return this.uuid.equals(uuid);
-	}
-
-	@Override
-	public boolean handle(String fileName, byte[] content) throws Exception {
-		final String fileContent = new String(content);
-		log.debug("Got file {} while waiting for UUID {}, backup response: {}", fileName, uuid, fileContent);
-
-		final JsonNode jsonNode = MAPPER.readTree(fileContent);
-		final EnvBackupStatus status = EnvBackupStatus.fromValue(jsonNode.get(STATUS_FIELD).textValue());
-		EnvBackupStatusDTO envBackupStatusDTO;
-		if (EnvBackupStatus.CREATED == status) {
-			envBackupStatusDTO = buildBackupStatusDto(EnvBackupStatus.CREATED)
-					.withBackupFile(jsonNode.get(BACKUP_FILE_FIELD).textValue());
-		} else {
-			envBackupStatusDTO = buildBackupStatusDto(EnvBackupStatus.FAILED)
-					.withErrorMessage(jsonNode.get(ERROR_MESSAGE_FIELD).textValue());
-		}
-		selfServicePost(envBackupStatusDTO);
-		return EnvBackupStatus.CREATED == status;
-	}
-
-	private void selfServicePost(EnvBackupStatusDTO statusDTO) {
-		log.debug("Send post request to self service {} for UUID {}, object is {}", uuid, statusDTO);
-		try {
-			selfService.post(callbackUrl, statusDTO, Response.class);
-		} catch (Exception e) {
-			log.error("Send request or response error for UUID {}: {}", uuid, e.getLocalizedMessage(), e);
-			throw new DlabException("Send request or response error for UUID " + uuid + ": " + e.getLocalizedMessage()
-					, e);
-		}
-	}
-
-	@Override
-	public void handleError(String errorMessage) {
-		buildBackupStatusDto(EnvBackupStatus.FAILED)
-				.withErrorMessage(errorMessage);
-	}
-
-	@Override
-	public String getUser() {
-		return user;
-	}
-
-	protected EnvBackupStatusDTO buildBackupStatusDto(EnvBackupStatus status) {
-		return new EnvBackupStatusDTO()
-				.withRequestId(uuid)
-				.withEnvBackupDTO(dto)
-				.withStatus(status)
-				.withUser(user);
-	}
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/CheckInactivityCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/CheckInactivityCallbackHandler.java
deleted file mode 100644
index 6269c9f..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/CheckInactivityCallbackHandler.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.computational.CheckInactivityStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.core.Response;
-
-@Slf4j
-@Singleton
-public class CheckInactivityCallbackHandler implements FileHandlerCallback {
-	private static final ObjectMapper MAPPER = new ObjectMapper()
-			.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
-	private static final String STATUS_FIELD = "status";
-	private static final String ERROR_MESSAGE_FIELD = "error_message";
-	private static final String RESPONSE = "response";
-	private static final String OK_STATUS_STRING = "ok";
-	private static final String RESULT_NODE = "result";
-	@JsonProperty
-	private final String uuid;
-	private final RESTService selfService;
-	@JsonProperty
-	private final String callbackUrl;
-	@JsonProperty
-	private final String user;
-	@JsonProperty
-	private final String exploratoryName;
-	@JsonProperty
-	private final String computationalName;
-
-	@JsonCreator
-	public CheckInactivityCallbackHandler(@JacksonInject RESTService selfService,
-										  @JsonProperty("callbackUrl") String callbackUrl,
-										  @JsonProperty("user") String user, String uuid, String exploratoryName,
-										  String computationalName) {
-		this.selfService = selfService;
-		this.uuid = uuid;
-		this.callbackUrl = callbackUrl;
-		this.user = user;
-		this.exploratoryName = exploratoryName;
-		this.computationalName = computationalName;
-	}
-
-	public CheckInactivityCallbackHandler(RESTService selfService,
-										  String callbackUrl, String user, String uuid, String exploratoryName) {
-		this(selfService, callbackUrl, user, uuid, exploratoryName, null);
-	}
-
-	@Override
-	public String getUUID() {
-		return uuid;
-	}
-
-	@Override
-	public boolean checkUUID(String uuid) {
-		return this.uuid.equals(uuid);
-	}
-
-	@Override
-	@SuppressWarnings("unchecked")
-	public boolean handle(String fileName, byte[] content) throws Exception {
-		final String fileContent = new String(content);
-		log.debug("Got file {} while waiting for UUID {}, check inactivity resources response: {}", fileName, uuid,
-				fileContent);
-
-		final JsonNode treeNode = MAPPER.readTree(fileContent);
-		final String status = treeNode.get(STATUS_FIELD).textValue();
-		CheckInactivityStatusDTO checkInactivityStatusDTO = OK_STATUS_STRING.equals(status) ?
-				getOkStatusDto(treeNode) : getFailedStatusDto(treeNode.get(ERROR_MESSAGE_FIELD).textValue());
-		selfServicePost(checkInactivityStatusDTO);
-		return OK_STATUS_STRING.equals(status);
-	}
-
-	@Override
-	public void handleError(String errorMessage) {
-		log.error(errorMessage);
-		selfServicePost(getFailedStatusDto(errorMessage).withErrorMessage(errorMessage));
-	}
-
-	@Override
-	public String getUser() {
-		return user;
-	}
-
-	private CheckInactivityStatusDTO getOkStatusDto(JsonNode jsonNode) {
-		final CheckInactivityStatusDTO statusDTO = new CheckInactivityStatusDTO().withStatus(OK_STATUS_STRING)
-				.withRequestId(uuid);
-		statusDTO.setComputationalName(computationalName);
-		statusDTO.setExploratoryName(exploratoryName);
-		final long lastActivity = Long.parseLong(jsonNode.get(RESPONSE).get(RESULT_NODE).textValue());
-		statusDTO.setLastActivityUnixTime(lastActivity);
-		return statusDTO;
-	}
-
-	private CheckInactivityStatusDTO getFailedStatusDto(String errorMessage) {
-		return new CheckInactivityStatusDTO().withStatus(UserInstanceStatus.FAILED)
-				.withRequestId(uuid)
-				.withErrorMessage(errorMessage);
-	}
-
-	private void selfServicePost(CheckInactivityStatusDTO statusDTO) {
-		log.debug("Send post request to self service for UUID {}, object is {}", uuid, statusDTO);
-		try {
-			selfService.post(callbackUrl, statusDTO, Response.class);
-		} catch (Exception e) {
-			log.error("Send request or response error for UUID {}: {}", uuid, e.getLocalizedMessage(), e);
-			throw new DlabException("Send request or response error for UUID " + uuid + ": "
-					+ e.getLocalizedMessage(), e);
-		}
-	}
-
-}
-
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalCallbackHandler.java
deleted file mode 100644
index 877cc5a..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalCallbackHandler.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.dto.ResourceURL;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.epam.dlab.dto.computational.ComputationalStatusDTO;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonNode;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.IOException;
-import java.time.Instant;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
-
-@Slf4j
-public class ComputationalCallbackHandler extends ResourceCallbackHandler<ComputationalStatusDTO> {
-	private static final String INSTANCE_ID_FIELD = "instance_id";
-	private static final String COMPUTATIONAL_ID_FIELD = "hostname";
-	private static final String COMPUTATIONAL_URL_FIELD = "computational_url";
-
-	@JsonProperty
-	private final ComputationalBase<?> dto;
-	private ComputationalConfigure computationalConfigure;
-
-	@JsonCreator
-	public ComputationalCallbackHandler(@JacksonInject ComputationalConfigure computationalConfigure,
-										@JacksonInject RESTService selfService,
-										@JsonProperty("action") DockerAction action,
-										@JsonProperty("uuid") String uuid,
-										@JsonProperty("dto") ComputationalBase<?> dto) {
-
-		super(selfService, dto.getCloudSettings().getIamUser(), uuid, action);
-		this.computationalConfigure = computationalConfigure;
-		this.dto = dto;
-	}
-
-	protected ComputationalBase<?> getDto() {
-		return dto;
-	}
-
-	@Override
-	protected String getCallbackURI() {
-		return ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI;
-	}
-
-	@Override
-	protected ComputationalStatusDTO parseOutResponse(JsonNode resultNode, ComputationalStatusDTO baseStatus) {
-		if (resultNode == null) {
-			return baseStatus;
-		}
-		baseStatus.withComputationalUrl(extractUrl(resultNode));
-		baseStatus.withLastActivity(Date.from(Instant.now()));
-
-		if (DockerAction.CREATE == getAction()) {
-			baseStatus
-					.withInstanceId(instanceId(resultNode.get(INSTANCE_ID_FIELD)))
-					.withComputationalId(getTextValue(resultNode.get(COMPUTATIONAL_ID_FIELD)));
-			if (UserInstanceStatus.of(baseStatus.getStatus()) == UserInstanceStatus.RUNNING) {
-				baseStatus.withStatus(UserInstanceStatus.CONFIGURING);
-				computationalConfigure.configure(getUUID(), getDto());
-			}
-		}
-		return baseStatus;
-	}
-
-	@Override
-	protected ComputationalStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
-		return super.getBaseStatusDTO(status)
-                .withExploratoryName(dto.getExploratoryName())
-                .withComputationalName(dto.getComputationalName())
-                .withProject(dto.getProject());
-	}
-
-	private String instanceId(JsonNode jsonNode) {
-		if (jsonNode != null && jsonNode.isArray()) {
-			return StreamSupport.stream(jsonNode.spliterator(), false)
-					.map(JsonNode::textValue)
-					.collect(Collectors.joining(";"));
-		} else {
-			return getTextValue(jsonNode);
-		}
-
-	}
-
-	private List<ResourceURL> extractUrl(JsonNode resultNode) {
-		final JsonNode nodeUrl = resultNode.get(COMPUTATIONAL_URL_FIELD);
-		return Optional.ofNullable(nodeUrl)
-				.map(this::getUrls)
-				.orElse(Collections.emptyList());
-	}
-
-	private List<ResourceURL> getUrls(JsonNode nodeUrl) {
-		try {
-			return mapper.readValue(nodeUrl.toString(), new TypeReference<List<ResourceURL>>() {
-			});
-		} catch (IOException e) {
-			log.warn("Cannot parse field {} for UUID {} in JSON", RESPONSE_NODE + "." + RESULT_NODE + "." +
-					COMPUTATIONAL_URL_FIELD, getUUID(), e);
-		}
-		return Collections.emptyList();
-	}
-}
-
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigure.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigure.java
deleted file mode 100644
index b2aee18..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigure.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.CommandBuilder;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.aws.computational.SparkComputationalCreateAws;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.epam.dlab.dto.gcp.computational.SparkComputationalCreateGcp;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Objects;
-
-import static com.epam.dlab.backendapi.core.commands.DockerAction.CONFIGURE;
-
-@Slf4j
-@Singleton
-public class ComputationalConfigure implements DockerCommands {
-	@Inject
-	private ProvisioningServiceApplicationConfiguration configuration;
-	@Inject
-	private FolderListenerExecutor folderListenerExecutor;
-	@Inject
-	private ICommandExecutor commandExecutor;
-	@Inject
-	private CommandBuilder commandBuilder;
-	@Inject
-	private RESTService selfService;
-
-	public String configure(String uuid, ComputationalBase<?> dto) {
-		switch (configuration.getCloudProvider()) {
-			case AWS:
-				if (dto instanceof SparkComputationalCreateAws) {
-					return runConfigure(uuid, dto, DataEngineType.SPARK_STANDALONE);
-				} else {
-					return runConfigure(uuid, dto, DataEngineType.CLOUD_SERVICE);
-				}
-			case AZURE:
-				return runConfigure(uuid, dto, DataEngineType.SPARK_STANDALONE);
-			case GCP:
-				if (dto instanceof SparkComputationalCreateGcp) {
-					return runConfigure(uuid, dto, DataEngineType.SPARK_STANDALONE);
-				} else {
-					return runConfigure(uuid, dto, DataEngineType.CLOUD_SERVICE);
-				}
-
-			default:
-				throw new IllegalStateException(String.format("Wrong configuration of cloud provider %s %s",
-						configuration.getCloudProvider(), dto));
-		}
-	}
-
-	private String runConfigure(String uuid, ComputationalBase<?> dto, DataEngineType dataEngineType) {
-		log.debug("Configure computational resources {} for user {}: {}", dto.getComputationalName(), dto
-				.getEdgeUserName(), dto);
-		folderListenerExecutor.start(
-				configuration.getImagesDirectory(),
-				configuration.getResourceStatusPollTimeout(),
-				getFileHandlerCallback(CONFIGURE, uuid, dto));
-		try {
-			RunDockerCommand runDockerCommand = new RunDockerCommand()
-					.withInteractive()
-					.withName(nameContainer(dto.getEdgeUserName(), CONFIGURE,
-							dto.getExploratoryName(), dto.getComputationalName()))
-					.withVolumeForRootKeys(configuration.getKeyDirectory())
-					.withVolumeForResponse(configuration.getImagesDirectory())
-					.withVolumeForLog(configuration.getDockerLogDirectory(), dataEngineType.getName())
-					.withResource(dataEngineType.getName())
-					.withRequestId(uuid)
-					.withConfKeyName(configuration.getAdminKey())
-					.withActionConfigure(getImageConfigure(dto.getApplicationName(), dataEngineType));
-			if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-					Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-					!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-				runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-			}
-
-			commandExecutor.executeAsync(
-					dto.getEdgeUserName(),
-					uuid,
-					commandBuilder.buildCommand(runDockerCommand, dto));
-		} catch (Exception t) {
-			throw new DlabException("Could not configure computational resource cluster", t);
-		}
-		return uuid;
-	}
-
-	private FileHandlerCallback getFileHandlerCallback(DockerAction action, String originalUuid, ComputationalBase<?>
-			dto) {
-		return new ComputationalConfigureCallbackHandler(selfService, action, originalUuid, dto);
-	}
-
-	private String nameContainer(String user, DockerAction action, String exploratoryName, String name) {
-		return nameContainer(user, action.toString(), "computational", exploratoryName, name);
-	}
-
-	private String getImageConfigure(String application, DataEngineType dataEngineType) {
-		String imageName = DataEngineType.getDockerImageName(dataEngineType);
-		int pos = imageName.indexOf('-');
-		if (pos > 0) {
-			return imageName.substring(0, pos + 1) + application;
-		}
-		throw new DlabException("Could not describe the image name for computational resources from image " +
-				imageName + " and application " + application);
-	}
-
-	public String getResourceType() {
-		return Directories.DATA_ENGINE_SERVICE_LOG_DIRECTORY;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java
deleted file mode 100644
index 8d6e794..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ComputationalConfigureCallbackHandler.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.epam.dlab.dto.computational.ComputationalStatusDTO;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.time.Instant;
-import java.util.Date;
-
-public class ComputationalConfigureCallbackHandler extends ResourceCallbackHandler<ComputationalStatusDTO> {
-
-	@JsonProperty
-	private final ComputationalBase<?> dto;
-
-	@JsonCreator
-	public ComputationalConfigureCallbackHandler(@JacksonInject RESTService selfService,
-												 @JsonProperty("action") DockerAction action,
-												 @JsonProperty("uuid") String uuid,
-												 @JsonProperty("dto") ComputationalBase<?> dto) {
-		super(selfService, dto.getCloudSettings().getIamUser(), uuid, action);
-		this.dto = dto;
-	}
-
-	@Override
-	protected String getCallbackURI() {
-		return ApiCallbacks.COMPUTATIONAL + ApiCallbacks.STATUS_URI;
-	}
-
-	@Override
-	protected ComputationalStatusDTO parseOutResponse(JsonNode resultNode, ComputationalStatusDTO baseStatus) {
-		return baseStatus
-				.withExploratoryName(dto.getExploratoryName())
-				.withComputationalName(dto.getComputationalName())
-				.withProject(dto.getProject())
-				.withUptime(null)
-				.withLastActivity(Date.from(Instant.now()));
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/EdgeCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/EdgeCallbackHandler.java
deleted file mode 100644
index d869e58..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/EdgeCallbackHandler.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.epam.dlab.dto.base.keyload.UploadFileResult;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.io.IOException;
-
-public class EdgeCallbackHandler<E extends EdgeInfo, T extends UploadFileResult<E>> extends ResourceCallbackHandler<T> {
-	@JsonProperty
-	private final String callbackURI;
-	@JsonProperty
-	private final Class<E> responseType;
-
-	@JsonCreator
-	public EdgeCallbackHandler(
-			@JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action,
-			@JsonProperty("uuid") String uuid, @JsonProperty("user") String user,
-			@JsonProperty("callbackURI") String callbackURI,
-			@JsonProperty("responseType") Class<E> responseType,
-			@JsonProperty("resultType") Class<T> enclosingType) {
-
-		super(selfService, user, uuid, action, enclosingType);
-		this.callbackURI = callbackURI;
-		this.responseType = responseType;
-	}
-
-	@Override
-	protected String getCallbackURI() {
-		return callbackURI;
-	}
-
-	protected T parseOutResponse(JsonNode resultNode, T baseStatus) {
-		if (resultNode != null && getAction() == DockerAction.CREATE
-				&& UserInstanceStatus.of(baseStatus.getStatus()) != UserInstanceStatus.FAILED) {
-			try {
-				E credential = mapper.readValue(resultNode.toString(), responseType);
-				credential.setEdgeStatus(UserInstanceStatus.RUNNING.toString());
-				baseStatus.withEdgeInfo(credential);
-			} catch (IOException e) {
-				throw new DlabException("Cannot parse the EDGE info in JSON: " + e.getLocalizedMessage(), e);
-			}
-		}
-
-		return baseStatus;
-	}
-
-	@Override
-	public void handleError(String errorMessage) {
-		super.handleError("Could not upload the user key: " + errorMessage);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java
deleted file mode 100644
index 047ebf9..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryCallbackHandler.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.dto.ResourceURL;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.exploratory.ExploratoryStatusDTO;
-import com.epam.dlab.rest.client.RESTService;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonNode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.List;
-
-import static com.epam.dlab.rest.contracts.ApiCallbacks.EXPLORATORY;
-import static com.epam.dlab.rest.contracts.ApiCallbacks.STATUS_URI;
-
-public class ExploratoryCallbackHandler extends ResourceCallbackHandler<ExploratoryStatusDTO> {
-	private static final Logger LOGGER = LoggerFactory.getLogger(ExploratoryCallbackHandler.class);
-
-	private static final String INSTANCE_ID_FIELD = "instance_id";
-	private static final String EXPLORATORY_ID_FIELD = "notebook_name";
-	private static final String EXPLORATORY_PRIVATE_IP_FIELD = "ip";
-	private static final String EXPLORATORY_URL_FIELD = "exploratory_url";
-	private static final String EXPLORATORY_USER_FIELD = "exploratory_user";
-	private static final String EXPLORATORY_PASSWORD_FIELD = "exploratory_pass";
-
-	@JsonProperty
-	private final String exploratoryName;
-	private final String project;
-
-	@JsonCreator
-	public ExploratoryCallbackHandler(@JacksonInject RESTService selfService,
-									  @JsonProperty("action") DockerAction action,
-									  @JsonProperty("uuid") String uuid, @JsonProperty("user") String user,
-									  String project, @JsonProperty("exploratoryName") String exploratoryName) {
-		super(selfService, user, uuid, action);
-		this.exploratoryName = exploratoryName;
-		this.project = project;
-	}
-
-	@Override
-	protected String getCallbackURI() {
-		return EXPLORATORY + STATUS_URI;
-	}
-
-	@Override
-	protected ExploratoryStatusDTO parseOutResponse(JsonNode resultNode, ExploratoryStatusDTO baseStatus) {
-		if (resultNode == null) {
-			return baseStatus;
-		}
-		final JsonNode nodeUrl = resultNode.get(EXPLORATORY_URL_FIELD);
-		List<ResourceURL> url = null;
-		if (nodeUrl != null) {
-			try {
-				url = mapper.readValue(nodeUrl.toString(), new TypeReference<List<ResourceURL>>() {
-				});
-			} catch (IOException e) {
-				LOGGER.warn("Cannot parse field {} for UUID {} in JSON",
-						RESPONSE_NODE + "." + RESULT_NODE + "." + EXPLORATORY_URL_FIELD, getUUID(), e);
-			}
-		}
-
-		String exploratoryId = getTextValue(resultNode.get(EXPLORATORY_ID_FIELD));
-		if (getAction() == DockerAction.CREATE && exploratoryId == null) {
-			LOGGER.warn("Empty field {} for UUID {} in JSON", String.format("%s.%s.%s", RESPONSE_NODE, RESULT_NODE,
-					EXPLORATORY_ID_FIELD), getUUID());
-		}
-
-		return baseStatus
-				.withInstanceId(getTextValue(resultNode.get(INSTANCE_ID_FIELD)))
-				.withExploratoryId(exploratoryId)
-				.withExploratoryUrl(url)
-				.withPrivateIp(getTextValue(resultNode.get(EXPLORATORY_PRIVATE_IP_FIELD)))
-				.withExploratoryUser(getTextValue(resultNode.get(EXPLORATORY_USER_FIELD)))
-				.withExploratoryPassword(getTextValue(resultNode.get(EXPLORATORY_PASSWORD_FIELD)));
-	}
-
-	@Override
-	protected ExploratoryStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
-		return super.getBaseStatusDTO(status)
-				.withExploratoryName(exploratoryName)
-				.withProject(project);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java
deleted file mode 100644
index b6857e5..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ExploratoryGitCredsCallbackHandler.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.exploratory.ExploratoryStatusDTO;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.JsonNode;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class ExploratoryGitCredsCallbackHandler extends ResourceCallbackHandler<ExploratoryStatusDTO> {
-
-	@JsonProperty
-	private final String exploratoryName;
-
-	@JsonCreator
-	public ExploratoryGitCredsCallbackHandler(@JacksonInject RESTService selfService,
-											  @JsonProperty("action") DockerAction action,
-											  @JsonProperty("uuid") String uuid,
-											  @JsonProperty("user") String user,
-											  @JsonProperty("exploratoryName") String exploratoryName) {
-		super(selfService, user, uuid, action);
-		this.exploratoryName = exploratoryName;
-	}
-
-	@Override
-	protected String getCallbackURI() {
-		return ApiCallbacks.GIT_CREDS;
-	}
-
-	@Override
-	protected ExploratoryStatusDTO parseOutResponse(JsonNode resultNode, ExploratoryStatusDTO baseStatus) {
-		log.trace("Parse GIT Creds: {}", resultNode);
-		return baseStatus;
-	}
-
-	@Override
-	protected ExploratoryStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
-		return super.getBaseStatusDTO(status)
-				.withExploratoryName(exploratoryName);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java
deleted file mode 100644
index dbbc535..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ImageCreateCallbackHandler.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.exploratory.ExploratoryImageDTO;
-import com.epam.dlab.dto.exploratory.ImageCreateStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.JsonNode;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.IOException;
-
-@Slf4j
-public class ImageCreateCallbackHandler extends ResourceCallbackHandler<ImageCreateStatusDTO> {
-	@JsonProperty
-	private final String imageName;
-	@JsonProperty
-	private final String exploratoryName;
-	@JsonProperty
-	private final String project;
-	@JsonProperty
-	private final String endpoint;
-
-	public ImageCreateCallbackHandler(RESTService selfService, String uuid, DockerAction action,
-			ExploratoryImageDTO image) {
-		super(selfService, image.getCloudSettings().getIamUser(), uuid, action);
-		this.imageName = image.getImageName();
-		this.exploratoryName = image.getExploratoryName();
-		this.project = image.getProject();
-		this.endpoint = image.getEndpoint();
-	}
-
-	@JsonCreator
-	private ImageCreateCallbackHandler(
-			@JacksonInject RESTService selfService, @JsonProperty("uuid") String uuid,
-			@JsonProperty("action") DockerAction action,
-			@JsonProperty("user") String user,
-			@JsonProperty("imageName") String imageName,
-			@JsonProperty("exploratoryName") String exploratoryName,
-			@JsonProperty("project") String projectName,
-			@JsonProperty("endpoint") String endpoint) {
-		super(selfService, user, uuid, action);
-		this.imageName = imageName;
-		this.exploratoryName = exploratoryName;
-		this.project = projectName;
-		this.endpoint = endpoint;
-	}
-
-	@Override
-	protected String getCallbackURI() {
-		return ApiCallbacks.IMAGE_STATUS_URI;
-	}
-
-	@Override
-	protected ImageCreateStatusDTO parseOutResponse(JsonNode document, ImageCreateStatusDTO statusDTO) {
-		if (document != null) {
-			statusDTO.withImageCreateDto(toImageCreateDto(document.toString()));
-		}
-		return statusDTO;
-	}
-
-	@Override
-	protected ImageCreateStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
-		final ImageCreateStatusDTO statusDTO = super.getBaseStatusDTO(status);
-		statusDTO.setExploratoryName(exploratoryName);
-		statusDTO.setName(imageName);
-		statusDTO.setProject(project);
-		statusDTO.setEndpoint(endpoint);
-		statusDTO.withoutImageCreateDto();
-		return statusDTO;
-	}
-
-	private ImageCreateStatusDTO.ImageCreateDTO toImageCreateDto(String content) {
-		try {
-			return mapper.readValue(content, ImageCreateStatusDTO.ImageCreateDTO.class);
-		} catch (IOException e) {
-			log.error("Can't parse create image response with content {} for uuid {}", content, getUUID());
-			throw new DlabException(String.format("Can't parse create image response with content %s for uuid %s",
-					content, getUUID()), e);
-		}
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibInstallCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibInstallCallbackHandler.java
deleted file mode 100644
index 8d46b60..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibInstallCallbackHandler.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import com.epam.dlab.dto.exploratory.LibInstallStatusDTO;
-import com.epam.dlab.dto.exploratory.LibraryInstallDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonNode;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.IOException;
-import java.time.Instant;
-import java.util.Date;
-import java.util.List;
-
-/**
- * Handler of docker response for the request for libraries installation.
- */
-@Slf4j
-public class LibInstallCallbackHandler extends ResourceCallbackHandler<LibInstallStatusDTO> {
-
-	/**
-	 * Name of node in response "Libs".
-	 */
-	private static final String LIBS = "Libs";
-
-	/**
-	 * Full name of node in response "Libs".
-	 */
-	private static final String LIBS_ABSOLUTE_PATH = RESPONSE_NODE + "." + RESULT_NODE + "." + LIBS;
-
-	/**
-	 * Exploratory DTO.
-	 */
-	@JsonProperty
-	private final LibraryInstallDTO dto;
-
-	/**
-	 * Instantiate handler for process of docker response for libraries installation.
-	 *
-	 * @param selfService REST pointer for Self Service.
-	 * @param action      docker action.
-	 * @param uuid        request UID.
-	 * @param dto         contains libraries to instal
-	 */
-	@JsonCreator
-	public LibInstallCallbackHandler(
-			@JacksonInject RESTService selfService,
-			@JsonProperty("action") DockerAction action,
-			@JsonProperty("uuid") String uuid, @JsonProperty("user") String user,
-			@JsonProperty("dto") LibraryInstallDTO dto) {
-		super(selfService, user, uuid, action);
-		this.dto = dto;
-	}
-
-	@Override
-	protected String getCallbackURI() {
-		return ApiCallbacks.LIB_STATUS_URI;
-	}
-
-	@Override
-	protected LibInstallStatusDTO parseOutResponse(JsonNode resultNode, LibInstallStatusDTO status) {
-
-		if (UserInstanceStatus.FAILED == UserInstanceStatus.of(status.getStatus()) || resultNode == null) {
-			throw new DlabException("Can't handle response result node is null or response status is failed");
-		}
-
-		JsonNode nodeLibs = resultNode.get(LIBS);
-		if (nodeLibs == null) {
-			throw new DlabException("Can't handle response without property " + LIBS_ABSOLUTE_PATH);
-		}
-		try {
-			final List<LibInstallDTO> libs = mapper.readValue(nodeLibs.toString(),
-					new TypeReference<List<LibInstallDTO>>() {
-					});
-			status.withLibs(libs);
-		} catch (IOException e) {
-			log.warn("Can't parse field {} for UUID {} in JSON", LIBS_ABSOLUTE_PATH, getUUID(), e);
-		}
-
-		return status;
-	}
-
-	@Override
-	protected LibInstallStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
-		return super.getBaseStatusDTO(status)
-				.withExploratoryName(dto.getExploratoryName())
-				.withComputationalName(dto.getComputationalName())
-				.withProject(dto.getProject())
-				.withUptime(Date.from(Instant.now()));
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java
deleted file mode 100644
index ca0268c..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/LibListCallbackHandler.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.exploratory.LibListStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-/**
- * Handler of docker response for the request the list of libraries.
- */
-public class LibListCallbackHandler extends ResourceCallbackHandler<LibListStatusDTO> {
-
-	/**
-	 * Name of node in response "file".
-	 */
-	private static final String FILE = "file";
-
-	/**
-	 * The name of docker image.
-	 */
-	@JsonProperty
-	private final String imageName;
-
-	/**
-	 * Instantiate handler for process of docker response for list of libraries.
-	 *
-	 * @param selfService REST pointer for Self Service.
-	 * @param action      docker action.
-	 * @param uuid        request UID.
-	 * @param user        the name of user.
-	 * @param imageName   the name of docker image.
-	 */
-	@JsonCreator
-	public LibListCallbackHandler(
-			@JacksonInject RESTService selfService, @JsonProperty("action") DockerAction action,
-			@JsonProperty("uuid") String uuid, @JsonProperty("user") String user,
-			@JsonProperty("imageName") String imageName) {
-		super(selfService, user, uuid, action);
-		this.imageName = imageName;
-	}
-
-	@Override
-	protected String getCallbackURI() {
-		return ApiCallbacks.UPDATE_LIBS_URI;
-	}
-
-	@Override
-	protected LibListStatusDTO parseOutResponse(JsonNode resultNode, LibListStatusDTO status) {
-		if (UserInstanceStatus.FAILED == UserInstanceStatus.of(status.getStatus())) {
-			return status;
-		}
-		if (resultNode == null) {
-			throw new DlabException("Can't handle response result node is null");
-		}
-
-		JsonNode resultFileNode = resultNode.get(FILE);
-		if (resultFileNode == null) {
-			throw new DlabException("Can't handle response without property " + FILE);
-		}
-
-		Path path = Paths.get(resultFileNode.asText()).toAbsolutePath();
-		if (path.toFile().exists()) {
-			try {
-				status.withLibs(new String(Files.readAllBytes(path)));
-				Files.delete(path);
-				return status;
-			} catch (IOException e) {
-				throw new DlabException("Can't read file " + path + " : " + e.getLocalizedMessage(), e);
-			}
-		} else {
-			throw new DlabException("Can't handle response. The file " + path + " does not exist");
-		}
-	}
-
-	@Override
-	protected LibListStatusDTO getBaseStatusDTO(UserInstanceStatus status) {
-		return super.getBaseStatusDTO(status)
-				.withImageName(imageName);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/PersistentFileHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/PersistentFileHandler.java
deleted file mode 100644
index 6cac2db..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/PersistentFileHandler.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-public final class PersistentFileHandler {
-
-	private final FileHandlerCallback handler;
-	private final long timeout;
-	private final String directory;
-
-	@JsonCreator
-	public PersistentFileHandler(@JsonProperty("handler") FileHandlerCallback handler, @JsonProperty("timeout")
-			long timeout, @JsonProperty("directory") String directory) {
-		this.handler = handler;
-		this.timeout = timeout;
-		this.directory = directory;
-	}
-
-	public FileHandlerCallback getHandler() {
-		return handler;
-	}
-
-	public long getTimeout() {
-		return timeout;
-	}
-
-	public String getDirectory() {
-		return directory;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ProjectCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ProjectCallbackHandler.java
deleted file mode 100644
index d25a2e1..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ProjectCallbackHandler.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.epam.dlab.dto.base.project.ProjectResult;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.io.IOException;
-
-public class ProjectCallbackHandler extends ResourceCallbackHandler<ProjectResult> {
-
-
-	private final String callbackUri;
-	private final String projectName;
-	private final Class<? extends EdgeInfo> clazz;
-	private final String endpointName;
-
-	public ProjectCallbackHandler(RESTService selfService, String user,
-								  String uuid, DockerAction action, String callbackUri, String projectName,
-								  Class<? extends EdgeInfo> clazz, String endpointName) {
-		super(selfService, user, uuid, action);
-		this.callbackUri = callbackUri;
-		this.projectName = projectName;
-		this.clazz = clazz;
-		this.endpointName = endpointName;
-	}
-
-	@Override
-	protected String getCallbackURI() {
-		return callbackUri;
-	}
-
-	@Override
-	protected ProjectResult parseOutResponse(JsonNode resultNode, ProjectResult baseStatus) {
-		baseStatus.setProjectName(projectName);
-		baseStatus.setEndpointName(endpointName);
-		if (resultNode != null && getAction() == DockerAction.CREATE
-				&& UserInstanceStatus.of(baseStatus.getStatus()) != UserInstanceStatus.FAILED) {
-			try {
-				final EdgeInfo projectEdgeInfo = mapper.readValue(resultNode.toString(), clazz);
-				baseStatus.setEdgeInfo(projectEdgeInfo);
-			} catch (IOException e) {
-				throw new DlabException("Cannot parse the EDGE info in JSON: " + e.getLocalizedMessage(), e);
-			}
-		}
-
-		return baseStatus;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ResourceCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ResourceCallbackHandler.java
deleted file mode 100644
index 6bc1466..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ResourceCallbackHandler.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.dto.StatusBaseDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.ParameterizedType;
-import java.time.Instant;
-import java.util.Date;
-
-public abstract class ResourceCallbackHandler<T extends StatusBaseDTO<?>> implements FileHandlerCallback {
-	private static final Logger log = LoggerFactory.getLogger(ResourceCallbackHandler.class);
-	final ObjectMapper mapper = new ObjectMapper().configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
-
-	private static final String STATUS_FIELD = "status";
-	protected static final String RESPONSE_NODE = "response";
-	protected static final String RESULT_NODE = "result";
-	private static final String ERROR_NODE = "error";
-
-	private static final String OK_STATUS = "ok";
-
-	@JsonIgnore
-	private final RESTService selfService;
-	@JsonProperty
-	private final String user;
-	@JsonProperty
-	private final String uuid;
-	@JsonProperty
-	private final DockerAction action;
-	@JsonProperty
-	private final Class<T> resultType;
-
-	@SuppressWarnings("unchecked")
-	public ResourceCallbackHandler(RESTService selfService, String user,
-								   String uuid, DockerAction action) {
-		this.selfService = selfService;
-		this.user = user;
-		this.uuid = uuid;
-		this.action = action;
-		this.resultType =
-				(Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
-	}
-
-	public ResourceCallbackHandler(RESTService selfService, String user,
-								   String uuid,
-								   DockerAction action,
-								   Class<T> resultType) {
-		this.selfService = selfService;
-		this.user = user;
-		this.uuid = uuid;
-		this.action = action;
-		this.resultType = resultType;
-	}
-
-	@Override
-	public String getUUID() {
-		return uuid;
-	}
-
-	@Override
-	public boolean checkUUID(String uuid) {
-		return this.uuid.equals(uuid);
-	}
-
-	@Override
-	public String getUser() {
-		return user;
-	}
-
-	public DockerAction getAction() {
-		return action;
-	}
-
-	private void selfServicePost(T object) {
-		debugMessage("Send post request to self service {} for UUID {}, object is {}",
-				getCallbackURI(), uuid, object);
-		try {
-			selfService.post(getCallbackURI(), object, resultType);
-		} catch (Exception e) {
-			log.error("Send request or response error for UUID {}: {}", uuid, e.getLocalizedMessage(), e);
-			throw new DlabException("Send request or responce error for UUID " + uuid + ": " + e.getLocalizedMessage()
-					, e);
-		}
-	}
-
-	@Override
-	public boolean handle(String fileName, byte[] content) throws Exception {
-		debugMessage("Got file {} while waiting for UUID {}, for action {}, docker response: {}",
-				fileName, uuid, action.name(), new String(content));
-		JsonNode document = mapper.readTree(content);
-		boolean success = isSuccess(document);
-		UserInstanceStatus status = calcStatus(action, success);
-		T result = getBaseStatusDTO(status);
-
-		JsonNode resultNode = document.get(RESPONSE_NODE).get(RESULT_NODE);
-		if (success) {
-			debugMessage("Did {} resource for user: {}, UUID: {}", action, user, uuid);
-		} else {
-			log.error("Could not {} resource for user: {}, UUID: {}", action, user, uuid);
-			result.setErrorMessage(getTextValue(resultNode.get(ERROR_NODE)));
-		}
-		result = parseOutResponse(resultNode, result);
-
-		selfServicePost(result);
-		return !UserInstanceStatus.FAILED.equals(status);
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public void handleError(String errorMessage) {
-		try {
-			selfServicePost((T) getBaseStatusDTO(UserInstanceStatus.FAILED)
-					.withErrorMessage(errorMessage));
-		} catch (Exception t) {
-			throw new DlabException("Could not send error message to Self Service for UUID " + uuid + ", user " + user + ": " + errorMessage, t);
-		}
-	}
-
-	protected abstract String getCallbackURI();
-
-	protected abstract T parseOutResponse(JsonNode document, T baseStatus);
-
-	@SuppressWarnings("unchecked")
-	protected T getBaseStatusDTO(UserInstanceStatus status) {
-		try {
-			return (T) resultType.newInstance()
-					.withRequestId(uuid)
-					.withUser(user)
-					.withStatus(status)
-					.withUptime(getUptime(status));
-		} catch (Exception t) {
-			throw new DlabException("Something went wrong", t);
-		}
-	}
-
-	private boolean isSuccess(JsonNode document) {
-		return OK_STATUS.equals(document.get(STATUS_FIELD).textValue());
-	}
-
-	private UserInstanceStatus calcStatus(DockerAction action, boolean success) {
-		if (success) {
-			switch (action) {
-				case STATUS:
-				case GIT_CREDS:
-				case LIB_LIST:
-				case LIB_INSTALL:
-				case CREATE_IMAGE:
-					return UserInstanceStatus.CREATED; // Any status besides failed
-				case CREATE:
-				case CONFIGURE:
-				case START:
-				case RECONFIGURE_SPARK:
-					return UserInstanceStatus.RUNNING;
-				case STOP:
-					return UserInstanceStatus.STOPPED;
-				case TERMINATE:
-					return UserInstanceStatus.TERMINATED;
-				default:
-					break;
-			}
-		}
-		return UserInstanceStatus.FAILED;
-	}
-
-	protected Date getUptime(UserInstanceStatus status) {
-		return UserInstanceStatus.RUNNING == status ? Date.from(Instant.now()) : null;
-	}
-
-	protected String getTextValue(JsonNode jsonNode) {
-		return jsonNode != null ? jsonNode.textValue() : null;
-	}
-
-	private void debugMessage(String format, Object... arguments) {
-		if (action == DockerAction.STATUS) {
-			log.trace(format, arguments);
-		} else {
-			log.debug(format, arguments);
-		}
-	}
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ResourcesStatusCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ResourcesStatusCallbackHandler.java
deleted file mode 100644
index d2a9d31..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ResourcesStatusCallbackHandler.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.dto.status.EnvResourceList;
-import com.epam.dlab.dto.status.EnvStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.JsonNode;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.IOException;
-import java.time.Instant;
-import java.util.Date;
-
-import static com.epam.dlab.rest.contracts.ApiCallbacks.INFRASTRUCTURE;
-import static com.epam.dlab.rest.contracts.ApiCallbacks.STATUS_URI;
-
-@Slf4j
-public class ResourcesStatusCallbackHandler extends ResourceCallbackHandler<EnvStatusDTO> {
-
-	@JsonCreator
-	public ResourcesStatusCallbackHandler(
-			@JacksonInject RESTService selfService, @JsonProperty("action") DockerAction
-			action, @JsonProperty("uuid") String uuid, @JsonProperty("user") String user) {
-		super(selfService, user, uuid, action);
-	}
-
-	@Override
-	protected String getCallbackURI() {
-		return INFRASTRUCTURE + STATUS_URI;
-	}
-
-	@Override
-	protected EnvStatusDTO parseOutResponse(JsonNode resultNode, EnvStatusDTO baseStatus) {
-		if (resultNode == null) {
-			return baseStatus;
-		}
-
-		EnvResourceList resourceList;
-		try {
-			resourceList = mapper.readValue(resultNode.toString(), EnvResourceList.class);
-		} catch (IOException e) {
-			throw new DlabException("Docker response for UUID " + getUUID() + " not valid: " + e.getLocalizedMessage()
-					, e);
-		}
-
-		baseStatus.withResourceList(resourceList)
-				.withUptime(Date.from(Instant.now()));
-
-		log.trace("Inner status {}", baseStatus);
-
-		return baseStatus;
-	}
-
-	@Override
-	public boolean handle(String fileName, byte[] content) throws Exception {
-		try {
-			return super.handle(fileName, content);
-		} catch (Exception e) {
-			log.warn("Could not retrive the status of resources for UUID {} and user {}: {}",
-					getUUID(), getUser(), e.getLocalizedMessage(), e);
-		}
-		return true; // Always necessary return true for status response
-	}
-
-	@Override
-	public void handleError(String errorMessage) {
-		// Nothing action for status response
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ReuploadKeyCallbackHandler.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ReuploadKeyCallbackHandler.java
deleted file mode 100644
index 16c9814..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/ReuploadKeyCallbackHandler.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.core.response.handlers;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyCallbackDTO;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyStatus;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.fasterxml.jackson.annotation.JacksonInject;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.core.Response;
-
-@Slf4j
-public class ReuploadKeyCallbackHandler implements FileHandlerCallback {
-	private static final ObjectMapper MAPPER = new ObjectMapper()
-			.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
-	private static final String STATUS_FIELD = "status";
-	private static final String ERROR_MESSAGE_FIELD = "error_message";
-	@JsonProperty
-	private final String uuid;
-	@JsonProperty
-	private final ReuploadKeyCallbackDTO dto;
-	private final RESTService selfService;
-	@JsonProperty
-	private final String callbackUrl;
-	@JsonProperty
-	private final String user;
-
-	@JsonCreator
-	public ReuploadKeyCallbackHandler(@JacksonInject RESTService selfService,
-									  @JsonProperty("callbackUrl") String callbackUrl,
-									  @JsonProperty("user") String user,
-									  @JsonProperty("dto") ReuploadKeyCallbackDTO dto) {
-		this.selfService = selfService;
-		this.uuid = dto.getId();
-		this.callbackUrl = callbackUrl;
-		this.user = user;
-		this.dto = dto;
-	}
-
-	@Override
-	public String getUUID() {
-		return uuid;
-	}
-
-	@Override
-	public boolean checkUUID(String uuid) {
-		return this.uuid.equals(uuid);
-	}
-
-	@Override
-	public boolean handle(String fileName, byte[] content) throws Exception {
-		final String fileContent = new String(content);
-		log.debug("Got file {} while waiting for UUID {}, reupload key response: {}", fileName, uuid, fileContent);
-
-		final JsonNode jsonNode = MAPPER.readTree(fileContent);
-		final String status = jsonNode.get(STATUS_FIELD).textValue();
-		ReuploadKeyStatusDTO reuploadKeyStatusDTO;
-		if ("ok".equals(status)) {
-			reuploadKeyStatusDTO = buildReuploadKeyStatusDto(ReuploadKeyStatus.COMPLETED);
-		} else {
-			reuploadKeyStatusDTO = buildReuploadKeyStatusDto(ReuploadKeyStatus.FAILED)
-					.withErrorMessage(jsonNode.get(ERROR_MESSAGE_FIELD).textValue());
-		}
-		selfServicePost(reuploadKeyStatusDTO);
-		return "ok".equals(status);
-	}
-
-	private void selfServicePost(ReuploadKeyStatusDTO statusDTO) {
-		log.debug("Send post request to self service for UUID {}, object is {}", uuid, statusDTO);
-		try {
-			selfService.post(callbackUrl, statusDTO, Response.class);
-		} catch (Exception e) {
-			log.error("Send request or response error for UUID {}: {}", uuid, e.getLocalizedMessage(), e);
-			throw new DlabException("Send request or response error for UUID " + uuid + ": "
-					+ e.getLocalizedMessage(), e);
-		}
-	}
-
-	@Override
-	public void handleError(String errorMessage) {
-		buildReuploadKeyStatusDto(ReuploadKeyStatus.FAILED)
-				.withErrorMessage(errorMessage);
-	}
-
-	@Override
-	public String getUser() {
-		return user;
-	}
-
-	private ReuploadKeyStatusDTO buildReuploadKeyStatusDto(ReuploadKeyStatus status) {
-		return new ReuploadKeyStatusDTO()
-				.withRequestId(uuid)
-				.withReuploadKeyCallbackDto(dto)
-				.withReuploadKeyStatus(status)
-				.withUser(user);
-	}
-
-}
-
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/dao/CallbackHandlerDao.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/dao/CallbackHandlerDao.java
deleted file mode 100644
index 02fccfa..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/dao/CallbackHandlerDao.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers.dao;
-
-import com.epam.dlab.backendapi.core.response.handlers.PersistentFileHandler;
-
-import java.util.List;
-
-public interface CallbackHandlerDao {
-
-	void upsert(PersistentFileHandler handlerCallback);
-
-	List<PersistentFileHandler> findAll();
-
-	void remove(String handlerId);
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
deleted file mode 100644
index 846e0d7..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDao.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers.dao;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.response.handlers.PersistentFileHandler;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.util.FileUtils;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardOpenOption;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Stream;
-
-import static java.util.stream.Collectors.toList;
-
-@Singleton
-@Slf4j
-public class FileSystemCallbackHandlerDao implements CallbackHandlerDao {
-
-	@Inject
-	private ProvisioningServiceApplicationConfiguration configuration;
-	@Inject
-	private ObjectMapper mapper;
-
-	@Override
-	public void upsert(PersistentFileHandler handlerCallback) {
-		removeWithUUID(handlerCallback.getHandler().getUUID());
-		final String fileName = fileName(handlerCallback.getHandler().getId());
-		final String absolutePath = getAbsolutePath(fileName);
-		saveToFile(handlerCallback, fileName, absolutePath);
-	}
-
-	@Override
-	public List<PersistentFileHandler> findAll() {
-		try (final Stream<Path> pathStream = Files.list(Paths.get(configuration.getHandlerDirectory()))) {
-			return pathStream.map(this::toPersistentFileHandler)
-					.filter(Optional::isPresent)
-					.map(Optional::get)
-					.collect(toList());
-		} catch (IOException e) {
-			log.error("Can not restore handlers due to: {}", e.getMessage(), e);
-		}
-		return Collections.emptyList();
-	}
-
-	@Override
-	public void remove(String handlerId) {
-		try {
-			Files.delete(Paths.get(getAbsolutePath(fileName(handlerId))));
-		} catch (Exception e) {
-			log.error("Can not remove handler {} due to: {}", handlerId, e.getMessage(), e);
-			throw new DlabException("Can not remove handler " + handlerId + " due to: " + e.getMessage());
-		}
-	}
-
-	private void removeWithUUID(String uuid) {
-		try (final Stream<Path> pathStream = Files.list(Paths.get(configuration.getHandlerDirectory()))) {
-			pathStream.map(Path::toString)
-					.filter(path -> path.contains(uuid))
-					.findAny()
-					.ifPresent(FileUtils::deleteFile);
-		} catch (IOException e) {
-			log.error("Problem occurred with accessing directory {} due to: {}", configuration.getHandlerDirectory(),
-					e.getLocalizedMessage());
-		}
-	}
-
-	private String getAbsolutePath(String fileName) {
-		return configuration.getHandlerDirectory() + File.separator + fileName;
-	}
-
-	private void saveToFile(PersistentFileHandler handlerCallback, String fileName, String absolutePath) {
-		try {
-			log.trace("Persisting callback handler to file {}", absolutePath);
-			Files.write(Paths.get(absolutePath), mapper.writeValueAsBytes(handlerCallback), StandardOpenOption.CREATE);
-		} catch (Exception e) {
-			log.warn("Can not persist file handler {} due to {}", fileName, e.getMessage());
-		}
-	}
-
-	private String fileName(String handlerId) {
-		return handlerId + ".json";
-	}
-
-	private Optional<PersistentFileHandler> toPersistentFileHandler(Path path) {
-		try {
-			return Optional.of(mapper.readValue(path.toFile(), PersistentFileHandler.class));
-		} catch (Exception e) {
-			log.warn("Can not deserialize file handler from file: {}", path.toString());
-		}
-		return Optional.empty();
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/AwsProvisioningModule.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/AwsProvisioningModule.java
deleted file mode 100644
index 70e7966..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/AwsProvisioningModule.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.modules;
-
-import com.epam.dlab.backendapi.resources.aws.ComputationalResourceAws;
-import com.epam.dlab.backendapi.resources.aws.EdgeResourceAws;
-import com.epam.dlab.backendapi.resources.aws.ExploratoryResourceAws;
-import com.epam.dlab.backendapi.resources.aws.InfrastructureResourceAws;
-import com.epam.dlab.cloud.CloudModule;
-import com.google.inject.Injector;
-import io.dropwizard.setup.Environment;
-
-public class AwsProvisioningModule extends CloudModule {
-
-    @Override
-    public void init(Environment environment, Injector injector) {
-        environment.jersey().register(injector.getInstance(EdgeResourceAws.class));
-        environment.jersey().register(injector.getInstance(InfrastructureResourceAws.class));
-        environment.jersey().register(injector.getInstance(ExploratoryResourceAws.class));
-        environment.jersey().register(injector.getInstance(ComputationalResourceAws.class));
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/AzureProvisioningModule.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/AzureProvisioningModule.java
deleted file mode 100644
index 3a2cdcc..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/AzureProvisioningModule.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.modules;
-
-import com.epam.dlab.backendapi.resources.azure.ComputationalResourceAzure;
-import com.epam.dlab.backendapi.resources.azure.EdgeResourceAzure;
-import com.epam.dlab.backendapi.resources.azure.ExploratoryResourceAzure;
-import com.epam.dlab.backendapi.resources.azure.InfrastructureResourceAzure;
-import com.epam.dlab.cloud.CloudModule;
-import com.google.inject.Injector;
-import io.dropwizard.setup.Environment;
-
-public class AzureProvisioningModule extends CloudModule {
-
-    @Override
-    public void init(Environment environment, Injector injector) {
-        environment.jersey().register(injector.getInstance(EdgeResourceAzure.class));
-        environment.jersey().register(injector.getInstance(InfrastructureResourceAzure.class));
-        environment.jersey().register(injector.getInstance(ExploratoryResourceAzure.class));
-        environment.jersey().register(injector.getInstance(ComputationalResourceAzure.class));
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/CloudModuleConfigurator.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/CloudModuleConfigurator.java
deleted file mode 100644
index aa86fd6..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/CloudModuleConfigurator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.modules;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.cloud.CloudModule;
-
-public class CloudModuleConfigurator {
-
-    private CloudModuleConfigurator() {
-    }
-
-    public static CloudModule getCloudModule(ProvisioningServiceApplicationConfiguration configuration) {
-        switch (configuration.getCloudProvider()) {
-            case AWS:
-                return new AwsProvisioningModule();
-            case AZURE:
-                return new AzureProvisioningModule();
-            case GCP:
-                return new GcpProvisioningModule();
-            default:
-                throw new UnsupportedOperationException("Unsupported cloud provider " + configuration.getCloudProvider());
-        }
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/GcpProvisioningModule.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/GcpProvisioningModule.java
deleted file mode 100644
index 4553592..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/GcpProvisioningModule.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.modules;
-
-import com.epam.dlab.backendapi.resources.gcp.ComputationalResourceGcp;
-import com.epam.dlab.backendapi.resources.gcp.EdgeResourceGcp;
-import com.epam.dlab.backendapi.resources.gcp.ExploratoryResourceGcp;
-import com.epam.dlab.backendapi.resources.gcp.InfrastructureResourceGcp;
-import com.epam.dlab.cloud.CloudModule;
-import com.google.inject.Injector;
-import io.dropwizard.setup.Environment;
-
-public class GcpProvisioningModule extends CloudModule {
-
-    @Override
-    public void init(Environment environment, Injector injector) {
-        environment.jersey().register(injector.getInstance(EdgeResourceGcp.class));
-        environment.jersey().register(injector.getInstance(InfrastructureResourceGcp.class));
-        environment.jersey().register(injector.getInstance(ExploratoryResourceGcp.class));
-        environment.jersey().register(injector.getInstance(ComputationalResourceGcp.class));
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java
deleted file mode 100644
index 2141d2d..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.modules;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.google.inject.AbstractModule;
-import io.dropwizard.setup.Environment;
-
-public class ModuleFactory {
-
-    private ModuleFactory() {
-    }
-
-    /**
-     * Instantiates an application configuration of Provisioning Service for production or tests if
-     * the mock property of configuration is set to <b>true</b> and method {@link ProvisioningServiceApplicationConfiguration#isDevMode()}}
-     * returns <b>true</b> value.
-     *
-     * @param configuration application configuration of Provisioning Service.
-     * @param environment   environment of Provisioning Service.
-     */
-    public static AbstractModule getModule(ProvisioningServiceApplicationConfiguration configuration, Environment environment) {
-        return configuration.isDevMode()
-                ? new ProvisioningDevModule(configuration, environment)
-                : new ProductionModule(configuration, environment);
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
deleted file mode 100644
index 40744fa..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.modules;
-
-import com.epam.dlab.ModuleBase;
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.DockerWarmuper;
-import com.epam.dlab.backendapi.core.MetadataHolder;
-import com.epam.dlab.backendapi.core.commands.CommandExecutor;
-import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
-import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
-import com.epam.dlab.backendapi.core.response.handlers.dao.FileSystemCallbackHandlerDao;
-import com.epam.dlab.backendapi.service.CheckInactivityService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.RestoreCallbackHandlerService;
-import com.epam.dlab.backendapi.service.impl.CheckInactivityServiceImpl;
-import com.epam.dlab.backendapi.service.impl.ProjectServiceImpl;
-import com.epam.dlab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.rest.client.RESTService;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.inject.name.Names;
-import io.dropwizard.setup.Environment;
-
-/**
- * Production class for an application configuration of SelfService.
- */
-public class ProductionModule extends ModuleBase<ProvisioningServiceApplicationConfiguration> {
-
-	/**
-	 * Instantiates an application configuration of SelfService for production environment.
-	 *
-	 * @param configuration application configuration of SelfService.
-	 * @param environment   environment of SelfService.
-	 */
-	ProductionModule(ProvisioningServiceApplicationConfiguration configuration, Environment environment) {
-		super(configuration, environment);
-	}
-
-	@Override
-	protected void configure() {
-		bind(ProvisioningServiceApplicationConfiguration.class).toInstance(configuration);
-
-		bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.SECURITY_SERVICE_NAME))
-				.toInstance(configuration.getSecurityFactory()
-						.build(environment, ServiceConsts.SECURITY_SERVICE_NAME, ServiceConsts
-								.PROVISIONING_USER_AGENT));
-
-		bind(RESTService.class).toInstance(configuration.getSelfFactory().build(environment, ServiceConsts
-				.SELF_SERVICE_NAME));
-		bind(MetadataHolder.class).to(DockerWarmuper.class);
-		bind(ICommandExecutor.class).to(CommandExecutor.class).asEagerSingleton();
-		bind(ObjectMapper.class).toInstance(new ObjectMapper().configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true));
-		bind(CallbackHandlerDao.class).to(FileSystemCallbackHandlerDao.class);
-		bind(RestoreCallbackHandlerService.class).to(RestoreCallbackHandlerServiceImpl.class);
-		bind(CheckInactivityService.class).to(CheckInactivityServiceImpl.class);
-		bind(ProjectService.class).to(ProjectServiceImpl.class);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java
deleted file mode 100644
index 73d333f..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.modules;
-
-import com.epam.dlab.ModuleBase;
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.auth.contract.SecurityAPI;
-import com.epam.dlab.auth.dto.UserCredentialDTO;
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.DockerWarmuper;
-import com.epam.dlab.backendapi.core.MetadataHolder;
-import com.epam.dlab.backendapi.core.commands.CommandExecutorMock;
-import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
-import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
-import com.epam.dlab.backendapi.core.response.handlers.dao.FileSystemCallbackHandlerDao;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.RestoreCallbackHandlerService;
-import com.epam.dlab.backendapi.service.CheckInactivityService;
-import com.epam.dlab.backendapi.service.RestoreCallbackHandlerService;
-import com.epam.dlab.backendapi.service.impl.CheckInactivityServiceImpl;
-import com.epam.dlab.backendapi.service.impl.ProjectServiceImpl;
-import com.epam.dlab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.DockerAPI;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.inject.name.Names;
-import io.dropwizard.setup.Environment;
-
-import javax.ws.rs.core.Response;
-
-/**
- * Mock class for an application configuration of Provisioning Service for tests.
- */
-public class ProvisioningDevModule extends ModuleBase<ProvisioningServiceApplicationConfiguration> implements
-		SecurityAPI, DockerAPI {
-
-	private static final String TOKEN = "token123";
-	private static final String OPERATION_IS_NOT_SUPPORTED = "Operation is not supported";
-
-	/**
-	 * Instantiates an application configuration of Provisioning Service for tests.
-	 *
-	 * @param configuration application configuration of Provisioning Service.
-	 * @param environment   environment of Provisioning Service.
-	 */
-	ProvisioningDevModule(ProvisioningServiceApplicationConfiguration configuration, Environment environment) {
-		super(configuration, environment);
-	}
-
-	@Override
-	protected void configure() {
-		bind(ProvisioningServiceApplicationConfiguration.class).toInstance(configuration);
-		bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.SECURITY_SERVICE_NAME)).toInstance
-				(createAuthenticationService());
-		bind(RESTService.class).toInstance(configuration.getSelfFactory().build(environment, ServiceConsts
-				.SELF_SERVICE_NAME));
-		bind(MetadataHolder.class).to(DockerWarmuper.class);
-		bind(ICommandExecutor.class).toInstance(new CommandExecutorMock(configuration.getCloudProvider()));
-		bind(ObjectMapper.class).toInstance(new ObjectMapper().configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true));
-		bind(CallbackHandlerDao.class).to(FileSystemCallbackHandlerDao.class);
-		bind(RestoreCallbackHandlerService.class).to(RestoreCallbackHandlerServiceImpl.class);
-		bind(CheckInactivityService.class).to(CheckInactivityServiceImpl.class);
-		bind(ProjectService.class).to(ProjectServiceImpl.class);
-	}
-
-	/**
-	 * Creates and returns the mock object for authentication service.
-	 */
-	@SuppressWarnings("unchecked")
-	private RESTService createAuthenticationService() {
-		return new RESTService() {
-			@Override
-			public <T> T post(String path, Object parameter, Class<T> clazz) {
-				if (LOGIN.equals(path)) {
-					return authorize((UserCredentialDTO) parameter);
-				} else if (GET_USER_INFO.equals(path) && TOKEN.equals(parameter) && clazz.equals(UserInfo.class)) {
-					return (T) getUserInfo();
-				}
-				throw new UnsupportedOperationException(OPERATION_IS_NOT_SUPPORTED);
-			}
-
-			private <T> T authorize(UserCredentialDTO credential) {
-				if ("test".equals(credential.getUsername())) {
-					return (T) Response.ok(TOKEN).build();
-				} else {
-					return (T) Response.status(Response.Status.UNAUTHORIZED)
-							.entity("Username or password is invalid")
-							.build();
-				}
-			}
-
-			@Override
-			public <T> T get(String path, Class<T> clazz) {
-				throw new UnsupportedOperationException(OPERATION_IS_NOT_SUPPORTED);
-			}
-
-			@Override
-			public <T> T get(String path, String accessToken, Class<T> clazz) {
-				throw new UnsupportedOperationException(OPERATION_IS_NOT_SUPPORTED);
-			}
-
-			@Override
-			public <T> T post(String path, String accessToken, Object parameter, Class<T> clazz) {
-				throw new UnsupportedOperationException(OPERATION_IS_NOT_SUPPORTED);
-			}
-		};
-	}
-
-	/**
-	 * Create and return UserInfo object.
-	 */
-	private UserInfo getUserInfo() {
-		UserInfo userInfo = new UserInfo("test", TOKEN);
-		userInfo.addRole("test");
-		userInfo.addRole("dev");
-		return userInfo;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/BackupResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/BackupResource.java
deleted file mode 100644
index 1263b20..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/BackupResource.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
-import com.epam.dlab.backendapi.core.commands.PythonBackupCommand;
-import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
-import com.epam.dlab.backendapi.core.response.handlers.BackupCallbackHandler;
-import com.epam.dlab.dto.backup.EnvBackupDTO;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.epam.dlab.rest.contracts.BackupAPI;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path(BackupAPI.BACKUP)
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class BackupResource {
-
-	@Inject
-	private ProvisioningServiceApplicationConfiguration configuration;
-	@Inject
-	protected FolderListenerExecutor folderListenerExecutor;
-	@Inject
-	protected ICommandExecutor commandExecutor;
-	@Inject
-	protected RESTService selfService;
-
-
-	@POST
-	public Response createBackup(@Auth UserInfo ui, EnvBackupDTO dto) {
-		folderListenerExecutor.start(configuration.getBackupDirectory(), configuration.getProcessTimeout(),
-				new BackupCallbackHandler(selfService, ApiCallbacks.BACKUP_URI, ui.getName(), dto));
-		String command = new PythonBackupCommand(configuration.getBackupScriptPath())
-				.withConfig(dto.getConfigFiles())
-				.withJars(dto.getJars())
-				.withKeys(dto.getKeys())
-				.withDBBackup(dto.isDatabaseBackup())
-				.withLogsBackup(dto.isLogsBackup())
-				.withResponsePath(configuration.getBackupDirectory())
-				.withRequestId(dto.getId())
-				.withSystemUser()
-				.withCertificates(dto.getCertificates()).toCMD();
-		commandExecutor.executeAsync(ui.getName(), dto.getId(), command);
-		return Response.accepted(dto.getId()).build();
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/CallbackHandlerResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/CallbackHandlerResource.java
deleted file mode 100644
index 804b109..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/CallbackHandlerResource.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.backendapi.service.RestoreCallbackHandlerService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.Response;
-
-@Path("/handler")
-@Slf4j
-public class CallbackHandlerResource {
-	private final RestoreCallbackHandlerService restoreCallbackHandlerService;
-
-	@Inject
-	public CallbackHandlerResource(RestoreCallbackHandlerService restoreCallbackHandlerService) {
-		this.restoreCallbackHandlerService = restoreCallbackHandlerService;
-	}
-
-	@POST
-	@Path("/restore")
-	public Response restoreHandlers() {
-		restoreCallbackHandlerService.restore();
-		return Response.ok().build();
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/DockerResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/DockerResource.java
deleted file mode 100644
index 5f6bbc6..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/DockerResource.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.MetadataHolder;
-import com.epam.dlab.backendapi.core.commands.CommandBuilder;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.dto.imagemetadata.ImageMetadataDTO;
-import com.epam.dlab.dto.imagemetadata.ImageType;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import java.util.Set;
-
-@Path("/docker")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class DockerResource implements DockerCommands {
-    private static final Logger LOGGER = LoggerFactory.getLogger(DockerResource.class);
-
-    @Inject
-    private ProvisioningServiceApplicationConfiguration configuration;
-    @Inject
-    private MetadataHolder metadataHolder;
-    @Inject
-    private ICommandExecutor commandExecutor;
-    @Inject
-    private CommandBuilder commandBuilder;
-
-    @GET
-    @Path("{type}")
-    public Set<ImageMetadataDTO> getDockerImages(@Auth UserInfo ui, @PathParam("type") String type) {
-        LOGGER.debug("docker statuses asked for {}", type);
-        return metadataHolder
-                .getMetadata(ImageType.valueOf(type.toUpperCase()));
-    }
-
-    @Path("/run")
-    @POST
-    public String run(@Auth UserInfo ui, String image) {
-        LOGGER.debug("run docker image {}", image);
-        String uuid = DockerCommands.generateUUID();
-        commandExecutor.executeAsync(
-                ui.getName(),
-                uuid,
-                new RunDockerCommand()
-                        .withName(nameContainer("image", "runner"))
-                        .withVolumeForRootKeys(configuration.getKeyDirectory())
-                        .withVolumeForResponse(configuration.getImagesDirectory())
-                        .withRequestId(uuid)
-                        .withDryRun()
-                        .withActionRun(image)
-                        .toCMD()
-        );
-        return uuid;
-    }
-
-    public String getResourceType() {
-        return Directories.NOTEBOOK_LOG_DIRECTORY;
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/GitExploratoryResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/GitExploratoryResource.java
deleted file mode 100644
index e6f6476..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/GitExploratoryResource.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.handlers.ExploratoryGitCredsCallbackHandler;
-import com.epam.dlab.backendapi.service.impl.DockerService;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.exploratory.ExploratoryBaseDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import java.util.Objects;
-
-@Path("/exploratory")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class GitExploratoryResource extends DockerService implements DockerCommands {
-
-	@Path("/git_creds")
-	@POST
-	public String gitCredsUpdate(@Auth UserInfo ui, ExploratoryGitCredsUpdateDTO dto) throws JsonProcessingException {
-		return action(ui.getName(), dto, DockerAction.GIT_CREDS);
-	}
-
-	private String action(String username, ExploratoryBaseDTO<?> dto, DockerAction action) throws JsonProcessingException {
-		log.debug("{} exploratory environment", action);
-		String uuid = DockerCommands.generateUUID();
-		folderListenerExecutor.start(configuration.getImagesDirectory(),
-				configuration.getResourceStatusPollTimeout(),
-				getFileHandlerCallback(action, uuid, dto));
-
-		RunDockerCommand runDockerCommand = new RunDockerCommand()
-				.withInteractive()
-				.withName(nameContainer(dto.getEdgeUserName(), action, dto.getExploratoryName()))
-				.withVolumeForRootKeys(configuration.getKeyDirectory())
-				.withVolumeForResponse(configuration.getImagesDirectory())
-				.withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
-				.withResource(getResourceType())
-				.withRequestId(uuid)
-				.withConfKeyName(configuration.getAdminKey())
-				.withImage(dto.getNotebookImage())
-				.withAction(action);
-		if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-				Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-				!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-			runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-		}
-
-		commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
-		return uuid;
-	}
-
-	private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ExploratoryBaseDTO<?> dto) {
-		return new ExploratoryGitCredsCallbackHandler(selfService, action, uuid, dto.getCloudSettings().getIamUser(), dto.getExploratoryName());
-	}
-
-	private String nameContainer(String user, DockerAction action, String name) {
-		return nameContainer(user, action.toString(), "exploratory", name);
-	}
-
-	public String getResourceType() {
-		return Directories.NOTEBOOK_LOG_DIRECTORY;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ImageResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ImageResource.java
deleted file mode 100644
index 2d6d9e3..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ImageResource.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.handlers.ImageCreateCallbackHandler;
-import com.epam.dlab.backendapi.service.impl.DockerService;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.exploratory.ExploratoryImageDTO;
-import com.epam.dlab.rest.contracts.ExploratoryAPI;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Objects;
-
-@Path(ExploratoryAPI.EXPLORATORY_IMAGE)
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ImageResource extends DockerService implements DockerCommands {
-
-	@POST
-	public Response createImage(@Auth UserInfo ui, ExploratoryImageDTO image) throws JsonProcessingException {
-		final String uuid = DockerCommands.generateUUID();
-
-		folderListenerExecutor.start(configuration.getImagesDirectory(), configuration.getResourceStatusPollTimeout(),
-				new ImageCreateCallbackHandler(selfService, uuid, DockerAction.CREATE_IMAGE, image));
-		String command = commandBuilder.buildCommand(getDockerCommand(DockerAction.CREATE_IMAGE, uuid, image), image);
-		commandExecutor.executeAsync(ui.getName(), uuid, command);
-		log.debug("Docker command: " + command);
-		return Response.accepted(uuid).build();
-	}
-
-
-	@Override
-	public String getResourceType() {
-		return Directories.NOTEBOOK_LOG_DIRECTORY;
-	}
-
-	private RunDockerCommand getDockerCommand(DockerAction action, String uuid, ExploratoryImageDTO image) {
-		RunDockerCommand runDockerCommand = new RunDockerCommand()
-				.withInteractive()
-				.withVolumeForRootKeys(configuration.getKeyDirectory())
-				.withVolumeForResponse(configuration.getImagesDirectory())
-				.withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
-				.withRequestId(uuid)
-				.withConfKeyName(configuration.getAdminKey())
-				.withAction(action)
-				.withResource(getResourceType())
-				.withImage(image.getNotebookImage())
-				.withName(nameContainer(image.getEdgeUserName(), action.toString(), image.getImageName()));
-		if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-				Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-				!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-			runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-		}
-
-		return runDockerCommand;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureResource.java
deleted file mode 100644
index 91519ab..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureResource.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.service.CheckInactivityService;
-import com.epam.dlab.dto.computational.ComputationalCheckInactivityDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryCheckInactivityAction;
-import com.epam.dlab.rest.contracts.InfrasctructureAPI;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path(InfrasctructureAPI.INFRASTRUCTURE)
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class InfrastructureResource {
-
-	@Inject
-	private CheckInactivityService checkInactivityService;
-
-	/**
-	 * Return status of provisioning service.
-	 */
-	@GET
-	public Response status(@Auth UserInfo ui) {
-		return Response.status(Response.Status.OK).build();
-	}
-
-	@POST
-	@Path("/exploratory/check_inactivity")
-	public String checkExploratoryInactivity(@Auth UserInfo ui, ExploratoryCheckInactivityAction dto) {
-		return checkInactivityService.checkExploratoryInactivity(ui.getName(), dto);
-	}
-
-	@POST
-	@Path("/computational/check_inactivity")
-	public String checkComputationalInactivity(@Auth UserInfo ui, ComputationalCheckInactivityDTO dto) {
-		return checkInactivityService.checkComputationalInactivity(ui.getName(), dto);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java
deleted file mode 100644
index a6ae018..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/LibraryResource.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.handlers.LibInstallCallbackHandler;
-import com.epam.dlab.backendapi.core.response.handlers.LibListCallbackHandler;
-import com.epam.dlab.backendapi.service.impl.DockerService;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.LibListComputationalDTO;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryBaseDTO;
-import com.epam.dlab.dto.exploratory.LibraryInstallDTO;
-import com.epam.dlab.rest.contracts.ComputationalAPI;
-import com.epam.dlab.rest.contracts.ExploratoryAPI;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import java.util.Objects;
-
-@Path("/library")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class LibraryResource extends DockerService implements DockerCommands {
-
-
-	@POST
-	@Path(ExploratoryAPI.EXPLORATORY + "/lib_list")
-	public String getLibList(@Auth UserInfo ui, ExploratoryActionDTO<?> dto) throws JsonProcessingException {
-		return actionExploratory(ui.getName(), dto, DockerAction.LIB_LIST);
-	}
-
-	@POST
-	@Path(ExploratoryAPI.EXPLORATORY + "/lib_install")
-	public String libInstall(@Auth UserInfo ui, LibraryInstallDTO dto) throws JsonProcessingException {
-		return actionExploratory(ui.getName(), dto, DockerAction.LIB_INSTALL);
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL + "/lib_list")
-	public String getLibList(@Auth UserInfo ui, LibListComputationalDTO dto) throws JsonProcessingException {
-		return actionComputational(ui.getName(), dto, DockerAction.LIB_LIST);
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL + "/lib_install")
-	public String getLibList(@Auth UserInfo ui, LibraryInstallDTO dto) throws JsonProcessingException {
-		return actionComputational(ui.getName(), dto, DockerAction.LIB_INSTALL);
-	}
-
-	private String actionExploratory(String username, ExploratoryBaseDTO<?> dto, DockerAction action) throws JsonProcessingException {
-		log.debug("{} user {} exploratory environment {}", action, username, dto);
-		String uuid = DockerCommands.generateUUID();
-		folderListenerExecutor.start(configuration.getImagesDirectory(),
-				configuration.getResourceStatusPollTimeout(),
-				getFileHandlerCallbackExploratory(action, uuid, dto));
-
-		RunDockerCommand runDockerCommand = getDockerCommandExploratory(dto, action, uuid);
-
-		commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
-		return uuid;
-	}
-
-	private String actionComputational(String username, ExploratoryActionDTO<?> dto, DockerAction action) throws JsonProcessingException {
-		log.debug("{} user {} exploratory environment {}", action, username, dto);
-		String uuid = DockerCommands.generateUUID();
-		folderListenerExecutor.start(configuration.getImagesDirectory(),
-				configuration.getResourceStatusPollTimeout(),
-				getFileHandlerCallbackComputational(action, uuid, dto));
-
-		RunDockerCommand runDockerCommand = getDockerCommandComputational(dto, action, uuid);
-
-		commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
-		return uuid;
-	}
-
-	private RunDockerCommand getDockerCommandExploratory(ExploratoryBaseDTO<?> dto, DockerAction action, String uuid) {
-		return getDockerCommand(action, uuid)
-				.withName(nameContainer(dto.getEdgeUserName(), action.toString(), "exploratory",
-						dto.getExploratoryName()))
-				.withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
-				.withResource(getResourceType())
-				.withImage(dto.getNotebookImage());
-	}
-
-	private RunDockerCommand getDockerCommandComputational(ExploratoryActionDTO<?> dto, DockerAction action,
-														   String uuid) {
-		RunDockerCommand runDockerCommand = getDockerCommand(action, uuid);
-		if (dto instanceof LibraryInstallDTO) {
-			LibraryInstallDTO newDTO = (LibraryInstallDTO) dto;
-			runDockerCommand.withName(nameContainer(dto.getEdgeUserName(), action.toString(),
-					"computational", newDTO.getComputationalId()))
-					.withVolumeForLog(configuration.getDockerLogDirectory(),
-							DataEngineType.fromDockerImageName(newDTO.getComputationalImage()).getName())
-					.withResource(DataEngineType.fromDockerImageName(newDTO.getComputationalImage()).getName())
-
-					.withImage(newDTO.getComputationalImage());
-
-		} else {
-			LibListComputationalDTO newDTO = (LibListComputationalDTO) dto;
-
-			runDockerCommand.withName(nameContainer(dto.getEdgeUserName(), action.toString(),
-					"computational", newDTO.getComputationalId()))
-					.withVolumeForLog(configuration.getDockerLogDirectory(),
-							DataEngineType.fromDockerImageName(newDTO.getComputationalImage()).getName())
-					.withResource(DataEngineType.fromDockerImageName(newDTO.getComputationalImage()).getName())
-					.withImage(newDTO.getComputationalImage());
-
-		}
-		return runDockerCommand;
-	}
-
-	private RunDockerCommand getDockerCommand(DockerAction action, String uuid) {
-		RunDockerCommand runDockerCommand = new RunDockerCommand()
-				.withInteractive()
-				.withVolumeForRootKeys(configuration.getKeyDirectory())
-				.withVolumeForResponse(configuration.getImagesDirectory())
-				.withRequestId(uuid)
-				.withConfKeyName(configuration.getAdminKey())
-				.withAction(action);
-		if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-				Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-				!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-			runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-		}
-
-		return runDockerCommand;
-	}
-
-	private FileHandlerCallback getFileHandlerCallbackExploratory(DockerAction action, String uuid,
-																  ExploratoryBaseDTO<?> dto) {
-		switch (action) {
-			case LIB_INSTALL:
-				return new LibInstallCallbackHandler(selfService, action, uuid,
-						dto.getCloudSettings().getIamUser(),
-						(LibraryInstallDTO) dto);
-			case LIB_LIST:
-				return new LibListCallbackHandler(selfService, DockerAction.LIB_LIST, uuid,
-						dto.getCloudSettings().getIamUser(), dto.getNotebookImage());
-			default:
-				throw new IllegalArgumentException("Unknown action " + action);
-		}
-	}
-
-	private FileHandlerCallback getFileHandlerCallbackComputational(DockerAction action, String uuid,
-																	ExploratoryBaseDTO<?> dto) {
-		switch (action) {
-			case LIB_LIST:
-				return new LibListCallbackHandler(selfService, action, uuid,
-						dto.getCloudSettings().getIamUser(), ((LibListComputationalDTO) dto).getLibCacheKey());
-			case LIB_INSTALL:
-				return new LibInstallCallbackHandler(selfService, action, uuid,
-						dto.getCloudSettings().getIamUser(), ((LibraryInstallDTO) dto));
-
-			default:
-				throw new IllegalArgumentException("Unknown action " + action);
-		}
-	}
-
-	public String getResourceType() {
-		return Directories.NOTEBOOK_LOG_DIRECTORY;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
deleted file mode 100644
index 2113e8c..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.dto.project.ProjectActionDTO;
-import com.epam.dlab.dto.project.ProjectCreateDTO;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path("infrastructure/project")
-public class ProjectResource {
-	private final ProjectService projectService;
-
-	@Inject
-	public ProjectResource(ProjectService projectService) {
-		this.projectService = projectService;
-	}
-
-	@Path("/create")
-	@POST
-	@Consumes(MediaType.APPLICATION_JSON)
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response createProject(@Auth UserInfo userInfo, ProjectCreateDTO dto) {
-		return Response.ok(projectService.create(userInfo, dto)).build();
-	}
-
-	@Path("/terminate")
-	@POST
-	@Consumes(MediaType.APPLICATION_JSON)
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response terminateProject(@Auth UserInfo userInfo, ProjectActionDTO dto) {
-		return Response.ok(projectService.terminate(userInfo, dto)).build();
-	}
-
-	@Path("/start")
-	@POST
-	@Consumes(MediaType.APPLICATION_JSON)
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response startProject(@Auth UserInfo userInfo, ProjectActionDTO dto) {
-		return Response.ok(projectService.start(userInfo, dto)).build();
-	}
-
-	@Path("/stop")
-	@POST
-	@Consumes(MediaType.APPLICATION_JSON)
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response stopProject(@Auth UserInfo userInfo, ProjectActionDTO dto) {
-		return Response.ok(projectService.stop(userInfo, dto)).build();
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java
deleted file mode 100644
index e50d7ae..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/ProvisioningHealthCheckResource.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path("/healthcheck")
-@Produces(MediaType.APPLICATION_JSON)
-public class ProvisioningHealthCheckResource {
-    private static final String HEALTH_CHECK = "ProvisioningHealthCheck";
-
-    @Inject
-    private ProvisioningServiceApplicationConfiguration configuration;
-
-    @GET
-    public Response status(@Auth UserInfo ui) {
-        return Response.ok(configuration.getCloudProvider()).build();
-    }
-}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java
deleted file mode 100644
index 8e8730c..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.aws;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.handlers.ComputationalCallbackHandler;
-import com.epam.dlab.backendapi.core.response.handlers.ComputationalConfigure;
-import com.epam.dlab.backendapi.service.impl.DockerService;
-import com.epam.dlab.backendapi.service.impl.SparkClusterService;
-import com.epam.dlab.dto.aws.computational.AwsComputationalTerminateDTO;
-import com.epam.dlab.dto.aws.computational.ComputationalCreateAws;
-import com.epam.dlab.dto.aws.computational.SparkComputationalCreateAws;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.epam.dlab.dto.computational.ComputationalClusterConfigDTO;
-import com.epam.dlab.dto.computational.ComputationalStartDTO;
-import com.epam.dlab.dto.computational.ComputationalStopDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.contracts.ComputationalAPI;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-import static com.epam.dlab.backendapi.core.commands.DockerAction.CREATE;
-import static com.epam.dlab.backendapi.core.commands.DockerAction.TERMINATE;
-
-@Path("/")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ComputationalResourceAws extends DockerService implements DockerCommands {
-
-	private static final DataEngineType EMR_DATA_ENGINE = DataEngineType.CLOUD_SERVICE;
-	@Inject
-	private ComputationalConfigure computationalConfigure;
-	@Inject
-	private SparkClusterService sparkClusterService;
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC)
-	public String create(@Auth UserInfo ui, ComputationalCreateAws dto) {
-		log.debug("Create computational resources {} for user {}: {}", dto.getComputationalName(), ui.getName(), dto);
-		String uuid = DockerCommands.generateUUID();
-		folderListenerExecutor.start(configuration.getImagesDirectory(),
-				configuration.getResourceStatusPollTimeout(),
-				getFileHandlerCallback(CREATE, uuid, dto));
-		try {
-			long timeout = configuration.getResourceStatusPollTimeout().toSeconds();
-			commandExecutor.executeAsync(
-					ui.getName(),
-					uuid,
-					commandBuilder.buildCommand(
-							new RunDockerCommand()
-									.withInteractive()
-									.withName(nameContainer(dto.getEdgeUserName(), CREATE, dto.getExploratoryName(),
-											dto.getComputationalName()))
-									.withVolumeForRootKeys(configuration.getKeyDirectory())
-									.withVolumeForResponse(configuration.getImagesDirectory())
-									.withVolumeForLog(configuration.getDockerLogDirectory(), EMR_DATA_ENGINE.getName())
-									.withResource(EMR_DATA_ENGINE.getName())
-									.withRequestId(uuid)
-									.withEc2Role(configuration.getEmrEC2RoleDefault())
-									.withEmrTimeout(Long.toString(timeout))
-									.withServiceRole(configuration.getEmrServiceRoleDefault())
-									.withConfKeyName(configuration.getAdminKey())
-									.withActionCreate(DataEngineType.getDockerImageName(EMR_DATA_ENGINE)),
-							dto
-					)
-			);
-		} catch (Exception t) {
-			throw new DlabException("Could not create computational resource cluster", t);
-		}
-		return uuid;
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_TERMINATE_CLOUD_SPECIFIC)
-	public String terminate(@Auth UserInfo ui, AwsComputationalTerminateDTO dto) {
-
-		log.debug("Terminate computational resources {} for user {}: {}", dto.getComputationalName(), ui.getName(),
-				dto);
-		String uuid = DockerCommands.generateUUID();
-		folderListenerExecutor.start(configuration.getImagesDirectory(),
-				configuration.getResourceStatusPollTimeout(),
-				getFileHandlerCallback(TERMINATE, uuid, dto));
-		try {
-			commandExecutor.executeAsync(
-					ui.getName(),
-					uuid,
-					commandBuilder.buildCommand(
-							new RunDockerCommand()
-									.withInteractive()
-									.withName(nameContainer(dto.getEdgeUserName(), TERMINATE,
-											dto.getExploratoryName(), dto.getComputationalName()))
-									.withVolumeForRootKeys(configuration.getKeyDirectory())
-									.withVolumeForResponse(configuration.getImagesDirectory())
-									.withVolumeForLog(configuration.getDockerLogDirectory(), EMR_DATA_ENGINE.getName())
-									.withResource(EMR_DATA_ENGINE.getName())
-									.withRequestId(uuid)
-									.withConfKeyName(configuration.getAdminKey())
-									.withActionTerminate(DataEngineType.getDockerImageName(EMR_DATA_ENGINE)),
-							dto
-					)
-			);
-		} catch (JsonProcessingException t) {
-			throw new DlabException("Could not terminate computational resources cluster", t);
-		}
-
-		return uuid;
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_CREATE_SPARK)
-	public String createSparkCluster(@Auth UserInfo ui, SparkComputationalCreateAws dto) {
-		log.debug("Create computational Spark resources {} for user {}: {}", dto.getComputationalName(), ui.getName(),
-				dto);
-
-		return sparkClusterService.create(ui, dto);
-	}
-
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_TERMINATE_SPARK)
-	public String terminateSparkCluster(@Auth UserInfo ui, AwsComputationalTerminateDTO dto) {
-		log.debug("Terminate computational Spark resource {} for user {}: {}", dto.getComputationalName(), ui.getName
-				(), dto);
-
-		return sparkClusterService.terminate(ui, dto);
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_STOP_SPARK)
-	public String stopSparkCluster(@Auth UserInfo ui, ComputationalStopDTO dto) {
-		log.debug("Stop computational Spark resources {} for user {}: {}",
-				dto.getComputationalName(), ui.getName(), dto);
-
-		return sparkClusterService.stop(ui, dto);
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_START_SPARK)
-	public String startSparkCluster(@Auth UserInfo ui, ComputationalStartDTO dto) {
-		log.debug("Start computational Spark resource {} for user {}: {}",
-				dto.getComputationalName(), ui.getName(), dto);
-
-		return sparkClusterService.start(ui, dto);
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_RECONFIGURE_SPARK)
-	public String reconfigureSparkCluster(@Auth UserInfo ui, ComputationalClusterConfigDTO config) {
-		log.debug("User is reconfiguring {} spark cluster for exploratory {}", ui.getName(),
-				config.getComputationalName(), config.getNotebookInstanceName());
-		return sparkClusterService.updateConfig(ui, config);
-	}
-
-	private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto) {
-		return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto);
-	}
-
-	private String nameContainer(String user, DockerAction action, String exploratoryName, String name) {
-		return nameContainer(user, action.toString(), "computational", exploratoryName, name);
-	}
-
-	public String getResourceType() {
-		return Directories.DATA_ENGINE_SERVICE_LOG_DIRECTORY;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/EdgeResourceAws.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/EdgeResourceAws.java
deleted file mode 100644
index 22c26e9..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/EdgeResourceAws.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.aws;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.response.handlers.EdgeCallbackHandler;
-import com.epam.dlab.backendapi.resources.base.EdgeService;
-import com.epam.dlab.dto.ResourceSysBaseDTO;
-import com.epam.dlab.dto.aws.edge.EdgeInfoAws;
-import com.epam.dlab.dto.aws.keyload.UploadFileAws;
-import com.epam.dlab.dto.base.keyload.UploadFileResult;
-import com.epam.dlab.rest.contracts.EdgeAPI;
-import com.epam.dlab.util.FileUtils;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import java.io.IOException;
-
-import static com.epam.dlab.rest.contracts.ApiCallbacks.*;
-
-/**
- * Provides API to manage Edge node on AWS
- */
-@Path(EdgeAPI.EDGE)
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class EdgeResourceAws extends EdgeService {
-
-	public EdgeResourceAws() {
-		log.info("{} is initialized", getClass().getSimpleName());
-	}
-
-	@POST
-	@Path("/create")
-	public String create(@Auth UserInfo ui, UploadFileAws dto) throws IOException {
-		FileUtils.saveToFile(getKeyFilename(dto.getEdge().getEdgeUserName()), getKeyDirectory(), dto.getContent());
-		return action(ui.getName(), dto.getEdge(), dto.getEdge().getCloudSettings().getIamUser(), KEY_LOADER,
-				DockerAction.CREATE);
-	}
-
-	@POST
-	@Path("/start")
-	public String start(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
-		return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.START);
-	}
-
-	@POST
-	@Path("/stop")
-	public String stop(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
-		return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.STOP);
-	}
-
-	@POST
-	@Path("/terminate")
-	public String terminate(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
-		return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI,
-				DockerAction.TERMINATE);
-	}
-
-	@SuppressWarnings("unchecked")
-	protected FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, String user, String
-			callbackURI) {
-		return new EdgeCallbackHandler(selfService, action, uuid, user, callbackURI,
-				EdgeInfoAws.class,
-				UploadFileResult.class);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ExploratoryResourceAws.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ExploratoryResourceAws.java
deleted file mode 100644
index 9f7dfc5..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ExploratoryResourceAws.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.aws;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.resources.base.ExploratoryService;
-import com.epam.dlab.dto.aws.exploratory.ExploratoryCreateAws;
-import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryReconfigureSparkClusterActionDTO;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-@Path("/exploratory")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class ExploratoryResourceAws {
-
-	@Inject
-	private ExploratoryService exploratoryService;
-
-
-	@Path("/create")
-	@POST
-	public String create(@Auth UserInfo ui, ExploratoryCreateAws dto) throws JsonProcessingException {
-		return exploratoryService.action(ui.getName(), dto, DockerAction.CREATE);
-	}
-
-	@Path("/start")
-	@POST
-	public String start(@Auth UserInfo ui, ExploratoryGitCredsUpdateDTO dto) throws JsonProcessingException {
-		return exploratoryService.action(ui.getName(), dto, DockerAction.START);
-	}
-
-	@Path("/terminate")
-	@POST
-	public String terminate(@Auth UserInfo ui, ExploratoryActionDTO<?> dto) throws JsonProcessingException {
-		return exploratoryService.action(ui.getName(), dto, DockerAction.TERMINATE);
-	}
-
-	@Path("/stop")
-	@POST
-	public String stop(@Auth UserInfo ui, ExploratoryActionDTO<?> dto) throws JsonProcessingException {
-		return exploratoryService.action(ui.getName(), dto, DockerAction.STOP);
-	}
-
-	@Path("/reconfigure_spark")
-	@POST
-	public String reconfigureSpark(@Auth UserInfo ui, ExploratoryReconfigureSparkClusterActionDTO dto) throws JsonProcessingException {
-		return exploratoryService.action(ui.getName(), dto, DockerAction.RECONFIGURE_SPARK);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/InfrastructureResourceAws.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/InfrastructureResourceAws.java
deleted file mode 100644
index 6efc41f..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/aws/InfrastructureResourceAws.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.aws;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.resources.base.InfrastructureService;
-import com.epam.dlab.dto.UserEnvironmentResources;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-@Path("/infrastructure")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class InfrastructureResourceAws extends InfrastructureService {
-    public InfrastructureResourceAws() {
-        log.info("{} is initialized", getClass().getSimpleName());
-    }
-
-    @Path("/status")
-    @POST
-    public String status(@Auth UserInfo ui, UserEnvironmentResources dto) {
-        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), DockerAction.STATUS);
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java
deleted file mode 100644
index 59b5f27..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.azure;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.service.impl.SparkClusterService;
-import com.epam.dlab.dto.azure.computational.SparkComputationalCreateAzure;
-import com.epam.dlab.dto.computational.ComputationalClusterConfigDTO;
-import com.epam.dlab.dto.computational.ComputationalStartDTO;
-import com.epam.dlab.dto.computational.ComputationalStopDTO;
-import com.epam.dlab.dto.computational.ComputationalTerminateDTO;
-import com.epam.dlab.rest.contracts.ComputationalAPI;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-@Path("/")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ComputationalResourceAzure {
-
-	@Inject
-	private SparkClusterService sparkClusterService;
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_CREATE_SPARK)
-	public String create(@Auth UserInfo ui, SparkComputationalCreateAzure dto) {
-		log.debug("Create computational Spark resources {} for user {}: {}",
-				dto.getComputationalName(), ui.getName(), dto);
-
-		return sparkClusterService.create(ui, dto);
-	}
-
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_TERMINATE_SPARK)
-	public String terminate(@Auth UserInfo ui, ComputationalTerminateDTO dto) {
-		log.debug("Terminate computational Spark resources {} for user {}: {}",
-				dto.getComputationalName(), ui.getName(), dto);
-
-		return sparkClusterService.terminate(ui, dto);
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_STOP_SPARK)
-	public String stopSparkCluster(@Auth UserInfo ui, ComputationalStopDTO dto) {
-		log.debug("Stop computational Spark resources {} for user {}: {}",
-				dto.getComputationalName(), ui.getName(), dto);
-
-		return sparkClusterService.stop(ui, dto);
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_START_SPARK)
-	public String startSparkCluster(@Auth UserInfo ui, ComputationalStartDTO dto) {
-		log.debug("Start computational Spark resource {} for user {}: {}",
-				dto.getComputationalName(), ui.getName(), dto);
-
-		return sparkClusterService.start(ui, dto);
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_RECONFIGURE_SPARK)
-	public String reconfigureSparkCluster(@Auth UserInfo ui, ComputationalClusterConfigDTO config) {
-		log.debug("User is reconfiguring {} spark cluster for exploratory {}", ui.getName(),
-				config.getComputationalName(), config.getNotebookInstanceName());
-		return sparkClusterService.updateConfig(ui, config);
-	}
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/EdgeResourceAzure.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/EdgeResourceAzure.java
deleted file mode 100644
index 4ebad5c..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/EdgeResourceAzure.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.azure;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.response.handlers.EdgeCallbackHandler;
-import com.epam.dlab.backendapi.resources.base.EdgeService;
-import com.epam.dlab.dto.ResourceSysBaseDTO;
-import com.epam.dlab.dto.azure.edge.EdgeInfoAzure;
-import com.epam.dlab.dto.azure.keyload.UploadFileAzure;
-import com.epam.dlab.dto.base.keyload.UploadFileResult;
-import com.epam.dlab.rest.contracts.EdgeAPI;
-import com.epam.dlab.util.FileUtils;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import java.io.IOException;
-
-import static com.epam.dlab.rest.contracts.ApiCallbacks.*;
-
-/**
- * Provides API to manage Edge node on Azure
- */
-@Path(EdgeAPI.EDGE)
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class EdgeResourceAzure extends EdgeService {
-
-	public EdgeResourceAzure() {
-		log.info("{} is initialized", getClass().getSimpleName());
-	}
-
-	@POST
-	@Path("/create")
-	public String create(@Auth UserInfo ui, UploadFileAzure dto) throws IOException {
-		FileUtils.saveToFile(getKeyFilename(dto.getEdge().getEdgeUserName()), getKeyDirectory(), dto.getContent());
-		return action(ui.getName(), dto.getEdge(), dto.getEdge().getCloudSettings().getIamUser(), KEY_LOADER,
-				DockerAction.CREATE);
-	}
-
-	@POST
-	@Path("/start")
-	public String start(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
-		return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.START);
-	}
-
-	@POST
-	@Path("/stop")
-	public String stop(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
-		return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.STOP);
-	}
-
-	@POST
-	@Path("/terminate")
-	public String terminate(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
-		return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI,
-				DockerAction.TERMINATE);
-	}
-
-	@SuppressWarnings("unchecked")
-	protected FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, String user, String
-			callbackURI) {
-		return new EdgeCallbackHandler(selfService, action, uuid, user, callbackURI,
-				EdgeInfoAzure.class,
-				UploadFileResult.class);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ExploratoryResourceAzure.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ExploratoryResourceAzure.java
deleted file mode 100644
index 3fa4f6f..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ExploratoryResourceAzure.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.azure;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.resources.base.ExploratoryService;
-import com.epam.dlab.dto.azure.exploratory.ExploratoryActionStartAzure;
-import com.epam.dlab.dto.azure.exploratory.ExploratoryActionStopAzure;
-import com.epam.dlab.dto.azure.exploratory.ExploratoryCreateAzure;
-import com.epam.dlab.dto.exploratory.ExploratoryReconfigureSparkClusterActionDTO;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-@Path("/exploratory")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class ExploratoryResourceAzure {
-    @Inject
-    private ExploratoryService exploratoryService;
-
-    @Path("/create")
-    @POST
-    public String create(@Auth UserInfo ui, ExploratoryCreateAzure dto) throws JsonProcessingException {
-        return exploratoryService.action(ui.getName(), dto, DockerAction.CREATE);
-    }
-
-    @Path("/start")
-    @POST
-    public String start(@Auth UserInfo ui, ExploratoryActionStartAzure dto) throws JsonProcessingException {
-        return exploratoryService.action(ui.getName(), dto, DockerAction.START);
-    }
-
-    @Path("/terminate")
-    @POST
-    public String terminate(@Auth UserInfo ui, ExploratoryActionStopAzure dto) throws JsonProcessingException {
-        return exploratoryService.action(ui.getName(), dto, DockerAction.TERMINATE);
-    }
-
-    @Path("/stop")
-    @POST
-    public String stop(@Auth UserInfo ui, ExploratoryActionStopAzure dto) throws JsonProcessingException {
-        return exploratoryService.action(ui.getName(), dto, DockerAction.STOP);
-    }
-
-    @Path("/reconfigure_spark")
-    @POST
-    public String reconfigureSpark(@Auth UserInfo ui, ExploratoryReconfigureSparkClusterActionDTO dto) throws JsonProcessingException {
-        return exploratoryService.action(ui.getName(), dto, DockerAction.RECONFIGURE_SPARK);
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/InfrastructureResourceAzure.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/InfrastructureResourceAzure.java
deleted file mode 100644
index 0915c30..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/azure/InfrastructureResourceAzure.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.azure;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.resources.base.InfrastructureService;
-import com.epam.dlab.dto.UserEnvironmentResources;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-@Path("/infrastructure")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class InfrastructureResourceAzure extends InfrastructureService {
-
-    public InfrastructureResourceAzure() {
-        log.info("{} is initialized", getClass().getSimpleName());
-    }
-
-    @Path("/status")
-    @POST
-    public String status(@Auth UserInfo ui, UserEnvironmentResources dto) {
-        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), DockerAction.STATUS);
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/EdgeService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/EdgeService.java
deleted file mode 100644
index 92cb6e8..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/EdgeService.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.base;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.*;
-import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.ResourceSysBaseDTO;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.KeyAPI;
-import com.epam.dlab.util.UsernameUtils;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.inject.Inject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Objects;
-
-public abstract class EdgeService implements DockerCommands {
-
-	private final Logger logger = LoggerFactory.getLogger(getClass());
-
-	@Inject
-	protected RESTService selfService;
-	@Inject
-	private ProvisioningServiceApplicationConfiguration configuration;
-	@Inject
-	private FolderListenerExecutor folderListenerExecutor;
-	@Inject
-	private ICommandExecutor commandExecutor;
-	@Inject
-	private CommandBuilder commandBuilder;
-
-	@Override
-	public String getResourceType() {
-		return Directories.EDGE_LOG_DIRECTORY;
-	}
-
-	protected String action(String username, ResourceSysBaseDTO<?> dto, String iamUser, String callbackURI,
-							DockerAction action) throws JsonProcessingException {
-		logger.debug("{} EDGE node for user {}: {}", action, username, dto);
-		String uuid = DockerCommands.generateUUID();
-
-		folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
-				configuration.getKeyLoaderPollTimeout(),
-				getFileHandlerCallback(action, uuid, iamUser, callbackURI));
-
-		RunDockerCommand runDockerCommand = new RunDockerCommand()
-				.withInteractive()
-				.withName(nameContainer(dto.getEdgeUserName(), action))
-				.withVolumeForRootKeys(getKeyDirectory())
-				.withVolumeForResponse(configuration.getKeyLoaderDirectory())
-				.withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
-				.withResource(getResourceType())
-				.withRequestId(uuid)
-				.withConfKeyName(configuration.getAdminKey())
-				.withImage(configuration.getEdgeImage())
-				.withAction(action);
-		if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-				Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-				!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-			runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-		}
-
-		commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
-		return uuid;
-	}
-
-	protected abstract FileHandlerCallback getFileHandlerCallback(DockerAction action,
-																  String uuid, String user, String callbackURI);
-
-	private String nameContainer(String user, DockerAction action) {
-		return nameContainer(user, action.toString(), getResourceType());
-	}
-
-	protected String getKeyDirectory() {
-		return configuration.getKeyDirectory();
-	}
-
-	protected String getKeyFilename(String edgeUserName) {
-		return UsernameUtils.replaceWhitespaces(edgeUserName) + KeyAPI.KEY_EXTENTION;
-	}
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/ExploratoryService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/ExploratoryService.java
deleted file mode 100644
index b15b342..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/ExploratoryService.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.base;
-
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.handlers.ExploratoryCallbackHandler;
-import com.epam.dlab.backendapi.service.impl.DockerService;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.exploratory.ExploratoryBaseDTO;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Objects;
-
-@Slf4j
-public class ExploratoryService extends DockerService implements DockerCommands {
-
-	public String action(String username, ExploratoryBaseDTO<?> dto, DockerAction action) throws JsonProcessingException {
-		log.debug("{} exploratory environment", action);
-		String uuid = DockerCommands.generateUUID();
-		folderListenerExecutor.start(configuration.getImagesDirectory(),
-				configuration.getResourceStatusPollTimeout(),
-				getFileHandlerCallback(action, uuid, dto));
-
-		RunDockerCommand runDockerCommand = new RunDockerCommand()
-				.withInteractive()
-				.withName(nameContainer(dto.getEdgeUserName(), action, dto.getExploratoryName()))
-				.withVolumeForRootKeys(configuration.getKeyDirectory())
-				.withVolumeForResponse(configuration.getImagesDirectory())
-				.withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
-				.withResource(getResourceType())
-				.withRequestId(uuid)
-				.withConfKeyName(configuration.getAdminKey())
-				.withImage(dto.getNotebookImage())
-				.withAction(action);
-		if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-				Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-				!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-			runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-		}
-
-		commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
-		return uuid;
-	}
-
-	public String getResourceType() {
-		return Directories.NOTEBOOK_LOG_DIRECTORY;
-	}
-
-	private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ExploratoryBaseDTO<?> dto) {
-		return new ExploratoryCallbackHandler(selfService, action, uuid, dto.getCloudSettings().getIamUser(),
-				dto.getProject(), dto.getExploratoryName());
-	}
-
-	private String nameContainer(String user, DockerAction action, String name) {
-		return nameContainer(user, action.toString(), "exploratory", name);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/InfrastructureService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/InfrastructureService.java
deleted file mode 100644
index 699096a..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/InfrastructureService.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.base;
-
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.CommandBuilder;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
-import com.epam.dlab.backendapi.core.response.handlers.ResourcesStatusCallbackHandler;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.UserEnvironmentResources;
-import com.epam.dlab.dto.status.EnvResource;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.process.model.ProcessInfo;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-
-import static com.epam.dlab.backendapi.core.commands.DockerAction.STATUS;
-import static java.util.stream.Collectors.toList;
-
-@Slf4j
-public abstract class InfrastructureService implements DockerCommands {
-	@Inject
-	private RESTService selfService;
-	@Inject
-	private ProvisioningServiceApplicationConfiguration configuration;
-	@Inject
-	private FolderListenerExecutor folderListenerExecutor;
-	@Inject
-	private ICommandExecutor commandExecutor;
-	@Inject
-	private CommandBuilder commandBuilder;
-
-	private static final String CONTAINER_NAME_REGEX_FORMAT = "%s_[^_\\W]+_%s(|_%s)_\\d+";
-
-	public String action(String username, UserEnvironmentResources dto, String iamUser, DockerAction dockerAction) {
-		log.trace("Request the status of resources for user {}: {}", username, dto);
-		String uuid = DockerCommands.generateUUID();
-		folderListenerExecutor.start(configuration.getImagesDirectory(),
-				configuration.getRequestEnvStatusTimeout(),
-				getFileHandlerCallback(dockerAction, uuid, iamUser));
-		try {
-
-			removeResourcesWithRunningContainers(username, dto);
-
-			if (!(dto.getResourceList().getHostList().isEmpty() && dto.getResourceList().getClusterList().isEmpty())) {
-				log.trace("Request the status of resources for user {} after filtering: {}", username, dto);
-				RunDockerCommand runDockerCommand = new RunDockerCommand()
-						.withInteractive()
-						.withName(nameContainer(dto.getEdgeUserName(), STATUS, "resources"))
-						.withVolumeForRootKeys(configuration.getKeyDirectory())
-						.withVolumeForResponse(configuration.getImagesDirectory())
-						.withVolumeForLog(configuration.getDockerLogDirectory(), Directories.EDGE_LOG_DIRECTORY)
-						.withResource(getResourceType())
-						.withRequestId(uuid)
-						.withConfKeyName(configuration.getAdminKey())
-						.withActionStatus(configuration.getEdgeImage());
-				if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-						Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-						!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-					runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-				}
-
-				commandExecutor.executeAsync(username, uuid, commandBuilder.buildCommand(runDockerCommand, dto));
-			} else {
-				log.debug("Skipping calling status command. Resource lists are empty");
-			}
-		} catch (Exception e) {
-			throw new DlabException("Docker's command \"" + getResourceType() + "\" is fail: " + e.getLocalizedMessage
-					(), e);
-		}
-		return uuid;
-	}
-
-	private void removeResourcesWithRunningContainers(String username, UserEnvironmentResources dto)
-			throws Exception {
-
-		final ProcessInfo processInfo = commandExecutor.executeSync(username, DockerCommands.generateUUID(),
-				String.format(DockerCommands
-						.GET_RUNNING_CONTAINERS_FOR_USER, dto.getEdgeUserName()));
-		final String processInfoStdOut = processInfo.getStdOut();
-
-		if (StringUtils.isNoneEmpty(processInfoStdOut)) {
-			final List<String> runningContainerNames = Arrays.asList(processInfoStdOut.split("\n"));
-			log.info("Running containers for users: {}", runningContainerNames);
-			final List<EnvResource> hostList = filter(dto.getEdgeUserName(), runningContainerNames, dto
-					.getResourceList()
-					.getHostList());
-			final List<EnvResource> clusterList = filter(dto.getEdgeUserName(), runningContainerNames, dto
-					.getResourceList()
-					.getClusterList());
-
-			dto.getResourceList().setHostList(hostList);
-			dto.getResourceList().setClusterList(clusterList);
-
-		}
-	}
-
-	private List<EnvResource> filter(String username, List<String> runningContainerNames, List<EnvResource> hostList) {
-		return hostList
-				.stream()
-				.filter(envResource -> hasNotCorrespondingRunningContainer(username, runningContainerNames,
-						envResource))
-				.map(envResource -> new EnvResource().withId(envResource.getId()).withStatus(envResource.getStatus()))
-				.collect(toList());
-	}
-
-	private boolean hasNotCorrespondingRunningContainer(String username, List<String> runningContainerNames,
-														EnvResource
-																envResource) {
-		final String regex = String.format(CONTAINER_NAME_REGEX_FORMAT, username, envResource
-				.getResourceType().name().toLowerCase(), Optional.ofNullable(envResource.getName()).orElse(""));
-		return runningContainerNames.stream().noneMatch(container -> container.matches(regex));
-	}
-
-	protected FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, String user) {
-		return new ResourcesStatusCallbackHandler(selfService, action, uuid, user);
-	}
-
-	private String nameContainer(String user, DockerAction action, String name) {
-		return nameContainer(user, action.toString(), name);
-	}
-
-	public String getResourceType() {
-		return "status";
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/KeyResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/KeyResource.java
deleted file mode 100644
index bbff7b9..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/base/KeyResource.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.resources.base;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.service.impl.KeyService;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyDTO;
-import com.epam.dlab.rest.contracts.KeyAPI;
-import com.epam.dlab.util.FileUtils;
-import com.epam.dlab.util.UsernameUtils;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import java.io.IOException;
-import java.util.UUID;
-
-/**
- * Provides API for reuploading keys
- */
-@Path("key")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class KeyResource {
-
-	private final KeyService keyService;
-	private final ProvisioningServiceApplicationConfiguration configuration;
-
-	@Inject
-	public KeyResource(KeyService keyService, ProvisioningServiceApplicationConfiguration configuration) {
-		this.keyService = keyService;
-		this.configuration = configuration;
-	}
-
-
-	@Path("/reupload")
-	@POST
-	public String reuploadKey(@Auth UserInfo ui, @DefaultValue("true") @QueryParam("is_primary_reuploading")
-			boolean isPrimaryReuploading, ReuploadKeyDTO dto) throws IOException {
-		if (isPrimaryReuploading) {
-			replaceKeyfile(dto);
-		}
-		keyService.reuploadKeyAction(ui.getName(), dto, DockerAction.REUPLOAD_KEY);
-		return UUID.randomUUID().toString();
-	}
-
-	@GET
-	public String getAdminKey(@Auth UserInfo userInfo) {
-		return keyService.getAdminKey();
-	}
-
-	private void replaceKeyfile(ReuploadKeyDTO dto) throws IOException {
-		String edgeUserName = dto.getEdgeUserName();
-		String filename = UsernameUtils.replaceWhitespaces(edgeUserName) + KeyAPI.KEY_EXTENTION;
-		FileUtils.deleteFile(filename, configuration.getKeyDirectory());
-		FileUtils.saveToFile(filename, configuration.getKeyDirectory(), dto.getContent());
-	}
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java
deleted file mode 100644
index 0db357b..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.gcp;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.handlers.ComputationalCallbackHandler;
-import com.epam.dlab.backendapi.core.response.handlers.ComputationalConfigure;
-import com.epam.dlab.backendapi.service.impl.DockerService;
-import com.epam.dlab.backendapi.service.impl.SparkClusterService;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.epam.dlab.dto.computational.ComputationalClusterConfigDTO;
-import com.epam.dlab.dto.computational.ComputationalStartDTO;
-import com.epam.dlab.dto.computational.ComputationalStopDTO;
-import com.epam.dlab.dto.gcp.computational.ComputationalCreateGcp;
-import com.epam.dlab.dto.gcp.computational.GcpComputationalTerminateDTO;
-import com.epam.dlab.dto.gcp.computational.SparkComputationalCreateGcp;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.contracts.ComputationalAPI;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-import static com.epam.dlab.backendapi.core.commands.DockerAction.CREATE;
-import static com.epam.dlab.backendapi.core.commands.DockerAction.TERMINATE;
-
-
-@Path("/")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ComputationalResourceGcp extends DockerService implements DockerCommands {
-
-	@Inject
-	private ComputationalConfigure computationalConfigure;
-	@Inject
-	private SparkClusterService sparkClusterService;
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC)
-	public String create(@Auth UserInfo ui, ComputationalCreateGcp dto) {
-		log.debug("Create computational resources {} for user {}: {}", dto.getComputationalName(), ui.getName(), dto);
-		String uuid = DockerCommands.generateUUID();
-		folderListenerExecutor.start(configuration.getImagesDirectory(),
-				configuration.getResourceStatusPollTimeout(),
-				getFileHandlerCallback(CREATE, uuid, dto));
-		try {
-			commandExecutor.executeAsync(
-					ui.getName(),
-					uuid,
-					commandBuilder.buildCommand(
-							new RunDockerCommand()
-									.withInteractive()
-									.withName(nameContainer(dto.getEdgeUserName(), CREATE,
-											dto.getExploratoryName(), dto.getComputationalName()))
-									.withVolumeForRootKeys(configuration.getKeyDirectory())
-									.withVolumeForResponse(configuration.getImagesDirectory())
-									.withVolumeForLog(configuration.getDockerLogDirectory(), DataEngineType
-											.CLOUD_SERVICE.getName())
-									.withResource(DataEngineType.CLOUD_SERVICE.getName())
-									.withRequestId(uuid)
-									.withConfKeyName(configuration.getAdminKey())
-									.withActionCreate(DataEngineType.getDockerImageName(DataEngineType.CLOUD_SERVICE)),
-							dto
-					)
-			);
-		} catch (Exception t) {
-			throw new DlabException("Could not create computational resource cluster", t);
-		}
-		return uuid;
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_TERMINATE_CLOUD_SPECIFIC)
-	public String terminate(@Auth UserInfo ui, GcpComputationalTerminateDTO dto) {
-
-		log.debug("Terminate computational resources {} for user {}: {}", dto.getComputationalName(), ui.getName(),
-				dto);
-		String uuid = DockerCommands.generateUUID();
-		folderListenerExecutor.start(configuration.getImagesDirectory(),
-				configuration.getResourceStatusPollTimeout(),
-				getFileHandlerCallback(TERMINATE, uuid, dto));
-		try {
-			commandExecutor.executeAsync(
-					ui.getName(),
-					uuid,
-					commandBuilder.buildCommand(
-							new RunDockerCommand()
-									.withInteractive()
-									.withName(nameContainer(dto.getEdgeUserName(), TERMINATE,
-											dto.getExploratoryName(), dto.getComputationalName()))
-									.withVolumeForRootKeys(configuration.getKeyDirectory())
-									.withVolumeForResponse(configuration.getImagesDirectory())
-									.withVolumeForLog(configuration.getDockerLogDirectory(), DataEngineType
-											.CLOUD_SERVICE.getName())
-									.withResource(DataEngineType.CLOUD_SERVICE.getName())
-									.withRequestId(uuid)
-									.withConfKeyName(configuration.getAdminKey())
-									.withActionTerminate(DataEngineType.getDockerImageName(DataEngineType
-											.CLOUD_SERVICE)),
-							dto
-					)
-			);
-		} catch (JsonProcessingException t) {
-			throw new DlabException("Could not terminate computational resources cluster", t);
-		}
-
-		return uuid;
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_CREATE_SPARK)
-	public String createSparkCluster(@Auth UserInfo ui, SparkComputationalCreateGcp dto) {
-		log.debug("Create computational Spark resources {} for user {}: {}", dto.getComputationalName(), ui.getName(),
-				dto);
-
-		return sparkClusterService.create(ui, dto);
-	}
-
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_TERMINATE_SPARK)
-	public String terminateSparkCluster(@Auth UserInfo ui, GcpComputationalTerminateDTO dto) {
-		log.debug("Terminate computational Spark resources {} for user {}: {}", dto.getComputationalName(), ui.getName
-				(), dto);
-
-		return sparkClusterService.terminate(ui, dto);
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_STOP_SPARK)
-	public String stopSparkCluster(@Auth UserInfo ui, ComputationalStopDTO dto) {
-		log.debug("Stop computational Spark resources {} for user {}: {}",
-				dto.getComputationalName(), ui.getName(), dto);
-
-		return sparkClusterService.stop(ui, dto);
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_START_SPARK)
-	public String startSparkCluster(@Auth UserInfo ui, ComputationalStartDTO dto) {
-		log.debug("Start computational Spark resource {} for user {}: {}",
-				dto.getComputationalName(), ui.getName(), dto);
-
-		return sparkClusterService.start(ui, dto);
-	}
-
-	@POST
-	@Path(ComputationalAPI.COMPUTATIONAL_RECONFIGURE_SPARK)
-	public String reconfigureSparkCluster(@Auth UserInfo ui, ComputationalClusterConfigDTO config) {
-		log.debug("User is reconfiguring {} spark cluster for exploratory {}", ui.getName(),
-				config.getComputationalName(), config.getNotebookInstanceName());
-		return sparkClusterService.updateConfig(ui, config);
-	}
-
-	private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto) {
-		return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto);
-	}
-
-	private String nameContainer(String user, DockerAction action, String exploratoryName, String name) {
-		return nameContainer(user, action.toString(), "computational", exploratoryName, name);
-	}
-
-	@Override
-	public String getResourceType() {
-		return Directories.DATA_ENGINE_SERVICE_LOG_DIRECTORY;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/EdgeResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/EdgeResourceGcp.java
deleted file mode 100644
index 525e3e7..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/EdgeResourceGcp.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.gcp;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.response.handlers.EdgeCallbackHandler;
-import com.epam.dlab.backendapi.resources.base.EdgeService;
-import com.epam.dlab.dto.ResourceSysBaseDTO;
-import com.epam.dlab.dto.base.keyload.UploadFileResult;
-import com.epam.dlab.dto.gcp.edge.EdgeInfoGcp;
-import com.epam.dlab.dto.gcp.keyload.UploadFileGcp;
-import com.epam.dlab.rest.contracts.EdgeAPI;
-import com.epam.dlab.util.FileUtils;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import java.io.IOException;
-
-import static com.epam.dlab.rest.contracts.ApiCallbacks.*;
-
-/**
- * Provides API to manage Edge node on GCP
- */
-@Path(EdgeAPI.EDGE)
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class EdgeResourceGcp extends EdgeService {
-
-	public EdgeResourceGcp() {
-		log.info("{} is initialized", getClass().getSimpleName());
-	}
-
-	@POST
-	@Path("/create")
-	public String create(@Auth UserInfo ui, UploadFileGcp dto) throws IOException {
-		FileUtils.saveToFile(getKeyFilename(dto.getEdge().getEdgeUserName()), getKeyDirectory(), dto.getContent());
-		return action(ui.getName(), dto.getEdge(), dto.getEdge().getCloudSettings().getIamUser(), KEY_LOADER,
-				DockerAction.CREATE);
-	}
-
-	@POST
-	@Path("/start")
-	public String start(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
-		return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.START);
-	}
-
-	@POST
-	@Path("/stop")
-	public String stop(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
-		return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI, DockerAction.STOP);
-	}
-
-
-	@POST
-	@Path("/terminate")
-	public String terminate(@Auth UserInfo ui, ResourceSysBaseDTO<?> dto) throws JsonProcessingException {
-		return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), EDGE + STATUS_URI,
-				DockerAction.TERMINATE);
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	protected FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, String user, String
-			callbackURI) {
-		return new EdgeCallbackHandler(selfService, action, uuid, user, callbackURI,
-				EdgeInfoGcp.class,
-				UploadFileResult.class);
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ExploratoryResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ExploratoryResourceGcp.java
deleted file mode 100644
index 778ee0c..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ExploratoryResourceGcp.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.gcp;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.resources.base.ExploratoryService;
-import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryReconfigureSparkClusterActionDTO;
-import com.epam.dlab.dto.gcp.exploratory.ExploratoryCreateGcp;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-@Path("/exploratory")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class ExploratoryResourceGcp {
-
-    @Inject
-    private ExploratoryService exploratoryService;
-
-
-    @Path("/create")
-    @POST
-    public String create(@Auth UserInfo ui, ExploratoryCreateGcp dto) throws JsonProcessingException {
-        return exploratoryService.action(ui.getName(), dto, DockerAction.CREATE);
-    }
-
-    @Path("/start")
-    @POST
-    public String start(@Auth UserInfo ui, ExploratoryGitCredsUpdateDTO dto) throws JsonProcessingException {
-        return exploratoryService.action(ui.getName(), dto, DockerAction.START);
-    }
-
-    @Path("/terminate")
-    @POST
-    public String terminate(@Auth UserInfo ui, ExploratoryActionDTO<?> dto) throws JsonProcessingException {
-        return exploratoryService.action(ui.getName(), dto, DockerAction.TERMINATE);
-    }
-
-    @Path("/stop")
-    @POST
-    public String stop(@Auth UserInfo ui, ExploratoryActionDTO<?> dto) throws JsonProcessingException {
-        return exploratoryService.action(ui.getName(), dto, DockerAction.STOP);
-    }
-
-    @Path("/reconfigure_spark")
-    @POST
-    public String reconfigureSpark(@Auth UserInfo ui, ExploratoryReconfigureSparkClusterActionDTO dto) throws JsonProcessingException {
-        return exploratoryService.action(ui.getName(), dto, DockerAction.RECONFIGURE_SPARK);
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/InfrastructureResourceGcp.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/InfrastructureResourceGcp.java
deleted file mode 100644
index be80c02..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/InfrastructureResourceGcp.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.gcp;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.resources.base.InfrastructureService;
-import com.epam.dlab.dto.UserEnvironmentResources;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-@Path("/infrastructure")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class InfrastructureResourceGcp extends InfrastructureService {
-    public InfrastructureResourceGcp() {
-        log.info("{} is initialized", getClass().getSimpleName());
-    }
-
-    @Path("/status")
-    @POST
-    public String status(@Auth UserInfo ui, UserEnvironmentResources dto) {
-        return action(ui.getName(), dto, dto.getCloudSettings().getIamUser(), DockerAction.STATUS);
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/CheckInactivityService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/CheckInactivityService.java
deleted file mode 100644
index 50d8e00..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/CheckInactivityService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.dto.computational.ComputationalCheckInactivityDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryCheckInactivityAction;
-
-public interface CheckInactivityService {
-	String checkComputationalInactivity(String userName, ComputationalCheckInactivityDTO dto);
-
-	String checkExploratoryInactivity(String userName, ExploratoryCheckInactivityAction dto);
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java
deleted file mode 100644
index 1840fbb..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.dto.project.ProjectActionDTO;
-import com.epam.dlab.dto.project.ProjectCreateDTO;
-
-public interface ProjectService {
-
-    String create(UserInfo userInfo, ProjectCreateDTO projectCreateDTO);
-
-    String terminate(UserInfo userInfo, ProjectActionDTO dto);
-
-    String start(UserInfo userInfo, ProjectActionDTO dto);
-
-    String stop(UserInfo userInfo, ProjectActionDTO dto);
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/RestoreCallbackHandlerService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/RestoreCallbackHandlerService.java
deleted file mode 100644
index e057891..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/RestoreCallbackHandlerService.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-public interface RestoreCallbackHandlerService {
-	void restore();
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/CheckInactivityServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/CheckInactivityServiceImpl.java
deleted file mode 100644
index 3713589..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/CheckInactivityServiceImpl.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.handlers.CheckInactivityCallbackHandler;
-import com.epam.dlab.backendapi.service.CheckInactivityService;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.ResourceBaseDTO;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.computational.ComputationalCheckInactivityDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryCheckInactivityAction;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.google.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Objects;
-
-@Slf4j
-@Singleton
-public class CheckInactivityServiceImpl extends DockerService implements CheckInactivityService, DockerCommands {
-
-
-	@Override
-	public String checkComputationalInactivity(String userName, ComputationalCheckInactivityDTO dto) {
-		String uuid = DockerCommands.generateUUID();
-		startComputationalCallbackListener(userName, dto, uuid);
-		final RunDockerCommand runDockerCommand = new RunDockerCommand()
-				.withInteractive()
-				.withRemove()
-				.withName(nameContainer(uuid, DockerAction.CHECK_INACTIVITY.toString()))
-				.withVolumeForRootKeys(configuration.getKeyDirectory())
-				.withVolumeForResponse(configuration.getKeyLoaderDirectory())
-				.withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
-				.withResource(DataEngineType.fromDockerImageName(dto.getImage()) == DataEngineType.SPARK_STANDALONE ?
-						Directories.DATA_ENGINE_LOG_DIRECTORY :
-						Directories.DATA_ENGINE_SERVICE_LOG_DIRECTORY)
-				.withRequestId(uuid)
-				.withConfKeyName(configuration.getAdminKey())
-				.withImage(dto.getNotebookImage())
-				.withAction(DockerAction.CHECK_INACTIVITY);
-		if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-				Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-				!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-			runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-		}
-
-		runDockerCmd(userName, uuid, runDockerCommand, dto);
-		return uuid;
-	}
-
-	@Override
-	public String checkExploratoryInactivity(String userName, ExploratoryCheckInactivityAction dto) {
-		String uuid = DockerCommands.generateUUID();
-		startExploratoryCallbackListener(userName, dto, uuid);
-		final RunDockerCommand runDockerCommand = new RunDockerCommand()
-				.withInteractive()
-				.withRemove()
-				.withName(nameContainer(uuid, DockerAction.CHECK_INACTIVITY.toString()))
-				.withVolumeForRootKeys(configuration.getKeyDirectory())
-				.withVolumeForResponse(configuration.getKeyLoaderDirectory())
-				.withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
-				.withResource(Directories.NOTEBOOK_LOG_DIRECTORY)
-				.withRequestId(uuid)
-				.withConfKeyName(configuration.getAdminKey())
-				.withImage(dto.getNotebookImage())
-				.withAction(DockerAction.CHECK_INACTIVITY);
-		if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-				Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-				!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-			runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-		}
-
-		runDockerCmd(userName, uuid, runDockerCommand, dto);
-		return uuid;
-	}
-
-	private void startComputationalCallbackListener(String userName, ComputationalCheckInactivityDTO dto,
-													String uuid) {
-		final CheckInactivityCallbackHandler handler = new CheckInactivityCallbackHandler(
-				selfService, ApiCallbacks.CHECK_INACTIVITY_COMPUTATIONAL_URI, userName, uuid,
-				dto.getExploratoryName(), dto.getComputationalName());
-		folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
-				configuration.getKeyLoaderPollTimeout(), handler);
-	}
-
-	private void startExploratoryCallbackListener(String userName, ExploratoryCheckInactivityAction dto, String uuid) {
-		final CheckInactivityCallbackHandler handler = new CheckInactivityCallbackHandler(
-				selfService, ApiCallbacks.CHECK_INACTIVITY_EXPLORATORY_URI, userName, uuid,
-				dto.getExploratoryName());
-		folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
-				configuration.getKeyLoaderPollTimeout(), handler);
-	}
-
-	private void runDockerCmd(String userName, String uuid, RunDockerCommand dockerCmd, ResourceBaseDTO<?> dto) {
-		try {
-			final String command = commandBuilder.buildCommand(dockerCmd, dto);
-			log.trace("Docker command: {}", command);
-			commandExecutor.executeAsync(userName, uuid, command);
-		} catch (Exception e) {
-			log.error("Exception occured during reuploading key: {} for command {}", e.getLocalizedMessage(),
-					dockerCmd.toCMD());
-		}
-	}
-
-	@Override
-	public String getResourceType() {
-		return Directories.NOTEBOOK_LOG_DIRECTORY;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/DockerService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/DockerService.java
deleted file mode 100644
index 5e5a20a..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/DockerService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.commands.CommandBuilder;
-import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
-import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.inject.Inject;
-
-public abstract class DockerService {
-
-	@Inject
-	protected ProvisioningServiceApplicationConfiguration configuration;
-	@Inject
-	protected FolderListenerExecutor folderListenerExecutor;
-	@Inject
-	protected ICommandExecutor commandExecutor;
-	@Inject
-	protected CommandBuilder commandBuilder;
-	@Inject
-	protected RESTService selfService;
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/KeyService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/KeyService.java
deleted file mode 100644
index bbedc68..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/KeyService.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.handlers.ReuploadKeyCallbackHandler;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyCallbackDTO;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.model.ResourceData;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.IOException;
-
-import static java.lang.String.format;
-import static java.nio.file.Files.readAllBytes;
-import static java.nio.file.Paths.get;
-
-@Slf4j
-@Singleton
-public class KeyService extends DockerService implements DockerCommands {
-
-	private static final String REUPLOAD_KEY_ACTION = "reupload_key";
-
-	private final ProvisioningServiceApplicationConfiguration conf;
-
-	@Inject
-	public KeyService(ProvisioningServiceApplicationConfiguration conf) {
-		this.conf = conf;
-	}
-
-
-	public void reuploadKeyAction(String userName, ReuploadKeyDTO dto, DockerAction action) {
-		log.debug("{} for edge user {}", action, dto.getEdgeUserName());
-
-		long count = dto.getResources()
-				.stream()
-				.map(resourceData -> buildCallbackDTO(resourceData, getUuid(), dto))
-				.peek(callbackDto -> startCallbackListener(userName, callbackDto))
-				.peek(callbackDto ->
-						runDockerCmd(userName, callbackDto.getId(), buildRunDockerCommand(callbackDto, action),
-								buildDockerCommandDTO(callbackDto)))
-				.count();
-		log.debug("Executed {} Docker commands", count);
-	}
-
-	public String getAdminKey() {
-		try {
-			return new String(readAllBytes(get(format("%s/%s.pem", conf.getKeyDirectory(), conf.getAdminKey()))));
-		} catch (IOException e) {
-			log.error("Can not read admin key: {}", e.getMessage());
-			throw new DlabException("Can not read admin key: " + e.getMessage(), e);
-		}
-	}
-
-	private String getUuid() {
-		return DockerCommands.generateUUID();
-	}
-
-	private void runDockerCmd(String userName, String uuid, RunDockerCommand runDockerCommand,
-							  ReuploadKeyCallbackDTO callbackDto) {
-		try {
-			final String command = commandBuilder.buildCommand(runDockerCommand, callbackDto);
-			log.trace("Docker command: {}", command);
-			commandExecutor.executeAsync(userName, uuid, command);
-		} catch (Exception e) {
-			log.error("Exception occured during reuploading key: {} for command {}", e.getLocalizedMessage(),
-					runDockerCommand.toCMD());
-		}
-	}
-
-	private void startCallbackListener(String userName, ReuploadKeyCallbackDTO dto) {
-		folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
-				configuration.getKeyLoaderPollTimeout(),
-				new ReuploadKeyCallbackHandler(selfService, ApiCallbacks.REUPLOAD_KEY_URI,
-						userName, dto));
-	}
-
-	@Override
-	public String getResourceType() {
-		return Directories.EDGE_LOG_DIRECTORY;
-	}
-
-	private RunDockerCommand buildRunDockerCommand(ReuploadKeyCallbackDTO callbackDto, DockerAction action) {
-		return new RunDockerCommand()
-				.withInteractive()
-				.withName(getContainerName(callbackDto))
-				.withVolumeForRootKeys(configuration.getKeyDirectory())
-				.withVolumeForResponse(configuration.getKeyLoaderDirectory())
-				.withVolumeForLog(configuration.getDockerLogDirectory(), getResourceType())
-				.withResource(callbackDto.getResource().getResourceType().toString())
-				.withRequestId(callbackDto.getId())
-				.withConfKeyName(configuration.getAdminKey())
-				.withImage(configuration.getEdgeImage())
-				.withAction(action);
-	}
-
-	private ReuploadKeyCallbackDTO buildCallbackDTO(ResourceData resource, String uuid, ReuploadKeyDTO dto) {
-		return new ReuploadKeyCallbackDTO()
-				.withId(uuid)
-				.withEdgeUserName(dto.getEdgeUserName())
-				.withServiceBaseName(dto.getServiceBaseName())
-				.withConfOsFamily(dto.getConfOsFamily())
-				.withResourceId(resource.getResourceId())
-				.withResource(resource);
-	}
-
-	private ReuploadKeyCallbackDTO buildDockerCommandDTO(ReuploadKeyCallbackDTO dto) {
-		return new ReuploadKeyCallbackDTO()
-				.withEdgeUserName(dto.getEdgeUserName())
-				.withServiceBaseName(dto.getServiceBaseName())
-				.withConfOsFamily(dto.getConfOsFamily())
-				.withResourceId(dto.getResourceId());
-	}
-
-	private String getContainerName(ReuploadKeyCallbackDTO callbackDto) {
-		return nameContainer(callbackDto.getEdgeUserName(), REUPLOAD_KEY_ACTION,
-				callbackDto.getResource().getResourceType().toString(),
-				callbackDto.getResource().getResourceId());
-	}
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
deleted file mode 100644
index 229e21c..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.commands.CommandBuilder;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
-import com.epam.dlab.backendapi.core.response.handlers.ProjectCallbackHandler;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.ResourceBaseDTO;
-import com.epam.dlab.dto.aws.edge.EdgeInfoAws;
-import com.epam.dlab.dto.azure.edge.EdgeInfoAzure;
-import com.epam.dlab.dto.gcp.edge.EdgeInfoGcp;
-import com.epam.dlab.dto.project.ProjectActionDTO;
-import com.epam.dlab.dto.project.ProjectCreateDTO;
-import com.epam.dlab.rest.client.RESTService;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Objects;
-
-@Slf4j
-public class ProjectServiceImpl implements ProjectService {
-	private static final String PROJECT_IMAGE = "docker.dlab-project";
-	private static final String EDGE_IMAGE = "docker.dlab-edge";
-	private static final String CALLBACK_URI = "/api/project/status";
-	@Inject
-	protected RESTService selfService;
-	@Inject
-	private ProvisioningServiceApplicationConfiguration configuration;
-	@Inject
-	private FolderListenerExecutor folderListenerExecutor;
-	@Inject
-	private ICommandExecutor commandExecutor;
-	@Inject
-	private CommandBuilder commandBuilder;
-
-	@Override
-	public String create(UserInfo userInfo, ProjectCreateDTO dto) {
-		return executeDocker(userInfo, dto, DockerAction.CREATE, dto.getName(), "project", PROJECT_IMAGE,
-				dto.getEndpoint());
-	}
-
-	@Override
-	public String terminate(UserInfo userInfo, ProjectActionDTO dto) {
-		return executeDocker(userInfo, dto, DockerAction.TERMINATE, dto.getName(), "project", PROJECT_IMAGE,
-				dto.getEndpoint());
-	}
-
-	@Override
-	public String start(UserInfo userInfo, ProjectActionDTO dto) {
-		return executeDocker(userInfo, dto, DockerAction.START, dto.getName(), "edge", EDGE_IMAGE, dto.getEndpoint());
-	}
-
-	@Override
-	public String stop(UserInfo userInfo, ProjectActionDTO dto) {
-		return executeDocker(userInfo, dto, DockerAction.STOP, dto.getName(), "edge", EDGE_IMAGE, dto.getEndpoint());
-	}
-
-	private String executeDocker(UserInfo userInfo, ResourceBaseDTO dto, DockerAction action, String projectName,
-								 String resourceType, String image, String endpoint) {
-		String uuid = DockerCommands.generateUUID();
-
-		folderListenerExecutor.start(configuration.getKeyLoaderDirectory(),
-				configuration.getKeyLoaderPollTimeout(),
-				new ProjectCallbackHandler(selfService, userInfo.getName(), uuid,
-						action, CALLBACK_URI, projectName, getEdgeClass(), endpoint));
-
-		RunDockerCommand runDockerCommand = new RunDockerCommand()
-				.withInteractive()
-				.withName(String.join("_", userInfo.getSimpleName(), projectName, resourceType, action.toString(),
-						Long.toString(System.currentTimeMillis())))
-				.withVolumeForRootKeys(configuration.getKeyDirectory())
-				.withVolumeForResponse(configuration.getKeyLoaderDirectory())
-				.withVolumeForLog(configuration.getDockerLogDirectory(), resourceType)
-				.withResource(resourceType)
-				.withRequestId(uuid)
-				.withConfKeyName(configuration.getAdminKey())
-				.withImage(image)
-				.withAction(action);
-		if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-				Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-				!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-			runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-		}
-
-		try {
-			commandExecutor.executeAsync(userInfo.getName(), uuid, commandBuilder.buildCommand(runDockerCommand, dto));
-		} catch (JsonProcessingException e) {
-			e.printStackTrace();
-		}
-		return uuid;
-	}
-
-	private <T> Class<T> getEdgeClass() {
-		if (configuration.getCloudProvider() == CloudProvider.AWS) {
-			return (Class<T>) EdgeInfoAws.class;
-		} else if (configuration.getCloudProvider() == CloudProvider.AZURE) {
-			return (Class<T>) EdgeInfoAzure.class;
-		} else if (configuration.getCloudProvider() == CloudProvider.GCP) {
-			return (Class<T>) EdgeInfoGcp.class;
-		}
-		throw new IllegalArgumentException();
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/RestoreCallbackHandlerServiceImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/RestoreCallbackHandlerServiceImpl.java
deleted file mode 100644
index 690e40a..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/RestoreCallbackHandlerServiceImpl.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
-import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
-import com.epam.dlab.backendapi.service.RestoreCallbackHandlerService;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import io.dropwizard.lifecycle.Managed;
-import io.dropwizard.util.Duration;
-import lombok.extern.slf4j.Slf4j;
-
-@Singleton
-@Slf4j
-public class RestoreCallbackHandlerServiceImpl implements Managed, RestoreCallbackHandlerService {
-
-	@Inject
-	private CallbackHandlerDao callbackHandlerDao;
-	@Inject
-	private FolderListenerExecutor folderListenerExecutor;
-
-	@Override
-	public void start() {
-		restore();
-	}
-
-	@Override
-	public void stop() {
-		log.info("RestoreCallbackHandlerServiceImpl stopped");
-	}
-
-	public void restore() {
-		log.info("Restoring callback handlers");
-		callbackHandlerDao.findAll().forEach(persistentFileHandler ->
-				folderListenerExecutor.start(persistentFileHandler.getDirectory(),
-						Duration.milliseconds(persistentFileHandler.getTimeout()),
-						persistentFileHandler.getHandler()));
-		log.info("Successfully restored file handlers");
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/SparkClusterService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/SparkClusterService.java
deleted file mode 100644
index ce73096..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/SparkClusterService.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.core.Directories;
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.commands.DockerCommands;
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import com.epam.dlab.backendapi.core.response.handlers.ComputationalCallbackHandler;
-import com.epam.dlab.backendapi.core.response.handlers.ComputationalConfigure;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.epam.dlab.dto.computational.ComputationalClusterConfigDTO;
-import com.epam.dlab.dto.computational.ComputationalStartDTO;
-import com.epam.dlab.dto.computational.ComputationalStopDTO;
-import com.epam.dlab.dto.computational.ComputationalTerminateDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-import java.util.Objects;
-
-import static com.epam.dlab.backendapi.core.commands.DockerAction.CREATE;
-import static com.epam.dlab.backendapi.core.commands.DockerAction.RECONFIGURE_SPARK;
-import static com.epam.dlab.backendapi.core.commands.DockerAction.START;
-import static com.epam.dlab.backendapi.core.commands.DockerAction.STOP;
-import static com.epam.dlab.backendapi.core.commands.DockerAction.TERMINATE;
-
-@Singleton
-public class SparkClusterService extends DockerService implements DockerCommands {
-
-	private static final DataEngineType SPARK_ENGINE = DataEngineType.SPARK_STANDALONE;
-
-	@Inject
-	private ComputationalConfigure computationalConfigure;
-
-	public String create(UserInfo ui, ComputationalBase<?> dto) {
-		return action(ui, dto, CREATE);
-	}
-
-	public String terminate(UserInfo ui, ComputationalTerminateDTO dto) {
-		return action(ui, dto, TERMINATE);
-	}
-
-	public String stop(UserInfo ui, ComputationalStopDTO dto) {
-		return action(ui, dto, STOP);
-	}
-
-	public String start(UserInfo ui, ComputationalStartDTO dto) {
-		return action(ui, dto, START);
-	}
-
-	public String updateConfig(UserInfo ui, ComputationalClusterConfigDTO clusterConfigDTO) {
-		String uuid = DockerCommands.generateUUID();
-		folderListenerExecutor.start(configuration.getImagesDirectory(),
-				configuration.getResourceStatusPollTimeout(),
-				getFileHandlerCallback(RECONFIGURE_SPARK, uuid, clusterConfigDTO));
-		runReconfigureSparkDockerCommand(ui, clusterConfigDTO, uuid);
-		return uuid;
-	}
-
-	private void runReconfigureSparkDockerCommand(UserInfo ui, ComputationalClusterConfigDTO clusterConfigDTO,
-												  String uuid) {
-		try {
-			final RunDockerCommand runDockerCommand = new RunDockerCommand()
-					.withInteractive()
-					.withName(nameContainer(clusterConfigDTO.getEdgeUserName(), RECONFIGURE_SPARK,
-							clusterConfigDTO.getExploratoryName(),
-							clusterConfigDTO.getComputationalName()))
-					.withVolumeForRootKeys(configuration.getKeyDirectory())
-					.withVolumeForResponse(configuration.getImagesDirectory())
-					.withVolumeForLog(configuration.getDockerLogDirectory(), SPARK_ENGINE.getName())
-					.withResource(SPARK_ENGINE.getName())
-					.withRequestId(uuid)
-					.withConfKeyName(configuration.getAdminKey())
-					.withImage(DataEngineType.getDockerImageName(SPARK_ENGINE))
-					.withAction(RECONFIGURE_SPARK);
-			if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-					Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-					!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-				runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-			}
-
-			commandExecutor.executeAsync(ui.getName(), uuid, commandBuilder.buildCommand(runDockerCommand,
-					clusterConfigDTO));
-		} catch (JsonProcessingException e) {
-			throw new DlabException("Could not" + RECONFIGURE_SPARK.toString() + "computational resources cluster", e);
-		}
-	}
-
-	private String action(UserInfo ui, ComputationalBase<?> dto, DockerAction action) {
-		String uuid = DockerCommands.generateUUID();
-		folderListenerExecutor.start(configuration.getImagesDirectory(),
-				configuration.getResourceStatusPollTimeout(),
-				getFileHandlerCallback(action, uuid, dto));
-		try {
-			final RunDockerCommand runDockerCommand = new RunDockerCommand()
-					.withInteractive()
-					.withName(nameContainer(dto.getEdgeUserName(), action, dto.getExploratoryName(),
-							dto.getComputationalName()))
-					.withVolumeForRootKeys(configuration.getKeyDirectory())
-					.withVolumeForResponse(configuration.getImagesDirectory())
-					.withVolumeForLog(configuration.getDockerLogDirectory(), SPARK_ENGINE.getName())
-					.withResource(SPARK_ENGINE.getName())
-					.withRequestId(uuid)
-					.withConfKeyName(configuration.getAdminKey())
-					.withImage(DataEngineType.getDockerImageName(SPARK_ENGINE))
-					.withAction(action);
-			if (configuration.getCloudProvider() == CloudProvider.AZURE &&
-					Objects.nonNull(configuration.getCloudConfiguration().getAzureAuthFile()) &&
-					!configuration.getCloudConfiguration().getAzureAuthFile().isEmpty()) {
-				runDockerCommand.withVolumeFoAzureAuthFile(configuration.getCloudConfiguration().getAzureAuthFile());
-			}
-
-			commandExecutor.executeAsync(ui.getName(), uuid, commandBuilder.buildCommand(runDockerCommand, dto));
-		} catch (JsonProcessingException e) {
-			throw new DlabException("Could not" + action.toString() + "computational resources cluster", e);
-		}
-
-		return uuid;
-	}
-
-	private FileHandlerCallback getFileHandlerCallback(DockerAction action, String uuid, ComputationalBase<?> dto) {
-		return new ComputationalCallbackHandler(computationalConfigure, selfService, action, uuid, dto);
-	}
-
-	private String nameContainer(String user, DockerAction action, String exploratoryName, String name) {
-		return nameContainer(user, action.toString(), "computational", exploratoryName, name);
-	}
-
-	@Override
-	public String getResourceType() {
-		return Directories.DATA_ENGINE_LOG_DIRECTORY;
-	}
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/validation/ProvisioningServiceCloudConfigurationSequenceProvider.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/validation/ProvisioningServiceCloudConfigurationSequenceProvider.java
deleted file mode 100644
index b85af8a..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/validation/ProvisioningServiceCloudConfigurationSequenceProvider.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.validation;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.validation.CloudConfigurationSequenceProvider;
-
-public class ProvisioningServiceCloudConfigurationSequenceProvider
-        extends CloudConfigurationSequenceProvider<ProvisioningServiceApplicationConfiguration> {
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/process/ProcessConveyor.java b/services/provisioning-service/src/main/java/com/epam/dlab/process/ProcessConveyor.java
deleted file mode 100644
index 6893f1f..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/process/ProcessConveyor.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.process;
-
-import com.aegisql.conveyor.AssemblingConveyor;
-import com.aegisql.conveyor.BuildingSite;
-import com.aegisql.conveyor.cart.Cart;
-import com.aegisql.conveyor.cart.FutureCart;
-import com.epam.dlab.process.model.ProcessId;
-import com.epam.dlab.process.model.ProcessInfo;
-import com.epam.dlab.process.model.ProcessStep;
-
-import java.util.concurrent.TimeUnit;
-import java.util.function.Supplier;
-
-public class ProcessConveyor extends AssemblingConveyor<ProcessId,ProcessStep,ProcessInfo>{
-
-    public ProcessConveyor() {
-        super();
-        this.setName("ProcessConveyor");
-        this.setIdleHeartBeat(1, TimeUnit.SECONDS);
-        this.enablePostponeExpiration(true);
-        this.enablePostponeExpirationOnTimeout(true);
-        this.setDefaultCartConsumer((l,v,b)->{
-            LOG.warn("default processor for {} {} {}",l,v,b.get());
-            if(v instanceof FutureCart) {
-                @SuppressWarnings("rawtypes")
-				FutureCart fc = (FutureCart)v;
-                fc.get().cancel(true);
-            }
-        });
-        this.setResultConsumer((bin)->{
-            LOG.debug("process finished: {}",bin);
-        });
-    }
-
-    public Supplier<? extends ProcessInfo> getInfoSupplier(ProcessId id) {
-        BuildingSite<ProcessId, ProcessStep, Cart<ProcessId, ?, ProcessStep>, ? extends ProcessInfo> bs = this.collector.get(id);
-        if(bs == null) {
-            return () -> null;
-        } else {
-            return bs.getProductSupplier();
-        }
-    }
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/process/builder/ProcessInfoBuilder.java b/services/provisioning-service/src/main/java/com/epam/dlab/process/builder/ProcessInfoBuilder.java
deleted file mode 100644
index f790fea..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/process/builder/ProcessInfoBuilder.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.process.builder;
-
-import com.aegisql.conveyor.Expireable;
-import com.aegisql.conveyor.Testing;
-import com.aegisql.conveyor.TimeoutAction;
-import com.epam.dlab.process.model.DlabProcess;
-import com.epam.dlab.process.model.ProcessId;
-import com.epam.dlab.process.model.ProcessInfo;
-import com.epam.dlab.process.model.ProcessStatus;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.Field;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.concurrent.CompletableFuture;
-import java.util.function.Function;
-import java.util.function.Supplier;
-
-import static com.epam.dlab.process.model.ProcessStatus.*;
-
-@Slf4j
-public class ProcessInfoBuilder implements Supplier<ProcessInfo>, Testing, TimeoutAction, Expireable {
-
-	private final ProcessId processId;
-	private final long startTimeStamp = System.currentTimeMillis();
-	private ProcessStatus status = CREATED;
-	private final StringBuilder stdOut = new StringBuilder();
-	private final StringBuilder stdErr = new StringBuilder();
-	private int exitCode = -1;
-	private String[] command = new String[]{"N/A"};
-	private Collection<ProcessInfo> rejected = null;
-	private int pid = -1;
-
-	private boolean finished = false;
-	private boolean stdOutClosed = false;
-	private boolean stdErrClosed = false;
-
-	private Process p = null;
-	private CompletableFuture<ProcessInfo> future;
-	private long expirationTime;
-
-	public ProcessInfoBuilder(ProcessId processId, long ttl) {
-		this.processId = processId;
-		this.expirationTime = System.currentTimeMillis() + ttl;
-	}
-
-	public static void schedule(ProcessInfoBuilder b, String[] command) {
-		b.status = SCHEDULED;
-		b.command = command;
-	}
-
-	public static void start(ProcessInfoBuilder b, String[] command) {
-		if (b.status == CREATED) {
-			b.status = LAUNCHING;
-			b.command = command;
-			b.launch();
-		} else {
-			if (b.rejected == null) {
-				b.rejected = new LinkedList<>();
-			}
-			long timeStamp = System.currentTimeMillis();
-			b.rejected.add(new ProcessInfo(
-					b.processId,
-					REJECTED,
-					command,
-					"",
-					"rejected duplicated command",
-					REJECTED.ordinal(),
-					timeStamp,
-					timeStamp, null, b.pid));
-		}
-	}
-
-	public static void failed(ProcessInfoBuilder b, Object dummy) {
-		b.status = FAILED;
-		b.setReady();
-	}
-
-	public static void stop(ProcessInfoBuilder b, Object dummy) {
-		if (b.p != null) {
-			b.p.destroy();
-		}
-		if (b.status != LAUNCHING && b.status != RUNNING) {
-			b.setReady();
-		}
-		b.status = STOPPED;
-	}
-
-	public static void kill(ProcessInfoBuilder b, Object dummy) {
-		if (b.p != null) {
-			b.p.destroyForcibly();
-		}
-		if (b.status != LAUNCHING && b.status != RUNNING) {
-			b.setReady();
-		}
-		b.status = KILLED;
-	}
-
-	public static void finish(ProcessInfoBuilder b, Integer exitCode) {
-		if (b.status != STOPPED && b.status != KILLED && b.status != TIMEOUT) {
-			b.status = FINISHED;
-		}
-		b.exitCode = exitCode;
-		b.finished = true;
-	}
-
-	public static void stdOut(ProcessInfoBuilder b, Object msg) {
-		if (msg == null) {
-			b.stdOutClosed = true;
-		} else {
-			b.stdOut.append(msg).append("\n");
-		}
-	}
-
-	public static void stdErr(ProcessInfoBuilder b, Object msg) {
-		if (msg == null) {
-			b.stdErrClosed = true;
-		} else {
-			b.stdErr.append(msg).append("\n");
-		}
-	}
-
-	private void launch() {
-		DlabProcess.getInstance().getUsersExecutorService(processId.getUser()).submit(() -> {
-			status = SCHEDULED;
-			DlabProcess.getInstance().getExecutorService().execute(() -> {
-				try {
-					p = new ProcessBuilder(command).start();
-					pid = getPid(p);
-					InputStream stdOutStream = p.getInputStream();
-					DlabProcess.getInstance().getExecutorService().execute(() -> print(stdOutStream));
-					InputStream stdErrStream = p.getErrorStream();
-					DlabProcess.getInstance().getExecutorService().execute(() -> printError(stdErrStream));
-					status = RUNNING;
-					int exit = p.waitFor();
-					DlabProcess.getInstance().finish(processId, exit);
-				} catch (IOException e) {
-					DlabProcess.getInstance().toStdErr(processId, "Command launch failed. " + get().getCommand(), e);
-					DlabProcess.getInstance().failed(processId);
-				} catch (InterruptedException e) {
-					DlabProcess.getInstance().toStdErr(processId, "Command interrupted. " + get().getCommand(), e);
-					DlabProcess.getInstance().failed(processId);
-					Thread.currentThread().interrupt();
-				}
-			});
-			try {
-				future.get();
-			} catch (Exception e) {
-				log.error("Exception occurred during getting future result: {}", e.getMessage());
-			}
-		});
-	}
-
-	private void printError(InputStream stdErrStream) {
-		BufferedReader reader = new BufferedReader(new InputStreamReader(stdErrStream));
-		String line;
-		try {
-			while ((line = reader.readLine()) != null) {
-				DlabProcess.getInstance().toStdErr(processId, line);
-			}
-			DlabProcess.getInstance().toStdErr(processId, null);
-		} catch (IOException e) {
-			DlabProcess.getInstance().toStdErr(processId, "Failed process STDERR reader", e);
-			DlabProcess.getInstance().failed(processId);
-		}
-	}
-
-	private void print(InputStream stdOutStream) {
-		BufferedReader reader = new BufferedReader(new InputStreamReader(stdOutStream));
-		String line;
-		try {
-			while ((line = reader.readLine()) != null) {
-				DlabProcess.getInstance().toStdOut(processId, line);
-			}
-			DlabProcess.getInstance().toStdOut(processId, null);
-		} catch (IOException e) {
-			DlabProcess.getInstance().toStdErr(processId, "Failed process STDOUT reader", e);
-			DlabProcess.getInstance().failed(processId);
-		}
-	}
-
-	@Override
-	public ProcessInfo get() {
-		return new ProcessInfo(
-				processId,
-				status,
-				command,
-				stdOut.toString(),
-				stdErr.toString(),
-				exitCode,
-				startTimeStamp, System.currentTimeMillis(), rejected, pid);
-	}
-
-	@Override
-	public boolean test() {
-		return finished && stdOutClosed && stdErrClosed;
-	}
-
-	private void setReady() {
-		finished = true;
-		stdOutClosed = true;
-		stdErrClosed = true;
-	}
-
-	public static void future(ProcessInfoBuilder b, CompletableFuture<ProcessInfo> future) {
-		if (b.future == null) {
-			b.future = future;
-		} else {
-			future.cancel(true);
-		}
-	}
-
-	@Override
-	public void onTimeout() {
-		if (status != TIMEOUT) {
-			log.debug("Stopping on timeout ...");
-			stop(this, "STOP");
-			status = TIMEOUT;
-			expirationTime += 60_000;
-		} else {
-			log.debug("Killing on timeout ...");
-			kill(this, "KILL");
-			status = TIMEOUT;
-			setReady();
-		}
-	}
-
-	@Override
-	public long getExpirationTime() {
-		return expirationTime;
-	}
-
-	private static Function<Process, Integer> pidSupplier = null;
-
-	public static int getPid(Process process) {
-		try {
-			if (pidSupplier == null) {
-				Class<?> cProcessImpl = process.getClass();
-				final Field fPid = cProcessImpl.getDeclaredField("pid");
-				log.debug("PID field found");
-				if (!fPid.isAccessible()) {
-					fPid.setAccessible(true);
-				}
-				pidSupplier = p -> {
-					try {
-						return fPid.getInt(p);
-					} catch (IllegalAccessException e) {
-						log.error("Unable to access PID. {}", e.getMessage());
-						return -1;
-					}
-				};
-			}
-			return pidSupplier.apply(process);
-		} catch (NoSuchFieldException e) {
-			log.debug("PID field not found");
-			pidSupplier = p -> -1;
-			return -1;
-		}
-	}
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/process/exception/DlabProcessException.java b/services/provisioning-service/src/main/java/com/epam/dlab/process/exception/DlabProcessException.java
deleted file mode 100644
index a7acc68..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/process/exception/DlabProcessException.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.process.exception;
-
-public class DlabProcessException extends RuntimeException {
-	private static final long serialVersionUID = 1L;
-
-	public DlabProcessException() {
-    }
-
-    public DlabProcessException(String message) {
-        super(message);
-    }
-
-    public DlabProcessException(String message, Exception cause) {
-        super(message, cause);
-    }
-
-    public DlabProcessException(Exception cause) {
-        super(cause);
-    }
-
-    public DlabProcessException(String message, Exception cause, boolean enableSuppression, boolean writableStackTrace) {
-        super(message, cause, enableSuppression, writableStackTrace);
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/process/model/DlabProcess.java b/services/provisioning-service/src/main/java/com/epam/dlab/process/model/DlabProcess.java
deleted file mode 100644
index 6f65e30..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/process/model/DlabProcess.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.process.model;
-
-import com.epam.dlab.process.ProcessConveyor;
-import com.epam.dlab.process.builder.ProcessInfoBuilder;
-import com.epam.dlab.util.SecurityUtils;
-import io.dropwizard.util.Duration;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.*;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
-@Slf4j
-public class DlabProcess {
-
-	private final static DlabProcess INSTANCE = new DlabProcess();
-
-	private ExecutorService executorService = Executors.newFixedThreadPool(50*3);
-	private Map<String,ExecutorService> perUserService = new ConcurrentHashMap<>();
-	private int userMaxparallelism = 5;
-	private long expirationTime = TimeUnit.HOURS.toMillis(3);
-
-	public static DlabProcess getInstance() {
-		return INSTANCE;
-	}
-
-	private final ProcessConveyor processConveyor;
-
-	private DlabProcess() {
-		this.processConveyor = new ProcessConveyor();
-	}
-
-	public ExecutorService getExecutorService() {
-		return executorService;
-	}
-
-	public void setMaxProcessesPerBox(int parallelism) {
-		this.executorService.shutdown();
-		this.executorService = Executors.newFixedThreadPool(3*parallelism);
-	}
-
-	public void setMaxProcessesPerUser(int parallelism) {
-		this.userMaxparallelism = parallelism;
-		this.perUserService.forEach((k, e)->{e.shutdown();});
-		this.perUserService = new ConcurrentHashMap<>();
-	}
-
-	public ExecutorService getUsersExecutorService(String user) {
-		perUserService.putIfAbsent(user,Executors.newFixedThreadPool(userMaxparallelism));
-		return perUserService.get(user);
-	}
-
-	public CompletableFuture<ProcessInfo> start(ProcessId id, String... command){
-		log.debug("Run OS command for user {} with UUID {}: {}", id.getUser(), id.getCommand(),
-				SecurityUtils.hideCreds(command));
-		CompletableFuture<ProcessInfo> future = processConveyor.createBuildFuture( id, ()-> new ProcessInfoBuilder(id,
-				expirationTime) );
-		processConveyor.add(id, future, ProcessStep.FUTURE);
-		processConveyor.add(id, command, ProcessStep.START);
-		return future;
-	}
-
-	public CompletableFuture<ProcessInfo> start(String username, String uniqDescriptor, String... command){
-		return start(new ProcessId(username,uniqDescriptor),command);
-	}
-
-	public CompletableFuture<ProcessInfo> start(String username, String... command){
-		return start(new ProcessId(username,String.join(" ",command)),command);
-	}
-
-
-	public CompletableFuture<Boolean> stop(ProcessId id){
-		return processConveyor.add(id,"STOP",ProcessStep.STOP);
-	}
-
-	public CompletableFuture<Boolean> stop(String username, String command){ return stop(new ProcessId(username,command));}
-
-	public CompletableFuture<Boolean> kill(ProcessId id){
-		return processConveyor.add(id,"KILL",ProcessStep.KILL);
-	}
-
-	public CompletableFuture<Boolean> kill(String username, String command){ return kill(new ProcessId(username,command));}
-
-	public CompletableFuture<Boolean> failed(ProcessId id){
-		return processConveyor.add(id,"FAILED",ProcessStep.FAILED);
-	}
-
-	public CompletableFuture<Boolean> finish(ProcessId id, Integer exitStatus){
-		return processConveyor.add(id,exitStatus,ProcessStep.FINISH);
-	}
-
-	public CompletableFuture<Boolean> toStdOut(ProcessId id, String msg){
-		return processConveyor.add(id,msg,ProcessStep.STD_OUT);
-	}
-
-	public CompletableFuture<Boolean> toStdErr(ProcessId id, String msg){
-		return processConveyor.add(id,msg,ProcessStep.STD_ERR);
-	}
-
-	public CompletableFuture<Boolean> toStdErr(ProcessId id, String msg, Exception err){
-		StringWriter sw = new StringWriter();
-		sw.append(msg);
-		sw.append("\n");
-		PrintWriter pw = new PrintWriter(sw);
-		err.printStackTrace(pw);
-		return processConveyor.add(id,sw.toString(),ProcessStep.STD_ERR);
-	}
-
-	public Collection<ProcessId> getActiveProcesses() {
-		Collection<ProcessId> pList = new ArrayList<>();
-		processConveyor.forEachKeyAndBuilder( (k,b)-> pList.add(k) );
-		return pList;
-	}
-
-	public Collection<ProcessId> getActiveProcesses(String username){
-		return getActiveProcesses().stream().filter((id)->id.getUser().equals(username)).collect(Collectors.toList());
-	}
-
-	public Supplier<? extends ProcessInfo> getProcessInfoSupplier(ProcessId id) {
-		return processConveyor.getInfoSupplier(id);
-	}
-
-	public Supplier<? extends ProcessInfo> getProcessInfoSupplier(String username, String command){
-		return getProcessInfoSupplier(new ProcessId(username,command));
-	}
-
-	public void setProcessTimeout(long time, TimeUnit unit) {
-		this.expirationTime = unit.toMillis(time);
-	}
-
-	public void setProcessTimeout(Duration duration) {
-		this.expirationTime = duration.toMilliseconds();
-	}
-
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessId.java b/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessId.java
deleted file mode 100644
index a66559e..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessId.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.process.model;
-
-public class ProcessId {
-
-    private final String user;
-    private final String command;
-
-    public ProcessId(String user, String command) {
-        this.user = user;
-        this.command = command;
-    }
-
-    public String getCommand() {
-        return command;
-    }
-
-    public String getUser() {
-        return user;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        ProcessId processId = (ProcessId) o;
-
-        if (user != null ? !user.equals(processId.user) : processId.user != null) return false;
-        return command != null ? command.equals(processId.command) : processId.command == null;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = user != null ? user.hashCode() : 0;
-        result = 31 * result + (command != null ? command.hashCode() : 0);
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return "ProcessId{" +
-                "user='" + user + '\'' +
-                ", command='" + command + '\'' +
-                '}';
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessInfo.java b/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessInfo.java
deleted file mode 100644
index 629fd0d..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessInfo.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.process.model;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-
-public class ProcessInfo {
-
-    private final ProcessId id;
-    private final String[] command;
-    private final ProcessStatus status;
-    private final String stdOut;
-    private final String stdErr;
-    private final int exitCode;
-    private final long startTimeStamp;
-    private final long infoTimeStamp;
-    private final int pid;
-
-    private final Collection<ProcessInfo> rejectedCommands;
-
-    public ProcessInfo(ProcessId id, ProcessStatus status, String[] command, String stdOut, String stdErr, int exitCode,
-                 long startTimeStamp, long infoTimeStamp, Collection<ProcessInfo> rejected, int pid) {
-        this.id             = id;
-        this.status         = status;
-        this.command        = command;
-        this.stdOut         = stdOut;
-        this.stdErr         = stdErr;
-        this.exitCode       = exitCode;
-        this.startTimeStamp = startTimeStamp;
-        this.infoTimeStamp  = infoTimeStamp;
-        this.pid            = pid;
-
-        if(rejected != null && rejected.size() > 0) {
-            Collection<ProcessInfo> r = new ArrayList<>();
-            for(ProcessInfo info:rejected) {
-                if(info != null) {
-                    r.add(info);
-                }
-            }
-            this.rejectedCommands = Collections.unmodifiableCollection(r);
-        } else {
-            this.rejectedCommands = null;
-        }
-
-    }
-
-    public String getCommand() {
-        return String.join(" ",command);
-    }
-
-    public ProcessStatus getStatus() {
-        return status;
-    }
-
-    public String getStdOut() {
-        return stdOut;
-    }
-
-    public String getStdErr() {
-        return stdErr;
-    }
-
-    public int getExitCode() {
-        return exitCode;
-    }
-
-    public long getStartTimeStamp() {
-        return startTimeStamp;
-    }
-
-    public long getInfoTimeStamp() {
-        return infoTimeStamp;
-    }
-
-    public ProcessId getId() {
-        return id;
-    }
-
-    public int getPid() {
-        return pid;
-    }
-
-    public Collection<ProcessInfo> getRejectedCommands() {
-        return Collections.unmodifiableCollection(rejectedCommands);
-    }
-
-    @Override
-    public String toString() {
-        return "ProcessInfo{" +
-                "id='" + id + '\'' +
-                ", command='" + getCommand() + '\'' +
-                ", pid=" + pid +
-                ", status=" + status +
-                ", stdOut='" + stdOut + '\'' +
-                ", stdErr='" + stdErr + '\'' +
-                ", exitCode=" + exitCode +
-                ", startTimeStamp=" + startTimeStamp +
-                ", infoTimeStamp=" + infoTimeStamp +
-                ", rejectedCommands=" + rejectedCommands +
-                '}';
-    }
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessStatus.java b/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessStatus.java
deleted file mode 100644
index 35985b5..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessStatus.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.process.model;
-
-public enum ProcessStatus {
-    CREATED,
-    LAUNCHING,
-    RUNNING,
-    STOPPED,
-    KILLED,
-    TIMEOUT,
-    FINISHED,
-    REJECTED,
-    FAILED,
-    SCHEDULED
-}
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessStep.java b/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessStep.java
deleted file mode 100644
index d45d5b6..0000000
--- a/services/provisioning-service/src/main/java/com/epam/dlab/process/model/ProcessStep.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.process.model;
-
-import com.aegisql.conveyor.SmartLabel;
-import com.epam.dlab.process.builder.ProcessInfoBuilder;
-
-import java.util.function.BiConsumer;
-
-public enum ProcessStep implements SmartLabel<ProcessInfoBuilder> {
-    START(ProcessInfoBuilder::start),
-    STOP(ProcessInfoBuilder::stop),
-    KILL(ProcessInfoBuilder::kill),
-    FINISH(ProcessInfoBuilder::finish),
-    STD_OUT(ProcessInfoBuilder::stdOut),
-    STD_ERR(ProcessInfoBuilder::stdErr),
-    FAILED(ProcessInfoBuilder::failed),
-    FUTURE(ProcessInfoBuilder::future),
-;
-    private BiConsumer<ProcessInfoBuilder, Object> consumer;
-
-    @SuppressWarnings("unchecked")
-	<T> ProcessStep(BiConsumer<ProcessInfoBuilder, T> consumer) {
-        this.consumer = (BiConsumer<ProcessInfoBuilder, Object>) consumer;
-    }
-
-    @Override
-    public BiConsumer<ProcessInfoBuilder, Object> get() {
-        return consumer;
-    }
-}
diff --git a/services/provisioning-service/src/main/resources/mock_file/azure/auth.json b/services/provisioning-service/src/main/resources/mock_file/azure/auth.json
new file mode 100644
index 0000000..f9a12f8
--- /dev/null
+++ b/services/provisioning-service/src/main/resources/mock_file/azure/auth.json
@@ -0,0 +1,5 @@
+{
+  "clientId": "",
+  "clientSecret": "",
+  "tenantId": ""
+}
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/backup.json b/services/provisioning-service/src/main/resources/mock_response/aws/backup.json
index 53e9f40..0b81c3a 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/backup.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/backup.json
@@ -1,5 +1,5 @@
 {
   "status": "created",
-  "backup_file": "/opt/dlab/tmp/dlab.tar.gz",
+  "backup_file": "/opt/datalab/tmp/datalab.tar.gz",
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_configure.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_configure.json
index b8be3bf..6219072 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_configure.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_configure.json
@@ -6,7 +6,7 @@
          "Tag_name": "${CONF_SERVICE_BASE_NAME}-tag",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_configure_failed.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_configure_failed.json
index a33e4b4..6dbbf5b 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_configure_failed.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_configure_failed.json
@@ -5,7 +5,7 @@
       "hostname": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-des-${EXPLORATORY_NAME}-${COMPUTATIONAL_NAME}-${NOTEBOOK_ID}",
       "error": "Cannot configure EMR"
     },
-    "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_create.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_create.json
index b3b8d8d..d532992 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_create.json
@@ -14,7 +14,7 @@
           }
         ]
       },
-      "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_create_failed.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_create_failed.json
index 96093ef..beb8aa2 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_create_failed.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_create_failed.json
@@ -5,7 +5,7 @@
       "hostname": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-des-${EXPLORATORY_NAME}-${COMPUTATIONAL_NAME}-${NOTEBOOK_ID}",
       "error":"Cannot create EMR"
     },
-    "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_lib_install.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_lib_install.json
index 4110cf8..29bb856 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_lib_install.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_lib_install.json
@@ -5,7 +5,7 @@
       "Action": "Install additional libs",
       "Libs": ${LIB_INSTALL}
 },
-"log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+"log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
 },
 "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_lib_list.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_lib_list.json
index 2fba799..92348cf 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_lib_list.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_lib_list.json
@@ -3,9 +3,9 @@
   "response": {
     "result": {
       "Action": "Get list of all available libraries",
-      "file": "/opt/dlab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
+      "file": "/opt/datalab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_terminate.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_terminate.json
index 4864cc1..a8fbad1 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine-service_terminate.json
@@ -7,7 +7,7 @@
          "EMR_name": "${EMR_CLUSTER_NAME}",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_configure.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_configure.json
index 6529169..685ba64 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_configure.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_configure.json
@@ -5,7 +5,7 @@
       "Action": "Configure notebook server",
       "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_create.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_create.json
index 9df4d36..9c19f00 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_create.json
@@ -16,7 +16,7 @@
         }
       ]
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_lib_install.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_lib_install.json
index 4110cf8..29bb856 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_lib_install.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_lib_install.json
@@ -5,7 +5,7 @@
       "Action": "Install additional libs",
       "Libs": ${LIB_INSTALL}
 },
-"log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+"log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
 },
 "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_lib_list.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_lib_list.json
index 2fba799..92348cf 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_lib_list.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_lib_list.json
@@ -3,9 +3,9 @@
   "response": {
     "result": {
       "Action": "Get list of all available libraries",
-      "file": "/opt/dlab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
+      "file": "/opt/datalab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_start.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_start.json
index fe559d9..110fbb6 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_start.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_start.json
@@ -5,7 +5,7 @@
       "Action": "Start Data Engine",
       "service_base_name": "${CONF_SERVICE_BASE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_stop.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_stop.json
index 44da2d2..5396ad5 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_stop.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_stop.json
@@ -5,7 +5,7 @@
       "Action": "Stop Data Engine",
       "service_base_name": "${CONF_SERVICE_BASE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_terminate.json b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_terminate.json
index 6fb7768..d3b2135 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/dataengine_terminate.json
@@ -5,7 +5,7 @@
       "Action": "Terminate Data Engine",
       "service_base_name": "${CONF_SERVICE_BASE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/edge_create.json b/services/provisioning-service/src/main/resources/mock_response/aws/edge_create.json
index 81afe8a..abf75c3 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/edge_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/edge_create.json
@@ -32,10 +32,10 @@
       "edge_sg": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-SG",
       "socks_port": "1080",
       "notebook_subnet": "172.31.48.0/24",
-      "@class": "com.epam.dlab.dto.aws.edge.EdgeInfoAws",
+      "@class": "com.epam.datalab.dto.aws.edge.EdgeInfoAws",
       "shared_bucket_name": "${CONF_SERVICE_BASE_NAME}-shared-bucket"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/edge_start.json b/services/provisioning-service/src/main/resources/mock_response/aws/edge_start.json
index 5dca2f0..3cee1bb 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/edge_start.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/edge_start.json
@@ -8,7 +8,7 @@
          "Action": "Start up notebook server",
          "ip": "172.31.2.250"
       },
-      "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/edge_stop.json b/services/provisioning-service/src/main/resources/mock_response/aws/edge_stop.json
index 1a5d4df..dd0ea45 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/edge_stop.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/edge_stop.json
@@ -5,7 +5,7 @@
          "instance_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
          "Action": "Stop edge server"
       },
-      "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/edge_terminate.json b/services/provisioning-service/src/main/resources/mock_response/aws/edge_terminate.json
index 5de66ef..b303484 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/edge_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/edge_terminate.json
@@ -6,7 +6,7 @@
       "service_base_name": "${CONF_SERVICE_BASE_NAME}",
       "user_name": "${EDGE_USER_NAME}"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_check_inactivity.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_check_inactivity.json
index af3320b..0fdcd05 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_check_inactivity.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_check_inactivity.json
@@ -2,7 +2,7 @@
   "status": "ok",
   "response": {
     "result": "1549464798",
-    "log": "/var/log/dlab/notebook/notebook_bohdan_hliva_eb30e2bb-28db-4b07-bf16-e634d448952f.log"
+    "log": "/var/log/datalab/notebook/notebook_bohdan_hliva_eb30e2bb-28db-4b07-bf16-e634d448952f.log"
   },
   "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create.json
index 53193b4..794eeba 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create.json
@@ -15,7 +15,7 @@
          "Action": "Create new notebook server",
          "master_keyname": "${CONF_KEY_NAME}"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create_failed.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create_failed.json
index 156c73d..a5e663f 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create_failed.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create_failed.json
@@ -5,7 +5,7 @@
       "error": " [Error-2017-07-12 13:08:51]:Failed to configure TensorFlow.",
       "notebook_name" : "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-nb-${EXPLORATORY_NAME}-${NOTEBOOK_ID}"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create_image.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create_image.json
index 939b7d6..3538ddf 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create_image.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_create_image.json
@@ -10,7 +10,7 @@
          "status" : "created",
          "Action": "Create image from notebook"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_git_creds.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_git_creds.json
index a2b2650..8820278 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_git_creds.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_git_creds.json
@@ -4,7 +4,7 @@
       "result": {
          "Action": "Setup git credentials"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_install.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_install.json
index fa90f10..4992831 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_install.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_install.json
@@ -5,7 +5,7 @@
       "Action": "Install additional libs",
       "Libs": ${LIB_INSTALL}
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
-  },
-  "request_id": "${REQUEST_ID}"
+"log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+},
+"request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_list.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_list.json
index 2fba799..92348cf 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_list.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_list.json
@@ -3,9 +3,9 @@
   "response": {
     "result": {
       "Action": "Get list of all available libraries",
-      "file": "/opt/dlab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
+      "file": "/opt/datalab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_list_pkgs.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_list_pkgs.json
index b0816fc..acc4568 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_list_pkgs.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_lib_list_pkgs.json
@@ -5,11 +5,6 @@
   	"pyvcf/xenial": "0.6.7-2build1",
   	"pyxplot/xenial": "0.9.2-6build1"
   	},
-  "pip2": {
-  	"requests": "N/A",
-  	"configparser": "N/A",
-	  "SparseAce": "N/A"
-  	},
   "pip3": {
   	"configparser": "N/A",
 	  "sparkL": "N/A"
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_start.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_start.json
index 525bd9a..6fa8fe8 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_start.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_start.json
@@ -8,7 +8,7 @@
          "hostname": "ip-172-31-48-131.us-west-2.compute.internal",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_status.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_status.json
index 940a137..4ede40b 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_status.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_status.json
@@ -1,8 +1,9 @@
 {
-   "status": "ok",
-   "response": {
-      "result": ${LIST_RESOURCES},
-      "log": "/var/log/dlab/status/status_${EDGE_USER_NAME}_${REQUEST_ID}.log"
-   },
-   "request_id": "${REQUEST_ID}"
+  "status": "ok",
+  "response": {
+    "result": {
+    },
+    "log": "/var/log/datalab/status/status_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+  },
+"request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_stop.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_stop.json
index e0ee8b1..fd77b99 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_stop.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_stop.json
@@ -7,7 +7,7 @@
          "Tag_name": "${CONF_SERVICE_BASE_NAME}-tag",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_terminate.json b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_terminate.json
index a9e2a3a..9db74c9 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/notebook_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/notebook_terminate.json
@@ -7,7 +7,7 @@
          "Tag_name": "${CONF_SERVICE_BASE_NAME}-tag",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/project_create.json b/services/provisioning-service/src/main/resources/mock_response/aws/project_create.json
index d5f2d68..e63315f 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/project_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/project_create.json
@@ -6,7 +6,7 @@
       "full_edge_conf": {
         "edge_service_account_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
         "fw_edge_egress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-egress-internal",
-        "dlab_ssh_user": "dlab-user",
+        "datalab_ssh_user": "datalab-user",
         "ps_role_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
         "fw_ps_egress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-egress-public",
         "private_ip": "10.10.0.3",
@@ -36,7 +36,7 @@
         "edge_user_name": "${EDGE_USER_NAME}",
         "private_subnet_cidr": "10.10.16.0/24",
         "fw_edge_ingress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-ingress-internal",
-        "vpc_selflink": "https://www.googleapis.com/compute/v1/projects/or2-msq-epmc-dlab-t1iylu/global/networks/${CONF_SERVICE_BASE_NAME}-ssn-vpc",
+        "vpc_selflink": "https://www.googleapis.com/compute/v1/projects/or2-msq-epmc-datalab-t1iylu/global/networks/${CONF_SERVICE_BASE_NAME}-ssn-vpc",
         "instance_size": "n1-standard-1",
         "notebook_firewall_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-nb-firewall"
       },
@@ -49,9 +49,9 @@
       "socks_port": "1080",
       "notebook_subnet": "10.10.16.0/24",
       "project_name": "${PROJECT_NAME}",
-      "@class": "com.epam.dlab.dto.aws.edge.EdgeInfoAws"
+      "@class": "com.epam.datalab.dto.aws.edge.EdgeInfoAws"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/project_recreate.json b/services/provisioning-service/src/main/resources/mock_response/aws/project_recreate.json
new file mode 100644
index 0000000..e63315f
--- /dev/null
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/project_recreate.json
@@ -0,0 +1,57 @@
+{
+  "status": "ok",
+  "response": {
+    "result": {
+      "tunnel_port": "22",
+      "full_edge_conf": {
+        "edge_service_account_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
+        "fw_edge_egress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-egress-internal",
+        "datalab_ssh_user": "datalab-user",
+        "ps_role_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
+        "fw_ps_egress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-egress-public",
+        "private_ip": "10.10.0.3",
+        "fw_ps_ingress": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-ingress",
+        "ssh_key_path": "/root/keys/BDCC-DSS-POC.pem",
+        "zone": "us-west1-a ",
+        "fw_edge_egress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-egress-public",
+        "ami_name": "/projects/ubuntu-os-cloud/global/images/ubuntu-1604-xenial-v20170721",
+        "edge_role_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
+        "private_subnet_prefix": "24",
+        "subnet_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-subnet",
+        "vpc_cidr": "10.10.0.0/16",
+        "key_name": "${CONF_KEY_NAME}",
+        "service_base_name": "${CONF_SERVICE_BASE_NAME}",
+        "static_address_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ip",
+        "fw_ps_egress_private": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-egress-private",
+        "vpc_name": "${CONF_SERVICE_BASE_NAME}-ssn-vpc",
+        "static_ip": "104.198.5.3",
+        "bucket_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-bucket",
+        "fw_edge_ingress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-ingress-public",
+        "ps_service_account_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
+        "firewall_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-firewall",
+        "region": "us-west1",
+        "fw_common_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
+        "instance_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
+        "user_keyname": "${EDGE_USER_NAME}",
+        "edge_user_name": "${EDGE_USER_NAME}",
+        "private_subnet_cidr": "10.10.16.0/24",
+        "fw_edge_ingress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-ingress-internal",
+        "vpc_selflink": "https://www.googleapis.com/compute/v1/projects/or2-msq-epmc-datalab-t1iylu/global/networks/${CONF_SERVICE_BASE_NAME}-ssn-vpc",
+        "instance_size": "n1-standard-1",
+        "notebook_firewall_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-nb-firewall"
+      },
+      "key_name": "BDCC-DSS-POC",
+      "hostname": "104.198.5.3",
+      "public_ip": "104.198.5.3",
+      "ip": "10.10.0.3",
+      "Action": "Create new EDGE server",
+      "user_own_bucket_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-bucket",
+      "socks_port": "1080",
+      "notebook_subnet": "10.10.16.0/24",
+      "project_name": "${PROJECT_NAME}",
+      "@class": "com.epam.datalab.dto.aws.edge.EdgeInfoAws"
+    },
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+  },
+  "request_id": "${REQUEST_ID}"
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/aws/project_terminate.json b/services/provisioning-service/src/main/resources/mock_response/aws/project_terminate.json
index 5de66ef..b303484 100644
--- a/services/provisioning-service/src/main/resources/mock_response/aws/project_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/aws/project_terminate.json
@@ -6,7 +6,7 @@
       "service_base_name": "${CONF_SERVICE_BASE_NAME}",
       "user_name": "${EDGE_USER_NAME}"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/backup.json b/services/provisioning-service/src/main/resources/mock_response/azure/backup.json
index 53e9f40..0b81c3a 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/backup.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/backup.json
@@ -1,5 +1,5 @@
 {
   "status": "created",
-  "backup_file": "/opt/dlab/tmp/dlab.tar.gz",
+  "backup_file": "/opt/datalab/tmp/datalab.tar.gz",
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_configure.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_configure.json
index b8be3bf..6219072 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_configure.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_configure.json
@@ -6,7 +6,7 @@
          "Tag_name": "${CONF_SERVICE_BASE_NAME}-tag",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_configure_failed.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_configure_failed.json
index a33e4b4..6dbbf5b 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_configure_failed.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_configure_failed.json
@@ -5,7 +5,7 @@
       "hostname": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-des-${EXPLORATORY_NAME}-${COMPUTATIONAL_NAME}-${NOTEBOOK_ID}",
       "error": "Cannot configure EMR"
     },
-    "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_create.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_create.json
index 05bc93a..48e8049 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_create.json
@@ -14,7 +14,7 @@
           }
         ]
       },
-      "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_create_failed.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_create_failed.json
index 96093ef..beb8aa2 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_create_failed.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_create_failed.json
@@ -5,7 +5,7 @@
       "hostname": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-des-${EXPLORATORY_NAME}-${COMPUTATIONAL_NAME}-${NOTEBOOK_ID}",
       "error":"Cannot create EMR"
     },
-    "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_lib_install.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_lib_install.json
index 4110cf8..29bb856 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_lib_install.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_lib_install.json
@@ -5,7 +5,7 @@
       "Action": "Install additional libs",
       "Libs": ${LIB_INSTALL}
 },
-"log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+"log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
 },
 "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_lib_list.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_lib_list.json
index 2fba799..92348cf 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_lib_list.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_lib_list.json
@@ -3,9 +3,9 @@
   "response": {
     "result": {
       "Action": "Get list of all available libraries",
-      "file": "/opt/dlab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
+      "file": "/opt/datalab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_terminate.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_terminate.json
index 4864cc1..a8fbad1 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine-service_terminate.json
@@ -7,7 +7,7 @@
          "EMR_name": "${EMR_CLUSTER_NAME}",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_configure.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_configure.json
index 6529169..685ba64 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_configure.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_configure.json
@@ -5,7 +5,7 @@
       "Action": "Configure notebook server",
       "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_create.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_create.json
index 9df4d36..9c19f00 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_create.json
@@ -16,7 +16,7 @@
         }
       ]
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_lib_install.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_lib_install.json
index 4110cf8..29bb856 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_lib_install.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_lib_install.json
@@ -5,7 +5,7 @@
       "Action": "Install additional libs",
       "Libs": ${LIB_INSTALL}
 },
-"log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+"log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
 },
 "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_lib_list.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_lib_list.json
index 2fba799..92348cf 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_lib_list.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_lib_list.json
@@ -3,9 +3,9 @@
   "response": {
     "result": {
       "Action": "Get list of all available libraries",
-      "file": "/opt/dlab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
+      "file": "/opt/datalab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_start.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_start.json
index fe559d9..110fbb6 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_start.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_start.json
@@ -5,7 +5,7 @@
       "Action": "Start Data Engine",
       "service_base_name": "${CONF_SERVICE_BASE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_stop.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_stop.json
index 44da2d2..5396ad5 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_stop.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_stop.json
@@ -5,7 +5,7 @@
       "Action": "Stop Data Engine",
       "service_base_name": "${CONF_SERVICE_BASE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_terminate.json b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_terminate.json
index 6fb7768..d3b2135 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/dataengine_terminate.json
@@ -5,7 +5,7 @@
       "Action": "Terminate Data Engine",
       "service_base_name": "${CONF_SERVICE_BASE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/edge_create.json b/services/provisioning-service/src/main/resources/mock_response/azure/edge_create.json
index b2a9931..975ab6a 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/edge_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/edge_create.json
@@ -34,7 +34,7 @@
          "notebook_subnet": "172.31.48.0/24",
          "shared_bucket_name": "${CONF_SERVICE_BASE_NAME}-shared-bucket"
       },
-      "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/edge_start.json b/services/provisioning-service/src/main/resources/mock_response/azure/edge_start.json
index 5dca2f0..3cee1bb 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/edge_start.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/edge_start.json
@@ -8,7 +8,7 @@
          "Action": "Start up notebook server",
          "ip": "172.31.2.250"
       },
-      "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/edge_stop.json b/services/provisioning-service/src/main/resources/mock_response/azure/edge_stop.json
index 1a5d4df..dd0ea45 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/edge_stop.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/edge_stop.json
@@ -5,7 +5,7 @@
          "instance_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
          "Action": "Stop edge server"
       },
-      "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/edge_terminate.json b/services/provisioning-service/src/main/resources/mock_response/azure/edge_terminate.json
index 5de66ef..b303484 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/edge_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/edge_terminate.json
@@ -6,7 +6,7 @@
       "service_base_name": "${CONF_SERVICE_BASE_NAME}",
       "user_name": "${EDGE_USER_NAME}"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create.json b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create.json
index 53193b4..794eeba 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create.json
@@ -15,7 +15,7 @@
          "Action": "Create new notebook server",
          "master_keyname": "${CONF_KEY_NAME}"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create_failed.json b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create_failed.json
index 156c73d..a5e663f 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create_failed.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create_failed.json
@@ -5,7 +5,7 @@
       "error": " [Error-2017-07-12 13:08:51]:Failed to configure TensorFlow.",
       "notebook_name" : "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-nb-${EXPLORATORY_NAME}-${NOTEBOOK_ID}"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create_image.json b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create_image.json
index 2ea6023..b34972d 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create_image.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_create_image.json
@@ -11,7 +11,7 @@
          "ip" : "102.011.10.3",
          "Action": "Create image from notebook"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_git_creds.json b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_git_creds.json
index a2b2650..8820278 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_git_creds.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_git_creds.json
@@ -4,7 +4,7 @@
       "result": {
          "Action": "Setup git credentials"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_install.json b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_install.json
index fa90f10..4992831 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_install.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_install.json
@@ -5,7 +5,7 @@
       "Action": "Install additional libs",
       "Libs": ${LIB_INSTALL}
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
-  },
-  "request_id": "${REQUEST_ID}"
+"log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+},
+"request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_list.json b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_list.json
index 2fba799..92348cf 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_list.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_list.json
@@ -3,9 +3,9 @@
   "response": {
     "result": {
       "Action": "Get list of all available libraries",
-      "file": "/opt/dlab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
+      "file": "/opt/datalab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_list_pkgs.json b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_list_pkgs.json
index b0816fc..acc4568 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_list_pkgs.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_lib_list_pkgs.json
@@ -5,11 +5,6 @@
   	"pyvcf/xenial": "0.6.7-2build1",
   	"pyxplot/xenial": "0.9.2-6build1"
   	},
-  "pip2": {
-  	"requests": "N/A",
-  	"configparser": "N/A",
-	  "SparseAce": "N/A"
-  	},
   "pip3": {
   	"configparser": "N/A",
 	  "sparkL": "N/A"
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_start.json b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_start.json
index 525bd9a..6fa8fe8 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_start.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_start.json
@@ -8,7 +8,7 @@
          "hostname": "ip-172-31-48-131.us-west-2.compute.internal",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_status.json b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_status.json
index 940a137..5b9d881 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_status.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_status.json
@@ -1,8 +1,9 @@
 {
-   "status": "ok",
-   "response": {
-      "result": ${LIST_RESOURCES},
-      "log": "/var/log/dlab/status/status_${EDGE_USER_NAME}_${REQUEST_ID}.log"
-   },
-   "request_id": "${REQUEST_ID}"
+  "status": "ok",
+  "response": {
+    "result": {
+    },
+    "log": "/var/log/datalab/status/status_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+  },
+  "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_stop.json b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_stop.json
index e0ee8b1..fd77b99 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_stop.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_stop.json
@@ -7,7 +7,7 @@
          "Tag_name": "${CONF_SERVICE_BASE_NAME}-tag",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_terminate.json b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_terminate.json
index a9e2a3a..9db74c9 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/notebook_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/notebook_terminate.json
@@ -7,7 +7,7 @@
          "Tag_name": "${CONF_SERVICE_BASE_NAME}-tag",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/project_create.json b/services/provisioning-service/src/main/resources/mock_response/azure/project_create.json
index 41a6692..79a1cc5 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/project_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/project_create.json
@@ -6,7 +6,7 @@
       "full_edge_conf": {
         "edge_service_account_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
         "fw_edge_egress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-egress-internal",
-        "dlab_ssh_user": "dlab-user",
+        "datalab_ssh_user": "datalab-user",
         "ps_role_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
         "fw_ps_egress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-egress-public",
         "private_ip": "10.10.0.3",
@@ -36,7 +36,7 @@
         "edge_user_name": "${EDGE_USER_NAME}",
         "private_subnet_cidr": "10.10.16.0/24",
         "fw_edge_ingress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-ingress-internal",
-        "vpc_selflink": "https://www.googleapis.com/compute/v1/projects/or2-msq-epmc-dlab-t1iylu/global/networks/${CONF_SERVICE_BASE_NAME}-ssn-vpc",
+        "vpc_selflink": "https://www.googleapis.com/compute/v1/projects/or2-msq-epmc-datalab-t1iylu/global/networks/${CONF_SERVICE_BASE_NAME}-ssn-vpc",
         "instance_size": "n1-standard-1",
         "notebook_firewall_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-nb-firewall"
       },
@@ -49,9 +49,9 @@
       "socks_port": "1080",
       "notebook_subnet": "10.10.16.0/24",
       "project_name": "${PROJECT_NAME}",
-      "@class": "com.epam.dlab.dto.azure.edge.EdgeInfoAzure"
+      "@class": "com.epam.datalab.dto.azure.edge.EdgeInfoAzure"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/project_recreate.json b/services/provisioning-service/src/main/resources/mock_response/azure/project_recreate.json
new file mode 100644
index 0000000..79a1cc5
--- /dev/null
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/project_recreate.json
@@ -0,0 +1,57 @@
+{
+  "status": "ok",
+  "response": {
+    "result": {
+      "tunnel_port": "22",
+      "full_edge_conf": {
+        "edge_service_account_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
+        "fw_edge_egress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-egress-internal",
+        "datalab_ssh_user": "datalab-user",
+        "ps_role_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
+        "fw_ps_egress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-egress-public",
+        "private_ip": "10.10.0.3",
+        "fw_ps_ingress": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-ingress",
+        "ssh_key_path": "/root/keys/BDCC-DSS-POC.pem",
+        "zone": "us-west1-a ",
+        "fw_edge_egress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-egress-public",
+        "ami_name": "/projects/ubuntu-os-cloud/global/images/ubuntu-1604-xenial-v20170721",
+        "edge_role_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
+        "private_subnet_prefix": "24",
+        "subnet_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-subnet",
+        "vpc_cidr": "10.10.0.0/16",
+        "key_name": "${CONF_KEY_NAME}",
+        "service_base_name": "${CONF_SERVICE_BASE_NAME}",
+        "static_address_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ip",
+        "fw_ps_egress_private": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-egress-private",
+        "vpc_name": "${CONF_SERVICE_BASE_NAME}-ssn-vpc",
+        "static_ip": "104.198.5.3",
+        "bucket_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-bucket",
+        "fw_edge_ingress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-ingress-public",
+        "ps_service_account_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
+        "firewall_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-firewall",
+        "region": "us-west1",
+        "fw_common_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
+        "instance_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
+        "user_keyname": "${EDGE_USER_NAME}",
+        "edge_user_name": "${EDGE_USER_NAME}",
+        "private_subnet_cidr": "10.10.16.0/24",
+        "fw_edge_ingress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-ingress-internal",
+        "vpc_selflink": "https://www.googleapis.com/compute/v1/projects/or2-msq-epmc-datalab-t1iylu/global/networks/${CONF_SERVICE_BASE_NAME}-ssn-vpc",
+        "instance_size": "n1-standard-1",
+        "notebook_firewall_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-nb-firewall"
+      },
+      "key_name": "BDCC-DSS-POC",
+      "hostname": "104.198.5.3",
+      "public_ip": "104.198.5.3",
+      "ip": "10.10.0.3",
+      "Action": "Create new EDGE server",
+      "user_own_bucket_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-bucket",
+      "socks_port": "1080",
+      "notebook_subnet": "10.10.16.0/24",
+      "project_name": "${PROJECT_NAME}",
+      "@class": "com.epam.datalab.dto.azure.edge.EdgeInfoAzure"
+    },
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+  },
+  "request_id": "${REQUEST_ID}"
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/azure/project_terminate.json b/services/provisioning-service/src/main/resources/mock_response/azure/project_terminate.json
index 5de66ef..b303484 100644
--- a/services/provisioning-service/src/main/resources/mock_response/azure/project_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/azure/project_terminate.json
@@ -6,7 +6,7 @@
       "service_base_name": "${CONF_SERVICE_BASE_NAME}",
       "user_name": "${EDGE_USER_NAME}"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/backup.json b/services/provisioning-service/src/main/resources/mock_response/gcp/backup.json
index 53e9f40..0b81c3a 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/backup.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/backup.json
@@ -1,5 +1,5 @@
 {
   "status": "created",
-  "backup_file": "/opt/dlab/tmp/dlab.tar.gz",
+  "backup_file": "/opt/datalab/tmp/datalab.tar.gz",
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_configure.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_configure.json
index b8be3bf..6219072 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_configure.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_configure.json
@@ -6,7 +6,7 @@
          "Tag_name": "${CONF_SERVICE_BASE_NAME}-tag",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_create.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_create.json
index a0a3635..46b1ff0 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_create.json
@@ -14,7 +14,7 @@
           }
         ]
       },
-      "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_lib_install.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_lib_install.json
index 4110cf8..29bb856 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_lib_install.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_lib_install.json
@@ -5,7 +5,7 @@
       "Action": "Install additional libs",
       "Libs": ${LIB_INSTALL}
 },
-"log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+"log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
 },
 "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_lib_list.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_lib_list.json
index 2fba799..92348cf 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_lib_list.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_lib_list.json
@@ -3,9 +3,9 @@
   "response": {
     "result": {
       "Action": "Get list of all available libraries",
-      "file": "/opt/dlab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
+      "file": "/opt/datalab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_terminate.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_terminate.json
index e7bb257..e90242d 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine-service_terminate.json
@@ -7,7 +7,7 @@
          "Dataproc_name": "${DATAPROC_CLUSTER_NAME}",
          "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
       },
-      "log": "/var/log/dlab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/emr/emr_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_configure.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_configure.json
index 6529169..685ba64 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_configure.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_configure.json
@@ -5,7 +5,7 @@
       "Action": "Configure notebook server",
       "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_create.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_create.json
index d6398fe..4ffd543 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_create.json
@@ -13,7 +13,7 @@
         }
       ]
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_lib_install.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_lib_install.json
index 4110cf8..29bb856 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_lib_install.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_lib_install.json
@@ -5,7 +5,7 @@
       "Action": "Install additional libs",
       "Libs": ${LIB_INSTALL}
 },
-"log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+"log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
 },
 "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_lib_list.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_lib_list.json
index 2fba799..92348cf 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_lib_list.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_lib_list.json
@@ -3,9 +3,9 @@
   "response": {
     "result": {
       "Action": "Get list of all available libraries",
-      "file": "/opt/dlab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
+      "file": "/opt/datalab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_start.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_start.json
index fe559d9..110fbb6 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_start.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_start.json
@@ -5,7 +5,7 @@
       "Action": "Start Data Engine",
       "service_base_name": "${CONF_SERVICE_BASE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_stop.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_stop.json
index 44da2d2..5396ad5 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_stop.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_stop.json
@@ -5,7 +5,7 @@
       "Action": "Stop Data Engine",
       "service_base_name": "${CONF_SERVICE_BASE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_terminate.json b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_terminate.json
index 6fb7768..d3b2135 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/dataengine_terminate.json
@@ -5,7 +5,7 @@
       "Action": "Terminate Data Engine",
       "service_base_name": "${CONF_SERVICE_BASE_NAME}"
     },
-    "log": "/var/log/dlab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/dataengine/dataengine_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/edge_create.json b/services/provisioning-service/src/main/resources/mock_response/gcp/edge_create.json
index e0cd288..fc4ba51 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/edge_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/edge_create.json
@@ -6,7 +6,7 @@
       "full_edge_conf": {
         "edge_service_account_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
         "fw_edge_egress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-egress-internal",
-        "dlab_ssh_user": "dlab-user",
+        "datalab_ssh_user": "datalab-user",
         "ps_role_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
         "fw_ps_egress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-egress-public",
         "private_ip": "10.10.0.3",
@@ -36,7 +36,7 @@
         "edge_user_name": "${EDGE_USER_NAME}",
         "private_subnet_cidr": "10.10.16.0/24",
         "fw_edge_ingress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-ingress-internal",
-        "vpc_selflink": "https://www.googleapis.com/compute/v1/projects/or2-msq-epmc-dlab-t1iylu/global/networks/${CONF_SERVICE_BASE_NAME}-ssn-vpc",
+        "vpc_selflink": "https://www.googleapis.com/compute/v1/projects/or2-msq-epmc-datalab-t1iylu/global/networks/${CONF_SERVICE_BASE_NAME}-ssn-vpc",
         "instance_size": "n1-standard-1",
         "notebook_firewall_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-nb-firewall"
       },
@@ -49,7 +49,7 @@
       "socks_port": "1080",
       "notebook_subnet": "10.10.16.0/24"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/edge_start.json b/services/provisioning-service/src/main/resources/mock_response/gcp/edge_start.json
index 2954c00..476faaf 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/edge_start.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/edge_start.json
@@ -8,7 +8,7 @@
       "Action": "Start up notebook server",
       "ip": "10.10.0.3"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/edge_stop.json b/services/provisioning-service/src/main/resources/mock_response/gcp/edge_stop.json
index a631927..e2ce9cb 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/edge_stop.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/edge_stop.json
@@ -5,7 +5,7 @@
       "instance_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
       "Action": "Stop edge server"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/edge_terminate.json b/services/provisioning-service/src/main/resources/mock_response/gcp/edge_terminate.json
index 5de66ef..b303484 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/edge_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/edge_terminate.json
@@ -6,7 +6,7 @@
       "service_base_name": "${CONF_SERVICE_BASE_NAME}",
       "user_name": "${EDGE_USER_NAME}"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_create.json b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_create.json
index 7d7bad5..7583e59 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_create.json
@@ -19,7 +19,7 @@
       "Action": "Create new notebook server",
       "master_keyname": "${CONF_KEY_NAME}"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_create_image.json b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_create_image.json
new file mode 100644
index 0000000..d1a5d34
--- /dev/null
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_create_image.json
@@ -0,0 +1,17 @@
+{
+   "status": "ok",
+   "response": {
+      "result": {
+         "notebook_image_name": "${CONF_SERVICE_BASE_NAME}-${IMAGE_NAME}",
+         "full_image_name": "${IMAGE_NAME}-${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-${APPLICATION}-${IMAGE_NAME}-${REQUEST_ID}",
+         "user_name": "${EDGE_USER_NAME}",
+         "application": "${APPLICATION}",
+         "image_id": "${IMAGE_NAME}-${REQUEST_ID}",
+         "status": "created",
+         "ip": "102.011.10.3",
+         "Action": "Create image from notebook"
+      },
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+   },
+   "request_id": "${REQUEST_ID}"
+}
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_git_creds.json b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_git_creds.json
index a2b2650..8820278 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_git_creds.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_git_creds.json
@@ -4,7 +4,7 @@
       "result": {
          "Action": "Setup git credentials"
       },
-      "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+      "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
    },
    "request_id": "${REQUEST_ID}"
 }
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_install.json b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_install.json
index fa90f10..4992831 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_install.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_install.json
@@ -5,7 +5,7 @@
       "Action": "Install additional libs",
       "Libs": ${LIB_INSTALL}
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
-  },
-  "request_id": "${REQUEST_ID}"
+"log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+},
+"request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_list.json b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_list.json
index 2fba799..92348cf 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_list.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_list.json
@@ -3,9 +3,9 @@
   "response": {
     "result": {
       "Action": "Get list of all available libraries",
-      "file": "/opt/dlab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
+      "file": "/opt/datalab/tmp/result/notebook_${REQUEST_ID}_all_pkgs.json"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_list_pkgs.json b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_list_pkgs.json
index b0816fc..acc4568 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_list_pkgs.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_lib_list_pkgs.json
@@ -5,11 +5,6 @@
   	"pyvcf/xenial": "0.6.7-2build1",
   	"pyxplot/xenial": "0.9.2-6build1"
   	},
-  "pip2": {
-  	"requests": "N/A",
-  	"configparser": "N/A",
-	  "SparseAce": "N/A"
-  	},
   "pip3": {
   	"configparser": "N/A",
 	  "sparkL": "N/A"
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_start.json b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_start.json
index 1833413..0643bbc 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_start.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_start.json
@@ -7,7 +7,7 @@
       "hostname": "10.10.16.2",
       "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_status.json b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_status.json
index 940a137..dc74f4f 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_status.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_status.json
@@ -1,8 +1,8 @@
 {
-   "status": "ok",
-   "response": {
-      "result": ${LIST_RESOURCES},
-      "log": "/var/log/dlab/status/status_${EDGE_USER_NAME}_${REQUEST_ID}.log"
-   },
-   "request_id": "${REQUEST_ID}"
+  "status": "ok",
+  "response": {
+    "result": {},
+    "log": "/var/log/datalab/status/status_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+  },
+  "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_stop.json b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_stop.json
index 016d23e..d1af1a2 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_stop.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_stop.json
@@ -5,7 +5,7 @@
       "Action": "Stop notebook server",
       "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
     },
-    "log": "/var/log/dlab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_terminate.json b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_terminate.json
index 989fc3d..82e0da4 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/notebook_terminate.json
@@ -5,7 +5,7 @@
       "Action": "Terminate notebook server",
       "notebook_name": "${NOTEBOOK_INSTANCE_NAME}"
     },
-    "log": "/var/log/dlab/notebook/notebook_{EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/notebook/notebook_{EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/project_create.json b/services/provisioning-service/src/main/resources/mock_response/gcp/project_create.json
index 31ca8e5..5b5c021 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/project_create.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/project_create.json
@@ -6,7 +6,7 @@
       "full_edge_conf": {
         "edge_service_account_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
         "fw_edge_egress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-egress-internal",
-        "dlab_ssh_user": "dlab-user",
+        "datalab_ssh_user": "datalab-user",
         "ps_role_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
         "fw_ps_egress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-egress-public",
         "private_ip": "10.10.0.3",
@@ -36,7 +36,7 @@
         "edge_user_name": "${EDGE_USER_NAME}",
         "private_subnet_cidr": "10.10.16.0/24",
         "fw_edge_ingress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-ingress-internal",
-        "vpc_selflink": "https://www.googleapis.com/compute/v1/projects/or2-msq-epmc-dlab-t1iylu/global/networks/${CONF_SERVICE_BASE_NAME}-ssn-vpc",
+        "vpc_selflink": "https://www.googleapis.com/compute/v1/projects/or2-msq-epmc-datalab-t1iylu/global/networks/${CONF_SERVICE_BASE_NAME}-ssn-vpc",
         "instance_size": "n1-standard-1",
         "notebook_firewall_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-nb-firewall"
       },
@@ -49,9 +49,9 @@
       "socks_port": "1080",
       "notebook_subnet": "10.10.16.0/24",
       "project_name": "${PROJECT_NAME}",
-      "@class": "com.epam.dlab.dto.gcp.edge.EdgeInfoGcp"
+      "@class": "com.epam.datalab.dto.gcp.edge.EdgeInfoGcp"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/project_recreate.json b/services/provisioning-service/src/main/resources/mock_response/gcp/project_recreate.json
new file mode 100644
index 0000000..f8ddb72
--- /dev/null
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/project_recreate.json
@@ -0,0 +1,57 @@
+{
+  "status": "ok",
+  "response": {
+    "result": {
+      "tunnel_port": "22",
+      "full_edge_conf": {
+        "edge_service_account_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
+        "fw_edge_egress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-egress-internal",
+        "datalab_ssh_user": "datalab-user",
+        "ps_role_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
+        "fw_ps_egress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-egress-public",
+        "private_ip": "10.10.0.3",
+        "fw_ps_ingress": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-ingress",
+        "ssh_key_path": "/root/keys/BDCC-DSS-POC.pem",
+        "zone": "us-west1-a ",
+        "fw_edge_egress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-egress-public",
+        "ami_name": "/projects/ubuntu-os-cloud/global/images/ubuntu-1604-xenial-v20170721",
+        "edge_role_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
+        "private_subnet_prefix": "24",
+        "subnet_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-subnet",
+        "vpc_cidr": "10.10.0.0/16",
+        "key_name": "${CONF_KEY_NAME}",
+        "service_base_name": "${CONF_SERVICE_BASE_NAME}",
+        "static_address_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ip",
+        "fw_ps_egress_private": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps-egress-private",
+        "vpc_name": "${CONF_SERVICE_BASE_NAME}-ssn-vpc",
+        "static_ip": "104.198.5.3",
+        "bucket_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-bucket",
+        "fw_edge_ingress_public": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-ingress-public",
+        "ps_service_account_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
+        "firewall_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-firewall",
+        "region": "us-west1",
+        "fw_common_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-ps",
+        "instance_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge",
+        "user_keyname": "${EDGE_USER_NAME}",
+        "edge_user_name": "${EDGE_USER_NAME}",
+        "private_subnet_cidr": "10.10.16.0/24",
+        "fw_edge_ingress_internal": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-edge-ingress-internal",
+        "vpc_selflink": "https://www.googleapis.com/compute/v1/projects/or2-msq-epmc-datalab-t1iylu/global/networks/${CONF_SERVICE_BASE_NAME}-ssn-vpc",
+        "instance_size": "n1-standard-1",
+        "notebook_firewall_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-nb-firewall"
+      },
+      "key_name": "BDCC-DSS-POC",
+      "hostname": "104.198.5.3",
+      "public_ip": "104.198.5.3",
+      "ip": "10.10.0.3",
+      "Action": "Recreate new EDGE server",
+      "user_own_bucket_name": "${CONF_SERVICE_BASE_NAME}-${EDGE_USER_NAME}-bucket",
+      "socks_port": "1080",
+      "notebook_subnet": "10.10.16.0/24",
+      "project_name": "${PROJECT_NAME}",
+      "@class": "com.epam.datalab.dto.gcp.edge.EdgeInfoGcp"
+    },
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+  },
+  "request_id": "${REQUEST_ID}"
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/main/resources/mock_response/gcp/project_terminate.json b/services/provisioning-service/src/main/resources/mock_response/gcp/project_terminate.json
index 7420ded..619dc39 100644
--- a/services/provisioning-service/src/main/resources/mock_response/gcp/project_terminate.json
+++ b/services/provisioning-service/src/main/resources/mock_response/gcp/project_terminate.json
@@ -6,7 +6,7 @@
       "project_tag": "prj1",
       "service_base_name": "${CONF_SERVICE_BASE_NAME}"
     },
-    "log": "/var/log/dlab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
+    "log": "/var/log/datalab/edge/edge_${EDGE_USER_NAME}_${REQUEST_ID}.log"
   },
   "request_id": "${REQUEST_ID}"
 }
\ No newline at end of file
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/DockerWarmuperTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/DockerWarmuperTest.java
new file mode 100644
index 0000000..191da79
--- /dev/null
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/DockerWarmuperTest.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.commands.ICommandExecutor;
+import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
+import com.epam.datalab.dto.imagemetadata.ComputationalMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ComputationalResourceShapeDto;
+import com.epam.datalab.dto.imagemetadata.ExploratoryMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ImageMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ImageType;
+import com.epam.datalab.process.model.ProcessInfo;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import io.dropwizard.util.Duration;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import static junit.framework.TestCase.assertEquals;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class DockerWarmuperTest {
+    @Inject
+    private DockerWarmuper warmuper;
+    private ExploratoryMetadataDTO exploratoryMetadata = new ExploratoryMetadataDTO(
+            "executeResult");
+    private ComputationalMetadataDTO computationalMetadata = new
+            ComputationalMetadataDTO("executeResult");
+    private static final String EXPLORATORY_TEST_JSON = "{\"exploratory_environment_shapes\" : { \"Category\" : [ " +
+            "{\"Size\":\"L\", \"Type\":\"cg1.4xlarge\",\"Ram\": \"22.5 GB\",\"Cpu\": \"16\"}]}}";
+    private static final String COMPUTATIONAL_TEST_JSON = "{\"template_name\":\"EMR cluster\"}";
+
+    @Before
+    public void setup() {
+        createInjector().injectMembers(this);
+        ComputationalResourceShapeDto computationalResourceShapeDto = new ComputationalResourceShapeDto();
+        computationalResourceShapeDto.setSize("L");
+        computationalResourceShapeDto.setType("cg1.4xlarge");
+        computationalResourceShapeDto.setRam("22.5 GB");
+        computationalResourceShapeDto.setCpu(16);
+        List<ComputationalResourceShapeDto> metadataArray = new ArrayList<>();
+        metadataArray.add(computationalResourceShapeDto);
+        HashMap<String, List<ComputationalResourceShapeDto>> map = new HashMap<>();
+        map.put("Category", metadataArray);
+        exploratoryMetadata.setExploratoryEnvironmentShapes(map);
+        computationalMetadata.setTemplateName("EMR cluster");
+    }
+
+    @Test
+    public void warmupSuccess() throws Exception {
+        warmuper.start();
+        warmuper.getFileHandlerCallback(getFirstUUID())
+                .handle(getFileName(), EXPLORATORY_TEST_JSON.getBytes());
+        warmuper.getFileHandlerCallback(getFirstUUID())
+                .handle(getFileName(), COMPUTATIONAL_TEST_JSON.getBytes());
+
+        ImageMetadataDTO testExploratory = warmuper.getMetadata(ImageType.EXPLORATORY)
+                .toArray(new ImageMetadataDTO[1])[0];
+        testExploratory.setImage("executeResult");
+        assertEquals(exploratoryMetadata.getImageType(), testExploratory.getImageType());
+
+        ImageMetadataDTO testComputational = warmuper.getMetadata(ImageType.COMPUTATIONAL)
+                .toArray(new ImageMetadataDTO[1])[0];
+        testComputational.setImage("executeResult");
+        assertEquals(computationalMetadata.getImageType(), testComputational.getImageType());
+    }
+
+    private String getFirstUUID() {
+        return warmuper.getUuids().keySet().toArray(new String[1])[0];
+    }
+
+    private String getFileName() {
+        return getFirstUUID() + ".json";
+    }
+
+    private Injector createInjector() {
+        return Guice.createInjector(new AbstractModule() {
+            @Override
+            protected void configure() {
+                bind(FolderListenerExecutor.class).toInstance(mock(FolderListenerExecutor.class));
+                bind(ProvisioningServiceApplicationConfiguration.class).toInstance(createConfiguration());
+                bind(ICommandExecutor.class).toInstance(createCommandExecutor());
+                bind(CallbackHandlerDao.class).toInstance(mock(CallbackHandlerDao.class));
+            }
+        });
+    }
+
+    private ProvisioningServiceApplicationConfiguration createConfiguration() {
+        ProvisioningServiceApplicationConfiguration result = mock(ProvisioningServiceApplicationConfiguration.class);
+        when(result.getWarmupDirectory()).thenReturn("/tmp");
+        when(result.getWarmupPollTimeout()).thenReturn(Duration.seconds(3));
+        return result;
+    }
+
+    private ICommandExecutor createCommandExecutor() {
+        ICommandExecutor result = mock(ICommandExecutor.class);
+        try {
+            final ProcessInfo pi = mock(ProcessInfo.class);
+            when(pi.getStdOut()).thenReturn("executeResult");
+            when(result.executeSync(anyString(), anyString(), anyString())).thenReturn(pi);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+}
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/commands/CommandExecutorMockTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/commands/CommandExecutorMockTest.java
new file mode 100644
index 0000000..310d95d
--- /dev/null
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/commands/CommandExecutorMockTest.java
@@ -0,0 +1,398 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.commands;
+
+import com.epam.datalab.backendapi.core.response.handlers.ExploratoryCallbackHandler;
+import com.epam.datalab.backendapi.core.response.handlers.LibListCallbackHandler;
+import com.epam.datalab.backendapi.core.response.handlers.ResourceCallbackHandler;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.rest.client.RESTServiceMock;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+
+@Ignore
+public class CommandExecutorMockTest {
+    private CommandExecutorMock getCommandExecutor() {
+        return new CommandExecutorMock(CloudProvider.AWS);
+    }
+
+    private CommandExecutorMock executeAsync(String cmd) throws IOException, InterruptedException, ExecutionException {
+        String uuid = UUID.randomUUID().toString();
+        CommandExecutorMock exec = new CommandExecutorMock(CloudProvider.AWS);
+        exec.executeAsync("user", uuid, cmd);
+        exec.getResultSync();
+
+        Files.deleteIfExists(Paths.get(exec.getResponseFileName()));
+
+        return exec;
+    }
+
+    private String getRequestId(CommandExecutorMock exec) {
+        return exec.getVariables().get("request_id");
+    }
+
+    private String getEdgeUserName(CommandExecutorMock exec) {
+        return exec.getVariables().get("edge_user_name");
+    }
+
+    private String getExploratoryName(CommandExecutorMock exec) {
+        return exec.getVariables().get("exploratory_name");
+    }
+
+    private void handleExploratory(String cmd, DockerAction action) throws Exception {
+        String uuid = UUID.randomUUID().toString();
+        CommandExecutorMock exec = getCommandExecutor();
+        exec.executeAsync("user", uuid, cmd);
+        exec.getResultSync();
+
+        RESTServiceMock selfService = new RESTServiceMock();
+        ExploratoryCallbackHandler handler = new ExploratoryCallbackHandler(selfService, action,
+                getRequestId(exec), getEdgeUserName(exec), "", getExploratoryName(exec));
+        handler.handle(exec.getResponseFileName(), Files.readAllBytes(Paths.get(exec.getResponseFileName())));
+
+        try {
+            Files.deleteIfExists(Paths.get(exec.getResponseFileName()));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void handleExploratoryLibs(String cmd, DockerAction action) throws Exception {
+        String uuid = UUID.randomUUID().toString();
+        CommandExecutorMock exec = getCommandExecutor();
+        exec.executeAsync("user", uuid, cmd);
+        exec.getResultSync();
+
+        RESTServiceMock selfService = new RESTServiceMock();
+        if (action == DockerAction.LIB_INSTALL) {
+            throw new Exception("Unimplemented action " + action);
+        }
+		/*
+		ResourceCallbackHandler<?> handler = action.equals(DockerAction.LIB_INSTALL) ?
+				new LibInstallCallbackHandler(selfService, action,
+				getRequestId(exec), getEdgeUserName(exec), getExploratoryName(exec)):
+				new LibListCallbackHandler(selfService, action,
+				getRequestId(exec), getEdgeUserName(exec), getExploratoryName(exec));
+		*/
+        ResourceCallbackHandler<?> handler = new LibListCallbackHandler(selfService, action, getRequestId(exec),
+                getEdgeUserName(exec), getExploratoryName(exec));
+
+        handler.handle(exec.getResponseFileName(), Files.readAllBytes(Paths.get(exec.getResponseFileName())));
+
+        try {
+            Files.deleteIfExists(Paths.get(exec.getResponseFileName()));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void describe() throws IOException, InterruptedException, ExecutionException {
+        String cmd =
+                "docker run " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/notebook:/logs/notebook " +
+                        "-e \"conf_resource=notebook\" " +
+                        "-e \"request_id=28ba67a4-b2ee-4753-a406-892977089ad9\" " +
+                        "docker.datalab-zeppelin:latest --action describe";
+        executeAsync(cmd);
+    }
+
+    @Test
+    public void edgeCreate() throws IOException, InterruptedException, ExecutionException {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"," +
+                        "\"conf_service_base_name\":\"usein1120v13\",\"conf_os_family\":\"debian\"," +
+                        "\"aws_vpc_id\":\"vpc-83c469e4\",\"aws_subnet_id\":\"subnet-22db937a\"," +
+                        "\"aws_security_groups_ids\":\"sg-4d42dc35\"}' | " +
+                        "docker run -i --name user_create_edge_1487309918496 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/edge:/logs/edge " +
+                        "-e \"conf_resource=edge\" " +
+                        "-e \"request_id=b8267ae6-07b0-44ef-a489-7714b20cf0a4\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "docker.datalab-edge --action create";
+        executeAsync(cmd);
+    }
+
+    @Test
+    public void edgeStop() throws IOException, InterruptedException, ExecutionException {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"," +
+                        "\"conf_service_base_name\":\"usein1122v4\",\"conf_os_family\":\"debian\"}' | " +
+                        "docker run -i --name user_stop_edge_1487677431773 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/edge:/logs/edge " +
+                        "-e \"conf_resource=edge\" " +
+                        "-e \"request_id=2ba3d8f7-654b-48aa-9386-e815b296a957\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "docker.datalab-edge --action stop";
+        executeAsync(cmd);
+    }
+
+    @Test
+    public void edgeStart() throws IOException, InterruptedException, ExecutionException {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"," +
+                        "\"conf_service_base_name\":\"usein1122v4\",\"conf_os_family\":\"debian\"}' | " +
+                        "docker run -i --name user_start_edge_1487677538220 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/edge:/logs/edge " +
+                        "-e \"conf_resource=edge\" " +
+                        "-e \"request_id=d2f6fbae-979e-4b08-9c0d-559a103ec0cc\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "docker.datalab-edge --action start";
+        executeAsync(cmd);
+    }
+
+    @Test
+    public void edgeStatus() throws IOException, InterruptedException, ExecutionException {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"," +
+                        "\"edge_list_resources\":{\"host\":[{\"id\":\"i-05c1a0d0ad030cdc1\"}, " +
+                        "{\"id\":\"i-05c1a0d0ad030cdc2\"}]}}' | " +
+                        "docker run -i --name user_status_resources_1487607145484 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/edge:/logs/edge " +
+                        "-e \"conf_resource=status\" " +
+                        "-e \"request_id=0fb82e16-deb2-4b18-9ab3-f9f1c12d9e62\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "docker.datalab-edge --action status";
+        executeAsync(cmd);
+    }
+
+
+    @Test
+    public void notebookCreate() throws Exception {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"," +
+                        "\"conf_service_base_name\":\"usein1120v13\",\"conf_os_family\":\"debian\"," +
+                        "\"exploratory_name\":\"useinxz1\",\"application\":\"zeppelin\",\"notebook_image\":\"docker" +
+                        ".datalab-zeppelin\"," +
+                        "\"aws_notebook_instance_type\":\"t2.medium\",\"aws_security_groups_ids\":\"sg-4d42dc35\"}' " +
+                        "|" +
+                        " " +
+                        "docker run -i --name user_create_exploratory_useinxz1_1487312574572 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/notebook:/logs/notebook " +
+                        "-e \"conf_resource=notebook\" " +
+                        "-e \"request_id=f720f30b-5949-4919-a50b-ce7af58d6fe9\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "docker.datalab-zeppelin --action create";
+        handleExploratory(cmd, DockerAction.CREATE);
+    }
+
+    @Test
+    public void notebookStop() throws Exception {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"," +
+                        "\"conf_service_base_name\":\"usein1120v13\"," +
+                        "\"exploratory_name\":\"useinxz1\",\"notebook_image\":\"docker.datalab-zeppelin\"," +
+                        "\"notebook_instance_name\":\"usein1120v13-user-nb-useinxz1-78af3\"," +
+                        "\"conf_key_dir\":\"/root/keys\"}' | " +
+                        "docker run -i --name user_stop_exploratory_useinxz1_1487315364165 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/notebook:/logs/notebook " +
+                        "-e \"conf_resource=notebook\" " +
+                        "-e \"request_id=33998e05-7781-432e-b748-bf3f0e7f9342\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "docker.datalab-zeppelin --action stop";
+        handleExploratory(cmd, DockerAction.STOP);
+    }
+
+    @Test
+    public void notebookStart() throws Exception {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"," +
+                        "\"conf_service_base_name\":\"usein1120v13\",\"conf_os_family\":\"debian\"," +
+                        "\"exploratory_name\":\"useinxz1\",\"notebook_image\":\"docker.datalab-zeppelin\"," +
+                        "\"notebook_instance_name\":\"usein1120v13-user-nb-useinxz1-78af3\"}' | " +
+                        "docker run -i --name user_start_exploratory_useinxz1_1487316756857 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/notebook:/logs/notebook " +
+                        "-e \"conf_resource=notebook\" " +
+                        "-e \"request_id=d50b9d20-1b1a-415f-8e47-ed0aca029e73\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "docker.datalab-zeppelin --action start";
+        handleExploratory(cmd, DockerAction.START);
+    }
+
+    @Test
+    public void notebookTerminate() throws Exception {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"," +
+                        "\"conf_service_base_name\":\"usein1120v13\",\"conf_os_family\":\"debian\"," +
+                        "\"exploratory_name\":\"useinxz1\",\"notebook_image\":\"docker.datalab-zeppelin\"," +
+                        "\"notebook_instance_name\":\"usein1120v13-user-nb-useinxz1-78af3\"}' | " +
+                        "docker run -i --name user_terminate_exploratory_useinxz1_1487318040180 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/notebook:/logs/notebook " +
+                        "-e \"conf_resource=notebook\" " +
+                        "-e \"request_id=de217441-9757-4c4e-b020-548f66b58e00\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "docker.datalab-zeppelin --action terminate";
+        handleExploratory(cmd, DockerAction.TERMINATE);
+    }
+
+
+    @Test
+    public void emrCreate() throws Exception {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"," +
+                        "\"conf_service_base_name\":\"usein1122v3\",\"conf_os_family\":\"debian\"," +
+                        "\"exploratory_name\":\"useinj1\",\"application\":\"jupyter\"," +
+                        "\"computational_name\":\"useine1\"," +
+                        "\"emr_instance_count\":\"2\",\"emr_master_instance_type\":\"c4.large\"," +
+                        "\"emr_slave_instance_type\":\"c4.large\"," +
+                        "\"emr_version\":\"emr-5.2.0\",\"notebook_instance_name\":\"usein1122v3-user-nb-useinj1" +
+                        "-1b198" +
+                        "\"," +
+                        "\"notebook_template_name\":\"Jupyter 1.5\"}' | " +
+                        "docker run -i --name user_create_computational_useine1_1487653987822 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/emr:/logs/emr " +
+                        "-e \"conf_resource=emr\" " +
+                        "-e \"request_id=917db3fd-3c17-4e79-8462-482a71a5d96f\" " +
+                        "-e \"ec2_role=EMR_EC2_DefaultRole\" " +
+                        "-e \"emr_timeout=3600\" " +
+                        "-e \"service_role=EMR_DefaultRole\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "docker.datalab-emr --action create";
+        executeAsync(cmd);
+    }
+
+    @Test
+    public void emrConfigure() throws Exception {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"," +
+                        "\"conf_service_base_name\":\"usein1122v4\",\"exploratory_name\":\"useinj1\"," +
+                        "\"application\":\"jupyter\",\"computational_name\":\"useine2\",\"emr_version\":\"emr-5.2" +
+                        ".0\"," +
+                        "\"notebook_instance_name\":\"usein1122v4-user-nb-useinj1-b0a2e\"}' | " +
+                        "docker run -i --name user_configure_computational_useine2_1487676513703 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/emr:/logs/emr " +
+                        "-e \"conf_resource=emr\" " +
+                        "-e \"request_id=dc3c1002-c07d-442b-99f9-18085aeb2881\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "docker.datalab-jupyter --action configure";
+        executeAsync(cmd);
+    }
+
+    @Test
+    public void emrTerminate() throws Exception {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"" +
+                        ",\"conf_service_base_name\":\"usein1122v3\",\"exploratory_name\":\"useinj1\"," +
+                        "\"computational_name\":\"useine1\"," +
+                        "\"emr_cluster_name\":\"usein1122v3-user-emr-useinj1-useine1-d2db9\"," +
+                        "\"notebook_instance_name\":\"usein1122v3-user-nb-useinj1-1b198\"," +
+                        "\"conf_key_dir\":\"/root/keys\"}' | " +
+                        "docker run -i --name user_terminate_computational_useine1_1487657251858 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/emr:/logs/emr " +
+                        "-e \"conf_resource=emr\" " +
+                        "-e \"request_id=2d5c23b8-d312-4fad-8a3c-0b813550d841\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "docker.datalab-emr --action terminate";
+        executeAsync(cmd);
+    }
+
+
+    @Test
+    public void listLibs() throws Exception {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"" +
+                        ",\"conf_service_base_name\":\"usein1122v3\",\"exploratory_name\":\"useinj1\"," +
+                        "\"computational_name\":\"useine1\"," +
+                        "\"emr_cluster_name\":\"usein1122v3-user-emr-useinj1-useine1-d2db9\"," +
+                        "\"notebook_instance_name\":\"usein1122v3-user-nb-useinj1-1b198\"," +
+                        "\"conf_key_dir\":\"/root/keys\"}' | " +
+                        "docker run -i --name user_terminate_computational_useine1_1487657251858 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/emr:/logs/emr " +
+                        "-e \"conf_resource=notebook\" " +
+                        "-e \"request_id=2d5c23b8-d312-4fad-8a3c-0b813550d841\" " +
+                        "-e \"conf_key_name=BDCC-DSS-POC\" " +
+                        "-e \"application=jupyter\" " +
+                        "docker.datalab-jupyter --action lib_list";
+        executeAsync(cmd);
+        handleExploratoryLibs(cmd, DockerAction.LIB_LIST);
+    }
+
+    @Test
+    public void installLibs() throws Exception {
+        String cmd =
+                "echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
+                        "\"edge_user_name\":\"user\"" +
+                        ",\"conf_service_base_name\":\"usein1122v3\",\"exploratory_name\":\"useinj1\"," +
+                        "\"computational_name\":\"useine1\"," +
+                        "\"emr_cluster_name\":\"usein1122v3-user-emr-useinj1-useine1-d2db9\"," +
+                        "\"notebook_instance_name\":\"usein1122v3-user-nb-useinj1-1b198\"," +
+                        "\"conf_key_dir\":\"/root/keys\"}' | " +
+                        "docker run -i --name user_terminate_computational_useine1_1487657251858 " +
+                        "-v /home/ubuntu/keys:/root/keys " +
+                        "-v /opt/datalab/tmp/result:/response " +
+                        "-v /var/opt/datalab/log/emr:/logs/emr " +
+                        "-e \"conf_resource=notebook\" " +
+                        "-e \"additional_libs={'libraries': {\n" +
+                        "\t\t\t\t'os_pkg': ['nmap', 'htop'],\n" +
+                        "\t\t\t\t'pip2': ['requests', 'configparser'],\n" +
+                        "\t\t\t\t'pip3': ['configparser'],\n" +
+                        "\t\t\t\t'r_pkg': ['rmarkdown']\n" +
+                        "\t\t\t\t}\n" +
+                        "\t\t\t\t}\" " +
+                        "docker.datalab-jupyter --action lib_install";
+        executeAsync(cmd);
+        handleExploratoryLibs(cmd, DockerAction.LIB_INSTALL);
+    }
+
+}
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/docker/command/ImagesDockerCommandTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/docker/command/ImagesDockerCommandTest.java
new file mode 100644
index 0000000..919daf6
--- /dev/null
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/docker/command/ImagesDockerCommandTest.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.docker.command;
+
+import com.epam.datalab.backendapi.core.commands.ImagesDockerCommand;
+import com.epam.datalab.backendapi.core.commands.UnixCommand;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class ImagesDockerCommandTest {
+
+    String GET_IMAGES = "docker images | awk '{print $1\":\"$2}' | sort | uniq | grep \"datalab\" | grep -v \"none\" | grep -v \"edge\"";
+
+    @Test
+    public void testBuildGetImagesCommand() {
+        String getImagesCommand = new ImagesDockerCommand()
+                .pipe(UnixCommand.awk("{print $1\":\"$2}"))
+                .pipe(UnixCommand.sort())
+                .pipe(UnixCommand.uniq())
+                .pipe(UnixCommand.grep("datalab"))
+                .pipe(UnixCommand.grep("none", "-v"))
+                .pipe(UnixCommand.grep("edge", "-v"))
+                .toCMD();
+        assertEquals(GET_IMAGES, getImagesCommand);
+    }
+}
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/docker/command/RunDockerCommandTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/docker/command/RunDockerCommandTest.java
new file mode 100644
index 0000000..05b3300
--- /dev/null
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/docker/command/RunDockerCommandTest.java
@@ -0,0 +1,319 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.docker.command;
+
+import com.epam.datalab.backendapi.core.commands.RunDockerCommand;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class RunDockerCommandTest {
+
+    String DOCKER_BASE = "docker run -v %s:/root/keys -v %s:/response -e \"request_id=%s\" ";
+
+    String GET_IMAGE_METADATA = DOCKER_BASE + "%s --action describe";
+
+    String RUN_IMAGE = DOCKER_BASE + "-e \"dry_run=true\" %s --action run";
+
+    String CREATE_EDGE_METADATA = DOCKER_BASE +
+            "-e \"conf_service_base_name=%s\" " +
+            "-e \"conf_key_name=%s\" " +
+            "-e \"edge_user_name=%s\" " +
+            "%s --action create";
+
+    String CREATE_EMR_CLUSTER = DOCKER_BASE +
+            "-e \"conf_service_base_name=%s\" " +
+            "-e \"emr_instance_count=%s\" " +
+            "-e \"emr_instance_type=%s\" " +
+            "-e \"emr_version=%s\" " +
+            "-e \"ec2_role=%s\" " +
+            "-e \"service_role=%s\" " +
+            "-e \"notebook_name=%s\" " +
+            "-e \"edge_user_name=%s\" " +
+            "-e \"edge_subnet_cidr=%s\" " +
+            "-e \"aws_region=%s\" " +
+            "-e \"conf_key_name=%s\" " +
+            "%s --action create";
+
+    String TERMINATE_EMR_CLUSTER = DOCKER_BASE +
+            "-e \"conf_service_base_name=%s\" " +
+            "-e \"edge_user_name=%s\" " +
+            "-e \"emr_cluster_name=%s\" " +
+            "-e \"aws_region=%s\" " +
+            "-e \"conf_key_name=%s\" " +
+            "%s --action terminate";
+
+    String EXPLORATORY_ENVIRONMENT = DOCKER_BASE +
+            "-e \"conf_service_base_name=%s\" " +
+            "-e \"aws_region=%s\" " +
+            "-e \"conf_key_name=%s\" ";
+
+    String CREATE_EXPLORATORY_ENVIRONMENT = EXPLORATORY_ENVIRONMENT +
+            "-e \"edge_user_name=%s\" " +
+            "-e \"notebook_subnet_cidr=%s\" " +
+            "-e \"aws_security_groups_ids=%s\" " +
+            "%s --action create";
+
+    String TERMINATE_EXPLORATORY_ENVIRONMENT = EXPLORATORY_ENVIRONMENT +
+            "-e \"edge_user_name=%s\" " +
+            "-e \"notebook_instance_name=%s\" " +
+            "%s --action terminate";
+
+    String STOP_EXPLORATORY_ENVIRONMENT = EXPLORATORY_ENVIRONMENT +
+            "-e \"edge_user_name=%s\" " +
+            "-e \"notebook_instance_name=%s\" " +
+            "%s --action stop";
+
+    String rootKeysVolume = "rkv";
+    String responseVolume = "rv";
+    String requestID = "rID";
+    String toDescribe = "tds";
+    String credsKeyName = "ckn";
+    String confServiceBaseName = "csbn";
+    String edgeUserName = "eun";
+    String userKeyName = "ukn";
+    String toCreate = "tc";
+    String toTerminate = "tt";
+    String toStop = "ts";
+    String toRun = "tr";
+    String emrInstanceCount = "10";
+    String emrInstanceType = "emit";
+    String emrVersion = "ev";
+    String ec2Role = "e2r";
+    String serviceRole = "sr";
+    String notebookName = "nn";
+    String edgeSubnetCidr = "esc";
+    String credsRegion = "cr";
+    String emrClusterName = "ecn";
+    String notebookUserName = "nun";
+    String notebookSubnetCidr = "nsc";
+    String credsSecurityGroupsIds = "csgi";
+    String notebookInstanceName = "nin";
+
+    @Test
+    public void testBuildDockerBaseCommand() {
+        RunDockerCommand dockerBaseCommand = new RunDockerCommand()
+                .withVolumeForRootKeys(rootKeysVolume)
+                .withVolumeForResponse(responseVolume)
+                .withRequestId(requestID);
+        assertEquals(String.format(DOCKER_BASE, rootKeysVolume, responseVolume, requestID), dockerBaseCommand.toCMD() + " ");
+    }
+
+    @Test
+    public void testBuildGetImageMetadataCommand() {
+        RunDockerCommand getImageMetadataCommand = new RunDockerCommand()
+                .withVolumeForRootKeys(rootKeysVolume)
+                .withVolumeForResponse(responseVolume)
+                .withRequestId(requestID)
+                .withActionDescribe(toDescribe);
+        assertEquals(String.format(GET_IMAGE_METADATA, rootKeysVolume, responseVolume, requestID, toDescribe), getImageMetadataCommand.toCMD());
+    }
+
+    @Test
+    public void testBuildCreateEdgeMetadataCommand() {
+        RunDockerCommand createEdgeMetadataCommand = new RunDockerCommand()
+                .withVolumeForRootKeys(rootKeysVolume)
+                .withVolumeForResponse(responseVolume)
+                .withRequestId(requestID)
+                .withConfServiceBaseName(confServiceBaseName)
+                .withConfKeyName(credsKeyName)
+                .withEdgeUserName(edgeUserName)
+                .withActionCreate(toCreate);
+        assertEquals(String.format(CREATE_EDGE_METADATA, rootKeysVolume, responseVolume,
+                requestID, confServiceBaseName, credsKeyName, edgeUserName, toCreate),
+                createEdgeMetadataCommand.toCMD());
+    }
+
+    @Test
+    public void testBuildRunImageCommand() {
+        RunDockerCommand runImageCommand = new RunDockerCommand()
+                .withVolumeForRootKeys(rootKeysVolume)
+                .withVolumeForResponse(responseVolume)
+                .withRequestId(requestID)
+                .withDryRun()
+                .withActionRun(toRun);
+        assertEquals(String.format(RUN_IMAGE, rootKeysVolume, responseVolume, requestID, toRun), runImageCommand.toCMD());
+    }
+
+    @Test
+    public void testCreateEMRClusterCommand() {
+        RunDockerCommand createEMRClusterCommand = new RunDockerCommand()
+                .withVolumeForRootKeys(rootKeysVolume)
+                .withVolumeForResponse(responseVolume)
+                .withRequestId(requestID)
+                .withConfServiceBaseName(confServiceBaseName)
+                .withEmrInstanceCount(emrInstanceCount)
+                .withEmrInstanceType(emrInstanceType)
+                .withEmrVersion(emrVersion)
+                .withEc2Role(ec2Role)
+                .withServiceRole(serviceRole)
+                .withNotebookName(notebookName)
+                .withEdgeUserName(edgeUserName)
+                .withEdgeSubnetCidr(edgeSubnetCidr)
+                .withAwsRegion(credsRegion)
+                .withConfKeyName(credsKeyName)
+                .withActionCreate(toCreate);
+
+        assertEquals(
+                String.format(
+                        CREATE_EMR_CLUSTER,
+                        rootKeysVolume,
+                        responseVolume,
+                        requestID,
+                        confServiceBaseName,
+                        emrInstanceCount,
+                        emrInstanceType,
+                        emrVersion,
+                        ec2Role,
+                        serviceRole,
+                        notebookName,
+                        edgeUserName,
+                        edgeSubnetCidr,
+                        credsRegion,
+                        credsKeyName,
+                        toCreate
+                ),
+                createEMRClusterCommand.toCMD()
+        );
+    }
+
+    @Test
+    public void testTerminateEmrCluster() {
+        RunDockerCommand terminateEMRClusterCommand = new RunDockerCommand()
+                .withVolumeForRootKeys(rootKeysVolume)
+                .withVolumeForResponse(responseVolume)
+                .withRequestId(requestID)
+                .withConfServiceBaseName(confServiceBaseName)
+                .withEdgeUserName(edgeUserName)
+                .withEmrClusterName(emrClusterName)
+                .withAwsRegion(credsRegion)
+                .withConfKeyName(credsKeyName)
+                .withActionTerminate(toTerminate);
+
+        assertEquals(
+                String.format(
+                        TERMINATE_EMR_CLUSTER,
+                        rootKeysVolume,
+                        responseVolume,
+                        requestID,
+                        confServiceBaseName,
+                        edgeUserName,
+                        emrClusterName,
+                        credsRegion,
+                        credsKeyName,
+                        toTerminate
+                ),
+                terminateEMRClusterCommand.toCMD()
+        );
+    }
+
+    @Test
+    public void testCreateExploratoryEnvironment() {
+        RunDockerCommand createExploratoryEnvironmentCommand = new RunDockerCommand()
+                .withVolumeForRootKeys(rootKeysVolume)
+                .withVolumeForResponse(responseVolume)
+                .withRequestId(requestID)
+                .withConfServiceBaseName(confServiceBaseName)
+                .withAwsRegion(credsRegion)
+                .withConfKeyName(credsKeyName)
+                .withNotebookUserName(notebookUserName)
+                .withNotebookSubnetCidr(notebookSubnetCidr)
+                .withAwsSecurityGroupsIds(credsSecurityGroupsIds)
+                .withActionCreate(toCreate);
+
+        assertEquals(
+                String.format(
+                        CREATE_EXPLORATORY_ENVIRONMENT,
+                        rootKeysVolume,
+                        responseVolume,
+                        requestID,
+                        confServiceBaseName,
+                        credsRegion,
+                        credsKeyName,
+                        notebookUserName,
+                        notebookSubnetCidr,
+                        credsSecurityGroupsIds,
+                        toCreate
+                ),
+                createExploratoryEnvironmentCommand.toCMD()
+        );
+    }
+
+    @Test
+    public void testTerminateExploratoryEnvironment() {
+        RunDockerCommand terminateExploratoryEnvironmentCommand = new RunDockerCommand()
+                .withVolumeForRootKeys(rootKeysVolume)
+                .withVolumeForResponse(responseVolume)
+                .withRequestId(requestID)
+                .withConfServiceBaseName(confServiceBaseName)
+                .withAwsRegion(credsRegion)
+                .withConfKeyName(credsKeyName)
+                .withNotebookUserName(notebookUserName)
+                .withNotebookInstanceName(notebookInstanceName)
+                .withActionTerminate(toTerminate);
+
+        assertEquals(
+                String.format(
+                        TERMINATE_EXPLORATORY_ENVIRONMENT,
+                        rootKeysVolume,
+                        responseVolume,
+                        requestID,
+                        confServiceBaseName,
+                        credsRegion,
+                        credsKeyName,
+                        notebookUserName,
+                        notebookInstanceName,
+                        toTerminate
+                ),
+                terminateExploratoryEnvironmentCommand.toCMD()
+        );
+    }
+
+    @Test
+    public void testStopExploratoryEnvironment() {
+        RunDockerCommand stopExploratoryEnvironmentCommand = new RunDockerCommand()
+                .withVolumeForRootKeys(rootKeysVolume)
+                .withVolumeForResponse(responseVolume)
+                .withRequestId(requestID)
+                .withConfServiceBaseName(confServiceBaseName)
+                .withAwsRegion(credsRegion)
+                .withConfKeyName(credsKeyName)
+                .withNotebookUserName(notebookUserName)
+                .withNotebookInstanceName(notebookInstanceName)
+                .withActionStop(toStop);
+
+        assertEquals(
+                String.format(
+                        STOP_EXPLORATORY_ENVIRONMENT,
+                        rootKeysVolume,
+                        responseVolume,
+                        requestID,
+                        confServiceBaseName,
+                        credsRegion,
+                        credsKeyName,
+                        notebookUserName,
+                        notebookInstanceName,
+                        toStop
+                ),
+                stopExploratoryEnvironmentCommand.toCMD()
+        );
+    }
+
+}
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListenerTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListenerTest.java
new file mode 100644
index 0000000..b7d4491
--- /dev/null
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/FolderListenerTest.java
@@ -0,0 +1,190 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.folderlistener;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.util.ServiceUtils;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+
+import static org.junit.Assert.assertEquals;
+
+public class FolderListenerTest {
+    private final long maxWaitTimeoutMillis = 30000;
+
+    private final long timeoutMillis = 2000;
+
+    private final long fileLengthCheckDelay = 1000;
+
+    private boolean handleResult = true;
+
+    public class FileHandler implements FileHandlerCallback {
+        private final String uuid;
+
+        public FileHandler(String uuid) {
+            this.uuid = uuid;
+        }
+
+        @Override
+        public String getUUID() {
+            return uuid;
+        }
+
+        @Override
+        public boolean checkUUID(String uuid) {
+            return this.uuid.equals(uuid);
+        }
+
+        @Override
+        public boolean handle(String fileName, byte[] content) throws Exception {
+            if (!handleResult) {
+                throw new Exception("Test exception");
+            }
+            return handleResult;
+        }
+
+        @Override
+        public void handleError(String errorMessage) {
+            System.out.println("handleError called for UUID " + getUUID());
+        }
+
+        @Override
+        public String getUser() {
+            return null;
+        }
+    }
+
+    private String getFileName(String uuid) {
+        return "FolderListenerTest_" + uuid + ".json";
+    }
+
+    private String getDirectory() {
+        return ServiceUtils.getUserDir();
+    }
+
+    private void removeFile(String uuid) throws IOException {
+        File file = new File(getDirectory(), getFileName(uuid));
+        if (file.exists()) {
+            file.delete();
+        }
+    }
+
+    private void createFile(String uuid) throws IOException {
+        File file = new File(getDirectory(), getFileName(uuid));
+        removeFile(uuid);
+        FileWriter f = new FileWriter(file);
+
+        f.write("test");
+        f.flush();
+        f.close();
+    }
+
+
+    private void processFile(WatchItem item) throws InterruptedException, IOException {
+        long expiredTime = System.currentTimeMillis() + maxWaitTimeoutMillis;
+        while (!FolderListener.getListeners().isEmpty() &&
+                !FolderListener.getListeners().get(0).isListen()) {
+            if (expiredTime < System.currentTimeMillis()) {
+                throw new InterruptedException("Timeout has been expired");
+            }
+            Thread.sleep(100);
+        }
+
+        expiredTime = System.currentTimeMillis() + maxWaitTimeoutMillis;
+        while (item.getFuture() == null) {
+            if (expiredTime < System.currentTimeMillis()) {
+                throw new InterruptedException("Timeout has been expired");
+            }
+            Thread.sleep(100);
+        }
+    }
+
+    @Test
+    public void listen() throws InterruptedException, ExecutionException, IOException {
+        Integer uuid = 1;
+        FileHandlerCallback fHandler;
+        WatchItem item;
+
+        handleResult = false;
+        fHandler = new FileHandler(uuid.toString());
+        item = FolderListener.listen(getDirectory(), fHandler, timeoutMillis, fileLengthCheckDelay, null);
+        FolderListener listener = FolderListener.getListeners().get(0);
+        assertEquals(false, listener.isListen());
+        assertEquals(true, listener.isAlive());
+        System.out.println("TEST process FALSE");
+
+        uuid = 2;
+        createFile(uuid.toString());
+        fHandler = new FileHandler(uuid.toString());
+        item = FolderListener.listen(getDirectory(), fHandler, timeoutMillis, fileLengthCheckDelay, null);
+        processFile(item);
+        assertEquals(true, listener.isListen());
+        assertEquals(false, item.getFutureResultSync());
+        assertEquals(false, item.getFutureResult());
+
+        System.out.println("TEST process TRUE");
+        uuid = 3;
+        handleResult = true;
+        createFile(uuid.toString());
+        fHandler = new FileHandler(uuid.toString());
+        item = FolderListener.listen(getDirectory(), fHandler, timeoutMillis, fileLengthCheckDelay, null);
+        processFile(item);
+        assertEquals(true, item.getFutureResultSync());
+        assertEquals(true, item.getFutureResult());
+
+        System.out.println("TEST process with out listen");
+        uuid = 4;
+        createFile(uuid.toString());
+        fHandler = new FileHandler(uuid.toString());
+        item = FolderListener.listen(getDirectory(), fHandler, timeoutMillis, fileLengthCheckDelay, getFileName(uuid
+                .toString()), null);
+
+        long expiredTime = System.currentTimeMillis() + maxWaitTimeoutMillis;
+        while (item.getFuture() == null) {
+            if (expiredTime < System.currentTimeMillis()) {
+                throw new InterruptedException("Timeout has been expired");
+            }
+            Thread.sleep(100);
+        }
+        assertEquals(true, item.getFutureResultSync());
+        assertEquals(true, item.getFutureResult());
+
+        FolderListener.terminateAll();
+        expiredTime = System.currentTimeMillis() + maxWaitTimeoutMillis;
+        while (FolderListener.getListeners().size() > 0) {
+            if (expiredTime < System.currentTimeMillis()) {
+                throw new InterruptedException("Timeout has been expired");
+            }
+            Thread.sleep(100);
+        }
+
+        System.out.println("All listen tests passed");
+
+
+        for (int i = 1; i <= uuid; i++) {
+            removeFile(String.valueOf(i));
+        }
+    }
+
+}
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemListTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemListTest.java
new file mode 100644
index 0000000..a50cf0d
--- /dev/null
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemListTest.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.folderlistener;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.response.folderlistener.WatchItem.ItemStatus;
+import org.junit.Test;
+
+import java.util.concurrent.ExecutionException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class WatchItemListTest {
+
+    private static final String UUID = "123";
+
+    private final FileHandlerCallback fHandler = new FileHandler(UUID);
+
+    private final long timeoutMillis = 1000;
+
+    private final long fileLengthCheckDelay = 10000;
+
+    public class FileHandler implements FileHandlerCallback {
+        private final String uuid;
+
+        public FileHandler(String uuid) {
+            this.uuid = uuid;
+        }
+
+        @Override
+        public String getUUID() {
+            return uuid;
+        }
+
+        @Override
+        public boolean checkUUID(String uuid) {
+            return this.uuid.equals(uuid);
+        }
+
+        @Override
+        public boolean handle(String fileName, byte[] content) throws Exception {
+            return true;
+        }
+
+        @Override
+        public void handleError(String errorMessage) {
+            System.out.println("handleError called for UUID " + getUUID());
+        }
+
+        @Override
+        public String getUser() {
+            return null;
+        }
+    }
+
+
+    private String getDirectory() {
+        return "./";
+    }
+
+    private String getFileName() {
+        return UUID + ".json";
+    }
+
+    @Test
+    public void checkGetters() {
+        WatchItemList items = new WatchItemList(getDirectory(), null);
+
+        assertEquals(0, items.size());
+
+        items.append(fHandler, timeoutMillis, fileLengthCheckDelay);
+        assertEquals(1, items.size());
+
+        WatchItem item = items.get(0);
+        assertNotNull(item);
+        assertEquals(0, items.getIndex(UUID));
+        assertEquals(item, items.getItem(getFileName()));
+        items.remove(0);
+        assertEquals(0, items.size());
+    }
+
+
+    @Test
+    public void processItem() throws InterruptedException, ExecutionException {
+        WatchItemList items = new WatchItemList(getDirectory(), null);
+        items.append(fHandler, timeoutMillis, fileLengthCheckDelay);
+
+        WatchItem item = items.get(0);
+
+        assertEquals(false, items.processItem(item));
+
+        item.setFileName(getFileName());
+        assertEquals(true, items.processItem(item));
+
+        assertEquals(ItemStatus.INPROGRESS, item.getStatus());
+        item.getFutureResultSync();
+    }
+
+    @Test
+    public void processItemAll() throws InterruptedException, ExecutionException {
+        WatchItemList items = new WatchItemList(getDirectory(), null);
+        items.append(fHandler, timeoutMillis, fileLengthCheckDelay);
+
+        WatchItem item = items.get(0);
+
+        assertEquals(0, items.processItemAll());
+
+        item.setFileName(getFileName());
+        assertEquals(1, items.processItemAll());
+
+        assertEquals(ItemStatus.INPROGRESS, item.getStatus());
+        item.getFutureResultSync();
+    }
+
+}
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemTest.java
new file mode 100644
index 0000000..075523d
--- /dev/null
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/folderlistener/WatchItemTest.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.folderlistener;
+
+import com.epam.datalab.backendapi.core.FileHandlerCallback;
+import com.epam.datalab.backendapi.core.response.folderlistener.WatchItem.ItemStatus;
+import io.dropwizard.util.Duration;
+import org.junit.Test;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+import static org.junit.Assert.assertEquals;
+
+public class WatchItemTest {
+
+    private static final String UUID = "123";
+
+    private final FileHandlerCallback fHandler = new FileHandler(UUID);
+
+    private final long timeoutMillis = 1000;
+
+    private final long fileLengthCheckDelay = 10000;
+
+    public class FileHandler implements FileHandlerCallback {
+        private final String uuid;
+
+        public FileHandler(String uuid) {
+            this.uuid = uuid;
+        }
+
+        @Override
+        public String getUUID() {
+            return uuid;
+        }
+
+        @Override
+        public boolean checkUUID(String uuid) {
+            return this.uuid.equals(uuid);
+        }
+
+        @Override
+        public boolean handle(String fileName, byte[] content) throws Exception {
+            return true;
+        }
+
+        @Override
+        public void handleError(String errorMessage) {
+            System.out.println("handleError called for UUID " + getUUID());
+        }
+
+        @Override
+        public String getUser() {
+            return null;
+        }
+    }
+
+
+    private WatchItem getWatchItem() {
+        return new WatchItem(fHandler, timeoutMillis, fileLengthCheckDelay);
+    }
+
+    private String getFileName() {
+        return UUID + ".json";
+    }
+
+    private String getDirectory() {
+        return "./";
+    }
+
+    private AsyncFileHandler getSupplier(WatchItem item) {
+        return new AsyncFileHandler(item.getFileName(), getDirectory(), item.getFileHandlerCallback(),
+                Duration.milliseconds(item.getFileLengthCheckDelay()));
+    }
+
+    @Test
+    public void isExpired() {
+        WatchItem item;
+
+        item = new WatchItem(fHandler, -1, fileLengthCheckDelay);
+        assertEquals(true, item.isExpired());
+
+        item = getWatchItem();
+        assertEquals(false, item.isExpired());
+    }
+
+    @Test
+    public void status() throws InterruptedException, ExecutionException {
+        WatchItem item;
+
+        item = new WatchItem(fHandler, -1, fileLengthCheckDelay);
+        assertEquals(ItemStatus.TIMEOUT_EXPIRED, item.getStatus());
+
+        item.setFileName(getFileName());
+        assertEquals(ItemStatus.FILE_CAPTURED, item.getStatus());
+
+        item = getWatchItem();
+        assertEquals(ItemStatus.WAIT_FOR_FILE, item.getStatus());
+
+        item.setFileName(getFileName());
+        assertEquals(ItemStatus.FILE_CAPTURED, item.getStatus());
+
+        item.setFuture(CompletableFuture.supplyAsync(getSupplier(item)));
+        assertEquals(ItemStatus.INPROGRESS, item.getStatus());
+
+        assertEquals(null, item.getFutureResult());
+        item.getFutureResultSync();
+
+        assertEquals(ItemStatus.IS_DONE, item.getStatus());
+
+        item.setFuture(CompletableFuture.supplyAsync(getSupplier(item)));
+        item.getFuture().cancel(false);
+        assertEquals(ItemStatus.IS_CANCELED, item.getStatus());
+
+        //IS_INTERRUPTED, IS_FAILED
+    }
+
+    @Test
+    public void futureResult() throws InterruptedException, ExecutionException {
+        WatchItem item = getWatchItem();
+
+        item.setFileName(getFileName());
+        item.setFuture(CompletableFuture.supplyAsync(getSupplier(item)));
+
+        assertEquals(false, item.getFutureResultSync());
+        assertEquals(false, item.getFutureResult());
+    }
+}
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java
new file mode 100644
index 0000000..8775fa7
--- /dev/null
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java
@@ -0,0 +1,213 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.core.response.handlers.dao;
+
+import com.epam.datalab.backendapi.ProvisioningServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.core.DockerWarmuper;
+import com.epam.datalab.backendapi.core.commands.DockerAction;
+import com.epam.datalab.backendapi.core.response.handlers.LibListCallbackHandler;
+import com.epam.datalab.backendapi.core.response.handlers.PersistentFileHandler;
+import com.epam.datalab.exceptions.DatalabException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Matchers;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.refEq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class FileSystemCallbackHandlerDaoTest {
+
+    @Mock
+    private ObjectMapper mapper;
+    @Mock
+    private ProvisioningServiceApplicationConfiguration configuration;
+    @Mock
+    private CallbackHandlerDao dao;
+    @InjectMocks
+    private FileSystemCallbackHandlerDao fileSystemCallbackHandlerDao;
+
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Before
+    public void createHandlersFolder() throws IOException {
+        folder.newFolder("opt", "handlers");
+    }
+
+
+    @Test
+    public void upsert() throws IOException {
+        final String handlersFolders = getHandlersFolder();
+        when(configuration.getHandlerDirectory()).thenReturn(handlersFolders);
+        when(mapper.writeValueAsBytes(any())).thenReturn("{'test': 'test'}".getBytes());
+        final PersistentFileHandler persistentFileHandler =
+                new PersistentFileHandler(new LibListCallbackHandler(null,
+                        DockerAction.LIB_LIST, "uuid", "test", "das"), 1L, "/opt/test");
+
+        fileSystemCallbackHandlerDao.upsert(persistentFileHandler);
+
+        verify(configuration, times(2)).getHandlerDirectory();
+        verify(mapper).writeValueAsBytes(refEq(persistentFileHandler));
+        assertTrue(new File(handlersFolders + File.separator + "LibListCallbackHandler_uuid.json").exists());
+        verifyNoMoreInteractions(mapper, configuration, dao);
+    }
+
+    @Test
+    public void upsertTwoSimilarHandlers() throws IOException {
+        final String handlersFolders = getHandlersFolder();
+        when(configuration.getHandlerDirectory()).thenReturn(handlersFolders);
+        when(mapper.writeValueAsBytes(any())).thenReturn("{'test': 'test'}".getBytes());
+        final PersistentFileHandler persistentFileHandler1 = new PersistentFileHandler(new DockerWarmuper()
+                .new DockerFileHandlerCallback("sameUUID"), 1L, "/opt/test");
+        final PersistentFileHandler persistentFileHandler2 =
+                new PersistentFileHandler(new LibListCallbackHandler(null,
+                        DockerAction.LIB_LIST, "sameUUID", "test", "das1"), 1L, "/opt/test");
+        final PersistentFileHandler persistentFileHandler3 =
+                new PersistentFileHandler(new LibListCallbackHandler(null,
+                        DockerAction.LIB_LIST, "anotherUUID", "test", "das2"), 1L, "/opt/test");
+
+
+        fileSystemCallbackHandlerDao.upsert(persistentFileHandler1);
+        fileSystemCallbackHandlerDao.upsert(persistentFileHandler2);
+        fileSystemCallbackHandlerDao.upsert(persistentFileHandler3);
+
+        verify(configuration, times(6)).getHandlerDirectory();
+        verify(mapper).writeValueAsBytes(refEq(persistentFileHandler1));
+        verify(mapper).writeValueAsBytes(refEq(persistentFileHandler2));
+        verify(mapper).writeValueAsBytes(refEq(persistentFileHandler3));
+        assertTrue(new File(handlersFolders + File.separator + "LibListCallbackHandler_sameUUID.json").exists());
+        assertTrue(new File(handlersFolders + File.separator + "LibListCallbackHandler_anotherUUID.json").exists());
+        assertFalse(new File(handlersFolders + File.separator + "DockerFileHandlerCallback_sameUUID.json").exists());
+        verifyNoMoreInteractions(mapper, configuration, dao);
+    }
+
+    @Test
+    public void findAll() throws IOException {
+        final File handler1 = getHandlerFile("test1.json");
+        final File handler2 = getHandlerFile("test2.json");
+        final String handlersFolder = getHandlersFolder();
+
+        when(configuration.getHandlerDirectory()).thenReturn(handlersFolder);
+        final PersistentFileHandler persistentFileHandler1 = new PersistentFileHandler(null, 1L, "/opt");
+        final PersistentFileHandler persistentFileHandler2 = new PersistentFileHandler(null, 2L, "/opt");
+        when(mapper.readValue(any(File.class), Matchers.<Class<PersistentFileHandler>>any())).thenReturn
+                (persistentFileHandler1).thenReturn(persistentFileHandler2);
+        final List<PersistentFileHandler> handlers = fileSystemCallbackHandlerDao.findAll();
+
+        assertEquals(2, handlers.size());
+
+        verify(configuration).getHandlerDirectory();
+        verify(mapper).readValue(handler1, PersistentFileHandler.class);
+        verify(mapper).readValue(handler2, PersistentFileHandler.class);
+        verifyNoMoreInteractions(mapper, dao, configuration);
+    }
+
+    @Test
+    public void findAllWithException() throws IOException {
+        new File(getHandlersFolder()).delete();
+        when(configuration.getHandlerDirectory()).thenReturn(getHandlersFolder());
+        when(mapper.readValue(any(File.class), Matchers.<Class<PersistentFileHandler>>any())).thenThrow(new
+                RuntimeException("Exception"));
+        final List<PersistentFileHandler> handlers = fileSystemCallbackHandlerDao.findAll();
+
+        assertEquals(0, handlers.size());
+
+        verify(configuration).getHandlerDirectory();
+        verifyNoMoreInteractions(mapper, dao, configuration);
+    }
+
+    @Test
+    public void findAllWithOneWrongHandlerFile() throws IOException {
+        final File handler1 = getHandlerFile("test1.json");
+        final File handler2 = getHandlerFile("test2.json");
+        final String handlersFolder = getHandlersFolder();
+
+        final PersistentFileHandler persistentFileHandler1 = new PersistentFileHandler(null, 1L, "/opt");
+
+        when(configuration.getHandlerDirectory()).thenReturn(handlersFolder);
+        when(mapper.readValue(any(File.class), Matchers.<Class<PersistentFileHandler>>any())).thenReturn
+                (persistentFileHandler1).thenThrow(new RuntimeException("Exception"));
+
+        final List<PersistentFileHandler> handlers = fileSystemCallbackHandlerDao.findAll();
+
+        assertEquals(1, handlers.size());
+
+        verify(configuration).getHandlerDirectory();
+        verify(mapper).readValue(handler1, PersistentFileHandler.class);
+        verify(mapper).readValue(handler2, PersistentFileHandler.class);
+        verifyNoMoreInteractions(mapper, dao, configuration);
+    }
+
+    private String getHandlersFolder() {
+        return folder.getRoot().getAbsolutePath() +
+                File.separator + "opt" + File.separator + "handlers";
+    }
+
+    private File getHandlerFile(String handlerFileName) throws IOException {
+        return folder.newFile(File.separator + "opt" + File.separator + "handlers" + File.separator +
+                handlerFileName);
+    }
+
+    @Test
+    public void remove() throws IOException {
+        final File handler = getHandlerFile("test1.json");
+        handler.createNewFile();
+        final String handlersFolder = getHandlersFolder();
+
+        when(configuration.getHandlerDirectory()).thenReturn(handlersFolder);
+        fileSystemCallbackHandlerDao.remove("test1");
+
+        assertFalse(handler.exists());
+
+        verify(configuration).getHandlerDirectory();
+        verifyNoMoreInteractions(configuration, dao, mapper);
+    }
+
+    @Test
+    public void removeWithException() throws IOException {
+        final String handlersFolder = getHandlersFolder();
+
+        when(configuration.getHandlerDirectory()).thenReturn(handlersFolder);
+        expectedException.expect(DatalabException.class);
+        fileSystemCallbackHandlerDao.remove("test1.json");
+    }
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/service/RestoreCallbackHandlerServiceImplTest.java b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/service/RestoreCallbackHandlerServiceImplTest.java
new file mode 100644
index 0000000..1df6778
--- /dev/null
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/backendapi/service/RestoreCallbackHandlerServiceImplTest.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.core.response.folderlistener.FolderListenerExecutor;
+import com.epam.datalab.backendapi.core.response.handlers.PersistentFileHandler;
+import com.epam.datalab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
+import com.epam.datalab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
+import io.dropwizard.util.Duration;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Arrays;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class RestoreCallbackHandlerServiceImplTest {
+
+    @Mock
+    private CallbackHandlerDao dao;
+    @Mock
+    private FolderListenerExecutor folderListenerExecutor;
+    @InjectMocks
+    private RestoreCallbackHandlerServiceImpl restoreCallbackHandlerService;
+
+    @Test
+    public void start() throws Exception {
+
+        final PersistentFileHandler handler1 = new PersistentFileHandler(null, 1L, "test");
+        final PersistentFileHandler handler2 = new PersistentFileHandler(null, 2L, "test1");
+        when(dao.findAll()).thenReturn(Arrays.asList(handler1, handler2));
+
+        restoreCallbackHandlerService.start();
+
+        verify(dao).findAll();
+        verify(folderListenerExecutor).start(handler1.getDirectory(), Duration.milliseconds(handler1.getTimeout()),
+                handler1.getHandler());
+        verify(folderListenerExecutor).start(handler2.getDirectory(), Duration.milliseconds(handler2.getTimeout()),
+                handler2.getHandler());
+        verifyNoMoreInteractions(dao, folderListenerExecutor);
+    }
+}
\ No newline at end of file
diff --git a/services/provisioning-service/src/test/java/com/epam/datalab/rest/client/RESTServiceMock.java b/services/provisioning-service/src/test/java/com/epam/datalab/rest/client/RESTServiceMock.java
new file mode 100644
index 0000000..7df16dd
--- /dev/null
+++ b/services/provisioning-service/src/test/java/com/epam/datalab/rest/client/RESTServiceMock.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.rest.client;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RESTServiceMock extends RESTService {
+
+    private final static Logger LOG = LoggerFactory.getLogger(RESTService.class);
+
+    @Override
+    public <T> T post(String path, Object parameter, Class<T> clazz) {
+        LOG.debug("REST POST {},\n object {},\n response class {}", path, parameter, clazz.getName());
+        try {
+            return (T) clazz.newInstance();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}
diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/DockerWarmuperTest.java b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/DockerWarmuperTest.java
deleted file mode 100644
index 16ac19c..0000000
--- a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/DockerWarmuperTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.commands.ICommandExecutor;
-import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
-import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
-import com.epam.dlab.dto.imagemetadata.*;
-import com.epam.dlab.process.model.ProcessInfo;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import io.dropwizard.util.Duration;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import static junit.framework.TestCase.assertEquals;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class DockerWarmuperTest {
-	@Inject
-	private DockerWarmuper warmuper;
-	private ExploratoryMetadataDTO exploratoryMetadata = new ExploratoryMetadataDTO(
-			"executeResult");
-	private ComputationalMetadataDTO computationalMetadata = new
-			ComputationalMetadataDTO("executeResult");
-	private static final String EXPLORATORY_TEST_JSON = "{\"exploratory_environment_shapes\" : { \"Category\" : [ " +
-			"{\"Size\":\"L\", \"Type\":\"cg1.4xlarge\",\"Ram\": \"22.5 GB\",\"Cpu\": \"16\"}]}}";
-	private static final String COMPUTATIONAL_TEST_JSON = "{\"template_name\":\"EMR cluster\"}";
-
-	@Before
-	public void setup() {
-		createInjector().injectMembers(this);
-		ComputationalResourceShapeDto computationalResourceShapeDto = new ComputationalResourceShapeDto();
-		computationalResourceShapeDto.setSize("L");
-		computationalResourceShapeDto.setType("cg1.4xlarge");
-		computationalResourceShapeDto.setRam("22.5 GB");
-		computationalResourceShapeDto.setCpu(16);
-		List<ComputationalResourceShapeDto> metadataArray = new ArrayList<>();
-		metadataArray.add(computationalResourceShapeDto);
-		HashMap<String, List<ComputationalResourceShapeDto>> map = new HashMap<>();
-		map.put("Category", metadataArray);
-		exploratoryMetadata.setExploratoryEnvironmentShapes(map);
-		computationalMetadata.setTemplateName("EMR cluster");
-	}
-
-	@Test
-	public void warmupSuccess() throws Exception {
-		warmuper.start();
-		warmuper.getFileHandlerCallback(getFirstUUID())
-				.handle(getFileName(), EXPLORATORY_TEST_JSON.getBytes());
-		warmuper.getFileHandlerCallback(getFirstUUID())
-				.handle(getFileName(), COMPUTATIONAL_TEST_JSON.getBytes());
-
-		ImageMetadataDTO testExploratory = warmuper.getMetadata(ImageType.EXPLORATORY)
-				.toArray(new ImageMetadataDTO[1])[0];
-		testExploratory.setImage("executeResult");
-		assertEquals(exploratoryMetadata.getImageType(), testExploratory.getImageType());
-
-		ImageMetadataDTO testComputational = warmuper.getMetadata(ImageType.COMPUTATIONAL)
-				.toArray(new ImageMetadataDTO[1])[0];
-		testComputational.setImage("executeResult");
-		assertEquals(computationalMetadata.getImageType(), testComputational.getImageType());
-	}
-
-	private String getFirstUUID() {
-		return warmuper.getUuids().keySet().toArray(new String[1])[0];
-	}
-
-	private String getFileName() {
-		return getFirstUUID() + ".json";
-	}
-
-	private Injector createInjector() {
-		return Guice.createInjector(new AbstractModule() {
-			@Override
-			protected void configure() {
-				bind(FolderListenerExecutor.class).toInstance(mock(FolderListenerExecutor.class));
-				bind(ProvisioningServiceApplicationConfiguration.class).toInstance(createConfiguration());
-				bind(ICommandExecutor.class).toInstance(createCommandExecutor());
-				bind(CallbackHandlerDao.class).toInstance(mock(CallbackHandlerDao.class));
-			}
-		});
-	}
-
-	private ProvisioningServiceApplicationConfiguration createConfiguration() {
-		ProvisioningServiceApplicationConfiguration result = mock(ProvisioningServiceApplicationConfiguration.class);
-		when(result.getWarmupDirectory()).thenReturn("/tmp");
-		when(result.getWarmupPollTimeout()).thenReturn(Duration.seconds(3));
-		return result;
-	}
-
-	private ICommandExecutor createCommandExecutor() {
-		ICommandExecutor result = mock(ICommandExecutor.class);
-		try {
-			final ProcessInfo pi = mock(ProcessInfo.class);
-			when(pi.getStdOut()).thenReturn("executeResult");
-			when(result.executeSync(anyString(), anyString(), anyString())).thenReturn(pi);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return result;
-	}
-}
diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockTest.java b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockTest.java
deleted file mode 100644
index a065248..0000000
--- a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/commands/CommandExecutorMockTest.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.commands;
-
-import com.epam.dlab.backendapi.core.response.handlers.ExploratoryCallbackHandler;
-import com.epam.dlab.backendapi.core.response.handlers.LibListCallbackHandler;
-import com.epam.dlab.backendapi.core.response.handlers.ResourceCallbackHandler;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.rest.client.RESTServiceMock;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.UUID;
-import java.util.concurrent.ExecutionException;
-
-@Ignore
-public class CommandExecutorMockTest {
-	private CommandExecutorMock getCommandExecutor() {
-		return new CommandExecutorMock(CloudProvider.AWS);
-	}
-
-	private CommandExecutorMock executeAsync(String cmd) throws IOException, InterruptedException, ExecutionException {
-		String uuid = UUID.randomUUID().toString();
-		CommandExecutorMock exec = new CommandExecutorMock(CloudProvider.AWS);
-		exec.executeAsync("user", uuid, cmd);
-		exec.getResultSync();
-
-		Files.deleteIfExists(Paths.get(exec.getResponseFileName()));
-
-		return exec;
-	}
-
-	private String getRequestId(CommandExecutorMock exec) {
-		return exec.getVariables().get("request_id");
-	}
-
-	private String getEdgeUserName(CommandExecutorMock exec) {
-		return exec.getVariables().get("edge_user_name");
-	}
-
-	private String getExploratoryName(CommandExecutorMock exec) {
-		return exec.getVariables().get("exploratory_name");
-	}
-
-	private void handleExploratory(String cmd, DockerAction action) throws Exception {
-		String uuid = UUID.randomUUID().toString();
-		CommandExecutorMock exec = getCommandExecutor();
-		exec.executeAsync("user", uuid, cmd);
-		exec.getResultSync();
-
-		RESTServiceMock selfService = new RESTServiceMock();
-		ExploratoryCallbackHandler handler = new ExploratoryCallbackHandler(selfService, action,
-				getRequestId(exec), getEdgeUserName(exec), "", getExploratoryName(exec));
-		handler.handle(exec.getResponseFileName(), Files.readAllBytes(Paths.get(exec.getResponseFileName())));
-
-		try {
-			Files.deleteIfExists(Paths.get(exec.getResponseFileName()));
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-
-	private void handleExploratoryLibs(String cmd, DockerAction action) throws Exception {
-		String uuid = UUID.randomUUID().toString();
-		CommandExecutorMock exec = getCommandExecutor();
-		exec.executeAsync("user", uuid, cmd);
-		exec.getResultSync();
-
-		RESTServiceMock selfService = new RESTServiceMock();
-		if (action == DockerAction.LIB_INSTALL) {
-			throw new Exception("Unimplemented action " + action);
-		}
-		/*
-		ResourceCallbackHandler<?> handler = action.equals(DockerAction.LIB_INSTALL) ?
-				new LibInstallCallbackHandler(selfService, action,
-				getRequestId(exec), getEdgeUserName(exec), getExploratoryName(exec)):
-				new LibListCallbackHandler(selfService, action,
-				getRequestId(exec), getEdgeUserName(exec), getExploratoryName(exec));
-		*/
-		ResourceCallbackHandler<?> handler = new LibListCallbackHandler(selfService, action, getRequestId(exec),
-				getEdgeUserName(exec), getExploratoryName(exec));
-
-		handler.handle(exec.getResponseFileName(), Files.readAllBytes(Paths.get(exec.getResponseFileName())));
-
-		try {
-			Files.deleteIfExists(Paths.get(exec.getResponseFileName()));
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-
-	@Test
-	public void describe() throws IOException, InterruptedException, ExecutionException {
-		String cmd =
-				"docker run " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/notebook:/logs/notebook " +
-						"-e \"conf_resource=notebook\" " +
-						"-e \"request_id=28ba67a4-b2ee-4753-a406-892977089ad9\" " +
-						"docker.dlab-zeppelin:latest --action describe";
-		executeAsync(cmd);
-	}
-
-	@Test
-	public void edgeCreate() throws IOException, InterruptedException, ExecutionException {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"," +
-						"\"conf_service_base_name\":\"usein1120v13\",\"conf_os_family\":\"debian\"," +
-						"\"aws_vpc_id\":\"vpc-83c469e4\",\"aws_subnet_id\":\"subnet-22db937a\"," +
-						"\"aws_security_groups_ids\":\"sg-4d42dc35\"}' | " +
-						"docker run -i --name user_create_edge_1487309918496 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/edge:/logs/edge " +
-						"-e \"conf_resource=edge\" " +
-						"-e \"request_id=b8267ae6-07b0-44ef-a489-7714b20cf0a4\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"docker.dlab-edge --action create";
-		executeAsync(cmd);
-	}
-
-	@Test
-	public void edgeStop() throws IOException, InterruptedException, ExecutionException {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"," +
-						"\"conf_service_base_name\":\"usein1122v4\",\"conf_os_family\":\"debian\"}' | " +
-						"docker run -i --name user_stop_edge_1487677431773 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/edge:/logs/edge " +
-						"-e \"conf_resource=edge\" " +
-						"-e \"request_id=2ba3d8f7-654b-48aa-9386-e815b296a957\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"docker.dlab-edge --action stop";
-		executeAsync(cmd);
-	}
-
-	@Test
-	public void edgeStart() throws IOException, InterruptedException, ExecutionException {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"," +
-						"\"conf_service_base_name\":\"usein1122v4\",\"conf_os_family\":\"debian\"}' | " +
-						"docker run -i --name user_start_edge_1487677538220 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/edge:/logs/edge " +
-						"-e \"conf_resource=edge\" " +
-						"-e \"request_id=d2f6fbae-979e-4b08-9c0d-559a103ec0cc\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"docker.dlab-edge --action start";
-		executeAsync(cmd);
-	}
-
-	@Test
-	public void edgeStatus() throws IOException, InterruptedException, ExecutionException {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"," +
-						"\"edge_list_resources\":{\"host\":[{\"id\":\"i-05c1a0d0ad030cdc1\"}, " +
-						"{\"id\":\"i-05c1a0d0ad030cdc2\"}]}}' | " +
-						"docker run -i --name user_status_resources_1487607145484 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/edge:/logs/edge " +
-						"-e \"conf_resource=status\" " +
-						"-e \"request_id=0fb82e16-deb2-4b18-9ab3-f9f1c12d9e62\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"docker.dlab-edge --action status";
-		executeAsync(cmd);
-	}
-
-
-	@Test
-	public void notebookCreate() throws Exception {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"," +
-						"\"conf_service_base_name\":\"usein1120v13\",\"conf_os_family\":\"debian\"," +
-						"\"exploratory_name\":\"useinxz1\",\"application\":\"zeppelin\",\"notebook_image\":\"docker" +
-						".dlab-zeppelin\"," +
-						"\"aws_notebook_instance_type\":\"t2.medium\",\"aws_security_groups_ids\":\"sg-4d42dc35\"}' " +
-						"|" +
-						" " +
-						"docker run -i --name user_create_exploratory_useinxz1_1487312574572 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/notebook:/logs/notebook " +
-						"-e \"conf_resource=notebook\" " +
-						"-e \"request_id=f720f30b-5949-4919-a50b-ce7af58d6fe9\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"docker.dlab-zeppelin --action create";
-		handleExploratory(cmd, DockerAction.CREATE);
-	}
-
-	@Test
-	public void notebookStop() throws Exception {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"," +
-						"\"conf_service_base_name\":\"usein1120v13\"," +
-						"\"exploratory_name\":\"useinxz1\",\"notebook_image\":\"docker.dlab-zeppelin\"," +
-						"\"notebook_instance_name\":\"usein1120v13-user-nb-useinxz1-78af3\"," +
-						"\"conf_key_dir\":\"/root/keys\"}' | " +
-						"docker run -i --name user_stop_exploratory_useinxz1_1487315364165 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/notebook:/logs/notebook " +
-						"-e \"conf_resource=notebook\" " +
-						"-e \"request_id=33998e05-7781-432e-b748-bf3f0e7f9342\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"docker.dlab-zeppelin --action stop";
-		handleExploratory(cmd, DockerAction.STOP);
-	}
-
-	@Test
-	public void notebookStart() throws Exception {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"," +
-						"\"conf_service_base_name\":\"usein1120v13\",\"conf_os_family\":\"debian\"," +
-						"\"exploratory_name\":\"useinxz1\",\"notebook_image\":\"docker.dlab-zeppelin\"," +
-						"\"notebook_instance_name\":\"usein1120v13-user-nb-useinxz1-78af3\"}' | " +
-						"docker run -i --name user_start_exploratory_useinxz1_1487316756857 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/notebook:/logs/notebook " +
-						"-e \"conf_resource=notebook\" " +
-						"-e \"request_id=d50b9d20-1b1a-415f-8e47-ed0aca029e73\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"docker.dlab-zeppelin --action start";
-		handleExploratory(cmd, DockerAction.START);
-	}
-
-	@Test
-	public void notebookTerminate() throws Exception {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"," +
-						"\"conf_service_base_name\":\"usein1120v13\",\"conf_os_family\":\"debian\"," +
-						"\"exploratory_name\":\"useinxz1\",\"notebook_image\":\"docker.dlab-zeppelin\"," +
-						"\"notebook_instance_name\":\"usein1120v13-user-nb-useinxz1-78af3\"}' | " +
-						"docker run -i --name user_terminate_exploratory_useinxz1_1487318040180 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/notebook:/logs/notebook " +
-						"-e \"conf_resource=notebook\" " +
-						"-e \"request_id=de217441-9757-4c4e-b020-548f66b58e00\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"docker.dlab-zeppelin --action terminate";
-		handleExploratory(cmd, DockerAction.TERMINATE);
-	}
-
-
-	@Test
-	public void emrCreate() throws Exception {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"," +
-						"\"conf_service_base_name\":\"usein1122v3\",\"conf_os_family\":\"debian\"," +
-						"\"exploratory_name\":\"useinj1\",\"application\":\"jupyter\"," +
-						"\"computational_name\":\"useine1\"," +
-						"\"emr_instance_count\":\"2\",\"emr_master_instance_type\":\"c4.large\"," +
-						"\"emr_slave_instance_type\":\"c4.large\"," +
-						"\"emr_version\":\"emr-5.2.0\",\"notebook_instance_name\":\"usein1122v3-user-nb-useinj1" +
-						"-1b198" +
-						"\"," +
-						"\"notebook_template_name\":\"Jupyter 1.5\"}' | " +
-						"docker run -i --name user_create_computational_useine1_1487653987822 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/emr:/logs/emr " +
-						"-e \"conf_resource=emr\" " +
-						"-e \"request_id=917db3fd-3c17-4e79-8462-482a71a5d96f\" " +
-						"-e \"ec2_role=EMR_EC2_DefaultRole\" " +
-						"-e \"emr_timeout=3600\" " +
-						"-e \"service_role=EMR_DefaultRole\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"docker.dlab-emr --action create";
-		executeAsync(cmd);
-	}
-
-	@Test
-	public void emrConfigure() throws Exception {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"," +
-						"\"conf_service_base_name\":\"usein1122v4\",\"exploratory_name\":\"useinj1\"," +
-						"\"application\":\"jupyter\",\"computational_name\":\"useine2\",\"emr_version\":\"emr-5.2" +
-						".0\"," +
-						"\"notebook_instance_name\":\"usein1122v4-user-nb-useinj1-b0a2e\"}' | " +
-						"docker run -i --name user_configure_computational_useine2_1487676513703 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/emr:/logs/emr " +
-						"-e \"conf_resource=emr\" " +
-						"-e \"request_id=dc3c1002-c07d-442b-99f9-18085aeb2881\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"docker.dlab-jupyter --action configure";
-		executeAsync(cmd);
-	}
-
-	@Test
-	public void emrTerminate() throws Exception {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"" +
-						",\"conf_service_base_name\":\"usein1122v3\",\"exploratory_name\":\"useinj1\"," +
-						"\"computational_name\":\"useine1\"," +
-						"\"emr_cluster_name\":\"usein1122v3-user-emr-useinj1-useine1-d2db9\"," +
-						"\"notebook_instance_name\":\"usein1122v3-user-nb-useinj1-1b198\"," +
-						"\"conf_key_dir\":\"/root/keys\"}' | " +
-						"docker run -i --name user_terminate_computational_useine1_1487657251858 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/emr:/logs/emr " +
-						"-e \"conf_resource=emr\" " +
-						"-e \"request_id=2d5c23b8-d312-4fad-8a3c-0b813550d841\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"docker.dlab-emr --action terminate";
-		executeAsync(cmd);
-	}
-
-
-	@Test
-	public void listLibs() throws Exception {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"" +
-						",\"conf_service_base_name\":\"usein1122v3\",\"exploratory_name\":\"useinj1\"," +
-						"\"computational_name\":\"useine1\"," +
-						"\"emr_cluster_name\":\"usein1122v3-user-emr-useinj1-useine1-d2db9\"," +
-						"\"notebook_instance_name\":\"usein1122v3-user-nb-useinj1-1b198\"," +
-						"\"conf_key_dir\":\"/root/keys\"}' | " +
-						"docker run -i --name user_terminate_computational_useine1_1487657251858 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/emr:/logs/emr " +
-						"-e \"conf_resource=notebook\" " +
-						"-e \"request_id=2d5c23b8-d312-4fad-8a3c-0b813550d841\" " +
-						"-e \"conf_key_name=BDCC-DSS-POC\" " +
-						"-e \"application=jupyter\" " +
-						"docker.dlab-jupyter --action lib_list";
-		executeAsync(cmd);
-		handleExploratoryLibs(cmd, DockerAction.LIB_LIST);
-	}
-
-	@Test
-	public void installLibs() throws Exception {
-		String cmd =
-				"echo -e '{\"aws_region\":\"us-west-2\",\"aws_iam_user\":\"user@epam.com\"," +
-						"\"edge_user_name\":\"user\"" +
-						",\"conf_service_base_name\":\"usein1122v3\",\"exploratory_name\":\"useinj1\"," +
-						"\"computational_name\":\"useine1\"," +
-						"\"emr_cluster_name\":\"usein1122v3-user-emr-useinj1-useine1-d2db9\"," +
-						"\"notebook_instance_name\":\"usein1122v3-user-nb-useinj1-1b198\"," +
-						"\"conf_key_dir\":\"/root/keys\"}' | " +
-						"docker run -i --name user_terminate_computational_useine1_1487657251858 " +
-						"-v /home/ubuntu/keys:/root/keys " +
-						"-v /opt/dlab/tmp/result:/response " +
-						"-v /var/opt/dlab/log/emr:/logs/emr " +
-						"-e \"conf_resource=notebook\" " +
-						"-e \"additional_libs={'libraries': {\n" +
-						"\t\t\t\t'os_pkg': ['nmap', 'htop'],\n" +
-						"\t\t\t\t'pip2': ['requests', 'configparser'],\n" +
-						"\t\t\t\t'pip3': ['configparser'],\n" +
-						"\t\t\t\t'r_pkg': ['rmarkdown']\n" +
-						"\t\t\t\t}\n" +
-						"\t\t\t\t}\" " +
-						"docker.dlab-jupyter --action lib_install";
-		executeAsync(cmd);
-		handleExploratoryLibs(cmd, DockerAction.LIB_INSTALL);
-	}
-
-}
diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/docker/command/ImagesDockerCommandTest.java b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/docker/command/ImagesDockerCommandTest.java
deleted file mode 100644
index 7656ac3..0000000
--- a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/docker/command/ImagesDockerCommandTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.docker.command;
-
-import com.epam.dlab.backendapi.core.commands.ImagesDockerCommand;
-import com.epam.dlab.backendapi.core.commands.UnixCommand;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class ImagesDockerCommandTest {
-
-    String GET_IMAGES = "docker images | awk '{print $1\":\"$2}' | sort | uniq | grep \"dlab\" | grep -v \"none\" | grep -v \"edge\"";
-
-    @Test
-    public void testBuildGetImagesCommand() {
-        String getImagesCommand = new ImagesDockerCommand()
-                .pipe(UnixCommand.awk("{print $1\":\"$2}"))
-                .pipe(UnixCommand.sort())
-                .pipe(UnixCommand.uniq())
-                .pipe(UnixCommand.grep("dlab"))
-                .pipe(UnixCommand.grep("none", "-v"))
-                .pipe(UnixCommand.grep("edge", "-v"))
-                .toCMD();
-        assertEquals(GET_IMAGES, getImagesCommand);
-    }
-}
diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/docker/command/RunDockerCommandTest.java b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/docker/command/RunDockerCommandTest.java
deleted file mode 100644
index 068c0c1..0000000
--- a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/docker/command/RunDockerCommandTest.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.docker.command;
-
-import com.epam.dlab.backendapi.core.commands.RunDockerCommand;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class RunDockerCommandTest {
-
-    String DOCKER_BASE = "docker run -v %s:/root/keys -v %s:/response -e \"request_id=%s\" ";
-
-    String GET_IMAGE_METADATA = DOCKER_BASE + "%s --action describe";
-
-    String RUN_IMAGE = DOCKER_BASE + "-e \"dry_run=true\" %s --action run";
-
-    String CREATE_EDGE_METADATA = DOCKER_BASE +
-            "-e \"conf_service_base_name=%s\" " +
-            "-e \"conf_key_name=%s\" " +
-            "-e \"edge_user_name=%s\" " +
-            "%s --action create";
-
-    String CREATE_EMR_CLUSTER = DOCKER_BASE +
-            "-e \"conf_service_base_name=%s\" " +
-            "-e \"emr_instance_count=%s\" " +
-            "-e \"emr_instance_type=%s\" " +
-            "-e \"emr_version=%s\" " +
-            "-e \"ec2_role=%s\" " +
-            "-e \"service_role=%s\" " +
-            "-e \"notebook_name=%s\" " +
-            "-e \"edge_user_name=%s\" " +
-            "-e \"edge_subnet_cidr=%s\" " +
-            "-e \"aws_region=%s\" " +
-            "-e \"conf_key_name=%s\" " +
-            "%s --action create";
-
-    String TERMINATE_EMR_CLUSTER = DOCKER_BASE +
-            "-e \"conf_service_base_name=%s\" " +
-            "-e \"edge_user_name=%s\" " +
-            "-e \"emr_cluster_name=%s\" " +
-            "-e \"aws_region=%s\" " +
-            "-e \"conf_key_name=%s\" " +
-            "%s --action terminate";
-
-    String EXPLORATORY_ENVIRONMENT = DOCKER_BASE +
-            "-e \"conf_service_base_name=%s\" " +
-            "-e \"aws_region=%s\" " +
-            "-e \"conf_key_name=%s\" ";
-
-    String CREATE_EXPLORATORY_ENVIRONMENT = EXPLORATORY_ENVIRONMENT +
-            "-e \"edge_user_name=%s\" " +
-            "-e \"notebook_subnet_cidr=%s\" " +
-            "-e \"aws_security_groups_ids=%s\" " +
-            "%s --action create";
-
-    String TERMINATE_EXPLORATORY_ENVIRONMENT = EXPLORATORY_ENVIRONMENT +
-            "-e \"edge_user_name=%s\" " +
-            "-e \"notebook_instance_name=%s\" " +
-            "%s --action terminate";
-
-    String STOP_EXPLORATORY_ENVIRONMENT = EXPLORATORY_ENVIRONMENT +
-            "-e \"edge_user_name=%s\" " +
-            "-e \"notebook_instance_name=%s\" " +
-            "%s --action stop";
-
-    String rootKeysVolume = "rkv";
-    String responseVolume = "rv";
-    String requestID = "rID";
-    String toDescribe = "tds";
-    String credsKeyName = "ckn";
-    String confServiceBaseName = "csbn";
-    String edgeUserName = "eun";
-    String userKeyName = "ukn";
-    String toCreate = "tc";
-    String toTerminate = "tt";
-    String toStop = "ts";
-    String toRun = "tr";
-    String emrInstanceCount = "10";
-    String emrInstanceType = "emit";
-    String emrVersion = "ev";
-    String ec2Role = "e2r";
-    String serviceRole = "sr";
-    String notebookName = "nn";
-    String edgeSubnetCidr = "esc";
-    String credsRegion = "cr";
-    String emrClusterName = "ecn";
-    String notebookUserName = "nun";
-    String notebookSubnetCidr = "nsc";
-    String credsSecurityGroupsIds = "csgi";
-    String notebookInstanceName = "nin";
-
-    @Test
-    public void testBuildDockerBaseCommand() {
-        RunDockerCommand dockerBaseCommand = new RunDockerCommand()
-                .withVolumeForRootKeys(rootKeysVolume)
-                .withVolumeForResponse(responseVolume)
-                .withRequestId(requestID);
-        assertEquals(String.format(DOCKER_BASE, rootKeysVolume, responseVolume, requestID), dockerBaseCommand.toCMD() + " ");
-    }
-
-    @Test
-    public void testBuildGetImageMetadataCommand() {
-        RunDockerCommand getImageMetadataCommand = new RunDockerCommand()
-                .withVolumeForRootKeys(rootKeysVolume)
-                .withVolumeForResponse(responseVolume)
-                .withRequestId(requestID)
-                .withActionDescribe(toDescribe);
-        assertEquals(String.format(GET_IMAGE_METADATA, rootKeysVolume, responseVolume, requestID, toDescribe), getImageMetadataCommand.toCMD());
-    }
-
-    @Test
-    public void testBuildCreateEdgeMetadataCommand() {
-        RunDockerCommand createEdgeMetadataCommand = new RunDockerCommand()
-                .withVolumeForRootKeys(rootKeysVolume)
-                .withVolumeForResponse(responseVolume)
-                .withRequestId(requestID)
-                .withConfServiceBaseName(confServiceBaseName)
-                .withConfKeyName(credsKeyName)
-                .withEdgeUserName(edgeUserName)
-                .withActionCreate(toCreate);
-        assertEquals(String.format(CREATE_EDGE_METADATA, rootKeysVolume, responseVolume,
-                requestID, confServiceBaseName, credsKeyName, edgeUserName, toCreate),
-                createEdgeMetadataCommand.toCMD());
-    }
-
-    @Test
-    public void testBuildRunImageCommand() {
-        RunDockerCommand runImageCommand = new RunDockerCommand()
-                .withVolumeForRootKeys(rootKeysVolume)
-                .withVolumeForResponse(responseVolume)
-                .withRequestId(requestID)
-                .withDryRun()
-                .withActionRun(toRun);
-        assertEquals(String.format(RUN_IMAGE, rootKeysVolume, responseVolume, requestID, toRun), runImageCommand.toCMD());
-    }
-
-    @Test
-    public void testCreateEMRClusterCommand() {
-        RunDockerCommand createEMRClusterCommand = new RunDockerCommand()
-                .withVolumeForRootKeys(rootKeysVolume)
-                .withVolumeForResponse(responseVolume)
-                .withRequestId(requestID)
-                .withConfServiceBaseName(confServiceBaseName)
-                .withEmrInstanceCount(emrInstanceCount)
-                .withEmrInstanceType(emrInstanceType)
-                .withEmrVersion(emrVersion)
-                .withEc2Role(ec2Role)
-                .withServiceRole(serviceRole)
-                .withNotebookName(notebookName)
-                .withEdgeUserName(edgeUserName)
-                .withEdgeSubnetCidr(edgeSubnetCidr)
-                .withAwsRegion(credsRegion)
-                .withConfKeyName(credsKeyName)
-                .withActionCreate(toCreate);
-
-        assertEquals(
-                String.format(
-                        CREATE_EMR_CLUSTER,
-                        rootKeysVolume,
-                        responseVolume,
-                        requestID,
-                        confServiceBaseName,
-                        emrInstanceCount,
-                        emrInstanceType,
-                        emrVersion,
-                        ec2Role,
-                        serviceRole,
-                        notebookName,
-                        edgeUserName,
-                        edgeSubnetCidr,
-                        credsRegion,
-                        credsKeyName,
-                        toCreate
-                ),
-                createEMRClusterCommand.toCMD()
-        );
-    }
-
-    @Test
-    public void testTerminateEmrCluster() {
-        RunDockerCommand terminateEMRClusterCommand = new RunDockerCommand()
-                .withVolumeForRootKeys(rootKeysVolume)
-                .withVolumeForResponse(responseVolume)
-                .withRequestId(requestID)
-                .withConfServiceBaseName(confServiceBaseName)
-                .withEdgeUserName(edgeUserName)
-                .withEmrClusterName(emrClusterName)
-                .withAwsRegion(credsRegion)
-                .withConfKeyName(credsKeyName)
-                .withActionTerminate(toTerminate);
-
-        assertEquals(
-                String.format(
-                        TERMINATE_EMR_CLUSTER,
-                        rootKeysVolume,
-                        responseVolume,
-                        requestID,
-                        confServiceBaseName,
-                        edgeUserName,
-                        emrClusterName,
-                        credsRegion,
-                        credsKeyName,
-                        toTerminate
-                ),
-                terminateEMRClusterCommand.toCMD()
-        );
-    }
-
-    @Test
-    public void testCreateExploratoryEnvironment() {
-        RunDockerCommand createExploratoryEnvironmentCommand = new RunDockerCommand()
-                .withVolumeForRootKeys(rootKeysVolume)
-                .withVolumeForResponse(responseVolume)
-                .withRequestId(requestID)
-                .withConfServiceBaseName(confServiceBaseName)
-                .withAwsRegion(credsRegion)
-                .withConfKeyName(credsKeyName)
-                .withNotebookUserName(notebookUserName)
-                .withNotebookSubnetCidr(notebookSubnetCidr)
-                .withAwsSecurityGroupsIds(credsSecurityGroupsIds)
-                .withActionCreate(toCreate);
-
-        assertEquals(
-                String.format(
-                        CREATE_EXPLORATORY_ENVIRONMENT,
-                        rootKeysVolume,
-                        responseVolume,
-                        requestID,
-                        confServiceBaseName,
-                        credsRegion,
-                        credsKeyName,
-                        notebookUserName,
-                        notebookSubnetCidr,
-                        credsSecurityGroupsIds,
-                        toCreate
-                ),
-                createExploratoryEnvironmentCommand.toCMD()
-        );
-    }
-
-    @Test
-    public void testTerminateExploratoryEnvironment() {
-        RunDockerCommand terminateExploratoryEnvironmentCommand = new RunDockerCommand()
-                .withVolumeForRootKeys(rootKeysVolume)
-                .withVolumeForResponse(responseVolume)
-                .withRequestId(requestID)
-                .withConfServiceBaseName(confServiceBaseName)
-                .withAwsRegion(credsRegion)
-                .withConfKeyName(credsKeyName)
-                .withNotebookUserName(notebookUserName)
-                .withNotebookInstanceName(notebookInstanceName)
-                .withActionTerminate(toTerminate);
-
-        assertEquals(
-                String.format(
-                        TERMINATE_EXPLORATORY_ENVIRONMENT,
-                        rootKeysVolume,
-                        responseVolume,
-                        requestID,
-                        confServiceBaseName,
-                        credsRegion,
-                        credsKeyName,
-                        notebookUserName,
-                        notebookInstanceName,
-                        toTerminate
-                ),
-                terminateExploratoryEnvironmentCommand.toCMD()
-        );
-    }
-
-    @Test
-    public void testStopExploratoryEnvironment() {
-        RunDockerCommand stopExploratoryEnvironmentCommand = new RunDockerCommand()
-                .withVolumeForRootKeys(rootKeysVolume)
-                .withVolumeForResponse(responseVolume)
-                .withRequestId(requestID)
-                .withConfServiceBaseName(confServiceBaseName)
-                .withAwsRegion(credsRegion)
-                .withConfKeyName(credsKeyName)
-                .withNotebookUserName(notebookUserName)
-                .withNotebookInstanceName(notebookInstanceName)
-                .withActionStop(toStop);
-
-        assertEquals(
-                String.format(
-                        STOP_EXPLORATORY_ENVIRONMENT,
-                        rootKeysVolume,
-                        responseVolume,
-                        requestID,
-                        confServiceBaseName,
-                        credsRegion,
-                        credsKeyName,
-                        notebookUserName,
-                        notebookInstanceName,
-                        toStop
-                ),
-                stopExploratoryEnvironmentCommand.toCMD()
-        );
-    }
-
-}
diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/folderlistener/FolderListenerTest.java b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/folderlistener/FolderListenerTest.java
deleted file mode 100644
index 1ba3aab..0000000
--- a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/folderlistener/FolderListenerTest.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.folderlistener;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.util.ServiceUtils;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.concurrent.ExecutionException;
-
-import static org.junit.Assert.assertEquals;
-
-public class FolderListenerTest {
-	private final long maxWaitTimeoutMillis = 30000;
-	
-	private final long timeoutMillis = 2000;
-
-	private final long fileLengthCheckDelay = 1000;
-	
-	private boolean handleResult = true;
-	
-	public class FileHandler implements FileHandlerCallback {
-		private final String uuid;
-
-		public FileHandler(String uuid) {
-			this.uuid = uuid;
-		}
-
-		@Override
-		public String getUUID() {
-			return uuid;
-		}
-
-		@Override
-		public boolean checkUUID(String uuid) {
-			return this.uuid.equals(uuid);
-		}
-
-		@Override
-		public boolean handle(String fileName, byte[] content) throws Exception {
-			if (!handleResult) {
-				throw new Exception("Test exception");
-			}
-			return handleResult;
-		}
-
-		@Override
-		public void handleError(String errorMessage) {
-			System.out.println("handleError called for UUID " + getUUID());
-		}
-
-		@Override
-		public String getUser() {
-			return null;
-		}
-	}
-
-	private String getFileName(String uuid) {
-		return "FolderListenerTest_" + uuid + ".json";
-	}
-
-	private String getDirectory() {
-		return ServiceUtils.getUserDir();
-	}
-	
-	private void removeFile(String uuid) throws IOException {
-		File file = new File(getDirectory(), getFileName(uuid));
-		if ( file.exists() ) {
-			file.delete();
-		}
-	}
-
-	private void createFile(String uuid) throws IOException {
-		File file = new File(getDirectory(), getFileName(uuid));
-		removeFile(uuid);
-		FileWriter f = new FileWriter(file);
-		
-		f.write("test");
-		f.flush();
-		f.close();
-	}
-	
-	
-	private void processFile(WatchItem item) throws InterruptedException, IOException {
-		long expiredTime = System.currentTimeMillis() + maxWaitTimeoutMillis;
-		while (!FolderListener.getListeners().isEmpty() &&
-				!FolderListener.getListeners().get(0).isListen()) {
-			if (expiredTime < System.currentTimeMillis()) {
-				throw new InterruptedException("Timeout has been expired");
-			}
-			Thread.sleep(100);
-		}
-
-		expiredTime = System.currentTimeMillis() + maxWaitTimeoutMillis;
-		while (item.getFuture() == null) {
-			if (expiredTime < System.currentTimeMillis()) {
-				throw new InterruptedException("Timeout has been expired");
-			}
-			Thread.sleep(100);
-		}
-	}
-	
-	@Test
-	public void listen() throws InterruptedException, ExecutionException, IOException {
-		Integer uuid = 1;
-		FileHandlerCallback fHandler;
-		WatchItem item;
-		
-		handleResult = false;
-		fHandler = new FileHandler(uuid.toString());
-		item = FolderListener.listen(getDirectory(), fHandler, timeoutMillis, fileLengthCheckDelay, null);
-		FolderListener listener = FolderListener.getListeners().get(0);
-		assertEquals(false, listener.isListen());
-		assertEquals(true, listener.isAlive());
-		System.out.println("TEST process FALSE");
-		
-		uuid = 2;
-		createFile(uuid.toString());
-		fHandler = new FileHandler(uuid.toString());
-		item = FolderListener.listen(getDirectory(), fHandler, timeoutMillis, fileLengthCheckDelay, null);
-		processFile(item);
-		assertEquals(true, listener.isListen());
-		assertEquals(false, item.getFutureResultSync());
-		assertEquals(false, item.getFutureResult());
-
-		System.out.println("TEST process TRUE");
-		uuid = 3;
-		handleResult = true;
-		createFile(uuid.toString());
-		fHandler = new FileHandler(uuid.toString());
-		item = FolderListener.listen(getDirectory(), fHandler, timeoutMillis, fileLengthCheckDelay, null);
-		processFile(item);
-		assertEquals(true, item.getFutureResultSync());
-		assertEquals(true, item.getFutureResult());
-		
-		System.out.println("TEST process with out listen");
-		uuid = 4;
-		createFile(uuid.toString());
-		fHandler = new FileHandler(uuid.toString());
-		item = FolderListener.listen(getDirectory(), fHandler, timeoutMillis, fileLengthCheckDelay, getFileName(uuid
-				.toString()), null);
-		
-		long expiredTime = System.currentTimeMillis() + maxWaitTimeoutMillis;
-		while (item.getFuture() == null) {
-			if (expiredTime < System.currentTimeMillis()) {
-				throw new InterruptedException("Timeout has been expired");
-			}
-			Thread.sleep(100);
-		}
-		assertEquals(true, item.getFutureResultSync());
-		assertEquals(true, item.getFutureResult());
-
-		FolderListener.terminateAll();
-		expiredTime = System.currentTimeMillis() + maxWaitTimeoutMillis;
-		while (FolderListener.getListeners().size() > 0) {
-			if (expiredTime < System.currentTimeMillis()) {
-				throw new InterruptedException("Timeout has been expired");
-			}
-			Thread.sleep(100);
-		}
-
-		System.out.println("All listen tests passed");
-
-	
-		for (int i = 1; i <= uuid; i++) {
-			removeFile(String.valueOf(i));
-		}
-	}
-
-}
diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItemListTest.java b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItemListTest.java
deleted file mode 100644
index 780df37..0000000
--- a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItemListTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.folderlistener;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.response.folderlistener.WatchItem.ItemStatus;
-import org.junit.Test;
-
-import java.util.concurrent.ExecutionException;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-public class WatchItemListTest {
-
-	private static final String UUID = "123";
-
-	private final FileHandlerCallback fHandler = new FileHandler(UUID);
-
-	private final long timeoutMillis = 1000;
-
-	private final long fileLengthCheckDelay = 10000;
-
-	public class FileHandler implements FileHandlerCallback {
-		private final String uuid;
-
-		public FileHandler(String uuid) {
-			this.uuid = uuid;
-		}
-
-		@Override
-		public String getUUID() {
-			return uuid;
-		}
-
-		@Override
-		public boolean checkUUID(String uuid) {
-			return this.uuid.equals(uuid);
-		}
-
-		@Override
-		public boolean handle(String fileName, byte[] content) throws Exception {
-			return true;
-		}
-
-		@Override
-		public void handleError(String errorMessage) {
-			System.out.println("handleError called for UUID " + getUUID());
-		}
-
-		@Override
-		public String getUser() {
-			return null;
-		}
-	}
-
-
-	private String getDirectory() {
-		return "./";
-	}
-
-	private String getFileName() {
-		return UUID + ".json";
-	}
-
-	@Test
-	public void checkGetters() {
-		WatchItemList items = new WatchItemList(getDirectory(), null);
-
-		assertEquals(0, items.size());
-
-		items.append(fHandler, timeoutMillis, fileLengthCheckDelay);
-		assertEquals(1, items.size());
-
-		WatchItem item = items.get(0);
-		assertNotNull(item);
-		assertEquals(0, items.getIndex(UUID));
-		assertEquals(item, items.getItem(getFileName()));
-		items.remove(0);
-		assertEquals(0, items.size());
-	}
-
-
-	@Test
-	public void processItem() throws InterruptedException, ExecutionException {
-		WatchItemList items = new WatchItemList(getDirectory(), null);
-		items.append(fHandler, timeoutMillis, fileLengthCheckDelay);
-
-		WatchItem item = items.get(0);
-
-		assertEquals(false, items.processItem(item));
-
-		item.setFileName(getFileName());
-		assertEquals(true, items.processItem(item));
-
-		assertEquals(ItemStatus.INPROGRESS, item.getStatus());
-		item.getFutureResultSync();
-	}
-
-	@Test
-	public void processItemAll() throws InterruptedException, ExecutionException {
-		WatchItemList items = new WatchItemList(getDirectory(), null);
-		items.append(fHandler, timeoutMillis, fileLengthCheckDelay);
-
-		WatchItem item = items.get(0);
-
-		assertEquals(0, items.processItemAll());
-
-		item.setFileName(getFileName());
-		assertEquals(1, items.processItemAll());
-
-		assertEquals(ItemStatus.INPROGRESS, item.getStatus());
-		item.getFutureResultSync();
-	}
-
-}
diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItemTest.java b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItemTest.java
deleted file mode 100644
index 33798b9..0000000
--- a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/folderlistener/WatchItemTest.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.folderlistener;
-
-import com.epam.dlab.backendapi.core.FileHandlerCallback;
-import com.epam.dlab.backendapi.core.response.folderlistener.WatchItem.ItemStatus;
-import io.dropwizard.util.Duration;
-import org.junit.Test;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-
-import static org.junit.Assert.assertEquals;
-
-public class WatchItemTest {
-
-	private static final String UUID = "123";
-
-	private final FileHandlerCallback fHandler = new FileHandler(UUID);
-
-	private final long timeoutMillis = 1000;
-
-	private final long fileLengthCheckDelay = 10000;
-
-	public class FileHandler implements FileHandlerCallback {
-		private final String uuid;
-
-		public FileHandler(String uuid) {
-			this.uuid = uuid;
-		}
-
-		@Override
-		public String getUUID() {
-			return uuid;
-		}
-
-		@Override
-		public boolean checkUUID(String uuid) {
-			return this.uuid.equals(uuid);
-		}
-
-		@Override
-		public boolean handle(String fileName, byte[] content) throws Exception {
-			return true;
-		}
-
-		@Override
-		public void handleError(String errorMessage) {
-			System.out.println("handleError called for UUID " + getUUID());
-		}
-
-		@Override
-		public String getUser() {
-			return null;
-		}
-	}
-
-	
-	private WatchItem getWatchItem() {
-		return new WatchItem(fHandler, timeoutMillis, fileLengthCheckDelay);
-	}
-
-	private String getFileName() {
-		return UUID + ".json";
-	}
-
-	private String getDirectory() {
-		return "./";
-	}
-
-	private AsyncFileHandler getSupplier(WatchItem item) {
-		return new AsyncFileHandler(item.getFileName(), getDirectory(), item.getFileHandlerCallback(),
-				Duration.milliseconds(item.getFileLengthCheckDelay()));
-	}
-	
-	@Test
-	public void isExpired() {
-		WatchItem item;
-
-		item = new WatchItem(fHandler, -1, fileLengthCheckDelay);
-		assertEquals(true, item.isExpired());
-
-		item = getWatchItem();
-		assertEquals(false, item.isExpired());
-	}
-
-	@Test
-	public void status() throws InterruptedException, ExecutionException {
-		WatchItem item;
-
-		item = new WatchItem(fHandler, -1, fileLengthCheckDelay);
-		assertEquals(ItemStatus.TIMEOUT_EXPIRED, item.getStatus());
-
-		item.setFileName(getFileName());
-		assertEquals(ItemStatus.FILE_CAPTURED, item.getStatus());
-
-		item = getWatchItem();
-		assertEquals(ItemStatus.WAIT_FOR_FILE, item.getStatus());
-
-		item.setFileName(getFileName());
-		assertEquals(ItemStatus.FILE_CAPTURED, item.getStatus());
-
-		item.setFuture(CompletableFuture.supplyAsync(getSupplier(item)));
-		assertEquals(ItemStatus.INPROGRESS, item.getStatus());
-		
-		assertEquals(null, item.getFutureResult());
-		item.getFutureResultSync();
-		
-		assertEquals(ItemStatus.IS_DONE, item.getStatus());
-
-		item.setFuture(CompletableFuture.supplyAsync(getSupplier(item)));
-		item.getFuture().cancel(false);
-		assertEquals(ItemStatus.IS_CANCELED, item.getStatus());
-		
-		//IS_INTERRUPTED, IS_FAILED
-	}
-	
-	@Test
-	public void futureResult() throws InterruptedException, ExecutionException {
-		WatchItem item = getWatchItem();
-		
-		item.setFileName(getFileName());
-		item.setFuture(CompletableFuture.supplyAsync(getSupplier(item)));
-		
-		assertEquals(false, item.getFutureResultSync());
-		assertEquals(false, item.getFutureResult());
-	}
-}
diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java
deleted file mode 100644
index 0dc3663..0000000
--- a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/core/response/handlers/dao/FileSystemCallbackHandlerDaoTest.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.core.response.handlers.dao;
-
-import com.epam.dlab.backendapi.ProvisioningServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.core.DockerWarmuper;
-import com.epam.dlab.backendapi.core.commands.DockerAction;
-import com.epam.dlab.backendapi.core.response.handlers.LibListCallbackHandler;
-import com.epam.dlab.backendapi.core.response.handlers.PersistentFileHandler;
-import com.epam.dlab.exceptions.DlabException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.rules.TemporaryFolder;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Matchers;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-
-import static org.junit.Assert.*;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.refEq;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class FileSystemCallbackHandlerDaoTest {
-
-	@Mock
-	private ObjectMapper mapper;
-	@Mock
-	private ProvisioningServiceApplicationConfiguration configuration;
-	@Mock
-	private CallbackHandlerDao dao;
-	@InjectMocks
-	private FileSystemCallbackHandlerDao fileSystemCallbackHandlerDao;
-
-	@Rule
-	public TemporaryFolder folder = new TemporaryFolder();
-	@Rule
-	public ExpectedException expectedException = ExpectedException.none();
-
-	@Before
-	public void createHandlersFolder() throws IOException {
-		folder.newFolder("opt", "handlers");
-	}
-
-
-	@Test
-	public void upsert() throws IOException {
-		final String handlersFolders = getHandlersFolder();
-		when(configuration.getHandlerDirectory()).thenReturn(handlersFolders);
-		when(mapper.writeValueAsBytes(any())).thenReturn("{'test': 'test'}".getBytes());
-		final PersistentFileHandler persistentFileHandler =
-				new PersistentFileHandler(new LibListCallbackHandler(null,
-						DockerAction.LIB_LIST, "uuid", "test", "das"), 1L, "/opt/test");
-
-		fileSystemCallbackHandlerDao.upsert(persistentFileHandler);
-
-		verify(configuration, times(2)).getHandlerDirectory();
-		verify(mapper).writeValueAsBytes(refEq(persistentFileHandler));
-		assertTrue(new File(handlersFolders + File.separator + "LibListCallbackHandler_uuid.json").exists());
-		verifyNoMoreInteractions(mapper, configuration, dao);
-	}
-
-	@Test
-	public void upsertTwoSimilarHandlers() throws IOException {
-		final String handlersFolders = getHandlersFolder();
-		when(configuration.getHandlerDirectory()).thenReturn(handlersFolders);
-		when(mapper.writeValueAsBytes(any())).thenReturn("{'test': 'test'}".getBytes());
-		final PersistentFileHandler persistentFileHandler1 = new PersistentFileHandler(new DockerWarmuper()
-				.new DockerFileHandlerCallback("sameUUID"), 1L, "/opt/test");
-		final PersistentFileHandler persistentFileHandler2 =
-				new PersistentFileHandler(new LibListCallbackHandler(null,
-						DockerAction.LIB_LIST, "sameUUID", "test", "das1"), 1L, "/opt/test");
-		final PersistentFileHandler persistentFileHandler3 =
-				new PersistentFileHandler(new LibListCallbackHandler(null,
-						DockerAction.LIB_LIST, "anotherUUID", "test", "das2"), 1L, "/opt/test");
-
-
-		fileSystemCallbackHandlerDao.upsert(persistentFileHandler1);
-		fileSystemCallbackHandlerDao.upsert(persistentFileHandler2);
-		fileSystemCallbackHandlerDao.upsert(persistentFileHandler3);
-
-		verify(configuration, times(6)).getHandlerDirectory();
-		verify(mapper).writeValueAsBytes(refEq(persistentFileHandler1));
-		verify(mapper).writeValueAsBytes(refEq(persistentFileHandler2));
-		verify(mapper).writeValueAsBytes(refEq(persistentFileHandler3));
-		assertTrue(new File(handlersFolders + File.separator + "LibListCallbackHandler_sameUUID.json").exists());
-		assertTrue(new File(handlersFolders + File.separator + "LibListCallbackHandler_anotherUUID.json").exists());
-		assertFalse(new File(handlersFolders + File.separator + "DockerFileHandlerCallback_sameUUID.json").exists());
-		verifyNoMoreInteractions(mapper, configuration, dao);
-	}
-
-	@Test
-	public void findAll() throws IOException {
-		final File handler1 = getHandlerFile("test1.json");
-		final File handler2 = getHandlerFile("test2.json");
-		final String handlersFolder = getHandlersFolder();
-
-		when(configuration.getHandlerDirectory()).thenReturn(handlersFolder);
-		final PersistentFileHandler persistentFileHandler1 = new PersistentFileHandler(null, 1L, "/opt");
-		final PersistentFileHandler persistentFileHandler2 = new PersistentFileHandler(null, 2L, "/opt");
-		when(mapper.readValue(any(File.class), Matchers.<Class<PersistentFileHandler>>any())).thenReturn
-				(persistentFileHandler1).thenReturn(persistentFileHandler2);
-		final List<PersistentFileHandler> handlers = fileSystemCallbackHandlerDao.findAll();
-
-		assertEquals(2, handlers.size());
-
-		verify(configuration).getHandlerDirectory();
-		verify(mapper).readValue(handler1, PersistentFileHandler.class);
-		verify(mapper).readValue(handler2, PersistentFileHandler.class);
-		verifyNoMoreInteractions(mapper, dao, configuration);
-	}
-
-	@Test
-	public void findAllWithException() throws IOException {
-		new File(getHandlersFolder()).delete();
-		when(configuration.getHandlerDirectory()).thenReturn(getHandlersFolder());
-		when(mapper.readValue(any(File.class), Matchers.<Class<PersistentFileHandler>>any())).thenThrow(new
-				RuntimeException("Exception"));
-		final List<PersistentFileHandler> handlers = fileSystemCallbackHandlerDao.findAll();
-
-		assertEquals(0, handlers.size());
-
-		verify(configuration).getHandlerDirectory();
-		verifyNoMoreInteractions(mapper, dao, configuration);
-	}
-
-	@Test
-	public void findAllWithOneWrongHandlerFile() throws IOException {
-		final File handler1 = getHandlerFile("test1.json");
-		final File handler2 = getHandlerFile("test2.json");
-		final String handlersFolder = getHandlersFolder();
-
-		final PersistentFileHandler persistentFileHandler1 = new PersistentFileHandler(null, 1L, "/opt");
-
-		when(configuration.getHandlerDirectory()).thenReturn(handlersFolder);
-		when(mapper.readValue(any(File.class), Matchers.<Class<PersistentFileHandler>>any())).thenReturn
-				(persistentFileHandler1).thenThrow(new RuntimeException("Exception"));
-
-		final List<PersistentFileHandler> handlers = fileSystemCallbackHandlerDao.findAll();
-
-		assertEquals(1, handlers.size());
-
-		verify(configuration).getHandlerDirectory();
-		verify(mapper).readValue(handler1, PersistentFileHandler.class);
-		verify(mapper).readValue(handler2, PersistentFileHandler.class);
-		verifyNoMoreInteractions(mapper, dao, configuration);
-	}
-
-	private String getHandlersFolder() {
-		return folder.getRoot().getAbsolutePath() +
-				File.separator + "opt" + File.separator + "handlers";
-	}
-
-	private File getHandlerFile(String handlerFileName) throws IOException {
-		return folder.newFile(File.separator + "opt" + File.separator + "handlers" + File.separator +
-				handlerFileName);
-	}
-
-	@Test
-	public void remove() throws IOException {
-		final File handler = getHandlerFile("test1.json");
-		handler.createNewFile();
-		final String handlersFolder = getHandlersFolder();
-
-		when(configuration.getHandlerDirectory()).thenReturn(handlersFolder);
-		fileSystemCallbackHandlerDao.remove("test1");
-
-		assertFalse(handler.exists());
-
-		verify(configuration).getHandlerDirectory();
-		verifyNoMoreInteractions(configuration, dao, mapper);
-	}
-
-	@Test
-	public void removeWithException() throws IOException {
-		final String handlersFolder = getHandlersFolder();
-
-		when(configuration.getHandlerDirectory()).thenReturn(handlersFolder);
-		expectedException.expect(DlabException.class);
-		fileSystemCallbackHandlerDao.remove("test1.json");
-	}
-}
\ No newline at end of file
diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/service/RestoreCallbackHandlerServiceImplTest.java b/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/service/RestoreCallbackHandlerServiceImplTest.java
deleted file mode 100644
index aba84c3..0000000
--- a/services/provisioning-service/src/test/java/com/epam/dlab/backendapi/service/RestoreCallbackHandlerServiceImplTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.backendapi.core.response.folderlistener.FolderListenerExecutor;
-import com.epam.dlab.backendapi.core.response.handlers.PersistentFileHandler;
-import com.epam.dlab.backendapi.core.response.handlers.dao.CallbackHandlerDao;
-import com.epam.dlab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
-import io.dropwizard.util.Duration;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.Arrays;
-
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class RestoreCallbackHandlerServiceImplTest {
-
-	@Mock
-	private CallbackHandlerDao dao;
-	@Mock
-	private FolderListenerExecutor folderListenerExecutor;
-	@InjectMocks
-	private RestoreCallbackHandlerServiceImpl restoreCallbackHandlerService;
-
-	@Test
-	public void start() throws Exception {
-
-		final PersistentFileHandler handler1 = new PersistentFileHandler(null, 1L, "test");
-		final PersistentFileHandler handler2 = new PersistentFileHandler(null, 2L, "test1");
-		when(dao.findAll()).thenReturn(Arrays.asList(handler1, handler2));
-
-		restoreCallbackHandlerService.start();
-
-		verify(dao).findAll();
-		verify(folderListenerExecutor).start(handler1.getDirectory(), Duration.milliseconds(handler1.getTimeout()),
-				handler1.getHandler());
-		verify(folderListenerExecutor).start(handler2.getDirectory(), Duration.milliseconds(handler2.getTimeout()),
-				handler2.getHandler());
-		verifyNoMoreInteractions(dao, folderListenerExecutor);
-	}
-}
\ No newline at end of file
diff --git a/services/provisioning-service/src/test/java/com/epam/dlab/rest/client/RESTServiceMock.java b/services/provisioning-service/src/test/java/com/epam/dlab/rest/client/RESTServiceMock.java
deleted file mode 100644
index 3341d4f..0000000
--- a/services/provisioning-service/src/test/java/com/epam/dlab/rest/client/RESTServiceMock.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.rest.client;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RESTServiceMock extends RESTService {
-
-    private final static Logger LOG = LoggerFactory.getLogger(RESTService.class);
-
-    @Override
-    public <T> T post(String path, Object parameter, Class<T> clazz) {
-        LOG.debug("REST POST {},\n object {},\n response class {}", path, parameter, clazz.getName());
-        try {
-			return (T) clazz.newInstance();
-		} catch (InstantiationException e) {
-			e.printStackTrace();
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-		}
-        return null;
-    }
-}
diff --git a/services/readme.txt b/services/readme.txt
index f05eeda..7b0a510 100644
--- a/services/readme.txt
+++ b/services/readme.txt
@@ -38,7 +38,7 @@
    }
 )
 
-use dlabdb
+use datalabdb
 db.createUser(
    {
      user: "admin",
@@ -47,13 +47,13 @@
    }
 )
 1.4. Load collections
-mongoimport -u admin -p <password> -d dlabdb -c settings mongo_settings.json
+mongoimport -u admin -p <password> -d datalabdb -c settings mongo_settings.json
 
 2.	Setting up environment options
 2.1. Set configuration file ..\..\infrastructure-provisioning\src\ssn\templates\ssn.yml
 # DEV_MODE="true"
 2.2. Add system environment variable
-DLAB_CONF_DIR=...\infrastructure-provisioning\src\ssn\templates
+DATALAB_CONF_DIR=...\infrastructure-provisioning\src\ssn\templates
 or create two symlinks to service\provisioning-service and service\self-service for
 ..\..\infrastructure-provisioning\src\ssn\templates\ssn.yml
 Unix
@@ -61,15 +61,15 @@
 Windows
   mklink ssn.yml ..\..\infrastructure-provisioning\src\ssn\templates\ssn.yml
 2.3 For Unix create two folders:
-  /var/opt/dlab/log/ssn
-  /opt/dlab/tmp/result
+  /var/opt/datalab/log/ssn
+  /opt/datalab/tmp/result
 
 3.	Install Node.js
 3.1. Install Node.js from https://nodejs.org/en/
 3.2. Add Node.js installation folder to environment variable PATH
 3.3. Install packages
 	npm install npm@latest -g
-4. Change folder to \dlab\services\self-service\src\main\resources\webapp and install
+4. Change folder to \datalab\services\self-service\src\main\resources\webapp and install
 	npm i
 5. Buid web application:
 	npm run build.prod
diff --git a/services/self-service/Dockerfile b/services/self-service/Dockerfile
index bb2a7b7..354affa 100644
--- a/services/self-service/Dockerfile
+++ b/services/self-service/Dockerfile
@@ -34,7 +34,7 @@
     && apk --purge -v del py-pip \
     && rm -rf /var/cache/apk/*
 
-COPY self-service-2.2.jar /root/
+COPY self-service-*.jar /root/
 COPY entrypoint.sh /
 RUN chmod 755 /entrypoint.sh
 
diff --git a/services/self-service/entrypoint.sh b/services/self-service/entrypoint.sh
index f2d7149..4b34f32 100644
--- a/services/self-service/entrypoint.sh
+++ b/services/self-service/entrypoint.sh
@@ -20,6 +20,27 @@
 #
 # ******************************************************************************
 
+# *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
 checkfile () {
 if [ -s /root/step-certs/ca.crt ]
 then
@@ -52,4 +73,4 @@
 /usr/bin/openssl pkcs12 -export -in /root/step-certs/tls.crt -inkey /root/step-certs/tls.key -name ssn -out ssn.p12 -password pass:${SSN_KEYSTORE_PASSWORD}
 /usr/bin/keytool -importkeystore -srckeystore ssn.p12 -srcstoretype PKCS12 -alias ssn -destkeystore /root/keys/ssn.keystore.jks -deststorepass "${SSN_KEYSTORE_PASSWORD}" -srcstorepass "${SSN_KEYSTORE_PASSWORD}"
 /usr/bin/keytool -keystore /root/keys/ssn.keystore.jks -alias step-ca -import -file /root/step-certs/ca.crt  -deststorepass "${SSN_KEYSTORE_PASSWORD}" -srcstorepass "${SSN_KEYSTORE_PASSWORD}" -noprompt
-/usr/bin/java -Xmx1024M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 -DDLAB_CONF_DIR=/root/ /root/self-service-2.2.jar server /root/self-service.yml
\ No newline at end of file
+/usr/bin/java -Xmx2048M -jar -Duser.timezone=UTC -Dfile.encoding=UTF-8 -DDATALAB_CONF_DIR=/root/ /root/self-service-2.4.jar server /root/self-service.yml
\ No newline at end of file
diff --git a/services/self-service/pom.xml b/services/self-service/pom.xml
index 382dc7c..9532c41 100644
--- a/services/self-service/pom.xml
+++ b/services/self-service/pom.xml
@@ -21,19 +21,12 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
-        <groupId>com.epam.dlab</groupId>
-        <artifactId>dlab</artifactId>
+        <groupId>com.epam.datalab</groupId>
+        <artifactId>datalab</artifactId>
         <version>1.0</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
-    <repositories>
-        <repository>
-            <id>michaelklishin</id>
-            <url>https://dl.bintray.com/michaelklishin/maven/</url>
-        </repository>
-    </repositories>
-
     <artifactId>self-service</artifactId>
 
     <properties>
@@ -43,6 +36,13 @@
         <com.github.oshi.core.version>3.8.0</com.github.oshi.core.version>
     </properties>
 
+    <repositories>
+        <repository>
+            <id>michaelklishin</id>
+            <url>https://dl.bintray.com/michaelklishin/maven/</url>
+        </repository>
+    </repositories>
+
     <dependencies>
         <dependency>
             <groupId>de.ahus1.keycloak.dropwizard</groupId>
@@ -55,10 +55,12 @@
             <artifactId>quartz-mongodb</artifactId>
             <version>2.1.0</version>
         </dependency>
+
         <dependency>
-            <groupId>com.epam.dlab</groupId>
+            <groupId>com.epam.datalab</groupId>
             <artifactId>common</artifactId>
         </dependency>
+
         <dependency>
             <groupId>de.thomaskrille</groupId>
             <artifactId>dropwizard-template-config</artifactId>
@@ -118,25 +120,25 @@
             <version>${com.jcraft.jsch.version}</version>
         </dependency>
         <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>dlab-model</artifactId>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>datalab-model</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
         <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>dlab-utils</artifactId>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>datalab-utils</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
 
         <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>dlab-webapp-common</artifactId>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>datalab-webapp-common</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
 
         <dependency>
-            <groupId>com.epam.dlab</groupId>
-            <artifactId>dlab-mongo-migration</artifactId>
+            <groupId>com.epam.datalab</groupId>
+            <artifactId>datalab-mongo-migration</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
 
@@ -186,10 +188,20 @@
         </dependency>
 
         <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-collections4</artifactId>
             <version>4.4</version>
         </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>${commons-fileupload.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -220,12 +232,12 @@
                                         implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                                 <transformer
                                         implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <mainClass>com.epam.dlab.backendapi.SelfServiceApplication</mainClass>
+                                    <mainClass>com.epam.datalab.backendapi.SelfServiceApplication</mainClass>
                                     <manifestEntries>
                                         <Created-By>&lt;EPAM&gt; Systems</Created-By>
-                                        <Name>com/epam/dlab</Name>
-                                        <Implementation-Title>DLab Self-Service</Implementation-Title>
-                                        <DLab-Version>${dlab.version}</DLab-Version>
+                                        <Name>com/epam/datalab</Name>
+                                        <Implementation-Title>DataLab Self-Service</Implementation-Title>
+                                        <DataLab-Version>${datalab.version}</DataLab-Version>
                                         <Implementation-Vendor>&lt;EPAM&gt; Systems</Implementation-Vendor>
                                         <Build-Time>${maven.build.timestamp}</Build-Time>
                                         <Build-OS>${os.name}</Build-OS>
@@ -246,7 +258,18 @@
                         <exclude>**/*Configuration.*</exclude>
                         <exclude>**/*Module.*</exclude>
                         <exclude>**/*Form.*</exclude>
-                        <exclude>com/epam/dlab/dto/**/*</exclude>
+                        <exclude>com/epam/datalab/dto/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/auth/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/conf/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/domain/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/dropwizard/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/healthcheck/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/modules/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/resources/dto/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/roles/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/servlet/guacamole/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/util/**/*</exclude>
+                        <exclude>com/epam/datalab/backendapi/validation/**/*</exclude>
                     </excludes>
                 </configuration>
             </plugin>
@@ -255,13 +278,13 @@
                 <artifactId>swagger-maven-plugin</artifactId>
                 <version>2.0.10</version>
                 <configuration>
-                    <outputFileName>dlab-api</outputFileName>
+                    <outputFileName>datalab-api</outputFileName>
                     <outputPath>${project.build.directory}/classes/webapp/dist/assets</outputPath>
                     <outputFormat>JSONANDYAML</outputFormat>
                     <resourcePackages>
-                        <package>com.epam.dlab.backendapi.resources</package>
+                        <package>com.epam.datalab.backendapi.resources</package>
                     </resourcePackages>
-                    <prettyPrint>TRUE</prettyPrint>
+                    <prettyPrint>true</prettyPrint>
                 </configuration>
                 <executions>
                     <execution>
@@ -275,4 +298,4 @@
         </plugins>
 
     </build>
-</project>
\ No newline at end of file
+</project>
diff --git a/services/self-service/self-service.yml b/services/self-service/self-service.yml
index df92c25..9e20bf0 100644
--- a/services/self-service/self-service.yml
+++ b/services/self-service/self-service.yml
@@ -43,18 +43,21 @@
 # Timeout for check the status of environment via provisioning service
 checkEnvStatusTimeout: 5m
 
-# Restrict access to DLab features using roles policy
+# Restrict access to DataLab features using roles policy
 rolePolicyEnabled: true
-# Default access to DLab features using roles policy
-roleDefaultAccess: true
+# Default access to DataLab features using roles policy
+roleDefaultAccess: false
 
 # Set to true to enable the scheduler of billing report.
 billingSchedulerEnabled: false
+billingPort: 8088
+# Set to true to enable audit
+auditEnabled: true
 # Name of configuration file for billing report.
-<#if DEV_MODE == "true">
+  <#if DEV_MODE == "true">
 billingConfFile: ${sys['user.dir']}/../billing/billing.yml
 <#else>
-billingConfFile: ${DLAB_CONF_DIR}/billing.yml
+billingConfFile: ${DATALAB_CONF_DIR}/billing.yml
 </#if>
 
 ssnInstanceSize: <SSN_INSTANCE_SIZE>
@@ -123,6 +126,9 @@
   inactivity:
     enabled: false
     cron: "0 0 0/2 ? * * *"
+  checkInfrastructureStatusScheduler:
+    enabled: true
+    cron: "0 0/15 * ? * *"
   startComputationalScheduler:
     enabled: true
     cron: "*/20 * * ? * * *"
@@ -159,7 +165,7 @@
   connectionProtocol: ssh
   serverPort: 4822
   port: 22
-  username: dlab-user
+  username: datalab-user
 
 keycloakConfiguration:
   redirectUri: KEYCLOAK_REDIRECT_URI
@@ -180,3 +186,6 @@
   gzipEnabled: true
   gzipEnabledForRequests: false
   chunkedEncodingEnabled: true
+  
+#onPremise/GKE
+deployed: onPremise
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/SelfServiceApplication.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/SelfServiceApplication.java
new file mode 100644
index 0000000..08ebf1a
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/SelfServiceApplication.java
@@ -0,0 +1,223 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi;
+
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.IndexCreator;
+import com.epam.datalab.backendapi.domain.ExploratoryLibCache;
+import com.epam.datalab.backendapi.dropwizard.bundles.DatalabKeycloakBundle;
+import com.epam.datalab.backendapi.dropwizard.listeners.MongoStartupListener;
+import com.epam.datalab.backendapi.dropwizard.listeners.RestoreHandlerStartupListener;
+import com.epam.datalab.backendapi.healthcheck.MongoHealthCheck;
+import com.epam.datalab.backendapi.modules.ModuleFactory;
+import com.epam.datalab.backendapi.resources.ApplicationSettingResource;
+import com.epam.datalab.backendapi.resources.AuditResource;
+import com.epam.datalab.backendapi.resources.BackupResource;
+import com.epam.datalab.backendapi.resources.EndpointResource;
+import com.epam.datalab.backendapi.resources.EnvironmentResource;
+import com.epam.datalab.backendapi.resources.ExploratoryResource;
+import com.epam.datalab.backendapi.resources.GitCredsResource;
+import com.epam.datalab.backendapi.resources.ImageExploratoryResource;
+import com.epam.datalab.backendapi.resources.InfrastructureInfoResource;
+import com.epam.datalab.backendapi.resources.InfrastructureTemplateResource;
+import com.epam.datalab.backendapi.resources.KeycloakResource;
+import com.epam.datalab.backendapi.resources.LibExploratoryResource;
+import com.epam.datalab.backendapi.resources.OdahuResource;
+import com.epam.datalab.backendapi.resources.ProjectResource;
+import com.epam.datalab.backendapi.resources.SchedulerJobResource;
+import com.epam.datalab.backendapi.resources.SystemInfoResource;
+import com.epam.datalab.backendapi.resources.UserGroupResource;
+import com.epam.datalab.backendapi.resources.UserRoleResource;
+import com.epam.datalab.backendapi.resources.UserSettingsResource;
+import com.epam.datalab.backendapi.resources.ChangePropertiesResource;
+import com.epam.datalab.backendapi.resources.callback.BackupCallback;
+import com.epam.datalab.backendapi.resources.callback.CheckInactivityCallback;
+import com.epam.datalab.backendapi.resources.callback.ComputationalCallback;
+import com.epam.datalab.backendapi.resources.callback.EnvironmentStatusCallback;
+import com.epam.datalab.backendapi.resources.callback.ExploratoryCallback;
+import com.epam.datalab.backendapi.resources.callback.GitCredsCallback;
+import com.epam.datalab.backendapi.resources.callback.ImageCallback;
+import com.epam.datalab.backendapi.resources.callback.LibraryCallback;
+import com.epam.datalab.backendapi.resources.callback.OdahuCallback;
+import com.epam.datalab.backendapi.resources.callback.ProjectCallback;
+import com.epam.datalab.backendapi.resources.callback.ReuploadKeyCallback;
+import com.epam.datalab.backendapi.schedulers.internal.ManagedScheduler;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.servlet.guacamole.GuacamoleServlet;
+import com.epam.datalab.cloud.CloudModule;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.migration.mongo.DatalabMongoMigration;
+import com.epam.datalab.mongo.MongoServiceFactory;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.mappers.DatalabValidationExceptionMapper;
+import com.epam.datalab.rest.mappers.JsonProcessingExceptionMapper;
+import com.epam.datalab.rest.mappers.ResourceConflictExceptionMapper;
+import com.epam.datalab.rest.mappers.ResourceNotFoundExceptionMapper;
+import com.epam.datalab.rest.mappers.ResourceQuoteReachedExceptionMapper;
+import com.epam.datalab.rest.mappers.RuntimeExceptionMapper;
+import com.epam.datalab.rest.mappers.ValidationExceptionMapper;
+import com.epam.datalab.util.ServiceUtils;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.name.Names;
+import de.thomaskrille.dropwizard_template_config.TemplateConfigBundle;
+import de.thomaskrille.dropwizard_template_config.TemplateConfigBundleConfiguration;
+import io.dropwizard.Application;
+import io.dropwizard.assets.AssetsBundle;
+import io.dropwizard.forms.MultiPartBundle;
+import io.dropwizard.jersey.setup.JerseyEnvironment;
+import io.dropwizard.jetty.BiDiGzipHandler;
+import io.dropwizard.setup.Bootstrap;
+import io.dropwizard.setup.Environment;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.HandlerWrapper;
+
+/**
+ * Self Service based on Dropwizard application.
+ */
+@Slf4j
+public class SelfServiceApplication extends Application<SelfServiceApplicationConfiguration> {
+    public static final String GUACAMOLE_SERVLET_PATH = "/api/tunnel";
+    private static Injector appInjector;
+
+    public static Injector getInjector() {
+        return appInjector;
+    }
+
+    public static void setInjector(Injector injector) {
+        SelfServiceApplication.appInjector = injector;
+    }
+
+    public static void main(String... args) throws Exception {
+        if (ServiceUtils.printAppVersion(SelfServiceApplication.class, args)) {
+            return;
+        }
+        new SelfServiceApplication().run(args);
+    }
+
+    @Override
+    public void initialize(Bootstrap<SelfServiceApplicationConfiguration> bootstrap) {
+        super.initialize(bootstrap);
+        bootstrap.addBundle(new MultiPartBundle());
+        bootstrap.addBundle(new AssetsBundle("/webapp/dist", "/", "index.html"));
+        bootstrap.addBundle(new TemplateConfigBundle(
+                new TemplateConfigBundleConfiguration().fileIncludePath(ServiceUtils.getConfPath())
+        ));
+
+        bootstrap.addBundle(new DatalabKeycloakBundle());
+    }
+
+    @Override
+    public void run(SelfServiceApplicationConfiguration configuration, Environment environment) {
+
+        CloudModule cloudModule = ModuleFactory.getCloudProviderModule(configuration);
+        Injector injector = Guice.createInjector(ModuleFactory.getModule(configuration, environment), cloudModule);
+        setInjector(injector);
+
+        cloudModule.init(environment, injector);
+        if (configuration.isMongoMigrationEnabled()) {
+            environment.lifecycle().addServerLifecycleListener(server -> applyMongoMigration(configuration));
+        }
+        environment.lifecycle().addServerLifecycleListener(injector.getInstance(MongoStartupListener.class));
+        final RestoreHandlerStartupListener restoreHandlerStartupListener =
+                new RestoreHandlerStartupListener(injector.getInstance(Key.get(RESTService.class,
+                        Names.named(ServiceConsts.PROVISIONING_SERVICE_NAME))), injector.getInstance(EndpointService.class));
+        environment.lifecycle().addServerLifecycleListener(restoreHandlerStartupListener);
+        environment.lifecycle().addServerLifecycleListener(this::disableGzipHandlerForGuacamoleServlet);
+        environment.lifecycle().manage(injector.getInstance(IndexCreator.class));
+        environment.lifecycle().manage(injector.getInstance(ExploratoryLibCache.class));
+        environment.lifecycle().manage(injector.getInstance(ManagedScheduler.class));
+        environment.healthChecks().register(ServiceConsts.MONGO_NAME, injector.getInstance(MongoHealthCheck.class));
+
+        environment.servlets().addServlet("GuacamoleServlet", injector.getInstance(GuacamoleServlet.class))
+                .addMapping(GUACAMOLE_SERVLET_PATH);
+
+
+        JerseyEnvironment jersey = environment.jersey();
+
+        jersey.register(new RuntimeExceptionMapper());
+        jersey.register(new JsonProcessingExceptionMapper());
+        jersey.register(new ResourceConflictExceptionMapper());
+        jersey.register(new ResourceNotFoundExceptionMapper());
+        jersey.register(new DatalabValidationExceptionMapper());
+        jersey.register(new ValidationExceptionMapper());
+        jersey.register(new ResourceQuoteReachedExceptionMapper());
+
+        jersey.register(injector.getInstance(InfrastructureTemplateResource.class));
+        jersey.register(injector.getInstance(InfrastructureInfoResource.class));
+
+        jersey.register(injector.getInstance(EnvironmentStatusCallback.class));
+
+        jersey.register(injector.getInstance(ComputationalCallback.class));
+
+        jersey.register(injector.getInstance(UserSettingsResource.class));
+
+        jersey.register(injector.getInstance(ExploratoryResource.class));
+        jersey.register(injector.getInstance(ExploratoryCallback.class));
+
+        jersey.register(injector.getInstance(LibExploratoryResource.class));
+        jersey.register(injector.getInstance(LibraryCallback.class));
+
+        jersey.register(injector.getInstance(GitCredsResource.class));
+        jersey.register(injector.getInstance(GitCredsCallback.class));
+        jersey.register(injector.getInstance(SchedulerJobResource.class));
+        jersey.register(injector.getInstance(ImageExploratoryResource.class));
+        jersey.register(injector.getInstance(ImageCallback.class));
+        jersey.register(injector.getInstance(BackupResource.class));
+        jersey.register(injector.getInstance(BackupCallback.class));
+        jersey.register(injector.getInstance(EnvironmentResource.class));
+        jersey.register(injector.getInstance(ReuploadKeyCallback.class));
+	    jersey.register(injector.getInstance(CheckInactivityCallback.class));
+	    jersey.register(injector.getInstance(SystemInfoResource.class));
+	    jersey.register(injector.getInstance(UserGroupResource.class));
+	    jersey.register(injector.getInstance(UserRoleResource.class));
+	    jersey.register(injector.getInstance(ApplicationSettingResource.class));
+	    jersey.register(injector.getInstance(KeycloakResource.class));
+	    jersey.register(injector.getInstance(EndpointResource.class));
+	    jersey.register(injector.getInstance(ProjectResource.class));
+	    jersey.register(injector.getInstance(AuditResource.class));
+	    jersey.register(injector.getInstance(ProjectCallback.class));
+	    jersey.register(injector.getInstance(OdahuResource.class));
+	    jersey.register(injector.getInstance(OdahuCallback.class));
+	    jersey.register(injector.getInstance(ChangePropertiesResource.class));
+    }
+
+    private void disableGzipHandlerForGuacamoleServlet(Server server) {
+        Handler handler = server.getHandler();
+        while (handler instanceof HandlerWrapper) {
+            handler = ((HandlerWrapper) handler).getHandler();
+            if (handler instanceof BiDiGzipHandler) {
+                log.debug("Disabling Gzip handler for guacamole servlet");
+                ((BiDiGzipHandler) handler).setExcludedPaths(GUACAMOLE_SERVLET_PATH);
+            }
+        }
+    }
+
+    private void applyMongoMigration(SelfServiceApplicationConfiguration configuration) {
+        final MongoServiceFactory mongoFactory = configuration.getMongoFactory();
+
+        new DatalabMongoMigration(mongoFactory.getHost(), mongoFactory.getPort(), mongoFactory.getUsername(),
+                mongoFactory.getPassword(), mongoFactory.getDatabase()).migrate();
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/Audit.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/Audit.java
new file mode 100644
index 0000000..dd1ab26
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/Audit.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.annotation;
+
+import com.epam.datalab.backendapi.domain.AuditActionEnum;
+import com.epam.datalab.backendapi.domain.AuditResourceTypeEnum;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Audit {
+    AuditActionEnum action();
+
+    AuditResourceTypeEnum type();
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/BudgetLimited.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/BudgetLimited.java
new file mode 100644
index 0000000..eca8061
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/BudgetLimited.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation used to disallow execution of method that is annotated by this annotation in case when
+ * budget limit in reached. Budget can be specified in self service configuration
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface BudgetLimited {
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/Info.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/Info.java
new file mode 100644
index 0000000..61c7d93
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/Info.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.PARAMETER)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Info {
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/Project.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/Project.java
new file mode 100644
index 0000000..304da3c
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/Project.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+@Target(ElementType.PARAMETER)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Project {
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/ProjectAdmin.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/ProjectAdmin.java
new file mode 100644
index 0000000..a712d0d
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/ProjectAdmin.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ProjectAdmin {
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/ResourceName.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/ResourceName.java
new file mode 100644
index 0000000..d348bd3
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/ResourceName.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.PARAMETER)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ResourceName {
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/User.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/User.java
new file mode 100644
index 0000000..c052e6d
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/annotation/User.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.PARAMETER)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface User {
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/auth/KeycloakAuthenticator.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/auth/KeycloakAuthenticator.java
new file mode 100644
index 0000000..944d96d
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/auth/KeycloakAuthenticator.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.auth;
+
+import com.epam.datalab.auth.UserInfo;
+import de.ahus1.keycloak.dropwizard.AbstractKeycloakAuthenticator;
+import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
+import org.keycloak.KeycloakSecurityContext;
+import org.keycloak.representations.AccessToken;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+import static java.util.Collections.emptyList;
+
+public class KeycloakAuthenticator extends AbstractKeycloakAuthenticator<UserInfo> {
+
+    private static final String GROUPS_CLAIM = "groups";
+
+    public KeycloakAuthenticator(KeycloakConfiguration keycloakConfiguration) {
+        super(keycloakConfiguration);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    protected UserInfo prepareAuthentication(KeycloakSecurityContext keycloakSecurityContext,
+                                             HttpServletRequest httpServletRequest,
+                                             KeycloakConfiguration keycloakConfiguration) {
+        final AccessToken token = keycloakSecurityContext.getToken();
+        final UserInfo userInfo = new UserInfo(token.getPreferredUsername(),
+                keycloakSecurityContext.getTokenString());
+        userInfo.addRoles((List<String>) token.getOtherClaims().getOrDefault(GROUPS_CLAIM, emptyList()));
+        return userInfo;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/auth/SelfServiceSecurityAuthorizer.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/auth/SelfServiceSecurityAuthorizer.java
new file mode 100644
index 0000000..974b2ab
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/auth/SelfServiceSecurityAuthorizer.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.auth;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.roles.RoleType;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.google.inject.Singleton;
+import io.dropwizard.auth.Authorizer;
+
+@Singleton
+public class SelfServiceSecurityAuthorizer implements Authorizer<UserInfo> {
+    @Override
+    public boolean authorize(UserInfo principal, String role) {
+        return UserRoles.checkAccess(principal, RoleType.PAGE, role, principal.getRoles());
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/auth/filters/DropwizardBearerTokenFilterImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/auth/filters/DropwizardBearerTokenFilterImpl.java
new file mode 100644
index 0000000..e38eabb
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/auth/filters/DropwizardBearerTokenFilterImpl.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.auth.filters;
+
+import org.keycloak.adapters.AdapterDeploymentContext;
+import org.keycloak.adapters.KeycloakDeployment;
+import org.keycloak.adapters.NodesRegistrationManagement;
+import org.keycloak.jaxrs.JaxrsBearerTokenFilterImpl;
+
+import javax.annotation.Priority;
+import javax.ws.rs.Priorities;
+import javax.ws.rs.container.PreMatching;
+
+@PreMatching
+@Priority(Priorities.AUTHENTICATION)
+public class DropwizardBearerTokenFilterImpl extends JaxrsBearerTokenFilterImpl {
+
+    public DropwizardBearerTokenFilterImpl(KeycloakDeployment keycloakDeployment) {
+        deploymentContext = new AdapterDeploymentContext(keycloakDeployment);
+        nodesRegistrationManagement = new NodesRegistrationManagement();
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/conf/CloudConfiguration.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/conf/CloudConfiguration.java
new file mode 100644
index 0000000..e1e1137
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/conf/CloudConfiguration.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.conf;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class CloudConfiguration {
+
+    private final String os;
+    private final String serviceBaseName;
+    private final String edgeInstanceSize;
+    private final String subnetId;
+    private final String region;
+    private final String zone;
+    private final String confTagResourceId;
+    private final String securityGroupIds;
+    private final String ssnInstanceSize;
+    private final String notebookVpcId;
+    private final String notebookSubnetId;
+    private final String confKeyDir;
+    private final String vpcId;
+    private final String azureResourceGroupName;
+    private final String ssnStorageAccountTagName;
+    private final String sharedStorageAccountTagName;
+    private final String datalakeTagName;
+    private final String azureClientId;
+    private final String peeringId;
+    private final String gcpProjectId;
+    @JsonProperty("ldap")
+    private final LdapConfig ldapConfig;
+
+    @Data
+    public static class LdapConfig {
+        private final String host;
+        private final String dn;
+        private final String ou;
+        private final String user;
+        private final String password;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/conf/KeycloakConfiguration.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/conf/KeycloakConfiguration.java
new file mode 100644
index 0000000..a4d79ea
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/conf/KeycloakConfiguration.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.conf;
+
+import lombok.Data;
+
+@Data
+public class KeycloakConfiguration extends de.ahus1.keycloak.dropwizard.KeycloakConfiguration {
+    private String redirectUri;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/conf/SelfServiceApplicationConfiguration.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/conf/SelfServiceApplicationConfiguration.java
new file mode 100644
index 0000000..66ccb72
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/conf/SelfServiceApplicationConfiguration.java
@@ -0,0 +1,278 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.conf;
+
+import com.epam.datalab.ServiceConfiguration;
+import com.epam.datalab.backendapi.domain.SchedulerConfigurationData;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.rest.client.RESTServiceFactory;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.dropwizard.client.JerseyClientConfiguration;
+import io.dropwizard.util.Duration;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.util.Map;
+
+/**
+ * Configuration for Self Service.
+ */
+public class SelfServiceApplicationConfiguration extends ServiceConfiguration {
+
+    @Min(value = 2)
+    @JsonProperty
+    private int minEmrInstanceCount;
+
+    @Max(value = 1000)
+    @JsonProperty
+    private int maxEmrInstanceCount;
+
+    @Min(value = 10)
+    @JsonProperty
+    private int minEmrSpotInstanceBidPct;
+
+    @Max(value = 95)
+    @JsonProperty
+    private int maxEmrSpotInstanceBidPct;
+
+    @Min(value = 2)
+    @JsonProperty
+    private int minSparkInstanceCount;
+
+    @Max(value = 1000)
+    @JsonProperty
+    private int maxSparkInstanceCount;
+
+    @JsonProperty
+    private String ssnInstanceSize;
+
+    @JsonProperty
+    private boolean rolePolicyEnabled = false;
+
+    @JsonProperty
+    private boolean roleDefaultAccess = false;
+
+    @JsonProperty
+    private Duration checkEnvStatusTimeout = Duration.minutes(10);
+
+    @JsonProperty
+    private boolean billingSchedulerEnabled = false;
+
+    @JsonProperty
+    private int billingPort;
+
+    @JsonProperty
+    private boolean auditEnabled = false;
+
+    @NotEmpty
+    @JsonProperty
+    private String billingConfFile;
+    @JsonProperty
+    private int minInstanceCount;
+    @JsonProperty
+    private int maxInstanceCount;
+    @JsonProperty
+    private int minDataprocPreemptibleCount;
+    @JsonProperty
+    private int maxUserNameLength;
+    @JsonProperty
+    private boolean gcpOuauth2AuthenticationEnabled;
+    @JsonProperty
+    private boolean mongoMigrationEnabled;
+    @JsonProperty
+    private int privateKeySize = 2048;
+    @Valid
+    @NotNull
+    private Map<String, SchedulerConfigurationData> schedulers;
+
+
+    @Valid
+    @NotNull
+    @JsonProperty("jerseyClient")
+    private JerseyClientConfiguration jerseyClient = new JerseyClientConfiguration();
+
+    @Valid
+    @NotNull
+    @JsonProperty(ServiceConsts.MAVEN_SEARCH_API)
+    private RESTServiceFactory mavenApiFactory;
+
+    @Valid
+    @NotNull
+    private Map<String, String> guacamole;
+
+    private String serviceBaseName;
+    private String os;
+
+    private KeycloakConfiguration keycloakConfiguration = new KeycloakConfiguration();
+
+    public Map<String, String> getGuacamole() {
+        return guacamole;
+    }
+
+    public String getGuacamoleHost() {
+        return guacamole.get("serverHost");
+    }
+
+    public Integer getGuacamolePort() {
+        return Integer.valueOf(guacamole.get("serverPort"));
+    }
+
+    public JerseyClientConfiguration getJerseyClientConfiguration() {
+        return jerseyClient;
+    }
+
+    public Map<String, SchedulerConfigurationData> getSchedulers() {
+        return schedulers;
+    }
+
+    public boolean isGcpOuauth2AuthenticationEnabled() {
+        return gcpOuauth2AuthenticationEnabled;
+    }
+
+    public String deployed;
+
+    /**
+     * Returns the minimum number of slave EMR instances than could be created.
+     */
+    public int getMinEmrInstanceCount() {
+        return minEmrInstanceCount;
+    }
+
+    /**
+     * Returns the maximum number of slave EMR instances than could be created.
+     */
+    public int getMaxEmrInstanceCount() {
+        return maxEmrInstanceCount;
+    }
+
+    /**
+     * Returns the timeout for check the status of environment via provisioning service.
+     */
+    public Duration getCheckEnvStatusTimeout() {
+        return checkEnvStatusTimeout;
+    }
+
+    public int getMinEmrSpotInstanceBidPct() {
+        return minEmrSpotInstanceBidPct;
+    }
+
+    public int getMaxEmrSpotInstanceBidPct() {
+        return maxEmrSpotInstanceBidPct;
+    }
+
+    public int getMinSparkInstanceCount() {
+        return minSparkInstanceCount;
+    }
+
+    public int getMaxSparkInstanceCount() {
+        return maxSparkInstanceCount;
+    }
+
+    /**
+     * Return the <b>true</b> if using roles policy to DataLab features.
+     */
+    public boolean isRolePolicyEnabled() {
+        return rolePolicyEnabled;
+    }
+
+    /**
+     * Return the default access to DataLab features using roles policy.
+     */
+    public boolean getRoleDefaultAccess() {
+        return roleDefaultAccess;
+    }
+
+
+    /**
+     * Return the <b>true</b> if the billing scheduler is enabled.
+     */
+    public boolean isBillingSchedulerEnabled() {
+        return billingSchedulerEnabled;
+    }
+
+    public int getBillingPort() {
+        return billingPort;
+    }
+
+    public boolean isAuditEnabled() {
+        return auditEnabled;
+    }
+
+    /**
+     * Return the default access to DataLab features using roles policy.
+     */
+    public String getBillingConfFile() {
+        return billingConfFile;
+    }
+
+
+    public int getMinInstanceCount() {
+        return minInstanceCount;
+    }
+
+    public int getMaxInstanceCount() {
+        return maxInstanceCount;
+    }
+
+    public int getMinDataprocPreemptibleCount() {
+        return minDataprocPreemptibleCount;
+    }
+
+    public int getMaxUserNameLength() {
+        return maxUserNameLength;
+    }
+
+    public int getPrivateKeySize() {
+        return privateKeySize;
+    }
+
+    public String getSsnInstanceSize() {
+        return ssnInstanceSize;
+    }
+
+    public boolean isMongoMigrationEnabled() {
+        return mongoMigrationEnabled;
+    }
+
+    @NotNull
+    public RESTServiceFactory getMavenApiFactory() {
+        return mavenApiFactory;
+    }
+
+    public KeycloakConfiguration getKeycloakConfiguration() {
+        return keycloakConfiguration;
+    }
+
+    public String getServiceBaseName() {
+        return serviceBaseName;
+    }
+
+    public String getOs() {
+        return os;
+    }
+
+    public String getDeployed() {
+        return deployed;
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/AuditDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/AuditDAO.java
new file mode 100644
index 0000000..ae840fb
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/AuditDAO.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.domain.AuditDTO;
+import com.epam.datalab.backendapi.domain.AuditPaginationDTO;
+
+import java.util.List;
+
+public interface AuditDAO {
+    void save(AuditDTO audit);
+
+    List<AuditPaginationDTO> getAudit(List<String> users, List<String> projects, List<String> resourceNames, List<String> resourceTypes, String dateStart, String dateEnd, int pageNumber, int pageSize);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/AuditDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/AuditDAOImpl.java
new file mode 100644
index 0000000..34c14a2
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/AuditDAOImpl.java
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.domain.AuditDTO;
+import com.epam.datalab.backendapi.domain.AuditPaginationDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.mongodb.client.model.Facet;
+import com.mongodb.client.model.Filters;
+import com.mongodb.client.model.Sorts;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+import static com.epam.datalab.backendapi.dao.ComputationalDAO.PROJECT;
+import static com.mongodb.client.model.Aggregates.count;
+import static com.mongodb.client.model.Aggregates.facet;
+import static com.mongodb.client.model.Aggregates.group;
+import static com.mongodb.client.model.Aggregates.limit;
+import static com.mongodb.client.model.Aggregates.match;
+import static com.mongodb.client.model.Aggregates.skip;
+import static com.mongodb.client.model.Aggregates.sort;
+import static com.mongodb.client.model.Filters.gte;
+import static com.mongodb.client.model.Filters.in;
+import static com.mongodb.client.model.Filters.lte;
+
+public class AuditDAOImpl extends BaseDAO implements AuditDAO {
+    private static final String AUDIT_COLLECTION = "audit";
+    private static final String RESOURCE_NAME_FIELD = "resourceName";
+    private static final String RESOURCE_TYPE_FIELD = "type";
+    private static final String TIMESTAMP_FIELD = "timestamp";
+    private static final String COUNT_FIELD = "count";
+    private static final String AUDIT_FACET = "auditFacet";
+    private static final String TOTAL_COUNT_FACET = "totalCountFacet";
+    private static final String RESOURCE_NAME_FACET = "resourceNameFacet";
+    private static final String USER_FACET = "userFacet";
+    private static final String PROJECT_FACET = "projectFacet";
+    private static final String RESOURCE_TYPE_FACET = "typeFacet";
+
+    @Override
+    public void save(AuditDTO audit) {
+        insertOne(AUDIT_COLLECTION, audit);
+    }
+
+    @Override
+    public List<AuditPaginationDTO> getAudit(List<String> users, List<String> projects, List<String> resourceNames, List<String> resourceTypes, String dateStart, String dateEnd,
+                                             int pageNumber, int pageSize) {
+        List<Bson> valuesPipeline = new ArrayList<>();
+        List<Bson> countPipeline = new ArrayList<>();
+        List<Bson> matchCriteria = matchCriteria(users, projects, resourceNames, resourceTypes, dateStart, dateEnd);
+        if (!matchCriteria.isEmpty()) {
+            Bson match = match(Filters.and(matchCriteria));
+            valuesPipeline.add(match);
+            countPipeline.add(match);
+        }
+        countPipeline.add(count());
+        valuesPipeline.add(sortCriteria());
+        valuesPipeline.addAll(Arrays.asList(skip(pageSize * (pageNumber - 1)), limit(pageSize)));
+
+        List<Bson> userFilter = Collections.singletonList(group(getGroupingFields(USER)));
+        List<Bson> projectFilter = Collections.singletonList(group(getGroupingFields(PROJECT)));
+        List<Bson> resourceNameFilter = Collections.singletonList(group(getGroupingFields(RESOURCE_NAME_FIELD)));
+        List<Bson> resourceTypeFilter = Collections.singletonList(group(getGroupingFields(RESOURCE_TYPE_FIELD)));
+
+        List<Bson> facets = Collections.singletonList(facet(new Facet(AUDIT_FACET, valuesPipeline), new Facet(TOTAL_COUNT_FACET, countPipeline),
+                new Facet(RESOURCE_NAME_FACET, resourceNameFilter), new Facet(USER_FACET, userFilter), new Facet(PROJECT_FACET, projectFilter),
+                new Facet(RESOURCE_TYPE_FACET, resourceTypeFilter)));
+        return StreamSupport.stream(aggregate(AUDIT_COLLECTION, facets).spliterator(), false)
+                .map(this::toAuditPaginationDTO)
+                .collect(Collectors.toList());
+    }
+
+    private List<Bson> matchCriteria(List<String> users, List<String> projects, List<String> resourceNames, List<String> resourceTypes, String dateStart, String dateEnd) {
+        List<Bson> searchCriteria = new ArrayList<>();
+        inCriteria(searchCriteria, users, USER);
+        inCriteria(searchCriteria, projects, PROJECT);
+        inCriteria(searchCriteria, resourceNames, RESOURCE_NAME_FIELD);
+        inCriteria(searchCriteria, resourceTypes, RESOURCE_TYPE_FIELD);
+        if (StringUtils.isNotEmpty(dateStart)) {
+            Instant from = getInstant(dateStart);
+            Date date = new Date(from.toEpochMilli());
+            searchCriteria.add(gte(TIMESTAMP_FIELD, date));
+        }
+        if (StringUtils.isNotEmpty(dateEnd)) {
+            Instant to = getInstant(dateEnd).plus(1, ChronoUnit.DAYS);
+            Date date = new Date(to.toEpochMilli());
+            searchCriteria.add(lte(TIMESTAMP_FIELD, date));
+        }
+        return searchCriteria;
+    }
+
+    private Bson sortCriteria() {
+        return sort(Sorts.descending(TIMESTAMP_FIELD));
+    }
+
+    private AuditPaginationDTO toAuditPaginationDTO(Document document) {
+        List<Document> countDocuments = (List<Document>) document.get(TOTAL_COUNT_FACET);
+        final int count = countDocuments.isEmpty() ? 0 : countDocuments.get(0).getInteger(COUNT_FIELD);
+        Set<String> userFilter = getFilter(document, USER_FACET, USER);
+        Set<String> projectFilter = getFilter(document, PROJECT_FACET, PROJECT);
+        Set<String> resourceNameFilter = getFilter(document, RESOURCE_NAME_FACET, RESOURCE_NAME_FIELD);
+        Set<String> resourceTypeFilter = getFilter(document, RESOURCE_TYPE_FACET, RESOURCE_TYPE_FIELD);
+        List<AuditDTO> auditDTOs = (List<AuditDTO>) document.get(AUDIT_FACET);
+        return AuditPaginationDTO.builder()
+                .totalPageCount(count)
+                .audit(auditDTOs)
+                .userFilter(userFilter)
+                .resourceNameFilter(resourceNameFilter)
+                .resourceTypeFilter(resourceTypeFilter)
+                .projectFilter(projectFilter)
+                .build();
+    }
+
+    private Set<String> getFilter(Document document, String facet, String field) {
+        return ((List<Document>) document.get(facet))
+                .stream()
+                .map(d -> (Document) d.get(ID))
+                .map(d -> d.getString(field))
+                .collect(Collectors.toSet());
+    }
+
+    private Instant getInstant(String dateStart) {
+        Instant from;
+        try {
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            simpleDateFormat.setTimeZone(TimeZone.getTimeZone(ZoneOffset.UTC));
+            from = simpleDateFormat.parse(dateStart).toInstant();
+        } catch (ParseException e) {
+            throw new DatalabException(String.format("Cannot parse %s", dateStart), e);
+        }
+        return from;
+    }
+
+    private void inCriteria(List<Bson> searchCriteria, List<String> users, String user) {
+        if (CollectionUtils.isNotEmpty(users)) {
+            searchCriteria.add(in(user, users));
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BackupDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BackupDAO.java
new file mode 100644
index 0000000..6aca851
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BackupDAO.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.resources.dto.BackupInfoRecord;
+import com.epam.datalab.dto.backup.EnvBackupDTO;
+import com.epam.datalab.dto.backup.EnvBackupStatus;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface BackupDAO {
+    void createOrUpdate(EnvBackupDTO dto, String user, EnvBackupStatus status);
+
+    List<BackupInfoRecord> getBackups(String userName);
+
+    Optional<BackupInfoRecord> getBackup(String userName, String id);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BackupDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BackupDAOImpl.java
new file mode 100644
index 0000000..3bbfd6e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BackupDAOImpl.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.resources.dto.BackupInfoRecord;
+import com.epam.datalab.dto.backup.EnvBackupDTO;
+import com.epam.datalab.dto.backup.EnvBackupStatus;
+import com.google.inject.Singleton;
+import org.bson.Document;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+import static com.epam.datalab.backendapi.dao.MongoCollections.REQUEST_ID;
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+
+@Singleton
+public class BackupDAOImpl extends BaseDAO implements BackupDAO {
+    @Override
+    public void createOrUpdate(EnvBackupDTO dto, String user, EnvBackupStatus status) {
+        final Document idField = backupId(user, dto.getId());
+        final Document backupDocument = convertToBson(dto)
+                .append(STATUS, status.name())
+                .append(ERROR_MESSAGE, status.message())
+                .append(TIMESTAMP, new Date())
+                .append(ID, idField);
+        updateOne(MongoCollections.BACKUPS,
+                and(eq(ID, idField), eq(REQUEST_ID, dto.getId())),
+                new Document(SET, backupDocument), true);
+    }
+
+    @Override
+    public List<BackupInfoRecord> getBackups(String userName) {
+        return find(MongoCollections.BACKUPS, eq(String.format("%s.%s", ID, USER), userName), BackupInfoRecord.class);
+    }
+
+    @Override
+    public Optional<BackupInfoRecord> getBackup(String userName, String id) {
+        return findOne(MongoCollections.BACKUPS, eq(ID, backupId(userName, id)), BackupInfoRecord.class);
+    }
+
+    private Document backupId(String user, String id) {
+        return new Document(USER, user).append(REQUEST_ID, id);
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BaseBillingDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BaseBillingDAO.java
new file mode 100644
index 0000000..cb40eff
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BaseBillingDAO.java
@@ -0,0 +1,252 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.domain.BillingReportLine;
+import com.epam.datalab.backendapi.resources.dto.BillingFilter;
+import com.epam.datalab.dto.billing.BillingResourceType;
+import com.google.inject.Inject;
+import com.mongodb.client.model.Aggregates;
+import com.mongodb.client.model.Filters;
+import com.mongodb.client.model.Sorts;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+import static com.epam.datalab.backendapi.dao.MongoCollections.BILLING;
+import static com.mongodb.client.model.Accumulators.max;
+import static com.mongodb.client.model.Accumulators.min;
+import static com.mongodb.client.model.Accumulators.sum;
+import static com.mongodb.client.model.Aggregates.group;
+import static com.mongodb.client.model.Aggregates.match;
+import static com.mongodb.client.model.Aggregates.sort;
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.gte;
+import static com.mongodb.client.model.Filters.in;
+import static com.mongodb.client.model.Filters.lte;
+import static com.mongodb.client.model.Filters.regex;
+import static java.time.temporal.TemporalAdjusters.firstDayOfMonth;
+import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
+import static java.util.Collections.singletonList;
+
+@Slf4j
+public class BaseBillingDAO extends BaseDAO implements BillingDAO {
+    private static final int ONE_HUNDRED = 100;
+    private static final String COST_FIELD = "$cost";
+    private static final String TOTAL_FIELD_NAME = "total";
+    private static final String PROJECT = "project";
+    private static final String APPLICATION = "application";
+    private static final String USAGE_DATE = "usageDate";
+    private static final String USER = "user";
+    private static final String RESOURCE_TYPE = "resource_type";
+    private static final String DATALAB_ID = "datalabId";
+    private static final String FROM = "from";
+    private static final String TO = "to";
+    private static final String PRODUCT = "product";
+    private static final String CURRENCY = "currency";
+    private static final String COST = "cost";
+    private static final String RESOURCE_NAME = "resource_name";
+    private static final String ENDPOINT = "endpoint";
+    private static final String SHAPE = "shape";
+    private static final String EXPLORATORY = "exploratoryName";
+
+    @Inject
+    protected SettingsDAO settings;
+    @Inject
+    private UserSettingsDAO userSettingsDAO;
+    @Inject
+    private ProjectDAO projectDAO;
+
+    @Override
+    public Double getTotalCost() {
+        return aggregateBillingData(singletonList(group(null, sum(TOTAL_FIELD_NAME, COST_FIELD))));
+    }
+
+    @Override
+    public Double getUserCost(String user) {
+        final List<Bson> pipeline = Arrays.asList(match(eq(USER, user)),
+                group(null, sum(TOTAL_FIELD_NAME, COST_FIELD)));
+        return aggregateBillingData(pipeline);
+    }
+
+    @Override
+    public Double getOverallProjectCost(String project) {
+        final List<Bson> pipeline = Arrays.asList(match(eq(PROJECT, project)),
+                group(null, sum(TOTAL_FIELD_NAME, COST_FIELD)));
+        return aggregateBillingData(pipeline);
+    }
+
+    @Override
+    public Double getMonthlyProjectCost(String project, LocalDate date) {
+        final List<Bson> pipeline = Arrays.asList(match(
+                and(
+                        eq(PROJECT, project),
+                        gte(USAGE_DATE, date.with(firstDayOfMonth()).toString()),
+                        lte(USAGE_DATE, date.with(lastDayOfMonth()).toString()))
+                ),
+                group(null, sum(TOTAL_FIELD_NAME, COST_FIELD)));
+        return aggregateBillingData(pipeline);
+    }
+
+    @Override
+    public int getBillingQuoteUsed() {
+        return toPercentage(() -> settings.getMaxBudget(), getTotalCost());
+    }
+
+    @Override
+    public int getBillingUserQuoteUsed(String user) {
+        return toPercentage(() -> userSettingsDAO.getAllowedBudget(user), getUserCost(user));
+    }
+
+    @Override
+    public boolean isBillingQuoteReached() {
+        return getBillingQuoteUsed() >= ONE_HUNDRED;
+    }
+
+    @Override
+    public boolean isUserQuoteReached(String user) {
+        final Double userCost = getUserCost(user);
+        return userSettingsDAO.getAllowedBudget(user)
+                .filter(allowedBudget -> userCost.intValue() != 0 && allowedBudget <= userCost)
+                .isPresent();
+    }
+
+    @Override
+    public List<BillingReportLine> findBillingData(String project, String endpoint, List<String> resourceNames) {
+        return find(BILLING, and(eq(PROJECT, project), eq(ENDPOINT, endpoint), in(RESOURCE_NAME, resourceNames)), BillingReportLine.class);
+    }
+
+    public List<BillingReportLine> aggregateBillingData(BillingFilter filter) {
+        List<Bson> pipeline = new ArrayList<>();
+        List<Bson> matchCriteria = matchCriteria(filter);
+        if (!matchCriteria.isEmpty()) {
+            pipeline.add(Aggregates.match(Filters.and(matchCriteria)));
+        }
+        pipeline.add(groupCriteria());
+        pipeline.add(usageDateSort());
+        return StreamSupport.stream(getCollection(BILLING).aggregate(pipeline).spliterator(), false)
+                .map(this::toBillingReport)
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public void deleteByUsageDate(String application, String usageDate) {
+        deleteMany(BILLING, and(eq(APPLICATION, application), eq(USAGE_DATE, usageDate)));
+    }
+
+    @Override
+    public void deleteByUsageDateRegex(String application, String usageDate) {
+        deleteMany(BILLING, and(eq(APPLICATION, application), regex(USAGE_DATE, "^" + usageDate)));
+    }
+
+    @Override
+    public void save(List<BillingReportLine> billingData) {
+        if (CollectionUtils.isNotEmpty(billingData)) {
+            insertMany(BILLING, new ArrayList<>(billingData));
+        }
+    }
+
+    private Integer toPercentage(Supplier<Optional<Integer>> allowedBudget, Double totalCost) {
+        return allowedBudget.get()
+                .map(userBudget -> (totalCost * ONE_HUNDRED) / userBudget)
+                .map(Double::intValue)
+                .orElse(BigDecimal.ZERO.intValue());
+    }
+
+    private Double aggregateBillingData(List<Bson> pipeline) {
+        return Optional.ofNullable(aggregate(BILLING, pipeline).first())
+                .map(d -> d.getDouble(TOTAL_FIELD_NAME))
+                .orElse(BigDecimal.ZERO.doubleValue());
+    }
+
+    private Bson usageDateSort() {
+        return sort(Sorts.descending(USAGE_DATE));
+    }
+
+    private Bson groupCriteria() {
+        return group(getGroupingFields(USER, DATALAB_ID, RESOURCE_TYPE, RESOURCE_NAME, PROJECT, PRODUCT, CURRENCY, SHAPE, EXPLORATORY),
+                sum(COST, "$" + COST),
+                min(FROM, "$" + FROM),
+                max(TO, "$" + TO));
+    }
+
+    private List<Bson> matchCriteria(BillingFilter filter) {
+        List<Bson> searchCriteria = new ArrayList<>();
+
+        if (CollectionUtils.isNotEmpty(filter.getUsers())) {
+            searchCriteria.add(in(USER, filter.getUsers()));
+        }
+        if (CollectionUtils.isNotEmpty(filter.getResourceTypes())) {
+            searchCriteria.add(in(RESOURCE_TYPE, filter.getResourceTypes()));
+        }
+        if (StringUtils.isNotEmpty(filter.getDatalabId())) {
+            searchCriteria.add(regex(DATALAB_ID, filter.getDatalabId(), "i"));
+        }
+        if (StringUtils.isNotEmpty(filter.getDateStart())) {
+            searchCriteria.add(gte(USAGE_DATE, filter.getDateStart()));
+        }
+        if (StringUtils.isNotEmpty(filter.getDateEnd())) {
+            searchCriteria.add(lte(USAGE_DATE, filter.getDateEnd()));
+        }
+        if (CollectionUtils.isNotEmpty(filter.getProjects())) {
+            searchCriteria.add(in(PROJECT, filter.getProjects()));
+        }
+        if (CollectionUtils.isNotEmpty(filter.getProducts())) {
+            searchCriteria.add(in(PRODUCT, filter.getProducts()));
+        }
+        if (CollectionUtils.isNotEmpty(filter.getShapes())) {
+            searchCriteria.add(regex(SHAPE, "(" + String.join("|", filter.getShapes()) + ")"));
+        }
+
+        return searchCriteria;
+    }
+
+    private BillingReportLine toBillingReport(Document d) {
+        Document id = (Document) d.get("_id");
+        return BillingReportLine.builder()
+                .datalabId(id.getString(DATALAB_ID))
+                .project(id.getString(PROJECT))
+                .resourceName(id.getString(RESOURCE_NAME))
+                .exploratoryName(id.getString(EXPLORATORY))
+                .shape(id.getString(SHAPE))
+                .user(id.getString(USER))
+                .product(id.getString(PRODUCT))
+                .resourceType(Optional.ofNullable(id.getString(RESOURCE_TYPE)).map(BillingResourceType::valueOf).orElse(null))
+                .usageDateFrom(d.getDate(FROM).toInstant().atZone(ZoneId.systemDefault()).toLocalDate())
+                .usageDateTo(d.getDate(TO).toInstant().atZone(ZoneId.systemDefault()).toLocalDate())
+                .cost(BigDecimal.valueOf(d.getDouble(COST)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())
+                .currency(id.getString(CURRENCY))
+                .build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BaseDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BaseDAO.java
new file mode 100644
index 0000000..4ddc152
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BaseDAO.java
@@ -0,0 +1,526 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.mongo.MongoService;
+import com.epam.datalab.util.mongo.modules.IsoDateModule;
+import com.epam.datalab.util.mongo.modules.JavaPrimitiveModule;
+import com.epam.datalab.util.mongo.modules.MongoModule;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.google.inject.Inject;
+import com.mongodb.BasicDBObject;
+import com.mongodb.MongoException;
+import com.mongodb.client.AggregateIterable;
+import com.mongodb.client.FindIterable;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoCursor;
+import com.mongodb.client.MongoIterable;
+import com.mongodb.client.model.UpdateOptions;
+import com.mongodb.client.result.DeleteResult;
+import com.mongodb.client.result.UpdateResult;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.exists;
+import static com.mongodb.client.model.Filters.ne;
+
+/**
+ * Implements the base API for Mongo database.
+ */
+public class BaseDAO {
+
+    public static final String ID = "_id";
+    public static final String USER = "user";
+    public static final String STATUS = "status";
+    public static final String ERROR_MESSAGE = "error_message";
+    protected static final String INSTANCE_ID = "instance_id";
+    protected static final String EDGE_STATUS = "edge_status";
+    protected static final String ADD_TO_SET = "$addToSet";
+    protected static final String UNSET_OPERATOR = "$unset";
+    static final String FIELD_SET_DELIMETER = ".$.";
+    static final String SET = "$set";
+    static final String TIMESTAMP = "timestamp";
+    static final String REUPLOAD_KEY_REQUIRED = "reupload_key_required";
+    private static final Logger LOGGER = LoggerFactory.getLogger(BaseDAO.class);
+    private static final String INSERT_ERROR_MESSAGE = "Insert to Mongo DB fails: ";
+    private static final ObjectMapper MAPPER = new ObjectMapper()
+            .configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true)
+            .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
+            .registerModule(new IsoDateModule())
+            .registerModule(new JavaPrimitiveModule())
+            .registerModule(new MongoModule());
+    private static final String PULL = "$pull";
+    private static final String PULL_ALL = "$pullAll";
+    private static final String EACH = "$each";
+    private static final String ELEMENT_AT_OPERATOR = "$arrayElemAt";
+
+    @Inject
+    protected MongoService mongoService;
+
+    /**
+     * Return <b>true</b> if collection exists.
+     *
+     * @param name collection name.
+     */
+    boolean collectionExists(String name) {
+        return mongoService.collectionExists(name);
+    }
+
+    /**
+     * Return Mongo collection.
+     *
+     * @param collection collection name.
+     */
+    public MongoCollection<Document> getCollection(String collection) {
+        return mongoService.getCollection(collection);
+    }
+
+    /**
+     * Inserts the document into the collection.
+     *
+     * @param collection collection name.
+     * @param supplier   document.
+     */
+    protected void insertOne(String collection, Supplier<Document> supplier) {
+        insertOne(collection, supplier, generateUUID());
+    }
+
+    /**
+     * Inserts the document into the collection with given the unique id.
+     *
+     * @param collection collection name.
+     * @param document   document.
+     * @param uuid       unique id.
+     */
+    protected void insertOne(String collection, Supplier<Document> document, String uuid) {
+        try {
+            mongoService.getCollection(collection)
+                    .insertOne(document.get()
+                            .append(ID, uuid)
+                            .append(TIMESTAMP, new Date()));
+        } catch (MongoException e) {
+            LOGGER.warn(INSERT_ERROR_MESSAGE + "{}", e.getLocalizedMessage(), e);
+            throw new DatalabException("Insert to Mongo DB failed: " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Serializes the object and inserts into the collection.
+     *
+     * @param collection collection name.
+     * @param object     for inserting to collection.
+     */
+    protected void insertOne(String collection, Object object) {
+        insertOne(collection, object, generateUUID());
+    }
+
+    /**
+     * Serializes the object and inserts into the collection.
+     *
+     * @param collection collection name.
+     * @param object     for inserting to collection.
+     * @param uuid       unique id.
+     */
+    protected void insertOne(String collection, Object object, String uuid) {
+        try {
+            mongoService.getCollection(collection)
+                    .insertOne(convertToBson(object)
+                            .append(ID, uuid)
+                            .append(TIMESTAMP, new Date()));
+        } catch (MongoException e) {
+            LOGGER.warn(INSERT_ERROR_MESSAGE + "{}", e.getLocalizedMessage(), e);
+            throw new DatalabException(INSERT_ERROR_MESSAGE + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Serializes objects and inserts into the collection.
+     *
+     * @param collection collection name.
+     * @param object     for inserting to collection.
+     */
+    protected void insertMany(String collection, List<Object> object) {
+        try {
+            mongoService.getCollection(collection)
+                    .insertMany(convertToBson(object)
+                            .stream()
+                            .peek(o -> {
+                                o.append(ID, generateUUID());
+                                o.append(TIMESTAMP, new Date());
+                            })
+                            .collect(Collectors.toList())
+                    );
+        } catch (MongoException e) {
+            LOGGER.warn(INSERT_ERROR_MESSAGE + "{}", e.getLocalizedMessage(), e);
+            throw new DatalabException(INSERT_ERROR_MESSAGE + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Updates single document in the collection by condition.
+     *
+     * @param collection collection name.
+     * @param condition  condition for search documents in collection.
+     * @param document   document.
+     */
+    protected UpdateResult updateOne(String collection, Bson condition, Bson document) {
+        try {
+            return mongoService.getCollection(collection)
+                    .updateOne(condition, document);
+        } catch (MongoException e) {
+            LOGGER.warn("Update Mongo DB fails: {}", e.getLocalizedMessage(), e);
+            throw new DatalabException("Update to Mongo DB fails: " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Update or insert single document in the collection by condition.
+     *
+     * @param collection collection name.
+     * @param condition  condition for search documents in collection.
+     * @param document   document.
+     * @param isUpsert   if <b>true</b> document will be updated or inserted.
+     */
+    protected void updateOne(String collection, Bson condition, Bson document, boolean isUpsert) {
+        try {
+            if (isUpsert) {
+                mongoService.getCollection(collection).updateOne(condition, document,
+                        new UpdateOptions().upsert(true));
+            } else {
+                mongoService.getCollection(collection).updateOne(condition, document);
+            }
+        } catch (MongoException e) {
+            LOGGER.warn("Upsert Mongo DB fails: {}", e.getLocalizedMessage(), e);
+            throw new DatalabException("Upsert to Mongo DB fails: " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Updates all documents in the collection by condition.
+     *
+     * @param collection collection name.
+     * @param condition  condition for search documents in collection.
+     * @param document   document.
+     */
+    UpdateResult updateMany(String collection, Bson condition, Bson document) {
+        try {
+            return mongoService.getCollection(collection)
+                    .updateMany(condition, document);
+        } catch (MongoException e) {
+            LOGGER.warn("Update Mongo DB fails: {}", e.getLocalizedMessage(), e);
+            throw new DatalabException("Update to Mongo DB fails: " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Removes single document in the collection by condition.
+     *
+     * @param collection collection name.
+     * @param condition  condition for search documents in collection.
+     */
+    protected DeleteResult deleteOne(String collection, Bson condition) {
+        try {
+            return mongoService.getCollection(collection)
+                    .deleteOne(condition);
+        } catch (MongoException e) {
+            LOGGER.warn("Removing document from Mongo DB fails: {}", e.getLocalizedMessage(), e);
+            throw new DatalabException("Removing document from Mongo DB fails: " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Removes many documents in the collection by condition.
+     *
+     * @param collection collection name.
+     * @param condition  condition for search documents in collection.
+     */
+    protected DeleteResult deleteMany(String collection, Bson condition) {
+        try {
+            return mongoService.getCollection(collection)
+                    .deleteMany(condition);
+        } catch (MongoException e) {
+            LOGGER.warn("Removing document from Mongo DB fails: {}", e.getLocalizedMessage(), e);
+            throw new DatalabException("Removing document from Mongo DB fails: " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Finds and returns all documents from the collection.
+     *
+     * @param collection collection name.
+     */
+    protected FindIterable<Document> find(String collection) {
+        return mongoService.getCollection(collection).find();
+    }
+
+    /**
+     * Finds and returns documents from the collection by condition.
+     *
+     * @param collection collection name.
+     * @param condition  condition for search documents in collection.
+     */
+    protected FindIterable<Document> find(String collection, Bson condition) {
+        return mongoService.getCollection(collection)
+                .find(condition);
+    }
+
+    /**
+     * Finds and returns all documents from the collection converted to resulted type.
+     *
+     * @param collection    collection name.
+     * @param resultedClass type of class for deserialization.
+     */
+    protected <T> List<T> find(String collection, Class<T> resultedClass) {
+        return find(collection)
+                .into(new ArrayList<>())
+                .stream()
+                .map(d -> convertFromDocument(d, resultedClass))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * Finds and returns documents from the collection by condition.
+     *
+     * @param collection    collection name.
+     * @param condition     condition for search documents in collection.
+     * @param resultedClass type of class for deserialization.
+     */
+    protected <T> List<T> find(String collection, Bson condition, Class<T> resultedClass) {
+        return mongoService.getCollection(collection)
+                .find(condition)
+                .into(new ArrayList<>())
+                .stream()
+                .map(d -> convertFromDocument(d, resultedClass))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * Finds and returns documents with the specified fields from the collection by condition.
+     *
+     * @param collection collection name.
+     * @param condition  condition for search documents in collection.
+     * @param projection document describing the fields in the collection to return.
+     */
+    protected FindIterable<Document> find(String collection, Bson condition, Bson projection) {
+        return mongoService.getCollection(collection)
+                .find(condition)
+                .projection(projection);
+    }
+
+    /**
+     * Aggregates and returns documents according to the specified aggregation pipeline.
+     *
+     * @param collection collection name.
+     * @param pipeline   the aggregate pipeline.
+     */
+    public AggregateIterable<Document> aggregate(String collection, List<? extends Bson> pipeline) {
+        return mongoService.getCollection(collection)
+                .aggregate(pipeline);
+    }
+
+    /**
+     * Checks that the documents iterator have one document only.
+     *
+     * @param documents documents
+     */
+    private Optional<Document> limitOne(MongoIterable<Document> documents) {
+        Document first = documents.first();
+        try (MongoCursor<Document> iterator = documents.iterator()) {
+            if (iterator.hasNext()) {
+                iterator.next();
+                if (iterator.hasNext()) {
+                    throw new DatalabException("too many items found while one is expected");
+                }
+            }
+        }
+        return Optional.ofNullable(first);
+    }
+
+    /**
+     * Finds and returns one document from the collection by condition.
+     *
+     * @param collection collection name.
+     * @param condition  condition for search documents in collection.
+     * @throws DatalabException if documents iterator have more than one document.
+     */
+    protected Optional<Document> findOne(String collection, Bson condition) {
+        FindIterable<Document> found = find(collection, condition);
+        return limitOne(found);
+    }
+
+    /**
+     * Finds and returns one document with the specified fields from the collection by condition.
+     *
+     * @param collection collection name.
+     * @param condition  condition for search documents in collection.
+     * @param projection document describing the fields in the collection to return.
+     * @throws DatalabException if documents iterator have more than one document.
+     */
+    protected Optional<Document> findOne(String collection, Bson condition, Bson projection) {
+        FindIterable<Document> found = find(collection, condition, projection);
+        return limitOne(found);
+    }
+
+    /**
+     * Serializes given object to document and returns it.
+     *
+     * @param object object
+     */
+    Document convertToBson(Object object) {
+        try {
+            return Document.parse(MAPPER.writeValueAsString(object));
+        } catch (IOException e) {
+            throw new DatalabException("error converting to bson", e);
+        }
+    }
+
+    List<Document> convertToBson(List<Object> objects) {
+        return objects
+                .stream()
+                .map(this::convertToBson)
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * Finds and returns one object as given class from the collection by condition.
+     *
+     * @param collection collection name.
+     * @param condition  condition for search documents in collection.
+     * @param clazz      type of class for deserialization.
+     */
+    protected <T> Optional<T> findOne(String collection, Bson condition, Class<T> clazz) {
+        Optional<Document> doc = findOne(collection, condition);
+        return doc.map(document -> convertFromDocument(document, clazz));
+    }
+
+    /**
+     * Finds and returns one object as given class and with the specified fields from the collection by condition.
+     *
+     * @param collection collection name.
+     * @param condition  condition for search documents in collection.
+     * @param projection document describing the fields in the collection to return.
+     * @param clazz      type of class for deserialization.
+     */
+    protected <T> Optional<T> findOne(String collection, Bson condition, Bson projection, Class<T> clazz) {
+        Optional<Document> doc = findOne(collection, condition, projection);
+        return doc.map(document -> convertFromDocument(document, clazz));
+    }
+
+    /**
+     * Deserializes given document to object and returns it.
+     *
+     * @param document element from database
+     */
+    <T> T convertFromDocument(Document document, Class<T> clazz) {
+        try {
+            String json = document.toJson();
+            return MAPPER.readValue(json, clazz);
+        } catch (IOException e) {
+            throw new DatalabException("error converting from document with id " + document.get(ID), e);
+        }
+    }
+
+    <T> T convertFromDocument(List<Document> documents, TypeReference<T> valueTypeRef) {
+        final String jsonArray = documents.stream()
+                .map(Document::toJson)
+                .collect(Collectors.joining(",", "[", "]"));
+        try {
+            return MAPPER.readValue(jsonArray, valueTypeRef);
+        } catch (IOException e) {
+            throw new DatalabException("error converting array " + jsonArray, e);
+        }
+    }
+
+    protected Document getGroupingFields(String... fieldNames) {
+        Document d = new Document();
+        for (String name : fieldNames) {
+            d.put(name, "$" + name);
+        }
+        return d;
+    }
+
+    protected Stream<Document> stream(Iterable<Document> iterable) {
+        return StreamSupport.stream(iterable.spliterator(), false);
+    }
+
+    List<String> statusList(UserInstanceStatus[] statuses) {
+        return Arrays.stream(statuses).map(UserInstanceStatus::toString).collect(Collectors.toList());
+    }
+
+    List<String> statusList(List<UserInstanceStatus> statuses) {
+        return statuses.stream().map(UserInstanceStatus::toString).collect(Collectors.toList());
+    }
+
+    /**
+     * Returns a unique id.
+     */
+    private String generateUUID() {
+        return UUID.randomUUID().toString();
+    }
+
+    protected BasicDBObject addToSet(String columnName, Set<String> values) {
+        return new BasicDBObject(ADD_TO_SET, new BasicDBObject(columnName, new BasicDBObject(EACH, values)));
+    }
+
+    protected Bson unset(String columnName, String value) {
+        return new BasicDBObject(UNSET_OPERATOR, new BasicDBObject(columnName, value));
+    }
+
+    protected BasicDBObject pull(String columnName, String value) {
+        return new BasicDBObject(PULL, new BasicDBObject(columnName, value));
+    }
+
+    protected BasicDBObject pullAll(String columnName, Set<String> values) {
+        return new BasicDBObject(PULL_ALL, new BasicDBObject(columnName, values));
+    }
+
+    protected Document elementAt(String arrayColumnName, int index) {
+        return new Document(ELEMENT_AT_OPERATOR, Arrays.asList("$" + arrayColumnName, index));
+    }
+
+    protected Document elementAt(Bson bson, int index) {
+        return new Document(ELEMENT_AT_OPERATOR, Arrays.asList(bson, index));
+    }
+
+    protected Bson notNull(String fieldName) {
+        return and(exists(fieldName), ne(fieldName, null));
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BillingDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BillingDAO.java
new file mode 100644
index 0000000..169e9e8
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/BillingDAO.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.domain.BillingReportLine;
+import com.epam.datalab.backendapi.resources.dto.BillingFilter;
+
+import java.time.LocalDate;
+import java.util.List;
+
+public interface BillingDAO {
+    Double getTotalCost();
+
+    Double getUserCost(String user);
+
+    Double getOverallProjectCost(String project);
+
+    Double getMonthlyProjectCost(String project, LocalDate date);
+
+    int getBillingQuoteUsed();
+
+    int getBillingUserQuoteUsed(String user);
+
+    boolean isBillingQuoteReached();
+
+    boolean isUserQuoteReached(String user);
+
+    List<BillingReportLine> findBillingData(String project, String endpoint, List<String> resourceNames);
+
+    List<BillingReportLine> aggregateBillingData(BillingFilter filter);
+
+    void deleteByUsageDate(String application, String usageDate);
+
+    void deleteByUsageDateRegex(String application, String usageDate);
+
+    void save(List<BillingReportLine> billingData);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ComputationalDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ComputationalDAO.java
new file mode 100644
index 0000000..95216b6
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ComputationalDAO.java
@@ -0,0 +1,410 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.util.DateRemoverUtil;
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.dto.StatusEnvBaseDTO;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.computational.ComputationalStatusDTO;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.exceptions.DatalabException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.mongodb.client.model.Filters;
+import com.mongodb.client.result.UpdateResult;
+import lombok.extern.slf4j.Slf4j;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.COMPUTATIONAL_RESOURCES;
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.UPTIME;
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.exploratoryCondition;
+import static com.epam.datalab.backendapi.dao.MongoCollections.USER_INSTANCES;
+import static com.epam.datalab.backendapi.dao.SchedulerJobDAO.SCHEDULER_DATA;
+import static com.epam.datalab.dto.UserInstanceStatus.TERMINATED;
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.in;
+import static com.mongodb.client.model.Filters.ne;
+import static com.mongodb.client.model.Filters.not;
+import static com.mongodb.client.model.Projections.elemMatch;
+import static com.mongodb.client.model.Projections.excludeId;
+import static com.mongodb.client.model.Projections.fields;
+import static com.mongodb.client.model.Projections.include;
+import static com.mongodb.client.model.Updates.push;
+import static com.mongodb.client.model.Updates.set;
+import static java.util.stream.Collectors.toList;
+
+/**
+ * DAO for user computational resources.
+ */
+@Slf4j
+public class ComputationalDAO extends BaseDAO {
+    static final String COMPUTATIONAL_NAME = "computational_name";
+    static final String COMPUTATIONAL_ID = "computational_id";
+    static final String PROJECT = "project";
+    static final String ENDPOINT = "endpoint";
+
+    static final String IMAGE = "image";
+    private static final String COMPUTATIONAL_URL = "computational_url";
+    private static final String EXPLORATORY_NAME = "exploratory_name";
+    private static final String COMPUTATIONAL_URL_DESC = "description";
+    private static final String COMPUTATIONAL_URL_URL = "url";
+    private static final String COMPUTATIONAL_LAST_ACTIVITY = "last_activity";
+    private static final String CONFIG = "config";
+
+    private static String computationalFieldFilter(String fieldName) {
+        return COMPUTATIONAL_RESOURCES + FIELD_SET_DELIMETER + fieldName;
+    }
+
+    private static Bson computationalCondition(String user, String project, String exploratoryName, String compName) {
+        return and(eq(USER, user), eq(PROJECT, project), eq(EXPLORATORY_NAME, exploratoryName),
+                eq(COMPUTATIONAL_RESOURCES + "." + COMPUTATIONAL_NAME, compName));
+    }
+
+    /**
+     * Add the user's computational resource for notebook into database.
+     *
+     * @param user             user name.
+     * @param exploratoryName  name of exploratory.
+     * @param project          name of project
+     * @param computationalDTO object of computational resource.
+     * @return <b>true</b> if operation was successful, otherwise <b>false</b>.
+     */
+    public boolean addComputational(String user, String exploratoryName, String project,
+                                    UserComputationalResource computationalDTO) {
+        final UpdateResult updateResult = updateOne(USER_INSTANCES,
+                and(exploratoryCondition(user, exploratoryName, project),
+                        not(elemMatch(COMPUTATIONAL_RESOURCES,
+                                eq(COMPUTATIONAL_NAME, computationalDTO.getComputationalName())))),
+                push(COMPUTATIONAL_RESOURCES, convertToBson(computationalDTO)));
+        return updateResult.getModifiedCount() > 0;
+    }
+
+    /**
+     * Finds and returns the of computational resource.
+     *
+     * @param user              user name.
+     * @param project           project name
+     * @param exploratoryName   the name of exploratory.
+     * @param computationalName name of computational resource.
+     * @throws DatalabException if exception occurs
+     */
+    public UserComputationalResource fetchComputationalFields(String user, String project, String exploratoryName,
+                                                              String computationalName) {
+        Optional<UserInstanceDTO> opt = findOne(USER_INSTANCES,
+                and(exploratoryCondition(user, exploratoryName, project),
+                        Filters.elemMatch(COMPUTATIONAL_RESOURCES, eq(COMPUTATIONAL_NAME, computationalName))),
+                fields(include(COMPUTATIONAL_RESOURCES + ".$"), excludeId()),
+                UserInstanceDTO.class);
+        return opt.map(UserInstanceDTO::getResources)
+                .filter(l -> !l.isEmpty())
+                .map(l -> l.get(0))
+                .orElseThrow(() -> new DatalabException("Computational resource " + computationalName + " for user " + user + " with " +
+                        "exploratory name " + exploratoryName + " not found."));
+    }
+
+    public List<UserComputationalResource> findComputationalResourcesWithStatus(String user, String project, String exploratoryName,
+                                                                                UserInstanceStatus status) {
+        final UserInstanceDTO userInstanceDTO = findOne(USER_INSTANCES,
+                and(exploratoryCondition(user, exploratoryName, project),
+                        elemMatch(COMPUTATIONAL_RESOURCES, eq(STATUS, status.toString()))),
+                fields(include(COMPUTATIONAL_RESOURCES), excludeId()),
+                UserInstanceDTO.class)
+                .orElseThrow(() -> new DatalabException(String.format("Computational resource with status %s for user " +
+                        "%s with exploratory name %s not found.", status, user, exploratoryName)));
+        return userInstanceDTO.getResources()
+                .stream()
+                .filter(computationalResource -> computationalResource.getStatus().equals(status.toString()))
+                .collect(toList());
+    }
+
+    /**
+     * Updates the status of computational resource in Mongo database.
+     *
+     * @param dto object of computational resource status.
+     * @return The result of an update operation.
+     */
+    public UpdateResult updateComputationalStatus(ComputationalStatusDTO dto) {
+        try {
+            Document values = new Document(computationalFieldFilter(STATUS), dto.getStatus());
+            return updateOne(USER_INSTANCES,
+                    and(exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
+                            elemMatch(COMPUTATIONAL_RESOURCES,
+                                    and(eq(COMPUTATIONAL_NAME, dto.getComputationalName()),
+                                            not(eq(STATUS, TERMINATED.toString()))))),
+                    new Document(SET, values));
+        } catch (Exception t) {
+            throw new DatalabException("Could not update computational resource status", t);
+        }
+    }
+
+    /**
+     * Updates the status of exploratory notebooks in Mongo database.
+     *
+     * @param dto object of exploratory status info.
+     * @return The result of an update operation.
+     */
+    public int updateComputationalStatusesForExploratory(StatusEnvBaseDTO<?> dto) {
+        Document values = new Document(computationalFieldFilter(STATUS), dto.getStatus());
+        values.append(computationalFieldFilter(UPTIME), null);
+        int count = 0;
+        UpdateResult result;
+        do {
+            result = updateOne(USER_INSTANCES,
+                    and(exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
+                            elemMatch(COMPUTATIONAL_RESOURCES,
+                                    and(not(eq(STATUS, TERMINATED.toString())),
+                                            not(eq(STATUS, dto.getStatus()))))),
+                    new Document(SET, values));
+            count += result.getModifiedCount();
+        }
+        while (result.getModifiedCount() > 0);
+
+        return count;
+    }
+
+    public void updateComputationalStatusesForExploratory(String user, String project, String exploratoryName,
+                                                          UserInstanceStatus dataengineStatus,
+                                                          UserInstanceStatus dataengineServiceStatus,
+                                                          UserInstanceStatus... excludedStatuses) {
+        updateComputationalResource(user, project, exploratoryName, dataengineStatus,
+                DataEngineType.SPARK_STANDALONE, excludedStatuses);
+        updateComputationalResource(user, project, exploratoryName, dataengineServiceStatus,
+                DataEngineType.CLOUD_SERVICE, excludedStatuses);
+    }
+
+    /**
+     * Updates the status for single computational resource in Mongo database.
+     *
+     * @param user              user name.
+     * @param project           project name
+     * @param exploratoryName   exploratory's name.
+     * @param computationalName name of computational resource.
+     * @param newStatus         new status of computational resource.
+     */
+
+    public void updateStatusForComputationalResource(String user, String project, String exploratoryName,
+                                                     String computationalName, UserInstanceStatus newStatus) {
+        updateComputationalField(user, project, exploratoryName, computationalName, STATUS, newStatus.toString());
+    }
+
+
+    private void updateComputationalResource(String user, String project, String exploratoryName,
+                                             UserInstanceStatus dataengineServiceStatus, DataEngineType cloudService,
+                                             UserInstanceStatus... excludedStatuses) {
+        UpdateResult result;
+        do {
+            result = updateMany(USER_INSTANCES,
+                    computationalFilter(user, project, exploratoryName,
+                            dataengineServiceStatus.toString(), DataEngineType.getDockerImageName(cloudService), excludedStatuses),
+                    new Document(SET,
+                            new Document(computationalFieldFilter(STATUS), dataengineServiceStatus.toString())));
+        } while (result.getModifiedCount() > 0);
+    }
+
+    private Bson computationalFilter(String user, String project, String exploratoryName, String computationalStatus,
+                                     String computationalImage, UserInstanceStatus[] excludedStatuses) {
+        final String[] statuses = Arrays.stream(excludedStatuses)
+                .map(UserInstanceStatus::toString)
+                .toArray(String[]::new);
+        return and(exploratoryCondition(user, exploratoryName, project),
+                elemMatch(COMPUTATIONAL_RESOURCES, and(eq(IMAGE, computationalImage),
+                        not(in(STATUS, statuses)),
+                        not(eq(STATUS, computationalStatus)))));
+    }
+
+    /**
+     * Updates the info of computational resource in Mongo database.
+     *
+     * @param dto object of computational resource status.
+     * @return The result of an update operation.
+     * @throws DatalabException if exception occurs
+     */
+    public UpdateResult updateComputationalFields(ComputationalStatusDTO dto) {
+        try {
+            Document values = new Document(computationalFieldFilter(STATUS), dto.getStatus());
+            if (dto.getUptime() != null) {
+                values.append(computationalFieldFilter(UPTIME), dto.getUptime());
+            }
+            if (dto.getInstanceId() != null) {
+                values.append(computationalFieldFilter(INSTANCE_ID), dto.getInstanceId());
+            }
+            if (null != dto.getErrorMessage()) {
+                values.append(computationalFieldFilter(ERROR_MESSAGE),
+                        DateRemoverUtil.removeDateFormErrorMessage(dto.getErrorMessage()));
+            }
+            if (dto.getComputationalId() != null) {
+                values.append(computationalFieldFilter(COMPUTATIONAL_ID), dto.getComputationalId());
+            }
+            if (dto.getResourceUrl() != null && !dto.getResourceUrl().isEmpty()) {
+                values.append(computationalFieldFilter(COMPUTATIONAL_URL), getResourceUrlData(dto));
+            }
+            if (dto.getLastActivity() != null) {
+                values.append(computationalFieldFilter(COMPUTATIONAL_LAST_ACTIVITY), dto.getLastActivity());
+            }
+            if (dto.getConfig() != null) {
+                values.append(computationalFieldFilter(CONFIG),
+                        dto.getConfig().stream().map(this::convertToBson).collect(toList()));
+            }
+            return updateOne(USER_INSTANCES, and(exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
+                    elemMatch(COMPUTATIONAL_RESOURCES,
+                            and(eq(COMPUTATIONAL_NAME, dto.getComputationalName()),
+                                    not(eq(STATUS, TERMINATED.toString()))))),
+                    new Document(SET, values));
+        } catch (Exception t) {
+            throw new DatalabException("Could not update computational resource status", t);
+        }
+    }
+
+    private List<Map<String, String>> getResourceUrlData(ComputationalStatusDTO dto) {
+        return dto.getResourceUrl().stream()
+                .map(this::toUrlDocument)
+                .collect(toList());
+    }
+
+    private LinkedHashMap<String, String> toUrlDocument(ResourceURL url) {
+        LinkedHashMap<String, String> map = new LinkedHashMap<>();
+        map.put(COMPUTATIONAL_URL_DESC, url.getDescription());
+        map.put(COMPUTATIONAL_URL_URL, url.getUrl());
+        return map;
+    }
+
+    /**
+     * Updates the requirement for reuploading key for single computational resource in Mongo database.
+     *
+     * @param user                user name.
+     * @param project             project name
+     * @param exploratoryName     exploratory's name.
+     * @param computationalName   name of computational resource.
+     * @param reuploadKeyRequired true/false.
+     */
+
+    public void updateReuploadKeyFlagForComputationalResource(String user, String project, String exploratoryName,
+                                                              String computationalName, boolean reuploadKeyRequired) {
+        updateComputationalField(user, project, exploratoryName, computationalName, REUPLOAD_KEY_REQUIRED, reuploadKeyRequired);
+    }
+
+    /**
+     * Returns names of computational resources which status is among existing ones. Also these resources will
+     * have predefined type.
+     *
+     * @param user                  user name.
+     * @param project               project name
+     * @param computationalTypes    type list of computational resource which may contain 'dataengine' and/or
+     *                              'dataengine-service'.
+     * @param exploratoryName       name of exploratory.
+     * @param computationalStatuses statuses of computational resource.
+     * @return list of computational resources' names
+     */
+
+    @SuppressWarnings("unchecked")
+    public List<String> getComputationalResourcesWhereStatusIn(String user, String project,
+                                                               List<DataEngineType> computationalTypes,
+                                                               String exploratoryName,
+                                                               UserInstanceStatus... computationalStatuses) {
+        return stream((List<Document>) find(USER_INSTANCES, exploratoryCondition(user, exploratoryName, project),
+                fields(include(COMPUTATIONAL_RESOURCES))).first().get(COMPUTATIONAL_RESOURCES))
+                .filter(doc ->
+                        statusList(computationalStatuses).contains(doc.getString(STATUS)) &&
+                                computationalTypes.contains(DataEngineType.fromDockerImageName(doc.getString(IMAGE))))
+                .map(doc -> doc.getString(COMPUTATIONAL_NAME)).collect(toList());
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<ClusterConfig> getClusterConfig(String user, String project, String exploratoryName, String computationalName) {
+        return findOne(USER_INSTANCES,
+                and(exploratoryCondition(user, exploratoryName, project),
+                        Filters.elemMatch(COMPUTATIONAL_RESOURCES, and(eq(COMPUTATIONAL_NAME, computationalName),
+                                notNull(CONFIG)))),
+                fields(include(COMPUTATIONAL_RESOURCES + ".$"), excludeId())
+        ).map(d -> ((List<Document>) d.get(COMPUTATIONAL_RESOURCES)).get(0))
+                .map(d -> convertFromDocument((List<Document>) d.get(CONFIG),
+                        new TypeReference<List<ClusterConfig>>() {
+                        }))
+                .orElse(Collections.emptyList());
+    }
+
+    /**
+     * Updates computational resource's field.
+     *
+     * @param user              user name.
+     * @param project           project name
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @param fieldName         computational field's name for updating.
+     * @param fieldValue        computational field's value for updating.
+     */
+
+    private <T> UpdateResult updateComputationalField(String user, String project, String exploratoryName, String computationalName,
+                                                      String fieldName, T fieldValue) {
+        return updateOne(USER_INSTANCES,
+                computationalCondition(user, project, exploratoryName, computationalName),
+                set(computationalFieldFilter(fieldName), fieldValue));
+    }
+
+    public void updateSchedulerSyncFlag(String user, String project, String exploratoryName, boolean syncFlag) {
+        final String syncStartField = SCHEDULER_DATA + ".sync_start_required";
+        UpdateResult result;
+        do {
+
+            result = updateOne(USER_INSTANCES, and(exploratoryCondition(user, exploratoryName, project),
+                    elemMatch(COMPUTATIONAL_RESOURCES, and(ne(SCHEDULER_DATA, null), ne(syncStartField, syncFlag)))),
+                    set(computationalFieldFilter(syncStartField), syncFlag));
+
+        } while (result.getModifiedCount() != 0);
+    }
+
+    public UpdateResult updateSchedulerDataForComputationalResource(String user, String project, String exploratoryName,
+                                                                    String computationalName, SchedulerJobDTO dto) {
+        return updateComputationalField(user, project, exploratoryName, computationalName,
+                SCHEDULER_DATA, Objects.isNull(dto) ? null : convertToBson(dto));
+    }
+
+    public void updateLastActivity(String user, String project, String exploratoryName,
+                                   String computationalName, LocalDateTime lastActivity) {
+        updateOne(USER_INSTANCES,
+                computationalCondition(user, project, exploratoryName, computationalName),
+                set(computationalFieldFilter(COMPUTATIONAL_LAST_ACTIVITY),
+                        Date.from(lastActivity.atZone(ZoneId.systemDefault()).toInstant())));
+    }
+
+    public void updateComputeStatus(String project, String endpoint, String computeName, String instanceId, UserInstanceStatus status) {
+        updateOne(USER_INSTANCES,
+                and(eq(PROJECT, project), eq(ENDPOINT, endpoint), eq(COMPUTATIONAL_RESOURCES + "." + INSTANCE_ID, instanceId),
+                        eq(COMPUTATIONAL_RESOURCES + "." + COMPUTATIONAL_NAME, computeName)),
+                set(computationalFieldFilter(STATUS), status.toString()));
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/DockerDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/DockerDAO.java
new file mode 100644
index 0000000..1573684
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/DockerDAO.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.exceptions.DatalabException;
+import org.bson.Document;
+
+import static com.epam.datalab.backendapi.dao.MongoCollections.DOCKER_ATTEMPTS;
+
+/**
+ * DAO write attempt of Docker
+ */
+public class DockerDAO extends BaseDAO {
+    public static final String RUN = "run";
+
+    /**
+     * Write the attempt of docker action.
+     *
+     * @param user   user name.
+     * @param action action of docker.
+     * @throws DatalabException may be thrown
+     */
+    public void writeDockerAttempt(String user, String action) {
+        insertOne(DOCKER_ATTEMPTS, () -> new Document(USER, user).append("action", action));
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EndpointDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EndpointDAO.java
new file mode 100644
index 0000000..3343d9c
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EndpointDAO.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * The interface specifies behaviour for objects, which retrieve, update, remove
+ * the endpoints entities from the DataBase, according passed fields, i.e name, url, status.
+ */
+public interface EndpointDAO {
+    List<EndpointDTO> getEndpoints();
+
+    List<EndpointDTO> getEndpointsWithStatus(String status);
+
+    /*** Retrieve the Endpoint entity according required name
+     * @param name - the Endpoint regular title
+     * @return the Optional object
+     */
+    Optional<EndpointDTO> get(String name);
+
+    /*** Retrieve the Endpoint entity according required Endpoint URL
+     * @param url - the Endpoint web address
+     * @return the Optional object
+     */
+    Optional<EndpointDTO> getEndpointWithUrl(String url);
+
+    void create(EndpointDTO endpointDTO);
+
+    void updateEndpointStatus(String name, String status);
+
+    void remove(String name);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EndpointDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EndpointDAOImpl.java
new file mode 100644
index 0000000..6aea428
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EndpointDAOImpl.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.regex.Pattern;
+
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.regex;
+
+public class EndpointDAOImpl extends BaseDAO implements EndpointDAO {
+
+    private static final String ENDPOINTS_COLLECTION = "endpoints";
+    private static final String ENDPOINT_NAME_FIELD = "name";
+    private static final String ENDPOINT_STATUS_FIELD = "status";
+    private static final String ENDPOINT_URL_FIELD = "url";
+
+    @Override
+    public List<EndpointDTO> getEndpoints() {
+        return find(ENDPOINTS_COLLECTION, EndpointDTO.class);
+    }
+
+    @Override
+    public List<EndpointDTO> getEndpointsWithStatus(String status) {
+        return find(ENDPOINTS_COLLECTION, endpointStatusCondition(status), EndpointDTO.class);
+    }
+
+    @Override
+    public Optional<EndpointDTO> getEndpointWithUrl(String url) {
+        return findOne(ENDPOINTS_COLLECTION, endpointUrlCondition(url), EndpointDTO.class);
+    }
+
+    @Override
+    public Optional<EndpointDTO> get(String name) {
+        return findOne(ENDPOINTS_COLLECTION, endpointCondition(name), EndpointDTO.class);
+    }
+
+    @Override
+    public void create(EndpointDTO endpointDTO) {
+        insertOne(ENDPOINTS_COLLECTION, endpointDTO);
+    }
+
+    @Override
+    public void updateEndpointStatus(String name, String status) {
+        final Document updatedFiled = new Document(ENDPOINT_STATUS_FIELD, status);
+        updateOne(ENDPOINTS_COLLECTION, endpointCondition(name), new Document(SET, updatedFiled));
+    }
+
+    @Override
+    public void remove(String name) {
+        deleteOne(ENDPOINTS_COLLECTION, endpointCondition(name));
+    }
+
+    private Bson endpointCondition(String name) {
+        Pattern endPointName = Pattern.compile("^" + name + "$", Pattern.CASE_INSENSITIVE);
+        return regex(ENDPOINT_NAME_FIELD, endPointName);
+    }
+
+    private Bson endpointUrlCondition(String url) {
+        Pattern endPointUrl = Pattern.compile("^" + url + "$", Pattern.CASE_INSENSITIVE);
+        return regex(ENDPOINT_URL_FIELD, endPointUrl);
+    }
+
+    private Bson endpointStatusCondition(String status) {
+        return eq(ENDPOINT_STATUS_FIELD, status);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EnvDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EnvDAO.java
new file mode 100644
index 0000000..1e03de1
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/EnvDAO.java
@@ -0,0 +1,513 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.SelfServiceApplication;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.resources.aws.ComputationalResourceAws;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.status.EnvResource;
+import com.epam.datalab.dto.status.EnvResourceList;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.model.ResourceType;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.mongodb.client.model.Updates;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.COMPUTATIONAL_RESOURCES;
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.EXPLORATORY_NAME;
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.exploratoryCondition;
+import static com.epam.datalab.backendapi.dao.MongoCollections.USER_EDGE;
+import static com.epam.datalab.backendapi.dao.MongoCollections.USER_INSTANCES;
+import static com.epam.datalab.dto.UserInstanceStatus.CONFIGURING;
+import static com.epam.datalab.dto.UserInstanceStatus.CREATING;
+import static com.epam.datalab.dto.UserInstanceStatus.FAILED;
+import static com.epam.datalab.dto.UserInstanceStatus.RUNNING;
+import static com.epam.datalab.dto.UserInstanceStatus.STARTING;
+import static com.epam.datalab.dto.UserInstanceStatus.STOPPED;
+import static com.epam.datalab.dto.UserInstanceStatus.STOPPING;
+import static com.epam.datalab.dto.UserInstanceStatus.TERMINATED;
+import static com.epam.datalab.dto.UserInstanceStatus.TERMINATING;
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.in;
+import static com.mongodb.client.model.Filters.not;
+import static com.mongodb.client.model.Filters.or;
+import static com.mongodb.client.model.Projections.elemMatch;
+import static com.mongodb.client.model.Projections.excludeId;
+import static com.mongodb.client.model.Projections.fields;
+import static com.mongodb.client.model.Projections.include;
+import static java.util.Objects.nonNull;
+
+/**
+ * DAO for updates of the status of environment resources.
+ */
+@Singleton
+public class EnvDAO extends BaseDAO {
+    private static final Logger LOGGER = LoggerFactory.getLogger(EnvDAO.class);
+
+    private static final String EDGE_PUBLIC_IP = "public_ip";
+    private static final String COMPUTATIONAL_STATUS = COMPUTATIONAL_RESOURCES + "." + STATUS;
+    private static final String COMPUTATIONAL_STATUS_FILTER = COMPUTATIONAL_RESOURCES + FIELD_SET_DELIMETER + STATUS;
+    private static final String COMPUTATIONAL_SPOT = "slave_node_spot";
+    private static final String IMAGE = "image";
+    private static final String PROJECT = "project";
+    private static final String ENDPOINT = "endpoint";
+
+    private static final Bson INCLUDE_EDGE_FIELDS = include(INSTANCE_ID, EDGE_STATUS, EDGE_PUBLIC_IP);
+    private static final Bson INCLUDE_EXP_FIELDS = include(INSTANCE_ID, STATUS, PROJECT, ENDPOINT,
+            COMPUTATIONAL_RESOURCES + "." + INSTANCE_ID, COMPUTATIONAL_RESOURCES + "." + IMAGE, COMPUTATIONAL_STATUS,
+            EXPLORATORY_NAME, COMPUTATIONAL_RESOURCES + "." + ComputationalDAO.COMPUTATIONAL_NAME);
+    private static final Bson INCLUDE_EXP_UPDATE_FIELDS = include(EXPLORATORY_NAME, INSTANCE_ID, STATUS,
+            COMPUTATIONAL_RESOURCES + "." + ComputationalDAO.COMPUTATIONAL_NAME, COMPUTATIONAL_RESOURCES + "." +
+                    INSTANCE_ID,
+            COMPUTATIONAL_STATUS, COMPUTATIONAL_RESOURCES + "." + IMAGE);
+    private static final String COMPUTATIONAL_NAME = "computational_name";
+
+    @Inject
+    private SelfServiceApplicationConfiguration configuration;
+
+    /**
+     * Finds and returns the list of user resources.
+     *
+     * @param user name.
+     */
+    public Map<String, EnvResourceList> findEnvResources(String user) {
+        List<EnvResource> hostList = new ArrayList<>();
+        List<EnvResource> clusterList = new ArrayList<>();
+
+        stream(find(USER_INSTANCES, eq(USER, user), fields(INCLUDE_EXP_FIELDS, excludeId())))
+                .forEach(exp -> {
+                    final String exploratoryName = exp.getString(EXPLORATORY_NAME);
+                    final String project = exp.getString(PROJECT);
+                    final String endpoint = exp.getString(ENDPOINT);
+                    addResource(hostList, exp, STATUS, ResourceType.EXPLORATORY, exploratoryName, project, endpoint);
+                    addComputationalResources(hostList, clusterList, exp, exploratoryName);
+                });
+        final Map<String, List<EnvResource>> clustersByEndpoint = clusterList.stream()
+                .collect(Collectors.groupingBy(EnvResource::getEndpoint));
+        return hostList.stream()
+                .collect(Collectors.groupingBy(EnvResource::getEndpoint)).entrySet()
+                .stream()
+                .collect(Collectors.toMap(Map.Entry::getKey, e -> EnvResourceList.builder()
+                        .hostList(!e.getValue().isEmpty() ? e.getValue() : Collections.emptyList())
+                        .clusterList(clustersByEndpoint.getOrDefault(e.getKey(), clusterList))
+                        .build()));
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<UserInstanceDTO> findRunningResourcesForCheckInactivity() {
+        return stream(find(USER_INSTANCES, or(eq(STATUS, RUNNING.toString()),
+                elemMatch(COMPUTATIONAL_RESOURCES, eq(STATUS, RUNNING.toString())))))
+                .map(d -> convertFromDocument(d, UserInstanceDTO.class))
+                .collect(Collectors.toList());
+    }
+
+    private EnvResource toEnvResource(String name, String instanceId, ResourceType resType, String project,
+                                      String endpoint) {
+        return new EnvResource(instanceId, name, resType, project, endpoint);
+    }
+
+    @SuppressWarnings("unchecked")
+    private void addComputationalResources(List<EnvResource> hostList, List<EnvResource> clusterList, Document exp,
+                                           String exploratoryName) {
+        final String project = exp.getString(PROJECT);
+        getComputationalResources(exp)
+                .forEach(comp -> addComputational(hostList, clusterList, exploratoryName, comp, project,
+                        exp.getString(ENDPOINT)));
+    }
+
+    private List<Document> getComputationalResources(Document userInstanceDocument) {
+        return (List<Document>) userInstanceDocument.getOrDefault(COMPUTATIONAL_RESOURCES, Collections.emptyList());
+    }
+
+    private void addComputational(List<EnvResource> hostList, List<EnvResource> clusterList, String exploratoryName,
+                                  Document computational, String project, String endpoint) {
+        final List<EnvResource> resourceList = DataEngineType.CLOUD_SERVICE ==
+                DataEngineType.fromDockerImageName(computational.getString(IMAGE)) ? clusterList :
+                hostList;
+        addResource(resourceList, computational, STATUS, ResourceType.COMPUTATIONAL,
+                String.join("_", exploratoryName, computational.getString(COMPUTATIONAL_NAME)), project, endpoint);
+    }
+
+    /**
+     * Updates the status of exploratory and computational for user.
+     *
+     * @param user    the name of user.
+     * @param project name of project
+     * @param list    the status of node.
+     */
+    public void updateEnvStatus(String user, String project, EnvResourceList list) {
+        if (list != null && notEmpty(list.getHostList())) {
+            updateEdgeStatus(user, list.getHostList());
+            if (!list.getHostList().isEmpty()) {
+                stream(find(USER_INSTANCES, eq(USER, user),
+                        fields(INCLUDE_EXP_UPDATE_FIELDS, excludeId())))
+                        .filter(this::instanceIdPresent)
+                        .forEach(exp -> updateUserResourceStatuses(user, project, list, exp));
+            }
+        }
+    }
+
+    public Set<String> fetchActiveEnvUsers() {
+        return Stream.concat(
+                stream(find(USER_INSTANCES, eq(STATUS, UserInstanceStatus.RUNNING.toString()),
+                        fields(include(USER), excludeId()))).map(d -> d.getString(USER)),
+                stream(find(USER_EDGE, eq(EDGE_STATUS, UserInstanceStatus.RUNNING.toString()),
+                        fields(include(ID)))).map(d -> d.getString(ID))
+        ).collect(Collectors.toSet());
+    }
+
+    public Set<String> fetchUsersNotIn(Set<String> users) {
+        return stream(find(USER_EDGE, not(in(ID, users)),
+                fields(include(ID)))).map(d -> d.getString(ID))
+                .collect(Collectors.toSet());
+    }
+
+    @SuppressWarnings("unchecked")
+    private void updateUserResourceStatuses(String user, String project, EnvResourceList list, Document exp) {
+        final String exploratoryName = exp.getString(EXPLORATORY_NAME);
+        getEnvResourceAndRemove(list.getHostList(), exp.getString(INSTANCE_ID))
+                .ifPresent(resource -> updateExploratoryStatus(user, project, exploratoryName,
+                        exp.getString(STATUS), resource.getStatus()));
+
+        (getComputationalResources(exp))
+                .stream()
+                .filter(this::instanceIdPresent)
+                .forEach(comp -> updateComputational(user, project, list, exploratoryName, comp));
+    }
+
+    private void updateComputational(String user, String project, EnvResourceList list, String exploratoryName, Document comp) {
+        final List<EnvResource> listToCheck = DataEngineType.CLOUD_SERVICE ==
+                DataEngineType.fromDockerImageName(comp.getString(IMAGE)) ?
+                list.getClusterList() : list.getHostList();
+        getEnvResourceAndRemove(listToCheck, comp.getString(INSTANCE_ID))
+                .ifPresent(resource -> updateComputationalStatus(user, project, exploratoryName,
+                        comp.getString(ComputationalDAO.COMPUTATIONAL_NAME), comp.getString(STATUS), resource.getStatus()));
+    }
+
+    private boolean instanceIdPresent(Document d) {
+        return nonNull(d.getString(INSTANCE_ID));
+    }
+
+    private Optional<String> getInstanceId(Document document) {
+        return Optional.ofNullable(document.getString(INSTANCE_ID));
+    }
+
+
+    /**
+     * Find and return the id of instance for EDGE node.
+     *
+     * @param user the name of user.
+     */
+    private Optional<Document> getEdgeNode(String user) {
+        return findOne(USER_EDGE,
+                eq(ID, user),
+                fields(INCLUDE_EDGE_FIELDS, excludeId()));
+    }
+
+    /**
+     * Find and return the resource item for given id (of instance or cluster) or <b>null<b> otherwise.
+     *
+     * @param list the list of resources.
+     * @param id   the id of instance or cluster.
+     */
+    private Optional<EnvResource> getEnvResourceAndRemove(List<EnvResource> list, String id) {
+        if (list != null) {
+            return IntStream.range(0, list.size())
+                    .filter(i -> list.get(i).getId().equals(id))
+                    .mapToObj(i -> getAndRemove(list, i)).findAny();
+        }
+        return Optional.empty();
+    }
+
+    private EnvResource getAndRemove(List<EnvResource> list, int i) {
+        final EnvResource envResource = list.get(i);
+        list.remove(i);
+        return envResource;
+    }
+
+    /**
+     * Translate the status of instance in Amazon into exploratory's status.
+     *
+     * @param oldStatus the current status of exploratory.
+     * @param newStatus the current status of instance in Amazon.
+     */
+    private UserInstanceStatus getInstanceNewStatus(UserInstanceStatus oldStatus, String newStatus) {
+        /* AWS statuses: pending, running, shutting-down, terminated, stopping, stopped */
+        UserInstanceStatus status;
+        if ("pending".equalsIgnoreCase(newStatus) || "stopping".equalsIgnoreCase(newStatus)) {
+            return oldStatus;
+        } else if ("shutting-down".equalsIgnoreCase(newStatus)) {
+            status = TERMINATING;
+        } else {
+            status = UserInstanceStatus.of(newStatus);
+        }
+
+        switch (oldStatus) {
+            case CREATING_IMAGE:
+                return !status.in(UserInstanceStatus.TERMINATED, TERMINATING,
+                        UserInstanceStatus.RUNNING) ? status : oldStatus;
+            case CREATING:
+                return (status.in(UserInstanceStatus.TERMINATED, UserInstanceStatus.STOPPED) ? status : oldStatus);
+            case RUNNING:
+            case STOPPING:
+                return (status.in(TERMINATING, UserInstanceStatus.TERMINATED,
+                        UserInstanceStatus.STOPPING, UserInstanceStatus.STOPPED) ? status : oldStatus);
+            case STARTING:
+                return (status.in(TERMINATING, UserInstanceStatus.TERMINATED,
+                        UserInstanceStatus.STOPPING) ? status : oldStatus);
+            case STOPPED:
+                return (status.in(TERMINATING, UserInstanceStatus.TERMINATED,
+                        UserInstanceStatus.RUNNING) ? status : oldStatus);
+            case TERMINATING:
+                return (status.in(UserInstanceStatus.TERMINATED) ? status : oldStatus);
+            case FAILED:
+            case TERMINATED:
+            default:
+                return oldStatus;
+        }
+    }
+
+    /**
+     * Updates the status of EDGE node for user.
+     *
+     * @param user     the name of user.
+     * @param hostList list with instance ids for edge resources
+     * @throws DatalabException in case of exception
+     */
+    private void updateEdgeStatus(String user, List<EnvResource> hostList) {
+        LOGGER.trace("Update EDGE status for user {}", user);
+        getEdgeNode(user)
+                .ifPresent(edge -> getInstanceId(edge)
+                        .ifPresent(instanceId -> getEnvResourceAndRemove(hostList, instanceId)
+                                .ifPresent(r -> updateEdgeStatus(user, edge, instanceId, r))));
+
+    }
+
+    private void updateEdgeStatus(String user, Document edge, String instanceId, EnvResource r) {
+        final String oldStatus = edge.getString(EDGE_STATUS);
+        LOGGER.trace("Update EDGE status for user {} with instance_id {} from {} to {}",
+                user, instanceId, oldStatus, r.getStatus());
+        UserInstanceStatus oStatus =
+                (oldStatus == null ? UserInstanceStatus.CREATING : UserInstanceStatus.of(oldStatus));
+        UserInstanceStatus status = oStatus != FAILED ? getInstanceNewStatus(oStatus, r.getStatus()) :
+                UserInstanceStatus.of(r.getStatus());
+        LOGGER.trace("EDGE status translated for user {} with instanceId {} from {} to {}",
+                user, instanceId, r.getStatus(), status);
+        Optional.ofNullable(status)
+                .filter(s -> s != oStatus)
+                .ifPresent(s -> {
+                    LOGGER.debug("EDGE status will be updated from {} to {}", oldStatus, status);
+                    updateOne(USER_EDGE, eq(ID, user),
+                            Updates.set(EDGE_STATUS, status.toString()));
+                });
+    }
+
+    /**
+     * Update the status of exploratory if it needed.
+     *
+     * @param user            the user name
+     * @param project         project name
+     * @param exploratoryName the name of exploratory
+     * @param oldStatus       old status
+     * @param newStatus       new status
+     */
+    private void updateExploratoryStatus(String user, String project, String exploratoryName,
+                                         String oldStatus, String newStatus) {
+        LOGGER.trace("Update exploratory status for user {} with exploratory {} from {} to {}", user, exploratoryName,
+                oldStatus, newStatus);
+        UserInstanceStatus oStatus = UserInstanceStatus.of(oldStatus);
+        UserInstanceStatus status = getInstanceNewStatus(oStatus, newStatus);
+        LOGGER.trace("Exploratory status translated for user {} with exploratory {} from {} to {}", user,
+                exploratoryName, newStatus, status);
+
+        if (oStatus != status) {
+            LOGGER.debug("Exploratory status for user {} with exploratory {} will be updated from {} to {}", user,
+                    exploratoryName, oldStatus, status);
+            updateOne(USER_INSTANCES,
+                    exploratoryCondition(user, exploratoryName, project),
+                    Updates.set(STATUS, status.toString()));
+        }
+    }
+
+    /**
+     * Translate the status of cluster in Amazon into computational's status.
+     *
+     * @param oldStatus the current status of computational.
+     * @param newStatus the current status of cluster in Amazon.
+     */
+    private UserInstanceStatus getComputationalNewStatus(UserInstanceStatus oldStatus, String newStatus) {
+        /* AWS statuses: bootstrapping, running, starting, terminated, terminated_with_errors, terminating, waiting */
+        UserInstanceStatus status;
+        if ("terminated".equalsIgnoreCase(newStatus) || "terminated_with_errors".equalsIgnoreCase(newStatus)) {
+            status = UserInstanceStatus.TERMINATED;
+        } else {
+            status = Optional.ofNullable(UserInstanceStatus.of(newStatus)).orElse(oldStatus);
+        }
+
+        switch (oldStatus) {
+            case CREATING:
+            case CONFIGURING:
+            case RUNNING:
+                return (status.in(UserInstanceStatus.TERMINATED, TERMINATING,
+                        UserInstanceStatus.STOPPING, UserInstanceStatus.STOPPED) ? status : oldStatus);
+            case TERMINATING:
+                return (status.in(UserInstanceStatus.TERMINATED) ? status : oldStatus);
+            case STARTING:
+            case STOPPED:
+            case STOPPING:
+                return status;
+            case FAILED:
+            case TERMINATED:
+            default:
+                return oldStatus;
+        }
+    }
+
+    /**
+     * Update the status of exploratory if it needed.
+     *
+     * @param user              the user name.
+     * @param project           project name
+     * @param exploratoryName   the name of exploratory.
+     * @param computationalName the name of computational.
+     * @param oldStatus         old status.
+     * @param newStatus         new status.
+     */
+    private void updateComputationalStatus(String user, String project, String exploratoryName, String computationalName,
+                                           String oldStatus, String newStatus) {
+        LOGGER.trace("Update computational status for user {} with exploratory {} and computational {} from {} to {}",
+                user, exploratoryName, computationalName, oldStatus, newStatus);
+        UserInstanceStatus oStatus = UserInstanceStatus.of(oldStatus);
+        UserInstanceStatus status = getComputationalNewStatus(oStatus, newStatus);
+        LOGGER.trace("Translate computational status for user {} with exploratory {} and computational {} from {} to" +
+                        " " +
+                        "{}",
+                user, exploratoryName, computationalName, newStatus, status);
+
+        if (oStatus != status) {
+            LOGGER.debug("Computational status for user {} with exploratory {} and computational {} will be updated " +
+                            "from {} to {}",
+                    user, exploratoryName, computationalName, oldStatus, status);
+            if (status == UserInstanceStatus.TERMINATED &&
+                    terminateComputationalSpot(user, project, exploratoryName, computationalName)) {
+                return;
+            }
+            Document values = new Document(COMPUTATIONAL_STATUS_FILTER, status.toString());
+            updateOne(USER_INSTANCES,
+                    and(exploratoryCondition(user, exploratoryName, project),
+                            elemMatch(COMPUTATIONAL_RESOURCES,
+                                    and(eq(ComputationalDAO.COMPUTATIONAL_NAME, computationalName))
+                            )
+                    ),
+                    new Document(SET, values));
+        }
+    }
+
+    /**
+     * Terminate EMR if it is spot.
+     *
+     * @param user              the user name.
+     * @param project           name of project
+     * @param exploratoryName   the name of exploratory.
+     * @param computationalName the name of computational.
+     * @return <b>true</b> if computational is spot and should be terminated by docker, otherwise <b>false</b>.
+     */
+    private boolean terminateComputationalSpot(String user, String project, String exploratoryName, String computationalName) {
+        LOGGER.trace("Check computatation is spot for user {} with exploratory {} and computational {}", user,
+                exploratoryName, computationalName);
+        Document doc = findOne(USER_INSTANCES,
+                exploratoryCondition(user, exploratoryName, project),
+                and(elemMatch(COMPUTATIONAL_RESOURCES,
+                        and(eq(ComputationalDAO.COMPUTATIONAL_NAME, computationalName),
+                                eq(COMPUTATIONAL_SPOT, true),
+                                not(eq(STATUS, TERMINATED.toString())))),
+                        include(COMPUTATIONAL_RESOURCES + "." + COMPUTATIONAL_SPOT))
+        ).orElse(null);
+        if (doc == null || doc.get(COMPUTATIONAL_RESOURCES) == null) {
+            return false;
+        }
+
+        UserInfo userInfo = null;
+        if (userInfo == null) {
+            // User logged off. Computational will be terminated when user logged in.
+            return true;
+        }
+
+        String accessToken = userInfo.getAccessToken();
+        LOGGER.debug("Computational will be terminated for user {} with exploratory {} and computational {}",
+                user, exploratoryName, computationalName);
+        try {
+            // Send post request to provisioning service to terminate spot EMR.
+            ComputationalResourceAws computational = new ComputationalResourceAws();
+            SelfServiceApplication.getInjector().injectMembers(computational);
+            UserInfo ui = new UserInfo(user, accessToken);
+            computational.terminate(ui, project, exploratoryName, computationalName);
+        } catch (Exception e) {
+            // Cannot terminate EMR, just update status to terminated
+            LOGGER.warn("Can't terminate computational for user {} with exploratory {} and computational {}. {}",
+                    user, exploratoryName, computationalName, e.getLocalizedMessage(), e);
+            return false;
+        }
+
+        return true;
+    }
+
+
+    /**
+     * Add the resource to list if it have instance_id.
+     *
+     * @param list            the list to add.
+     * @param document        document with resource.
+     * @param statusFieldName name of field that contains status information
+     * @param resourceType    type if resource EDGE/NOTEBOOK
+     */
+    private void addResource(List<EnvResource> list, Document document, String statusFieldName,
+                             ResourceType resourceType, String name, String project, String endpoint) {
+        LOGGER.trace("Add resource from {}", document);
+        getInstanceId(document).ifPresent(instanceId ->
+                Optional.ofNullable(UserInstanceStatus.of(document.getString(statusFieldName)))
+                        .filter(s -> s.in(CONFIGURING, CREATING, RUNNING, STARTING, STOPPED, STOPPING, TERMINATING) ||
+                                (FAILED == s && ResourceType.EDGE == resourceType))
+                        .ifPresent(s -> list.add(toEnvResource(name, instanceId, resourceType, project, endpoint))));
+    }
+
+    private boolean notEmpty(List<EnvResource> hostList) {
+        return hostList != null && !hostList.isEmpty();
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ExploratoryDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ExploratoryDAO.java
new file mode 100644
index 0000000..03cf390
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ExploratoryDAO.java
@@ -0,0 +1,498 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+
+import com.epam.datalab.backendapi.util.DateRemoverUtil;
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.dto.StatusEnvBaseDTO;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.exploratory.ExploratoryStatusDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.google.inject.Singleton;
+import com.mongodb.client.result.UpdateResult;
+import lombok.extern.slf4j.Slf4j;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.backendapi.dao.MongoCollections.USER_INSTANCES;
+import static com.epam.datalab.backendapi.dao.SchedulerJobDAO.SCHEDULER_DATA;
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.in;
+import static com.mongodb.client.model.Filters.not;
+import static com.mongodb.client.model.Filters.or;
+import static com.mongodb.client.model.Projections.exclude;
+import static com.mongodb.client.model.Projections.excludeId;
+import static com.mongodb.client.model.Projections.fields;
+import static com.mongodb.client.model.Projections.include;
+import static com.mongodb.client.model.Updates.set;
+import static java.util.stream.Collectors.toList;
+
+/**
+ * DAO for user exploratory.
+ */
+@Slf4j
+@Singleton
+public class ExploratoryDAO extends BaseDAO {
+    public static final String COMPUTATIONAL_RESOURCES = "computational_resources";
+    static final String EXPLORATORY_ID = "exploratory_id";
+    static final String EXPLORATORY_NAME = "exploratory_name";
+    static final String UPTIME = "up_time";
+
+    private static final String COMPUTATIONAL_NAME = "computational_name";
+    private static final String EXPLORATORY_URL = "exploratory_url";
+    private static final String EXPLORATORY_URL_DESC = "description";
+    private static final String EXPLORATORY_URL_URL = "url";
+    private static final String EXPLORATORY_USER = "exploratory_user";
+    private static final String EXPLORATORY_PASS = "exploratory_pass";
+    private static final String CLUSTER_CONFIG = "cluster_config";
+    private static final String EXPLORATORY_PRIVATE_IP = "private_ip";
+    public static final String EXPLORATORY_NOT_FOUND_MSG = "Exploratory for user %s with name %s not found";
+    private static final String EXPLORATORY_LAST_ACTIVITY = "last_activity";
+    private static final String PROJECT = "project";
+    private static final String ENDPOINT = "endpoint";
+
+    public ExploratoryDAO() {
+        log.info("{} is initialized", getClass().getSimpleName());
+    }
+
+    static Bson exploratoryCondition(String user, String exploratoryName, String project) {
+        return and(eq(USER, user), eq(EXPLORATORY_NAME, exploratoryName), eq(PROJECT, project));
+    }
+
+    private static Bson runningExploratoryCondition(String user, String exploratoryName, String project) {
+        return and(eq(USER, user), eq(PROJECT, project),
+                and(eq(EXPLORATORY_NAME, exploratoryName), eq(STATUS, UserInstanceStatus.RUNNING.toString())));
+    }
+
+    static Bson runningExploratoryAndComputationalCondition(String user, String project, String exploratoryName,
+                                                            String computationalName) {
+        return and(eq(USER, user), eq(PROJECT, project),
+                and(eq(EXPLORATORY_NAME, exploratoryName), eq(STATUS, UserInstanceStatus.RUNNING.toString()),
+                        eq(COMPUTATIONAL_RESOURCES + "." + COMPUTATIONAL_NAME, computationalName),
+                        eq(COMPUTATIONAL_RESOURCES + "." + STATUS, UserInstanceStatus.RUNNING.toString())));
+    }
+
+    public List<UserInstanceDTO> findExploratories(String user, String project) {
+        return getUserInstances(and(eq(USER, user), eq(PROJECT, project)), true);
+    }
+
+    /**
+     * Finds and returns the info of all user's running notebooks.
+     *
+     * @param user user name.
+     */
+    public List<UserInstanceDTO> fetchRunningExploratoryFields(String user) {
+        return getUserInstances(and(eq(USER, user), eq(STATUS, UserInstanceStatus.RUNNING.toString())), false);
+    }
+
+    public List<UserInstanceDTO> fetchRunningExploratoryFieldsForProject(String project) {
+        return getUserInstances(and(eq(PROJECT, project), eq(STATUS, UserInstanceStatus.RUNNING.toString())), false);
+    }
+
+    public List<UserInstanceDTO> fetchRunningExploratoryFieldsForProject(String project, List<String> endpoints) {
+        return getUserInstances(and(eq(PROJECT, project), eq(STATUS, UserInstanceStatus.RUNNING.toString()), in(ENDPOINT, endpoints)), false);
+    }
+
+    public List<UserInstanceDTO> fetchExploratoryFieldsForProject(String project) {
+        return getUserInstances(and(eq(PROJECT, project)), false);
+    }
+
+    public List<UserInstanceDTO> fetchExploratoryFieldsForProjectWithComp(String project) {
+        return getUserInstances(and(eq(PROJECT, project)), true);
+    }
+
+    public List<UserInstanceDTO> fetchExploratoryFieldsForProjectWithComp(List<String> projects) {
+        return getUserInstances(and(in(PROJECT, projects)), true);
+    }
+
+    public List<UserInstanceDTO> findExploratories(String project, String endpoint, String user) {
+        return getUserInstances(and(eq(PROJECT, project), eq(ENDPOINT, endpoint), eq(USER, user)), true);
+    }
+
+    public List<UserInstanceDTO> fetchUserExploratoriesWhereStatusIn(String user, boolean computationalFieldsRequired,
+                                                                     UserInstanceStatus... statuses) {
+        final List<String> statusList = statusList(statuses);
+        return getUserInstances(
+                and(
+                        eq(USER, user),
+                        in(STATUS, statusList)
+                ),
+                computationalFieldsRequired);
+    }
+
+    /**
+     * Finds and returns the info of all user's notebooks whose status or status of affiliated computational resource
+     * is present among predefined ones.
+     *
+     * @param user                  user name.
+     * @param exploratoryStatuses   array of exploratory statuses.
+     * @param computationalStatuses array of computational statuses.
+     */
+    public List<UserInstanceDTO> fetchUserExploratoriesWhereStatusIn(String user,
+                                                                     List<UserInstanceStatus> exploratoryStatuses,
+                                                                     UserInstanceStatus... computationalStatuses) {
+        final List<String> exploratoryStatusList = statusList(exploratoryStatuses);
+        final List<String> computationalStatusList = statusList(computationalStatuses);
+        return getUserInstances(
+                and(
+                        eq(USER, user),
+                        or(in(STATUS, exploratoryStatusList),
+                                in(COMPUTATIONAL_RESOURCES + "." + STATUS, computationalStatusList))
+                ),
+                false);
+    }
+
+    public List<UserInstanceDTO> fetchProjectExploratoriesWhereStatusIn(String project,
+                                                                        List<UserInstanceStatus> exploratoryStatuses,
+                                                                        UserInstanceStatus... computationalStatuses) {
+        final List<String> exploratoryStatusList = statusList(exploratoryStatuses);
+        final List<String> computationalStatusList = statusList(computationalStatuses);
+        return getUserInstances(
+                and(
+                        eq(PROJECT, project),
+                        or(in(STATUS, exploratoryStatusList),
+                                in(COMPUTATIONAL_RESOURCES + "." + STATUS, computationalStatusList))
+                ),
+                false);
+    }
+
+    public List<UserInstanceDTO> fetchProjectEndpointExploratoriesWhereStatusIn(String project, List<String> endpoints,
+                                                                                List<UserInstanceStatus> exploratoryStatuses,
+                                                                                UserInstanceStatus... computationalStatuses) {
+        final List<String> exploratoryStatusList = statusList(exploratoryStatuses);
+        final List<String> computationalStatusList = statusList(computationalStatuses);
+        return getUserInstances(
+                and(
+                        eq(PROJECT, project),
+                        in(ENDPOINT, endpoints),
+                        or(in(STATUS, exploratoryStatusList),
+                                in(COMPUTATIONAL_RESOURCES + "." + STATUS, computationalStatusList))
+                ),
+                false);
+    }
+
+    public List<UserInstanceDTO> fetchProjectExploratoriesWhereStatusNotIn(String project, String endpoint,
+                                                                           UserInstanceStatus... statuses) {
+        final List<String> statusList = statusList(statuses);
+        return getUserInstances(
+                and(
+                        eq(PROJECT, project),
+                        eq(ENDPOINT, endpoint),
+                        not(in(STATUS, statusList))
+                ),
+                false);
+    }
+
+    public List<UserInstanceDTO> fetchExploratoriesByEndpointWhereStatusIn(List<String> endpoints,
+                                                                           List<UserInstanceStatus> statuses,
+                                                                           boolean computationalFieldsRequired) {
+        final List<String> exploratoryStatusList = statusList(statuses);
+
+        return getUserInstances(
+                and(
+                        in(ENDPOINT, endpoints),
+                        in(STATUS, exploratoryStatusList)
+                ),
+                computationalFieldsRequired);
+    }
+
+	public List<UserInstanceDTO> fetchExploratoriesByEndpointWhereStatusNotIn(String endpoint, List<UserInstanceStatus> statuses,
+	                                                                          boolean computationalFieldsRequired) {
+		final List<String> exploratoryStatusList = statusList(statuses);
+
+		return getUserInstances(
+				and(
+						eq(ENDPOINT, endpoint),
+						not(in(STATUS, exploratoryStatusList))
+				),
+				computationalFieldsRequired);
+	}
+
+    private List<UserInstanceDTO> getUserInstances(Bson condition, boolean computationalFieldsRequired) {
+        return stream(getCollection(USER_INSTANCES)
+                .find(condition)
+                .projection(computationalFieldsRequired ? null : fields(exclude(COMPUTATIONAL_RESOURCES))))
+                .map(d -> convertFromDocument(d, UserInstanceDTO.class))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * Finds and returns the info about all exploratories in database.
+     **/
+    public List<UserInstanceDTO> getInstances() {
+        return stream(getCollection(USER_INSTANCES)
+                .find())
+                .map(d -> convertFromDocument(d, UserInstanceDTO.class))
+                .collect(Collectors.toList());
+    }
+
+    public void updateLastActivity(String user, String exploratoryName, LocalDateTime lastActivity) {
+        updateOne(USER_INSTANCES, and(eq(USER, user), eq(EXPLORATORY_NAME, exploratoryName)),
+                set(EXPLORATORY_LAST_ACTIVITY, toDate(lastActivity)));
+    }
+
+    private Date toDate(LocalDateTime lastActivity) {
+        return Date.from(lastActivity.atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    /**
+     * Finds and returns the info of exploratory (without info about computational resources).
+     *
+     * @param user            user name.
+     * @param project         project name
+     * @param exploratoryName the name of exploratory.
+     */
+    public UserInstanceDTO fetchExploratoryFields(String user, String project, String exploratoryName) {
+        return getExploratory(user, project, exploratoryName, false).orElseThrow(() ->
+                new ResourceNotFoundException(String.format(EXPLORATORY_NOT_FOUND_MSG, user, exploratoryName)));
+
+    }
+
+    public UserInstanceDTO fetchExploratoryFields(String user, String project, String exploratoryName, boolean includeCompResources) {
+        return getExploratory(user, project, exploratoryName, includeCompResources).orElseThrow(() ->
+                new ResourceNotFoundException(String.format(EXPLORATORY_NOT_FOUND_MSG, user, exploratoryName)));
+
+    }
+
+    private Optional<UserInstanceDTO> getExploratory(String user, String project, String exploratoryName,
+                                                     boolean includeCompResources) {
+        return findOne(USER_INSTANCES,
+                exploratoryCondition(user, exploratoryName, project),
+                includeCompResources ? null : fields(exclude(COMPUTATIONAL_RESOURCES)),
+                UserInstanceDTO.class);
+    }
+
+    /**
+     * Finds and returns the info of running exploratory with running cluster.
+     *
+     * @param user              user name.
+     * @param project           name of project
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of cluster
+     */
+    public UserInstanceDTO fetchExploratoryFields(String user, String project, String exploratoryName, String computationalName) {
+        return findOne(USER_INSTANCES,
+                runningExploratoryAndComputationalCondition(user, project, exploratoryName, computationalName),
+                UserInstanceDTO.class)
+                .orElseThrow(() -> new DatalabException(String.format("Running notebook %s with running cluster %s not " +
+                                "found for user %s",
+                        exploratoryName, computationalName, user)));
+    }
+
+    /**
+     * Finds and returns the info of running exploratory.
+     *
+     * @param user            user name.
+     * @param project         project
+     * @param exploratoryName name of exploratory.
+     */
+    public UserInstanceDTO fetchRunningExploratoryFields(String user, String project, String exploratoryName) {
+        return findOne(USER_INSTANCES, runningExploratoryCondition(user, exploratoryName, project),
+                fields(exclude(COMPUTATIONAL_RESOURCES)), UserInstanceDTO.class)
+                .orElseThrow(() -> new DatalabException(
+                        String.format("Running exploratory instance for user %s with name %s not found.",
+                                user, exploratoryName)));
+    }
+
+    /**
+     * Inserts the info about notebook into Mongo database.
+     *
+     * @param dto the info about notebook
+     */
+    public void insertExploratory(UserInstanceDTO dto) {
+        insertOne(USER_INSTANCES, dto);
+    }
+
+    /**
+     * Updates the status of exploratory in Mongo database.
+     *
+     * @param dto object of exploratory status info.
+     * @return The result of an update operation.
+     */
+    public UpdateResult updateExploratoryStatus(StatusEnvBaseDTO<?> dto) {
+        return updateOne(USER_INSTANCES,
+                exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
+                set(STATUS, dto.getStatus()));
+    }
+
+    /**
+     * Updates status for single exploratory in Mongo database.
+     *
+     * @param user            user.
+     * @param project         project name
+     * @param exploratoryName name of exploratory.
+     * @param newStatus       new status of exploratory.
+     * @return The result of an update operation.
+     */
+    public UpdateResult updateStatusForExploratory(String user, String project, String exploratoryName, UserInstanceStatus newStatus) {
+        return updateOne(USER_INSTANCES,
+                exploratoryCondition(user, exploratoryName, project),
+                set(STATUS, newStatus.toString()));
+    }
+
+    public UpdateResult updateExploratoryStatus(String project, String endpoint, String name, String instanceId, UserInstanceStatus status) {
+        return updateOne(USER_INSTANCES,
+                and(eq(ENDPOINT, endpoint), eq(PROJECT, project), eq(EXPLORATORY_NAME, name), eq(INSTANCE_ID, instanceId)),
+                set(STATUS, status.toString()));
+    }
+
+    /**
+     * Updates the scheduler's data for exploratory in Mongo database.
+     *
+     * @param user            user.
+     * @param project         name of project
+     * @param exploratoryName name of exploratory.
+     * @param dto             object of scheduler data.
+     * @return The result of an update operation.
+     */
+    public UpdateResult updateSchedulerDataForUserAndExploratory(String user, String project, String exploratoryName,
+                                                                 SchedulerJobDTO dto) {
+        return updateOne(USER_INSTANCES,
+                exploratoryCondition(user, exploratoryName, project),
+                set(SCHEDULER_DATA, Objects.isNull(dto) ? null : convertToBson(dto)));
+    }
+
+    /**
+     * Updates the requirement for reuploading key for single exploratory in Mongo database.
+     *
+     * @param user                user name.
+     * @param project             project name
+     * @param exploratoryName     exploratory's name
+     * @param reuploadKeyRequired true/false.
+     */
+    public void updateReuploadKeyForExploratory(String user, String project, String exploratoryName, boolean reuploadKeyRequired) {
+        updateOne(USER_INSTANCES,
+                exploratoryCondition(user, exploratoryName, project),
+                set(REUPLOAD_KEY_REQUIRED, reuploadKeyRequired));
+    }
+
+
+    /**
+     * Updates the info of exploratory in Mongo database.
+     *
+     * @param dto object of exploratory status info.
+     * @return The result of an update operation.
+     */
+    @SuppressWarnings("serial")
+    public UpdateResult updateExploratoryFields(ExploratoryStatusDTO dto) {
+        Document values = new Document(STATUS, dto.getStatus()).append(UPTIME, dto.getUptime());
+        if (dto.getInstanceId() != null) {
+            values.append(INSTANCE_ID, dto.getInstanceId());
+        }
+        if (dto.getErrorMessage() != null) {
+            values.append(ERROR_MESSAGE, DateRemoverUtil.removeDateFormErrorMessage(dto.getErrorMessage()));
+        }
+        if (dto.getExploratoryId() != null) {
+            values.append(EXPLORATORY_ID, dto.getExploratoryId());
+        }
+
+        if (dto.getLastActivity() != null) {
+            values.append(EXPLORATORY_LAST_ACTIVITY, dto.getLastActivity());
+        }
+
+        if (dto.getResourceUrl() != null) {
+            values.append(EXPLORATORY_URL, dto.getResourceUrl().stream()
+                    .map(url -> {
+                                LinkedHashMap<String, String> map = new LinkedHashMap<>();
+                                map.put(EXPLORATORY_URL_DESC, url.getDescription());
+                                map.put(EXPLORATORY_URL_URL, url.getUrl());
+                                return map;
+                            }
+                    ).collect(Collectors.toList()));
+        } else if (dto.getPrivateIp() != null) {
+            UserInstanceDTO inst = fetchExploratoryFields(dto.getUser(), dto.getProject(), dto.getExploratoryName());
+            if (!inst.getPrivateIp().equals(dto.getPrivateIp()) && inst.getResourceUrl() != null) {
+                values.append(EXPLORATORY_URL, inst.getResourceUrl().stream()
+                        .map(url -> replaceIp(dto.getPrivateIp(), inst, url))
+                        .collect(Collectors.toList()));
+            }
+        }
+
+        if (dto.getPrivateIp() != null) {
+            values.append(EXPLORATORY_PRIVATE_IP, dto.getPrivateIp());
+        }
+        if (dto.getExploratoryUser() != null) {
+            values.append(EXPLORATORY_USER, dto.getExploratoryUser());
+        }
+        if (dto.getExploratoryPassword() != null) {
+            values.append(EXPLORATORY_PASS, dto.getExploratoryPassword());
+        }
+        if (dto.getConfig() != null) {
+            values.append(CLUSTER_CONFIG, dto.getConfig().stream().map(this::convertToBson).collect(toList()));
+        }
+        return updateOne(USER_INSTANCES,
+                exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
+                new Document(SET, values));
+    }
+
+    public void updateExploratoryIp(String user, String project, String ip, String exploratoryName) {
+
+        UserInstanceDTO inst = fetchExploratoryFields(user, project, exploratoryName);
+        if (!inst.getPrivateIp().equals(ip)) {
+            Document values = new Document();
+            values.append(EXPLORATORY_PRIVATE_IP, ip);
+            if (inst.getResourceUrl() != null) {
+                values.append(EXPLORATORY_URL, inst.getResourceUrl().stream()
+                        .map(url -> replaceIp(ip, inst, url)
+                        ).collect(Collectors.toList()));
+            }
+
+            updateOne(USER_INSTANCES,
+                    exploratoryCondition(user, exploratoryName, project),
+                    new Document(SET, values));
+        }
+
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<ClusterConfig> getClusterConfig(String user, String project, String exploratoryName) {
+        return findOne(USER_INSTANCES, and(exploratoryCondition(user, exploratoryName, project), notNull(CLUSTER_CONFIG)),
+                fields(include(CLUSTER_CONFIG), excludeId()))
+                .map(d -> convertFromDocument((List<Document>) d.get(CLUSTER_CONFIG),
+                        new TypeReference<List<ClusterConfig>>() {
+                        }))
+                .orElse(Collections.emptyList());
+    }
+
+    private Map<String, String> replaceIp(String ip, UserInstanceDTO inst, ResourceURL url) {
+        Map<String, String> map = new LinkedHashMap<>();
+        map.put(EXPLORATORY_URL_DESC, url.getDescription());
+        map.put(EXPLORATORY_URL_URL, url.getUrl().replace(inst.getPrivateIp(), ip));
+        return map;
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ExploratoryLibDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ExploratoryLibDAO.java
new file mode 100644
index 0000000..8550fff
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ExploratoryLibDAO.java
@@ -0,0 +1,402 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.util.DateRemoverUtil;
+import com.epam.datalab.dto.exploratory.LibInstallDTO;
+import com.epam.datalab.dto.exploratory.LibInstallStatusDTO;
+import com.epam.datalab.dto.exploratory.LibStatus;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.model.ResourceType;
+import com.epam.datalab.model.library.Library;
+import com.mongodb.client.model.Projections;
+import org.apache.commons.lang3.StringUtils;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.COMPUTATIONAL_RESOURCES;
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.exploratoryCondition;
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.runningExploratoryAndComputationalCondition;
+import static com.epam.datalab.backendapi.dao.MongoCollections.USER_INSTANCES;
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Projections.elemMatch;
+import static com.mongodb.client.model.Projections.excludeId;
+import static com.mongodb.client.model.Projections.fields;
+import static com.mongodb.client.model.Projections.include;
+import static com.mongodb.client.model.Updates.push;
+
+/**
+ * DAO for user libraries.
+ */
+public class ExploratoryLibDAO extends BaseDAO {
+    public static final String EXPLORATORY_LIBS = "libs";
+    public static final String COMPUTATIONAL_LIBS = "computational_libs";
+    public static final String LIB_GROUP = "group";
+    public static final String LIB_NAME = "name";
+    public static final String LIB_VERSION = "version";
+    public static final String LIB_AVAILABLE_VERSION = "available_versions";
+    public static final String LIB_ADDED_PACKAGES = "add_pkgs";
+    private static final String LIB_INSTALL_DATE = "install_date";
+    private static final String LIB_ERROR_MESSAGE = "error_message";
+    private static final String COMPUTATIONAL_NAME_FIELD = "computational_name";
+
+    /**
+     * Return condition for search library into exploratory data.
+     *
+     * @param libraryGroup the name of group.
+     * @param libraryName  the name of library.
+     */
+    private static Bson libraryConditionExploratory(String libraryGroup, String libraryName) {
+        return elemMatch(EXPLORATORY_LIBS,
+                libCondition(libraryGroup, libraryName));
+    }
+
+
+    /**
+     * Return condition for search library into computational data.
+     *
+     * @param computationalName computational name
+     * @param libraryGroup      the name of group.
+     * @param libraryName       the name of library.
+     */
+    private static Bson libraryConditionComputational(String computationalName, String libraryGroup,
+                                                      String libraryName) {
+        return elemMatch(COMPUTATIONAL_LIBS + "." + computationalName,
+                and(eq(LIB_GROUP, libraryGroup), eq(LIB_NAME, libraryName)));
+    }
+
+    /**
+     * Return field filter for libraries properties in exploratory data.
+     *
+     * @param fieldName
+     * @return
+     */
+    private static String libraryFieldFilter(String fieldName) {
+        return EXPLORATORY_LIBS + FIELD_SET_DELIMETER + fieldName;
+    }
+
+
+    private static String computationalLibraryFieldFilter(String computational, String fieldName) {
+        return COMPUTATIONAL_LIBS + "." + computational + FIELD_SET_DELIMETER + fieldName;
+    }
+
+    private Document findLibraries(String user, String project, String exploratoryName, Bson include) {
+        Optional<Document> opt = findOne(USER_INSTANCES,
+                exploratoryCondition(user, exploratoryName, project),
+                fields(excludeId(), include));
+
+        return opt.orElseGet(Document::new);
+
+    }
+
+    public List<Library> getLibraries(String user, String project, String exploratoryName) {
+        final Document libsDocument = findAllLibraries(user, project, exploratoryName);
+        return Stream
+                .concat(
+                        libraryStream(libsDocument, exploratoryName, EXPLORATORY_LIBS, ResourceType.EXPLORATORY),
+                        computationalLibStream(libsDocument))
+                .collect(Collectors.toList());
+    }
+
+    public Document findAllLibraries(String user, String project, String exploratoryName) {
+        return findLibraries(user, project, exploratoryName, include(EXPLORATORY_LIBS, COMPUTATIONAL_LIBS,
+                COMPUTATIONAL_RESOURCES));
+    }
+
+    public Document findExploratoryLibraries(String user, String project, String exploratoryName) {
+        return findLibraries(user, project, exploratoryName, include(EXPLORATORY_LIBS));
+    }
+
+    public Document findComputationalLibraries(String user, String project, String exploratoryName, String computationalName) {
+        return findLibraries(user, project, exploratoryName, include(COMPUTATIONAL_LIBS + "." + computationalName));
+    }
+
+    @SuppressWarnings("unchecked")
+    public Library getLibrary(String user, String project, String exploratoryName, String libraryGroup, String libraryName) {
+        Optional<Document> userInstance = findOne(USER_INSTANCES,
+                and(exploratoryCondition(user, exploratoryName, project),
+                        elemMatch(EXPLORATORY_LIBS,
+                                and(eq(LIB_GROUP, libraryGroup), eq(LIB_NAME, libraryName))
+                        )),
+                Projections.fields(excludeId(), Projections.include(EXPLORATORY_LIBS)));
+
+        if (userInstance.isPresent()) {
+            final Object exloratoryLibs = userInstance.get().get(EXPLORATORY_LIBS);
+            List<Document> libs = exloratoryLibs != null ? (List<Document>) exloratoryLibs : Collections.emptyList();
+            return libs.stream()
+                    .filter(libraryPredicate(libraryGroup, libraryName))
+                    .map(d -> convertFromDocument(d, Library.class))
+                    .findAny().orElse(null);
+
+        }
+
+        return null;
+    }
+
+    @SuppressWarnings("unchecked")
+    public Library getLibrary(String user, String project, String exploratoryName, String computationalName,
+                              String libraryGroup, String libraryName) {
+        Optional<Document> libraryStatus = findOne(USER_INSTANCES,
+                and(runningExploratoryAndComputationalCondition(user, project, exploratoryName, computationalName),
+                        libraryConditionComputational(computationalName, libraryGroup, libraryName)
+                ),
+
+                Projections.fields(excludeId(),
+                        Projections.include(
+                                COMPUTATIONAL_LIBS + "." + computationalName + "." + STATUS,
+                                COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_GROUP,
+                                COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_NAME)
+                )
+        );
+
+        return libraryStatus.map(document -> ((List<Document>) (((Document) document.get(COMPUTATIONAL_LIBS)).get(computationalName)))
+                .stream()
+                .filter(libraryPredicate(libraryGroup, libraryName))
+                .map(l -> convertFromDocument(l, Library.class))
+                .findAny().orElse(null)).orElse(null);
+    }
+
+    private Predicate<Document> libraryPredicate(String libraryGroup, String libraryName) {
+        return l -> libraryGroup.equals(l.getString(LIB_GROUP))
+                && libraryName.equals(l.getString(LIB_NAME));
+    }
+
+    /**
+     * Add the user's library for exploratory into database.
+     *
+     * @param user            user name.
+     * @param project         project name
+     * @param exploratoryName name of exploratory.
+     * @param library         library.
+     * @return <b>true</b> if operation was successful, otherwise <b>false</b>.
+     */
+    public boolean addLibrary(String user, String project, String exploratoryName, LibInstallDTO library, boolean reinstall) {
+        Optional<Document> opt = findOne(USER_INSTANCES,
+                and(exploratoryCondition(user, exploratoryName, project),
+                        elemMatch(EXPLORATORY_LIBS,
+                                and(eq(LIB_GROUP, library.getGroup()), eq(LIB_NAME, library.getName())))));
+        if (!opt.isPresent()) {
+            updateOne(USER_INSTANCES,
+                    exploratoryCondition(user, exploratoryName, project),
+                    push(EXPLORATORY_LIBS, convertToBson(library)));
+            return true;
+        } else {
+            Document values = addLibraryFields(library);
+            if (reinstall) {
+                values.append(libraryFieldFilter(LIB_INSTALL_DATE), null);
+                values.append(libraryFieldFilter(LIB_ERROR_MESSAGE), null);
+            }
+
+            updateOne(USER_INSTANCES, and(exploratoryCondition(user, exploratoryName, project),
+                    elemMatch(EXPLORATORY_LIBS,
+                            and(eq(LIB_GROUP, library.getGroup()), eq(LIB_NAME, library.getName())))),
+                    new Document(SET, values));
+            return false;
+        }
+    }
+
+    /**
+     * Add the user's library for exploratory into database.
+     *
+     * @param user              user name.
+     * @param project           project name
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational.
+     * @param library           library.
+     * @return <b>true</b> if operation was successful, otherwise <b>false</b>.
+     */
+    public boolean addLibrary(String user, String project, String exploratoryName, String computationalName,
+                              LibInstallDTO library, boolean reinstall) {
+
+        Optional<Document> opt = findOne(USER_INSTANCES,
+                and(runningExploratoryAndComputationalCondition(user, project, exploratoryName, computationalName),
+                        eq(COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_GROUP, library.getGroup()),
+                        eq(COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_NAME, library.getName())));
+
+        if (!opt.isPresent()) {
+            updateOne(USER_INSTANCES,
+                    runningExploratoryAndComputationalCondition(user, project, exploratoryName, computationalName),
+                    push(COMPUTATIONAL_LIBS + "." + computationalName, convertToBson(library)));
+            return true;
+        } else {
+            Document values = addComputationalLibraryFields(computationalName, library);
+            if (reinstall) {
+                values.append(computationalLibraryFieldFilter(computationalName, LIB_INSTALL_DATE), null);
+                values.append(computationalLibraryFieldFilter(computationalName, LIB_ERROR_MESSAGE), null);
+            }
+
+            updateOne(USER_INSTANCES, and(
+                    exploratoryCondition(user, exploratoryName, project),
+                    eq(COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_GROUP, library.getGroup()),
+                    eq(COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_NAME, library.getName())),
+
+                    new Document(SET, values));
+
+            return false;
+        }
+    }
+
+    /**
+     * Updates the info about libraries for exploratory/computational in Mongo database.
+     *
+     * @param dto object of computational resource status.
+     */
+    public void updateLibraryFields(LibInstallStatusDTO dto) {
+        if (dto.getLibs() == null) {
+            return;
+        }
+
+        if (StringUtils.isEmpty(dto.getComputationalName())) {
+            updateExploratoryLibraryFields(dto);
+        } else {
+            updateComputationalLibraryFields(dto);
+        }
+    }
+
+    private void updateExploratoryLibraryFields(LibInstallStatusDTO dto) {
+        for (LibInstallDTO lib : dto.getLibs()) {
+            try {
+                Document values = updateLibraryFields(lib, dto.getUptime());
+
+                updateOne(USER_INSTANCES,
+                        and(exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
+                                libraryConditionExploratory(lib.getGroup(), lib.getName())),
+                        new Document(SET, values));
+            } catch (Exception e) {
+                throw new DatalabException(String.format("Could not update library %s for %s",
+                        lib, dto.getExploratoryName()), e);
+            }
+        }
+    }
+
+    private void updateComputationalLibraryFields(LibInstallStatusDTO dto) {
+        for (LibInstallDTO lib : dto.getLibs()) {
+            try {
+                Document values = updateComputationalLibraryFields(dto.getComputationalName(), lib, dto.getUptime());
+
+                updateOne(USER_INSTANCES,
+                        and(exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
+                                elemMatch(COMPUTATIONAL_LIBS + "." + dto.getComputationalName(),
+                                        libCondition(lib.getGroup(), lib.getName()))),
+                        new Document(SET, values));
+            } catch (Exception e) {
+                throw new DatalabException(String.format("Could not update library %s for %s/%s",
+                        lib, dto.getExploratoryName(), dto.getComputationalName()), e);
+            }
+        }
+    }
+
+    private static Bson libCondition(String group, String name) {
+        return and(eq(LIB_GROUP, group), eq(LIB_NAME, name));
+    }
+
+    private Document addLibraryFields(LibInstallDTO lib) {
+        Document values = new Document(libraryFieldFilter(STATUS), lib.getStatus());
+        if (lib.getVersion() != null) {
+            values.append(libraryFieldFilter(LIB_VERSION), lib.getVersion());
+        }
+
+        return values;
+    }
+
+    private Document updateLibraryFields(LibInstallDTO lib, Date uptime) {
+        Document values = new Document(libraryFieldFilter(STATUS), lib.getStatus());
+        if (lib.getVersion() != null) {
+            values.append(libraryFieldFilter(LIB_VERSION), lib.getVersion());
+        }
+        if (uptime != null) {
+            values.append(libraryFieldFilter(LIB_INSTALL_DATE), uptime);
+        }
+        if (lib.getAvailableVersions() != null) {
+            values.append(libraryFieldFilter(LIB_AVAILABLE_VERSION), lib.getAvailableVersions());
+        }
+        if (lib.getAddedPackages() != null) {
+            values.append(libraryFieldFilter(LIB_ADDED_PACKAGES), lib.getAddedPackages());
+        }
+        if (lib.getErrorMessage() != null) {
+            values.append(libraryFieldFilter(LIB_ERROR_MESSAGE),
+                    DateRemoverUtil.removeDateFormErrorMessage(lib.getErrorMessage()));
+        }
+
+        return values;
+    }
+
+    private Document addComputationalLibraryFields(String computational, LibInstallDTO lib) {
+        Document values = new Document(computationalLibraryFieldFilter(computational, STATUS), lib.getStatus());
+        if (lib.getVersion() != null) {
+            values.append(computationalLibraryFieldFilter(computational, LIB_VERSION), lib.getVersion());
+        }
+
+        return values;
+    }
+
+    private Document updateComputationalLibraryFields(String computational, LibInstallDTO lib, Date uptime) {
+        Document values = new Document(computationalLibraryFieldFilter(computational, STATUS), lib.getStatus());
+        if (lib.getVersion() != null) {
+            values.append(computationalLibraryFieldFilter(computational, LIB_VERSION), lib.getVersion());
+        }
+        if (uptime != null) {
+            values.append(computationalLibraryFieldFilter(computational, LIB_INSTALL_DATE), uptime);
+        }
+        if (lib.getAvailableVersions() != null) {
+            values.append(computationalLibraryFieldFilter(computational, LIB_AVAILABLE_VERSION), lib.getAvailableVersions());
+        }
+        if (lib.getAddedPackages() != null) {
+            values.append(computationalLibraryFieldFilter(computational, LIB_ADDED_PACKAGES), lib.getAddedPackages());
+        }
+        if (lib.getErrorMessage() != null) {
+            values.append(computationalLibraryFieldFilter(computational, LIB_ERROR_MESSAGE),
+                    DateRemoverUtil.removeDateFormErrorMessage(lib.getErrorMessage()));
+        }
+
+        return values;
+    }
+
+    @SuppressWarnings("unchecked")
+    private Stream<Library> computationalLibStream(Document libsDocument) {
+        return ((List<Document>) libsDocument.getOrDefault(COMPUTATIONAL_RESOURCES, Collections.emptyList()))
+                .stream()
+                .map(d -> d.getString(COMPUTATIONAL_NAME_FIELD))
+                .flatMap(compName -> libraryStream(
+                        (Document) libsDocument.getOrDefault(COMPUTATIONAL_LIBS, new Document()),
+                        compName,
+                        compName, ResourceType.COMPUTATIONAL));
+    }
+
+    @SuppressWarnings("unchecked")
+    private Stream<Library> libraryStream(Document libsDocument, String resourceName, String libFieldName,
+                                          ResourceType libType) {
+        return ((List<Document>) libsDocument.getOrDefault(libFieldName, Collections.emptyList()))
+                .stream()
+                .map(d -> convertFromDocument(d, Library.class))
+                .filter(library -> !Arrays.asList(LibStatus.INVALID_VERSION, LibStatus.INVALID_NAME).contains(library.getStatus()))
+                .peek(l -> l.withType(libType).withResourceName(resourceName));
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GitCredsDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GitCredsDAO.java
new file mode 100644
index 0000000..3b68b14
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GitCredsDAO.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.dto.exploratory.ExploratoryGitCreds;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsDTO;
+import org.bson.Document;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import static com.epam.datalab.backendapi.dao.MongoCollections.GIT_CREDS;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Projections.excludeId;
+import static com.mongodb.client.model.Projections.fields;
+import static com.mongodb.client.model.Projections.include;
+
+/**
+ * DAO for user exploratory.
+ */
+public class GitCredsDAO extends BaseDAO {
+    private static final String FIELD_GIT_CREDS = "git_creds";
+
+    /**
+     * Find and return the list of GIT credentials for user.
+     *
+     * @param user name.
+     * @return GIT credentials DTO
+     */
+    public ExploratoryGitCredsDTO findGitCreds(String user) {
+        return findGitCreds(user, false);
+    }
+
+    /**
+     * Find and return the list of GIT credentials for user.
+     *
+     * @param user          name.
+     * @param clearPassword clear user password if set to <b>true</b>.
+     * @return GIT credentials DTO
+     */
+    public ExploratoryGitCredsDTO findGitCreds(String user, boolean clearPassword) {
+        Optional<ExploratoryGitCredsDTO> opt = findOne(GIT_CREDS,
+                eq(ID, user),
+                fields(include(FIELD_GIT_CREDS), excludeId()),
+                ExploratoryGitCredsDTO.class);
+        ExploratoryGitCredsDTO creds = (opt.orElseGet(ExploratoryGitCredsDTO::new));
+        List<ExploratoryGitCreds> list = creds.getGitCreds();
+        if (clearPassword && list != null) {
+            for (ExploratoryGitCreds cred : list) {
+                cred.setPassword(null);
+            }
+        }
+
+        return creds;
+    }
+
+    /**
+     * Update the GIT credentials for user.
+     *
+     * @param user name.
+     * @param dto  GIT credentials.
+     */
+    public void updateGitCreds(String user, ExploratoryGitCredsDTO dto) {
+        List<ExploratoryGitCreds> list = findGitCreds(user).getGitCreds();
+        if (list != null && dto.getGitCreds() != null) {
+            Collections.sort(dto.getGitCreds());
+            // Restore passwords from Mongo DB.
+            for (ExploratoryGitCreds cred : dto.getGitCreds()) {
+                if (cred.getPassword() == null) {
+                    int index = Collections.binarySearch(list, cred);
+                    if (index >= 0) {
+                        cred.setPassword(list.get(index).getPassword());
+                    }
+                }
+            }
+        }
+
+        Document d = new Document(SET, convertToBson(dto).append(ID, user));
+        updateOne(GIT_CREDS, eq(ID, user), d, true);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAO.java
new file mode 100644
index 0000000..58019b8
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAO.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.dto.imagemetadata.EdgeGPU;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface GpuDAO {
+
+    Optional<EdgeGPU> getGPUByProjectName(String projectName);
+
+    void createAll(List<Object> gpus);
+
+    void create(EdgeGPU gpu);
+
+    void remove(String nodeId);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAOImpl.java
new file mode 100644
index 0000000..ef8f15e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/GpuDAOImpl.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.dto.imagemetadata.EdgeGPU;
+import org.bson.conversions.Bson;
+
+import java.util.List;
+import java.util.Optional;
+
+import static com.mongodb.client.model.Filters.eq;
+
+public class GpuDAOImpl extends BaseDAO implements GpuDAO {
+
+    private static final String GPU_COLLECTION = "gpuTypes";
+    private static final String PROJECT_NAME_FIELD = "projectName";
+
+    @Override
+    public Optional<EdgeGPU> getGPUByProjectName(String edgeId) {
+        return findOne(GPU_COLLECTION, getByIdCondition(edgeId), EdgeGPU.class);
+    }
+
+    @Override
+    public void create(EdgeGPU gpu) {
+        insertOne(GPU_COLLECTION, gpu);
+    }
+
+    @Override
+    public void createAll(List<Object> gpus) {
+        insertMany(GPU_COLLECTION, gpus);
+    }
+
+    @Override
+    public void remove(String edgeId) {
+        deleteOne(GPU_COLLECTION, getByIdCondition(edgeId));
+    }
+
+    private Bson getByIdCondition(String edgeId) {
+        return eq(PROJECT_NAME_FIELD, edgeId);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAO.java
new file mode 100644
index 0000000..d8e8987
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAO.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord;
+import com.epam.datalab.dto.exploratory.ImageStatus;
+import com.epam.datalab.dto.exploratory.LibStatus;
+import com.epam.datalab.model.exploratory.Image;
+import com.epam.datalab.model.library.Library;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface ImageExploratoryDAO {
+
+    boolean exist(String image, String project);
+
+    void save(Image image);
+
+    void updateImageFields(Image image);
+
+    List<ImageInfoRecord> getImages(String user, String dockerImage, String project, String endpoint, ImageStatus... statuses);
+
+    List<ImageInfoRecord> getImagesForProject(String project);
+
+    Optional<ImageInfoRecord> getImage(String user, String name, String project, String endpoint);
+
+    List<Library> getLibraries(String user, String imageFullName, String project, String endpoint, LibStatus status);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAOImpl.java
new file mode 100644
index 0000000..234a15e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ImageExploratoryDAOImpl.java
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord;
+import com.epam.datalab.dto.exploratory.ImageStatus;
+import com.epam.datalab.dto.exploratory.LibStatus;
+import com.epam.datalab.model.exploratory.Image;
+import com.epam.datalab.model.library.Library;
+import com.google.inject.Singleton;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.in;
+import static com.mongodb.client.model.Projections.elemMatch;
+import static com.mongodb.client.model.Projections.excludeId;
+import static com.mongodb.client.model.Projections.fields;
+import static com.mongodb.client.model.Projections.include;
+
+@Singleton
+public class ImageExploratoryDAOImpl extends BaseDAO implements ImageExploratoryDAO {
+
+    private static final String LIBRARIES = "libraries";
+    private static final String IMAGE_NAME = "name";
+    private static final String IMAGE_APPLICATION = "application";
+    private static final String IMAGE_FULL_NAME = "fullName";
+    private static final String EXTERNAL_NAME = "externalName";
+    private static final String DOCKER_IMAGE = "dockerImage";
+    private static final String PROJECT = "project";
+    private static final String ENDPOINT = "endpoint";
+
+    @Override
+    public boolean exist(String image, String project) {
+        return findOne(MongoCollections.IMAGES, imageProjectCondition(image, project)).isPresent();
+    }
+
+    @Override
+    public void save(Image image) {
+        insertOne(MongoCollections.IMAGES, image);
+    }
+
+    @Override
+    public void updateImageFields(Image image) {
+        final Bson condition = userImageCondition(image.getUser(), image.getName(), image.getProject(), image.getEndpoint());
+        final Document updatedFields = getUpdatedFields(image);
+        updateOne(MongoCollections.IMAGES, condition, new Document(SET, updatedFields));
+    }
+
+    @Override
+    public List<ImageInfoRecord> getImages(String user, String dockerImage, String project, String endpoint, ImageStatus... statuses) {
+        return find(MongoCollections.IMAGES,
+                userImagesCondition(user, dockerImage, project, endpoint, statuses),
+                ImageInfoRecord.class);
+    }
+
+    @Override
+    public List<ImageInfoRecord> getImagesForProject(String project) {
+        return find(MongoCollections.IMAGES,
+                eq(PROJECT, project),
+                ImageInfoRecord.class);
+    }
+
+    @Override
+    public Optional<ImageInfoRecord> getImage(String user, String name, String project, String endpoint) {
+        return findOne(MongoCollections.IMAGES, userImageCondition(user, name, project, endpoint), ImageInfoRecord.class);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public List<Library> getLibraries(String user, String imageFullName, String project, String endpoint, LibStatus status) {
+        return ((List<Document>) libDocument(user, imageFullName, project, endpoint, status)
+                .orElse(emptyLibrariesDocument()).get(LIBRARIES))
+                .stream()
+                .map(d -> convertFromDocument(d, Library.class))
+                .collect(Collectors.toList());
+    }
+
+    private Optional<Document> libDocument(String user, String imageFullName, String project, String endpoint,
+                                           LibStatus status) {
+        return findOne(MongoCollections.IMAGES,
+                imageLibraryCondition(user, imageFullName, project, endpoint, status),
+                fields(include(LIBRARIES), excludeId()));
+    }
+
+    private Document emptyLibrariesDocument() {
+        return new Document(LIBRARIES, Collections.emptyList());
+    }
+
+    private Bson imageLibraryCondition(String user, String imageFullName, String project, String endpoint,
+                                       LibStatus status) {
+        return and(eq(USER, user), eq(IMAGE_NAME, imageFullName), eq(PROJECT, project), eq(ENDPOINT, endpoint),
+                elemMatch(LIBRARIES, eq(STATUS, status.name())));
+    }
+
+    private Bson userImagesCondition(String user, String dockerImage, String project, String endpoint, ImageStatus... statuses) {
+        final Bson userImagesCondition = userImagesCondition(user, project, endpoint, statuses);
+        if (Objects.nonNull(dockerImage)) {
+            return and(userImagesCondition, eq(DOCKER_IMAGE, dockerImage));
+        } else {
+            return userImagesCondition;
+        }
+
+    }
+
+    private Bson userImagesCondition(String user, String project, String endpoint, ImageStatus... statuses) {
+
+        final List<String> statusList = Arrays
+                .stream(statuses)
+                .map(ImageStatus::name)
+                .collect(Collectors.toList());
+        return and(eq(USER, user), in(STATUS, statusList), eq(PROJECT, project), eq(ENDPOINT, endpoint));
+    }
+
+
+    private Bson userImageCondition(String user, String imageName, String project, String endpoint) {
+        return and(eq(USER, user), eq(IMAGE_NAME, imageName), eq(PROJECT, project), eq(ENDPOINT, endpoint));
+    }
+
+    private Bson imageProjectCondition(String image, String project) {
+        return and(eq(IMAGE_NAME, image), eq(PROJECT, project));
+    }
+
+    private Document getUpdatedFields(Image image) {
+        return new Document(STATUS, image.getStatus().toString())
+                .append(IMAGE_FULL_NAME, image.getFullName())
+                .append(IMAGE_APPLICATION, image.getApplication())
+                .append(EXTERNAL_NAME, image.getExternalName());
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/IndexCreator.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/IndexCreator.java
new file mode 100644
index 0000000..93cfb80
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/IndexCreator.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.mongodb.client.model.IndexOptions;
+import com.mongodb.client.model.Indexes;
+import io.dropwizard.lifecycle.Managed;
+
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.EXPLORATORY_NAME;
+import static com.epam.datalab.backendapi.dao.MongoCollections.USER_INSTANCES;
+
+/**
+ * Creates the indexes for mongo collections.
+ */
+public class IndexCreator extends BaseDAO implements Managed {
+    private static final String PROJECT_FIELD = "project";
+
+    @Override
+    public void start() {
+        mongoService.getCollection(USER_INSTANCES)
+                .createIndex(Indexes.ascending(USER, EXPLORATORY_NAME, PROJECT_FIELD), new IndexOptions().unique(true));
+    }
+
+    @Override
+    public void stop() {
+        //Add some functionality if necessary
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/MongoCollections.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/MongoCollections.java
new file mode 100644
index 0000000..24909f5
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/MongoCollections.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+/**
+ * Names of Mongo collections.
+ */
+public class MongoCollections {
+    /**
+     * Environment settings.
+     */
+    public static final String SETTINGS = "settings";
+    /**
+     * Attempts of the user login into DataLab.
+     */
+    static final String LOGIN_ATTEMPTS = "loginAttempts";
+    /**
+     * Attempts the actions of docker.
+     */
+    static final String DOCKER_ATTEMPTS = "dockerAttempts";
+    /**
+     * User keys and credentials.
+     */
+    static final String USER_KEYS = "userKeys";
+    /**
+     * User AWS credentials.
+     */
+    public static final String USER_EDGE = "userCloudCredentials";
+    /**
+     * Instances of user.
+     */
+    public static final String USER_INSTANCES = "userInstances";
+    /**
+     * Name of shapes.
+     */
+    public static final String SHAPES = "shapes";
+    static final String USER_SETTINGS = "userSettings";
+    /* Billing data. */
+    public static final String BILLING = "billing";
+    /**
+     * User roles.
+     */
+    static final String ROLES = "roles";
+    /**
+     * GIT credentials of user.
+     */
+    public static final String GIT_CREDS = "gitCreds";
+    /**
+     * RequestId
+     */
+    static final String REQUEST_ID = "requestId";
+    /**
+     * Images
+     */
+    public static final String IMAGES = "images";
+    /**
+     * Backup
+     */
+    public static final String BACKUPS = "backup";
+
+    public static final String USER_GROUPS = "userGroups";
+
+    private MongoCollections() {
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/MongoSetting.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/MongoSetting.java
new file mode 100644
index 0000000..7b8dabd
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/MongoSetting.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+/**
+ * Name of fields in the Mongo collection {@link MongoCollections#SETTINGS}.
+ */
+public enum MongoSetting {
+
+    // General properties
+    /**
+     * Base name of service.
+     */
+    SERIVICE_BASE_NAME("conf_service_base_name"),
+    /**
+     * Name of directory for user key.
+     */
+    CONF_KEY_DIRECTORY("conf_key_dir"),
+    /**
+     * Name of resource id.
+     */
+    CONF_TAG_RESOURCE_ID("conf_tag_resource_id"),
+    /**
+     * Name of OS family.
+     */
+    CONF_OS_FAMILY("conf_os_family"),
+
+    CONF_MAX_BUDGET("conf_max_budget"),
+    SSN_STORAGE_ACCOUNT_TAG_NAME("ssn_storage_account_tag_name"),
+    SHARED_STORAGE_ACCOUNT_TAG_NAME("shared_storage_account_tag_name"),
+
+    LDAP_HOSTNAME("ldap_hostname"),
+    LDAP_DN("ldap_dn"),
+    LDAP_OU("ldap_ou"),
+    LDAP_USER("ldap_service_username"),
+    LDAP_PASSWORD("ldap_service_password"),
+
+    PEERING_ID("peering_id"),
+
+
+    // AWS Related properties
+    /**
+     * Name of AWS region.
+     */
+    AWS_REGION("aws_region"),
+    /**
+     * Id of security group.
+     */
+    AWS_SECURITY_GROUPS("aws_security_groups_ids"),
+    /**
+     * Id of virtual private cloud for AWS account.
+     */
+    AWS_VPC_ID("aws_vpc_id"),
+    /**
+     * Id of virtual private cloud subnet for AWS account.
+     */
+    AWS_SUBNET_ID("aws_subnet_id"),
+    AWS_NOTEBOOK_VPC_ID("aws_notebook_vpc_id"),
+    AWS_NOTEBOOK_SUBNET_ID("aws_notebook_subnet_id"),
+    AWS_ZONE("aws_zone"),
+
+
+    // Azure related properties
+    AZURE_REGION("azure_region"),
+    AZURE_RESOURCE_GROUP_NAME("azure_resource_group_name"),
+    AZURE_SUBNET_NAME("azure_subnet_name"),
+    AZURE_VPC_NAME("azure_vpc_name"),
+    AZURE_SECURITY_GROUP_NAME("azure_security_group_name"),
+    AZURE_EDGE_INSTANCE_SIZE("edge_instance_size"),
+    SSN_INSTANCE_SIZE("ssn_instance_size"),
+    AZURE_DATA_LAKE_NAME_TAG("datalake_tag_name"),
+    AZURE_DATA_LAKE_CLIENT_ID("azure_client_id"),
+
+    // GCP related properties
+    GCP_REGION("gcp_region"),
+    GCP_ZONE("gcp_zone"),
+    GCP_SUBNET_NAME("gcp_subnet_name"),
+    GCP_PROJECT_ID("gcp_project_id"),
+    GCP_VPC_NAME("gcp_vpc_name");
+
+    private String id;
+
+    MongoSetting(String id) {
+        this.id = id;
+    }
+
+    public String getId() {
+        return id;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/OdahuDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/OdahuDAO.java
new file mode 100644
index 0000000..29106ce
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/OdahuDAO.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.domain.OdahuDTO;
+import com.epam.datalab.backendapi.domain.OdahuFieldsDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.odahu.OdahuResult;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface OdahuDAO {
+    Optional<OdahuDTO> getByProjectEndpoint(String project, String endpoint);
+
+    OdahuFieldsDTO getFields(String name, String project, String endpoint);
+
+    List<OdahuDTO> findOdahuClusters();
+
+    List<OdahuDTO> findOdahuClusters(String project, String endpoint);
+
+    boolean create(OdahuDTO odahuDTO);
+
+    void updateStatus(String name, String project, String endpoint, UserInstanceStatus status);
+
+    void updateStatusAndUrls(OdahuResult result, UserInstanceStatus status);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/OdahuDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/OdahuDAOImpl.java
new file mode 100644
index 0000000..9c9e169
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/OdahuDAOImpl.java
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.domain.OdahuDTO;
+import com.epam.datalab.backendapi.domain.OdahuFieldsDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.odahu.OdahuResult;
+import com.epam.datalab.exceptions.DatalabException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.mongodb.BasicDBObject;
+import com.mongodb.client.result.UpdateResult;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Projections.elemMatch;
+import static com.mongodb.client.model.Projections.excludeId;
+import static com.mongodb.client.model.Projections.fields;
+import static com.mongodb.client.model.Projections.include;
+import static com.mongodb.client.model.Updates.push;
+import static java.util.stream.Collectors.toList;
+
+public class OdahuDAOImpl extends BaseDAO implements OdahuDAO {
+
+    private static final String PROJECTS_COLLECTION = "Projects";
+    private static final String ENDPOINTS = "endpoints";
+    private static final String ODAHU_FIELD = "odahu";
+    private static final String NAME_FIELD = "name";
+    private static final String ENDPOINT_FIELD = "endpoint";
+    private static final String PROJECT_FIELD = "project";
+    private static final String STATUS_FIELD = "status";
+    private static final String GRAFANA_ADMIN_FIELD = "grafana_admin";
+    private static final String GRAFANA_PASSWORD_FIELD = "grafana_pass";
+    private static final String OAUTH_COOKIE_SECRET_FIELD = "oauth_cookie_secret";
+    private static final String DECRYPT_TOKEN_FIELD = "odahuflow_connection_decrypt_token";
+    private static final String URLS_FIELD = "urls";
+    private static final String COMPUTATIONAL_URL_DESC = "description";
+    private static final String COMPUTATIONAL_URL_URL = "url";
+
+    @Override
+    public Optional<OdahuDTO> getByProjectEndpoint(String project, String endpoint) {
+        Optional<ProjectDTO> projectDTO = findOne(PROJECTS_COLLECTION, odahuProjectEndpointCondition(project, endpoint),
+                fields(include(ODAHU_FIELD), excludeId()),
+                ProjectDTO.class);
+
+        return projectDTO.flatMap(p -> p.getOdahu().stream()
+                .filter(odahu -> project.equals(odahu.getProject()) && endpoint.equals(odahu.getEndpoint()))
+                .findAny());
+    }
+
+    @Override
+    public List<OdahuDTO> findOdahuClusters(String project, String endpoint) {
+        Optional<ProjectDTO> projectDTO = findOne(PROJECTS_COLLECTION, odahuProjectEndpointCondition(project, endpoint),
+                fields(include(ODAHU_FIELD), excludeId()),
+                ProjectDTO.class);
+
+        return projectDTO.map(p -> p.getOdahu().stream()
+                .filter(odahu -> project.equals(odahu.getProject()) && endpoint.equals(odahu.getEndpoint()))
+                .collect(Collectors.toList()))
+                .orElse(new ArrayList<>());
+    }
+
+    @Override
+    public OdahuFieldsDTO getFields(String name, String project, String endpoint) {
+        Document odahuDocument = findOne(PROJECTS_COLLECTION, odahuProjectEndpointCondition(name, project, endpoint),
+                fields(include(ODAHU_FIELD), excludeId()))
+                .orElseThrow(() -> new DatalabException(project.toString() + " does not contain odahu " + name.toString() + " cluster"));
+
+        List<OdahuFieldsDTO> list = convertFromDocument(odahuDocument.get(ODAHU_FIELD, ArrayList.class), new TypeReference<List<OdahuFieldsDTO>>() {
+        });
+        return list.stream()
+                .filter(odahuFieldsDTO -> name.equals(odahuFieldsDTO.getName()))
+                .findAny()
+                .orElseThrow(() -> new DatalabException("Unable to find the " + name + " cluster fields"));
+    }
+
+    @Override
+    public List<OdahuDTO> findOdahuClusters() {
+        List<ProjectDTO> projectDTOS = find(PROJECTS_COLLECTION, ProjectDTO.class);
+        return projectDTOS.stream()
+                .map(ProjectDTO::getOdahu)
+                .flatMap(List::stream)
+                .collect(toList());
+    }
+
+    @Override
+    public boolean create(OdahuDTO odahuDTO) {
+        UpdateResult updateResult = updateOne(PROJECTS_COLLECTION, projectEndpointCondition(odahuDTO.getProject(),
+                odahuDTO.getEndpoint()),
+                push(ODAHU_FIELD, convertToBson(odahuDTO)));
+        return updateResult.getModifiedCount() > 0;
+    }
+
+    @Override
+    public void updateStatus(String name, String project, String endpoint, UserInstanceStatus status) {
+        BasicDBObject dbObject = new BasicDBObject();
+        dbObject.put(ODAHU_FIELD + ".$." + STATUS_FIELD, status.name());
+        updateOne(PROJECTS_COLLECTION, and(elemMatch(ODAHU_FIELD, eq(NAME_FIELD, name)),
+                odahuProjectEndpointCondition(project, endpoint)), new Document(SET, dbObject));
+    }
+
+    @Override
+    public void updateStatusAndUrls(OdahuResult result, UserInstanceStatus status) {
+        BasicDBObject dbObject = new BasicDBObject();
+        dbObject.put(ODAHU_FIELD + ".$." + STATUS_FIELD, status.name());
+        dbObject.put(ODAHU_FIELD + ".$." + URLS_FIELD, getResourceUrlData(result.getResourceUrls()));
+        dbObject.put(ODAHU_FIELD + ".$." + GRAFANA_ADMIN_FIELD, result.getGrafanaAdmin());
+        dbObject.put(ODAHU_FIELD + ".$." + GRAFANA_PASSWORD_FIELD, result.getGrafanaPassword());
+        dbObject.put(ODAHU_FIELD + ".$." + OAUTH_COOKIE_SECRET_FIELD, result.getOauthCookieSecret());
+        dbObject.put(ODAHU_FIELD + ".$." + DECRYPT_TOKEN_FIELD, result.getDecryptToken());
+        updateOne(PROJECTS_COLLECTION, odahuProjectEndpointCondition(result.getName(), result.getProjectName(), result.getEndpointName()),
+                new Document(SET, dbObject));
+    }
+
+    private Bson odahuProjectEndpointCondition(String name, String projectName, String endpointName) {
+        return and(elemMatch(ODAHU_FIELD, eq(NAME_FIELD, name)), odahuProjectEndpointCondition(projectName, endpointName));
+    }
+
+    private Bson odahuProjectEndpointCondition(String projectName, String endpointName) {
+        return elemMatch(ODAHU_FIELD, and(eq(ENDPOINT_FIELD, endpointName), eq(PROJECT_FIELD, projectName)));
+    }
+
+    private Bson projectEndpointCondition(String projectName, String endpointName) {
+        return and(eq(NAME_FIELD, projectName), and(elemMatch(ENDPOINTS, eq(NAME_FIELD, endpointName))));
+    }
+
+    private List<Map<String, String>> getResourceUrlData(List<ResourceURL> urls) {
+        return urls.stream()
+                .map(this::toUrlDocument)
+                .collect(toList());
+    }
+
+    private LinkedHashMap<String, String> toUrlDocument(ResourceURL url) {
+        LinkedHashMap<String, String> map = new LinkedHashMap<>();
+        map.put(COMPUTATIONAL_URL_URL, url.getUrl());
+        map.put(COMPUTATIONAL_URL_DESC, url.getDescription());
+        return map;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ProjectDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ProjectDAO.java
new file mode 100644
index 0000000..c5024af
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ProjectDAO.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+public interface ProjectDAO {
+    List<ProjectDTO> getProjects();
+
+    List<ProjectDTO> getProjectsWithEndpointStatusNotIn(UserInstanceStatus... statuses);
+
+    List<ProjectDTO> getUserProjects(UserInfo userInfo, boolean active);
+
+    void create(ProjectDTO projectDTO);
+
+    void updateStatus(String projectName, ProjectDTO.Status status);
+
+    void updateEdgeStatus(String projectName, String endpoint, UserInstanceStatus status);
+
+    void updateEdgeInfo(String projectName, String endpointName, EdgeInfo edgeInfo);
+
+    Optional<ProjectDTO> get(String name);
+
+    List<ProjectDTO> getProjectsByEndpoint(String endpointName);
+
+    boolean update(ProjectDTO projectDTO);
+
+    void remove(String name);
+
+    Optional<Integer> getAllowedBudget(String project);
+
+    void updateBudget(String project, Integer budget, boolean monthlyBudget);
+
+    boolean isAnyProjectAssigned(Set<String> groups);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ProjectDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ProjectDAOImpl.java
new file mode 100644
index 0000000..e3bbc0a
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/ProjectDAOImpl.java
@@ -0,0 +1,190 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.BudgetDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.google.common.collect.Iterables;
+import com.google.inject.Inject;
+import com.mongodb.BasicDBObject;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.elemMatch;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.in;
+import static com.mongodb.client.model.Filters.not;
+
+public class ProjectDAOImpl extends BaseDAO implements ProjectDAO {
+
+    private static final String PROJECTS_COLLECTION = "Projects";
+    private static final String GROUPS = "groups";
+    private static final String ENDPOINTS = "endpoints";
+    private static final String STATUS_FIELD = "status";
+    private static final String BUDGET_FIELD = "budget";
+    private static final String VALUE_FIELD = "value";
+    private static final String MONTHLY_BUDGET_FIELD = "monthlyBudget";
+    private static final String SHARED_IMAGE_FIELD = "sharedImageEnabled";
+    private static final String ENDPOINT_STATUS_FIELD = "endpoints." + STATUS_FIELD;
+    private static final String EDGE_INFO_FIELD = "edgeInfo";
+    private static final String ENDPOINT_FIELD = "endpoints.$.";
+    private static final String ANYUSER = Pattern.quote("$anyuser");
+
+    private final UserGroupDAO userGroupDao;
+
+    @Inject
+    public ProjectDAOImpl(UserGroupDAO userGroupDao) {
+        this.userGroupDao = userGroupDao;
+    }
+
+
+    @Override
+    public List<ProjectDTO> getProjects() {
+        return find(PROJECTS_COLLECTION, ProjectDTO.class);
+    }
+
+    @Override
+    public List<ProjectDTO> getProjectsWithEndpointStatusNotIn(UserInstanceStatus... statuses) {
+        final List<String> statusList =
+                Arrays.stream(statuses)
+                        .map(UserInstanceStatus::name)
+                        .collect(Collectors.toList());
+
+        return find(PROJECTS_COLLECTION, not(in(ENDPOINT_STATUS_FIELD, statusList)), ProjectDTO.class);
+    }
+
+    @Override
+    public List<ProjectDTO> getUserProjects(UserInfo userInfo, boolean active) {
+        Stream<String> userGroups = userGroupDao.getUserGroups(userInfo.getName()).stream();
+        Stream<String> roles = userInfo.getRoles().stream();
+        final Set<String> groups = Stream.concat(userGroups, roles)
+                .collect(Collectors.toSet());
+        return find(PROJECTS_COLLECTION, userProjectCondition(groups, active), ProjectDTO.class);
+    }
+
+    @Override
+    public void create(ProjectDTO projectDTO) {
+        insertOne(PROJECTS_COLLECTION, projectDTO);
+    }
+
+    @Override
+    public void updateStatus(String projectName, ProjectDTO.Status status) {
+        updateOne(PROJECTS_COLLECTION, projectCondition(projectName),
+                new Document(SET, new Document(STATUS_FIELD, status.toString())));
+    }
+
+    @Override
+    public void updateEdgeStatus(String projectName, String endpoint, UserInstanceStatus status) {
+        BasicDBObject dbObject = new BasicDBObject();
+        dbObject.put(ENDPOINT_FIELD + STATUS_FIELD, status.name());
+        updateOne(PROJECTS_COLLECTION, projectAndEndpointCondition(projectName,
+                endpoint), new Document(SET, dbObject));
+    }
+
+    @Override
+    public void updateEdgeInfo(String projectName, String endpointName, EdgeInfo edgeInfo) {
+        BasicDBObject dbObject = new BasicDBObject();
+        dbObject.put(ENDPOINT_FIELD + STATUS_FIELD, UserInstanceStatus.RUNNING.name());
+        dbObject.put(ENDPOINT_FIELD + EDGE_INFO_FIELD, convertToBson(edgeInfo));
+        updateOne(PROJECTS_COLLECTION, projectAndEndpointCondition(projectName, endpointName), new Document(SET,
+                dbObject));
+    }
+
+    @Override
+    public Optional<ProjectDTO> get(String name) {
+        return findOne(PROJECTS_COLLECTION, projectCondition(name), ProjectDTO.class);
+    }
+
+    @Override
+    public List<ProjectDTO> getProjectsByEndpoint(String endpointName) {
+        return find(PROJECTS_COLLECTION, elemMatch(ENDPOINTS, eq("name", endpointName)), ProjectDTO.class);
+    }
+
+    @Override
+    public boolean update(ProjectDTO projectDTO) {
+        BasicDBObject updateProject = new BasicDBObject();
+        updateProject.put(GROUPS, projectDTO.getGroups());
+        updateProject.put(ENDPOINTS,
+                projectDTO.getEndpoints().stream().map(this::convertToBson).collect(Collectors.toList()));
+        updateProject.put(SHARED_IMAGE_FIELD, projectDTO.isSharedImageEnabled());
+        return updateOne(PROJECTS_COLLECTION, projectCondition(projectDTO.getName()),
+                new Document(SET, updateProject)).getMatchedCount() > 0L;
+    }
+
+    @Override
+    public void remove(String name) {
+        deleteOne(PROJECTS_COLLECTION, projectCondition(name));
+    }
+
+    @Override
+    public Optional<Integer> getAllowedBudget(String project) {
+        return get(project)
+                .flatMap(p -> Optional.ofNullable(p.getBudget())
+                        .map(BudgetDTO::getValue));
+    }
+
+    @Override
+    public void updateBudget(String project, Integer budget, boolean monthlyBudget) {
+        BasicDBObject updateBudget = new BasicDBObject();
+        updateBudget.put(VALUE_FIELD, budget);
+        updateBudget.put(MONTHLY_BUDGET_FIELD, monthlyBudget);
+        updateOne(PROJECTS_COLLECTION, projectCondition(project), new Document(SET, new Document(BUDGET_FIELD, updateBudget)));
+    }
+
+    @Override
+    public boolean isAnyProjectAssigned(Set<String> groups) {
+        final String groupsRegex = !groups.isEmpty() ? String.join("|", groups) + "|" + ANYUSER : ANYUSER;
+        return !Iterables.isEmpty(find(PROJECTS_COLLECTION, elemMatch(GROUPS, regexCaseInsensitive(groupsRegex))));
+    }
+
+    private Bson projectCondition(String name) {
+        return eq("name", name);
+    }
+
+    private Bson userProjectCondition(Set<String> groups, boolean active) {
+        final String groupsRegex = !groups.isEmpty() ? String.join("|", groups) + "|" + ANYUSER : ANYUSER;
+        if (active) {
+            return and(elemMatch(GROUPS, regexCaseInsensitive(groupsRegex)),
+                    eq(ENDPOINT_STATUS_FIELD, UserInstanceStatus.RUNNING.name()));
+        }
+        return elemMatch(GROUPS, regexCaseInsensitive(groupsRegex));
+    }
+
+    private Bson projectAndEndpointCondition(String projectName, String endpointName) {
+        return and(eq("name", projectName), eq("endpoints.name", endpointName));
+    }
+
+    private Document regexCaseInsensitive(String values) {
+        return new Document("$regex",
+                "^(" + values + ")$").append("$options", "i");
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/RequestIdDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/RequestIdDAO.java
new file mode 100644
index 0000000..aa83887
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/RequestIdDAO.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.domain.RequestIdDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.mongodb.client.model.Updates;
+import com.mongodb.client.result.DeleteResult;
+import org.bson.Document;
+
+import java.util.Date;
+import java.util.Optional;
+
+import static com.epam.datalab.backendapi.dao.MongoCollections.REQUEST_ID;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.lt;
+
+/**
+ * DAO for request id.
+ */
+public class RequestIdDAO extends BaseDAO {
+    private static final String EXPIRATION_TIME = "expirationTime";
+
+    public RequestIdDTO get(String id) {
+        Optional<RequestIdDTO> opt = findOne(REQUEST_ID, eq(ID, id), RequestIdDTO.class);
+        if (!opt.isPresent()) {
+            throw new DatalabException("Request id " + id + " not found.");
+        }
+        return opt.get();
+    }
+
+    public void put(RequestIdDTO requestId) {
+        getCollection(REQUEST_ID)
+                .insertOne(convertToBson(requestId));
+    }
+
+    public void delete(String id) {
+        getCollection(REQUEST_ID).deleteOne(eq(ID, id));
+    }
+
+    public void resetExpirationTime() {
+        Date time = new Date();
+        getCollection(REQUEST_ID).updateMany(new Document(), Updates.set(EXPIRATION_TIME, time));
+    }
+
+    public long removeExpired() {
+        DeleteResult result = getCollection(REQUEST_ID)
+                .deleteMany(lt(EXPIRATION_TIME, new Date()));
+        return result.getDeletedCount();
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/SchedulerJobDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/SchedulerJobDAO.java
new file mode 100644
index 0000000..19ebeb1
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/SchedulerJobDAO.java
@@ -0,0 +1,248 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.model.scheduler.SchedulerJobData;
+import com.google.inject.Singleton;
+import com.mongodb.client.FindIterable;
+import com.mongodb.client.model.Filters;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.epam.datalab.backendapi.dao.ComputationalDAO.COMPUTATIONAL_NAME;
+import static com.epam.datalab.backendapi.dao.ComputationalDAO.IMAGE;
+import static com.epam.datalab.backendapi.dao.ComputationalDAO.PROJECT;
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.COMPUTATIONAL_RESOURCES;
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.EXPLORATORY_NAME;
+import static com.epam.datalab.backendapi.dao.ExploratoryDAO.exploratoryCondition;
+import static com.epam.datalab.backendapi.dao.MongoCollections.USER_INSTANCES;
+import static com.epam.datalab.dto.base.DataEngineType.fromDockerImageName;
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.exists;
+import static com.mongodb.client.model.Filters.in;
+import static com.mongodb.client.model.Filters.lte;
+import static com.mongodb.client.model.Filters.ne;
+import static com.mongodb.client.model.Filters.or;
+import static com.mongodb.client.model.Projections.excludeId;
+import static com.mongodb.client.model.Projections.fields;
+import static com.mongodb.client.model.Projections.include;
+import static java.util.stream.Collectors.toList;
+
+/**
+ * DAO for user's scheduler jobs.
+ */
+@Slf4j
+@Singleton
+public class SchedulerJobDAO extends BaseDAO {
+
+    static final String SCHEDULER_DATA = "scheduler_data";
+    private static final String CONSIDER_INACTIVITY_FLAG = SCHEDULER_DATA + ".consider_inactivity";
+    public static final String TIMEZONE_PREFIX = "UTC";
+    private static final String LAST_ACTIVITY = "last_activity";
+    private static final String CHECK_INACTIVITY_REQUIRED = "check_inactivity_required";
+    private static final String CHECK_INACTIVITY_FLAG = SCHEDULER_DATA + "." + CHECK_INACTIVITY_REQUIRED;
+
+
+    public SchedulerJobDAO() {
+        log.info("{} is initialized", getClass().getSimpleName());
+    }
+
+    /**
+     * Returns condition for search scheduler for exploratory which is not null.
+     *
+     * @return Bson condition.
+     */
+    private Bson schedulerNotNullCondition() {
+        return and(exists(SCHEDULER_DATA), ne(SCHEDULER_DATA, null));
+    }
+
+    /**
+     * Finds and returns the info of user's single scheduler job by exploratory name.
+     *
+     * @param user            user name.
+     * @param project         project name
+     * @param exploratoryName the name of exploratory.
+     * @return scheduler job data.
+     */
+    public Optional<SchedulerJobDTO> fetchSingleSchedulerJobByUserAndExploratory(String user, String project, String exploratoryName) {
+        return findOne(USER_INSTANCES,
+                and(exploratoryCondition(user, exploratoryName, project), schedulerNotNullCondition()),
+                fields(include(SCHEDULER_DATA), excludeId()))
+                .map(d -> convertFromDocument((Document) d.get(SCHEDULER_DATA), SchedulerJobDTO.class));
+    }
+
+    /**
+     * Finds and returns the info of user's single scheduler job for computational resource.
+     *
+     * @param user              user name.
+     * @param project           project name
+     * @param exploratoryName   the name of exploratory.
+     * @param computationalName the name of computational resource.
+     * @return scheduler job data.
+     */
+
+    @SuppressWarnings("unchecked")
+    public Optional<SchedulerJobDTO> fetchSingleSchedulerJobForCluster(String user, String project, String exploratoryName,
+                                                                       String computationalName) {
+        return findOne(USER_INSTANCES,
+                exploratoryCondition(user, exploratoryName, project),
+                fields(include(COMPUTATIONAL_RESOURCES), excludeId()))
+                .map(d -> (List<Document>) d.get(COMPUTATIONAL_RESOURCES))
+                .map(list -> list.stream().filter(d -> d.getString(COMPUTATIONAL_NAME).equals(computationalName))
+                        .findAny().orElse(new Document()))
+                .map(d -> (Document) d.get(SCHEDULER_DATA))
+                .map(d -> convertFromDocument(d, SchedulerJobDTO.class));
+    }
+
+    /**
+     * Finds and returns the list of all scheduler jobs for starting/stopping/terminating exploratories regarding to
+     * parameter passed.
+     *
+     * @param status 'running' value for starting exploratory, 'stopped' - for stopping and 'terminated' -
+     *               for
+     *               terminating.
+     * @return list of scheduler jobs.
+     */
+    public List<SchedulerJobData> getExploratorySchedulerDataWithStatus(UserInstanceStatus status) {
+        FindIterable<Document> userInstances = userInstancesWithScheduler(eq(STATUS, status.toString()));
+
+        return stream(userInstances).map(d -> convertFromDocument(d, SchedulerJobData.class))
+                .collect(toList());
+    }
+
+    public List<SchedulerJobData> getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(UserInstanceStatus status,
+                                                                                                  Date lastActivity) {
+        return stream(find(USER_INSTANCES,
+                and(
+                        eq(STATUS, status.toString()),
+                        schedulerNotNullCondition(),
+                        or(and(eq(CONSIDER_INACTIVITY_FLAG, true),
+                                or(eq(COMPUTATIONAL_RESOURCES, Collections.emptyList()),
+                                        and(ne(COMPUTATIONAL_RESOURCES, Collections.emptyList()),
+                                                Filters.elemMatch(COMPUTATIONAL_RESOURCES,
+                                                        lte(LAST_ACTIVITY, lastActivity))))),
+                                eq(CONSIDER_INACTIVITY_FLAG, false)
+                        )
+                ),
+                fields(excludeId(), include(USER, PROJECT, EXPLORATORY_NAME, SCHEDULER_DATA))))
+                .map(d -> convertFromDocument(d, SchedulerJobData.class))
+                .collect(toList());
+    }
+
+    public List<SchedulerJobData> getExploratorySchedulerDataWithOneOfStatus(UserInstanceStatus... statuses) {
+        FindIterable<Document> userInstances = userInstancesWithScheduler(in(STATUS,
+                Arrays.stream(statuses).map(UserInstanceStatus::toString).collect(toList())));
+
+        return stream(userInstances).map(d -> convertFromDocument(d, SchedulerJobData.class))
+                .collect(toList());
+    }
+
+    public List<SchedulerJobData> getComputationalSchedulerDataWithOneOfStatus(UserInstanceStatus exploratoryStatus,
+                                                                               DataEngineType dataEngineType,
+                                                                               UserInstanceStatus... statuses) {
+        return stream(computationalResourcesWithScheduler(exploratoryStatus))
+                .map(doc -> computationalSchedulerDataStream(doc, dataEngineType, statuses))
+                .flatMap(Function.identity())
+                .collect(toList());
+    }
+
+    public List<SchedulerJobData> getComputationalSchedulerDataWithOneOfStatus(UserInstanceStatus exploratoryStatus,
+                                                                               UserInstanceStatus... statuses) {
+        return stream(computationalResourcesWithScheduler(exploratoryStatus))
+                .map(doc -> computationalSchedulerData(doc, statuses).map(compResource -> toSchedulerData(doc,
+                        compResource)))
+                .flatMap(Function.identity())
+                .collect(toList());
+    }
+
+    private FindIterable<Document> computationalResourcesWithScheduler(UserInstanceStatus exploratoryStatus) {
+        final Bson computationalSchedulerCondition = Filters.elemMatch(COMPUTATIONAL_RESOURCES,
+                and(schedulerNotNullCondition()));
+        return find(USER_INSTANCES,
+                and(eq(STATUS, exploratoryStatus.toString()), computationalSchedulerCondition),
+                fields(excludeId(), include(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_RESOURCES)));
+    }
+
+    public void removeScheduler(String user, String exploratory) {
+        updateOne(USER_INSTANCES, and(eq(USER, user), eq(EXPLORATORY_NAME, exploratory)),
+                unset(SCHEDULER_DATA, StringUtils.EMPTY));
+    }
+
+    public void removeScheduler(String user, String exploratory, String computational) {
+        updateOne(USER_INSTANCES, and(eq(USER, user), eq(EXPLORATORY_NAME, exploratory),
+                Filters.elemMatch(COMPUTATIONAL_RESOURCES, eq(COMPUTATIONAL_NAME, computational))),
+                unset(COMPUTATIONAL_RESOURCES + ".$." + SCHEDULER_DATA, StringUtils.EMPTY));
+    }
+
+    private FindIterable<Document> userInstancesWithScheduler(Bson statusCondition) {
+        return find(USER_INSTANCES,
+                and(
+                        statusCondition,
+                        schedulerNotNullCondition(), eq(CHECK_INACTIVITY_FLAG, false)
+                ),
+                fields(excludeId(), include(USER, EXPLORATORY_NAME, PROJECT, SCHEDULER_DATA)));
+    }
+
+    private Stream<SchedulerJobData> computationalSchedulerDataStream(Document doc, DataEngineType computationalType,
+                                                                      UserInstanceStatus... computationalStatuses) {
+        return computationalSchedulerData(doc, computationalStatuses)
+                .filter(compResource -> fromDockerImageName(compResource.getString(IMAGE)) == computationalType)
+                .map(compResource -> toSchedulerData(doc, compResource));
+    }
+
+    private SchedulerJobData toSchedulerData(Document userInstanceDocument, Document compResource) {
+        final String user = userInstanceDocument.getString(USER);
+        final String project = userInstanceDocument.getString(PROJECT);
+        final String exploratoryName = userInstanceDocument.getString(EXPLORATORY_NAME);
+        final String computationalName = compResource.getString(COMPUTATIONAL_NAME);
+        final SchedulerJobDTO schedulerData = convertFromDocument((Document) compResource.get(SCHEDULER_DATA),
+                SchedulerJobDTO.class);
+        return new SchedulerJobData(user, exploratoryName, computationalName, project, schedulerData);
+    }
+
+    @SuppressWarnings("unchecked")
+    private Stream<Document> computationalSchedulerData(Document doc, UserInstanceStatus... computationalStatuses) {
+        final Set<String> statusSet = Arrays.stream(computationalStatuses)
+                .map(UserInstanceStatus::toString)
+                .collect(Collectors.toSet());
+        return ((List<Document>) doc.get(COMPUTATIONAL_RESOURCES))
+                .stream()
+                .filter(compResource -> Objects.nonNull(compResource.get(SCHEDULER_DATA)) &&
+                        statusSet.contains(compResource.getString(STATUS)));
+    }
+}
+
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/SecurityDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/SecurityDAO.java
new file mode 100644
index 0000000..85e836e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/SecurityDAO.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.mongodb.client.FindIterable;
+import com.mongodb.client.model.Projections;
+import org.bson.Document;
+import org.keycloak.representations.AccessTokenResponse;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.backendapi.dao.MongoCollections.ROLES;
+import static com.mongodb.client.model.Filters.and;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.gte;
+import static com.mongodb.client.model.Filters.ne;
+import static com.mongodb.client.model.Projections.exclude;
+import static com.mongodb.client.model.Projections.fields;
+import static com.mongodb.client.model.Projections.include;
+
+/**
+ * DAO write the attempt of user login into DataLab.
+ */
+@Singleton
+public class SecurityDAO extends BaseDAO {
+    private static final String SECURITY_COLLECTION = "security";
+    private static final String TOKEN_RESPONSE = "tokenResponse";
+    private static final String LAST_ACCESS = "last_access";
+
+    @Inject
+    private SelfServiceApplicationConfiguration conf;
+
+    /**
+     * Return the roles or throw exception if roles collection does not exists.
+     */
+    public FindIterable<Document> getRoles() {
+        if (!collectionExists(ROLES)) {
+            throw new DatalabException("Collection \"" + ROLES + "\" does not exists.");
+        }
+        return find(ROLES, ne(ID, "_Example"), fields(exclude("description")));
+    }
+
+    public Map<String, Set<String>> getGroups() {
+        return stream(find("userGroups"))
+                .collect(Collectors.toMap(d -> d.getString(ID).toLowerCase(), this::toUsers));
+
+    }
+
+    public void saveUser(String userName, AccessTokenResponse accessTokenResponse) {
+        updateOne(SECURITY_COLLECTION, eq(ID, userName),
+                new Document(SET,
+                        new Document()
+                                .append(ID, userName)
+                                .append("created", new Date())
+                                .append(LAST_ACCESS, new Date())
+                                .append(TOKEN_RESPONSE, convertToBson(accessTokenResponse))),
+                true);
+    }
+
+    public void updateUser(String userName, AccessTokenResponse accessTokenResponse) {
+        updateOne(SECURITY_COLLECTION, eq(ID, userName),
+                new Document(SET,
+                        new Document()
+                                .append(ID, userName)
+                                .append(LAST_ACCESS, new Date())
+                                .append(TOKEN_RESPONSE, convertToBson(accessTokenResponse))));
+    }
+
+    public Optional<UserInfo> getUser(String token) {
+        return Optional.ofNullable(mongoService.getCollection(SECURITY_COLLECTION)
+                .findOneAndUpdate(and(eq(TOKEN_RESPONSE + ".access_token", token), gte(LAST_ACCESS,
+                        new Date(new Date().getTime() - conf.getInactiveUserTimeoutMillSec()))), new Document("$set",
+                        new Document(LAST_ACCESS, new Date()))))
+                .map(d -> new UserInfo(d.getString(ID), token));
+    }
+
+
+    public Optional<AccessTokenResponse> getTokenResponse(String user) {
+        return findOne(SECURITY_COLLECTION, eq(ID, user), Projections.fields(include(TOKEN_RESPONSE)))
+                .map(d -> convertFromDocument((Document) d.get(TOKEN_RESPONSE), AccessTokenResponse.class));
+    }
+
+    @SuppressWarnings("unchecked")
+    private Set<String> toUsers(Document d) {
+        final Object users = d.get("users");
+        return users == null ? Collections.emptySet() :
+                new HashSet<>(((List<String>) users).stream().map(String::toLowerCase).collect(Collectors.toList()));
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/SettingsDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/SettingsDAO.java
new file mode 100644
index 0000000..18f9c34
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/SettingsDAO.java
@@ -0,0 +1,424 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.exceptions.DatalabException;
+import com.mongodb.client.model.UpdateOptions;
+import org.apache.commons.lang3.StringUtils;
+import org.bson.Document;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.backendapi.dao.MongoCollections.SETTINGS;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AWS_NOTEBOOK_SUBNET_ID;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AWS_NOTEBOOK_VPC_ID;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AWS_REGION;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AWS_SECURITY_GROUPS;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AWS_SUBNET_ID;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AWS_VPC_ID;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AWS_ZONE;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AZURE_DATA_LAKE_CLIENT_ID;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AZURE_DATA_LAKE_NAME_TAG;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AZURE_EDGE_INSTANCE_SIZE;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AZURE_REGION;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AZURE_RESOURCE_GROUP_NAME;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AZURE_SECURITY_GROUP_NAME;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AZURE_SUBNET_NAME;
+import static com.epam.datalab.backendapi.dao.MongoSetting.AZURE_VPC_NAME;
+import static com.epam.datalab.backendapi.dao.MongoSetting.CONF_KEY_DIRECTORY;
+import static com.epam.datalab.backendapi.dao.MongoSetting.CONF_MAX_BUDGET;
+import static com.epam.datalab.backendapi.dao.MongoSetting.CONF_OS_FAMILY;
+import static com.epam.datalab.backendapi.dao.MongoSetting.CONF_TAG_RESOURCE_ID;
+import static com.epam.datalab.backendapi.dao.MongoSetting.GCP_PROJECT_ID;
+import static com.epam.datalab.backendapi.dao.MongoSetting.GCP_REGION;
+import static com.epam.datalab.backendapi.dao.MongoSetting.GCP_SUBNET_NAME;
+import static com.epam.datalab.backendapi.dao.MongoSetting.GCP_VPC_NAME;
+import static com.epam.datalab.backendapi.dao.MongoSetting.GCP_ZONE;
+import static com.epam.datalab.backendapi.dao.MongoSetting.LDAP_DN;
+import static com.epam.datalab.backendapi.dao.MongoSetting.LDAP_HOSTNAME;
+import static com.epam.datalab.backendapi.dao.MongoSetting.LDAP_OU;
+import static com.epam.datalab.backendapi.dao.MongoSetting.LDAP_PASSWORD;
+import static com.epam.datalab.backendapi.dao.MongoSetting.LDAP_USER;
+import static com.epam.datalab.backendapi.dao.MongoSetting.PEERING_ID;
+import static com.epam.datalab.backendapi.dao.MongoSetting.SERIVICE_BASE_NAME;
+import static com.epam.datalab.backendapi.dao.MongoSetting.SHARED_STORAGE_ACCOUNT_TAG_NAME;
+import static com.epam.datalab.backendapi.dao.MongoSetting.SSN_INSTANCE_SIZE;
+import static com.epam.datalab.backendapi.dao.MongoSetting.SSN_STORAGE_ACCOUNT_TAG_NAME;
+import static com.mongodb.client.model.Filters.eq;
+import static org.apache.commons.lang3.StringUtils.EMPTY;
+
+/**
+ * Stores the environment settings.
+ */
+public class SettingsDAO extends BaseDAO {
+    private static final String VALUE = "value";
+
+    /**
+     * Returns the base name of service.
+     */
+    public String getServiceBaseName() {
+        return getSetting(SERIVICE_BASE_NAME);
+    }
+
+    public void setServiceBaseName(String sbn) {
+        setSetting(SERIVICE_BASE_NAME, sbn);
+    }
+
+    /**
+     * Returns the name of OS family.
+     */
+    public String getConfOsFamily() {
+        return getSetting(CONF_OS_FAMILY);
+    }
+
+    public void setConfOsFamily(String osFamily) {
+        setSetting(CONF_OS_FAMILY, osFamily);
+    }
+
+    /**
+     * Returns the name of directory for user key.
+     */
+    public String getConfKeyDir() {
+        return getSetting(CONF_KEY_DIRECTORY);
+    }
+
+    public void setConfKeyDir(String confKeyDir) {
+        setSetting(CONF_KEY_DIRECTORY, confKeyDir);
+    }
+
+    /**
+     * Returns the name of tag for resource id.
+     */
+    public String getConfTagResourceId() {
+        return getSetting(CONF_TAG_RESOURCE_ID);
+    }
+
+    public void setConfTagResourceId(String confTagResourceId) {
+        setSetting(CONF_TAG_RESOURCE_ID, confTagResourceId);
+    }
+
+    public Optional<Integer> getMaxBudget() {
+        return getOptionalSetting(CONF_MAX_BUDGET)
+                .map(Integer::valueOf);
+
+    }
+
+    public String getAwsZone() {
+        return getSetting(AWS_ZONE);
+    }
+
+    public void setAwsZone(String awsZone) {
+        setSetting(AWS_ZONE, awsZone);
+    }
+
+    public String getLdapHost() {
+        return getSetting(LDAP_HOSTNAME);
+    }
+
+    public void setLdapHost(String ldapHost) {
+        setSetting(LDAP_HOSTNAME, ldapHost);
+    }
+
+    public String getLdapOu() {
+        return getSetting(LDAP_OU);
+    }
+
+    public void setLdapOu(String ldapOu) {
+        setSetting(LDAP_OU, ldapOu);
+    }
+
+    public String getLdapDn() {
+        return getSetting(LDAP_DN);
+    }
+
+    public void setLdapDn(String ldapDn) {
+        setSetting(LDAP_DN, ldapDn);
+    }
+
+    public String getLdapUser() {
+        return getSetting(LDAP_USER);
+    }
+
+    public void setLdapUser(String user) {
+        setSetting(LDAP_USER, user);
+    }
+
+    public String getLdapPassword() {
+        return getSetting(LDAP_PASSWORD);
+    }
+
+    public void setLdapPassword(String ldapPassword) {
+        setSetting(LDAP_PASSWORD, ldapPassword);
+    }
+
+    /**
+     * Returns the name of AWS region.
+     */
+    public String getAwsRegion() {
+        return getSetting(AWS_REGION);
+    }
+
+    public void setAwsRegion(String awsRegion) {
+        setSetting(AWS_REGION, awsRegion);
+    }
+
+    /**
+     * Returns the id of security group.
+     */
+    public String getAwsSecurityGroups() {
+        return getSetting(AWS_SECURITY_GROUPS);
+    }
+
+    public void setAwsSecurityGroups(String awsSecurityGroups) {
+        setSetting(AWS_SECURITY_GROUPS, awsSecurityGroups);
+    }
+
+    /**
+     * Returns the id of virtual private cloud for AWS account.
+     */
+    public String getAwsVpcId() {
+        return getSetting(AWS_VPC_ID);
+    }
+
+    public void setAwsVpcId(String awsVpcId) {
+        setSetting(AWS_VPC_ID, awsVpcId);
+    }
+
+    /**
+     * Returns the id of virtual private cloud subnet for AWS account.
+     */
+    public void setAwsSubnetId(String awsSubnetId) {
+        setSetting(AWS_SUBNET_ID, awsSubnetId);
+    }
+
+    public String getAwsSubnetId() {
+        return getSetting(AWS_SUBNET_ID);
+    }
+
+    public String getAwsNotebookVpcId() {
+        return getSetting(AWS_NOTEBOOK_VPC_ID);
+    }
+
+    public void setSsnStorageAccountTagName(String ssnStorageAccountTagName) {
+        setSetting(SSN_STORAGE_ACCOUNT_TAG_NAME, ssnStorageAccountTagName);
+    }
+
+    public String getSsnStorageAccountTagName() {
+        return getSetting(SSN_STORAGE_ACCOUNT_TAG_NAME);
+    }
+
+    public void setSharedStorageAccountTagName(String sharedStorageAccountTagName) {
+        setSetting(SHARED_STORAGE_ACCOUNT_TAG_NAME, sharedStorageAccountTagName);
+    }
+
+    public String getSharedStorageAccountTagName() {
+        return getSetting(SHARED_STORAGE_ACCOUNT_TAG_NAME);
+    }
+
+    public void setPeeringId(String peeringId) {
+        setSetting(PEERING_ID, peeringId);
+    }
+
+    public void setAwsNotebookVpcId(String awsNotebookVpcId) {
+        setSetting(AWS_NOTEBOOK_VPC_ID, awsNotebookVpcId);
+    }
+
+    public String getAwsNotebookSubnetId() {
+        return getSetting(AWS_NOTEBOOK_SUBNET_ID);
+    }
+
+    public void setAwsNotebookSubnetId(String awsNotebookSubnetId) {
+        setSetting(AWS_NOTEBOOK_SUBNET_ID, awsNotebookSubnetId);
+    }
+
+    public String getAzureRegion() {
+        return getSetting(AZURE_REGION);
+    }
+
+    public String getAzureResourceGroupName() {
+        return getSetting(AZURE_RESOURCE_GROUP_NAME);
+    }
+
+    public String getAzureSubnetName() {
+        return getSetting(AZURE_SUBNET_NAME);
+    }
+
+    public String getAzureVpcName() {
+        return getSetting(AZURE_VPC_NAME);
+    }
+
+    public String getAzureSecurityGroupName() {
+        return getSetting(AZURE_SECURITY_GROUP_NAME);
+    }
+
+    public String getAzureEdgeInstanceSize() {
+        return getSetting(AZURE_EDGE_INSTANCE_SIZE);
+    }
+
+    public String getSsnInstanceSize() {
+        return getSetting(SSN_INSTANCE_SIZE);
+    }
+
+    public String getAzureDataLakeNameTag() {
+        return getSetting(AZURE_DATA_LAKE_NAME_TAG, "");
+    }
+
+    public boolean isAzureDataLakeEnabled() {
+        String dataLakeTagName = getAzureDataLakeNameTag();
+        return dataLakeTagName != null && !dataLakeTagName.isEmpty();
+    }
+
+    public String getAzureDataLakeClientId() {
+        return getSetting(AZURE_DATA_LAKE_CLIENT_ID);
+    }
+
+    public void setAzureRegion(String region) {
+        setSetting(AZURE_REGION, region);
+    }
+
+    public void setAzureResourceGroupName(String resourceGroupName) {
+        setSetting(AZURE_RESOURCE_GROUP_NAME, resourceGroupName);
+    }
+
+    public void setAzureSubnetName(String subnetName) {
+        setSetting(AZURE_SUBNET_NAME, subnetName);
+    }
+
+    public void setAzureVpcName(String vpcName) {
+        setSetting(AZURE_VPC_NAME, vpcName);
+    }
+
+    public void setAzureSecurityGroupName(String securityGroupName) {
+        setSetting(AZURE_SECURITY_GROUP_NAME, securityGroupName);
+    }
+
+    public void setAzureEdgeInstanceSize(String azureEdgeInstanceSize) {
+        setSetting(AZURE_EDGE_INSTANCE_SIZE, azureEdgeInstanceSize);
+    }
+
+    public void setSsnInstanceSize(String ssnInstanceSize) {
+        setSetting(SSN_INSTANCE_SIZE, ssnInstanceSize);
+    }
+
+    public void setAzureDataLakeNameTag(String dataLakeNameTag) {
+        setSetting(AZURE_DATA_LAKE_NAME_TAG, dataLakeNameTag);
+    }
+
+    public void setAzureDataLakeClientId(String dataLakeClientId) {
+        setSetting(AZURE_DATA_LAKE_CLIENT_ID, dataLakeClientId);
+    }
+
+    public String getGcpRegion() {
+        return getSetting(GCP_REGION);
+    }
+
+    public void setGcpRegion(String region) {
+        setSetting(GCP_REGION, region);
+    }
+
+    public String getGcpZone() {
+        return getSetting(GCP_ZONE);
+    }
+
+    public void setGcpZone(String zone) {
+        setSetting(GCP_ZONE, zone);
+    }
+
+    public String getGcpSubnetName() {
+        return getSetting(GCP_SUBNET_NAME);
+    }
+
+    public void setGcpSubnetName(String subnet) {
+        setSetting(GCP_SUBNET_NAME, subnet);
+    }
+
+    public String getGcpProjectId() {
+        return getSetting(GCP_PROJECT_ID);
+    }
+
+    public void setGcpProjectId(String projectId) {
+        setSetting(GCP_PROJECT_ID, projectId);
+    }
+
+    public String getGcpVpcName() {
+        return getSetting(GCP_VPC_NAME);
+    }
+
+    public void setGcpVpcName(String vpcName) {
+        setSetting(GCP_VPC_NAME, vpcName);
+    }
+
+    public void setMaxBudget(Long budget) {
+        setSetting(CONF_MAX_BUDGET, budget.toString());
+    }
+
+    public void removeSetting(MongoSetting setting) {
+        getCollection(SETTINGS).deleteOne(eq(ID, setting.getId()));
+    }
+
+    public Map<String, Object> getSettings() {
+        return stream(getCollection(SETTINGS).find())
+                .collect(Collectors.toMap(d -> d.getString(ID), d -> d.get(VALUE)));
+    }
+
+    /**
+     * Returns the value of property from Mongo database.
+     *
+     * @param setting the name of property.
+     */
+    private String getSetting(MongoSetting setting) {
+        Document d = settingDocument(setting);
+        if (d == null) {
+            throw new DatalabException("Setting property " + setting + " not found");
+        }
+        return d.getOrDefault(VALUE, EMPTY).toString();
+    }
+
+    private Optional<String> getOptionalSetting(MongoSetting setting) {
+        Document d = settingDocument(setting);
+        return Optional.ofNullable(d).map(doc -> doc.getString(VALUE));
+    }
+
+    private Document settingDocument(MongoSetting setting) {
+        return mongoService
+                .getCollection(SETTINGS)
+                .find(eq(ID, setting.getId()))
+                .first();
+    }
+
+    private void setSetting(MongoSetting mongoSetting, String value) {
+        if (StringUtils.isNotEmpty(value)) {
+            mongoService.getCollection(SETTINGS)
+                    .updateOne(eq(ID, mongoSetting.getId()), new Document("$set", new Document(VALUE, value)),
+                            new UpdateOptions().upsert(true));
+        }
+    }
+
+
+    private String getSetting(MongoSetting setting, String defaultValue) {
+        Document d = settingDocument(setting);
+        if (d == null) {
+            return defaultValue;
+        }
+        return d.getOrDefault(VALUE, defaultValue).toString();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserGroupDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserGroupDAO.java
new file mode 100644
index 0000000..1411bf9
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserGroupDAO.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.dao;
+
+import java.util.Set;
+
+public interface UserGroupDAO {
+    void addUsers(String group, Set<String> users);
+
+    void updateUsers(String group, Set<String> users);
+
+    void removeGroup(String groupId);
+
+    Set<String> getUserGroups(String user);
+
+    Set<String> getUsers(String group);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserGroupDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserGroupDAOImpl.java
new file mode 100644
index 0000000..4fa0488
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserGroupDAOImpl.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Singleton;
+import org.bson.Document;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.backendapi.dao.MongoCollections.USER_GROUPS;
+import static com.mongodb.client.model.Filters.elemMatch;
+import static com.mongodb.client.model.Filters.eq;
+
+@Singleton
+public class UserGroupDAOImpl extends BaseDAO implements UserGroupDAO {
+
+    private static final String USERS_FIELD = "users";
+
+    @Override
+    public void addUsers(String group, Set<String> users) {
+        updateOne(USER_GROUPS, eq(ID, group), addToSet(USERS_FIELD, users), true);
+    }
+
+    @Override
+    public void updateUsers(String group, Set<String> users) {
+        updateOne(USER_GROUPS, eq(ID, group), new Document(SET, new Document(USERS_FIELD, users)), true);
+    }
+
+    @Override
+    public void removeGroup(String groupId) {
+        deleteOne(USER_GROUPS, eq(ID, groupId));
+    }
+
+    @Override
+    public Set<String> getUserGroups(String user) {
+        return stream(find(USER_GROUPS, elemMatch(USERS_FIELD, new Document("$regex", "^" + user + "$")
+                .append("$options", "i"))))
+                .map(document -> document.getString(ID))
+                .collect(Collectors.toSet());
+    }
+
+    @Override
+    public Set<String> getUsers(String group) {
+        return new HashSet<>(findOne(USER_GROUPS, eq(ID, group))
+                .map(document -> (List<String>) document.get(USERS_FIELD))
+                .orElseThrow(() -> new DatalabException(String.format("Group %s not found", group))));
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAO.java
new file mode 100644
index 0000000..89bc126
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAO.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.resources.dto.UserGroupDto;
+import com.epam.datalab.backendapi.resources.dto.UserRoleDTO;
+import com.epam.datalab.cloud.CloudProvider;
+
+import java.util.List;
+import java.util.Set;
+
+public interface UserRoleDAO {
+    List<UserRoleDTO> findAll();
+
+    void insert(UserRoleDTO dto);
+
+    void insert(List<UserRoleDTO> roles);
+
+    boolean update(UserRoleDTO dto);
+
+    void updateMissingRoles(CloudProvider cloudProvider);
+
+    boolean addGroupToRole(Set<String> groups, Set<String> roleIds);
+
+    void removeGroupWhenRoleNotIn(String group, Set<String> roleIds);
+
+    void removeUnnecessaryRoles(CloudProvider cloudProviderToBeRemoved, List<CloudProvider> remainingProviders);
+
+    void remove(String roleId);
+
+    boolean removeGroup(String groupId);
+
+    List<UserGroupDto> aggregateRolesByGroup();
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAOImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAOImpl.java
new file mode 100644
index 0000000..1081dee
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserRoleDAOImpl.java
@@ -0,0 +1,208 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.backendapi.resources.dto.UserGroupDto;
+import com.epam.datalab.backendapi.resources.dto.UserRoleDTO;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.exceptions.DatalabException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Singleton;
+import com.mongodb.client.model.BsonField;
+import com.mongodb.client.result.UpdateResult;
+import lombok.extern.slf4j.Slf4j;
+import org.bson.Document;
+import org.bson.conversions.Bson;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.epam.datalab.backendapi.dao.MongoCollections.USER_GROUPS;
+import static com.mongodb.client.model.Aggregates.group;
+import static com.mongodb.client.model.Aggregates.lookup;
+import static com.mongodb.client.model.Aggregates.project;
+import static com.mongodb.client.model.Aggregates.unwind;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.in;
+import static com.mongodb.client.model.Filters.not;
+import static java.lang.String.format;
+import static java.util.stream.Collectors.toList;
+
+@Singleton
+@Slf4j
+public class UserRoleDAOImpl extends BaseDAO implements UserRoleDAO {
+    private static final ObjectMapper MAPPER = new ObjectMapper();
+    private static final String ROLES_FILE_FORMAT = "/mongo/%s/mongo_roles.json";
+    private static final String USERS_FIELD = "users";
+    private static final String GROUPS_FIELD = "groups";
+    private static final String DESCRIPTION = "description";
+    private static final String TYPE = "type";
+    private static final String CLOUD = "cloud";
+    private static final String ROLES = "roles";
+    private static final String GROUPS = "$groups";
+    private static final String GROUP = "group";
+    private static final String EXPLORATORY_SHAPES_FIELD = "exploratory_shapes";
+    private static final String PAGES_FIELD = "pages";
+    private static final String EXPLORATORIES_FIELD = "exploratories";
+    private static final String COMPUTATIONALS_FIELD = "computationals";
+    private static final String GROUP_INFO = "groupInfo";
+
+
+    @Override
+    public List<UserRoleDTO> findAll() {
+        return find(MongoCollections.ROLES, UserRoleDTO.class);
+    }
+
+    @Override
+    public void insert(UserRoleDTO dto) {
+        insertOne(MongoCollections.ROLES, dto, dto.getId());
+    }
+
+    @Override
+    public void insert(List<UserRoleDTO> roles) {
+        roles.forEach(this::insert);
+    }
+
+    @Override
+    public boolean update(UserRoleDTO dto) {
+        final Document userRoleDocument = convertToBson(dto).append(TIMESTAMP, new Date());
+        return conditionMatched(updateOne(MongoCollections.ROLES,
+                eq(ID, dto.getId()),
+                new Document(SET, userRoleDocument)));
+    }
+
+    @Override
+    public void updateMissingRoles(CloudProvider cloudProvider) {
+        getUserRoleFromFile(cloudProvider)
+                .stream()
+                .peek(u -> u.setGroups(Collections.emptySet()))
+                .filter(u -> findAll()
+                        .stream()
+                        .map(UserRoleDTO::getId)
+                        .noneMatch(id -> id.equals(u.getId())))
+                .forEach(this::insert);
+
+        addGroupToRole(aggregateRolesByGroup()
+                        .stream()
+                        .map(UserGroupDto::getGroup)
+                        .collect(Collectors.toSet()),
+                getAll(cloudProvider));
+    }
+
+    private Set<String> getAll(CloudProvider cloudProvider) {
+        return getUserRoleFromFile(cloudProvider)
+                .stream()
+                .map(UserRoleDTO::getId)
+                .collect(Collectors.toSet());
+    }
+
+    @Override
+    public boolean addGroupToRole(Set<String> groups, Set<String> roleIds) {
+        return conditionMatched(updateMany(MongoCollections.ROLES, in(ID, roleIds), addToSet(GROUPS_FIELD,
+                groups)));
+    }
+
+    @Override
+    public void removeGroupWhenRoleNotIn(String group, Set<String> roleIds) {
+        updateMany(MongoCollections.ROLES, not(in(ID, roleIds)), pull(GROUPS_FIELD, group));
+    }
+
+    @Override
+    public void removeUnnecessaryRoles(CloudProvider cloudProviderToBeRemoved, List<CloudProvider> remainingProviders) {
+        if (remainingProviders.contains(cloudProviderToBeRemoved)) {
+            return;
+        }
+        List<UserRoleDTO> remainingRoles = new ArrayList<>();
+        remainingProviders.forEach(p -> remainingRoles.addAll(getUserRoleFromFile(p)));
+
+        getUserRoleFromFile(cloudProviderToBeRemoved)
+                .stream()
+                .filter(role -> UserRoleDTO.cloudSpecificTypes().contains(role.getType()))
+                .map(UserRoleDTO::getId)
+                .filter(u -> remainingRoles
+                        .stream()
+                        .map(UserRoleDTO::getId)
+                        .noneMatch(id -> id.equals(u)))
+                .forEach(this::remove);
+    }
+
+    @Override
+    public void remove(String roleId) {
+        deleteOne(MongoCollections.ROLES, eq(ID, roleId));
+    }
+
+    @Override
+    public boolean removeGroup(String groupId) {
+        return conditionMatched(updateMany(MongoCollections.ROLES, in(GROUPS_FIELD, groupId), pull(GROUPS_FIELD,
+                groupId)));
+    }
+
+    @Override
+    public List<UserGroupDto> aggregateRolesByGroup() {
+        final Document role = roleDocument();
+        final Bson groupBy = group(GROUPS, new BsonField(ROLES, new Document(ADD_TO_SET, role)));
+        final Bson lookup = lookup(USER_GROUPS, ID, ID, GROUP_INFO);
+        final List<Bson> pipeline = Arrays.asList(unwind(GROUPS), groupBy, lookup,
+                project(new Document(GROUP, "$" + ID).append(GROUP_INFO, elementAt(GROUP_INFO, 0))
+                        .append(ROLES, "$" + ROLES)),
+                project(new Document(GROUP, "$" + ID).append(USERS_FIELD, "$" + GROUP_INFO + "." + USERS_FIELD)
+                        .append(ROLES, "$" + ROLES)));
+
+        return stream(aggregate(MongoCollections.ROLES, pipeline))
+                .map(d -> convertFromDocument(d, UserGroupDto.class))
+                .collect(toList());
+    }
+
+    private List<UserRoleDTO> getUserRoleFromFile(CloudProvider cloudProvider) {
+        try (InputStream is = getClass().getResourceAsStream(format(ROLES_FILE_FORMAT, cloudProvider.getName()))) {
+            return MAPPER.readValue(is, new TypeReference<List<UserRoleDTO>>() {
+            });
+        } catch (IOException e) {
+            log.error("Can not marshall datalab roles due to: {}", e.getMessage(), e);
+            throw new IllegalStateException("Can not marshall datalab roles due to: " + e.getMessage());
+        }
+    }
+
+    private Document roleDocument() {
+        return new Document().append(ID, "$" + ID)
+                .append(DESCRIPTION, "$" + DESCRIPTION)
+                .append(TYPE, "$" + TYPE)
+                .append(CLOUD, "$" + CLOUD)
+                .append(USERS_FIELD, "$" + USERS_FIELD)
+                .append(EXPLORATORY_SHAPES_FIELD, "$" + EXPLORATORY_SHAPES_FIELD)
+                .append(PAGES_FIELD, "$" + PAGES_FIELD)
+                .append(EXPLORATORIES_FIELD, "$" + EXPLORATORIES_FIELD)
+                .append(COMPUTATIONALS_FIELD, "$" + COMPUTATIONALS_FIELD);
+    }
+
+    private boolean conditionMatched(UpdateResult updateResult) {
+        return updateResult.getMatchedCount() > 0;
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserSettingsDAO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserSettingsDAO.java
new file mode 100644
index 0000000..7e06eb3
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dao/UserSettingsDAO.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dao;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.UserDTO;
+import io.dropwizard.auth.Auth;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Optional;
+
+import static com.epam.datalab.backendapi.dao.MongoCollections.USER_SETTINGS;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Updates.set;
+
+/**
+ * DAO for the user preferences.
+ */
+public class UserSettingsDAO extends BaseDAO {
+    private static final String USER_UI_SETTINGS_FIELD = "userUISettings";
+    private static final String USER_ALLOWED_BUDGET = "allowedBudget";
+
+    /**
+     * Returns the user preferences of UI dashboard.
+     *
+     * @param userInfo user info.
+     * @return JSON content.
+     */
+    public String getUISettings(@Auth UserInfo userInfo) {
+        return findOne(USER_SETTINGS, eq(ID, userInfo.getName()))
+                .map(d -> d.getString(USER_UI_SETTINGS_FIELD))
+                .orElse(StringUtils.EMPTY);
+    }
+
+    /**
+     * Store the user preferences of UI dashboard.
+     *
+     * @param userInfo user info.
+     * @param settings user preferences in JSON format.
+     */
+    public void setUISettings(UserInfo userInfo, String settings) {
+        updateOne(USER_SETTINGS,
+                eq(ID, userInfo.getName()),
+                set(USER_UI_SETTINGS_FIELD, settings),
+                true);
+    }
+
+    public void updateBudget(UserDTO allowedBudgetDTO) {
+        updateOne(USER_SETTINGS,
+                eq(ID, allowedBudgetDTO.getName()),
+                set(USER_ALLOWED_BUDGET, allowedBudgetDTO.getBudget()),
+                true);
+    }
+
+    public Optional<Integer> getAllowedBudget(String user) {
+        return findOne(USER_SETTINGS, eq(ID, user))
+                .flatMap(d -> Optional.ofNullable(d.getInteger(USER_ALLOWED_BUDGET)));
+    }
+
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditActionEnum.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditActionEnum.java
new file mode 100644
index 0000000..65fdcda
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditActionEnum.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+public enum AuditActionEnum {
+	CREATE, RECREATE, SET_UP_SCHEDULER, START, STOP, TERMINATE, RECONFIGURE, UPDATE, CONNECT, DISCONNECT, UPLOAD,
+	DOWNLOAD, DELETE, INSTALL_LIBS, FOLLOW_LINK, LOG_IN
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditCreateDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditCreateDTO.java
new file mode 100644
index 0000000..0fb37d3
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditCreateDTO.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class AuditCreateDTO {
+    @NotBlank(message = "field cannot be empty")
+    @JsonProperty("resource_name")
+    private final String resourceName;
+    @NotBlank(message = "field cannot be empty")
+    private final String info;
+    private final AuditResourceTypeEnum type;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditDTO.java
new file mode 100644
index 0000000..353f6b2
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditDTO.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@Builder
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class AuditDTO {
+    private final String user;
+    private final AuditActionEnum action;
+    private final AuditResourceTypeEnum type;
+    private final String project;
+    private final String resourceName;
+    private final String info;
+    private Date timestamp;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditPaginationDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditPaginationDTO.java
new file mode 100644
index 0000000..194d70a
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditPaginationDTO.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Set;
+
+@Data
+@Builder
+public class AuditPaginationDTO {
+    @JsonProperty("page_count")
+    private final int totalPageCount;
+    private final List<AuditDTO> audit;
+    @JsonProperty("user_filter")
+    private final Set<String> userFilter;
+    @JsonProperty("project_filter")
+    private final Set<String> projectFilter;
+    @JsonProperty("resource_name_filter")
+    private final Set<String> resourceNameFilter;
+    @JsonProperty("resource_type_filter")
+    private final Set<String> resourceTypeFilter;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditResourceTypeEnum.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditResourceTypeEnum.java
new file mode 100644
index 0000000..1ca0fdf
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AuditResourceTypeEnum.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+public enum AuditResourceTypeEnum {
+    PROJECT, EDGE_NODE, NOTEBOOK, COMPUTE, BUCKET, ENDPOINT, GROUP, IMAGE, GIT_ACCOUNT, LOG_IN, WEB_TERMINAL
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AutoCompleteEnum.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AutoCompleteEnum.java
new file mode 100644
index 0000000..6869623
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/AutoCompleteEnum.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+public enum AutoCompleteEnum {
+    NONE, UPDATING, ENABLED
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/BillingReport.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/BillingReport.java
new file mode 100644
index 0000000..8a6170a
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/BillingReport.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+import java.util.List;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class BillingReport {
+    private String sbn;
+    private String name;
+    @JsonProperty("report_lines")
+    private List<BillingReportLine> reportLines;
+    @JsonProperty("from")
+    private LocalDate usageDateFrom;
+    @JsonProperty("to")
+    private LocalDate usageDateTo;
+    @JsonProperty("total_cost")
+    private double totalCost;
+    private String currency;
+    @JsonProperty("is_full")
+    private boolean isReportHeaderCompletable;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/BillingReportLine.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/BillingReportLine.java
new file mode 100644
index 0000000..7d98028
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/BillingReportLine.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.billing.BillingResourceType;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+@Data
+@Builder
+@JsonIgnoreProperties(ignoreUnknown = true)
+@AllArgsConstructor
+@NoArgsConstructor
+public class BillingReportLine {
+    private String datalabId;
+    private String application;
+    @JsonProperty("resource_name")
+    private String resourceName;
+    private String project;
+    private String endpoint;
+    private String user;
+    @JsonProperty("from")
+    private LocalDate usageDateFrom;
+    @JsonProperty("to")
+    private LocalDate usageDateTo;
+    private String usageDate;
+    private String product;
+    private String usageType;
+    private Double cost;
+    private String currency;
+    @JsonProperty("resource_type")
+    private BillingResourceType resourceType;
+    private UserInstanceStatus status;
+    private String shape;
+    private String exploratoryName;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/BudgetDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/BudgetDTO.java
new file mode 100644
index 0000000..b2eb6cc
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/BudgetDTO.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BudgetDTO {
+    private Integer value;
+    private boolean monthlyBudget;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/CreateProjectDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/CreateProjectDTO.java
new file mode 100644
index 0000000..6920d9d
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/CreateProjectDTO.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.util.Set;
+
+@Data
+public class CreateProjectDTO {
+    @NotNull
+    private final String name;
+    @NotNull
+    private final Set<String> groups;
+    @NotNull
+    final Set<String> endpoints;
+    @NotNull
+    @Pattern(regexp = "^ssh-.*\\n?", message = "format is incorrect. Please use the openSSH format")
+    private final String key;
+    @NotNull
+    private final String tag;
+    @JsonProperty("shared_image_enabled")
+    private boolean sharedImageEnabled;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/EndpointDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/EndpointDTO.java
new file mode 100644
index 0000000..168a1e6
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/EndpointDTO.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.epam.datalab.cloud.CloudProvider;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+import org.hibernate.validator.constraints.URL;
+
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class EndpointDTO {
+
+    private static final String URL_REGEXP_VALIDATION = "^(http(s)?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
+    @NotBlank(message = "field cannot be empty")
+    private final String name;
+    @URL(regexp = URL_REGEXP_VALIDATION, message = "field is in improper format!")
+    private final String url;
+    @NotBlank(message = "field cannot be empty")
+    private final String account;
+    @JsonProperty("endpoint_tag")
+    private final String tag;
+    private final EndpointStatus status;
+    private final CloudProvider cloudProvider;
+
+    public enum EndpointStatus {
+        ACTIVE,
+        INACTIVE
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/EndpointResourcesDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/EndpointResourcesDTO.java
new file mode 100644
index 0000000..b991d79
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/EndpointResourcesDTO.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.epam.datalab.dto.UserInstanceDTO;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+public class EndpointResourcesDTO {
+    private List<UserInstanceDTO> exploratories;
+    private List<ProjectDTO> projects;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ExploratoryLibCache.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ExploratoryLibCache.java
new file mode 100644
index 0000000..de4d3fa
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ExploratoryLibCache.java
@@ -0,0 +1,240 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package com.epam.datalab.backendapi.domain;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.LibraryAutoCompleteDTO;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.LibListComputationalDTO;
+import com.epam.datalab.dto.LibListExploratoryDTO;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ComputationalAPI;
+import com.epam.datalab.rest.contracts.ExploratoryAPI;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import io.dropwizard.lifecycle.Managed;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Cache of libraries for exploratory.
+ */
+@Singleton
+public class ExploratoryLibCache implements Managed, Runnable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ExploratoryLibCache.class);
+
+    @Inject
+    @Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
+    private RESTService provisioningService;
+    @Inject
+    private RequestBuilder requestBuilder;
+    @Inject
+    private RequestId requestId;
+    @Inject
+    private EndpointService endpointService;
+
+    /**
+     * Instance of cache.
+     */
+    private static ExploratoryLibCache libCache;
+
+    /**
+     * Thread of the cache.
+     */
+    private Thread thread;
+
+    /**
+     * List of libraries.
+     */
+    private Map<String, ExploratoryLibList> cache = new HashMap<>();
+
+    /**
+     * Return the list of libraries.
+     */
+    public static ExploratoryLibCache getCache() {
+        synchronized (libCache) {
+            if (libCache.thread == null) {
+                LOGGER.debug("Library cache thread not running and will be started ...");
+                libCache.thread = new Thread(libCache, libCache.getClass().getSimpleName());
+                libCache.thread.start();
+            }
+        }
+        return libCache;
+    }
+
+    @Override
+    public void start() {
+        if (libCache == null) {
+            libCache = this;
+        }
+    }
+
+    @Override
+    public void stop() {
+        if (libCache != null) {
+            synchronized (libCache) {
+                if (libCache.thread != null) {
+                    LOGGER.debug("Library cache thread will be stopped ...");
+                    libCache.thread.interrupt();
+                    libCache.thread = null;
+                    LOGGER.debug("Library cache thread has been stopped");
+                }
+                libCache.cache.clear();
+            }
+        }
+    }
+
+    /**
+     * Return the list of libraries for docker image and group start with prefix from cache.
+     *
+     * @param userInfo  the user info.
+     * @param group     the name of group.
+     * @param startWith the prefix for library name.
+     * @return LibraryAutoCompleteDTO dto
+     */
+    public LibraryAutoCompleteDTO getLibList(UserInfo userInfo, UserInstanceDTO userInstance, String group, String startWith) {
+        ExploratoryLibList libs = getLibs(userInfo, userInstance, group);
+        return libs.getLibs(group, startWith);
+    }
+
+    /**
+     * Return the list of libraries for docker image from cache.
+     *
+     * @param userInfo     the user info.
+     * @param userInstance userInstance
+     * @param cacheKey     the group of library
+     */
+    private ExploratoryLibList getLibs(UserInfo userInfo, UserInstanceDTO userInstance, String cacheKey) {
+        ExploratoryLibList libs;
+        synchronized (cache) {
+            cache.computeIfAbsent(cacheKey, libraries -> new ExploratoryLibList(cacheKey, null));
+            libs = cache.get(cacheKey);
+            if (libs.isUpdateNeeded() && !libs.isUpdating()) {
+                libs.setUpdating();
+                libs.setExpiredTime();
+                requestLibList(userInfo, userInstance, cacheKey);
+            }
+        }
+
+        return libs;
+    }
+
+    /**
+     * Update the list of libraries for docker image in cache.
+     *
+     * @param group   the name of image.
+     * @param content the content of libraries list.
+     */
+    public void updateLibList(String group, String content) {
+        synchronized (cache) {
+            cache.remove(group);
+            cache.put(group, new ExploratoryLibList(group, content));
+        }
+    }
+
+    /**
+     * Set updating library list to false
+     *
+     * @param groupName group name
+     */
+    public void updateLibListStatus(String groupName) {
+        synchronized (cache) {
+            ExploratoryLibList exploratoryLibList = cache.get(groupName);
+            exploratoryLibList.setNotUpdating();
+        }
+    }
+
+    /**
+     * Send request to provisioning service for the list of libraries.
+     *
+     * @param userInfo     the user info.
+     * @param userInstance the notebook info.
+     * @param group        the library group
+     */
+    private void requestLibList(UserInfo userInfo, UserInstanceDTO userInstance, String group) {
+        try {
+
+            LOGGER.info("Ask docker for the list of libraries for user {} and exploratory {} computational {}",
+                    userInfo.getName(), userInstance.getExploratoryId(),
+                    userInstance.getResources());
+
+            String uuid;
+            if (userInstance.getResources() != null && !userInstance.getResources().isEmpty()) {
+                UserComputationalResource userComputationalResource = userInstance.getResources().get(0);
+                EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
+                LibListComputationalDTO dto = requestBuilder.newLibComputationalList(userInfo, userInstance,
+                        userComputationalResource, endpointDTO, group);
+
+                uuid = provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_LIB_LIST,
+                        userInfo.getAccessToken(),
+                        dto, String.class);
+            } else {
+                EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
+                LibListExploratoryDTO dto = requestBuilder.newLibExploratoryList(userInfo, userInstance, endpointDTO, group);
+                uuid = provisioningService.post(endpointDTO.getUrl() + ExploratoryAPI.EXPLORATORY_LIB_LIST,
+                        userInfo.getAccessToken(), dto,
+                        String.class);
+            }
+
+            requestId.put(userInfo.getName(), uuid);
+
+        } catch (Exception e) {
+            LOGGER.warn("Ask docker for the status of resources for user {} and exploratory {} fails: {}",
+                    userInfo.getName(), userInstance, e.getLocalizedMessage(), e);
+        }
+    }
+
+
+    @Override
+    public void run() {
+        while (true) {
+            try {
+                Thread.sleep(ExploratoryLibList.UPDATE_REQUEST_TIMEOUT_MILLIS);
+
+                synchronized (cache) {
+                    cache.entrySet().removeIf(e -> e.getValue().isExpired());
+                }
+
+                if (cache.size() == 0) {
+                    synchronized (libCache) {
+                        thread = null;
+                        LOGGER.debug("Library cache thread have no data and will be finished");
+                        return;
+                    }
+                }
+            } catch (InterruptedException e) {
+                LOGGER.trace("Library cache thread has been interrupted");
+                Thread.currentThread().interrupt();
+                break;
+            } catch (Exception e) {
+                LOGGER.warn("Library cache thread unhandled error: {}", e.getLocalizedMessage(), e);
+            }
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ExploratoryLibList.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ExploratoryLibList.java
new file mode 100644
index 0000000..6276a63
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ExploratoryLibList.java
@@ -0,0 +1,250 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package com.epam.datalab.backendapi.domain;
+
+import com.epam.datalab.backendapi.resources.dto.LibraryAutoCompleteDTO;
+import com.epam.datalab.backendapi.resources.dto.LibraryDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.MoreObjects;
+import io.dropwizard.util.Duration;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+
+/**
+ * Class to store the info about libraries.
+ */
+@Slf4j
+public class ExploratoryLibList {
+
+    /**
+     * Timeout in milliseconds when the info is out of date.
+     */
+    private static final long EXPIRED_TIMEOUT_MILLIS = Duration.hours(2).toMilliseconds();
+
+    /**
+     * Timeout in milliseconds until the is out of date.
+     */
+    private static final long UPDATE_TIMEOUT_MILLIS = Duration.minutes(30).toMilliseconds();
+
+    /**
+     * Timeout in milliseconds for request to update lib.
+     */
+    protected static final long UPDATE_REQUEST_TIMEOUT_MILLIS = Duration.minutes(15).toMilliseconds();
+
+    /**
+     * Group name.
+     */
+    private String group;
+
+    /**
+     * List of libraries group:libraries:version.
+     */
+    private Map<String, Map<String, String>> libs = new HashMap<>();
+
+    /**
+     * Time in milliseconds when the info is out of date.
+     */
+    private long expiredTimeMillis = 0;
+
+    /**
+     * Last access time in milliseconds to the info.
+     */
+    private long accessTimeMillis = 0;
+
+    /**
+     * Update start time in milliseconds.
+     */
+    private long updateStartTimeMillis = 0;
+
+    /**
+     * Update in progress.
+     */
+    private boolean updating = false;
+
+
+    /**
+     * Instantiate the list of libraries.
+     *
+     * @param group   the name of docker's image.
+     * @param content JSON string.
+     */
+    ExploratoryLibList(String group, String content) {
+        this.group = group;
+        if (content != null) {
+            setLibs(content);
+        }
+    }
+
+    /**
+     * Return the list of all groups.
+     */
+    public List<String> getGroupList() {
+        List<String> list = new ArrayList<>(libs.keySet());
+        Collections.sort(list);
+        return list;
+    }
+
+    /**
+     * Return the name of docker image;
+     */
+    public String getGroup() {
+        return group;
+    }
+
+    /**
+     * Return the full list of libraries for group.
+     *
+     * @param group the name of group.
+     */
+    public Map<String, String> getLibs(String group) {
+        return libs.get(group);
+    }
+
+    /**
+     * Return the full list of libraries for group.
+     *
+     * @param content JSON string.
+     */
+    private void setLibs(String content) {
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            synchronized (this) {
+                @SuppressWarnings("unchecked")
+                Map<String, Map<String, String>> map = mapper.readValue(content, Map.class);
+                for (Map.Entry<String, Map<String, String>> entry : map.entrySet()) {
+                    Map<String, String> group = entry.getValue();
+                    String groupName = entry.getKey();
+                    libs.remove(groupName);
+                    log.info("Update {} group with lib group {} with {} libraries", this.group, groupName, (group != null) ? group.size() : null);
+                    libs.put(groupName, new TreeMap<>(group));
+                }
+                setExpiredTime();
+                updating = false;
+            }
+        } catch (IOException e) {
+            throw new DatalabException("Cannot deserialize the list of libraries. " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    public void setExpiredTime() {
+        expiredTimeMillis = System.currentTimeMillis() + EXPIRED_TIMEOUT_MILLIS;
+        accessTimeMillis = System.currentTimeMillis();
+    }
+
+    /**
+     * Search and return the list of libraries for name's prefix <b>startWith</b>.
+     *
+     * @param group     the name of group.
+     * @param startWith the prefix for library name.
+     * @return LibraryAutoCompleteDTO dto
+     */
+    public LibraryAutoCompleteDTO getLibs(String group, String startWith) {
+        final String startsWithLower = startWith.toLowerCase();
+        Map<String, String> libMap = getLibs(group);
+        if (libMap == null) {
+            return LibraryAutoCompleteDTO.builder()
+                    .autoComplete(isUpdating() ? AutoCompleteEnum.UPDATING : AutoCompleteEnum.NONE)
+                    .libraries(Collections.emptyList())
+                    .build();
+        }
+        List<LibraryDTO> libraries = libMap.entrySet()
+                .stream()
+                .filter(e -> e.getKey().toLowerCase().startsWith(startsWithLower))
+                .map(e -> new LibraryDTO(e.getKey(), e.getValue()))
+                .collect(Collectors.toList());
+
+        return LibraryAutoCompleteDTO.builder()
+                .autoComplete(AutoCompleteEnum.ENABLED)
+                .libraries(libraries)
+                .build();
+    }
+
+    /**
+     * Set last access time.
+     */
+    private void touch() {
+        accessTimeMillis = System.currentTimeMillis();
+    }
+
+    /**
+     * Return <b>true</b> if the info is out of date.
+     */
+    public boolean isExpired() {
+        touch();
+        return (expiredTimeMillis < System.currentTimeMillis());
+    }
+
+    /**
+     * Return <b>true</b> if the info needs to update.
+     */
+    public boolean isUpdateNeeded() {
+        touch();
+        return (accessTimeMillis > expiredTimeMillis - UPDATE_TIMEOUT_MILLIS);
+    }
+
+    /**
+     * Set updating in progress.
+     */
+    public void setUpdating() {
+        updateStartTimeMillis = System.currentTimeMillis();
+        updating = true;
+    }
+
+    /**
+     * Set updating to false.
+     */
+    public void setNotUpdating() {
+        updating = Boolean.FALSE;
+    }
+
+    /**
+     * Return <b>true</b> if the update in progress.
+     */
+    public boolean isUpdating() {
+        if (updating &&
+                updateStartTimeMillis + UPDATE_REQUEST_TIMEOUT_MILLIS < System.currentTimeMillis()) {
+            updating = false;
+        }
+        return updating;
+    }
+
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("group", group)
+                .add("expiredTimeMillis", expiredTimeMillis)
+                .add("accessTimeMillis", accessTimeMillis)
+                .add("updateStartTimeMillis", updateStartTimeMillis)
+                .add("isUpdating", updating)
+                .add("libs", (libs == null ? "null" : "..."))
+                .toString();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/MavenSearchArtifactResponse.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/MavenSearchArtifactResponse.java
new file mode 100644
index 0000000..3dd6bd1
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/MavenSearchArtifactResponse.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Getter
+public class MavenSearchArtifactResponse {
+
+    @JsonProperty("response")
+    private Response response;
+
+    public void setResponse(Response response) {
+        this.response = response;
+    }
+
+    public int getArtifactCount() {
+        return response.artifactCount;
+    }
+
+    public List<Response.Artifact> getArtifacts() {
+        return response.artifacts;
+    }
+
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class Response {
+        @JsonProperty("numFound")
+        private int artifactCount;
+        @JsonProperty("docs")
+        private List<Artifact> artifacts;
+
+        public void setArtifacts(List<Artifact> artifacts) {
+            this.artifacts = artifacts;
+        }
+
+        @JsonIgnoreProperties(ignoreUnknown = true)
+        public static class Artifact {
+            private String id;
+            @JsonProperty("v")
+            private String version;
+
+            public String getId() {
+                return id;
+            }
+
+            public void setId(String id) {
+                this.id = id;
+            }
+
+            public String getVersion() {
+                return version;
+            }
+
+            public void setVersion(String version) {
+                this.version = version;
+            }
+        }
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/NotebookTemplate.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/NotebookTemplate.java
new file mode 100644
index 0000000..294621e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/NotebookTemplate.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum NotebookTemplate {
+    JUPYTER("Jupyter notebook 6.1.6"),
+    JUPYTER_LAB("JupyterLab 0.35.6"),
+    ZEPPELIN("Apache Zeppelin 0.9.0"),
+    DEEP_LEARNING("Deep Learning  2.4"),
+    TENSOR("Jupyter with TensorFlow 2.3.2"),
+    TENSOR_RSTUDIO("RStudio with TensorFlow 2.3.2"),
+    RSTUDIO("RStudio 1.4.1103"),
+    TENSOR_GCP("Jupyter with TensorFlow 2.1.0"),
+    DEEP_LEARNING_GCP("Deeplearning notebook");
+
+    private final String name;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuActionDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuActionDTO.java
new file mode 100644
index 0000000..c8b4960
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuActionDTO.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class OdahuActionDTO {
+	@NotNull
+	private final String name;
+	@NotNull
+	private final String project;
+	@NotNull
+	private final String endpoint;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuCreateDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuCreateDTO.java
new file mode 100644
index 0000000..4e13404
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuCreateDTO.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class OdahuCreateDTO {
+	@NotNull
+	private final String name;
+	@NotNull
+	private final String project;
+	@NotNull
+	private final String endpoint;
+	@JsonProperty("custom_tag")
+	private final String customTag;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuDTO.java
new file mode 100644
index 0000000..5d8faa8
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuDTO.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class OdahuDTO {
+    private final String name;
+    private final String project;
+    private final String endpoint;
+    @JsonProperty("grafana_admin")
+    private String grafanaAdmin;
+    @JsonProperty("grafana_pass")
+    private String grafanaPassword;
+    private final List<ResourceURL> urls = new ArrayList<>();
+    private final UserInstanceStatus status;
+    private final Map<String, String> tags;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuFieldsDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuFieldsDTO.java
new file mode 100644
index 0000000..b5843b2
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/OdahuFieldsDTO.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class OdahuFieldsDTO {
+	private String name;
+	@JsonProperty("grafana_admin")
+	private String grafanaAdmin;
+	@JsonProperty("grafana_pass")
+	private String grafanaPassword;
+	@JsonProperty("oauth_cookie_secret")
+	private String oauthCookieSecret;
+	@JsonProperty("odahuflow_connection_decrypt_token")
+	private String decryptToken;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ProjectDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ProjectDTO.java
new file mode 100644
index 0000000..ca3e9b8
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ProjectDTO.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+@Data
+@Builder
+@AllArgsConstructor
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ProjectDTO {
+    @NotNull
+    private final String name;
+    @NotNull
+    private final Set<String> groups;
+    @NotNull
+    @Pattern(regexp = "^ssh-.*\\n", message = "format is incorrect. Please use the openSSH format")
+    private final String key;
+    @NotNull
+    private final String tag;
+    private final BudgetDTO budget;
+    private final List<ProjectEndpointDTO> endpoints;
+    private final boolean sharedImageEnabled;
+    private final List<OdahuDTO> odahu = new ArrayList<>();
+
+    public enum Status {
+        CREATING,
+        ACTIVE,
+        FAILED,
+        DELETED,
+        DELETING,
+        DEACTIVATING,
+        ACTIVATING,
+        NOT_ACTIVE;
+
+        public static Status from(UserInstanceStatus userInstanceStatus) {
+            if (userInstanceStatus == UserInstanceStatus.RUNNING) {
+                return ACTIVE;
+            } else if (userInstanceStatus == UserInstanceStatus.TERMINATED) {
+                return DELETED;
+            } else if (userInstanceStatus == UserInstanceStatus.TERMINATING) {
+                return DELETING;
+            } else if (userInstanceStatus == UserInstanceStatus.STOPPING) {
+                return DEACTIVATING;
+            } else if (userInstanceStatus == UserInstanceStatus.STOPPED) {
+                return NOT_ACTIVE;
+            } else if (userInstanceStatus == UserInstanceStatus.STARTING) {
+                return ACTIVATING;
+            } else if (userInstanceStatus == UserInstanceStatus.CREATING) {
+                return CREATING;
+            } else if (userInstanceStatus == UserInstanceStatus.FAILED) {
+                return FAILED;
+            }
+            return Status.valueOf(userInstanceStatus.name());
+        }
+
+        public static UserInstanceStatus from(Status status) {
+            if (status == ACTIVE) {
+                return UserInstanceStatus.RUNNING;
+            } else if (status == ACTIVATING) {
+                return UserInstanceStatus.STARTING;
+            } else if (status == DEACTIVATING) {
+                return UserInstanceStatus.STOPPING;
+            } else if (status == NOT_ACTIVE) {
+                return UserInstanceStatus.STOPPED;
+            } else if (status == DELETING) {
+                return UserInstanceStatus.TERMINATING;
+            } else if (status == DELETED) {
+                return UserInstanceStatus.TERMINATED;
+            } else if (status == CREATING) {
+                return UserInstanceStatus.CREATING;
+            } else if (status == FAILED) {
+                return UserInstanceStatus.FAILED;
+            }
+            throw new IllegalArgumentException();
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ProjectEndpointDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ProjectEndpointDTO.java
new file mode 100644
index 0000000..94b9d28
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/ProjectEndpointDTO.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import lombok.Data;
+
+@Data
+public class ProjectEndpointDTO {
+    private final String name;
+    private final UserInstanceStatus status;
+    private final EdgeInfo edgeInfo;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/RequestId.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/RequestId.java
new file mode 100644
index 0000000..f81f1e0
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/RequestId.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.epam.datalab.backendapi.dao.RequestIdDAO;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import io.dropwizard.util.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * Stores and checks the id of requests for Provisioning Service.
+ */
+@Singleton
+public class RequestId {
+    private static final Logger LOGGER = LoggerFactory.getLogger(RequestId.class);
+
+    /**
+     * Timeout in milliseconds when the request id is out of date.
+     */
+    private static final long EXPIRED_TIMEOUT_MILLIS = Duration.hours(12).toMilliseconds();
+
+    @Inject
+    private RequestIdDAO dao;
+
+    /**
+     * Add the request id for user.
+     *
+     * @param username the name of user.
+     * @param uuid     UUID.
+     */
+    public String put(String username, String uuid) {
+        LOGGER.trace("Register request id {} for user {}", uuid, username);
+        dao.put(new RequestIdDTO()
+                .withId(uuid)
+                .withUser(username)
+                .withRequestTime(new Date())
+                .withExpirationTime(new Date(System.currentTimeMillis() + EXPIRED_TIMEOUT_MILLIS)));
+        return uuid;
+    }
+
+    /**
+     * Generate, add and return new UUID.
+     *
+     * @param username the name of user.
+     * @return new UUID
+     */
+    public String get(String username) {
+        return put(UUID.randomUUID().toString(), username);
+    }
+
+    /**
+     * Remove UUID if it exist.
+     *
+     * @param uuid UUID.
+     */
+    public void remove(String uuid) {
+        LOGGER.trace("Unregister request id {}", uuid);
+        dao.delete(uuid);
+    }
+
+    /**
+     * Check and remove UUID, if it not exists throw exception.
+     *
+     * @param uuid UUID.
+     * @return username
+     */
+    public String checkAndRemove(String uuid) {
+        String username = dao.get(uuid).getUser();
+        LOGGER.trace("Unregister request id {} for user {}", uuid, username);
+        dao.delete(uuid);
+        return username;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/RequestIdDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/RequestIdDTO.java
new file mode 100644
index 0000000..a96ad6a
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/RequestIdDTO.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import java.util.Date;
+
+/**
+ * Store request id info.
+ *
+ * @author Usein_Faradzhev
+ */
+public class RequestIdDTO {
+    @JsonProperty("_id")
+    private String id;
+
+    @JsonProperty
+    private String user;
+
+    @JsonProperty
+    private Date requestTime;
+
+    @JsonProperty
+    private Date expirationTime;
+
+    /**
+     * Return request id.
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * Set request id.
+     */
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    /**
+     * Set request id.
+     */
+    public RequestIdDTO withId(String id) {
+        setId(id);
+        return this;
+    }
+
+    /**
+     * Return user name.
+     */
+    public String getUser() {
+        return user;
+    }
+
+    /**
+     * Set user name.
+     */
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    /**
+     * Set user name.
+     */
+    public RequestIdDTO withUser(String user) {
+        setUser(user);
+        return this;
+    }
+
+    /**
+     * Return request time.
+     */
+    public Date getRequestTime() {
+        return requestTime;
+    }
+
+    /**
+     * Set request time.
+     */
+    public void setRequestTime(Date requestTime) {
+        this.requestTime = requestTime;
+    }
+
+    /**
+     * Set request time.
+     */
+    public RequestIdDTO withRequestTime(Date requestTime) {
+        setRequestTime(requestTime);
+        return this;
+    }
+
+    /**
+     * Return expiration time.
+     */
+    public Date getExpirationTime() {
+        return expirationTime;
+    }
+
+    /**
+     * Set expiration time.
+     */
+    public void setExpirationTime(Date expirationTime) {
+        this.expirationTime = expirationTime;
+    }
+
+    /**
+     * Set expiration time.
+     */
+    public RequestIdDTO withExpirationTime(Date expirationTime) {
+        setExpirationTime(expirationTime);
+        return this;
+    }
+
+    public ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("id", id)
+                .add("user", user)
+                .add("requestTime", requestTime)
+                .add("expirationTime", expirationTime);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/SchedulerConfigurationData.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/SchedulerConfigurationData.java
new file mode 100644
index 0000000..5199e69
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/SchedulerConfigurationData.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class SchedulerConfigurationData {
+    private final boolean enabled;
+    @NotNull
+    private final String cron;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/UpdateProjectBudgetDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/UpdateProjectBudgetDTO.java
new file mode 100644
index 0000000..c8efe76
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/UpdateProjectBudgetDTO.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class UpdateProjectBudgetDTO {
+    @NotNull
+    private final String project;
+    @NotNull
+    private final Integer budget;
+    private final boolean monthlyBudget;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/UpdateProjectDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/UpdateProjectDTO.java
new file mode 100644
index 0000000..5e16c4d
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/domain/UpdateProjectDTO.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Set;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class UpdateProjectDTO {
+    @NotNull
+    private final String name;
+    @NotNull
+    private final Set<String> endpoints;
+    @NotNull
+    private final Set<String> groups;
+    @JsonProperty("shared_image_enabled")
+    private final boolean sharedImageEnabled;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dropwizard/bundles/DatalabKeycloakBundle.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dropwizard/bundles/DatalabKeycloakBundle.java
new file mode 100644
index 0000000..8b1a182
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dropwizard/bundles/DatalabKeycloakBundle.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dropwizard.bundles;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.auth.KeycloakAuthenticator;
+import com.epam.datalab.backendapi.auth.SelfServiceSecurityAuthorizer;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.google.inject.Inject;
+import de.ahus1.keycloak.dropwizard.KeycloakBundle;
+import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
+import io.dropwizard.auth.Authenticator;
+import io.dropwizard.auth.Authorizer;
+
+import java.security.Principal;
+
+public class DatalabKeycloakBundle extends KeycloakBundle<SelfServiceApplicationConfiguration> {
+
+    @Inject
+    private KeycloakAuthenticator authenticator;
+
+    @Override
+    protected KeycloakConfiguration getKeycloakConfiguration(SelfServiceApplicationConfiguration configuration) {
+        return configuration.getKeycloakConfiguration();
+    }
+
+    @Override
+    protected Class<? extends Principal> getUserClass() {
+        return UserInfo.class;
+    }
+
+    @Override
+    protected Authorizer createAuthorizer() {
+        return new SelfServiceSecurityAuthorizer();
+    }
+
+    @Override
+    protected Authenticator createAuthenticator(KeycloakConfiguration configuration) {
+        return new KeycloakAuthenticator(configuration);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dropwizard/listeners/MongoStartupListener.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dropwizard/listeners/MongoStartupListener.java
new file mode 100644
index 0000000..38e63bf
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dropwizard/listeners/MongoStartupListener.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dropwizard.listeners;
+
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.EndpointDAO;
+import com.epam.datalab.backendapi.dao.SettingsDAO;
+import com.epam.datalab.backendapi.dao.UserRoleDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.resources.dto.UserRoleDTO;
+import com.epam.datalab.cloud.CloudProvider;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Inject;
+import io.dropwizard.lifecycle.ServerLifecycleListener;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.jetty.server.Server;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+
+import static java.lang.String.format;
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.collectingAndThen;
+import static java.util.stream.Collectors.toCollection;
+
+@Slf4j
+public class MongoStartupListener implements ServerLifecycleListener {
+
+    private static final String PATH_TO_ROLES = "/mongo/%s/mongo_roles.json";
+    private static final ObjectMapper MAPPER = new ObjectMapper();
+    private final UserRoleDAO userRoleDao;
+    private final SelfServiceApplicationConfiguration configuration;
+    private final SettingsDAO settingsDAO;
+    private final EndpointDAO endpointDAO;
+
+    @Inject
+    public MongoStartupListener(UserRoleDAO userRoleDao, SelfServiceApplicationConfiguration configuration,
+                                SettingsDAO settingsDAO, EndpointDAO endpointDAO) {
+        this.userRoleDao = userRoleDao;
+        this.configuration = configuration;
+        this.settingsDAO = settingsDAO;
+        this.endpointDAO = endpointDAO;
+    }
+
+    @Override
+    public void serverStarted(Server server) {
+        settingsDAO.setServiceBaseName(configuration.getServiceBaseName());
+        settingsDAO.setConfOsFamily(configuration.getOs());
+        settingsDAO.setSsnInstanceSize(configuration.getSsnInstanceSize());
+        List<EndpointDTO> endpointDTOs = endpointDAO.getEndpoints();
+        if (userRoleDao.findAll().isEmpty()) {
+            log.info("Populating DataLab default roles into database");
+            List<UserRoleDTO> cloudRoles = getRoles(CloudProvider.GENERAL);
+            List<CloudProvider> connectedCloudProviders = getConnectedProviders(endpointDTOs);
+            log.info("Check for connected endpoints:\n connected endpoints: {} \n connected clouds: {}",
+                    endpointDTOs.size(), connectedCloudProviders);
+            connectedCloudProviders.forEach(provider -> cloudRoles.addAll(getRoles(provider)));
+            userRoleDao.insert(cloudRoles);
+        } else {
+            log.info("Roles already populated. Do nothing ...");
+        }
+    }
+
+    private List<CloudProvider> getConnectedProviders(List<EndpointDTO> endpointDTOs) {
+        return endpointDTOs.stream()
+                .map(EndpointDTO::getCloudProvider)
+                .collect(Collectors.toList());
+    }
+
+    private List<UserRoleDTO> getRoles(CloudProvider cloudProvider) {
+        Set<UserRoleDTO> userRoles = new HashSet<>(getUserRoleFromFile(cloudProvider));
+        return userRoles.stream()
+                .collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparing(UserRoleDTO::getId))),
+                        ArrayList::new));
+    }
+
+    private List<UserRoleDTO> getUserRoleFromFile(CloudProvider cloudProvider) {
+        try (InputStream is = getClass().getResourceAsStream(format(PATH_TO_ROLES, cloudProvider.getName()))) {
+            return MAPPER.readValue(is, new TypeReference<List<UserRoleDTO>>() {
+            });
+        } catch (IOException e) {
+            log.error("Can not marshall datalab roles due to: {}", e.getMessage(), e);
+            throw new IllegalStateException("Can not marshall datalab roles due to: " + e.getMessage());
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/dropwizard/listeners/RestoreHandlerStartupListener.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/dropwizard/listeners/RestoreHandlerStartupListener.java
new file mode 100644
index 0000000..b7c9cef
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/dropwizard/listeners/RestoreHandlerStartupListener.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.dropwizard.listeners;
+
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.rest.client.RESTService;
+import io.dropwizard.lifecycle.ServerLifecycleListener;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.eclipse.jetty.server.Server;
+
+@Slf4j
+public class RestoreHandlerStartupListener implements ServerLifecycleListener {
+
+    private final RESTService provisioningService;
+    private final EndpointService endpointService;
+
+    public RestoreHandlerStartupListener(RESTService provisioningService, EndpointService endpointService) {
+        this.provisioningService = provisioningService;
+        this.endpointService = endpointService;
+    }
+
+    @Override
+    public void serverStarted(Server server) {
+        try {
+            endpointService.getEndpointsWithStatus(EndpointDTO.EndpointStatus.ACTIVE)
+                    .forEach(e -> provisioningService.post(e.getUrl() + "/handler/restore", StringUtils.EMPTY, Object.class));
+        } catch (Exception e) {
+            log.error("Exception occurred during restore handler request: {}", e.getMessage(), e);
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/healthcheck/MongoHealthCheck.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/healthcheck/MongoHealthCheck.java
new file mode 100644
index 0000000..20c049b
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/healthcheck/MongoHealthCheck.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.healthcheck;
+
+import com.codahale.metrics.health.HealthCheck;
+import com.epam.datalab.mongo.MongoService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class MongoHealthCheck extends HealthCheck {
+    private final MongoService mongoService;
+
+    @Inject
+    public MongoHealthCheck(MongoService mongoService) {
+        this.mongoService = mongoService;
+    }
+
+    @Override
+    protected Result check() {
+        try {
+            mongoService.ping();
+        } catch (Exception e) {
+            log.error("Mongo is unavailable {}", e.getMessage(), e);
+            return Result.unhealthy(e.getMessage());
+        }
+        return Result.healthy();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/interceptor/AuditInterceptor.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/interceptor/AuditInterceptor.java
new file mode 100644
index 0000000..94a7068
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/interceptor/AuditInterceptor.java
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.interceptor;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.Audit;
+import com.epam.datalab.backendapi.annotation.Info;
+import com.epam.datalab.backendapi.annotation.Project;
+import com.epam.datalab.backendapi.annotation.ResourceName;
+import com.epam.datalab.backendapi.annotation.User;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.domain.AuditActionEnum;
+import com.epam.datalab.backendapi.domain.AuditDTO;
+import com.epam.datalab.backendapi.domain.AuditResourceTypeEnum;
+import com.epam.datalab.backendapi.service.AuditService;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+import org.apache.commons.lang3.StringUtils;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.util.Objects;
+import java.util.stream.IntStream;
+
+@Slf4j
+public class AuditInterceptor implements MethodInterceptor {
+    @Inject
+    private AuditService auditService;
+    @Inject
+    private SelfServiceApplicationConfiguration configuration;
+
+    @Override
+    public Object invoke(MethodInvocation mi) throws Throwable {
+        if (configuration.isAuditEnabled()) {
+            Method method = mi.getMethod();
+            final Parameter[] parameters = mi.getMethod().getParameters();
+            final String user = getUserInfo(mi, parameters);
+            final AuditActionEnum action = getAuditAction(method);
+            final AuditResourceTypeEnum resourceType = getResourceType(method);
+            final String project = getProject(mi, parameters);
+            final String resourceName = getResourceName(mi, parameters);
+            final String auditInfo = getInfo(mi, parameters);
+
+            AuditDTO auditCreateDTO = AuditDTO.builder()
+                    .user(user)
+                    .action(action)
+                    .type(resourceType)
+                    .project(project)
+                    .resourceName(resourceName)
+                    .info(auditInfo)
+                    .build();
+            auditService.save(auditCreateDTO);
+        }
+        return mi.proceed();
+    }
+
+    private String getUserInfo(MethodInvocation mi, Parameter[] parameters) {
+        return IntStream.range(0, parameters.length)
+                .filter(i -> Objects.nonNull(parameters[i].getAnnotation(User.class)))
+                .mapToObj(i -> ((UserInfo) mi.getArguments()[i]).getName())
+                .findAny()
+                .orElseThrow(() -> new DatalabException("UserInfo parameter wanted!"));
+    }
+
+    private AuditActionEnum getAuditAction(Method method) {
+        Annotation[] declaredAnnotations = method.getDeclaredAnnotations();
+        return IntStream.range(0, method.getDeclaredAnnotations().length)
+                .filter(i -> declaredAnnotations[i] instanceof Audit)
+                .mapToObj(i -> ((Audit) declaredAnnotations[i]).action())
+                .findAny()
+                .orElseThrow(() -> new DatalabException("'Audit' annotation wanted!"));
+    }
+
+    private AuditResourceTypeEnum getResourceType(Method method) {
+        Annotation[] declaredAnnotations = method.getDeclaredAnnotations();
+        return IntStream.range(0, method.getDeclaredAnnotations().length)
+                .filter(i -> declaredAnnotations[i] instanceof Audit)
+                .mapToObj(i -> ((Audit) declaredAnnotations[i]).type())
+                .findAny()
+                .orElseThrow(() -> new DatalabException("'Audit' annotation wanted!"));
+    }
+
+    private String getProject(MethodInvocation mi, Parameter[] parameters) {
+        return IntStream.range(0, parameters.length)
+                .filter(i -> Objects.nonNull(parameters[i].getAnnotation(Project.class)))
+                .mapToObj(i -> (String) mi.getArguments()[i])
+                .findAny()
+                .orElse(StringUtils.EMPTY);
+    }
+
+    private String getResourceName(MethodInvocation mi, Parameter[] parameters) {
+        return IntStream.range(0, parameters.length)
+                .filter(i -> Objects.nonNull(parameters[i].getAnnotation(ResourceName.class)))
+                .mapToObj(i -> (String) mi.getArguments()[i])
+                .findAny()
+                .orElse(StringUtils.EMPTY);
+    }
+
+    private String getInfo(MethodInvocation mi, Parameter[] parameters) {
+        return IntStream.range(0, parameters.length)
+                .filter(i -> Objects.nonNull(parameters[i].getAnnotation(Info.class)) && Objects.nonNull(mi.getArguments()[i]))
+                .mapToObj(i -> (String) mi.getArguments()[i])
+                .findAny()
+                .orElse(StringUtils.EMPTY);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/interceptor/BudgetLimitInterceptor.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/interceptor/BudgetLimitInterceptor.java
new file mode 100644
index 0000000..421d37d
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/interceptor/BudgetLimitInterceptor.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.interceptor;
+
+import com.epam.datalab.backendapi.annotation.Project;
+import com.epam.datalab.backendapi.dao.BillingDAO;
+import com.epam.datalab.backendapi.service.BillingService;
+import com.epam.datalab.exceptions.ResourceQuoteReachedException;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.util.Objects;
+import java.util.stream.IntStream;
+
+@Slf4j
+public class BudgetLimitInterceptor implements MethodInterceptor {
+    @Inject
+    private BillingDAO billingDAO;
+    @Inject
+    private BillingService billingService;
+
+    @Override
+    public Object invoke(MethodInvocation mi) throws Throwable {
+        if (projectQuoteReached(mi) || billingDAO.isBillingQuoteReached()) {
+            final Method method = mi.getMethod();
+            log.warn("Execution of method {} failed because of reaching resource limit quote", method.getName());
+            throw new ResourceQuoteReachedException("Operation can not be finished. Resource quote is reached");
+        } else {
+            return mi.proceed();
+        }
+    }
+
+    private Boolean projectQuoteReached(MethodInvocation mi) {
+
+        final Parameter[] parameters = mi.getMethod().getParameters();
+        return IntStream.range(0, parameters.length)
+                .filter(i -> Objects.nonNull(parameters[i].getAnnotation(Project.class)))
+                .mapToObj(i -> (String) mi.getArguments()[i])
+                .findAny()
+                .map(billingService::isProjectQuoteReached)
+                .orElse(Boolean.FALSE);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/interceptor/ProjectAdminInterceptor.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/interceptor/ProjectAdminInterceptor.java
new file mode 100644
index 0000000..f978153
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/interceptor/ProjectAdminInterceptor.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.interceptor;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.Project;
+import com.epam.datalab.backendapi.annotation.User;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceQuoteReachedException;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.util.Objects;
+import java.util.stream.IntStream;
+
+@Slf4j
+public class ProjectAdminInterceptor implements MethodInterceptor {
+    @Inject
+    private ProjectService projectService;
+
+    @Override
+    public Object invoke(MethodInvocation mi) throws Throwable {
+        if (grantAccess(mi)) {
+            return mi.proceed();
+        } else {
+            final Method method = mi.getMethod();
+            log.warn("Execution of method {} failed because user doesn't have appropriate permission", method.getName());
+            throw new ResourceQuoteReachedException("Operation can not be finished. User doesn't have appropriate permission");
+        }
+    }
+
+    private boolean grantAccess(MethodInvocation mi) {
+        final Parameter[] parameters = mi.getMethod().getParameters();
+        String project = IntStream.range(0, parameters.length)
+                .filter(i -> Objects.nonNull(parameters[i].getAnnotation(Project.class)))
+                .mapToObj(i -> (String) mi.getArguments()[i])
+                .findAny()
+                .orElseThrow(() -> new DatalabException("Project parameter wanted!"));
+        UserInfo userInfo = IntStream.range(0, parameters.length)
+                .filter(i -> Objects.nonNull(parameters[i].getAnnotation(User.class)))
+                .mapToObj(i -> (UserInfo) mi.getArguments()[i])
+                .findAny()
+                .orElseThrow(() -> new DatalabException("UserInfo parameter wanted!"));
+
+        return checkPermission(userInfo, project);
+    }
+
+    private boolean checkPermission(UserInfo userInfo, String project) {
+        return UserRoles.isAdmin(userInfo) || UserRoles.isProjectAdmin(userInfo, projectService.get(project).getGroups());
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/CloudProviderModule.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/CloudProviderModule.java
new file mode 100644
index 0000000..bc261ed
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/CloudProviderModule.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.modules;
+
+import com.epam.datalab.backendapi.SelfServiceApplication;
+import com.epam.datalab.backendapi.annotation.Audit;
+import com.epam.datalab.backendapi.annotation.BudgetLimited;
+import com.epam.datalab.backendapi.annotation.ProjectAdmin;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.interceptor.AuditInterceptor;
+import com.epam.datalab.backendapi.interceptor.BudgetLimitInterceptor;
+import com.epam.datalab.backendapi.interceptor.ProjectAdminInterceptor;
+import com.epam.datalab.backendapi.resources.BillingResource;
+import com.epam.datalab.backendapi.resources.BucketResource;
+import com.epam.datalab.backendapi.resources.aws.ComputationalResourceAws;
+import com.epam.datalab.backendapi.resources.azure.ComputationalResourceAzure;
+import com.epam.datalab.backendapi.resources.gcp.ComputationalResourceGcp;
+import com.epam.datalab.backendapi.resources.gcp.GcpOauthResource;
+import com.epam.datalab.backendapi.service.BillingService;
+import com.epam.datalab.backendapi.service.InfrastructureInfoService;
+import com.epam.datalab.backendapi.service.InfrastructureTemplateService;
+import com.epam.datalab.backendapi.service.impl.BillingServiceImpl;
+import com.epam.datalab.backendapi.service.impl.InfrastructureInfoServiceImpl;
+import com.epam.datalab.backendapi.service.impl.InfrastructureTemplateServiceImpl;
+import com.epam.datalab.cloud.CloudModule;
+import com.epam.datalab.mongo.MongoServiceFactory;
+import com.fiestacabin.dropwizard.quartz.SchedulerConfiguration;
+import com.google.inject.Injector;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import io.dropwizard.setup.Environment;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.quartz.impl.StdSchedulerFactory;
+
+import static com.google.inject.matcher.Matchers.annotatedWith;
+import static com.google.inject.matcher.Matchers.any;
+
+public class CloudProviderModule extends CloudModule {
+
+    private static final String MONGO_URI_FORMAT = "mongodb://%s:%s@%s:%d/%s";
+    private static final String QUARTZ_MONGO_URI_PROPERTY = "org.quartz.jobStore.mongoUri";
+    private static final String QUARTZ_DB_NAME = "org.quartz.jobStore.dbName";
+
+    private SelfServiceApplicationConfiguration configuration;
+
+    public CloudProviderModule(SelfServiceApplicationConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    @Override
+    protected void configure() {
+        bind(BillingService.class).to(BillingServiceImpl.class);
+        bind(InfrastructureInfoService.class).to(InfrastructureInfoServiceImpl.class);
+        bind(InfrastructureTemplateService.class).to(InfrastructureTemplateServiceImpl.class);
+        bind(SchedulerConfiguration.class).toInstance(
+                new SchedulerConfiguration(SelfServiceApplication.class.getPackage().getName()));
+
+        final BudgetLimitInterceptor budgetLimitInterceptor = new BudgetLimitInterceptor();
+        requestInjection(budgetLimitInterceptor);
+        bindInterceptor(any(), annotatedWith(BudgetLimited.class), budgetLimitInterceptor);
+        final ProjectAdminInterceptor projectAdminInterceptor = new ProjectAdminInterceptor();
+        requestInjection(projectAdminInterceptor);
+        bindInterceptor(any(), annotatedWith(ProjectAdmin.class), projectAdminInterceptor);
+        if (configuration.isAuditEnabled()) {
+            final AuditInterceptor auditInterceptor = new AuditInterceptor();
+            requestInjection(auditInterceptor);
+            bindInterceptor(any(), annotatedWith(Audit.class), auditInterceptor);
+        }
+    }
+
+    @Override
+    public void init(Environment environment, Injector injector) {
+        environment.jersey().register(injector.getInstance(BillingResource.class));
+        environment.jersey().register(injector.getInstance(ComputationalResourceAws.class));
+        environment.jersey().register(injector.getInstance(ComputationalResourceAzure.class));
+        environment.jersey().register(injector.getInstance(ComputationalResourceGcp.class));
+        environment.jersey().register(injector.getInstance(BucketResource.class));
+        if (injector.getInstance(SelfServiceApplicationConfiguration.class).isGcpOuauth2AuthenticationEnabled()) {
+            environment.jersey().register(injector.getInstance(GcpOauthResource.class));
+        }
+    }
+
+    @Provides
+    @Singleton
+    Scheduler provideScheduler(SelfServiceApplicationConfiguration configuration) throws SchedulerException {
+        final MongoServiceFactory mongoFactory = configuration.getMongoFactory();
+        final String database = mongoFactory.getDatabase();
+        final String mongoUri = String.format(MONGO_URI_FORMAT, mongoFactory.getUsername(), mongoFactory.getPassword(),
+                mongoFactory.getHost(), mongoFactory.getPort(), database);
+        System.setProperty(QUARTZ_MONGO_URI_PROPERTY, mongoUri);
+        System.setProperty(QUARTZ_DB_NAME, database);
+        return StdSchedulerFactory.getDefaultScheduler();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/DevModule.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/DevModule.java
new file mode 100644
index 0000000..6da6ee7
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/DevModule.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.modules;
+
+import com.epam.datalab.ModuleBase;
+import com.epam.datalab.auth.contract.SecurityAPI;
+import com.epam.datalab.backendapi.auth.SelfServiceSecurityAuthorizer;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.*;
+import com.epam.datalab.backendapi.service.*;
+import com.epam.datalab.backendapi.service.impl.*;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.mongo.MongoService;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.DockerAPI;
+import com.google.inject.name.Names;
+import io.dropwizard.auth.Authorizer;
+import io.dropwizard.client.JerseyClientBuilder;
+import io.dropwizard.setup.Environment;
+import org.eclipse.jetty.servlets.CrossOriginFilter;
+import org.glassfish.jersey.logging.LoggingFeature;
+
+import javax.servlet.DispatcherType;
+import javax.servlet.FilterRegistration;
+import javax.ws.rs.client.Client;
+import java.util.EnumSet;
+
+/**
+ * Mock class for an application configuration of SelfService for developer mode.
+ */
+public class DevModule extends ModuleBase<SelfServiceApplicationConfiguration> implements SecurityAPI, DockerAPI {
+
+    public static final String TOKEN = "token123";
+
+    /**
+     * Instantiates an application configuration of SelfService for developer mode.
+     *
+     * @param configuration application configuration of SelfService.
+     * @param environment   environment of SelfService.
+     */
+    DevModule(SelfServiceApplicationConfiguration configuration, Environment environment) {
+        super(configuration, environment);
+    }
+
+    @Override
+    protected void configure() {
+        configureCors(environment);
+        final Client httpClient =
+                new JerseyClientBuilder(environment)
+                        .using(configuration.getJerseyClientConfiguration())
+                        .build("httpClient")
+                        .register(new LoggingFeature());
+        bind(SecurityService.class).to(SecurityServiceImpl.class);
+        bind(KeycloakService.class).to(KeycloakServiceImpl.class);
+        bind(Client.class).toInstance(httpClient);
+        bind(SelfServiceApplicationConfiguration.class).toInstance(configuration);
+        bind(MongoService.class).toInstance(configuration.getMongoFactory().build(environment));
+        bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.PROVISIONING_SERVICE_NAME))
+                .toInstance(configuration.getProvisioningFactory()
+                        .build(environment, ServiceConsts.PROVISIONING_SERVICE_NAME));
+        bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.BUCKET_SERVICE_NAME))
+                .toInstance(configuration.getBucketFactory()
+                        .build(environment, ServiceConsts.BUCKET_SERVICE_NAME));
+        bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.BILLING_SERVICE_NAME))
+                .toInstance(configuration.getBillingFactory()
+                        .build(environment, ServiceConsts.BILLING_SERVICE_NAME));
+        bind(ImageExploratoryService.class).to(ImageExploratoryServiceImpl.class);
+        bind(ImageExploratoryDAO.class).to(ImageExploratoryDAOImpl.class);
+        bind(BackupService.class).to(BackupServiceImpl.class);
+        bind(BackupDAO.class).to(BackupDAOImpl.class);
+        bind(ExploratoryService.class).to(ExploratoryServiceImpl.class);
+        bind(TagService.class).to(TagServiceImpl.class);
+        bind(InactivityService.class).to(InactivityServiceImpl.class);
+        bind(Authorizer.class).to(SelfServiceSecurityAuthorizer.class);
+        bind(AccessKeyService.class).to(AccessKeyServiceImpl.class);
+        bind(GitCredentialService.class).to(GitCredentialServiceImpl.class);
+        bind(ComputationalService.class).to(ComputationalServiceImpl.class);
+        bind(LibraryService.class).to(LibraryServiceImpl.class);
+        bind(SchedulerJobService.class).to(SchedulerJobServiceImpl.class);
+        bind(EnvironmentService.class).to(EnvironmentServiceImpl.class);
+        bind(ReuploadKeyService.class).to(ReuploadKeyServiceImpl.class);
+        bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.MAVEN_SEARCH_API))
+                .toInstance(configuration.getMavenApiFactory().build(environment, ServiceConsts.MAVEN_SEARCH_API));
+
+        bind(ExternalLibraryService.class).to(MavenCentralLibraryService.class);
+        bind(SystemInfoService.class).to(SystemInfoServiceImpl.class);
+        bind(UserGroupService.class).to(UserGroupServiceImpl.class);
+        bind(UserRoleService.class).to(UserRoleServiceImpl.class);
+        bind(UserRoleDAO.class).to(UserRoleDAOImpl.class);
+        bind(UserGroupDAO.class).to(UserGroupDAOImpl.class);
+        bind(ApplicationSettingService.class).to(ApplicationSettingServiceImpl.class);
+        bind(UserSettingService.class).to(UserSettingServiceImpl.class);
+        bind(GuacamoleService.class).to(GuacamoleServiceImpl.class);
+        bind(EndpointService.class).to(EndpointServiceImpl.class);
+        bind(EndpointDAO.class).to(EndpointDAOImpl.class);
+        bind(ProjectService.class).to(ProjectServiceImpl.class);
+        bind(AuditService.class).to(AuditServiceImpl.class);
+        bind(ProjectDAO.class).to(ProjectDAOImpl.class);
+        bind(GpuDAO.class).to(GpuDAOImpl.class);
+        bind(OdahuDAO.class).to(OdahuDAOImpl.class);
+        bind(OdahuService.class).to(OdahuServiceImpl.class);
+        bind(BillingDAO.class).to(BaseBillingDAO.class);
+        bind(AuditDAO.class).to(AuditDAOImpl.class);
+        bind(BucketService.class).to(BucketServiceImpl.class);
+    }
+
+    private void configureCors(Environment environment) {
+        final FilterRegistration.Dynamic cors =
+                environment.servlets().addFilter("CORS", CrossOriginFilter.class);
+
+        cors.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
+        cors.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin," +
+                "Authorization");
+        cors.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "OPTIONS,GET,PUT,POST,DELETE,HEAD");
+        cors.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM, "true");
+
+        cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
+
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ModuleFactory.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ModuleFactory.java
new file mode 100644
index 0000000..ce1213a
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ModuleFactory.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.modules;
+
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.cloud.CloudModule;
+import com.google.inject.AbstractModule;
+import io.dropwizard.setup.Environment;
+
+public class ModuleFactory {
+
+    private ModuleFactory() {
+    }
+
+    /**
+     * Instantiates an application configuration of SelfService for production or tests if
+     * the mock property of configuration is set to <b>true</b> and method
+     * {@link SelfServiceApplicationConfiguration#isMocked()}
+     * returns <b>true</b> value.
+     *
+     * @param configuration application configuration of SelfService.
+     * @param environment   environment of SelfService.
+     */
+    public static AbstractModule getModule(SelfServiceApplicationConfiguration configuration, Environment
+            environment) {
+        return configuration.isDevMode()
+                ? new DevModule(configuration, environment)
+                : new ProductionModule(configuration, environment);
+    }
+
+    public static CloudModule getCloudProviderModule(SelfServiceApplicationConfiguration configuration) {
+        return new CloudProviderModule(configuration);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ProductionModule.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ProductionModule.java
new file mode 100644
index 0000000..15df056
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/modules/ProductionModule.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.modules;
+
+import com.epam.datalab.ModuleBase;
+import com.epam.datalab.backendapi.auth.SelfServiceSecurityAuthorizer;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.*;
+import com.epam.datalab.backendapi.service.*;
+import com.epam.datalab.backendapi.service.impl.*;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.mongo.MongoService;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.name.Names;
+import io.dropwizard.auth.Authorizer;
+import io.dropwizard.client.JerseyClientBuilder;
+import io.dropwizard.setup.Environment;
+import org.glassfish.jersey.logging.LoggingFeature;
+
+import javax.ws.rs.client.Client;
+
+/**
+ * Production class for an application configuration of SelfService.
+ */
+public class ProductionModule extends ModuleBase<SelfServiceApplicationConfiguration> {
+
+    /**
+     * Instantiates an application configuration of SelfService for production environment.
+     *
+     * @param configuration application configuration of SelfService.
+     * @param environment   environment of SelfService.
+     */
+    public ProductionModule(SelfServiceApplicationConfiguration configuration, Environment environment) {
+        super(configuration, environment);
+    }
+
+    @Override
+    protected void configure() {
+        final Client httpClient =
+                new JerseyClientBuilder(environment)
+                        .using(configuration.getJerseyClientConfiguration())
+                        .build("httpClient")
+                        .register(new LoggingFeature());
+        bind(SelfServiceApplicationConfiguration.class).toInstance(configuration);
+        bind(MongoService.class).toInstance(configuration.getMongoFactory().build(environment));
+        bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.SECURITY_SERVICE_NAME))
+                .toInstance(configuration.getSecurityFactory().build(environment, ServiceConsts
+                        .SECURITY_SERVICE_NAME));
+        bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.PROVISIONING_SERVICE_NAME))
+                .toInstance(configuration.getProvisioningFactory().build(environment, ServiceConsts
+                        .PROVISIONING_SERVICE_NAME));
+        bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.BUCKET_SERVICE_NAME))
+                .toInstance(configuration.getBucketFactory().build(environment, ServiceConsts
+                        .BUCKET_SERVICE_NAME));
+        bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.BILLING_SERVICE_NAME))
+                .toInstance(configuration.getBillingFactory()
+                        .build(environment, ServiceConsts.BILLING_SERVICE_NAME));
+        bind(ImageExploratoryService.class).to(ImageExploratoryServiceImpl.class);
+        bind(ImageExploratoryDAO.class).to(ImageExploratoryDAOImpl.class);
+        bind(BackupService.class).to(BackupServiceImpl.class);
+        bind(BackupDAO.class).to(BackupDAOImpl.class);
+        bind(ExploratoryService.class).to(ExploratoryServiceImpl.class);
+        bind(Authorizer.class).to(SelfServiceSecurityAuthorizer.class);
+        bind(AccessKeyService.class).to(AccessKeyServiceImpl.class);
+        bind(GitCredentialService.class).to(GitCredentialServiceImpl.class);
+        bind(ComputationalService.class).to(ComputationalServiceImpl.class);
+        bind(LibraryService.class).to(LibraryServiceImpl.class);
+        bind(SchedulerJobService.class).to(SchedulerJobServiceImpl.class);
+        bind(EnvironmentService.class).to(EnvironmentServiceImpl.class);
+        bind(ReuploadKeyService.class).to(ReuploadKeyServiceImpl.class);
+        bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.MAVEN_SEARCH_API))
+                .toInstance(configuration.getMavenApiFactory().build(environment, ServiceConsts.MAVEN_SEARCH_API));
+        bind(ExternalLibraryService.class).to(MavenCentralLibraryService.class);
+        bind(SystemInfoService.class).to(SystemInfoServiceImpl.class);
+        bind(UserGroupService.class).to(UserGroupServiceImpl.class);
+        bind(UserRoleService.class).to(UserRoleServiceImpl.class);
+        bind(UserRoleDAO.class).to(UserRoleDAOImpl.class);
+        bind(UserGroupDAO.class).to(UserGroupDAOImpl.class);
+        bind(InactivityService.class).to(InactivityServiceImpl.class);
+        bind(ApplicationSettingService.class).to(ApplicationSettingServiceImpl.class);
+        bind(UserSettingService.class).to(UserSettingServiceImpl.class);
+        bind(GuacamoleService.class).to(GuacamoleServiceImpl.class);
+        bind(EndpointService.class).to(EndpointServiceImpl.class);
+        bind(EndpointDAO.class).to(EndpointDAOImpl.class);
+        bind(ProjectService.class).to(ProjectServiceImpl.class);
+        bind(AuditService.class).to(AuditServiceImpl.class);
+        bind(ProjectDAO.class).to(ProjectDAOImpl.class);
+        bind(GpuDAO.class).to(GpuDAOImpl.class);
+        bind(OdahuDAO.class).to(OdahuDAOImpl.class);
+        bind(OdahuService.class).to(OdahuServiceImpl.class);
+        bind(BillingDAO.class).to(BaseBillingDAO.class);
+        bind(AuditDAO.class).to(AuditDAOImpl.class);
+        bind(BucketService.class).to(BucketServiceImpl.class);
+        bind(TagService.class).to(TagServiceImpl.class);
+        bind(SecurityService.class).to(SecurityServiceImpl.class);
+        bind(KeycloakService.class).to(KeycloakServiceImpl.class);
+        bind(Client.class).toInstance(httpClient);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ApplicationSettingResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ApplicationSettingResource.java
new file mode 100644
index 0000000..40362bc
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ApplicationSettingResource.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.ApplicationSettingService;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.security.RolesAllowed;
+import javax.validation.constraints.Min;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Slf4j
+@Path("/settings")
+@RolesAllowed("/api/settings")
+public class ApplicationSettingResource {
+
+
+    private final ApplicationSettingService settingService;
+
+    @Inject
+    public ApplicationSettingResource(ApplicationSettingService settingService) {
+        this.settingService = settingService;
+    }
+
+    @PUT
+    @Path("budget/{maxBudgetAllowed}")
+    public Response setMaxBudget(@Auth UserInfo userInfo,
+                                 @PathParam("maxBudgetAllowed") @Min(1) Long maxBudget) {
+        settingService.setMaxBudget(maxBudget);
+        return Response.noContent().build();
+    }
+
+    @DELETE
+    @Path("budget")
+    public Response removeAllowedBudget(@Auth UserInfo userInfo) {
+        log.debug("User {} is removing max budget application setting", userInfo.getName());
+        settingService.removeMaxBudget();
+        return Response.noContent().build();
+    }
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getSettings(@Auth UserInfo userInfo) {
+        return Response.ok(settingService.getSettings()).build();
+
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/AuditResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/AuditResource.java
new file mode 100644
index 0000000..aa04fd0
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/AuditResource.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.AuditCreateDTO;
+import com.epam.datalab.backendapi.service.AuditService;
+import com.epam.datalab.model.StringList;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+
+import javax.validation.Valid;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("/audit")
+public class AuditResource {
+    private final AuditService auditService;
+
+    @Inject
+    public AuditResource(AuditService auditService) {
+        this.auditService = auditService;
+    }
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response saveAudit(@Auth UserInfo userInfo, @Valid AuditCreateDTO auditCreateDTO) {
+        auditService.save(userInfo.getName(), auditCreateDTO);
+        return Response.ok().build();
+    }
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getAudit(@Auth UserInfo userInfo,
+                             @QueryParam("users") StringList users,
+                             @QueryParam("projects") StringList projects,
+                             @QueryParam("resource-names") StringList resourceNames,
+                             @QueryParam("resource-types") StringList resourceTypes,
+                             @QueryParam("date-start") String dateStart,
+                             @QueryParam("date-end") String dateEnd,
+                             @QueryParam("page-number") int pageNumber,
+                             @QueryParam("page-size") int pageSize) {
+        return Response
+                .ok(auditService.getAudit(users, projects, resourceNames, resourceTypes, dateStart, dateEnd, pageNumber, pageSize))
+                .build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/BackupResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/BackupResource.java
new file mode 100644
index 0000000..5d60ddb
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/BackupResource.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.resources.dto.BackupFormDTO;
+import com.epam.datalab.backendapi.service.BackupService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.dto.backup.EnvBackupDTO;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.security.RolesAllowed;
+import javax.validation.Valid;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.UUID;
+
+
+@Slf4j
+@Path("/infrastructure/backup")
+@RolesAllowed("/api/infrastructure/backup")
+public class BackupResource {
+
+    private final BackupService backupService;
+    private final RequestBuilder requestBuilder;
+    private final RequestId requestId;
+
+    @Inject
+    public BackupResource(BackupService backupService, RequestBuilder requestBuilder, RequestId requestId) {
+        this.backupService = backupService;
+        this.requestBuilder = requestBuilder;
+        this.requestId = requestId;
+    }
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.TEXT_PLAIN)
+    public Response createBackup(@Auth UserInfo userInfo,
+                                 @Valid BackupFormDTO backupFormDTO) {
+        log.debug("Creating backup for user {} with parameters {}", userInfo.getName(), backupFormDTO);
+        final EnvBackupDTO dto = requestBuilder.newBackupCreate(backupFormDTO, UUID.randomUUID().toString());
+        final String uuid = backupService.createBackup(dto, userInfo);
+        requestId.put(userInfo.getName(), uuid);
+        return Response.accepted(uuid).build();
+    }
+
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getBackups(@Auth UserInfo userInfo) {
+        log.debug("Getting backups for user {}", userInfo.getName());
+        return Response.ok(backupService.getBackups(userInfo.getName())).build();
+    }
+
+    @GET
+    @Path("{id}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getBackup(@Auth UserInfo userInfo,
+                              @PathParam("id") String id) {
+        log.debug("Getting backup with id {} for user {}", id, userInfo.getName());
+        return Response.ok(backupService.getBackup(userInfo.getName(), id)).build();
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/BillingResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/BillingResource.java
new file mode 100644
index 0000000..e29aa8f
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/BillingResource.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.BillingFilter;
+import com.epam.datalab.backendapi.resources.dto.ExportBillingFilter;
+import com.epam.datalab.backendapi.service.BillingService;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("/billing")
+@Consumes(MediaType.APPLICATION_JSON)
+public class BillingResource {
+
+    private final BillingService billingService;
+
+    @Inject
+    public BillingResource(BillingService billingService) {
+        this.billingService = billingService;
+    }
+
+    @GET
+    @Path("/quota")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getQuota(@Auth UserInfo userInfo) {
+        return Response.ok(billingService.getQuotas(userInfo)).build();
+    }
+
+    @POST
+    @Path("/report")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getBillingReport(@Auth UserInfo userInfo, @Valid @NotNull BillingFilter filter) {
+        return Response.ok(billingService.getBillingReport(userInfo, filter)).build();
+    }
+
+    @POST
+    @Path("/report/download")
+    @Produces(MediaType.APPLICATION_OCTET_STREAM)
+    public Response downloadBillingReport(@Auth UserInfo userInfo, @Valid @NotNull ExportBillingFilter filter) {
+        return Response.ok(billingService.downloadReport(userInfo, filter, filter.getLocale()))
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"billing-report.csv\"")
+                .build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/BucketResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/BucketResource.java
new file mode 100644
index 0000000..26494a0
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/BucketResource.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.BucketDeleteDTO;
+import com.epam.datalab.backendapi.resources.dto.FolderUploadDTO;
+import com.epam.datalab.backendapi.service.BucketService;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.fileupload.FileItemIterator;
+import org.apache.commons.fileupload.FileItemStream;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.fileupload.util.Streams;
+
+import javax.annotation.security.RolesAllowed;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+import java.nio.file.Paths;
+
+@Path("/bucket")
+@Slf4j
+public class BucketResource {
+    private static final String AUDIT_FOLDER_UPLOAD_MESSAGE = "Upload folder: %s";
+    private static final String AUDIT_FILE_UPLOAD_MESSAGE = "Upload file: %s";
+    private static final String AUDIT_FILE_DOWNLOAD_MESSAGE = "Download file: %s";
+    private static final String AUDIT_FILE_DELETE_MESSAGE = "Delete file: %s";
+    private static final String OBJECT_FORM_FIELD = "object";
+    private static final String BUCKET_FORM_FIELD = "bucket";
+    private static final String ENDPOINT_FORM_FIELD = "endpoint";
+    private static final String SIZE_FORM_FIELD = "size";
+
+    private final BucketService bucketService;
+
+    @Inject
+    public BucketResource(BucketService bucketService) {
+        this.bucketService = bucketService;
+    }
+
+    @GET
+    @Path("/{bucket}/endpoint/{endpoint}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/bucket/view")
+    public Response getListOfObjects(@Auth UserInfo userInfo,
+                                     @PathParam("bucket") String bucket,
+                                     @PathParam("endpoint") String endpoint) {
+        return Response.ok(bucketService.getObjects(userInfo, bucket, endpoint)).build();
+    }
+
+    @POST
+    @Path("/upload")
+    @Consumes(MediaType.MULTIPART_FORM_DATA)
+    @Produces(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/bucket/upload")
+    public Response uploadObject(@Auth UserInfo userInfo, @Context HttpServletRequest request) {
+        upload(userInfo, request);
+        return Response.ok().build();
+    }
+
+    @POST
+    @Path("/folder/upload")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/bucket/upload")
+    public Response uploadFolder(@Auth UserInfo userInfo, @Valid FolderUploadDTO dto) {
+        bucketService.uploadFolder(userInfo, dto.getBucket(), dto.getFolder(), dto.getEndpoint(), String.format(AUDIT_FOLDER_UPLOAD_MESSAGE, dto.getFolder()));
+        return Response.ok().build();
+    }
+
+    @GET
+    @Path("/{bucket}/object/{object}/endpoint/{endpoint}/download")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_OCTET_STREAM)
+    @RolesAllowed("/api/bucket/download")
+    public Response downloadObject(@Auth UserInfo userInfo, @Context HttpServletResponse resp,
+                                   @PathParam("bucket") String bucket,
+                                   @PathParam("object") String object,
+                                   @PathParam("endpoint") String endpoint) {
+        bucketService.downloadObject(userInfo, bucket, object, endpoint, resp, String.format(AUDIT_FILE_DOWNLOAD_MESSAGE, object));
+        return Response.ok()
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + Paths.get(object).getFileName() + "\"")
+                .build();
+    }
+
+    @POST
+    @Path("/objects/delete")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/bucket/delete")
+    public Response deleteObject(@Auth UserInfo userInfo, @Valid BucketDeleteDTO bucketDto) {
+        final String listOfDeletedObject = String.join(", ", bucketDto.getObjects());
+        bucketService.deleteObjects(userInfo, bucketDto.getBucket(), bucketDto.getObjects(), bucketDto.getEndpoint(), String.format(AUDIT_FILE_DELETE_MESSAGE, listOfDeletedObject));
+        return Response.ok().build();
+    }
+
+    private void upload(UserInfo userInfo, HttpServletRequest request) {
+        String object = null;
+        String bucket = null;
+        String endpoint = null;
+        long fileSize = 0;
+
+        ServletFileUpload upload = new ServletFileUpload();
+        try {
+            FileItemIterator iterStream = upload.getItemIterator(request);
+            while (iterStream.hasNext()) {
+                FileItemStream item = iterStream.next();
+                try (InputStream stream = item.openStream()) {
+                    if (item.isFormField()) {
+                        if (OBJECT_FORM_FIELD.equals(item.getFieldName())) {
+                            object = Streams.asString(stream);
+                        } else if (BUCKET_FORM_FIELD.equals(item.getFieldName())) {
+                            bucket = Streams.asString(stream);
+                        } else if (ENDPOINT_FORM_FIELD.equals(item.getFieldName())) {
+                            endpoint = Streams.asString(stream);
+                        } else if (SIZE_FORM_FIELD.equals(item.getFieldName())) {
+                            fileSize = Long.parseLong(Streams.asString(stream));
+                        }
+                    } else {
+                        bucketService.uploadObject(userInfo, bucket, object, endpoint, stream, item.getContentType(), fileSize, String.format(AUDIT_FILE_UPLOAD_MESSAGE, object));
+                    }
+                } catch (Exception e) {
+                    log.error("Cannot upload object {} to bucket {}. {}", object, bucket, e.getMessage(), e);
+                    throw new DatalabException(String.format("Cannot upload object %s to bucket %s. %s", object, bucket, e.getMessage()));
+                }
+            }
+        } catch (Exception e) {
+            log.error("User {} cannot upload object {} to bucket {}. {}", userInfo.getName(), object, bucket, e.getMessage(), e);
+            throw new DatalabException(String.format("User %s cannot upload object %s to bucket %s. %s", userInfo.getName(), object, bucket, e.getMessage()));
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java
new file mode 100644
index 0000000..048b099
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ChangePropertiesResource.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.EndpointDAO;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.properties.ChangePropertiesConst;
+import com.epam.datalab.properties.ExternalChangeProperties;
+import com.epam.datalab.properties.RestartForm;
+import com.epam.datalab.properties.YmlDTO;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.inject.Inject;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("/config")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ChangePropertiesResource implements ChangePropertiesConst {
+
+    private final EndpointDAO endpointDAO;
+    private final ExternalChangeProperties externalChangeProperties;
+    private final String deployedOn;
+
+    @Inject
+    public ChangePropertiesResource(EndpointDAO endpointDAO, ExternalChangeProperties externalChangeProperties,
+                                    SelfServiceApplicationConfiguration selfServiceApplicationConfiguration) {
+        this.endpointDAO = endpointDAO;
+        this.externalChangeProperties = externalChangeProperties;
+        deployedOn = selfServiceApplicationConfiguration.getDeployed();
+    }
+
+    @GET
+    @Path("/multiple")
+    public Response getAllPropertiesForEndpoint(@Auth UserInfo userInfo, @QueryParam("endpoint") String endpoint) {
+        if (UserRoles.isAdmin(userInfo)) {
+            String url = findEndpointDTOUrl(endpoint) + ChangePropertiesConst.BASE_CONFIG_URL;
+            return Response
+                    .ok(externalChangeProperties.getPropertiesWithExternal(endpoint, userInfo, url))
+                    .build();
+        } else {
+            return Response
+                    .status(Response.Status.FORBIDDEN)
+                    .build();
+        }
+    }
+
+    @POST
+    @Path("/multiple/self-service")
+    public Response overwriteExternalSelfServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
+        if (UserRoles.isAdmin(userInfo)) {
+            if (deployedOn.equals("GKE")) {
+                externalChangeProperties.overwritePropertiesWithExternal(GKE_SELF_SERVICE_PATH, GKE_SELF_SERVICE,
+                        ymlDTO, userInfo, null);
+            } else {
+                externalChangeProperties.overwritePropertiesWithExternal(SELF_SERVICE_PROP_PATH, SELF_SERVICE,
+                        ymlDTO, userInfo, null);
+            }
+            return Response.status(Response.Status.OK).build();
+        } else {
+            return Response
+                    .status(Response.Status.FORBIDDEN)
+                    .build();
+        }
+    }
+
+    @POST
+    @Path("/multiple/provisioning-service")
+    public Response overwriteExternalProvisioningServiceProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
+        if (UserRoles.isAdmin(userInfo)) {
+            String url = findEndpointDTOUrl(ymlDTO.getEndpointName()) + BASE_CONFIG_URL;
+            externalChangeProperties.overwritePropertiesWithExternal(PROVISIONING_SERVICE_PROP_PATH, PROVISIONING_SERVICE,
+                    ymlDTO, userInfo, url);
+            return Response.status(Response.Status.OK).build();
+        } else {
+            return Response
+                    .status(Response.Status.FORBIDDEN)
+                    .build();
+        }
+    }
+
+    @POST
+    @Path("/multiple/billing")
+    public Response overwriteExternalBillingProperties(@Auth UserInfo userInfo, YmlDTO ymlDTO) {
+        if (UserRoles.isAdmin(userInfo)) {
+            String url = findEndpointDTOUrl(ymlDTO.getEndpointName()) + BASE_CONFIG_URL;
+            externalChangeProperties.overwritePropertiesWithExternal(BILLING_SERVICE_PROP_PATH, BILLING_SERVICE,
+                    ymlDTO, userInfo, url);
+            return Response.status(Response.Status.OK).build();
+        } else {
+            return Response
+                    .status(Response.Status.FORBIDDEN)
+                    .build();
+        }
+    }
+
+
+    @POST
+    @Path("/multiple/restart")
+    public Response restartWithExternal(@Auth UserInfo userInfo, RestartForm restartForm) {
+        if (UserRoles.isAdmin(userInfo)) {
+            if (deployedOn.equals("GKE")) {
+                externalChangeProperties.restartForExternalForGKE(userInfo, restartForm);
+            } else {
+                String url = findEndpointDTOUrl(restartForm.getEndpoint())
+                        + ChangePropertiesConst.RESTART_URL;
+                externalChangeProperties.restartForExternal(restartForm, userInfo, url);
+            }
+            return Response.ok().build();
+        } else {
+            return Response
+                    .status(Response.Status.FORBIDDEN)
+                    .build();
+        }
+    }
+
+    private String findEndpointDTOUrl(String endpointName) {
+        return endpointDAO.get(endpointName)
+                .orElseThrow(() -> new ResourceNotFoundException("Endpoint with name " + endpointName
+                        + " not found")).getUrl();
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/EndpointResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/EndpointResource.java
new file mode 100644
index 0000000..48a1061
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/EndpointResource.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.EndpointResourcesDTO;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.rest.dto.ErrorDTO;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.headers.Header;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+
+import javax.annotation.security.RolesAllowed;
+import javax.validation.Valid;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import java.net.URI;
+
+@Path("endpoint")
+@RolesAllowed("/api/endpoint")
+public class EndpointResource {
+
+    private final EndpointService endpointService;
+    @Context
+    private UriInfo uriInfo;
+
+    @Inject
+    public EndpointResource(EndpointService endpointService) {
+        this.endpointService = endpointService;
+    }
+
+    @Operation(summary = "Create endpoint", tags = "endpoint")
+    @ApiResponse(responseCode = "201", description = "Endpoint is successfully created",
+            headers =
+            @Header(required = true, name = "Location", description = "URI of created endpoint resource",
+                    schema = @Schema(type = "string")))
+    @ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
+            MediaType.APPLICATION_JSON,
+            schema = @Schema(implementation = ErrorDTO.class)))
+    @ApiResponse(responseCode = "409", description = "Endpoint with passed name already exist in system",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON,
+                    schema = @Schema(implementation = ErrorDTO.class)))
+    @Consumes(MediaType.APPLICATION_JSON)
+    @POST
+    public Response createEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo, @Valid EndpointDTO endpointDTO) {
+        endpointService.create(userInfo, endpointDTO.getName(), endpointDTO);
+        final URI uri = uriInfo.getRequestUriBuilder().path(endpointDTO.getName()).build();
+        return Response
+                .ok()
+                .location(uri)
+                .build();
+    }
+
+    @Operation(summary = "Get endpoint info", tags = "endpoint")
+    @ApiResponse(responseCode = "200", description = "Return information about endpoint",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
+            @Schema(implementation = EndpointDTO.class)))
+    @ApiResponse(responseCode = "404", description = "Endpoint with passed name not found",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON,
+                    schema = @Schema(implementation = ErrorDTO.class)))
+    @GET
+    @Path("{name}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo,
+                                @Parameter(description = "Endpoint name")
+                                @PathParam("name") String name) {
+        return Response.ok(endpointService.get(name)).build();
+    }
+
+    @Operation(summary = "Get endpoints available in system", tags = "endpoint")
+    @ApiResponse(responseCode = "200", description = "Return information about endpoints",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
+            @Schema(implementation = EndpointDTO.class)))
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getEndpoints(@Parameter(hidden = true) @Auth UserInfo userInfo) {
+        return Response.ok(endpointService.getEndpoints()).build();
+    }
+
+    @Operation(summary = "Get resources related to the endpoint", tags = "endpoint")
+    @ApiResponse(responseCode = "200", description = "Return information about resources of endpoint",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
+            @Schema(implementation = EndpointResourcesDTO.class)))
+    @GET
+    @Path("{name}/resources")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getEndpointResources(@Parameter(hidden = true) @Auth UserInfo userInfo,
+                                         @Parameter(description = "Endpoint name")
+                                         @PathParam("name") String name) {
+        return Response.ok(endpointService.getEndpointResources(name)).build();
+    }
+
+    @Operation(summary = "Remove endpoint", tags = "endpoint")
+    @ApiResponse(responseCode = "200", description = "Endpoint is successfully removed")
+    @ApiResponse(responseCode = "404", description = "Endpoint with passed name not found",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON,
+                    schema = @Schema(implementation = ErrorDTO.class)))
+    @DELETE
+    @Path("{name}")
+    public Response removeEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo,
+                                   @Parameter(description = "Endpoint name")
+                                   @PathParam("name") String name) {
+        endpointService.remove(userInfo, name);
+        return Response.ok().build();
+    }
+
+    @Operation(summary = "Check whether endpoint url is valid", tags = "endpoint")
+    @ApiResponse(responseCode = "200", description = "Valid endpoint url")
+    @ApiResponse(responseCode = "404", description = "Endpoint url is not valid")
+    @GET
+    @Path("url/{url}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response checkEndpointUrl(@Parameter(hidden = true) @Auth UserInfo userInfo,
+                                     @Parameter(description = "Endpoint url")
+                                     @PathParam("url") String url) {
+        endpointService.checkUrl(userInfo, url);
+        return Response.ok().build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/EnvironmentResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/EnvironmentResource.java
new file mode 100644
index 0000000..b4b1418
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/EnvironmentResource.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.EnvironmentService;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import javax.annotation.security.RolesAllowed;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("environment")
+@Slf4j
+@RolesAllowed("environment/*")
+public class EnvironmentResource {
+
+    private EnvironmentService environmentService;
+
+    @Inject
+    public EnvironmentResource(EnvironmentService environmentService) {
+        this.environmentService = environmentService;
+    }
+
+    @GET
+    @Path("all")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getAllEnv(@Auth UserInfo userInfo) {
+        log.debug("Admin {} requested information about all user's environment", userInfo.getName());
+        return Response.ok(environmentService.getAllEnv(userInfo)).build();
+    }
+
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("stop/{projectName}/{exploratoryName}")
+    public Response stopNotebook(@Auth UserInfo userInfo, @NotEmpty String user,
+                                 @PathParam("projectName") String projectName,
+                                 @PathParam("exploratoryName") String exploratoryName) {
+        log.info("Admin {} is stopping notebook {} of user {}", userInfo.getName(), exploratoryName, user);
+        environmentService.stopExploratory(userInfo, user, projectName, exploratoryName);
+        return Response.ok().build();
+    }
+
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("stop/{projectName}/{exploratoryName}/{computationalName}")
+    public Response stopCluster(@Auth UserInfo userInfo, @NotEmpty String user,
+                                @PathParam("projectName") String projectName,
+                                @PathParam("exploratoryName") String exploratoryName,
+                                @PathParam("computationalName") String computationalName) {
+        log.info("Admin {} is stopping computational resource {} affiliated with exploratory {} of user {}",
+                userInfo.getName(), computationalName, exploratoryName, user);
+        environmentService.stopComputational(userInfo, user, projectName, exploratoryName, computationalName);
+        return Response.ok().build();
+    }
+
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("terminate/{projectName}/{exploratoryName}")
+    public Response terminateNotebook(@Auth UserInfo userInfo, @NotEmpty String user,
+                                      @PathParam("projectName") String projectName,
+                                      @PathParam("exploratoryName") String exploratoryName) {
+        log.info("Admin {} is terminating notebook {} of user {}", userInfo.getName(), exploratoryName, user);
+        environmentService.terminateExploratory(userInfo, user, projectName, exploratoryName);
+        return Response.ok().build();
+    }
+
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("terminate/{projectName}/{exploratoryName}/{computationalName}")
+    public Response terminateCluster(@Auth UserInfo userInfo, @NotEmpty String user,
+                                     @PathParam("projectName") String projectName,
+                                     @PathParam("exploratoryName") String exploratoryName,
+                                     @PathParam("computationalName") String computationalName) {
+        log.info("Admin {} is terminating computational resource {} affiliated with exploratory {} of user {}",
+                userInfo.getName(), computationalName, exploratoryName, user);
+        environmentService.terminateComputational(userInfo, user, projectName, exploratoryName, computationalName);
+        return Response.ok().build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ExploratoryResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ExploratoryResource.java
new file mode 100644
index 0000000..39bfb89
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ExploratoryResource.java
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.ExploratoryActionFormDTO;
+import com.epam.datalab.backendapi.resources.dto.ExploratoryCreateFormDTO;
+import com.epam.datalab.backendapi.roles.RoleType;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.model.exploratory.Exploratory;
+import com.epam.datalab.rest.contracts.ExploratoryAPI;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+/**
+ * Provides the REST API for the exploratory.
+ */
+@Path("/infrastructure_provision/exploratory_environment")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ExploratoryResource implements ExploratoryAPI {
+
+    private final ExploratoryService exploratoryService;
+
+    @Inject
+    public ExploratoryResource(ExploratoryService exploratoryService) {
+        this.exploratoryService = exploratoryService;
+    }
+
+    @GET
+    public Response getExploratoryPopUp(@Auth UserInfo userInfo) {
+        return Response.ok(exploratoryService.getUserInstances(userInfo)).build();
+    }
+
+    /**
+     * Creates the exploratory environment for user.
+     *
+     * @param userInfo user info.
+     * @param formDTO  description for the exploratory environment.
+     * @return {@link Response.Status#OK} request for provisioning service has been accepted.<br>
+     * {@link Response.Status#FOUND} request for provisioning service has been duplicated.
+     */
+    @PUT
+    public Response create(@Auth UserInfo userInfo,
+                           @Valid @NotNull ExploratoryCreateFormDTO formDTO) {
+        log.debug("Creating exploratory environment {} with name {} for user {}",
+                formDTO.getImage(), formDTO.getName(), userInfo.getName());
+        if (!UserRoles.checkAccess(userInfo, RoleType.EXPLORATORY, formDTO.getImage(), userInfo.getRoles())) {
+            log.warn("Unauthorized attempt to create a {} by user {}", formDTO.getImage(), userInfo.getName());
+            throw new DatalabException("You do not have the privileges to create a " + formDTO.getTemplateName());
+        }
+
+        String uuid = exploratoryService.create(userInfo, getExploratory(formDTO), formDTO.getProject(), formDTO.getName());
+        return Response.ok(uuid).build();
+
+    }
+
+
+    /**
+     * Starts exploratory environment for user.
+     *
+     * @param userInfo user info.
+     * @param formDTO  description of exploratory action.
+     * @return Invocation response as JSON string.
+     */
+    @POST
+    public String start(@Auth UserInfo userInfo,
+                        @Valid @NotNull ExploratoryActionFormDTO formDTO) {
+        log.debug("Starting exploratory environment {} for user {}", formDTO.getNotebookInstanceName(),
+                userInfo.getName());
+        return exploratoryService.start(userInfo, formDTO.getNotebookInstanceName(), formDTO.getProjectName(), null);
+    }
+
+    /**
+     * Stops exploratory environment for user.
+     *
+     * @param userInfo user info.
+     * @param name     name of exploratory environment.
+     * @return Invocation response as JSON string.
+     */
+    @DELETE
+    @Path("/{project}/{name}/stop")
+    public String stop(@Auth UserInfo userInfo,
+                       @PathParam("project") String project,
+                       @PathParam("name") String name) {
+        log.debug("Stopping exploratory environment {} for user {}", name, userInfo.getName());
+        return exploratoryService.stop(userInfo, userInfo.getName(), project, name, null);
+    }
+
+    /**
+     * Terminates exploratory environment for user.
+     *
+     * @param userInfo user info.
+     * @param name     name of exploratory environment.
+     * @return Invocation response as JSON string.
+     */
+    @DELETE
+    @Path("/{project}/{name}/terminate")
+    public String terminate(@Auth UserInfo userInfo,
+                            @PathParam("project") String project,
+                            @PathParam("name") String name) {
+        log.debug("Terminating exploratory environment {} for user {}", name, userInfo.getName());
+        return exploratoryService.terminate(userInfo, userInfo.getName(), project, name, null);
+    }
+
+    @PUT
+    @Path("/{project}/{name}/reconfigure")
+    public Response reconfigureSpark(@Auth UserInfo userInfo,
+                                     @PathParam("project") String project,
+                                     @PathParam("name") String name,
+                                     List<ClusterConfig> config) {
+        log.debug("Updating exploratory {} spark cluster for user {}", name, userInfo.getName());
+        exploratoryService.updateClusterConfig(userInfo, project, name, config);
+        return Response.ok().build();
+    }
+
+    @GET
+    @Path("/{project}/{name}/cluster/config")
+    public Response getClusterConfig(@Auth UserInfo userInfo,
+                                     @PathParam("project") String project,
+                                     @PathParam("name") String name) {
+        log.debug("Getting exploratory {} spark cluster configuration for user {}", name, userInfo.getName());
+        return Response.ok(exploratoryService.getClusterConfig(userInfo, project, name)).build();
+    }
+
+    private Exploratory getExploratory(ExploratoryCreateFormDTO formDTO) {
+        return Exploratory.builder()
+                .name(formDTO.getName())
+                .dockerImage(formDTO.getImage())
+                .imageName(formDTO.getImageName())
+                .templateName(formDTO.getTemplateName())
+                .version(formDTO.getVersion())
+                .clusterConfig(formDTO.getClusterConfig())
+                .shape(formDTO.getShape())
+                .endpoint(formDTO.getEndpoint())
+                .project(formDTO.getProject())
+                .exploratoryTag(formDTO.getExploratoryTag())
+                .gpuType(formDTO.getGpuType())
+                .gpuCount(formDTO.getGpuCount())
+                .enabledGPU(formDTO.getEnabledGPU())
+                .build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/GitCredsResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/GitCredsResource.java
new file mode 100644
index 0000000..2a9cf43
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/GitCredsResource.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.GitCredentialService;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsDTO;
+import com.epam.datalab.rest.contracts.ExploratoryAPI;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+/**
+ * Provides the REST API for managing git credentials
+ */
+@Path("/user/git_creds")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class GitCredsResource implements ExploratoryAPI {
+
+    private final GitCredentialService gitCredentialService;
+
+    @Inject
+    public GitCredsResource(GitCredentialService gitCredentialService) {
+        this.gitCredentialService = gitCredentialService;
+    }
+
+    /**
+     * Update GIT credentials for user.
+     *
+     * @param userInfo user info.
+     * @param formDTO  the list of credentials.
+     * @return {@link Response.Status#OK} request for provisioning service has been accepted.<br>
+     */
+    @PUT
+    public Response updateGitCreds(@Auth UserInfo userInfo, @Valid @NotNull ExploratoryGitCredsDTO formDTO) {
+        gitCredentialService.updateGitCredentials(userInfo, formDTO);
+        return Response.ok().build();
+    }
+
+    /**
+     * Returns info about GIT credentials for user.
+     *
+     * @param userInfo user info.
+     */
+    @GET
+    public ExploratoryGitCredsDTO getGitCreds(@Auth UserInfo userInfo) {
+        return gitCredentialService.getGitCredentials(userInfo.getName());
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ImageExploratoryResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ImageExploratoryResource.java
new file mode 100644
index 0000000..95dcdb4
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ImageExploratoryResource.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.resources.dto.ExploratoryImageCreateFormDTO;
+import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord;
+import com.epam.datalab.backendapi.service.ImageExploratoryService;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.UriInfo;
+import java.net.URI;
+import java.util.List;
+
+/**
+ * Manages images for exploratory and computational environment
+ */
+@Path("/infrastructure_provision/exploratory_environment/image")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ImageExploratoryResource {
+    private static final String AUDIT_MESSAGE = "Create image: %s";
+
+    private final ImageExploratoryService imageExploratoryService;
+    private final RequestId requestId;
+
+    @Inject
+    public ImageExploratoryResource(ImageExploratoryService imageExploratoryService, RequestId requestId) {
+        this.imageExploratoryService = imageExploratoryService;
+        this.requestId = requestId;
+    }
+
+    @POST
+    public Response createImage(@Auth UserInfo ui,
+                                @Valid @NotNull ExploratoryImageCreateFormDTO formDTO,
+                                @Context UriInfo uriInfo) {
+        log.debug("Creating an image {} for user {}", formDTO, ui.getName());
+        String uuid = imageExploratoryService.createImage(ui, formDTO.getProjectName(), formDTO.getNotebookName(),
+                formDTO.getName(), formDTO.getDescription(), String.format(AUDIT_MESSAGE, formDTO.getName()));
+        requestId.put(ui.getName(), uuid);
+
+        final URI imageUri = UriBuilder.fromUri(uriInfo.getRequestUri())
+                .path(formDTO.getName())
+                .build();
+        return Response.accepted(uuid).location(imageUri).build();
+    }
+
+    @GET
+    public Response getImages(@Auth UserInfo ui,
+                              @QueryParam("docker_image") String dockerImage,
+                              @QueryParam("project") String project,
+                              @QueryParam("endpoint") String endpoint) {
+        log.debug("Getting images for user {}, project {}", ui.getName(), project);
+        final List<ImageInfoRecord> images = imageExploratoryService.getNotFailedImages(ui.getName(), dockerImage,
+                project, endpoint);
+        return Response.ok(images).build();
+    }
+
+    @GET
+    @Path("all")
+    public Response getAllImagesForProject(@Auth UserInfo ui, @NotNull @QueryParam("project") String project) {
+        log.debug("Getting images for user {}, project {}", ui.getName(), project);
+        final List<ImageInfoRecord> images = imageExploratoryService.getImagesForProject(project);
+        return Response.ok(images).build();
+    }
+
+    @GET
+    @Path("{name}")
+    public Response getImage(@Auth UserInfo ui,
+                             @PathParam("name") String name,
+                             @QueryParam("project") String project,
+                             @QueryParam("endpoint") String endpoint) {
+        log.debug("Getting image with name {} for user {}", name, ui.getName());
+        return Response.ok(imageExploratoryService.getImage(ui.getName(), name, project, endpoint)).build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/InfrastructureInfoResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/InfrastructureInfoResource.java
new file mode 100644
index 0000000..c477c1e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/InfrastructureInfoResource.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.HealthStatusPageDTO;
+import com.epam.datalab.backendapi.resources.dto.ProjectInfrastructureInfo;
+import com.epam.datalab.backendapi.service.InfrastructureInfoService;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+/**
+ * Provides the REST API for the basic information about infrastructure.
+ */
+@Path("/infrastructure")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class InfrastructureInfoResource {
+
+    private final InfrastructureInfoService infrastructureInfoService;
+
+    @Inject
+    public InfrastructureInfoResource(InfrastructureInfoService infrastructureInfoService) {
+        this.infrastructureInfoService = infrastructureInfoService;
+    }
+
+    /**
+     * Return status of self-service.
+     */
+    @GET
+    public Response status() {
+        return Response.status(Response.Status.OK).build();
+    }
+
+    /**
+     * Returns the status of infrastructure: edge.
+     *
+     * @param userInfo user info.
+     */
+    @GET
+    @Path("/status")
+    public HealthStatusPageDTO status(@Auth UserInfo userInfo,
+                                      @QueryParam("full") @DefaultValue("0") int fullReport) {
+        return infrastructureInfoService.getHeathStatus(userInfo);
+    }
+
+    /**
+     * Returns the list of the provisioned user resources.
+     *
+     * @param userInfo user info.
+     */
+    @GET
+    @Path("/info")
+    public List<ProjectInfrastructureInfo> getUserResources(@Auth UserInfo userInfo) {
+        return infrastructureInfoService.getUserResources(userInfo);
+    }
+
+    @GET
+    @Path("/meta")
+    public Response getVersion(@Auth UserInfo userInfo) {
+        return Response.ok(infrastructureInfoService.getInfrastructureMetaInfo())
+                .build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/InfrastructureTemplateResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/InfrastructureTemplateResource.java
new file mode 100644
index 0000000..559adb4
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/InfrastructureTemplateResource.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.InfrastructureTemplateService;
+import com.epam.datalab.dto.base.computational.FullComputationalTemplate;
+import com.epam.datalab.dto.imagemetadata.ExploratoryMetadataDTO;
+import com.epam.datalab.rest.contracts.DockerAPI;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+/**
+ * Provides the REST API to retrieve exploratory/computational templates.
+ */
+@Path("/infrastructure_templates")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class InfrastructureTemplateResource implements DockerAPI {
+
+    private final InfrastructureTemplateService infrastructureTemplateService;
+
+    @Inject
+    public InfrastructureTemplateResource(InfrastructureTemplateService infrastructureTemplateService) {
+        this.infrastructureTemplateService = infrastructureTemplateService;
+    }
+
+    /**
+     * Returns the list of the computational resources templates for user.
+     *
+     * @param userInfo user info.
+     */
+    @GET
+    @Path("/{project}/{endpoint}/computational_templates")
+    public Iterable<FullComputationalTemplate> getComputationalTemplates(@Auth UserInfo userInfo,
+                                                                         @PathParam("project") String project,
+                                                                         @PathParam("endpoint") String endpoint) {
+        return infrastructureTemplateService.getComputationalTemplates(userInfo, project, endpoint);
+    }
+
+    /**
+     * Returns the list of the exploratory environment templates for user.
+     *
+     * @param userInfo user info.
+     */
+    @GET
+    @Path("/{project}/{endpoint}/exploratory_templates")
+    public Iterable<ExploratoryMetadataDTO> getExploratoryTemplates(@Auth UserInfo userInfo,
+                                                                    @PathParam("project") String project,
+                                                                    @PathParam("endpoint") String endpoint) {
+        return infrastructureTemplateService.getExploratoryTemplates(userInfo, project, endpoint);
+    }
+}
+
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/KeycloakResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/KeycloakResource.java
new file mode 100644
index 0000000..6e44494
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/KeycloakResource.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.KeycloakConfiguration;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.SecurityDAO;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.backendapi.service.KeycloakService;
+import com.epam.datalab.backendapi.service.SecurityService;
+import com.epam.datalab.exceptions.DatalabException;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+import org.keycloak.representations.AccessTokenResponse;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import static java.lang.String.format;
+
+@Path("/oauth")
+@Slf4j
+public class KeycloakResource {
+    private static final String LOGIN_URI_FORMAT = "%s/realms/%s/protocol/openid-connect/auth?client_id=%s" +
+            "&redirect_uri=%s&response_type=code";
+    private static final String KEYCLOAK_LOGOUT_URI_FORMAT = "%s/realms/%s/protocol/openid-connect/logout" +
+            "?redirect_uri=%s";
+    private final SecurityService securityService;
+    private final KeycloakService keycloakService;
+    private final SecurityDAO securityDAO;
+    private final String loginUri;
+    private final String logoutUri;
+    private final String redirectUri;
+    private final boolean defaultAccess;
+
+    @Inject
+    public KeycloakResource(SecurityService securityService, SelfServiceApplicationConfiguration configuration,
+                            SecurityDAO securityDAO, KeycloakService keycloakService) {
+        this.securityDAO = securityDAO;
+        this.defaultAccess = configuration.getRoleDefaultAccess();
+        final KeycloakConfiguration keycloakConfiguration = configuration.getKeycloakConfiguration();
+        this.redirectUri = keycloakConfiguration.getRedirectUri();
+        this.securityService = securityService;
+        this.keycloakService = keycloakService;
+
+        loginUri = format(LOGIN_URI_FORMAT,
+                keycloakConfiguration.getAuthServerUrl(),
+                keycloakConfiguration.getRealm(),
+                keycloakConfiguration.getResource(),
+                redirectUri);
+        logoutUri = format(KEYCLOAK_LOGOUT_URI_FORMAT,
+                keycloakConfiguration.getAuthServerUrl(),
+                keycloakConfiguration.getRealm(),
+                redirectUri);
+    }
+
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public Response getLoginUri() throws URISyntaxException {
+        return Response.ok(new URI(loginUri).toString())
+                .build();
+    }
+
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getUser(@QueryParam("code") String code) {
+        return Response.ok(securityService.getUserInfo(code)).build();
+    }
+
+    @POST
+    @Path("/authorize")
+    public Response authorize(@Auth UserInfo userInfo) {
+        UserRoles.initialize(securityDAO, defaultAccess);
+        return Response.ok().build();
+    }
+
+    @GET
+    @Path("/logout")
+    public Response getLogoutUrl() throws URISyntaxException {
+        return Response.noContent()
+                .location(new URI(logoutUri))
+                .build();
+    }
+
+    @POST
+    @Path("/refresh/{refresh_token}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response refreshAccessToken(@PathParam("refresh_token") String refreshToken) throws URISyntaxException {
+        AccessTokenResponse tokenResponse;
+        try {
+                tokenResponse = keycloakService.generateAccessToken(refreshToken);
+        } catch (DatalabException e) {
+            log.error("Cannot refresh token due to: {}", e.getMessage(), e);
+            return Response.status(Response.Status.BAD_REQUEST)
+                    .location(new URI(logoutUri))
+                    .build();
+        }
+        return Response.ok(new TokenInfo(tokenResponse.getToken(), tokenResponse.getRefreshToken())).build();
+    }
+
+    class TokenInfo {
+        @JsonProperty("access_token")
+        private final String accessToken;
+        @JsonProperty("refresh_token")
+        private final String refreshToken;
+
+        TokenInfo(String accessToken, String refreshToken) {
+            this.accessToken = accessToken;
+            this.refreshToken = refreshToken;
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/LibExploratoryResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/LibExploratoryResource.java
new file mode 100644
index 0000000..eb16310
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/LibExploratoryResource.java
@@ -0,0 +1,217 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.domain.ExploratoryLibCache;
+import com.epam.datalab.backendapi.resources.dto.LibInfoRecord;
+import com.epam.datalab.backendapi.resources.dto.LibInstallFormDTO;
+import com.epam.datalab.backendapi.resources.dto.LibraryAutoCompleteDTO;
+import com.epam.datalab.backendapi.resources.dto.SearchLibsFormDTO;
+import com.epam.datalab.backendapi.service.ExternalLibraryService;
+import com.epam.datalab.backendapi.service.LibraryService;
+import com.epam.datalab.backendapi.validation.annotation.LibNameValid;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.exploratory.LibInstallDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.bson.Document;
+import org.hibernate.validator.constraints.NotBlank;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Manages libraries for exploratory and computational environment
+ */
+@Path("/infrastructure_provision/exploratory_environment")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class LibExploratoryResource {
+    private static final String AUDIT_MESSAGE = "Install libs: %s";
+
+    private final ExternalLibraryService externalLibraryService;
+    private final ExploratoryDAO exploratoryDAO;
+    private final LibraryService libraryService;
+
+    @Inject
+    public LibExploratoryResource(ExploratoryDAO exploratoryDAO, LibraryService libraryService,
+                                  ExternalLibraryService externalLibraryService) {
+        this.exploratoryDAO = exploratoryDAO;
+        this.libraryService = libraryService;
+        this.externalLibraryService = externalLibraryService;
+    }
+
+    @GET
+    @Path("/lib-groups/exploratory")
+    public Response getExploratoryLibGroupList(@Auth UserInfo userInfo,
+                                               @QueryParam("project") @NotBlank String projectName,
+                                               @QueryParam("exploratory") @NotBlank String exploratoryName) {
+        return Response.ok(libraryService.getExploratoryLibGroups(userInfo, projectName, exploratoryName)).build();
+    }
+
+    @GET
+    @Path("/lib-groups/compute")
+    public Response getComputeLibGroupList(@Auth UserInfo userInfo) {
+        return Response.ok(libraryService.getComputeLibGroups()).build();
+    }
+
+    /**
+     * Returns list of installed/failed libraries for datalab resource <code>exploratoryName<code/>
+     * and <code>computationalName<code/> resource
+     *
+     * @param userInfo          user info
+     * @param exploratoryName   name of exploratory resource
+     * @param computationalName name of computational cluster
+     * @return list of libraries
+     */
+    @GET
+    @Path("/lib_list")
+    public List<Document> getLibList(@Auth UserInfo userInfo,
+                                     @QueryParam("project_name") @NotBlank String projectName,
+                                     @QueryParam("exploratory_name") @NotBlank String exploratoryName,
+                                     @QueryParam("computational_name") String computationalName) {
+
+        log.debug("Loading list of libraries for user {} and exploratory {} and computational {}", userInfo.getName(),
+                exploratoryName, computationalName);
+        try {
+            return libraryService.getLibs(userInfo.getName(), projectName, exploratoryName, computationalName);
+
+        } catch (Exception t) {
+            log.error("Cannot load installed libraries for user {} and exploratory {} an", userInfo.getName(),
+                    exploratoryName, t);
+            throw new DatalabException("Cannot load installed libraries: " + t.getLocalizedMessage(), t);
+        }
+    }
+
+    /**
+     * Returns formatted representation of installed libraries or libraries that were tried to be installed for
+     * exploratory
+     * and computational resources that relate to <code>exploratoryName<code/> exploratory resource with its's
+     * statuses.
+     *
+     * @param userInfo        user info.
+     * @param exploratoryName name of exploratory resource.
+     * @return list of installed/failed libraries
+     */
+    @GET
+    @Path("/lib_list/formatted")
+    public List<LibInfoRecord> getLibListFormatted(@Auth UserInfo userInfo,
+                                                   @QueryParam("project_name") @NotBlank String projectName,
+                                                   @QueryParam("exploratory_name") @NotBlank String exploratoryName) {
+
+        log.debug("Loading formatted list of libraries for user {} and exploratory {}", userInfo.getName(),
+                exploratoryName);
+        try {
+            return libraryService.getLibInfo(userInfo.getName(), projectName, exploratoryName);
+        } catch (Exception t) {
+            log.error("Cannot load list of libraries for user {} and exploratory {}", userInfo.getName(),
+                    exploratoryName, t);
+            throw new DatalabException("Cannot load  formatted list of installed libraries: " + t.getLocalizedMessage(),
+                    t);
+        }
+    }
+
+    /**
+     * Install libraries to the exploratory environment.
+     *
+     * @param userInfo user info.
+     * @param formDTO  description of libraries which will be installed to the exploratory environment.
+     * @return Invocation response as JSON string.
+     */
+    @POST
+    @Path("/lib_install")
+    public Response libInstall(@Auth UserInfo userInfo,
+                               @Valid @NotNull LibInstallFormDTO formDTO) {
+        log.debug("Installing libs to environment {} for user {}", formDTO, userInfo.getName());
+        String project = formDTO.getProject();
+        final String exploratoryName = formDTO.getNotebookName();
+        final List<LibInstallDTO> libs = formDTO.getLibs();
+        final String computationalName = formDTO.getComputationalName();
+        final String auditInfo = getAuditInfo(libs);
+        String uuid = StringUtils.isEmpty(computationalName) ?
+                libraryService.installExploratoryLibs(userInfo, project, exploratoryName, libs, auditInfo) :
+                libraryService.installComputationalLibs(userInfo, project, exploratoryName, computationalName, libs, auditInfo);
+        return Response.ok(uuid)
+                .build();
+    }
+
+    /**
+     * Returns the list of available libraries for exploratory basing on search conditions provided in @searchDTO.
+     *
+     * @param userInfo  user info.
+     * @param searchDTO search condition for find libraries for the exploratory environment.
+     * @return found libraries
+     */
+    @POST
+    @Path("search/lib_list")
+    public Response getLibList(@Auth UserInfo userInfo,
+                               @Valid @NotNull SearchLibsFormDTO searchDTO) {
+        try {
+            UserInstanceDTO userInstance;
+            if (StringUtils.isNotEmpty(searchDTO.getComputationalName())) {
+                userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), searchDTO.getProjectName(),
+                        searchDTO.getNotebookName(), searchDTO.getComputationalName());
+                userInstance.setResources(userInstance.getResources().stream()
+                        .filter(e -> e.getComputationalName().equals(searchDTO.getComputationalName()))
+                        .collect(Collectors.toList()));
+            } else {
+                userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), searchDTO.getProjectName(), searchDTO.getNotebookName());
+            }
+
+            LibraryAutoCompleteDTO autoCompleteDTO = ExploratoryLibCache.getCache().getLibList(userInfo, userInstance, searchDTO.getGroup(), searchDTO.getStartWith());
+            return Response.ok(autoCompleteDTO).build();
+        } catch (Exception e) {
+            log.error("Cannot search libs for user {} with condition {}", userInfo.getName(), searchDTO, e);
+            throw new DatalabException("Cannot search libraries: " + e.getLocalizedMessage(), e);
+        }
+    }
+
+
+    @GET
+    @Path("search/lib_list/maven")
+    public Response getMavenArtifactInfo(@Auth UserInfo userInfo,
+                                         @LibNameValid @QueryParam("artifact") String artifact) {
+        final String[] libNameParts = artifact.split(":");
+        return Response.ok(externalLibraryService.getLibrary(libNameParts[0], libNameParts[1], libNameParts[2])).build();
+    }
+
+    private String getAuditInfo(List<LibInstallDTO> libs) {
+        return String.format(AUDIT_MESSAGE, libs
+                .stream()
+                .map(LibInstallDTO::getName)
+                .collect(Collectors.joining(", ")));
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/OdahuResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/OdahuResource.java
new file mode 100644
index 0000000..4989893
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/OdahuResource.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.OdahuActionDTO;
+import com.epam.datalab.backendapi.domain.OdahuCreateDTO;
+import com.epam.datalab.backendapi.service.OdahuService;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import io.swagger.v3.oas.annotations.Parameter;
+
+import javax.annotation.security.RolesAllowed;
+import javax.validation.Valid;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import java.net.URI;
+
+@Path("odahu")
+@Consumes(MediaType.APPLICATION_JSON)
+public class OdahuResource {
+
+	private final OdahuService odahuService;
+
+	@Inject
+	public OdahuResource(OdahuService odahuService) {
+		this.odahuService = odahuService;
+	}
+
+	@GET
+//	@RolesAllowed("/api/odahu")
+	@Produces(MediaType.APPLICATION_JSON)
+	public Response getOdahuClusters(@Parameter(hidden = true) @Auth UserInfo userInfo) {
+		return Response.ok(odahuService.findOdahu()).build();
+	}
+
+	@POST
+//	@RolesAllowed("/api/odahu")
+	public Response createOdahuCluster(@Parameter(hidden = true) @Auth UserInfo userInfo,
+	                                   @Parameter(hidden = true) @Context UriInfo uriInfo,
+	                                   @Valid OdahuCreateDTO odahuCreateDTO) {
+		odahuService.create(odahuCreateDTO.getProject(), odahuCreateDTO, userInfo);
+		final URI uri = uriInfo.getRequestUriBuilder().path(odahuCreateDTO.getName()).build();
+		return Response.created(uri).build();
+	}
+
+	@Path("start")
+	@POST
+//	@RolesAllowed("/api/odahu")
+	public Response startOdahuCluster(@Parameter(hidden = true) @Auth UserInfo userInfo,
+	                                  @Valid OdahuActionDTO startOdahuDTO) {
+		odahuService.start(startOdahuDTO.getName(), startOdahuDTO.getProject(), startOdahuDTO.getEndpoint(), userInfo);
+		return Response.accepted().build();
+	}
+
+	@Path("stop")
+	@POST
+//	@RolesAllowed("/api/odahu")
+	public Response stopOdahuCluster(@Parameter(hidden = true) @Auth UserInfo userInfo,
+	                                 @Valid OdahuActionDTO stopOdahuDTO) {
+		odahuService.stop(stopOdahuDTO.getName(), stopOdahuDTO.getProject(), stopOdahuDTO.getEndpoint(), userInfo);
+		return Response.accepted().build();
+	}
+
+	@Path("terminate")
+	@POST
+//	@RolesAllowed("/api/odahu")
+	public Response terminateOdahuCluster(@Parameter(hidden = true) @Auth UserInfo userInfo,
+	                                      @Valid OdahuActionDTO terminateOdahuDTO) {
+		odahuService.terminate(terminateOdahuDTO.getName(), terminateOdahuDTO.getProject(), terminateOdahuDTO.getEndpoint(), userInfo);
+		return Response.accepted().build();
+	}
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ProjectResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ProjectResource.java
new file mode 100644
index 0000000..15eae6a
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/ProjectResource.java
@@ -0,0 +1,269 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.BudgetDTO;
+import com.epam.datalab.backendapi.domain.CreateProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
+import com.epam.datalab.backendapi.domain.UpdateProjectBudgetDTO;
+import com.epam.datalab.backendapi.domain.UpdateProjectDTO;
+import com.epam.datalab.backendapi.resources.dto.ProjectActionFormDTO;
+import com.epam.datalab.backendapi.service.AccessKeyService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.rest.dto.ErrorDTO;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.headers.Header;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.security.RolesAllowed;
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import java.net.URI;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Path("project")
+@Slf4j
+public class ProjectResource {
+    private final ProjectService projectService;
+    private final AccessKeyService keyService;
+    @Context
+    private UriInfo uriInfo;
+
+    @Inject
+    public ProjectResource(ProjectService projectService, AccessKeyService keyService) {
+        this.projectService = projectService;
+        this.keyService = keyService;
+    }
+
+
+    @Operation(summary = "Create project", tags = "project")
+    @ApiResponse(responseCode = "201", description = "Project is successfully created",
+            headers =
+            @Header(required = true, name = "Location", description = "URI of created project resource",
+                    schema = @Schema(type = "string")))
+    @ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
+            MediaType.APPLICATION_JSON,
+            schema = @Schema(implementation = ErrorDTO.class)))
+    @ApiResponse(responseCode = "409", description = "Project with passed name already exist in system",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON,
+                    schema = @Schema(implementation = ErrorDTO.class)))
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/project/create")
+    public Response createProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
+                                  @Valid CreateProjectDTO projectDTO) {
+        log.info("Trying to create project: {}", projectDTO);
+        List<ProjectEndpointDTO> projectEndpointDTOS = projectDTO.getEndpoints()
+                .stream()
+                .map(e -> new ProjectEndpointDTO(e, UserInstanceStatus.CREATING, null))
+                .collect(Collectors.toList());
+        ProjectDTO project = new ProjectDTO(projectDTO.getName(), projectDTO.getGroups(), projectDTO.getKey(), projectDTO.getTag(),
+                new BudgetDTO(), projectEndpointDTOS, projectDTO.isSharedImageEnabled());
+        projectService.create(userInfo, project, projectDTO.getName());
+        final URI uri = uriInfo.getRequestUriBuilder().path(projectDTO.getName()).build();
+        return Response
+                .ok()
+                .location(uri)
+                .build();
+    }
+
+    @Operation(summary = "Recreate project edge", tags = "project")
+    @ApiResponse(responseCode = "202", description = "Project edge is recreating")
+    @ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
+            MediaType.APPLICATION_JSON,
+            schema = @Schema(implementation = ErrorDTO.class)))
+    @Path("recreate")
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/project")
+    public Response recreateProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
+                                    @NotNull @Valid ProjectActionFormDTO startProjectDto) {
+        log.info("Trying to recreate project: {}", startProjectDto);
+
+        startProjectDto.getEndpoints()
+                .forEach(endpoint -> projectService.recreate(userInfo, endpoint, startProjectDto.getProjectName()));
+        return Response
+                .accepted()
+                .build();
+    }
+
+    @Operation(summary = "Start project", tags = "project")
+    @ApiResponse(responseCode = "202", description = "Project is starting")
+    @ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
+            MediaType.APPLICATION_JSON,
+            schema = @Schema(implementation = ErrorDTO.class)))
+    @Path("start")
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/project")
+    public Response startProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
+                                 @NotNull @Valid ProjectActionFormDTO startProjectDto) {
+        log.info("Trying to start project: {}", startProjectDto);
+        projectService.start(userInfo, startProjectDto.getEndpoints(), startProjectDto.getProjectName());
+        return Response
+                .accepted()
+                .build();
+    }
+
+    @Operation(summary = "Stop project", tags = "project")
+    @ApiResponse(responseCode = "202", description = "Project is stopping")
+    @ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
+            MediaType.APPLICATION_JSON,
+            schema = @Schema(implementation = ErrorDTO.class)))
+    @Path("stop")
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/project")
+    public Response stopProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
+                                @NotNull @Valid ProjectActionFormDTO stopProjectDTO) {
+        log.info("Trying to stop project: {}", stopProjectDTO);
+        projectService.stopWithResources(userInfo, stopProjectDTO.getEndpoints(), stopProjectDTO.getProjectName());
+        return Response
+                .accepted()
+                .build();
+    }
+
+    @Operation(summary = "Get project info", tags = "project")
+    @ApiResponse(responseCode = "200", description = "Return information about project",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
+            @Schema(implementation = ProjectDTO.class)))
+    @ApiResponse(responseCode = "404", description = "Project with passed name not found",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON,
+                    schema = @Schema(implementation = ErrorDTO.class)))
+    @GET
+    @Path("{name}")
+    @Produces(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/project")
+    public Response getProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
+                               @Parameter(description = "Project name")
+                               @PathParam("name") String name) {
+        return Response
+                .ok(projectService.get(name))
+                .build();
+    }
+
+    @Operation(summary = "Get available projects", tags = "project")
+    @ApiResponse(responseCode = "200", description = "Return information about projects",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
+            @Schema(implementation = ProjectDTO.class)))
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/project")
+    public Response getProjects(@Parameter(hidden = true) @Auth UserInfo userInfo) {
+        return Response
+                .ok(projectService.getProjects(userInfo))
+                .build();
+    }
+
+    @Operation(summary = "Get projects assigned to user", tags = "project")
+    @ApiResponse(responseCode = "200", description = "Return information about projects",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
+            @Schema(implementation = ProjectDTO.class)))
+    @GET
+    @Path("/me")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getUserProjects(@Parameter(hidden = true) @Auth UserInfo userInfo,
+                                    @QueryParam("active") @DefaultValue("false") boolean active) {
+        return Response
+                .ok(projectService.getUserProjects(userInfo, active))
+                .build();
+    }
+
+    @Operation(summary = "Update project", tags = "project")
+    @ApiResponse(responseCode = "200", description = "Project is successfully updated")
+    @ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
+            MediaType.APPLICATION_JSON,
+            schema = @Schema(implementation = ErrorDTO.class)))
+    @ApiResponse(responseCode = "404", description = "Project with passed name not found",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON,
+                    schema = @Schema(implementation = ErrorDTO.class)))
+    @PUT
+    @RolesAllowed("/api/project")
+    public Response updateProject(@Parameter(hidden = true) @Auth UserInfo userInfo, UpdateProjectDTO projectDTO) {
+        projectService.update(userInfo, projectDTO, projectDTO.getName());
+        return Response.ok().build();
+    }
+
+    @Operation(summary = "Remove project", tags = "project")
+    @ApiResponse(responseCode = "200", description = "Project is successfully removed")
+    @ApiResponse(responseCode = "404", description = "Project with passed name not found",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON,
+                    schema = @Schema(implementation = ErrorDTO.class)))
+    @POST
+    @Path("terminate")
+    @RolesAllowed("/api/project")
+    public Response removeProjectEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo,
+                                          @NotNull @Valid ProjectActionFormDTO projectActionDTO) {
+        projectService.terminateEndpoint(userInfo, projectActionDTO.getEndpoints(), projectActionDTO.getProjectName());
+        return Response.ok().build();
+    }
+
+    @Operation(summary = "Updates project budget", tags = "project")
+    @ApiResponse(responseCode = "200", description = "Project budget is successfully updated")
+    @ApiResponse(responseCode = "404", description = "Project with specified name not found")
+    @ApiResponse(responseCode = "400", description = "Validation error",
+            content = @Content(mediaType = MediaType.APPLICATION_JSON,
+                    schema = @Schema(implementation = ErrorDTO.class)))
+    @PUT
+    @Path("/budget")
+    @RolesAllowed("/api/project")
+    public Response updateBudget(
+            @Parameter(hidden = true) @Auth UserInfo userInfo,
+            @Parameter(description = "Update project budgets list") List<UpdateProjectBudgetDTO> dtos) {
+        projectService.updateBudget(userInfo, dtos);
+        return Response.ok().build();
+    }
+
+    @Operation(summary = "Generate keys for project", tags = "project")
+    @ApiResponse(responseCode = "200", description = "Keys are successfully generated")
+    @POST
+    @Path("/keys")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/project")
+    public Response generate(@Parameter(hidden = true) @Auth UserInfo userInfo) {
+        return Response
+                .ok(keyService.generateKeys(userInfo))
+                .build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/SchedulerJobResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/SchedulerJobResource.java
new file mode 100644
index 0000000..0ecf157
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/SchedulerJobResource.java
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.SchedulerJobService;
+import com.epam.datalab.backendapi.validation.annotation.SchedulerJobDTOValid;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+/**
+ * Manages scheduler jobs for exploratory environment
+ */
+@Path("/infrastructure_provision/exploratory_environment/scheduler")
+@Slf4j
+public class SchedulerJobResource {
+
+    private final SchedulerJobService schedulerJobService;
+
+    @Inject
+    public SchedulerJobResource(SchedulerJobService schedulerJobService) {
+        this.schedulerJobService = schedulerJobService;
+    }
+
+
+    /**
+     * Updates exploratory <code>exploratoryName<code/> for user <code>userInfo<code/> with new scheduler job data
+     *
+     * @param userInfo        user info
+     * @param exploratoryName name of exploratory resource
+     * @param dto             scheduler job data
+     * @return response
+     */
+    @POST
+    @Path("/{projectName}/{exploratoryName}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response updateExploratoryScheduler(@Auth UserInfo userInfo,
+                                               @PathParam("projectName") String projectName,
+                                               @PathParam("exploratoryName") String exploratoryName,
+                                               @SchedulerJobDTOValid SchedulerJobDTO dto) {
+        schedulerJobService.updateExploratorySchedulerData(userInfo, projectName, exploratoryName, dto);
+        return Response.ok().build();
+    }
+
+    /**
+     * Removes exploratory <code>exploratoryName<code/> for user <code>userInfo<code/>
+     *
+     * @param userInfo        user info
+     * @param exploratoryName name of exploratory resource
+     * @return response
+     */
+    @DELETE
+    @Path("/{exploratoryName}")
+    public Response removeExploratoryScheduler(@Auth UserInfo userInfo,
+                                               @PathParam("exploratoryName") String exploratoryName) {
+        log.debug("User {} is trying to remove scheduler for exploratory {}", userInfo.getName(), exploratoryName);
+        schedulerJobService.removeScheduler(userInfo.getName(), exploratoryName);
+        return Response.ok().build();
+    }
+
+    /**
+     * Updates computational resource <code>computationalName<code/> affiliated with exploratory
+     * <code>exploratoryName<code/> for user <code>userInfo<code/> with new scheduler job data
+     *
+     * @param userInfo          user info
+     * @param exploratoryName   name of exploratory resource
+     * @param computationalName name of computational resource
+     * @param dto               scheduler job data
+     * @return response
+     */
+    @POST
+    @Path("/{projectName}/{exploratoryName}/{computationalName}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response updateComputationalScheduler(@Auth UserInfo userInfo,
+                                                 @PathParam("projectName") String projectName,
+                                                 @PathParam("exploratoryName") String exploratoryName,
+                                                 @PathParam("computationalName") String computationalName,
+                                                 @SchedulerJobDTOValid SchedulerJobDTO dto) {
+        schedulerJobService.updateComputationalSchedulerData(userInfo, projectName, exploratoryName, computationalName, dto);
+        return Response.ok().build();
+    }
+
+    /**
+     * Updates computational resource <code>computationalName<code/> affiliated with exploratory
+     * <code>exploratoryName<code/> for user <code>userInfo<code/> with new scheduler job data
+     *
+     * @param userInfo          user info
+     * @param exploratoryName   name of exploratory resource
+     * @param computationalName name of computational resource
+     * @return response
+     */
+    @DELETE
+    @Path("/{exploratoryName}/{computationalName}")
+    public Response removeComputationalScheduler(@Auth UserInfo userInfo,
+                                                 @PathParam("exploratoryName") String exploratoryName,
+                                                 @PathParam("computationalName") String computationalName) {
+        log.debug("User {} is trying to remove scheduler for computational {} connected with exploratory {}",
+                userInfo.getName(), computationalName, exploratoryName);
+        schedulerJobService.removeScheduler(userInfo.getName(), exploratoryName, computationalName);
+        return Response.ok().build();
+    }
+
+
+    /**
+     * Returns scheduler job for exploratory resource <code>exploratoryName<code/>
+     *
+     * @param userInfo        user info
+     * @param exploratoryName name of exploratory resource
+     * @return scheduler job data
+     */
+    @GET
+    @Path("/{projectName}/{exploratoryName}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response fetchSchedulerJobForUserAndExploratory(@Auth UserInfo userInfo,
+                                                           @PathParam("projectName") String projectName,
+                                                           @PathParam("exploratoryName") String exploratoryName) {
+        log.debug("Loading scheduler job for user {} and exploratory {}...", userInfo.getName(), exploratoryName);
+        final SchedulerJobDTO schedulerJob =
+                schedulerJobService.fetchSchedulerJobForUserAndExploratory(userInfo.getName(), projectName, exploratoryName);
+        return Response.ok(schedulerJob).build();
+    }
+
+    /**
+     * Returns scheduler job for computational resource <code>computationalName<code/> affiliated with
+     * exploratory <code>exploratoryName<code/>
+     *
+     * @param userInfo          user info
+     * @param exploratoryName   name of exploratory resource
+     * @param computationalName name of computational resource
+     * @return scheduler job data
+     */
+    @GET
+    @Path("/{projectName}/{exploratoryName}/{computationalName}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response fetchSchedulerJobForComputationalResource(@Auth UserInfo userInfo,
+                                                              @PathParam("exploratoryName") String exploratoryName,
+                                                              @PathParam("projectName") String projectName,
+                                                              @PathParam("computationalName") String computationalName) {
+        log.debug("Loading scheduler job for user {}, exploratory {} and computational resource {}...",
+                userInfo.getName(), exploratoryName, computationalName);
+        final SchedulerJobDTO schedulerJob = schedulerJobService
+                .fetchSchedulerJobForComputationalResource(userInfo.getName(), projectName, exploratoryName, computationalName);
+        return Response.ok(schedulerJob).build();
+    }
+
+    @GET
+    @Path("active")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getActiveSchedulers(@Auth UserInfo userInfo,
+                                        @QueryParam("minuteOffset") long minuteOffset) {
+        log.trace("Getting active schedulers for user {} and offset {}", userInfo.getName(), minuteOffset);
+        return Response.ok(schedulerJobService.getActiveSchedulers(userInfo.getName(), minuteOffset)).build();
+    }
+
+}
+
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/SystemInfoResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/SystemInfoResource.java
new file mode 100644
index 0000000..0c20dcb
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/SystemInfoResource.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.SystemInfoDto;
+import com.epam.datalab.backendapi.service.SystemInfoService;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.security.RolesAllowed;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Slf4j
+@Path("sysinfo")
+@Produces(MediaType.APPLICATION_JSON)
+@RolesAllowed("sysinfo")
+public class SystemInfoResource {
+
+    private final SystemInfoService systemInfoService;
+
+    @Inject
+    public SystemInfoResource(SystemInfoService systemInfoService) {
+        this.systemInfoService = systemInfoService;
+    }
+
+
+    @GET
+
+    public Response getSystemInfo(@Auth UserInfo userInfo) {
+        log.debug("Getting system info for user {}...", userInfo.getName());
+        final SystemInfoDto systemInfoDto = systemInfoService.getSystemInfo();
+        return Response.ok(systemInfoDto).build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/UserGroupResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/UserGroupResource.java
new file mode 100644
index 0000000..b8d92b6
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/UserGroupResource.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.GroupDTO;
+import com.epam.datalab.backendapi.resources.dto.UpdateGroupDTO;
+import com.epam.datalab.backendapi.service.UserGroupService;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.security.RolesAllowed;
+import javax.validation.Valid;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Slf4j
+@Path("group")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class UserGroupResource {
+
+    private final UserGroupService userGroupService;
+
+    @Inject
+    public UserGroupResource(UserGroupService userGroupService) {
+        this.userGroupService = userGroupService;
+    }
+
+
+    @POST
+    @RolesAllowed("/roleManagement/create")
+    public Response createGroup(@Auth UserInfo userInfo, @Valid GroupDTO dto) {
+        log.debug("Creating new group {}", dto.getName());
+        userGroupService.createGroup(userInfo, dto.getName(), dto.getRoleIds().keySet(), dto.getUsers());
+        return Response.ok().build();
+    }
+
+    @PUT
+    @RolesAllowed("/roleManagement")
+    public Response updateGroup(@Auth UserInfo userInfo, @Valid UpdateGroupDTO dto) {
+        log.debug("Updating group {}", dto.getName());
+        userGroupService.updateGroup(userInfo, dto.getName(), dto.getRoles(), dto.getUsers());
+        return Response.ok().build();
+    }
+
+    @GET
+    @RolesAllowed("/roleManagement")
+    public Response getGroups(@Auth UserInfo userInfo) {
+        log.debug("Getting all groups for admin {}...", userInfo.getName());
+        return Response.ok(userGroupService.getAggregatedRolesByGroup(userInfo)).build();
+    }
+
+    @DELETE
+    @Path("{id}")
+    @RolesAllowed("/roleManagement/delete")
+    public Response deleteGroup(@Auth UserInfo userInfo, @PathParam("id") String group) {
+        log.info("Admin {} is trying to delete group {} from application", userInfo.getName(), group);
+        userGroupService.removeGroup(userInfo, group);
+        return Response.ok().build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/UserRoleResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/UserRoleResource.java
new file mode 100644
index 0000000..b14d94c
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/UserRoleResource.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.UserRoleDTO;
+import com.epam.datalab.backendapi.service.UserRoleService;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.annotation.security.RolesAllowed;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Slf4j
+@Path("role")
+@RolesAllowed("/roleManagement")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class UserRoleResource {
+
+    private final UserRoleService userRoleService;
+
+    @Inject
+    public UserRoleResource(UserRoleService roleService) {
+        this.userRoleService = roleService;
+    }
+
+    @GET
+    public Response getRoles(@Auth UserInfo userInfo) {
+        log.debug("Getting all roles for admin {}...", userInfo.getName());
+        return Response.ok(userRoleService.getUserRoles()).build();
+    }
+
+    @POST
+    public Response createRole(@Auth UserInfo userInfo, UserRoleDTO dto) {
+        log.info("Creating new role {} on behalf of admin {}...", dto, userInfo.getName());
+        userRoleService.createRole(dto);
+        return Response.ok().build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/UserSettingsResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/UserSettingsResource.java
new file mode 100644
index 0000000..f74fd4e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/UserSettingsResource.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.UserDTO;
+import com.epam.datalab.backendapi.service.UserSettingService;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import org.hibernate.validator.constraints.NotBlank;
+import org.hibernate.validator.constraints.NotEmpty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.security.RolesAllowed;
+import javax.validation.Valid;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+
+@Path("/user/settings")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class UserSettingsResource {
+    private static final Logger LOGGER = LoggerFactory.getLogger(UserSettingsResource.class);
+
+    private final UserSettingService userSettingService;
+
+    @Inject
+    public UserSettingsResource(UserSettingService userSettingService) {
+        this.userSettingService = userSettingService;
+    }
+
+    @GET
+    public String getSettings(@Auth UserInfo userInfo) {
+        String settings = userSettingService.getUISettings(userInfo);
+        LOGGER.debug("Returns settings for user {}, content is {}", userInfo.getName(), settings);
+        return settings;
+    }
+
+    @POST
+    public Response saveSettings(@Auth UserInfo userInfo,
+                                 @NotBlank String settings) {
+        LOGGER.debug("Saves settings for user {}, content is {}", userInfo.getName(), settings);
+        userSettingService.saveUISettings(userInfo, settings);
+        return Response.ok().build();
+    }
+
+    @PUT
+    @Path("budget")
+    @RolesAllowed("/user/settings")
+    public Response updateUsersBudget(@Auth UserInfo userInfo,
+                                      @Valid @NotEmpty List<UserDTO> budgets) {
+        LOGGER.debug("User {} is updating allowed budget for users: {}", userInfo.getName(), budgets);
+        userSettingService.updateUsersBudget(budgets);
+        return Response.ok().build();
+    }
+
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ComputationalResourceAws.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ComputationalResourceAws.java
new file mode 100644
index 0000000..baaf397
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/aws/ComputationalResourceAws.java
@@ -0,0 +1,270 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.aws;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
+import com.epam.datalab.backendapi.resources.dto.aws.AwsComputationalCreateForm;
+import com.epam.datalab.backendapi.roles.RoleType;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.backendapi.service.ComputationalService;
+import com.epam.datalab.dto.aws.computational.AwsComputationalResource;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.contracts.ComputationalAPI;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import io.swagger.v3.oas.annotations.Parameter;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+import static com.epam.datalab.dto.UserInstanceStatus.CREATING;
+import static com.epam.datalab.dto.base.DataEngineType.SPARK_STANDALONE;
+
+
+/**
+ * Provides the REST API for the computational resource on AWS.
+ */
+@Path("/aws/infrastructure_provision/computational_resources")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ComputationalResourceAws implements ComputationalAPI {
+    @Inject
+    private SelfServiceApplicationConfiguration configuration;
+    @Inject
+    private ComputationalService computationalService;
+
+    @GET
+    @Path("/{project}/{endpoint}/templates")
+    public Response getTemplates(@Auth @Parameter(hidden = true) UserInfo userInfo, @PathParam("project") String project,
+                                 @PathParam("endpoint") String endpoint) {
+        return Response.ok(computationalService.getComputationalNamesAndTemplates(userInfo, project, endpoint)).build();
+    }
+
+    /**
+     * Asynchronously creates EMR cluster
+     *
+     * @param userInfo user info.
+     * @param form     DTO info about creation of the computational resource.
+     * @return 200 OK - if request success, 302 Found - for duplicates.
+     * @throws IllegalArgumentException if docker image name is malformed
+     */
+    @PUT
+    @Path("dataengine-service")
+    public Response createDataEngineService(@Auth @Parameter(hidden = true) UserInfo userInfo,
+                                            @Parameter @Valid @NotNull AwsComputationalCreateForm form) {
+        log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
+
+        if (DataEngineType.CLOUD_SERVICE == DataEngineType.fromDockerImageName(form.getImage())) {
+
+            validate(userInfo, form);
+
+            AwsComputationalResource awsComputationalResource = AwsComputationalResource.builder()
+                    .computationalName(form.getName())
+                    .imageName(form.getImage())
+                    .templateName(form.getTemplateName())
+                    .status(CREATING.toString())
+                    .masterShape(form.getMasterInstanceType())
+                    .slaveShape(form.getSlaveInstanceType())
+                    .slaveSpot(form.getSlaveInstanceSpot())
+                    .slaveSpotPctPrice(form.getSlaveInstanceSpotPctPrice())
+                    .slaveNumber(form.getInstanceCount())
+                    .config(form.getConfig())
+                    .version(form.getVersion())
+                    .totalInstanceCount(Integer.parseInt(form.getInstanceCount()))
+                    .build();
+            boolean resourceAdded = computationalService.createDataEngineService(userInfo, form.getName(), form, awsComputationalResource,
+                    form.getProject(), getAuditInfo(form.getNotebookName()));
+            return resourceAdded ? Response.ok().build() : Response.status(Response.Status.FOUND).build();
+        }
+
+        throw new IllegalArgumentException("Malformed image " + form.getImage());
+    }
+
+    /**
+     * Asynchronously triggers creation of Spark cluster
+     *
+     * @param userInfo user info.
+     * @param form     DTO info about creation of the computational resource.
+     * @return 200 OK - if request success, 302 Found - for duplicates.
+     */
+
+    @PUT
+    @Path("dataengine")
+    public Response createDataEngine(@Auth UserInfo userInfo,
+                                     @Valid @NotNull SparkStandaloneClusterCreateForm form) {
+        log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
+
+        validate(form);
+        return computationalService.createSparkCluster(userInfo, form.getName(), form, form.getProject(), getAuditInfo(form.getNotebookName()))
+                ? Response.ok().build()
+                : Response.status(Response.Status.FOUND).build();
+    }
+
+    /**
+     * Sends request to provisioning service for termination the computational resource for user.
+     *
+     * @param userInfo          user info.
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @return 200 OK if operation is successfully triggered
+     */
+    @DELETE
+    @Path("/{projectName}/{exploratoryName}/{computationalName}/terminate")
+    public Response terminate(@Auth UserInfo userInfo,
+                              @PathParam("projectName") String projectName,
+                              @PathParam("exploratoryName") String exploratoryName,
+                              @PathParam("computationalName") String computationalName) {
+        log.debug("Terminating computational resource {} for user {}", computationalName, userInfo.getName());
+
+        computationalService.terminateComputational(userInfo, userInfo.getName(), projectName, exploratoryName, computationalName, getAuditInfo(exploratoryName));
+
+        return Response.ok().build();
+    }
+
+    /**
+     * Sends request to provisioning service for stopping the computational resource for user.
+     *
+     * @param userInfo          user info.
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @return 200 OK if operation is successfully triggered
+     */
+    @DELETE
+    @Path("/{project}/{exploratoryName}/{computationalName}/stop")
+    public Response stop(@Auth UserInfo userInfo,
+                         @PathParam("project") String project,
+                         @PathParam("exploratoryName") String exploratoryName,
+                         @PathParam("computationalName") String computationalName) {
+        log.debug("Stopping computational resource {} for user {}", computationalName, userInfo.getName());
+
+        computationalService.stopSparkCluster(userInfo, userInfo.getName(), project, exploratoryName, computationalName, getAuditInfo(exploratoryName));
+        return Response.ok().build();
+    }
+
+    /**
+     * Sends request to provisioning service for starting the computational resource for user.
+     *
+     * @param userInfo          user info.
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @return 200 OK if operation is successfully triggered
+     */
+    @PUT
+    @Path("/{project}/{exploratoryName}/{computationalName}/start")
+    public Response start(@Auth UserInfo userInfo,
+                          @PathParam("exploratoryName") String exploratoryName,
+                          @PathParam("computationalName") String computationalName,
+                          @PathParam("project") String project) {
+        log.debug("Starting computational resource {} for user {}", computationalName, userInfo.getName());
+
+        computationalService.startSparkCluster(userInfo, exploratoryName, computationalName, project, getAuditInfo(exploratoryName));
+        return Response.ok().build();
+    }
+
+    @PUT
+    @Path("dataengine/{projectName}/{exploratoryName}/{computationalName}/config")
+    public Response updateDataEngineConfig(@Auth UserInfo userInfo,
+                                           @PathParam("projectName") String projectName,
+                                           @PathParam("exploratoryName") String exploratoryName,
+                                           @PathParam("computationalName") String computationalName,
+                                           @Valid @NotNull List<ClusterConfig> config) {
+        computationalService.updateSparkClusterConfig(userInfo, projectName, exploratoryName, computationalName, config,
+                String.format(AUDIT_COMPUTATIONAL_RECONFIGURE_MESSAGE, computationalName, exploratoryName));
+        return Response.ok().build();
+    }
+
+    @GET
+    @Path("/{projectName}/{exploratoryName}/{computationalName}/config")
+    public Response getClusterConfig(@Auth UserInfo userInfo,
+                                     @PathParam("projectName") String projectName,
+                                     @PathParam("exploratoryName") String exploratoryName,
+                                     @PathParam("computationalName") String computationalName) {
+        return Response.ok(computationalService.getClusterConfig(userInfo, projectName, exploratoryName, computationalName)).build();
+    }
+
+    private void validate(SparkStandaloneClusterCreateForm form) {
+
+        int instanceCount = Integer.parseInt(form.getDataEngineInstanceCount());
+
+        if (instanceCount < configuration.getMinSparkInstanceCount()
+                || instanceCount > configuration.getMaxSparkInstanceCount()) {
+            throw new IllegalArgumentException(String.format("Instance count should be in range [%d..%d]",
+                    configuration.getMinSparkInstanceCount(), configuration.getMaxSparkInstanceCount()));
+        }
+
+        if (DataEngineType.fromDockerImageName(form.getImage()) != SPARK_STANDALONE) {
+            throw new IllegalArgumentException(String.format("Unknown data engine %s", form.getImage()));
+        }
+    }
+
+    private void validate(UserInfo userInfo, AwsComputationalCreateForm formDTO) {
+        if (!UserRoles.checkAccess(userInfo, RoleType.COMPUTATIONAL, formDTO.getImage(), userInfo.getRoles())) {
+            log.warn("Unauthorized attempt to create a {} by user {}", formDTO.getImage(), userInfo.getName());
+            throw new DatalabException("You do not have the privileges to create a " + formDTO.getTemplateName());
+        }
+
+        int slaveInstanceCount = Integer.parseInt(formDTO.getInstanceCount());
+        if (slaveInstanceCount < configuration.getMinEmrInstanceCount() || slaveInstanceCount >
+                configuration.getMaxEmrInstanceCount()) {
+            log.debug("Creating computational resource {} for user {} fail: Limit exceeded to creation slave " +
+                            "instances. Minimum is {}, maximum is {}",
+                    formDTO.getName(), userInfo.getName(), configuration.getMinEmrInstanceCount(),
+                    configuration.getMaxEmrInstanceCount());
+            throw new DatalabException("Limit exceeded to creation slave instances. Minimum is " +
+                    configuration.getMinEmrInstanceCount() + ", maximum is " + configuration.getMaxEmrInstanceCount() +
+                    ".");
+        }
+
+        if (formDTO.getSlaveInstanceSpotPctPrice() != null) {
+            int slaveSpotInstanceBidPct = formDTO.getSlaveInstanceSpotPctPrice();
+            if (formDTO.getSlaveInstanceSpot() && (slaveSpotInstanceBidPct < configuration.getMinEmrSpotInstanceBidPct()
+                    || slaveSpotInstanceBidPct > configuration.getMaxEmrSpotInstanceBidPct())) {
+                log.debug("Creating computational resource {} for user {} fail: Spot instances bidding percentage " +
+                                "value " +
+                                "out of the boundaries. Minimum is {}, maximum is {}",
+                        formDTO.getName(), userInfo.getName(), configuration.getMinEmrSpotInstanceBidPct(),
+                        configuration.getMaxEmrSpotInstanceBidPct());
+                throw new DatalabException("Spot instances bidding percentage value out of the boundaries. Minimum is " +
+                        configuration.getMinEmrSpotInstanceBidPct() + ", maximum is " +
+                        configuration.getMaxEmrSpotInstanceBidPct() + ".");
+            }
+        }
+    }
+
+    private String getAuditInfo(String exploratoryName) {
+        return String.format(AUDIT_MESSAGE, exploratoryName);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/azure/AzureOauthResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/azure/AzureOauthResource.java
new file mode 100644
index 0000000..a6a96df
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/azure/AzureOauthResource.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources.azure;
+
+import com.epam.datalab.auth.contract.SecurityAPI;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.azure.auth.AuthorizationCodeFlowResponse;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.net.URI;
+
+@Path("/user/azure")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class AzureOauthResource {
+
+    @Inject
+    @Named(ServiceConsts.SECURITY_SERVICE_NAME)
+    private RESTService securityService;
+
+
+    @GET
+    @Path("/init")
+    public Response redirectedUrl() {
+        return Response.seeOther(URI.create(securityService.get(SecurityAPI.INIT_LOGIN_OAUTH_AZURE, String.class)))
+                .build();
+    }
+
+    @POST
+    @Path("/oauth")
+    public Response login(AuthorizationCodeFlowResponse codeFlowResponse) {
+        return securityService.post(SecurityAPI.LOGIN_OAUTH_AZURE, codeFlowResponse, Response.class);
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/azure/ComputationalResourceAzure.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/azure/ComputationalResourceAzure.java
new file mode 100644
index 0000000..f1582f2
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/azure/ComputationalResourceAzure.java
@@ -0,0 +1,181 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.azure;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
+import com.epam.datalab.backendapi.roles.RoleType;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.backendapi.service.ComputationalService;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import io.swagger.v3.oas.annotations.Parameter;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+import static com.epam.datalab.rest.contracts.ComputationalAPI.AUDIT_COMPUTATIONAL_RECONFIGURE_MESSAGE;
+import static com.epam.datalab.rest.contracts.ComputationalAPI.AUDIT_MESSAGE;
+
+/**
+ * Provides the REST API for the computational resource on Azure.
+ */
+@Path("/azure/infrastructure_provision/computational_resources")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ComputationalResourceAzure {
+    private final ComputationalService computationalService;
+
+    @Inject
+    public ComputationalResourceAzure(ComputationalService computationalService) {
+        this.computationalService = computationalService;
+    }
+
+    @GET
+    @Path("/{project}/{endpoint}/templates")
+    public Response getTemplates(@Auth @Parameter(hidden = true) UserInfo userInfo, @PathParam("project") String project,
+                                 @PathParam("endpoint") String endpoint) {
+        return Response.ok(computationalService.getComputationalNamesAndTemplates(userInfo, project, endpoint)).build();
+    }
+
+    /**
+     * Asynchronously creates computational Spark cluster.
+     *
+     * @param userInfo user info.
+     * @param form     user info about creation of the computational resource.
+     * @return 200 OK if request success, 302 Found - for duplicates, otherwise throws exception.
+     * @throws IllegalArgumentException if input is not valid or exceeds configuration limits
+     */
+    @PUT
+    @Path("dataengine")
+    public Response createDataEngine(@Auth UserInfo userInfo,
+                                     @Valid @NotNull SparkStandaloneClusterCreateForm form) {
+        log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
+        if (!UserRoles.checkAccess(userInfo, RoleType.COMPUTATIONAL, form.getImage(), userInfo.getRoles())) {
+            log.warn("Unauthorized attempt to create a {} by user {}", form.getImage(), userInfo.getName());
+            throw new DatalabException("You do not have the privileges to create a " + form.getTemplateName());
+        }
+
+        return computationalService.createSparkCluster(userInfo, form.getName(), form, form.getProject(), getAuditInfo(form.getNotebookName()))
+                ? Response.ok().build()
+                : Response.status(Response.Status.FOUND).build();
+    }
+
+    /**
+     * Sends request to provisioning service for termination the computational resource for user.
+     *
+     * @param userInfo          user info.
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @return 200 OK if operation is successfully triggered
+     */
+    @DELETE
+    @Path("/{projectName}/{exploratoryName}/{computationalName}/terminate")
+    public Response terminate(@Auth UserInfo userInfo,
+                              @PathParam("projectName") String projectName,
+                              @PathParam("exploratoryName") String exploratoryName,
+                              @PathParam("computationalName") String computationalName) {
+
+        log.debug("Terminating computational resource {} for user {}", computationalName, userInfo.getName());
+
+        computationalService.terminateComputational(userInfo, userInfo.getName(), projectName, exploratoryName, computationalName, getAuditInfo(exploratoryName));
+        return Response.ok().build();
+    }
+
+    /**
+     * Sends request to provisioning service for stopping the computational resource for user.
+     *
+     * @param userInfo          user info.
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @return 200 OK if operation is successfully triggered
+     */
+    @DELETE
+    @Path("/{project}/{exploratoryName}/{computationalName}/stop")
+    public Response stop(@Auth UserInfo userInfo,
+                         @PathParam("project") String project,
+                         @PathParam("exploratoryName") String exploratoryName,
+                         @PathParam("computationalName") String computationalName) {
+        log.debug("Stopping computational resource {} for user {}", computationalName, userInfo.getName());
+
+        computationalService.stopSparkCluster(userInfo, userInfo.getName(), project, exploratoryName, computationalName, getAuditInfo(exploratoryName));
+        return Response.ok().build();
+    }
+
+    /**
+     * Sends request to provisioning service for starting the computational resource for user.
+     *
+     * @param userInfo          user info.
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @return 200 OK if operation is successfully triggered
+     */
+    @PUT
+    @Path("/{project}/{exploratoryName}/{computationalName}/start")
+    public Response start(@Auth UserInfo userInfo,
+                          @PathParam("exploratoryName") String exploratoryName,
+                          @PathParam("computationalName") String computationalName,
+                          @PathParam("project") String project) {
+        log.debug("Starting computational resource {} for user {}", computationalName, userInfo.getName());
+
+        computationalService.startSparkCluster(userInfo, exploratoryName, computationalName, project, getAuditInfo(exploratoryName));
+        return Response.ok().build();
+    }
+
+    @PUT
+    @Path("dataengine/{projectName}/{exploratoryName}/{computationalName}/config")
+    public Response updateDataEngineConfig(@Auth UserInfo userInfo,
+                                           @PathParam("projectName") String projectName,
+                                           @PathParam("exploratoryName") String exploratoryName,
+                                           @PathParam("computationalName") String computationalName,
+                                           @Valid @NotNull List<ClusterConfig> config) {
+
+        computationalService.updateSparkClusterConfig(userInfo, projectName, exploratoryName, computationalName, config,
+                String.format(AUDIT_COMPUTATIONAL_RECONFIGURE_MESSAGE, computationalName, exploratoryName));
+        return Response.ok().build();
+    }
+
+    @GET
+    @Path("/{projectName}/{exploratoryName}/{computationalName}/config")
+    public Response getClusterConfig(@Auth UserInfo userInfo,
+                                     @PathParam("projectName") String projectName,
+                                     @PathParam("exploratoryName") String exploratoryName,
+                                     @PathParam("computationalName") String computationalName) {
+        return Response.ok(computationalService.getClusterConfig(userInfo, projectName, exploratoryName, computationalName)).build();
+    }
+
+    private String getAuditInfo(String exploratoryName) {
+        return String.format(AUDIT_MESSAGE, exploratoryName);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/BackupCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/BackupCallback.java
new file mode 100644
index 0000000..5460625
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/BackupCallback.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.callback;
+
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.BackupService;
+import com.epam.datalab.dto.backup.EnvBackupStatusDTO;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+@Path("infrastructure/backup")
+@Consumes(MediaType.APPLICATION_JSON)
+@Slf4j
+public class BackupCallback {
+
+    @Inject
+    private BackupService backupService;
+
+    @Inject
+    private RequestId requestId;
+
+    @Context
+    private UriInfo uriInfo;
+
+    @POST
+    @Path("/status")
+    public Response status(EnvBackupStatusDTO dto) {
+        requestId.remove(dto.getRequestId());
+        log.debug("Updating status of backup status to {}", dto);
+        backupService.updateStatus(dto.getEnvBackupDTO(), dto.getUser(),
+                dto.getEnvBackupStatus().withErrorMessage(dto.getErrorMessage()));
+        return Response.created(uriInfo.getRequestUri()).build();
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/CheckInactivityCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/CheckInactivityCallback.java
new file mode 100644
index 0000000..32b0ed8
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/CheckInactivityCallback.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources.callback;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.InactivityService;
+import com.epam.datalab.dto.computational.CheckInactivityStatusDTO;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.time.LocalDateTime;
+
+import static java.time.Instant.ofEpochSecond;
+import static java.time.ZoneId.systemDefault;
+
+@Path("/infrastructure/inactivity/callback")
+@Consumes(MediaType.APPLICATION_JSON)
+@Slf4j
+public class CheckInactivityCallback {
+
+    @Inject
+    private RequestId requestId;
+    @Inject
+    private InactivityService inactivityService;
+
+    @POST
+    @Path("exploratory")
+    public Response updateExploratoryLastActivity(CheckInactivityStatusDTO dto) {
+        requestId.checkAndRemove(dto.getRequestId());
+        inactivityService.updateLastActivityForExploratory(new UserInfo(dto.getUser(), null), dto.getExploratoryName(),
+                toLocalDateTime(dto.getLastActivityUnixTime()));
+        return Response.ok().build();
+    }
+
+    @POST
+    @Path("computational")
+    public Response updateComputationalLastActivity(CheckInactivityStatusDTO dto) {
+        requestId.checkAndRemove(dto.getRequestId());
+        inactivityService.updateLastActivityForComputational(new UserInfo(dto.getUser(), null), null,
+                dto.getExploratoryName(), dto.getComputationalName(), toLocalDateTime(dto.getLastActivityUnixTime()));
+        return Response.ok().build();
+    }
+
+    private LocalDateTime toLocalDateTime(long unixTime) {
+        return ofEpochSecond(unixTime).atZone(systemDefault()).toLocalDateTime();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ComputationalCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ComputationalCallback.java
new file mode 100644
index 0000000..74c5910
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ComputationalCallback.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.callback;
+
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.ComputationalService;
+import com.epam.datalab.backendapi.service.ReuploadKeyService;
+import com.epam.datalab.backendapi.service.SecurityService;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.computational.ComputationalStatusDTO;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Date;
+
+@Path("/infrastructure_provision/computational_resources")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ComputationalCallback {
+
+    @Inject
+    private ComputationalDAO computationalDAO;
+    @Inject
+    private RequestId requestId;
+    @Inject
+    private SecurityService securityService;
+    @Inject
+    private ReuploadKeyService reuploadKeyService;
+    @Inject
+    private ComputationalService computationalService;
+
+    /**
+     * Updates the status of the computational resource for user.
+     *
+     * @param dto DTO info about the status of the computational resource.
+     * @return 200 OK - if request success otherwise throws exception.
+     */
+    @POST
+    @Path(ApiCallbacks.STATUS_URI)
+    public Response status(ComputationalStatusDTO dto) {
+
+        log.debug("Updating status for computational resource {} for user {}: {}",
+                dto.getComputationalName(), dto.getUser(), dto);
+        String uuid = dto.getRequestId();
+        requestId.checkAndRemove(uuid);
+
+        UserComputationalResource compResource = computationalService.getComputationalResource(dto.getUser(), dto.getProject(),
+                dto.getExploratoryName(), dto.getComputationalName())
+                .orElseThrow(() ->
+                        new DatalabException(String.format("Computational resource %s of exploratory environment %s of " +
+                                        "project %s for user %s doesn't exist", dto.getComputationalName(),
+                                dto.getExploratoryName(), dto.getProject(), dto.getUser())));
+
+
+        log.info("Current status for computational resource {} of exploratory environment {} for user {} is {}",
+                dto.getComputationalName(), dto.getExploratoryName(), dto.getUser(),
+                compResource.getStatus());
+        try {
+            computationalDAO.updateComputationalFields(dto
+                    .withLastActivity(new Date()));
+//                    .withStatus(UserInstanceStatus.RUNNING));
+        } catch (DatalabException e) {
+            log.error("Could not update status for computational resource {} for user {} to {}: {}", dto, e);
+            throw e;
+        }
+        if (UserInstanceStatus.CONFIGURING == UserInstanceStatus.of(dto.getStatus())) {
+            log.debug("Waiting for configuration of the computational resource {} for user {}",
+                    dto.getComputationalName(), dto.getUser());
+            requestId.put(dto.getUser(), uuid);
+        }
+        return Response.ok().build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/EnvironmentStatusCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/EnvironmentStatusCallback.java
new file mode 100644
index 0000000..4a9c0d0
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/EnvironmentStatusCallback.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.callback;
+
+import com.epam.datalab.backendapi.dao.EnvDAO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.EnvironmentService;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.status.EnvStatusDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("/infrastructure")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class EnvironmentStatusCallback {
+
+    private final RequestId requestId;
+    private final EnvironmentService environmentService;
+
+    @Inject
+    public EnvironmentStatusCallback(RequestId requestId, EnvironmentService environmentService) {
+        this.requestId = requestId;
+        this.environmentService = environmentService;
+    }
+
+    /**
+     * Updates the status of the resources for user.
+     *
+     * @param dto DTO info about the statuses of resources.
+     * @return Always return code 200 (OK).
+     */
+    @POST
+    @Path(ApiCallbacks.STATUS_URI)
+    public Response status(EnvStatusDTO dto) {
+        requestId.checkAndRemove(dto.getRequestId());
+        log.info("Updating statuses of following resources {} ", dto.getResourceList());
+        try {
+            if (UserInstanceStatus.FAILED == UserInstanceStatus.of(dto.getStatus())) {
+                log.warn("Request for the status of resources for user {} fails: {}", dto.getUser(), dto.getErrorMessage());
+            } else {
+                environmentService.updateEnvironmentStatuses(dto.getResourceList());
+            }
+        } catch (DatalabException e) {
+            log.warn("Could not update status of resources for user {}: {}", dto.getUser(), e.getLocalizedMessage(), e);
+        }
+        return Response.ok().build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ExploratoryCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ExploratoryCallback.java
new file mode 100644
index 0000000..1e5f8fb
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ExploratoryCallback.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.callback;
+
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.backendapi.service.ReuploadKeyService;
+import com.epam.datalab.backendapi.service.SecurityService;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.exploratory.ExploratoryStatusDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Date;
+
+import static com.epam.datalab.dto.UserInstanceStatus.FAILED;
+import static com.epam.datalab.dto.UserInstanceStatus.STOPPED;
+import static com.epam.datalab.dto.UserInstanceStatus.STOPPING;
+import static com.epam.datalab.dto.UserInstanceStatus.TERMINATED;
+import static com.epam.datalab.dto.UserInstanceStatus.TERMINATING;
+
+
+@Path("/infrastructure_provision/exploratory_environment")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ExploratoryCallback {
+
+    private static final String USER_INSTANCE_NOT_EXIST_MSG = "User instance with exploratory name %s for user %s " +
+            "doesn't exist";
+    @Inject
+    private ExploratoryDAO exploratoryDAO;
+    @Inject
+    private ComputationalDAO computationalDAO;
+    @Inject
+    private RequestId requestId;
+    @Inject
+    private SecurityService securityService;
+    @Inject
+    private ReuploadKeyService reuploadKeyService;
+    @Inject
+    private ExploratoryService exploratoryService;
+
+    /**
+     * Changes the status of exploratory environment.
+     *
+     * @param dto description of status.
+     * @return 200 OK - if request success.
+     */
+    @POST
+    @Path(ApiCallbacks.STATUS_URI)
+    public Response status(ExploratoryStatusDTO dto) {
+        log.debug("Updating status for exploratory environment {} for user {} to {}",
+                dto.getExploratoryName(), dto.getUser(), dto.getStatus());
+        requestId.checkAndRemove(dto.getRequestId());
+
+        UserInstanceDTO instance = exploratoryService.getUserInstance(dto.getUser(), dto.getProject(), dto.getExploratoryName())
+                .orElseThrow(() -> new DatalabException(String.format(USER_INSTANCE_NOT_EXIST_MSG,
+                        dto.getExploratoryName(), dto.getUser())));
+
+        UserInstanceStatus currentStatus = UserInstanceStatus.of(instance.getStatus());
+        log.debug("Current status for exploratory environment {} for user {} is {}",
+                dto.getExploratoryName(), dto.getUser(), currentStatus);
+
+        try {
+            exploratoryDAO.updateExploratoryFields(dto.withLastActivity(new Date()));
+            if (currentStatus == TERMINATING) {
+                updateComputationalStatuses(dto.getUser(), dto.getProject(), dto.getExploratoryName(),
+                        UserInstanceStatus.of(dto.getStatus()));
+            } else if (currentStatus == STOPPING) {
+                updateComputationalStatuses(dto.getUser(), dto.getProject(), dto.getExploratoryName(),
+                        UserInstanceStatus.of(dto.getStatus()), TERMINATED, FAILED, TERMINATED, STOPPED);
+            }
+        } catch (DatalabException e) {
+            log.error("Could not update status for exploratory environment {} in project {} for user {} to {}",
+                    dto.getExploratoryName(), dto.getProject(), dto.getUser(), dto.getStatus(), e);
+            throw new DatalabException("Could not update status for exploratory environment " + dto.getExploratoryName() +
+                    " for user " + dto.getUser() + " to " + dto.getStatus() + ": " + e.getLocalizedMessage(), e);
+        }
+
+        return Response.ok().build();
+    }
+
+    /**
+     * Updates the computational status of exploratory environment.
+     *
+     * @param user            user name
+     * @param project         project name
+     * @param exploratoryName name of exploratory environment.
+     * @param status          status for exploratory environment.
+     */
+    private void updateComputationalStatuses(String user, String project, String exploratoryName, UserInstanceStatus status) {
+        log.debug("updating status for all computational resources of {} for user {}: {}", exploratoryName, user,
+                status);
+        computationalDAO.updateComputationalStatusesForExploratory(new ExploratoryStatusDTO()
+                .withUser(user)
+                .withExploratoryName(exploratoryName)
+                .withProject(project)
+                .withStatus(status));
+    }
+
+    private void updateComputationalStatuses(String user, String project, String exploratoryName, UserInstanceStatus
+            dataEngineStatus, UserInstanceStatus dataEngineServiceStatus, UserInstanceStatus... excludedStatuses) {
+        log.debug("updating status for all computational resources of {} for user {}: DataEngine {}, " +
+                "dataengine-service {}", exploratoryName, user, dataEngineStatus, dataEngineServiceStatus);
+        computationalDAO.updateComputationalStatusesForExploratory(user, project, exploratoryName,
+                dataEngineStatus, dataEngineServiceStatus, excludedStatuses);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/GitCredsCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/GitCredsCallback.java
new file mode 100644
index 0000000..95ea583
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/GitCredsCallback.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.callback;
+
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.exploratory.ExploratoryStatusDTO;
+import com.epam.datalab.rest.contracts.ApiCallbacks;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("/user/git_creds")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class GitCredsCallback {
+
+    @Inject
+    private RequestId requestId;
+
+    /**
+     * Update GIT credentials status in Mongo DB for user.
+     *
+     * @param dto description of status.
+     * @return 200 OK - if request success.
+     */
+    @POST
+    @Path(ApiCallbacks.STATUS_URI)
+    public Response status(ExploratoryStatusDTO dto) {
+        if (UserInstanceStatus.CREATED != UserInstanceStatus.of(dto.getStatus())) {
+            log.error("Git creds has not been updated for exploratory environment {} for user {}, status is {}",
+                    dto.getExploratoryName(), dto.getUser(), dto.getStatus());
+        } else {
+            log.debug("Git creds has been updated for exploratory environment {} for user {}, status is {}",
+                    dto.getExploratoryName(), dto.getUser(), dto.getStatus());
+        }
+        requestId.checkAndRemove(dto.getRequestId());
+        return Response.ok().build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ImageCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ImageCallback.java
new file mode 100644
index 0000000..587c8ea
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ImageCallback.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.callback;
+
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.ImageExploratoryService;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.exploratory.ImageCreateStatusDTO;
+import com.epam.datalab.dto.exploratory.ImageStatus;
+import com.epam.datalab.model.exploratory.Image;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("/infrastructure_provision/image")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ImageCallback {
+
+    @Inject
+    private ImageExploratoryService imageExploratoryService;
+    @Inject
+    private RequestId requestId;
+
+    @POST
+    @Path("/image_status")
+    public Response imageCreateStatus(ImageCreateStatusDTO dto) {
+        log.debug("Updating status of image {} for user {} to {}", dto.getName(), dto.getUser(), dto);
+        requestId.remove(dto.getRequestId());
+        imageExploratoryService.finishImageCreate(getImage(dto), dto.getExploratoryName(), dto.getImageCreateDTO()
+                .getIp());
+        return Response.status(Response.Status.CREATED).build();
+    }
+
+    private Image getImage(ImageCreateStatusDTO dto) {
+        return Image.builder()
+                .name(dto.getName())
+                .user(dto.getUser())
+                .project(dto.getProject())
+                .endpoint(dto.getEndpoint())
+                .externalName(dto.getImageCreateDTO().getExternalName())
+                .fullName(dto.getImageCreateDTO().getFullName())
+                .status(UserInstanceStatus.FAILED == UserInstanceStatus.of(dto.getStatus()) ?
+                        ImageStatus.FAILED : dto.getImageCreateDTO().getStatus())
+                .application(dto.getImageCreateDTO().getApplication()).build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/LibraryCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/LibraryCallback.java
new file mode 100644
index 0000000..e3d69ad
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/LibraryCallback.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.callback;
+
+import com.epam.datalab.backendapi.dao.ExploratoryLibDAO;
+import com.epam.datalab.backendapi.domain.ExploratoryLibCache;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.exploratory.LibInstallStatusDTO;
+import com.epam.datalab.dto.exploratory.LibListStatusDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("/infrastructure_provision/library")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class LibraryCallback {
+
+    @Inject
+    private ExploratoryLibDAO libraryDAO;
+    @Inject
+    private RequestId requestId;
+
+    /**
+     * Changes the status of installed libraries for exploratory environment.
+     *
+     * @param dto description of status.
+     * @return 200 OK - if request success.
+     */
+    @POST
+    @Path("/lib_status")
+    public Response libInstallStatus(LibInstallStatusDTO dto) {
+        log.debug("Updating status of libraries for exploratory environment {} for user {} to {}",
+                dto.getExploratoryName(), dto.getUser(), dto);
+        requestId.checkAndRemove(dto.getRequestId());
+        try {
+            libraryDAO.updateLibraryFields(dto);
+        } catch (DatalabException e) {
+            log.error("Cannot update status of libraries for exploratory environment {} for user {} to {}",
+                    dto.getExploratoryName(), dto.getUser(), dto, e);
+            throw new DatalabException("Cannot update status of libaries for exploratory environment " + dto.getExploratoryName() +
+                    " for user " + dto.getUser() + ": " + e.getLocalizedMessage(), e);
+        }
+
+        return Response.ok().build();
+    }
+
+
+    /**
+     * Updates the list of libraries.
+     *
+     * @param dto DTO the list of libraries.
+     * @return Always return code 200 (OK).
+     */
+    @POST
+    @Path("/update_lib_list")
+    public Response updateLibList(LibListStatusDTO dto) {
+        log.debug("Updating the list of libraries for image {}", dto.getGroup());
+        requestId.checkAndRemove(dto.getRequestId());
+        try {
+            if (UserInstanceStatus.FAILED == UserInstanceStatus.of(dto.getStatus())) {
+                log.warn("Request for the list of libraries for {} fails: {}", dto.getGroup(), dto.getErrorMessage());
+                ExploratoryLibCache.getCache().updateLibListStatus(dto.getGroup());
+            } else {
+                ExploratoryLibCache.getCache().updateLibList(dto.getGroup(), dto.getLibs());
+            }
+        } catch (Exception e) {
+            log.warn("Cannot update the list of libs: {}", e.getLocalizedMessage(), e);
+        }
+        return Response.ok().build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/OdahuCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/OdahuCallback.java
new file mode 100644
index 0000000..8696fad
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/OdahuCallback.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.callback;
+
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.OdahuService;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.odahu.OdahuResult;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Optional;
+
+@Path("odahu/status")
+@Consumes(MediaType.APPLICATION_JSON)
+public class OdahuCallback {
+
+	private final OdahuService odahuService;
+	private final RequestId requestId;
+
+	@Inject
+	public OdahuCallback(OdahuService odahuService, RequestId requestId) {
+		this.odahuService = odahuService;
+		this.requestId = requestId;
+	}
+
+	@POST
+	public Response updateOdahuStatus(OdahuResult result) {
+		requestId.checkAndRemove(result.getRequestId());
+		final UserInstanceStatus status = UserInstanceStatus.of(result.getStatus());
+		Optional.ofNullable(status)
+				.orElseThrow(() -> new DatalabException(String.format("Cannot convert %s to UserInstanceStatus", status)));
+
+		odahuService.updateStatus(result, status);
+		return Response.ok().build();
+	}
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java
new file mode 100644
index 0000000..d8c70d9
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ProjectCallback.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.callback;
+
+import com.epam.datalab.backendapi.dao.EndpointDAO;
+import com.epam.datalab.backendapi.dao.GpuDAO;
+import com.epam.datalab.backendapi.dao.ProjectDAO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.schedulers.CheckInfrastructureStatusScheduler;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.project.ProjectResult;
+import com.epam.datalab.dto.imagemetadata.EdgeGPU;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+import java.util.Objects;
+
+@Path("/project/status")
+@Consumes(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ProjectCallback {
+
+    private final ProjectDAO projectDAO;
+    private final ExploratoryService exploratoryService;
+    private final RequestId requestId;
+    private final GpuDAO gpuDAO;
+    private final CheckInfrastructureStatusScheduler scheduler;
+
+    @Inject
+    public ProjectCallback(ProjectDAO projectDAO, EndpointDAO endpointDAO, ExploratoryService exploratoryService, RequestId requestId,
+                           GpuDAO gpuDAO, CheckInfrastructureStatusScheduler scheduler) {
+        this.projectDAO = projectDAO;
+        this.exploratoryService = exploratoryService;
+        this.requestId = requestId;
+        this.gpuDAO = gpuDAO;
+        this.scheduler = scheduler;
+    }
+
+
+    @POST
+    public Response updateProjectStatus(ProjectResult projectResult) {
+        try {
+            requestId.checkAndRemove(projectResult.getRequestId());
+            final String projectName = projectResult.getProjectName();
+            final UserInstanceStatus status = UserInstanceStatus.of(projectResult.getStatus());
+            saveGpuForProject(projectResult, projectName);
+            if (UserInstanceStatus.RUNNING == status && Objects.nonNull(projectResult.getEdgeInfo())) {
+                projectDAO.updateEdgeInfo(projectName, projectResult.getEndpointName(), projectResult.getEdgeInfo());
+            } else {
+                updateExploratoriesStatusIfNeeded(status, projectResult.getProjectName(), projectResult.getEndpointName());
+                projectDAO.updateEdgeStatus(projectName, projectResult.getEndpointName(), status);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            log.info("Run scheduler");
+            scheduler.execute(null);
+        }
+        return Response.ok().build();
+    }
+
+    private void saveGpuForProject(ProjectResult projectResult, String projectName) {
+        try {
+
+            if (projectResult.getEdgeInfo().getGpuList() != null) {
+                List<String> gpuList = projectResult.getEdgeInfo().getGpuList();
+                log.info("Adding edgeGpu with gpu_types: {}, for project: {}", gpuList, projectName);
+                gpuDAO.create(new EdgeGPU(projectName, gpuList));
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            throw new DatalabException(e.getMessage(), e);
+        }
+    }
+
+    private void updateExploratoriesStatusIfNeeded(UserInstanceStatus status, String projectName, String endpoint) {
+        if (UserInstanceStatus.TERMINATED == status) {
+            exploratoryService.updateProjectExploratoryStatuses(projectName, endpoint, UserInstanceStatus.TERMINATED);
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ReuploadKeyCallback.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ReuploadKeyCallback.java
new file mode 100644
index 0000000..de371d8
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/callback/ReuploadKeyCallback.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.callback;
+
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.ReuploadKeyService;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyStatusDTO;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+@Path("infrastructure/reupload_key")
+@Consumes(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ReuploadKeyCallback {
+
+    @Inject
+    private RequestId requestId;
+    @Inject
+    private ReuploadKeyService reuploadKeyService;
+
+    @Context
+    private UriInfo uriInfo;
+
+    @POST
+    @Path("/callback")
+    public Response reuploadKeyResponse(ReuploadKeyStatusDTO dto) {
+        requestId.remove(dto.getRequestId());
+        reuploadKeyService.updateResourceData(dto);
+        return Response.ok(uriInfo.getRequestUri()).build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BackupFormDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BackupFormDTO.java
new file mode 100644
index 0000000..42ca342
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BackupFormDTO.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import java.util.List;
+
+@Data
+@ToString
+public class BackupFormDTO {
+    @NotEmpty
+    private final List<String> configFiles;
+    @NotEmpty
+    private final List<String> keys;
+    @NotEmpty
+    private final List<String> certificates;
+    private final List<String> jars;
+    private final boolean databaseBackup;
+    private final boolean logsBackup;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BackupInfoRecord.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BackupInfoRecord.java
new file mode 100644
index 0000000..e8425f9
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BackupInfoRecord.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.dto.backup.EnvBackupStatus;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class BackupInfoRecord {
+
+    private final List<String> configFiles;
+    private final List<String> keys;
+    private final List<String> certificates;
+    private final List<String> jars;
+    private final boolean databaseBackup;
+    private final boolean logsBackup;
+    private final String backupFile;
+    private final EnvBackupStatus status;
+    @JsonProperty("error_message")
+    private final String errorMessage;
+    private final Date timestamp;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BillingFilter.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BillingFilter.java
new file mode 100644
index 0000000..82a2761
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BillingFilter.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+
+import java.util.Collections;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class BillingFilter {
+    @NonNull
+    private List<String> users;
+    @NonNull
+    private String datalabId;
+    @NonNull
+    @JsonProperty("date_start")
+    private String dateStart;
+    @NonNull
+    @JsonProperty("date_end")
+    private String dateEnd;
+    @NonNull
+    @JsonProperty("resource_type")
+    private List<String> resourceTypes;
+    @NonNull
+    private List<UserInstanceStatus> statuses = Collections.emptyList();
+    @NonNull
+    private List<String> projects;
+    @NonNull
+    private List<String> products;
+    @NonNull
+    private List<String> shapes;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BucketDeleteDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BucketDeleteDTO.java
new file mode 100644
index 0000000..7787ec0
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BucketDeleteDTO.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import java.util.List;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class BucketDeleteDTO {
+    @NotBlank(message = "field cannot be empty")
+    private final String bucket;
+    @NotBlank(message = "field cannot be empty")
+    private final String endpoint;
+    @NotEmpty(message = "field cannot be empty")
+    private final List<String> objects;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BucketDownloadDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BucketDownloadDTO.java
new file mode 100644
index 0000000..8a80711
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/BucketDownloadDTO.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class BucketDownloadDTO {
+    @NotBlank(message = "field cannot be empty")
+    private final String bucket;
+    @NotBlank(message = "field cannot be empty")
+    private final String object;
+    @NotBlank(message = "field cannot be empty")
+    private final String endpoint;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ComputationalCreateFormDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ComputationalCreateFormDTO.java
new file mode 100644
index 0000000..aab25ec
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ComputationalCreateFormDTO.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * Stores info about creation of the computational resource.
+ */
+@Data
+public class ComputationalCreateFormDTO {
+
+    @NotBlank
+    @JsonProperty("template_name")
+    private String templateName;
+
+    @NotBlank
+    @JsonProperty
+    private String image;
+
+    @NotBlank
+    @JsonProperty
+    private String name;
+
+    @NotBlank
+    @JsonProperty
+    private String project;
+    @JsonProperty("custom_tag")
+    private String customTag;
+
+    @NotBlank
+    @JsonProperty("notebook_name")
+    private String notebookName;
+
+    @JsonProperty("check_inactivity_required")
+    private boolean checkInactivityRequired = true;
+
+    @Valid
+    private List<ClusterConfig> config;
+
+    @JsonProperty("gpu_tag")
+    protected boolean gpuTag = false;
+
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ComputationalTemplatesDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ComputationalTemplatesDTO.java
new file mode 100644
index 0000000..15bec62
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ComputationalTemplatesDTO.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.dto.base.computational.FullComputationalTemplate;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ComputationalTemplatesDTO {
+    private final List<FullComputationalTemplate> templates;
+    @JsonProperty("user_computations")
+    private final List<String> userComputations;
+    @JsonProperty("project_computations")
+    private final List<String> projectComputations;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryActionFormDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryActionFormDTO.java
new file mode 100644
index 0000000..d02599e7f
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryActionFormDTO.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.NotBlank;
+
+/**
+ * Stores info about action on the exploratory resource.
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ExploratoryActionFormDTO {
+    @NotBlank
+    @JsonProperty("notebook_instance_name")
+    private String notebookInstanceName;
+
+    @NotBlank
+    @JsonProperty("project_name")
+    private String projectName;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryCreateFormDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryCreateFormDTO.java
new file mode 100644
index 0000000..8794bee
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryCreateFormDTO.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+import java.util.List;
+
+/**
+ * Stores info about new exploratory.
+ */
+@Data
+public class ExploratoryCreateFormDTO {
+    @NotBlank
+    @JsonProperty
+    private String image;
+    @NotBlank
+    @JsonProperty("template_name")
+    private String templateName;
+    @NotBlank
+    @JsonProperty
+    private String name;
+    @NotBlank
+    @JsonProperty
+    private String project;
+    @JsonProperty("custom_tag")
+    private String exploratoryTag;
+    @NotBlank
+    @JsonProperty
+    private String endpoint;
+    @NotBlank
+    @JsonProperty
+    private String shape;
+    @NotBlank
+    @JsonProperty
+    private String version;
+    @JsonProperty("notebook_image_name")
+    private String imageName;
+    @JsonProperty("cluster_config")
+    private List<ClusterConfig> clusterConfig;
+    @JsonProperty("gpu_enabled")
+    private Boolean enabledGPU;
+    @JsonProperty("gpu_type")
+    private String gpuType;
+    @JsonProperty("gpu_count")
+    private String gpuCount;
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("name", name)
+                .add("templateName", templateName)
+                .add("shape", shape)
+                .add("version", version)
+                .add("image", image)
+                .add("imageName", imageName)
+                .toString();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryCreatePopUp.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryCreatePopUp.java
new file mode 100644
index 0000000..4367244
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryCreatePopUp.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class ExploratoryCreatePopUp {
+    @JsonProperty("user_projects")
+    private final List<ProjectDTO> userProjects;
+    @JsonProperty("project_exploratories")
+    private final Map<String, List<String>> projectExploratories;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryImageCreateFormDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryImageCreateFormDTO.java
new file mode 100644
index 0000000..a60c54d
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExploratoryImageCreateFormDTO.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.validator.constraints.NotBlank;
+
+@Data
+@ToString
+public class ExploratoryImageCreateFormDTO {
+    @NotBlank
+    private final String name;
+    @NotBlank
+    @JsonProperty("exploratory_name")
+    private String notebookName;
+    @NotBlank
+    @JsonProperty("project_name")
+    private String projectName;
+    private final String description;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExportBillingFilter.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExportBillingFilter.java
new file mode 100644
index 0000000..007fc92
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ExportBillingFilter.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@JsonIgnoreProperties(ignoreUnknown = true)
+@NoArgsConstructor
+public class ExportBillingFilter extends BillingFilter {
+	@NonNull
+	private String locale;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/FolderUploadDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/FolderUploadDTO.java
new file mode 100644
index 0000000..5ae9086
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/FolderUploadDTO.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class FolderUploadDTO {
+    @NotBlank(message = "field cannot be empty")
+    private final String bucket;
+    @NotBlank(message = "field cannot be empty")
+    private final String folder;
+    @NotBlank(message = "field cannot be empty")
+    private final String endpoint;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/GroupDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/GroupDTO.java
new file mode 100644
index 0000000..3439a6c
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/GroupDTO.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+@Getter
+@Setter
+public class GroupDTO {
+    @NotEmpty
+    private String name;
+    @NotEmpty
+    private Map<String, String> roleIds;
+    private Set<String> users = Collections.emptySet();
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusDTO.java
new file mode 100644
index 0000000..3182e68
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusDTO.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+/**
+ * Stores the health statuses for services.
+ */
+public class HealthStatusDTO {
+    @JsonProperty("mongo_alive")
+    private boolean mongoAlive;
+    @JsonProperty("provisioning_alive")
+    private boolean provisioningAlive;
+
+    /**
+     * Returns <b>true</b> if the Mongo database is available.
+     */
+    public boolean isMongoAlive() {
+        return mongoAlive;
+    }
+
+    /**
+     * Sets the Mongo database availability.
+     */
+    public void setMongoAlive(boolean mongoAlive) {
+        this.mongoAlive = mongoAlive;
+    }
+
+    /**
+     * Sets the Mongo database availability.
+     */
+    public HealthStatusDTO withMongoAlive(boolean mongoAlive) {
+        setMongoAlive(mongoAlive);
+        return this;
+    }
+
+    /**
+     * Returns <b>true</b> if the provisioning service is available.
+     */
+    public boolean isProvisioningAlive() {
+        return provisioningAlive;
+    }
+
+    /**
+     * Sets the provisioning service availability.
+     */
+    public void setProvisioningAlive(boolean provisioningAlive) {
+        this.provisioningAlive = provisioningAlive;
+    }
+
+    /**
+     * Sets the provisioning service availability.
+     */
+    public HealthStatusDTO withProvisioningAlive(boolean provisioningAlive) {
+        setProvisioningAlive(provisioningAlive);
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("mongoAlive", mongoAlive)
+                .add("provisioningAlive", provisioningAlive)
+                .toString();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusEnum.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusEnum.java
new file mode 100644
index 0000000..e08531f
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusEnum.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources.dto;
+
+/**
+ * Statuses for the environment resource.
+ */
+public enum HealthStatusEnum {
+    ERROR,
+    WARNING,
+    OK;
+
+    @Override
+    public String toString() {
+        return super.toString().toLowerCase();
+    }
+
+    public static HealthStatusEnum of(String status) {
+        if (status != null) {
+            for (HealthStatusEnum uis : HealthStatusEnum.values()) {
+                if (status.equalsIgnoreCase(uis.toString())) {
+                    return uis;
+                }
+            }
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusPageDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusPageDTO.java
new file mode 100644
index 0000000..9db1cfc
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusPageDTO.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Stores the health statuses for environment resources.
+ */
+@Data
+@Builder
+public class HealthStatusPageDTO {
+    @JsonProperty
+    private String status;
+    @JsonProperty("list_resources")
+    private List<HealthStatusResource> listResources;
+    @JsonProperty
+    private boolean billingEnabled;
+    @JsonProperty
+    private boolean auditEnabled;
+    @JsonProperty
+    private boolean admin;
+    @JsonProperty
+    private boolean projectAdmin;
+    @JsonProperty
+    private boolean projectAssigned;
+    @JsonProperty
+    private BucketBrowser bucketBrowser;
+
+    @Builder
+    @Data
+    public static class BucketBrowser {
+        private final boolean view;
+        private final boolean upload;
+        private final boolean download;
+        private final boolean delete;
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusResource.java
new file mode 100644
index 0000000..5516160
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/HealthStatusResource.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
+/**
+ * Stores the health status for user environment.
+ */
+public class HealthStatusResource {
+    @JsonProperty("type")
+    private String type;
+    @JsonProperty("resource_id")
+    private String resourceId;
+    @JsonProperty("status")
+    private String status;
+
+    /**
+     * Return the type of resource.
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * Set the type of resource.
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
+     * Set the type of resource.
+     */
+    public HealthStatusResource withType(String type) {
+        setType(type);
+        return this;
+    }
+
+    /**
+     * Return the id of resource (ip address, path, etc).
+     */
+    public String getResourceId() {
+        return resourceId;
+    }
+
+    /**
+     * Set the id of resource (ip address, path, etc).
+     */
+    public void setResourceId(String resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    /**
+     * Set the id of resource (ip address, path, etc).
+     */
+    public HealthStatusResource withResourceId(String resourceId) {
+        setResourceId(resourceId);
+        return this;
+    }
+
+    /**
+     * Return the status of resource.
+     */
+    public String getStatus() {
+        return status;
+    }
+
+    /**
+     * Set the status of resource.
+     */
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    /**
+     * Set the status of resource.
+     */
+    public HealthStatusResource withStatus(String status) {
+        setStatus(status);
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("type", type)
+                .add("resourceId", resourceId)
+                .add("status", status)
+                .toString();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java
new file mode 100644
index 0000000..18692c3
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ImageInfoRecord.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.dto.exploratory.ImageStatus;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ImageInfoRecord {
+    private final String name;
+    private final String description;
+    private final String project;
+    private final String endpoint;
+    private final String user;
+    private final String application;
+    private final String fullName;
+    private final ImageStatus status;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/KeysDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/KeysDTO.java
new file mode 100644
index 0000000..9ed760b
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/KeysDTO.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@AllArgsConstructor
+@Data
+public class KeysDTO {
+    private String publicKey;
+    private String privateKey;
+    private String username;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibInfoRecord.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibInfoRecord.java
new file mode 100644
index 0000000..27571f1
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibInfoRecord.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonUnwrapped;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_EMPTY)
+public class LibInfoRecord {
+    @JsonProperty
+    @JsonUnwrapped
+    private LibKey libKey;
+
+    @JsonProperty
+    private List<LibraryStatus> status;
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibInstallFormDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibInstallFormDTO.java
new file mode 100644
index 0000000..0c9c603
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibInstallFormDTO.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.dto.exploratory.LibInstallDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import java.util.List;
+
+/**
+ * Stores info about the installation of libraries.
+ */
+@Data
+public class LibInstallFormDTO {
+    @NotBlank
+    @JsonProperty("exploratory_name")
+    private String notebookName;
+
+    @JsonProperty("computational_name")
+    private String computationalName;
+
+    @JsonProperty("project_name")
+    private String project;
+
+    @NotEmpty
+    @JsonProperty
+    private List<LibInstallDTO> libs;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibKey.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibKey.java
new file mode 100644
index 0000000..7337bdc
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibKey.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_EMPTY)
+public class LibKey {
+    @JsonProperty
+    private String name;
+    @JsonProperty
+    private String version;
+    @JsonProperty
+    private String group;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibraryAutoCompleteDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibraryAutoCompleteDTO.java
new file mode 100644
index 0000000..98fa4f5
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibraryAutoCompleteDTO.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.backendapi.domain.AutoCompleteEnum;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@Builder
+public class LibraryAutoCompleteDTO {
+    private AutoCompleteEnum autoComplete;
+    private List<LibraryDTO> libraries;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibraryDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibraryDTO.java
new file mode 100644
index 0000000..5ec5674
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibraryDTO.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class LibraryDTO {
+    private String name;
+    private String version;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibraryStatus.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibraryStatus.java
new file mode 100644
index 0000000..b503007
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/LibraryStatus.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_EMPTY)
+public class LibraryStatus {
+    @JsonProperty
+    private String resource;
+    @JsonProperty
+    private String resourceType;
+    @JsonProperty
+    private String status;
+    @JsonProperty
+    private String error;
+    @JsonProperty("available_versions")
+    private List<String> availableVersions;
+    @JsonProperty("add_pkgs")
+    private List<String> addedPackages;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectActionFormDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectActionFormDTO.java
new file mode 100644
index 0000000..9f6e61e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectActionFormDTO.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Data
+public class ProjectActionFormDTO {
+    @NotNull
+    @JsonProperty("project_name")
+    private final String projectName;
+    @NotNull
+    @JsonProperty("endpoint")
+    private final List<String> endpoints;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectInfrastructureInfo.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectInfrastructureInfo.java
new file mode 100644
index 0000000..e66408c
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/ProjectInfrastructureInfo.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.backendapi.domain.BillingReport;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.OdahuDTO;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.List;
+import java.util.Map;
+
+@AllArgsConstructor
+@Builder
+@EqualsAndHashCode
+@ToString
+public class ProjectInfrastructureInfo {
+	@JsonProperty
+	private String project;
+	@JsonProperty
+	private int billingQuoteUsed;
+	@JsonProperty
+	private Map<String, Map<String, String>> shared;
+	@JsonProperty
+	private List<UserInstanceDTO> exploratory;
+	@JsonProperty
+	private List<BillingReport> exploratoryBilling;
+	@JsonProperty
+	private List<OdahuDTO> odahu;
+	@JsonProperty
+	private List<EndpointDTO> endpoints;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/QuotaUsageDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/QuotaUsageDTO.java
new file mode 100644
index 0000000..7f4d3a2
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/QuotaUsageDTO.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+@Builder
+public class QuotaUsageDTO {
+    private int totalQuotaUsed;
+    private Map<String, Integer> projectQuotas;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SearchLibsFormDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SearchLibsFormDTO.java
new file mode 100644
index 0000000..509cab5
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SearchLibsFormDTO.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+@Data
+public class SearchLibsFormDTO {
+    @NotBlank
+    @JsonProperty("exploratory_name")
+    private String notebookName;
+
+    @NotBlank
+    @JsonProperty("project_name")
+    private String projectName;
+
+    @NotBlank
+    @JsonProperty
+    private String group;
+
+    @NotBlank
+    @JsonProperty("start_with")
+    private String startWith;
+
+    @JsonProperty("computational_name")
+    private String computationalName;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SparkStandaloneClusterCreateForm.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SparkStandaloneClusterCreateForm.java
new file mode 100644
index 0000000..3f66761
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SparkStandaloneClusterCreateForm.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.hibernate.validator.constraints.NotBlank;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class SparkStandaloneClusterCreateForm extends ComputationalCreateFormDTO {
+
+    @NotBlank
+    @JsonProperty("dataengine_instance_count")
+    private String dataEngineInstanceCount;
+
+    @NotBlank
+    @JsonProperty("master_instance_shape")
+    private String masterDataEngineInstanceShape;
+
+    @NotBlank
+    @JsonProperty("slave_instance_shape")
+    private String slaveDtaEngineInstanceShape;
+
+    @JsonProperty("gpu_enabled")
+    private Boolean enabledGPU;
+
+    @JsonProperty("master_gpu_type")
+    private String masterGpuType;
+
+    @JsonProperty("master_gpu_count")
+    private String masterGpuCount;
+
+    @JsonProperty("slave_gpu_type")
+    private String slaveGpuType;
+
+    @JsonProperty("slave_gpu_count")
+    private String slaveGpuCount;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SparkStandaloneConfiguration.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SparkStandaloneConfiguration.java
new file mode 100644
index 0000000..83603b7
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SparkStandaloneConfiguration.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class SparkStandaloneConfiguration {
+    @JsonProperty("min_spark_instance_count")
+    private int minSparkInstanceCount;
+    @JsonProperty("max_spark_instance_count")
+    private int maxSparkInstanceCount;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SystemInfoDto.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SystemInfoDto.java
new file mode 100644
index 0000000..3b945a7
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/SystemInfoDto.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.model.systeminfo.DiskInfo;
+import com.epam.datalab.model.systeminfo.MemoryInfo;
+import com.epam.datalab.model.systeminfo.OsInfo;
+import com.epam.datalab.model.systeminfo.ProcessorInfo;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.List;
+
+@AllArgsConstructor
+@Getter
+public class SystemInfoDto {
+
+    @JsonProperty
+    private OsInfo osInfo;
+    @JsonProperty
+    private ProcessorInfo processorInfo;
+    @JsonProperty
+    private MemoryInfo memoryInfo;
+    @JsonProperty
+    private List<DiskInfo> disksInfo;
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UpdateGroupDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UpdateGroupDTO.java
new file mode 100644
index 0000000..9d3c37b
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UpdateGroupDTO.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+@Getter
+@Setter
+public class UpdateGroupDTO {
+    @NotEmpty
+    private String name;
+    @NotEmpty
+    private Map<String, String> roles;
+    private Set<String> users = Collections.emptySet();
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UpdateRoleGroupDto.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UpdateRoleGroupDto.java
new file mode 100644
index 0000000..c78748e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UpdateRoleGroupDto.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import java.util.Set;
+
+@AllArgsConstructor
+@Getter
+public class UpdateRoleGroupDto {
+
+    @NotEmpty
+    private final Set<String> roleIds;
+    @NotEmpty
+    private final String group;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UpdateUserGroupDto.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UpdateUserGroupDto.java
new file mode 100644
index 0000000..308a3bb
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UpdateUserGroupDto.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import java.util.Set;
+
+@AllArgsConstructor
+@Getter
+public class UpdateUserGroupDto {
+
+    @NotEmpty
+    private final String group;
+    @NotEmpty
+    private final Set<String> users;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserDTO.java
new file mode 100644
index 0000000..96f74f4
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserDTO.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+@Data
+@AllArgsConstructor
+public class UserDTO {
+    @NotNull
+    private final String name;
+    @Min(1)
+    private final Integer budget;
+    private Status status;
+
+    public enum Status {
+        ACTIVE, NOT_ACTIVE
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserGroupDto.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserGroupDto.java
new file mode 100644
index 0000000..0bffc5f
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserGroupDto.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.List;
+import java.util.Set;
+
+@AllArgsConstructor
+@Getter
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class UserGroupDto {
+    private final String group;
+    private final List<UserRoleDTO> roles;
+    private final Set<String> users;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserResourceInfo.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserResourceInfo.java
new file mode 100644
index 0000000..cca6769
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserResourceInfo.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.dto.ResourceURL;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.model.ResourceEnum;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+@Builder
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class UserResourceInfo {
+    @JsonProperty
+    private String user;
+    @JsonProperty
+    private String project;
+    @JsonProperty
+    private String endpoint;
+    @JsonProperty("resource_type")
+    private ResourceEnum resourceType;
+    @JsonProperty("resource_name")
+    private String resourceName;
+    @JsonProperty("shape")
+    private String resourceShape;
+    @JsonProperty("status")
+    private String resourceStatus;
+    @JsonProperty("computational_resources")
+    private List<UserComputationalResource> computationalResources;
+    @JsonProperty("public_ip")
+    private String ip;
+    @JsonProperty("cloud_provider")
+    private String cloudProvider;
+    @JsonProperty("exploratory_urls")
+    private List<ResourceURL> exploratoryUrls;
+
+    @JsonProperty("gpu_enabled")
+    private Boolean gpuEnabled;
+    @JsonProperty("gpu_type")
+    private String gpuType;
+    @JsonProperty("gpu_count")
+    private String gpuCount;
+    @JsonProperty
+    private Map<String, String> tags;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserRoleDTO.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserRoleDTO.java
new file mode 100644
index 0000000..62514f3
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/UserRoleDTO.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources.dto;
+
+import com.epam.datalab.cloud.CloudProvider;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+@Getter
+@Setter
+@ToString
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class UserRoleDTO {
+    @JsonProperty("_id")
+    private String id;
+    private String description;
+    private Type type;
+    private CloudProvider cloud;
+    private Set<String> pages;
+    private Set<String> computationals;
+    private Set<String> exploratories;
+    @JsonProperty("exploratory_shapes")
+    private Set<String> exploratoryShapes;
+    @JsonProperty("computational_shapes")
+    private Set<String> computationalShapes;
+    private Set<String> groups;
+
+    private enum Type {
+        NOTEBOOK,
+        COMPUTATIONAL,
+        NOTEBOOK_SHAPE,
+        COMPUTATIONAL_SHAPE,
+        BILLING,
+        BUCKET_BROWSER,
+        ADMINISTRATION,
+    }
+
+    public static List<Type> cloudSpecificTypes() {
+        return Arrays.asList(Type.NOTEBOOK, Type.COMPUTATIONAL, Type.NOTEBOOK_SHAPE, Type.COMPUTATIONAL_SHAPE);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/aws/AwsComputationalCreateForm.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/aws/AwsComputationalCreateForm.java
new file mode 100644
index 0000000..314dba5
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/aws/AwsComputationalCreateForm.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto.aws;
+
+import com.epam.datalab.backendapi.resources.dto.ComputationalCreateFormDTO;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.hibernate.validator.constraints.NotBlank;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AwsComputationalCreateForm extends ComputationalCreateFormDTO {
+
+    @NotBlank
+    @JsonProperty("emr_instance_count")
+    private String instanceCount;
+
+    @NotBlank
+    @JsonProperty("emr_master_instance_type")
+    private String masterInstanceType;
+
+    @NotBlank
+    @JsonProperty("emr_slave_instance_type")
+    private String slaveInstanceType;
+
+    @JsonProperty("emr_slave_instance_spot")
+    private Boolean slaveInstanceSpot = false;
+
+    @JsonProperty("emr_slave_instance_spot_pct_price")
+    private Integer slaveInstanceSpotPctPrice;
+
+    @NotBlank
+    @JsonProperty("emr_version")
+    private String version;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/aws/AwsEmrConfiguration.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/aws/AwsEmrConfiguration.java
new file mode 100644
index 0000000..21161b8
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/aws/AwsEmrConfiguration.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package com.epam.datalab.backendapi.resources.dto.aws;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+/**
+ * Stores limits for creation of the computational resources for EMR cluster
+ */
+@Data
+@Builder
+public class AwsEmrConfiguration {
+    @NotBlank
+    @JsonProperty("min_emr_instance_count")
+    private int minEmrInstanceCount;
+
+    @NotBlank
+    @JsonProperty("max_emr_instance_count")
+    private int maxEmrInstanceCount;
+
+    @NotBlank
+    @JsonProperty("min_emr_spot_instance_bid_pct")
+    private int minEmrSpotInstanceBidPct;
+
+    @NotBlank
+    @JsonProperty("max_emr_spot_instance_bid_pct")
+    private int maxEmrSpotInstanceBidPct;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/gcp/GcpComputationalCreateForm.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/gcp/GcpComputationalCreateForm.java
new file mode 100644
index 0000000..684264f
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/gcp/GcpComputationalCreateForm.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto.gcp;
+
+import com.epam.datalab.backendapi.resources.dto.ComputationalCreateFormDTO;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.hibernate.validator.constraints.NotBlank;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ToString(callSuper = true)
+@JsonIgnoreProperties
+public class GcpComputationalCreateForm extends ComputationalCreateFormDTO {
+
+    @NotBlank
+    @JsonProperty("dataproc_master_count")
+    private String masterInstanceCount;
+
+    @NotBlank
+    @JsonProperty("dataproc_slave_count")
+    private String slaveInstanceCount;
+
+    @NotBlank
+    @JsonProperty("dataproc_preemptible_count")
+    private String preemptibleCount;
+
+    @JsonProperty("dataproc_master_instance_type")
+    private String masterInstanceType;
+
+    @JsonProperty("dataproc_slave_instance_type")
+    private String slaveInstanceType;
+
+    @NotBlank
+    @JsonProperty("dataproc_version")
+    private String version;
+
+    @JsonProperty("gpu_enabled")
+    private Boolean enabledGPU;
+
+    @JsonProperty("master_gpu_type")
+    private String masterGpuType;
+
+    @JsonProperty("master_gpu_count")
+    private String masterGpuCount;
+
+    @JsonProperty("slave_gpu_type")
+    private String slaveGpuType;
+
+    @JsonProperty("slave_gpu_count")
+    private String slaveGpuCount;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/gcp/GcpDataprocConfiguration.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/gcp/GcpDataprocConfiguration.java
new file mode 100644
index 0000000..86890e8
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/dto/gcp/GcpDataprocConfiguration.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.dto.gcp;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+/**
+ * Stores limits for creation of the computational resources for Dataproc cluster
+ */
+@Data
+@Builder
+public class GcpDataprocConfiguration {
+    @NotBlank
+    @JsonProperty("min_instance_count")
+    private int minInstanceCount;
+    @NotBlank
+    @JsonProperty("max_instance_count")
+    private int maxInstanceCount;
+    @NotBlank
+    @JsonProperty("min_dataproc_preemptible_instance_count")
+    private int minDataprocPreemptibleInstanceCount;
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java
new file mode 100644
index 0000000..a8d61bf
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/ComputationalResourceGcp.java
@@ -0,0 +1,258 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.gcp;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
+import com.epam.datalab.backendapi.resources.dto.gcp.GcpComputationalCreateForm;
+import com.epam.datalab.backendapi.roles.RoleType;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.backendapi.service.ComputationalService;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.gcp.computational.GcpComputationalResource;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.contracts.ComputationalAPI;
+import com.google.inject.Inject;
+import io.dropwizard.auth.Auth;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+import static com.epam.datalab.dto.UserInstanceStatus.CREATING;
+
+
+/**
+ * Provides the REST API for the computational resource on GCP.
+ */
+@Path("/gcp/infrastructure_provision/computational_resources")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+@Slf4j
+public class ComputationalResourceGcp implements ComputationalAPI {
+    private final SelfServiceApplicationConfiguration configuration;
+    private final ComputationalService computationalService;
+
+    @Inject
+    public ComputationalResourceGcp(SelfServiceApplicationConfiguration configuration, ComputationalService computationalService) {
+        this.configuration = configuration;
+        this.computationalService = computationalService;
+    }
+
+
+    @GET
+    @Path("/{project}/{endpoint}/templates")
+    public Response getTemplates(@Auth @Parameter(hidden = true) UserInfo userInfo, @PathParam("project") String project,
+                                 @PathParam("endpoint") String endpoint) {
+        return Response.ok(computationalService.getComputationalNamesAndTemplates(userInfo, project, endpoint)).build();
+    }
+
+    /**
+     * Asynchronously creates Dataproc cluster
+     *
+     * @param userInfo user info.
+     * @param form     DTO info about creation of the computational resource.
+     * @return 200 OK - if request success, 302 Found - for duplicates.
+     * @throws IllegalArgumentException if docker image name is malformed
+     */
+    @PUT
+    @Path("dataengine-service")
+    @Operation(tags = "computational", summary = "Create dataproc cluster")
+    public Response createDataEngineService(@Auth @Parameter(hidden = true) UserInfo userInfo,
+                                            @Valid @NotNull @Parameter GcpComputationalCreateForm form) {
+
+        log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
+
+        if (DataEngineType.CLOUD_SERVICE == DataEngineType.fromDockerImageName(form.getImage())) {
+            validate(userInfo, form);
+            GcpComputationalResource gcpComputationalResource = GcpComputationalResource.builder()
+                    .computationalName(form.getName())
+                    .imageName(form.getImage())
+                    .templateName(form.getTemplateName())
+                    .status(CREATING.toString())
+                    .masterGPUCount(form.getMasterGpuCount())
+                    .masterGPUType(form.getMasterGpuType())
+                    .slaveGPUCount(form.getSlaveGpuCount())
+                    .slaveGPUType(form.getSlaveGpuType())
+                    .enabledGPU(form.getEnabledGPU())
+                    .masterShape(form.getMasterInstanceType())
+                    .slaveShape(form.getSlaveInstanceType())
+                    .slaveNumber(form.getSlaveInstanceCount())
+                    .masterNumber(form.getMasterInstanceCount())
+                    .preemptibleNumber(form.getPreemptibleCount())
+                    .version(form.getVersion())
+                    .totalInstanceCount(Integer.parseInt(form.getMasterInstanceCount()) + Integer.parseInt(form.getSlaveInstanceCount()))
+                    .build();
+            boolean resourceAdded = computationalService.createDataEngineService(userInfo, form.getName(), form, gcpComputationalResource,
+                    form.getProject(), getAuditInfo(form.getNotebookName()));
+            return resourceAdded ? Response.ok().build() : Response.status(Response.Status.FOUND).build();
+        }
+
+        throw new IllegalArgumentException("Malformed image " + form.getImage());
+    }
+
+
+    /**
+     * Asynchronously triggers creation of Spark cluster
+     *
+     * @param userInfo user info.
+     * @param form     DTO info about creation of the computational resource.
+     * @return 200 OK - if request success, 302 Found - for duplicates.
+     */
+    @PUT
+    @Path("dataengine")
+    public Response createDataEngine(@Auth UserInfo userInfo,
+                                     @Valid @NotNull SparkStandaloneClusterCreateForm form) {
+        log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
+
+        if (!UserRoles.checkAccess(userInfo, RoleType.COMPUTATIONAL, form.getImage(), userInfo.getRoles())) {
+            log.warn("Unauthorized attempt to create a {} by user {}", form.getImage(), userInfo.getName());
+            throw new DatalabException("You do not have the privileges to create a " + form.getTemplateName());
+        }
+
+        return computationalService.createSparkCluster(userInfo, form.getName(), form, form.getProject(), getAuditInfo(form.getNotebookName()))
+                ? Response.ok().build()
+                : Response.status(Response.Status.FOUND).build();
+    }
+
+
+    /**
+     * Sends request to provisioning service for termination the computational resource for user.
+     *
+     * @param userInfo          user info.
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @return 200 OK if operation is successfully triggered
+     */
+    @DELETE
+    @Path("/{projectName}/{exploratoryName}/{computationalName}/terminate")
+    public Response terminate(@Auth UserInfo userInfo,
+                              @PathParam("projectName") String projectName,
+                              @PathParam("exploratoryName") String exploratoryName,
+                              @PathParam("computationalName") String computationalName) {
+        log.debug("Terminating computational resource {} for user {}", computationalName, userInfo.getName());
+
+        computationalService.terminateComputational(userInfo, userInfo.getName(), projectName, exploratoryName, computationalName, getAuditInfo(exploratoryName));
+        return Response.ok().build();
+    }
+
+    /**
+     * Sends request to provisioning service for stopping the computational resource for user.
+     *
+     * @param userInfo          user info.
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @return 200 OK if operation is successfully triggered
+     */
+    @DELETE
+    @Path("/{project}/{exploratoryName}/{computationalName}/stop")
+    public Response stop(@Auth UserInfo userInfo,
+                         @PathParam("project") String project,
+                         @PathParam("exploratoryName") String exploratoryName,
+                         @PathParam("computationalName") String computationalName) {
+        log.debug("Stopping computational resource {} for user {}", computationalName, userInfo.getName());
+
+        computationalService.stopSparkCluster(userInfo, userInfo.getName(), project, exploratoryName, computationalName, getAuditInfo(exploratoryName));
+        return Response.ok().build();
+    }
+
+    /**
+     * Sends request to provisioning service for starting the computational resource for user.
+     *
+     * @param userInfo          user info.
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @return 200 OK if operation is successfully triggered
+     */
+    @PUT
+    @Path("/{project}/{exploratoryName}/{computationalName}/start")
+    public Response start(@Auth UserInfo userInfo,
+                          @PathParam("exploratoryName") String exploratoryName,
+                          @PathParam("computationalName") String computationalName,
+                          @PathParam("project") String project) {
+        log.debug("Starting computational resource {} for user {}", computationalName, userInfo.getName());
+
+        computationalService.startSparkCluster(userInfo, exploratoryName, computationalName, project, getAuditInfo(exploratoryName));
+        return Response.ok().build();
+    }
+
+    @PUT
+    @Path("dataengine/{projectName}/{exploratoryName}/{computationalName}/config")
+    public Response updateDataEngineConfig(@Auth UserInfo userInfo,
+                                           @PathParam("projectName") String projectName,
+                                           @PathParam("exploratoryName") String exploratoryName,
+                                           @PathParam("computationalName") String computationalName,
+                                           @Valid @NotNull List<ClusterConfig> config) {
+
+        computationalService.updateSparkClusterConfig(userInfo, projectName, exploratoryName, computationalName, config,
+                String.format(AUDIT_COMPUTATIONAL_RECONFIGURE_MESSAGE, computationalName, exploratoryName));
+        return Response.ok().build();
+    }
+
+    @GET
+    @Path("/{projectName}/{exploratoryName}/{computationalName}/config")
+    public Response getClusterConfig(@Auth UserInfo userInfo,
+                                     @PathParam("projectName") String projectName,
+                                     @PathParam("exploratoryName") String exploratoryName,
+                                     @PathParam("computationalName") String computationalName) {
+        return Response.ok(computationalService.getClusterConfig(userInfo, projectName, exploratoryName, computationalName)).build();
+    }
+
+    private void validate(@Auth UserInfo userInfo, GcpComputationalCreateForm formDTO) {
+        if (!UserRoles.checkAccess(userInfo, RoleType.COMPUTATIONAL, formDTO.getImage(), userInfo.getRoles())) {
+            log.warn("Unauthorized attempt to create a {} by user {}", formDTO.getImage(), userInfo.getName());
+            throw new DatalabException("You do not have the privileges to create a " + formDTO.getTemplateName());
+        }
+
+        int slaveInstanceCount = Integer.parseInt(formDTO.getSlaveInstanceCount());
+        int masterInstanceCount = Integer.parseInt(formDTO.getMasterInstanceCount());
+        final int total = slaveInstanceCount + masterInstanceCount;
+        if (total < configuration.getMinInstanceCount()
+                || total > configuration.getMaxInstanceCount()) {
+            log.debug("Creating computational resource {} for user {} fail: Limit exceeded to creation total " +
+                            "instances. Minimum is {}, maximum is {}", formDTO.getName(), userInfo.getName(),
+                    configuration.getMinInstanceCount(), configuration.getMaxInstanceCount());
+            throw new DatalabException("Limit exceeded to creation slave instances. Minimum is " + configuration
+                    .getMinInstanceCount() + ", maximum is " + configuration.getMaxInstanceCount());
+        }
+
+        final int preemptibleInstanceCount = Integer.parseInt(formDTO.getPreemptibleCount());
+        if (preemptibleInstanceCount < configuration.getMinDataprocPreemptibleCount()) {
+            log.debug("Creating computational resource {} for user {} fail: Limit exceeded to creation preemptible " +
+                            "instances. Minimum is {}",
+                    formDTO.getName(), userInfo.getName(), configuration.getMinDataprocPreemptibleCount());
+            throw new DatalabException("Limit exceeded to creation preemptible instances. " +
+                    "Minimum is " + configuration.getMinDataprocPreemptibleCount());
+
+        }
+    }
+
+    private String getAuditInfo(String exploratoryName) {
+        return String.format(AUDIT_MESSAGE, exploratoryName);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/GcpOauthResource.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/GcpOauthResource.java
new file mode 100644
index 0000000..c6c25fa
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/resources/gcp/GcpOauthResource.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources.gcp;
+
+import com.epam.datalab.auth.contract.SecurityAPI;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.gcp.auth.GcpOauth2AuthorizationCodeResponse;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.net.URI;
+
+@Path("/user/gcp")
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public class GcpOauthResource {
+
+    @Inject
+    @Named(ServiceConsts.SECURITY_SERVICE_NAME)
+    private RESTService securityService;
+
+
+    @GET
+    @Path("/init")
+    public Response redirectedUrl() {
+        return Response
+                .seeOther(URI.create(securityService.get(SecurityAPI.INIT_LOGIN_OAUTH_GCP, String.class)))
+                .build();
+    }
+
+    @GET
+    @Path("/oauth")
+    public Response login(@QueryParam("code") String code, @QueryParam("state") String state,
+                          @QueryParam("error") String error) {
+        return securityService.post(SecurityAPI.LOGIN_OAUTH,
+                new GcpOauth2AuthorizationCodeResponse(code, state, error),
+                Response.class);
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/RoleType.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/RoleType.java
new file mode 100644
index 0000000..998e01f
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/RoleType.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.roles;
+
+/**
+ * Types of roles.
+ */
+public enum RoleType {
+    COMPUTATIONAL("computationals"),
+    EXPLORATORY("exploratories"),
+    EXPLORATORY_SHAPES("exploratory_shapes"),
+    COMPUTATIONAL_SHAPES("computational_shapes"),
+    PAGE("pages");
+
+    private String nodeName;
+
+    RoleType(String nodeName) {
+        this.nodeName = nodeName;
+    }
+
+    public static RoleType of(String name) {
+        if (name != null) {
+            for (RoleType value : RoleType.values()) {
+                if (name.equalsIgnoreCase(value.toString())) {
+                    return value;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Return name of node in JSON for type.
+     */
+    public String getNodeName() {
+        return nodeName;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/UserRole.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/UserRole.java
new file mode 100644
index 0000000..f9f85a6
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/UserRole.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.roles;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+
+import javax.annotation.Nonnull;
+import java.util.Comparator;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Describe role.
+ */
+public class UserRole implements Comparable<UserRole> {
+
+    private final String id;
+    /**
+     * Type of role.
+     */
+    private final RoleType type;
+
+    /**
+     * Name of role.
+     */
+    private final String name;
+
+    /**
+     * Names of external groups.
+     */
+    private final Set<String> groups;
+
+    /**
+     * Name of DataLab's users.
+     */
+    private final Set<String> users;
+
+    /**
+     * Instantiate the role.
+     *
+     * @param id
+     * @param type   type of role.
+     * @param name   the name of role.
+     * @param groups the names of external groups.
+     * @param users  the name of DataLab's users.
+     */
+    UserRole(String id, RoleType type, String name, Set<String> groups, Set<String> users) {
+        this.id = id;
+        this.type = type;
+        this.name = name;
+        this.groups = groups;
+        this.users = users;
+    }
+
+    /**
+     * Return the type of role.
+     */
+    public RoleType getType() {
+        return type;
+    }
+
+    /**
+     * Return the name of role.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Return the names of external groups.
+     */
+    public Set<String> getGroups() {
+        return groups;
+    }
+
+    /**
+     * Return the name of DataLab's users.
+     */
+    public Set<String> getUsers() {
+        return users;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public int compareTo(@Nonnull UserRole o) {
+        return Comparator.comparing(UserRole::getType)
+                .thenComparing(UserRole::getName)
+                .thenComparing(UserRole::getId, Comparator.nullsLast(String::compareToIgnoreCase))
+                .compare(this, o);
+    }
+
+    private ToStringHelper toStringHelper(Object self) {
+        return MoreObjects.toStringHelper(self)
+                .add("type", type)
+                .add("name", name)
+                .add("groups", groups)
+                .add("users", users);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        UserRole userRole = (UserRole) o;
+        return this.id.equals(userRole.getId()) && this.type.equals(userRole.getType()) && this.name.equals(userRole.getName());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type, name);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this).toString();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/UserRoles.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/UserRoles.java
new file mode 100644
index 0000000..126e465
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/roles/UserRoles.java
@@ -0,0 +1,335 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.roles;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.SecurityDAO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.common.base.MoreObjects;
+import com.mongodb.client.FindIterable;
+import org.bson.Document;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Provides user roles access to features.
+ */
+public class UserRoles {
+    private static final Logger LOGGER = LoggerFactory.getLogger(UserRoles.class);
+
+    private static final String ANY_USER = "$anyuser";
+    /**
+     * Node name of groups.
+     */
+    private static final String GROUPS = "groups";
+    /**
+     * Node name of user.
+     */
+    private static final String USERS = "users";
+    private static final String PROJECT_ADMIN_ROLE_NAME = "projectAdmin";
+    private static final String ADMIN_ROLE_NAME = "admin";
+    /**
+     * Single instance of the user roles.
+     */
+    private static UserRoles userRoles = null;
+    /**
+     * List of roles.
+     */
+    private List<UserRole> roles = null;
+    private Map<String, Set<String>> userGroups;
+
+    /**
+     * Default access to features if the role is not defined.
+     */
+    private boolean defaultAccess = false;
+
+    /**
+     * Initialize user roles for all users.
+     *
+     * @param dao security DAO.
+     */
+    public static void initialize(SecurityDAO dao, boolean defaultAccess) {
+        LOGGER.trace("Loading roles from database...");
+        if (userRoles == null) {
+            userRoles = new UserRoles();
+        }
+        userRoles.load(dao, defaultAccess);
+        LOGGER.trace("New roles are	: {}", getRoles());
+    }
+
+    /**
+     * Return the list of roles for all users.
+     */
+    public static List<UserRole> getRoles() {
+        return (userRoles == null ? null : userRoles.roles());
+    }
+
+    /**
+     * Check access for user to the role.
+     *
+     * @param userInfo user info.
+     * @param type     the type of role.
+     * @param name     the name of role.
+     * @param roles
+     * @return boolean value
+     */
+    public static boolean checkAccess(UserInfo userInfo, RoleType type, String name, Collection<String> roles) {
+        return checkAccess(userInfo, type, name, true, roles);
+    }
+
+    public static boolean isProjectAdmin(UserInfo userInfo) {
+        final List<UserRole> roles = UserRoles.getRoles();
+        return roles == null || roles.stream()
+                .anyMatch(r -> PROJECT_ADMIN_ROLE_NAME.equalsIgnoreCase(r.getId()) &&
+                (userRoles.hasAccessByGroup(userInfo, userInfo.getRoles(), r.getGroups()) || userRoles.hasAccessByUserName(userInfo, r)));
+    }
+
+    public static boolean isProjectAdmin(UserInfo userInfo, Set<String> groups) {
+        final List<UserRole> roles = UserRoles.getRoles();
+        return roles == null || roles.stream()
+                .anyMatch(r -> PROJECT_ADMIN_ROLE_NAME.equalsIgnoreCase(r.getId()) &&
+                (userRoles.hasAccessByGroup(userInfo, userInfo.getRoles(), retainGroups(r.getGroups(), groups))
+                        || userRoles.hasAccessByUserName(userInfo, r)));
+    }
+
+    public static boolean isAdmin(UserInfo userInfo) {
+        final List<UserRole> roles = UserRoles.getRoles();
+        return roles == null || roles.stream()
+                .anyMatch(r -> ADMIN_ROLE_NAME.equalsIgnoreCase(r.getId()) &&
+                (userRoles.hasAccessByGroup(userInfo, userInfo.getRoles(), r.getGroups())
+                        || userRoles.hasAccessByUserName(userInfo, r)));
+    }
+
+    /**
+     * Check access for user to the role.
+     *
+     * @param roles
+     * @param userInfo user info.
+     * @param type     the type of role.
+     * @param name     the name of role.
+     * @return boolean value
+     */
+    public static boolean checkAccess(UserInfo userInfo, RoleType type, String name, boolean useDefault,
+                                      Collection<String> roles) {
+        return (userRoles == null || userRoles.hasAccess(userInfo, type, name, useDefault, roles));
+    }
+
+    /**
+     * Loading the user roles for all users from Mongo database.
+     *
+     * @param dao security DAO.
+     */
+    private synchronized void load(SecurityDAO dao, boolean defaultAccess) {
+        this.defaultAccess = defaultAccess;
+        try {
+            FindIterable<Document> docs = dao.getRoles();
+            roles = new ArrayList<>();
+            for (Document d : docs) {
+                Set<String> groups = getAndRemoveSet(d, GROUPS);
+                Set<String> users = getAndRemoveSet(d, USERS);
+                String id = d.getString("_id");
+                for (RoleType type : RoleType.values()) {
+                    @SuppressWarnings("unchecked")
+                    List<String> names = d.get(type.getNodeName(), ArrayList.class);
+                    if (names != null) {
+                        for (String name : names) {
+                            append(type, name, groups, users, id);
+                        }
+                    }
+                }
+            }
+            userGroups = dao.getGroups();
+        } catch (Exception e) {
+            throw new DatalabException("Cannot load roles from database. " + e.getLocalizedMessage(), e);
+        }
+    }
+
+    private synchronized List<UserRole> roles() {
+        return roles;
+    }
+
+    /**
+     * Append new role to the list if role not exists in list an return it, otherwise return
+     * existence role.
+     *
+     * @param type   type of role.
+     * @param name   the name of role.
+     * @param groups the names of external groups.
+     * @param users  the name of DataLab's users.
+     * @param id
+     * @return role.
+     */
+    private UserRole append(RoleType type, String name, Set<String> groups, Set<String> users, String id) {
+        UserRole item = new UserRole(id, type, name, groups, users);
+        synchronized (roles) {
+            int index = Collections.binarySearch(roles, item);
+            if (index < 0) {
+                index = -index;
+                if (index > roles.size()) {
+                    roles.add(item);
+                } else {
+                    roles.add(index - 1, item);
+                }
+            }
+        }
+        return item;
+    }
+
+    /**
+     * Find and return role by type and name.
+     *
+     * @param type type of role.
+     * @param name the name of role.
+     * @return list of UserRole
+     */
+    private Set<String> getGroups(RoleType type, String name) {
+        synchronized (roles) {
+            return roles
+                    .stream()
+                    .filter(r -> type == r.getType() && name.equalsIgnoreCase(r.getName()))
+                    .map(UserRole::getGroups)
+                    .flatMap(Collection::stream)
+                    .collect(Collectors.toSet());
+        }
+    }
+
+    /**
+     * Find and return a list by key from JSON document, otherwise return <b>null</b>.
+     *
+     * @param document the document.
+     * @param key      the name of node.
+     */
+    private Set<String> getAndRemoveSet(Document document, String key) {
+        Object o = document.get(key);
+        if (!(o instanceof ArrayList)) {
+            return Collections.emptySet();
+        }
+
+        @SuppressWarnings("unchecked")
+        List<String> list = (List<String>) o;
+        if (list.isEmpty()) {
+            return Collections.emptySet();
+        }
+
+        Set<String> set = new HashSet<>();
+        for (String value : list) {
+            set.add(value.toLowerCase());
+        }
+        document.remove(key);
+        return set;
+    }
+
+    /**
+     * Check access for user to the role.
+     *
+     * @param userInfo   user info.
+     * @param type       the type of role.
+     * @param name       the name of role.
+     * @param useDefault true/false
+     * @param roles
+     * @return boolean value
+     */
+    private boolean hasAccess(UserInfo userInfo, RoleType type, String name, boolean useDefault,
+                              Collection<String> roles) {
+        if (userRoles == null) {
+            return true;
+        }
+        Set<String> groups = getGroups(type, name);
+        if (groups == null || groups.isEmpty()) {
+            return checkDefault(useDefault);
+        }
+        if (hasAccessByGroup(userInfo, roles, groups)) {
+            return true;
+        }
+        LOGGER.trace("Access denied for user {} to {}/{}", userInfo.getName(), type, name);
+        return false;
+    }
+
+    private boolean hasAccessByGroup(UserInfo userInfo, Collection<String> userRoles, Collection<String> groups) {
+        if (groups != null) {
+            if (groups.contains(ANY_USER)) {
+                return true;
+            }
+            for (String group : userRoles) {
+                if (group != null && groups.contains(group.toLowerCase())) {
+                    LOGGER.trace("Got access by group {}", group);
+                    return true;
+                }
+            }
+
+            final Optional<String> group = groups
+                    .stream()
+                    .filter(g -> userGroups.getOrDefault(g, Collections.emptySet()).contains(userInfo.getName().toLowerCase()))
+                    .findAny();
+            if (group.isPresent()) {
+                LOGGER.trace("Got access by local group {}", group.get());
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean hasAccessByUserName(UserInfo userInfo, UserRole role) {
+        if (role.getUsers() != null &&
+                userInfo.getName() != null &&
+                (role.getUsers().contains(ANY_USER) ||
+                        role.getUsers().contains(userInfo.getName().toLowerCase()))) {
+            LOGGER.trace("Got access by name");
+            return true;
+        }
+        return false;
+    }
+
+    private boolean checkDefault(boolean useDefault) {
+        if (useDefault) {
+            LOGGER.trace("Got default access {}", defaultAccess);
+            return defaultAccess;
+        } else {
+            return false;
+        }
+    }
+
+    private static Set<String> retainGroups(Set<String> groups1, Set<String> groups2) {
+        Set<String> result = groups2
+                .stream()
+                .map(String::toLowerCase)
+                .collect(Collectors.toSet());
+        result.retainAll(groups1);
+
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(roles)
+                .addValue(roles)
+                .toString();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckApplicationQuoteScheduler.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckApplicationQuoteScheduler.java
new file mode 100644
index 0000000..b55ebcc
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckApplicationQuoteScheduler.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers;
+
+import com.epam.datalab.backendapi.dao.BillingDAO;
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.EnvironmentService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+@Scheduled("checkQuoteScheduler")
+@Slf4j
+public class CheckApplicationQuoteScheduler implements Job {
+    @Inject
+    private BillingDAO billingDAO;
+    @Inject
+    private EnvironmentService environmentService;
+
+    @Override
+    public void execute(JobExecutionContext context) {
+        if (billingDAO.isBillingQuoteReached()) {
+            log.warn("Stopping all environments because of reaching budget quote");
+            environmentService.stopAll();
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckInactivityScheduledJob.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckInactivityScheduledJob.java
new file mode 100644
index 0000000..e32b15f
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckInactivityScheduledJob.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.schedulers;
+
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.InactivityService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+/**
+ * There realized integration with Quartz scheduler framework and defined check cluster inactivity scheduler job which
+ * executes every time specified. If in 'self-service.yml' option 'clusterInactivityCheckerEnabled' equals 'true' then
+ * this job we be executing every time predefined in option 'clusterInactivityCheckingTimeout'. Otherwise, it will
+ * never execute.
+ */
+@Slf4j
+@Scheduled("inactivity")
+public class CheckInactivityScheduledJob implements Job {
+
+    @Inject
+    private InactivityService inactivityService;
+
+    @Override
+    public void execute(JobExecutionContext context) {
+        log.trace("Starting check inactivity job");
+        inactivityService.updateRunningResourcesLastActivity();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckInfrastructureStatusScheduler.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckInfrastructureStatusScheduler.java
new file mode 100644
index 0000000..808a1f2
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckInfrastructureStatusScheduler.java
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.InfrastructureInfoService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.service.SecurityService;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.status.EnvResource;
+import com.epam.datalab.model.ResourceType;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.epam.datalab.dto.UserInstanceStatus.*;
+
+@Scheduled("checkInfrastructureStatusScheduler")
+@Slf4j
+public class CheckInfrastructureStatusScheduler implements Job {
+
+    private static final List<UserInstanceStatus> statusesToCheck =
+            Arrays.asList(RUNNING, STARTING, CREATING, CREATING_IMAGE,
+                    CONFIGURING, STOPPING, RECONFIGURING, STOPPED, TERMINATING, TERMINATED);
+
+    private final InfrastructureInfoService infrastructureInfoService;
+    private final SecurityService securityService;
+    private final EndpointService endpointService;
+    private final ExploratoryDAO exploratoryDAO;
+    private final ProjectService projectService;
+
+    @Inject
+    public CheckInfrastructureStatusScheduler(InfrastructureInfoService infrastructureInfoService, SecurityService securityService,
+                                              EndpointService endpointService, ExploratoryDAO exploratoryDAO, ProjectService projectService) {
+        this.infrastructureInfoService = infrastructureInfoService;
+        this.securityService = securityService;
+        this.endpointService = endpointService;
+        this.exploratoryDAO = exploratoryDAO;
+        this.projectService = projectService;
+    }
+
+    @Override
+    public void execute(JobExecutionContext context) {
+        UserInfo serviceUser = securityService.getServiceAccountInfo("admin");
+
+        List<String> activeEndpoints = endpointService.getEndpointsWithStatus(EndpointDTO.EndpointStatus.ACTIVE)
+                .stream()
+                .map(EndpointDTO::getName)
+                .collect(Collectors.toList());
+
+        List<UserInstanceDTO> userInstanceDTOS = exploratoryDAO.fetchExploratoriesByEndpointWhereStatusIn(activeEndpoints, statusesToCheck, Boolean.TRUE);
+
+        Map<String, List<EnvResource>> exploratoryAndSparkInstances = userInstanceDTOS
+                .stream()
+                .map(this::getExploratoryAndSparkInstances)
+                .flatMap(Collection::stream)
+                .collect(Collectors.groupingBy(EnvResource::getEndpoint));
+
+        Map<String, List<EnvResource>> clusterInstances = userInstanceDTOS
+                .stream()
+                .map(this::getClusterInstances)
+                .flatMap(Collection::stream)
+                .collect(Collectors.groupingBy(EnvResource::getEndpoint));
+        activeEndpoints.forEach(e -> {
+                    List<EnvResource> hostInstances = Stream.of(getEdgeInstances(e),
+                            exploratoryAndSparkInstances.getOrDefault(e, Collections.emptyList()))
+                            .flatMap(Collection::stream)
+                            .collect(Collectors.toList());
+
+                    infrastructureInfoService.updateInfrastructureStatuses(serviceUser, e, hostInstances,
+                            clusterInstances.getOrDefault(e, Collections.emptyList()));
+                }
+        );
+    }
+
+    private List<EnvResource> getExploratoryAndSparkInstances(UserInstanceDTO userInstanceDTO) {
+        List<EnvResource> instances = userInstanceDTO.getResources()
+                .stream()
+                .filter(c -> DataEngineType.SPARK_STANDALONE == DataEngineType.fromDockerImageName(c.getImageName()))
+                .filter(c -> statusesToCheck.contains(UserInstanceStatus.of(c.getStatus())))
+                .map(r -> new EnvResource()
+                        .withId(r.getInstanceId())
+                        .withName(r.getComputationalName())
+                        .withProject(userInstanceDTO.getProject())
+                        .withEndpoint(userInstanceDTO.getEndpoint())
+                        .withStatus(r.getStatus())
+                        .withResourceType(ResourceType.COMPUTATIONAL))
+                .collect(Collectors.toList());
+
+        instances.add(new EnvResource()
+                .withId(userInstanceDTO.getInstanceId())
+                .withName(userInstanceDTO.getExploratoryName())
+                .withProject(userInstanceDTO.getProject())
+                .withEndpoint(userInstanceDTO.getEndpoint())
+                .withStatus(userInstanceDTO.getStatus())
+                .withResourceType(ResourceType.EXPLORATORY));
+
+        return instances;
+    }
+
+    private List<EnvResource> getClusterInstances(UserInstanceDTO userInstanceDTO) {
+        return userInstanceDTO.getResources().stream()
+                .filter(c -> DataEngineType.CLOUD_SERVICE == DataEngineType.fromDockerImageName(c.getImageName()))
+                .filter(c -> statusesToCheck.contains(UserInstanceStatus.of(c.getStatus())))
+                .map(r -> new EnvResource()
+                        .withId(r.getInstanceId())
+                        .withName(r.getComputationalName())
+                        .withProject(userInstanceDTO.getProject())
+                        .withEndpoint(userInstanceDTO.getEndpoint())
+                        .withStatus(r.getStatus())
+                        .withResourceType(ResourceType.COMPUTATIONAL))
+                .collect(Collectors.toList());
+    }
+
+
+    private List<EnvResource> getEdgeInstances(String endpoint) {
+        return projectService.getProjectsByEndpoint(endpoint)
+                .stream()
+                .collect(Collectors.toMap(ProjectDTO::getName, ProjectDTO::getEndpoints))
+                .entrySet()
+                .stream()
+                .map(entry -> getEdgeInstances(endpoint, entry))
+                .flatMap(Collection::stream)
+                .collect(Collectors.toList());
+    }
+
+    private List<EnvResource> getEdgeInstances(String endpoint, Map.Entry<String, List<ProjectEndpointDTO>> entry) {
+        return entry.getValue()
+                .stream()
+                .filter(e -> statusesToCheck.contains(e.getStatus()))
+                .filter(e -> e.getName().equals(endpoint))
+                .filter(e -> Objects.nonNull(e.getEdgeInfo()))
+                .map(e -> new EnvResource()
+                        .withId(e.getEdgeInfo().getInstanceId())
+                        .withName(e.getName())
+                        .withProject(entry.getKey())
+                        .withEndpoint(endpoint)
+                        .withStatus(e.getStatus().toString())
+                        .withResourceType(ResourceType.EDGE)
+                )
+                .collect(Collectors.toList());
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckProjectQuoteScheduler.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckProjectQuoteScheduler.java
new file mode 100644
index 0000000..bc16fce
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckProjectQuoteScheduler.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers;
+
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.BillingService;
+import com.epam.datalab.backendapi.service.EnvironmentService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+@Scheduled("checkProjectQuoteScheduler")
+@Slf4j
+public class CheckProjectQuoteScheduler implements Job {
+
+    @Inject
+    private BillingService billingService;
+    @Inject
+    private EnvironmentService environmentService;
+    @Inject
+    private ProjectService projectService;
+
+    @Override
+    public void execute(JobExecutionContext context) {
+        projectService.getProjects()
+                .stream()
+                .map(ProjectDTO::getName)
+                .filter(billingService::isProjectQuoteReached)
+                .peek(p -> log.debug("Stopping {} project env because of reaching user billing quote", p))
+                .forEach(environmentService::stopProjectEnvironment);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckUserQuoteScheduler.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckUserQuoteScheduler.java
new file mode 100644
index 0000000..c470763
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/CheckUserQuoteScheduler.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers;
+
+import com.epam.datalab.backendapi.dao.BillingDAO;
+import com.epam.datalab.backendapi.resources.dto.UserDTO;
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.EnvironmentService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+@Scheduled("checkUserQuoteScheduler")
+@Slf4j
+public class CheckUserQuoteScheduler implements Job {
+
+    @Inject
+    private BillingDAO billingDAO;
+    @Inject
+    private EnvironmentService environmentService;
+
+    @Override
+    public void execute(JobExecutionContext context) {
+        environmentService.getUsers()
+                .stream()
+                .map(UserDTO::getName)
+                .filter(billingDAO::isUserQuoteReached)
+                .peek(u -> log.warn("Stopping {} user env because of reaching user billing quote", u))
+                .forEach(environmentService::stopEnvironmentWithServiceAccount);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/billing/BillingScheduler.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/billing/BillingScheduler.java
new file mode 100644
index 0000000..c4dc177
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/billing/BillingScheduler.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers.billing;
+
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.BillingService;
+import com.epam.datalab.backendapi.service.SecurityService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+@Scheduled("billingScheduler")
+@Slf4j
+public class BillingScheduler implements Job {
+
+    private final BillingService billingService;
+    private final SecurityService securityService;
+
+    @Inject
+    public BillingScheduler(BillingService billingService, SecurityService securityService) {
+        this.billingService = billingService;
+        this.securityService = securityService;
+    }
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) {
+        log.info("Trying to update billing");
+        try {
+            billingService.updateRemoteBillingData(securityService.getServiceAccountInfo("admin"));
+        } catch (Exception e) {
+            log.error("Something went wrong {}", e.getMessage(), e);
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/computational/StartComputationalJob.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/computational/StartComputationalJob.java
new file mode 100644
index 0000000..a554315
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/computational/StartComputationalJob.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers.computational;
+
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.SchedulerJobService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+/**
+ * There realized integration with Quartz scheduler framework and defined start computational resource scheduler job
+ * which executes every time specified.
+ */
+@Slf4j
+@Scheduled("startComputationalScheduler")
+public class StartComputationalJob implements Job {
+
+    @Inject
+    private SchedulerJobService schedulerJobService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) {
+        schedulerJobService.startComputationalByScheduler();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/computational/StopComputationalJob.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/computational/StopComputationalJob.java
new file mode 100644
index 0000000..fb94af5
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/computational/StopComputationalJob.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers.computational;
+
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.SchedulerJobService;
+import com.google.inject.Inject;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+/**
+ * There realized integration with Quartz scheduler framework and defined stop computational resource scheduler job
+ * which executes every time specified.
+ */
+@Scheduled("stopComputationalScheduler")
+public class StopComputationalJob implements Job {
+
+    @Inject
+    private SchedulerJobService schedulerJobService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) {
+        schedulerJobService.stopComputationalByScheduler();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/computational/TerminateComputationalJob.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/computational/TerminateComputationalJob.java
new file mode 100644
index 0000000..c69b37a
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/computational/TerminateComputationalJob.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers.computational;
+
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.SchedulerJobService;
+import com.google.inject.Inject;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+@Scheduled("terminateComputationalScheduler")
+public class TerminateComputationalJob implements Job {
+    private final SchedulerJobService schedulerJobService;
+
+    @Inject
+    public TerminateComputationalJob(SchedulerJobService schedulerJobService) {
+        this.schedulerJobService = schedulerJobService;
+    }
+
+    @Override
+    public void execute(JobExecutionContext context) {
+        schedulerJobService.terminateComputationalByScheduler();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java
new file mode 100644
index 0000000..f88050a
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers.endpoint;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.SecurityService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+@Scheduled("checkEndpointStatusScheduler")
+@Slf4j
+public class CheckEndpointStatusScheduler implements Job {
+
+    @Inject
+    private EndpointService endpointService;
+    @Inject
+    private SecurityService securityService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) {
+        UserInfo serviceUser = securityService.getServiceAccountInfo("admin");
+        endpointService.getEndpoints().stream()
+                .filter(endpoint -> checkUrlWithStatus(serviceUser, endpoint))
+                .forEach(this::changeStatusToOpposite);
+    }
+
+    private boolean checkUrlWithStatus(UserInfo serviceUser, EndpointDTO endpoint) {
+        try {
+            endpointService.checkUrl(serviceUser, endpoint.getUrl());
+        } catch (Exception e) {
+            log.warn("Failed connecting to endpoint {}, url: '{}'. {}", endpoint.getName(), endpoint.getUrl(), e.getMessage(), e);
+            return endpoint.getStatus() == EndpointDTO.EndpointStatus.ACTIVE;
+        }
+        return endpoint.getStatus() == EndpointDTO.EndpointStatus.INACTIVE;
+    }
+
+    private void changeStatusToOpposite(EndpointDTO endpoint) {
+        if (endpoint.getStatus() == EndpointDTO.EndpointStatus.ACTIVE) {
+            endpointService.updateEndpointStatus(endpoint.getName(), EndpointDTO.EndpointStatus.INACTIVE);
+        } else {
+            endpointService.updateEndpointStatus(endpoint.getName(), EndpointDTO.EndpointStatus.ACTIVE);
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/exploratory/StartExploratoryJob.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/exploratory/StartExploratoryJob.java
new file mode 100644
index 0000000..a3c732b
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/exploratory/StartExploratoryJob.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers.exploratory;
+
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.SchedulerJobService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+/**
+ * There realized integration with Quartz scheduler framework and defined start exploratory scheduler job which
+ * executes every time specified.
+ */
+@Slf4j
+@Scheduled("startExploratoryScheduler")
+public class StartExploratoryJob implements Job {
+
+    @Inject
+    private SchedulerJobService schedulerJobService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) {
+        schedulerJobService.startExploratoryByScheduler();
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/exploratory/StopExploratoryJob.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/exploratory/StopExploratoryJob.java
new file mode 100644
index 0000000..f3fdb63
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/exploratory/StopExploratoryJob.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers.exploratory;
+
+import com.epam.datalab.backendapi.schedulers.internal.Scheduled;
+import com.epam.datalab.backendapi.service.SchedulerJobService;
+import com.google.inject.Inject;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+
+/**
+ * There realized integration with Quartz scheduler framework and defined stop exploratory scheduler job which
+ * executes every time specified.
+ */
+@Slf4j
+@Scheduled("stopExploratoryScheduler")
+public class StopExploratoryJob implements Job {
+
+    @Inject
+    private SchedulerJobService schedulerJobService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) {
+        schedulerJobService.stopExploratoryByScheduler();
+    }
+
+}
+
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/internal/ManagedScheduler.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/internal/ManagedScheduler.java
new file mode 100644
index 0000000..8f8027b
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/internal/ManagedScheduler.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers.internal;
+
+import com.epam.datalab.backendapi.SelfServiceApplication;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.domain.SchedulerConfigurationData;
+import com.epam.datalab.exceptions.DatalabException;
+import com.fiestacabin.dropwizard.quartz.GuiceJobFactory;
+import com.google.inject.Inject;
+import io.dropwizard.lifecycle.Managed;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.CronScheduleBuilder;
+import org.quartz.Job;
+import org.quartz.JobDetail;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.quartz.Trigger;
+import org.quartz.TriggerKey;
+import org.reflections.Reflections;
+import org.reflections.scanners.SubTypesScanner;
+
+import java.util.Optional;
+
+import static org.quartz.JobBuilder.newJob;
+import static org.quartz.TriggerBuilder.newTrigger;
+
+@Slf4j
+public class ManagedScheduler implements Managed {
+    private final Scheduler scheduler;
+    private final GuiceJobFactory jobFactory;
+    private final SelfServiceApplicationConfiguration config;
+
+    @Inject
+    public ManagedScheduler(Scheduler scheduler, GuiceJobFactory jobFactory,
+                            SelfServiceApplicationConfiguration config) {
+        this.scheduler = scheduler;
+        this.jobFactory = jobFactory;
+        this.config = config;
+    }
+
+    @Override
+    public void start() throws Exception {
+        scheduler.setJobFactory(jobFactory);
+        scheduler.start();
+
+        new Reflections(SelfServiceApplication.class.getPackage().getName(), new SubTypesScanner())
+                .getSubTypesOf(Job.class)
+                .forEach(scheduledClass ->
+                        Optional.ofNullable(scheduledClass.getAnnotation(Scheduled.class))
+                                .filter(this::triggerNotExist)
+                                .ifPresent(scheduleAnn -> schedule(scheduledClass, scheduleAnn)));
+
+    }
+
+    @Override
+    public void stop() throws Exception {
+        scheduler.shutdown();
+    }
+
+    private Trigger getTrigger(SchedulerConfigurationData schedulerConfig, String schedulerName) {
+        return newTrigger()
+                .withIdentity(schedulerName)
+                .withSchedule(CronScheduleBuilder.cronSchedule(schedulerConfig.getCron()))
+                .startNow()
+                .build();
+    }
+
+    private void schedule(Class<? extends Job> scheduledClass, Scheduled scheduleAnn) {
+        final String schedulerName = scheduleAnn.value();
+        final SchedulerConfigurationData schedulerConfig =
+                Optional.ofNullable(config.getSchedulers().get(schedulerName)).orElseThrow(() -> new IllegalStateException(
+                        "There is no configuration provided for scheduler with name " + schedulerName));
+        if (schedulerConfig.isEnabled()) {
+            scheduleJob(newJob(scheduledClass).build(), schedulerConfig, scheduleAnn.value());
+        }
+    }
+
+    private void scheduleJob(JobDetail job, SchedulerConfigurationData schedulerConfig, String schedulerName) {
+        try {
+            final Trigger trigger = getTrigger(schedulerConfig, schedulerName);
+            scheduler.scheduleJob(job, trigger);
+            log.info("Scheduled job {} with trigger {}", job, trigger);
+        } catch (SchedulerException e) {
+            log.error("Can't schedule job due to: {}", e.getMessage());
+            throw new DatalabException("Can't schedule job due to: " + e.getMessage(), e);
+        }
+    }
+
+    private boolean triggerNotExist(Scheduled scheduled) {
+        try {
+            return !scheduler.checkExists(new TriggerKey(scheduled.value()));
+        } catch (SchedulerException e) {
+            log.error("Can not check if trigger exist due to: {}", e.getMessage());
+            throw new DatalabException("Can not check if trigger exist due to: {}" + e.getMessage(), e);
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/internal/Scheduled.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/internal/Scheduled.java
new file mode 100644
index 0000000..8900f44
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/schedulers/internal/Scheduled.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers.internal;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation is used as alternative to {@link com.fiestacabin.dropwizard.quartz.Scheduled}
+ * and allow to use scheduler configuration from application config
+ * }
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Scheduled {
+    /**
+     * @return scheduler name
+     */
+    String value();
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/AccessKeyService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/AccessKeyService.java
new file mode 100644
index 0000000..41f9db8
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/AccessKeyService.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.KeysDTO;
+
+@FunctionalInterface
+public interface AccessKeyService {
+    KeysDTO generateKeys(UserInfo userInfo);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ApplicationSettingService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ApplicationSettingService.java
new file mode 100644
index 0000000..7d4bf0e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ApplicationSettingService.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import java.util.Map;
+
+public interface ApplicationSettingService {
+
+    void removeMaxBudget();
+
+    void setMaxBudget(Long maxBudget);
+
+    Map<String, Object> getSettings();
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ApplicationSettingServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ApplicationSettingServiceImpl.java
new file mode 100644
index 0000000..1e28bc1
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ApplicationSettingServiceImpl.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.dao.MongoSetting;
+import com.epam.datalab.backendapi.dao.SettingsDAO;
+import com.google.inject.Inject;
+
+import java.util.Map;
+
+public class ApplicationSettingServiceImpl implements ApplicationSettingService {
+    @Inject
+    private SettingsDAO settingsDAO;
+
+    @Override
+    public void removeMaxBudget() {
+        settingsDAO.removeSetting(MongoSetting.CONF_MAX_BUDGET);
+    }
+
+    @Override
+    public void setMaxBudget(Long maxBudget) {
+        settingsDAO.setMaxBudget(maxBudget);
+    }
+
+    @Override
+    public Map<String, Object> getSettings() {
+        return settingsDAO.getSettings();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/AuditService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/AuditService.java
new file mode 100644
index 0000000..6dc4ab5
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/AuditService.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.domain.AuditCreateDTO;
+import com.epam.datalab.backendapi.domain.AuditDTO;
+import com.epam.datalab.backendapi.domain.AuditPaginationDTO;
+
+import java.util.List;
+
+public interface AuditService {
+    void save(AuditDTO audit);
+
+    void save(String user, AuditCreateDTO audit);
+
+    List<AuditPaginationDTO> getAudit(List<String> users, List<String> projects, List<String> resourceNames, List<String> resourceTypes, String dateStart, String dateEnd, int pageNumber, int pageSize);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/BackupService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/BackupService.java
new file mode 100644
index 0000000..aec15d0
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/BackupService.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.BackupInfoRecord;
+import com.epam.datalab.dto.backup.EnvBackupDTO;
+import com.epam.datalab.dto.backup.EnvBackupStatus;
+
+import java.util.List;
+
+public interface BackupService {
+    String createBackup(EnvBackupDTO dto, UserInfo userInfo);
+
+    void updateStatus(EnvBackupDTO dto, String user, EnvBackupStatus status);
+
+    List<BackupInfoRecord> getBackups(String userName);
+
+    BackupInfoRecord getBackup(String userName, String id);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/BillingService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/BillingService.java
new file mode 100644
index 0000000..03e18cb
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/BillingService.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.BillingReport;
+import com.epam.datalab.backendapi.resources.dto.BillingFilter;
+import com.epam.datalab.backendapi.resources.dto.ExportBillingFilter;
+import com.epam.datalab.backendapi.resources.dto.QuotaUsageDTO;
+
+import java.util.List;
+
+public interface BillingService {
+    BillingReport getBillingReport(UserInfo userInfo, BillingFilter filter);
+
+	String downloadReport(UserInfo userInfo, ExportBillingFilter filter, String locale);
+
+    BillingReport getExploratoryBillingData(String project, String endpoint, String exploratoryName, List<String> compNames);
+
+    void updateRemoteBillingData(UserInfo userInfo);
+
+    QuotaUsageDTO getQuotas(UserInfo userInfo);
+
+    boolean isProjectQuoteReached(String project);
+
+    int getBillingProjectQuoteUsed(String project);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/BucketService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/BucketService.java
new file mode 100644
index 0000000..1ed737c
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/BucketService.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.dto.bucket.BucketDTO;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.util.List;
+
+public interface BucketService {
+    List<BucketDTO> getObjects(UserInfo userInfo, String bucket, String endpoint);
+
+    void uploadObject(UserInfo userInfo, String bucket, String object, String endpoint, InputStream inputStream, String contentType, long fileSize, String auditInfo);
+
+    void uploadFolder(UserInfo userInfo, String bucket, String folder, String endpoint, String auditInfo);
+
+    void downloadObject(UserInfo userInfo, String bucket, String object, String endpoint, HttpServletResponse resp, String auditInfo);
+
+    void deleteObjects(UserInfo userInfo, String bucket, List<String> objects, String endpoint, String auditInfo);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ComputationalService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ComputationalService.java
new file mode 100644
index 0000000..63e6544
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ComputationalService.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.ComputationalCreateFormDTO;
+import com.epam.datalab.backendapi.resources.dto.ComputationalTemplatesDTO;
+import com.epam.datalab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface ComputationalService {
+    ComputationalTemplatesDTO getComputationalNamesAndTemplates(UserInfo user, String project, String endpoint);
+
+    /**
+     * Asynchronously triggers creation of Spark cluster
+     *
+     * @param userInfo     user authentication info
+     * @param resourceName name of computational resource
+     * @param form         input cluster parameters
+     * @param auditInfo    additional info for audit
+     * @return <code>true</code> if action is successfully triggered, <code>false</code>false if cluster with the same
+     * name already exists
+     * @throws IllegalArgumentException if input parameters exceed limits or docker image name is malformed
+     */
+    boolean createSparkCluster(UserInfo userInfo, String resourceName, SparkStandaloneClusterCreateForm form, String project, String auditInfo);
+
+    /**
+     * Asynchronously triggers termination of computational resources
+     *
+     * @param userInfo          user info of authenticated user
+     * @param resourceCreator   username of resource creator
+     * @param project           project name
+     * @param exploratoryName   name of exploratory where to terminate computational resources with <code>computationalName</code>
+     * @param computationalName computational name
+     * @param auditInfo         additional info for audit
+     */
+    void terminateComputational(UserInfo userInfo, String resourceCreator, String project, String exploratoryName, String computationalName, String auditInfo);
+
+    boolean createDataEngineService(UserInfo userInfo, String resourceName, ComputationalCreateFormDTO formDTO, UserComputationalResource
+            computationalResource, String project, String auditInfo);
+
+    void stopSparkCluster(UserInfo userInfo, String resourceCreator, String project, String exploratoryName, String computationalName, String auditInfo);
+
+    void startSparkCluster(UserInfo userInfo, String exploratoryName, String computationalName, String project, String auditInfo);
+
+    void updateSparkClusterConfig(UserInfo userInfo, String project, String exploratoryName, String computationalName,
+                                  List<ClusterConfig> config, String auditInfo);
+
+    Optional<UserComputationalResource> getComputationalResource(String user, String project, String exploratoryName,
+                                                                 String computationalName);
+
+    List<ClusterConfig> getClusterConfig(UserInfo userInfo, String project, String exploratoryName, String computationalName);
+
+    void updateAfterStatusCheck(UserInfo systemUser, String project, String endpoint, String name, String instanceID, UserInstanceStatus status, String auditInfo);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/EndpointService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/EndpointService.java
new file mode 100644
index 0000000..41afa18
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/EndpointService.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.EndpointResourcesDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.cloud.CloudProvider;
+
+import java.util.List;
+
+public interface EndpointService {
+    List<EndpointDTO> getEndpoints();
+
+    List<EndpointDTO> getEndpointsWithStatus(EndpointDTO.EndpointStatus status);
+
+    EndpointResourcesDTO getEndpointResources(String endpoint);
+
+    EndpointDTO get(String name);
+
+    void create(UserInfo userInfo, String resourceName, EndpointDTO endpointDTO);
+
+    void updateEndpointStatus(String name, EndpointDTO.EndpointStatus status);
+
+    void remove(UserInfo userInfo, String name);
+
+    void removeEndpointInAllProjects(UserInfo userInfo, String endpointName, List<ProjectDTO> projects);
+
+    CloudProvider checkUrl(UserInfo userInfo, String url);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/EnvironmentService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/EnvironmentService.java
new file mode 100644
index 0000000..ad9fa3c
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/EnvironmentService.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.UserDTO;
+import com.epam.datalab.backendapi.resources.dto.UserResourceInfo;
+import com.epam.datalab.dto.status.EnvResourceList;
+
+import java.util.List;
+
+public interface EnvironmentService {
+    List<UserDTO> getUsers();
+
+    List<UserResourceInfo> getAllEnv(UserInfo user);
+
+    void stopAll();
+
+    void stopEnvironmentWithServiceAccount(String user);
+
+    void stopProjectEnvironment(String project);
+
+    void stopExploratory(UserInfo userInfo, String user, String project, String exploratoryName);
+
+    void stopComputational(UserInfo userInfo, String user, String project, String exploratoryName, String computationalName);
+
+    void terminateExploratory(UserInfo userInfo, String user, String project, String exploratoryName);
+
+    void terminateComputational(UserInfo userInfo, String user, String project, String exploratoryName, String computationalName);
+
+    void updateEnvironmentStatuses(EnvResourceList resourceList);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ExploratoryService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ExploratoryService.java
new file mode 100644
index 0000000..3711c52
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ExploratoryService.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.resources.dto.ExploratoryCreatePopUp;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.model.exploratory.Exploratory;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+public interface ExploratoryService {
+
+    String start(UserInfo userInfo, String exploratoryName, String project, String auditInfo);
+
+    String stop(UserInfo userInfo, String resourceCreator, String project, String exploratoryName, String auditInfo);
+
+    String terminate(UserInfo userInfo, String resourceCreator, String project, String exploratoryName, String auditInfo);
+
+    String create(UserInfo userInfo, Exploratory exploratory, String project, String exploratoryName);
+
+    void updateProjectExploratoryStatuses(UserInfo userInfo, String project, String endpoint, UserInstanceStatus status);
+
+    void updateProjectExploratoryStatuses(String project, String endpoint, UserInstanceStatus status);
+
+    void updateClusterConfig(UserInfo userInfo, String project, String exploratoryName, List<ClusterConfig> config);
+
+    Optional<UserInstanceDTO> getUserInstance(String user, String project, String exploratoryName);
+
+    Optional<UserInstanceDTO> getUserInstance(String user, String project, String exploratoryName, boolean includeCompResources);
+
+    List<UserInstanceDTO> findAll();
+
+    List<UserInstanceDTO> findAll(Set<ProjectDTO> projects);
+
+    List<ClusterConfig> getClusterConfig(UserInfo user, String project, String exploratoryName);
+
+    ExploratoryCreatePopUp getUserInstances(UserInfo user);
+
+    void updateAfterStatusCheck(UserInfo userInfo, String project, String endpoint, String name, String instanceID, UserInstanceStatus status, String auditInfo);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ExternalLibraryService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ExternalLibraryService.java
new file mode 100644
index 0000000..768f3a5
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ExternalLibraryService.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.resources.dto.LibraryDTO;
+
+@FunctionalInterface
+public interface ExternalLibraryService {
+
+    LibraryDTO getLibrary(String groupId, String artifactId, String version);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/GitCredentialService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/GitCredentialService.java
new file mode 100644
index 0000000..b4294d5
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/GitCredentialService.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsDTO;
+
+public interface GitCredentialService {
+    void updateGitCredentials(UserInfo userInfo, ExploratoryGitCredsDTO dto);
+
+    ExploratoryGitCredsDTO getGitCredentials(String user);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/GuacamoleService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/GuacamoleService.java
new file mode 100644
index 0000000..2b19703
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/GuacamoleService.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import org.apache.guacamole.net.GuacamoleTunnel;
+
+@FunctionalInterface
+public interface GuacamoleService {
+
+    GuacamoleTunnel getTunnel(UserInfo userInfo, String host, String endpoint);
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ImageExploratoryService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ImageExploratoryService.java
new file mode 100644
index 0000000..fae72a3
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ImageExploratoryService.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord;
+import com.epam.datalab.model.exploratory.Image;
+
+import java.util.List;
+
+public interface ImageExploratoryService {
+
+    String createImage(UserInfo user, String project, String exploratoryName, String imageName, String imageDescription, String info);
+
+    void finishImageCreate(Image image, String exploratoryName, String newNotebookIp);
+
+    List<ImageInfoRecord> getNotFailedImages(String user, String dockerImage, String project, String endpoint);
+
+    ImageInfoRecord getImage(String user, String name, String project, String endpoint);
+
+    List<ImageInfoRecord> getImagesForProject(String project);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InactivityService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InactivityService.java
new file mode 100644
index 0000000..a0586b2
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InactivityService.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+
+import java.time.LocalDateTime;
+
+public interface InactivityService {
+
+    void updateRunningResourcesLastActivity();
+
+    void updateLastActivityForExploratory(UserInfo userInfo, String exploratoryName, LocalDateTime lastActivity);
+
+    void updateLastActivityForComputational(UserInfo userInfo, String project, String exploratoryName,
+                                            String computationalName, LocalDateTime lastActivity);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InfrastructureInfoService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InfrastructureInfoService.java
new file mode 100644
index 0000000..b8950ef
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InfrastructureInfoService.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.HealthStatusPageDTO;
+import com.epam.datalab.backendapi.resources.dto.ProjectInfrastructureInfo;
+import com.epam.datalab.dto.InfrastructureMetaInfoDTO;
+import com.epam.datalab.dto.status.EnvResource;
+
+import java.util.List;
+
+public interface InfrastructureInfoService {
+    List<ProjectInfrastructureInfo> getUserResources(UserInfo user);
+
+    HealthStatusPageDTO getHeathStatus(UserInfo user);
+
+    InfrastructureMetaInfoDTO getInfrastructureMetaInfo();
+
+    void updateInfrastructureStatuses(UserInfo user, String endpoint, List<EnvResource> hostInstanceIds, List<EnvResource> clusterInstanceIds);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InfrastructureTemplateService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InfrastructureTemplateService.java
new file mode 100644
index 0000000..6532c6d
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/InfrastructureTemplateService.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.dto.base.computational.FullComputationalTemplate;
+import com.epam.datalab.dto.imagemetadata.ExploratoryMetadataDTO;
+
+import java.util.List;
+
+public interface InfrastructureTemplateService {
+    List<ExploratoryMetadataDTO> getExploratoryTemplates(UserInfo user, String project, String endpoint);
+
+    List<FullComputationalTemplate> getComputationalTemplates(UserInfo user, String project, String endpoint);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/KeycloakService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/KeycloakService.java
new file mode 100644
index 0000000..cb9cf0a
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/KeycloakService.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import org.keycloak.representations.AccessTokenResponse;
+
+public interface KeycloakService {
+    AccessTokenResponse getToken(String code);
+
+    AccessTokenResponse refreshToken(String refreshToken);
+
+    AccessTokenResponse generateAccessToken(String refreshToken);
+
+    AccessTokenResponse generateServiceAccountToken();
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/KeycloakServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/KeycloakServiceImpl.java
new file mode 100644
index 0000000..a3672ea
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/KeycloakServiceImpl.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.SecurityDAO;
+import com.epam.datalab.backendapi.util.KeycloakUtil;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
+import lombok.extern.slf4j.Slf4j;
+import org.glassfish.jersey.internal.util.Base64;
+import org.keycloak.representations.AccessTokenResponse;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.Form;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+
+@Slf4j
+public class KeycloakServiceImpl implements KeycloakService {
+
+    private static final String URI = "/realms/%s/protocol/openid-connect/token";
+    private static final String GRANT_TYPE = "grant_type";
+    private final Client httpClient;
+    private final KeycloakConfiguration conf;
+    private final SecurityDAO securityDAO;
+    private final String redirectUri;
+
+    @Inject
+    public KeycloakServiceImpl(Client httpClient, SelfServiceApplicationConfiguration conf, SecurityDAO securityDAO) {
+        this.httpClient = httpClient;
+        this.conf = conf.getKeycloakConfiguration();
+        this.securityDAO = securityDAO;
+        this.redirectUri = conf.getKeycloakConfiguration().getRedirectUri();
+    }
+
+    @Override
+    public AccessTokenResponse getToken(String code) {
+        return requestToken(accessTokenRequestForm(code));
+    }
+
+    @Override
+    public AccessTokenResponse refreshToken(String refreshToken) {
+        return requestToken(refreshTokenRequestForm(refreshToken));
+    }
+
+    @Override
+    public AccessTokenResponse generateAccessToken(String refreshToken) {
+        AccessTokenResponse tokenResponse = refreshToken(refreshToken);
+        final String username = KeycloakUtil.parseToken(tokenResponse.getToken()).getPreferredUsername();
+        securityDAO.updateUser(username, tokenResponse);
+        return tokenResponse;
+    }
+
+    @Override
+    public AccessTokenResponse generateServiceAccountToken() {
+        return requestToken(serviceAccountRequestForm());
+    }
+
+    private AccessTokenResponse requestToken(Form requestForm) {
+        final String credentials = Base64.encodeAsString(String.join(":", conf.getResource(),
+                String.valueOf(conf.getCredentials().get("secret"))));
+        final Response response =
+                httpClient.target(conf.getAuthServerUrl() + String.format(URI, conf.getRealm())).request()
+                        .header(HttpHeaders.AUTHORIZATION, "Basic " + credentials)
+                        .post(Entity.form(requestForm));
+        if (response.getStatusInfo().getFamily() != Response.Status.Family.SUCCESSFUL) {
+
+            log.error("Error getting token:code {}, body {}", response.getStatus(), response.readEntity(String.class));
+            throw new DatalabException("can not get token");
+        }
+        return response.readEntity(AccessTokenResponse.class);
+    }
+
+    private Form accessTokenRequestForm(String code) {
+        return new Form()
+                .param(GRANT_TYPE, "authorization_code")
+                .param("code", code)
+                .param("redirect_uri", redirectUri);
+    }
+
+    private Form refreshTokenRequestForm(String refreshToken) {
+        return new Form()
+                .param(GRANT_TYPE, "refresh_token")
+                .param("refresh_token", refreshToken);
+    }
+
+    private Form serviceAccountRequestForm() {
+        return new Form()
+                .param(GRANT_TYPE, "client_credentials");
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/LibraryService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/LibraryService.java
new file mode 100644
index 0000000..c212827
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/LibraryService.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.LibInfoRecord;
+import com.epam.datalab.dto.exploratory.LibInstallDTO;
+import org.bson.Document;
+
+import java.util.List;
+
+public interface LibraryService {
+    List<Document> getLibs(String user, String project, String exploratoryName, String computationalName);
+
+    List<LibInfoRecord> getLibInfo(String user, String project, String exploratoryName);
+
+    String installComputationalLibs(UserInfo userInfo, String project, String exploratoryName, String computationalName,
+                                    List<LibInstallDTO> libs, String auditInfo);
+
+    String installExploratoryLibs(UserInfo userInfo, String project, String exploratoryName, List<LibInstallDTO> libs, String auditInfo);
+
+    List<String> getExploratoryLibGroups(UserInfo userInfo, String projectName, String exploratoryName);
+
+    List<String> getComputeLibGroups();
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/OdahuService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/OdahuService.java
new file mode 100644
index 0000000..509083d
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/OdahuService.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.OdahuCreateDTO;
+import com.epam.datalab.backendapi.domain.OdahuDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.odahu.OdahuResult;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface OdahuService {
+	List<OdahuDTO> findOdahu();
+
+	Optional<OdahuDTO> get(String project, String endpoint);
+
+	void create(String project, OdahuCreateDTO createOdahuDTO, UserInfo userInfo);
+
+	void start(String name, String project, String endpoint, UserInfo user);
+
+	void stop(String name, String project, String endpoint, UserInfo user);
+
+	void terminate(String name, String project, String endpoint, UserInfo user);
+
+	void updateStatus(OdahuResult odahuResult, UserInstanceStatus status);
+
+	boolean inProgress(String project, String endpoint);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ProjectService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ProjectService.java
new file mode 100644
index 0000000..4ecd014
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ProjectService.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.UpdateProjectBudgetDTO;
+import com.epam.datalab.backendapi.domain.UpdateProjectDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+
+import java.util.List;
+
+public interface ProjectService {
+	List<ProjectDTO> getProjects();
+
+	List<ProjectDTO> getProjects(UserInfo user);
+
+	List<ProjectDTO> getUserProjects(UserInfo userInfo, boolean active);
+
+	List<ProjectDTO> getProjectsByEndpoint(String endpointName);
+
+	void create(UserInfo userInfo, ProjectDTO projectDTO, String resourceName);
+
+	void recreate(UserInfo userInfo, String endpoint, String projectName);
+
+	ProjectDTO get(String name);
+
+	void terminateEndpoint(UserInfo userInfo, String endpoint, String name);
+
+	void terminateEndpoint(UserInfo userInfo, List<String> endpoints, String name);
+
+	void start(UserInfo userInfo, String endpoint, String name);
+
+	void start(UserInfo userInfo, List<String> endpoints, String name);
+
+    void stop(UserInfo userInfo, String endpoint, String name, String auditInfo);
+
+	void stopWithResources(UserInfo userInfo, List<String> endpoints, String projectName);
+
+	void update(UserInfo userInfo, UpdateProjectDTO projectDTO, String projectName);
+
+	void updateBudget(UserInfo userInfo, List<UpdateProjectBudgetDTO> projects);
+
+	boolean isAnyProjectAssigned(UserInfo userInfo);
+
+	boolean checkExploratoriesAndComputationalProgress(String projectName, List<String> endpoints);
+
+	void updateAfterStatusCheck(UserInfo userInfo, String project, String endpoint, String instanceID, UserInstanceStatus status, String auditInfo);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ReuploadKeyService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ReuploadKeyService.java
new file mode 100644
index 0000000..36370b3
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/ReuploadKeyService.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyStatusDTO;
+
+@FunctionalInterface
+public interface ReuploadKeyService {
+
+    void updateResourceData(ReuploadKeyStatusDTO dto);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SchedulerJobService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SchedulerJobService.java
new file mode 100644
index 0000000..0f68320
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SchedulerJobService.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.model.scheduler.SchedulerJobData;
+
+import java.util.List;
+
+public interface SchedulerJobService {
+    /**
+     * Pulls out scheduler job data for user <code>user<code/> and his exploratory <code>exploratoryName<code/>
+     *
+     * @param user            user's name
+     * @param project         project name
+     * @param exploratoryName name of exploratory resource
+     * @return dto object
+     */
+    SchedulerJobDTO fetchSchedulerJobForUserAndExploratory(String user, String project, String exploratoryName);
+
+    /**
+     * Pulls out scheduler job data for computational resource <code>computationalName<code/> affiliated with
+     * user <code>user<code/> and his exploratory <code>exploratoryName<code/>
+     *
+     * @param user              user's name
+     * @param project           project name
+     * @param exploratoryName   name of exploratory resource
+     * @param computationalName name of computational resource
+     * @return dto object
+     */
+    SchedulerJobDTO fetchSchedulerJobForComputationalResource(String user, String project, String exploratoryName,
+                                                              String computationalName);
+
+    /**
+     * Updates scheduler job data for user <code>user<code/> and his exploratory <code>exploratoryName<code/>
+     *
+     * @param user            user's name
+     * @param project         project name
+     * @param exploratoryName name of exploratory resource
+     * @param dto             scheduler job data
+     */
+    void updateExploratorySchedulerData(UserInfo user, String project, String exploratoryName, SchedulerJobDTO dto);
+
+    /**
+     * Updates scheduler job data for computational resource <code>computationalName<code/> affiliated with
+     * user <code>user<code/> and his exploratory <code>exploratoryName<code/>
+     *
+     * @param user              user's name
+     * @param project           project name
+     * @param exploratoryName   name of exploratory resource
+     * @param computationalName name of computational resource
+     * @param dto               scheduler job data
+     */
+    void updateComputationalSchedulerData(UserInfo user, String project, String exploratoryName,
+                                          String computationalName, SchedulerJobDTO dto);
+
+    void stopComputationalByScheduler();
+
+    void stopExploratoryByScheduler();
+
+    void startExploratoryByScheduler();
+
+    void startComputationalByScheduler();
+
+    void terminateExploratoryByScheduler();
+
+    void terminateComputationalByScheduler();
+
+    void removeScheduler(String user, String exploratoryName);
+
+    void removeScheduler(String user, String exploratoryName, String computationalName);
+
+    List<SchedulerJobData> getActiveSchedulers(String user, long timeOffset);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SecurityService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SecurityService.java
new file mode 100644
index 0000000..dd969cf
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SecurityService.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+
+public interface SecurityService {
+    UserInfo getUserInfo(String code);
+
+    UserInfo getUserInfoOffline(String username);
+
+    UserInfo getServiceAccountInfo(String username);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SecurityServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SecurityServiceImpl.java
new file mode 100644
index 0000000..cde3edf
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SecurityServiceImpl.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.SecurityDAO;
+import com.epam.datalab.backendapi.domain.AuditActionEnum;
+import com.epam.datalab.backendapi.domain.AuditDTO;
+import com.epam.datalab.backendapi.util.KeycloakUtil;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+import org.keycloak.representations.AccessTokenResponse;
+
+public class SecurityServiceImpl implements SecurityService {
+    private final KeycloakService keycloakService;
+    private final SecurityDAO securityDAO;
+    private final AuditService auditService;
+
+    @Inject
+    public SecurityServiceImpl(KeycloakService keycloakService, SecurityDAO securityDAO, AuditService auditService) {
+        this.keycloakService = keycloakService;
+        this.securityDAO = securityDAO;
+        this.auditService = auditService;
+    }
+
+    @Override
+    public UserInfo getUserInfo(String code) {
+        final AccessTokenResponse token = keycloakService.getToken(code);
+        final String username = KeycloakUtil.parseToken(token.getToken()).getPreferredUsername();
+        securityDAO.saveUser(username, token);
+        UserInfo userInfo = new UserInfo(username, token.getToken());
+        userInfo.setRefreshToken(token.getRefreshToken());
+        saveLogInAudit(username);
+        return userInfo;
+    }
+
+    @Override
+    public UserInfo getUserInfoOffline(String username) {
+        return securityDAO.getTokenResponse(username)
+                .map(AccessTokenResponse::getRefreshToken)
+                .map(keycloakService::refreshToken)
+                .map(accessTokenResponse -> new UserInfo(KeycloakUtil.parseToken(accessTokenResponse.getToken()).getPreferredUsername(),
+                        accessTokenResponse.getToken()))
+                .orElseThrow(() -> new DatalabException("Can not find token for user " + username));
+    }
+
+    @Override
+    public UserInfo getServiceAccountInfo(String username) {
+        AccessTokenResponse accessTokenResponse = keycloakService.generateServiceAccountToken();
+        return new UserInfo(username, accessTokenResponse.getToken());
+    }
+
+    private void saveLogInAudit(String username) {
+        AuditDTO auditDTO = AuditDTO.builder()
+                .user(username)
+                .action(AuditActionEnum.LOG_IN)
+                .build();
+        auditService.save(auditDTO);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SystemInfoService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SystemInfoService.java
new file mode 100644
index 0000000..b0e58ad
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/SystemInfoService.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.resources.dto.SystemInfoDto;
+
+@FunctionalInterface
+public interface SystemInfoService {
+
+    SystemInfoDto getSystemInfo();
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagService.java
new file mode 100644
index 0000000..3aea642
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagService.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+
+import java.util.Map;
+
+@FunctionalInterface
+public interface TagService {
+    Map<String, String> getResourceTags(UserInfo userInfo, String endpoint, String project, String customTag
+            , boolean gpuEnabled);}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagServiceImpl.java
new file mode 100644
index 0000000..891b599
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/TagServiceImpl.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.google.inject.Singleton;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+@Singleton
+public class TagServiceImpl implements TagService {
+
+    @Override
+    public Map<String, String> getResourceTags(UserInfo userInfo, String endpoint, String project,
+                                               String customTag, boolean gpuEnabled) {
+        Map<String, String> tags = new HashMap<>();
+        tags.put("user_tag", userInfo.getName());
+        tags.put("endpoint_tag", endpoint);
+        tags.put("project_tag", project);
+        Optional.ofNullable(customTag).ifPresent(t -> tags.put("custom_tag", t));
+        if (gpuEnabled) {
+            tags.put("gpu_tag", "gpu");
+        }
+        return tags;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserGroupService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserGroupService.java
new file mode 100644
index 0000000..c95d4ad
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserGroupService.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.UserGroupDto;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface UserGroupService {
+
+    void createGroup(UserInfo userInfo, String group, Set<String> roleIds, Set<String> users);
+
+    void updateGroup(UserInfo user, String group, Map<String, String> roles, Set<String> users);
+
+    void removeGroup(UserInfo userInfo, String groupId);
+
+    List<UserGroupDto> getAggregatedRolesByGroup(UserInfo user);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserRoleService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserRoleService.java
new file mode 100644
index 0000000..650923a
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserRoleService.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.resources.dto.UserRoleDTO;
+
+import java.util.List;
+
+public interface UserRoleService {
+
+    List<UserRoleDTO> getUserRoles();
+
+    void createRole(UserRoleDTO dto);
+
+    void updateRole(UserRoleDTO dto);
+
+    void removeRole(String roleId);
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserRoleServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserRoleServiceImpl.java
new file mode 100644
index 0000000..c182662
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserRoleServiceImpl.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.dao.UserRoleDAO;
+import com.epam.datalab.backendapi.resources.dto.UserRoleDTO;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+@Singleton
+public class UserRoleServiceImpl implements UserRoleService {
+    private static final String ROLE_NOT_FOUND_MSG = "Any of role : %s were not found";
+
+    @Inject
+    private UserRoleDAO userRoleDao;
+
+    @Override
+    public List<UserRoleDTO> getUserRoles() {
+        return userRoleDao.findAll();
+    }
+
+    @Override
+    public void createRole(UserRoleDTO dto) {
+        userRoleDao.insert(dto);
+    }
+
+    @Override
+    public void updateRole(UserRoleDTO dto) {
+        checkAnyRoleFound(Collections.singleton(dto.getId()), userRoleDao.update(dto));
+    }
+
+    @Override
+    public void removeRole(String roleId) {
+        userRoleDao.remove(roleId);
+    }
+
+    private void checkAnyRoleFound(Set<String> roleIds, boolean anyRoleFound) {
+        if (!anyRoleFound) {
+            throw new ResourceNotFoundException(String.format(ROLE_NOT_FOUND_MSG, roleIds));
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserSettingService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserSettingService.java
new file mode 100644
index 0000000..529e7c4
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserSettingService.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.UserDTO;
+
+import java.util.List;
+
+public interface UserSettingService {
+
+    void saveUISettings(UserInfo userInfo, String settings);
+
+    String getUISettings(UserInfo userInfo);
+
+    void updateUsersBudget(List<UserDTO> budgets);
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserSettingServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserSettingServiceImpl.java
new file mode 100644
index 0000000..20be82e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/UserSettingServiceImpl.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.UserSettingsDAO;
+import com.epam.datalab.backendapi.resources.dto.UserDTO;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import java.util.List;
+
+@Singleton
+public class UserSettingServiceImpl implements UserSettingService {
+    @Inject
+    private UserSettingsDAO settingsDAO;
+
+    @Override
+    public void saveUISettings(UserInfo userInfo, String settings) {
+        settingsDAO.setUISettings(userInfo, settings);
+    }
+
+    @Override
+    public String getUISettings(UserInfo userInfo) {
+        return settingsDAO.getUISettings(userInfo);
+    }
+
+    @Override
+    public void updateUsersBudget(List<UserDTO> budgets) {
+        budgets.forEach(settingsDAO::updateBudget);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/AccessKeyServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/AccessKeyServiceImpl.java
new file mode 100644
index 0000000..d9c119e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/AccessKeyServiceImpl.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.resources.dto.KeysDTO;
+import com.epam.datalab.backendapi.service.AccessKeyService;
+import com.epam.datalab.exceptions.DatalabException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.KeyPair;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+@Singleton
+@Slf4j
+public class AccessKeyServiceImpl implements AccessKeyService {
+    @Inject
+    private SelfServiceApplicationConfiguration configuration;
+
+
+    @Override
+    public KeysDTO generateKeys(UserInfo userInfo) {
+        log.debug("Generating new key pair for user {}", userInfo.getName());
+        try (ByteArrayOutputStream publicKeyOut = new ByteArrayOutputStream();
+             ByteArrayOutputStream privateKeyOut = new ByteArrayOutputStream()) {
+            KeyPair pair = KeyPair.genKeyPair(new JSch(), KeyPair.RSA, configuration.getPrivateKeySize());
+            pair.writePublicKey(publicKeyOut, userInfo.getName());
+            pair.writePrivateKey(privateKeyOut);
+            return new KeysDTO(new String(publicKeyOut.toByteArray()),
+                    new String(privateKeyOut.toByteArray()), userInfo.getName());
+        } catch (JSchException | IOException e) {
+            log.error("Can not generate private/public key pair due to: {}", e.getMessage());
+            throw new DatalabException("Can not generate private/public key pair due to: " + e.getMessage(), e);
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/AuditServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/AuditServiceImpl.java
new file mode 100644
index 0000000..161bf2b
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/AuditServiceImpl.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.dao.AuditDAO;
+import com.epam.datalab.backendapi.domain.AuditCreateDTO;
+import com.epam.datalab.backendapi.domain.AuditDTO;
+import com.epam.datalab.backendapi.domain.AuditPaginationDTO;
+import com.epam.datalab.backendapi.service.AuditService;
+import com.google.inject.Inject;
+
+import java.util.List;
+
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.FOLLOW_LINK;
+
+public class AuditServiceImpl implements AuditService {
+    private final AuditDAO auditDAO;
+
+    @Inject
+    public AuditServiceImpl(AuditDAO auditDAO) {
+        this.auditDAO = auditDAO;
+    }
+
+    @Override
+    public void save(AuditDTO audit) {
+        auditDAO.save(audit);
+    }
+
+    @Override
+    public void save(String user, AuditCreateDTO audit) {
+        AuditDTO auditDTO = AuditDTO.builder()
+                .user(user)
+                .resourceName(audit.getResourceName())
+                .action(FOLLOW_LINK)
+                .type(audit.getType())
+                .info(audit.getInfo())
+                .build();
+        auditDAO.save(auditDTO);
+    }
+
+    @Override
+    public List<AuditPaginationDTO> getAudit(List<String> users, List<String> projects, List<String> resourceNames, List<String> resourceTypes,
+                                             String dateStart, String dateEnd, int pageNumber, int pageSize) {
+        return auditDAO.getAudit(users, projects, resourceNames, resourceTypes, dateStart, dateEnd, pageNumber, pageSize);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/BackupServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/BackupServiceImpl.java
new file mode 100644
index 0000000..cfd42a0
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/BackupServiceImpl.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.BackupDAO;
+import com.epam.datalab.backendapi.resources.dto.BackupInfoRecord;
+import com.epam.datalab.backendapi.service.BackupService;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.backup.EnvBackupDTO;
+import com.epam.datalab.dto.backup.EnvBackupStatus;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.BackupAPI;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+
+import java.util.List;
+
+@Singleton
+public class BackupServiceImpl implements BackupService {
+
+    @Inject
+    @Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
+    private RESTService provisioningService;
+
+    @Inject
+    private BackupDAO backupDao;
+
+    @Override
+    public String createBackup(EnvBackupDTO dto, UserInfo user) {
+        updateStatus(dto, user.getName(), EnvBackupStatus.CREATING);
+        return provisioningService.post(BackupAPI.BACKUP, user.getAccessToken(), dto, String.class);
+    }
+
+    @Override
+    public void updateStatus(EnvBackupDTO dto, String user, EnvBackupStatus status) {
+        backupDao.createOrUpdate(dto, user, status);
+    }
+
+    @Override
+    public List<BackupInfoRecord> getBackups(String userName) {
+        return backupDao.getBackups(userName);
+    }
+
+    @Override
+    public BackupInfoRecord getBackup(String userName, String id) {
+        return backupDao.getBackup(userName, id).orElseThrow(() -> new ResourceNotFoundException(
+                String.format("Backup with id %s was not found for user %s", id, userName)));
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/BillingServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/BillingServiceImpl.java
new file mode 100644
index 0000000..df800e0
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/BillingServiceImpl.java
@@ -0,0 +1,375 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.BillingDAO;
+import com.epam.datalab.backendapi.dao.ImageExploratoryDAO;
+import com.epam.datalab.backendapi.dao.ProjectDAO;
+import com.epam.datalab.backendapi.domain.*;
+import com.epam.datalab.backendapi.resources.dto.BillingFilter;
+import com.epam.datalab.backendapi.resources.dto.ExportBillingFilter;
+import com.epam.datalab.backendapi.resources.dto.QuotaUsageDTO;
+import com.epam.datalab.backendapi.roles.RoleType;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.backendapi.service.BillingService;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.util.BillingUtils;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.billing.BillingData;
+import com.epam.datalab.dto.billing.BillingResourceType;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.http.client.utils.URIBuilder;
+
+import javax.ws.rs.core.GenericType;
+import java.math.BigDecimal;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Slf4j
+public class BillingServiceImpl implements BillingService {
+    private static final String BILLING_PATH = "/api/billing";
+    private static final String USAGE_DATE_FORMAT = "yyyy-MM";
+
+    private final ProjectService projectService;
+    private final ProjectDAO projectDAO;
+    private final EndpointService endpointService;
+    private final ExploratoryService exploratoryService;
+    private final SelfServiceApplicationConfiguration configuration;
+    private final RESTService billingService;
+    private final ImageExploratoryDAO imageExploratoryDao;
+    private final BillingDAO billingDAO;
+
+    @Inject
+    public BillingServiceImpl(ProjectService projectService, ProjectDAO projectDAO, EndpointService endpointService,
+                              ExploratoryService exploratoryService, SelfServiceApplicationConfiguration configuration,
+                              @Named(ServiceConsts.BILLING_SERVICE_NAME) RESTService billingService,
+                              ImageExploratoryDAO imageExploratoryDao, BillingDAO billingDAO) {
+        this.projectService = projectService;
+        this.projectDAO = projectDAO;
+        this.endpointService = endpointService;
+        this.exploratoryService = exploratoryService;
+        this.configuration = configuration;
+        this.billingService = billingService;
+        this.imageExploratoryDao = imageExploratoryDao;
+        this.billingDAO = billingDAO;
+    }
+
+    @Override
+    public BillingReport getBillingReport(UserInfo user, BillingFilter filter) {
+        setUserFilter(user, filter);
+        List<BillingReportLine> billingReportLines = billingDAO.aggregateBillingData(filter)
+                .stream()
+                .peek(this::appendStatuses)
+                .filter(bd -> CollectionUtils.isEmpty(filter.getStatuses()) || filter.getStatuses().contains(bd.getStatus()))
+                .collect(Collectors.toList());
+        final LocalDate min = billingReportLines.stream().min(Comparator.comparing(BillingReportLine::getUsageDateFrom)).map(BillingReportLine::getUsageDateFrom).orElse(null);
+        final LocalDate max = billingReportLines.stream().max(Comparator.comparing(BillingReportLine::getUsageDateTo)).map(BillingReportLine::getUsageDateTo).orElse(null);
+        final double sum = billingReportLines.stream().mapToDouble(BillingReportLine::getCost).sum();
+        final String currency = billingReportLines.stream().map(BillingReportLine::getCurrency).distinct().count() == 1 ? billingReportLines.get(0).getCurrency() : null;
+        return BillingReport.builder()
+                .name("Billing report")
+                .sbn(configuration.getServiceBaseName())
+                .reportLines(billingReportLines)
+                .usageDateFrom(min)
+                .usageDateTo(max)
+                .totalCost(BigDecimal.valueOf(sum).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())
+                .currency(currency)
+                .isReportHeaderCompletable(hasUserBillingRole(user))
+                .build();
+    }
+
+    @Override
+    public String downloadReport(UserInfo user, ExportBillingFilter filter, String locale) {
+        BillingReport report = getBillingReport(user, filter);
+        boolean isReportComplete = report.isReportHeaderCompletable();
+        StringBuilder reportHead = new StringBuilder(BillingUtils.getFirstLine(report.getSbn(), report.getUsageDateFrom(), report.getUsageDateTo(), locale));
+        String stringOfAdjustedHeader = BillingUtils.getHeader(isReportComplete);
+        reportHead.append(stringOfAdjustedHeader);
+        report.getReportLines().forEach(r -> reportHead.append(BillingUtils.printLine(r, isReportComplete)));
+        reportHead.append(BillingUtils.getTotal(report.getTotalCost(), report.getCurrency(), stringOfAdjustedHeader));
+        return reportHead.toString();
+    }
+
+    @Override
+    public BillingReport getExploratoryBillingData(String project, String endpoint, String exploratoryName, List<String> compNames) {
+        List<String> resourceNames = new ArrayList<>(compNames);
+        resourceNames.add(exploratoryName);
+        List<BillingReportLine> billingReportLines = billingDAO.findBillingData(project, endpoint, resourceNames);
+        final double sum = billingReportLines.stream().mapToDouble(BillingReportLine::getCost).sum();
+        List<BillingReportLine> billingData = billingReportLines
+                .stream()
+                .peek(bd -> bd.setCost(BigDecimal.valueOf(bd.getCost()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()))
+                .collect(Collectors.toList());
+        ;
+        final String currency = billingData.stream().map(BillingReportLine::getCurrency).distinct().count() == 1 ? billingData.get(0).getCurrency() : null;
+        return BillingReport.builder()
+                .name(exploratoryName)
+                .reportLines(billingData)
+                .totalCost(BigDecimal.valueOf(sum).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())
+                .currency(currency)
+                .build();
+    }
+
+    @Override
+    public void updateRemoteBillingData(UserInfo userInfo) {
+        List<EndpointDTO> endpoints = endpointService.getEndpoints();
+        if (CollectionUtils.isEmpty(endpoints)) {
+            log.error("Cannot update billing info. There are no endpoints");
+            throw new DatalabException("Cannot update billing info. There are no endpoints");
+        }
+
+        Map<EndpointDTO, List<BillingData>> billingDataMap = endpoints
+                .stream()
+                .collect(Collectors.toMap(e -> e, e -> getBillingData(userInfo, e)));
+
+        billingDataMap.forEach((endpointDTO, billingData) -> {
+            log.info("Updating billing information for endpoint {}. Billing data {}", endpointDTO.getName(), billingData);
+            if (!billingData.isEmpty()) {
+                updateBillingData(endpointDTO, billingData, endpoints);
+                log.info("Updating billing information for endpoint {}. Billing data {} success", endpointDTO.getName(), billingData);
+            }
+        });
+    }
+
+    @Override
+    public QuotaUsageDTO getQuotas(UserInfo userInfo) {
+        int totalQuota = billingDAO.getBillingQuoteUsed();
+        Map<String, Integer> projectQuotas = projectService.getProjects(userInfo)
+                .stream()
+                .collect(Collectors.toMap(ProjectDTO::getName, p -> getBillingProjectQuoteUsed(p.getName())));
+        return QuotaUsageDTO.builder()
+                .totalQuotaUsed(totalQuota)
+                .projectQuotas(projectQuotas)
+                .build();
+    }
+
+    @Override
+    public boolean isProjectQuoteReached(String project) {
+        final Double projectCost = getProjectCost(project);
+        return projectDAO.getAllowedBudget(project)
+                .filter(allowedBudget -> projectCost.intValue() != 0 && allowedBudget <= projectCost)
+                .isPresent();
+    }
+
+    @Override
+    public int getBillingProjectQuoteUsed(String project) {
+        return toPercentage(() -> projectDAO.getAllowedBudget(project), getProjectCost(project));
+    }
+
+    private Double getProjectCost(String project) {
+        final boolean monthlyBudget = Optional.ofNullable(projectService.get(project).getBudget())
+                .map(BudgetDTO::isMonthlyBudget)
+                .orElse(Boolean.FALSE);
+        return monthlyBudget ? billingDAO.getMonthlyProjectCost(project, LocalDate.now()) : billingDAO.getOverallProjectCost(project);
+    }
+
+    private Map<String, BillingReportLine> getBillableResources(List<EndpointDTO> endpoints) {
+        Set<ProjectDTO> projects = new HashSet<>(projectService.getProjects());
+        final Stream<BillingReportLine> ssnBillingDataStream = BillingUtils.ssnBillingDataStream(configuration.getServiceBaseName());
+        final Stream<BillingReportLine> billableEdges = projects
+                .stream()
+                .collect(Collectors.toMap(ProjectDTO::getName, ProjectDTO::getEndpoints))
+                .entrySet()
+                .stream()
+                .flatMap(e -> projectEdges(configuration.getServiceBaseName(), e.getKey(), e.getValue()));
+        final Stream<BillingReportLine> billableSharedEndpoints = endpoints
+                .stream()
+                .flatMap(endpoint -> BillingUtils.sharedEndpointBillingDataStream(endpoint.getName(), configuration.getServiceBaseName()));
+        final Stream<BillingReportLine> billableUserInstances = exploratoryService.findAll(projects)
+                .stream()
+                .filter(userInstance -> Objects.nonNull(userInstance.getExploratoryId()))
+                .flatMap(ui -> BillingUtils.exploratoryBillingDataStream(ui, configuration.getMaxSparkInstanceCount()));
+        final Stream<BillingReportLine> customImages = projects
+                .stream()
+                .map(p -> imageExploratoryDao.getImagesForProject(p.getName()))
+                .flatMap(Collection::stream)
+                .flatMap(i -> BillingUtils.customImageBillingDataStream(i, configuration.getServiceBaseName()));
+
+        final Map<String, BillingReportLine> billableResources = Stream.of(ssnBillingDataStream, billableEdges, billableSharedEndpoints, billableUserInstances, customImages)
+                .flatMap(s -> s)
+                .collect(Collectors.toMap(BillingReportLine::getDatalabId, b -> b));
+        log.debug("Billable resources are: {}", billableResources);
+
+        return billableResources;
+    }
+
+    private Stream<BillingReportLine> projectEdges(String serviceBaseName, String projectName, List<ProjectEndpointDTO> endpoints) {
+        return endpoints
+                .stream()
+                .flatMap(endpoint -> BillingUtils.edgeBillingDataStream(projectName, serviceBaseName, endpoint.getName()));
+    }
+
+    private void updateBillingData(EndpointDTO endpointDTO, List<BillingData> billingData, List<EndpointDTO> endpoints) {
+        final String endpointName = endpointDTO.getName();
+        final CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+        final Map<String, BillingReportLine> billableResources = getBillableResources(endpoints);
+        final Stream<BillingReportLine> billingReportLineStream = billingData
+                .stream()
+                .peek(bd -> bd.setApplication(endpointName))
+                .map(bd -> toBillingReport(bd, getOrDefault(billableResources, bd.getTag())));
+        if (cloudProvider == CloudProvider.GCP) {
+            final Map<String, List<BillingReportLine>> gcpBillingData = billingReportLineStream
+//                    .collect(Collectors.groupingBy(bd -> bd.getUsageDate().substring(0, USAGE_DATE_FORMAT.length())));
+                    .collect(Collectors.groupingBy(BillingReportLine::getUsageDate));
+            updateGcpBillingData(endpointName, gcpBillingData);
+        } else if (cloudProvider == CloudProvider.AWS) {
+            final Map<String, List<BillingReportLine>> awsBillingData = billingReportLineStream
+                    .collect(Collectors.groupingBy(BillingReportLine::getUsageDate));
+            updateAwsBillingData(endpointName, awsBillingData);
+        } else if (cloudProvider == CloudProvider.AZURE) {
+            final List<BillingReportLine> billingReportLines = billingReportLineStream
+                    .collect(Collectors.toList());
+            updateAzureBillingData(billingReportLines);
+        }
+    }
+
+    private BillingReportLine getOrDefault(Map<String, BillingReportLine> billableResources, String tag) {
+        return billableResources.getOrDefault(tag, BillingReportLine.builder().datalabId(tag).build());
+    }
+
+    private void updateGcpBillingData(String endpointName, Map<String, List<BillingReportLine>> billingData) {
+        log.info("!!!TEST OUT!!! BillingReportLine: {}", billingData);
+        log.info("!!!TEST OUT!!! endpointName: {}", endpointName);
+
+
+        billingData.forEach((usageDate, billingReportLines) -> {
+            billingDAO.deleteByUsageDateRegex(endpointName, usageDate);
+            billingDAO.save(billingReportLines);
+        });
+    }
+
+    private void updateAwsBillingData(String endpointName, Map<String, List<BillingReportLine>> billingData) {
+        billingData.forEach((usageDate, billingReportLines) -> {
+            billingDAO.deleteByUsageDate(endpointName, usageDate);
+            billingDAO.save(billingReportLines);
+        });
+    }
+
+    private void updateAzureBillingData(List<BillingReportLine> billingReportLines) {
+        billingDAO.save(billingReportLines);
+    }
+
+    private List<BillingData> getBillingData(UserInfo userInfo, EndpointDTO endpointDTO) {
+        try {
+            return billingService.get(getBillingUrl(endpointDTO.getUrl(), BILLING_PATH), userInfo.getAccessToken(),
+                    new GenericType<List<BillingData>>() {
+                    });
+        } catch (Exception e) {
+            log.error("Cannot retrieve billing information for {} . Reason {}.", endpointDTO.getName(), e.getMessage(), e);
+            return Collections.emptyList();
+        }
+    }
+
+    private String getBillingUrl(String endpointUrl, String path) {
+        URI uri;
+        try {
+            uri = new URI(endpointUrl);
+        } catch (URISyntaxException e) {
+            log.error("Wrong URI syntax {}", e.getMessage(), e);
+            throw new DatalabException("Wrong URI syntax");
+        }
+        return new URIBuilder()
+                .setScheme(uri.getScheme())
+                .setHost(uri.getHost())
+                .setPort(configuration.getBillingPort())
+                .setPath(path)
+                .toString();
+    }
+
+    private void appendStatuses(BillingReportLine br) {
+        BillingResourceType resourceType = br.getResourceType();
+        if (BillingResourceType.EDGE == resourceType) {
+            projectService.get(br.getProject()).getEndpoints()
+                    .stream()
+                    .filter(e -> e.getName().equals(br.getResourceName()))
+                    .findAny()
+                    .ifPresent(e -> br.setStatus(e.getStatus()));
+        } else if (BillingResourceType.EXPLORATORY == resourceType) {
+            exploratoryService.getUserInstance(br.getUser(), br.getProject(), br.getResourceName())
+                    .ifPresent(ui -> br.setStatus(UserInstanceStatus.of(ui.getStatus())));
+        } else if (BillingResourceType.COMPUTATIONAL == resourceType) {
+            exploratoryService.getUserInstance(br.getUser(), br.getProject(), br.getExploratoryName(), true)
+                    .flatMap(ui -> ui.getResources()
+                            .stream()
+                            .filter(cr -> cr.getComputationalName().equals(br.getResourceName()))
+                            .findAny())
+                    .ifPresent(cr -> br.setStatus(UserInstanceStatus.of(cr.getStatus())));
+        }
+    }
+
+    /**
+     * @param userInfo user's properties for current session
+     * @return true, if user has be billing role
+     */
+    private boolean hasUserBillingRole(UserInfo userInfo) {
+        return UserRoles.checkAccess(userInfo, RoleType.PAGE, "/api/infrastructure_provision/billing", userInfo.getRoles());
+    }
+
+    private void setUserFilter(UserInfo userInfo, BillingFilter filter) {
+        if (!hasUserBillingRole(userInfo)) {
+            filter.setUsers(Lists.newArrayList(userInfo.getName()));
+        }
+    }
+
+    private BillingReportLine toBillingReport(BillingData billingData, BillingReportLine billingReportLine) {
+        return BillingReportLine.builder()
+                .application(billingData.getApplication())
+                .cost(billingData.getCost())
+                .currency(billingData.getCurrency())
+                .product(billingData.getProduct())
+                .project(billingReportLine.getProject())
+                .endpoint(billingReportLine.getEndpoint())
+                .usageDateFrom(billingData.getUsageDateFrom())
+                .usageDateTo(billingData.getUsageDateTo())
+                .usageDate(billingData.getUsageDate())
+                .usageType(billingData.getUsageType())
+                .user(billingReportLine.getUser())
+                .datalabId(billingData.getTag())
+                .resourceType(billingReportLine.getResourceType())
+                .resourceName(billingReportLine.getResourceName())
+                .shape(billingReportLine.getShape())
+                .exploratoryName(billingReportLine.getExploratoryName())
+                .build();
+    }
+
+    private Integer toPercentage(Supplier<Optional<Integer>> allowedBudget, Double totalCost) {
+        return allowedBudget.get()
+                .map(userBudget -> (totalCost * 100) / userBudget)
+                .map(Double::intValue)
+                .orElse(BigDecimal.ZERO.intValue());
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/BucketServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/BucketServiceImpl.java
new file mode 100644
index 0000000..7729dea
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/BucketServiceImpl.java
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.Audit;
+import com.epam.datalab.backendapi.annotation.Info;
+import com.epam.datalab.backendapi.annotation.ResourceName;
+import com.epam.datalab.backendapi.annotation.User;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.service.BucketService;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.bucket.BucketDTO;
+import com.epam.datalab.dto.bucket.BucketDeleteDTO;
+import com.epam.datalab.dto.bucket.FolderUploadDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpStatus;
+import org.glassfish.jersey.media.multipart.FormDataMultiPart;
+import org.glassfish.jersey.media.multipart.file.StreamDataBodyPart;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.DELETE;
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.DOWNLOAD;
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.UPLOAD;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.BUCKET;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM;
+
+@Slf4j
+public class BucketServiceImpl implements BucketService {
+    private static final String BUCKET_GET_OBJECTS = "%sbucket/%s";
+    private static final String BUCKET_UPLOAD_OBJECT = "%sbucket/upload";
+    private static final String BUCKET_UPLOAD_FOLDER = "%sbucket/folder/upload";
+    private static final String BUCKET_DOWNLOAD_OBJECT = "%sbucket/%s/object/%s/download";
+    private static final String BUCKET_DELETE_OBJECT = "%sbucket/objects/delete";
+    private static final String SOMETHING_WENT_WRONG_MESSAGE = "Something went wrong. Response status is %s ";
+
+    private final EndpointService endpointService;
+    private final RESTService provisioningService;
+
+    @Inject
+    public BucketServiceImpl(EndpointService endpointService, @Named(ServiceConsts.BUCKET_SERVICE_NAME) RESTService provisioningService) {
+        this.endpointService = endpointService;
+        this.provisioningService = provisioningService;
+    }
+
+    @Override
+    public List<BucketDTO> getObjects(UserInfo userInfo, String bucket, String endpoint) {
+        try {
+            EndpointDTO endpointDTO = endpointService.get(endpoint);
+            return provisioningService.get(String.format(BUCKET_GET_OBJECTS, endpointDTO.getUrl(), bucket), userInfo.getAccessToken(), new GenericType<List<BucketDTO>>() {
+            });
+        } catch (Exception e) {
+            log.error("Cannot get objects from bucket {} for user {}, endpoint {}. Reason {}", bucket, userInfo.getName(), endpoint, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot get objects from bucket %s for user %s, endpoint %s. Reason %s", bucket, userInfo.getName(), endpoint, e.getMessage()));
+        }
+    }
+
+    @Audit(action = UPLOAD, type = BUCKET)
+    @Override
+    public void uploadObject(@User UserInfo userInfo, @ResourceName String bucket, String object, String endpoint, InputStream inputStream, String contentType, long fileSize, @Info String auditInfo) {
+        log.info("Uploading file {} for user {} to bucket {}", object, userInfo.getName(), bucket);
+        try {
+            EndpointDTO endpointDTO = endpointService.get(endpoint);
+            FormDataMultiPart formData = getFormDataMultiPart(bucket, object, inputStream, contentType, fileSize);
+            Response response = provisioningService.postForm(String.format(BUCKET_UPLOAD_OBJECT, endpointDTO.getUrl()), userInfo.getAccessToken(), formData, Response.class);
+            if (response.getStatus() != HttpStatus.SC_OK) {
+                throw new DatalabException(String.format(SOMETHING_WENT_WRONG_MESSAGE, response.getStatus()));
+            }
+        } catch (Exception e) {
+            log.error("Cannot upload object {} to bucket {} for user {}, endpoint {}. Reason {}", object, bucket, userInfo.getName(), endpoint, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot upload object %s to bucket %s for user %s, endpoint %s. Reason %s", object, bucket, userInfo.getName(), endpoint, e.getMessage()));
+        }
+        log.info("Finished uploading file {} for user {} to bucket {}", object, userInfo.getName(), bucket);
+    }
+
+    @Audit(action = UPLOAD, type = BUCKET)
+    @Override
+    public void uploadFolder(@User UserInfo userInfo, @ResourceName String bucket, String folder, String endpoint, @Info String auditInfo) {
+        log.info("Uploading folder {} for user {} to bucket {}", folder, userInfo.getName(), bucket);
+        try {
+            if (!folder.endsWith("/")) {
+                throw new DatalabException("Folder doesn't end with '/'");
+            }
+            EndpointDTO endpointDTO = endpointService.get(endpoint);
+            FolderUploadDTO dto = new FolderUploadDTO(bucket, folder);
+            Response response = provisioningService.post(String.format(BUCKET_UPLOAD_FOLDER, endpointDTO.getUrl()), userInfo.getAccessToken(), dto, Response.class);
+            if (response.getStatus() != HttpStatus.SC_OK) {
+                throw new DatalabException(String.format(SOMETHING_WENT_WRONG_MESSAGE, response.getStatus()));
+            }
+        } catch (Exception e) {
+            log.error("Cannot upload folder {} to bucket {} for user {}, endpoint {}. Reason {}", folder, bucket, userInfo.getName(), endpoint, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot upload object %s to bucket %s for user %s, endpoint %s. Reason %s", folder, bucket, userInfo.getName(), endpoint, e.getMessage()));
+        }
+        log.info("Finished uploading folder {} for user {} to bucket {}", folder, userInfo.getName(), bucket);
+    }
+
+    @Audit(action = DOWNLOAD, type = BUCKET)
+    @Override
+    public void downloadObject(@User UserInfo userInfo, @ResourceName String bucket, String object, String endpoint, HttpServletResponse resp, @Info String auditInfo) {
+        log.info("Downloading file {} for user {} from bucket {}", object, userInfo.getName(), bucket);
+        EndpointDTO endpointDTO = endpointService.get(endpoint);
+        try (InputStream inputStream = provisioningService.getWithMediaTypes(String.format(BUCKET_DOWNLOAD_OBJECT, endpointDTO.getUrl(), bucket, encodeObject(object)), userInfo.getAccessToken(),
+                InputStream.class, APPLICATION_JSON, APPLICATION_OCTET_STREAM); ServletOutputStream outputStream = resp.getOutputStream()) {
+            IOUtils.copyLarge(inputStream, outputStream);
+            log.info("Finished downloading file {} for user {} from bucket {}", object, userInfo.getName(), bucket);
+        } catch (Exception e) {
+            log.error("Cannot upload object {} from bucket {} for user {}, endpoint {}. Reason {}", object, bucket, userInfo.getName(), endpoint, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot download object %s from bucket %s for user %s, endpoint %s. Reason %s", object, bucket, userInfo.getName(), endpoint, e.getMessage()));
+        }
+    }
+
+    @Audit(action = DELETE, type = BUCKET)
+    @Override
+    public void deleteObjects(@User UserInfo userInfo, @ResourceName String bucket, List<String> objects, String endpoint, @Info String auditInfo) {
+        try {
+            EndpointDTO endpointDTO = endpointService.get(endpoint);
+            BucketDeleteDTO bucketDeleteDTO = new BucketDeleteDTO(bucket, objects);
+            Response response = provisioningService.post(String.format(BUCKET_DELETE_OBJECT, endpointDTO.getUrl()), userInfo.getAccessToken(), bucketDeleteDTO, Response.class);
+            if (response.getStatus() != HttpStatus.SC_OK) {
+                throw new DatalabException(String.format(SOMETHING_WENT_WRONG_MESSAGE, response.getStatus()));
+            }
+        } catch (Exception e) {
+            log.error("Cannot delete objects {} from bucket {} for user {}, endpoint {}. Reason {}", objects, bucket, userInfo.getName(), endpoint, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot delete objects %s from bucket %s for user %s, endpoint %s. Reason %s", objects, bucket, userInfo.getName(), endpoint, e.getMessage()));
+        }
+    }
+
+    private String encodeObject(String object) throws UnsupportedEncodingException {
+        return URLEncoder.encode(object, StandardCharsets.UTF_8.toString()).replace("+", "%20");
+    }
+
+    private FormDataMultiPart getFormDataMultiPart(String bucket, String object, InputStream inputStream, String contentType, long fileSize) {
+        StreamDataBodyPart filePart = new StreamDataBodyPart("file", inputStream, object, MediaType.valueOf(contentType));
+        FormDataMultiPart formData = new FormDataMultiPart();
+        formData.field("bucket", bucket);
+        formData.field("object", object);
+        formData.field("file-size", String.valueOf(fileSize));
+        formData.bodyPart(filePart);
+        return formData;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImpl.java
new file mode 100644
index 0000000..2595c21
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImpl.java
@@ -0,0 +1,383 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.*;
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.resources.dto.ComputationalCreateFormDTO;
+import com.epam.datalab.backendapi.resources.dto.ComputationalTemplatesDTO;
+import com.epam.datalab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
+import com.epam.datalab.backendapi.service.*;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.epam.datalab.dto.base.computational.FullComputationalTemplate;
+import com.epam.datalab.dto.computational.*;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ComputationalAPI;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import com.mongodb.client.result.UpdateResult;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.*;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.COMPUTE;
+import static com.epam.datalab.dto.UserInstanceStatus.*;
+import static com.epam.datalab.dto.base.DataEngineType.CLOUD_SERVICE;
+import static com.epam.datalab.dto.base.DataEngineType.SPARK_STANDALONE;
+import static com.epam.datalab.rest.contracts.ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC;
+
+@Singleton
+@Slf4j
+public class ComputationalServiceImpl implements ComputationalService {
+
+    private static final String COULD_NOT_UPDATE_THE_STATUS_MSG_FORMAT = "Could not update the status of " +
+            "computational resource {} for user {}";
+    private static final EnumMap<DataEngineType, String> DATA_ENGINE_TYPE_TERMINATE_URLS;
+    private static final String DATAENGINE_NOT_PRESENT_FORMAT = "There is no %s dataengine %s for exploratory %s";
+    private static final String RUNNING_COMP_RES_NOT_FOUND = "Running computational resource with " +
+            "name %s for exploratory %s not found";
+
+    static {
+        DATA_ENGINE_TYPE_TERMINATE_URLS = new EnumMap<>(DataEngineType.class);
+        DATA_ENGINE_TYPE_TERMINATE_URLS.put(SPARK_STANDALONE, ComputationalAPI.COMPUTATIONAL_TERMINATE_SPARK);
+        DATA_ENGINE_TYPE_TERMINATE_URLS.put(CLOUD_SERVICE, ComputationalAPI.COMPUTATIONAL_TERMINATE_CLOUD_SPECIFIC);
+    }
+
+    private final ProjectService projectService;
+    private final ExploratoryDAO exploratoryDAO;
+    private final ComputationalDAO computationalDAO;
+    private final RESTService provisioningService;
+    private final RequestBuilder requestBuilder;
+    private final RequestId requestId;
+    private final TagService tagService;
+    private final EndpointService endpointService;
+    private final InfrastructureTemplateService templateService;
+
+    @Inject
+    public ComputationalServiceImpl(ProjectService projectService, ExploratoryDAO exploratoryDAO, ComputationalDAO computationalDAO,
+                                    @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
+                                    RequestBuilder requestBuilder, RequestId requestId, TagService tagService,
+                                    EndpointService endpointService, InfrastructureTemplateService templateService) {
+        this.projectService = projectService;
+        this.exploratoryDAO = exploratoryDAO;
+        this.computationalDAO = computationalDAO;
+        this.provisioningService = provisioningService;
+        this.requestBuilder = requestBuilder;
+        this.requestId = requestId;
+        this.tagService = tagService;
+        this.endpointService = endpointService;
+        this.templateService = templateService;
+    }
+
+
+    @Override
+    public ComputationalTemplatesDTO getComputationalNamesAndTemplates(UserInfo user, String project, String endpoint) {
+        List<FullComputationalTemplate> computationalTemplates = templateService.getComputationalTemplates(user, project, endpoint);
+        List<UserInstanceDTO> userInstances = exploratoryDAO.fetchExploratoryFieldsForProjectWithComp(project);
+
+        List<String> projectComputations = userInstances
+                .stream()
+                .map(UserInstanceDTO::getResources)
+                .flatMap(Collection::stream)
+                .map(UserComputationalResource::getComputationalName)
+                .collect(Collectors.toList());
+        List<String> userComputations = userInstances
+                .stream()
+                .filter(instance -> instance.getUser().equalsIgnoreCase(user.getName()))
+                .map(UserInstanceDTO::getResources)
+                .flatMap(Collection::stream)
+                .map(UserComputationalResource::getComputationalName)
+                .collect(Collectors.toList());
+
+        return new ComputationalTemplatesDTO(computationalTemplates, userComputations, projectComputations);
+    }
+
+    @BudgetLimited
+    @Audit(action = CREATE, type = COMPUTE)
+    @Override
+    public boolean createSparkCluster(@User UserInfo userInfo, @ResourceName String resourceName, SparkStandaloneClusterCreateForm form, @Project String project,
+                                      @Info String auditInfo) {
+        final ProjectDTO projectDTO = projectService.get(project);
+        final UserInstanceDTO instance =
+                exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, form.getNotebookName());
+        final SparkStandaloneClusterResource compResource = createInitialComputationalResource(form);
+        compResource.setTags(tagService.getResourceTags(userInfo, instance.getEndpoint(), project,
+                form.getCustomTag(), false));
+        if (computationalDAO.addComputational(userInfo.getName(), form.getNotebookName(), project, compResource)) {
+            try {
+                EndpointDTO endpointDTO = endpointService.get(instance.getEndpoint());
+                ComputationalBase<?> dto = requestBuilder.newComputationalCreate(userInfo, projectDTO, instance, form, endpointDTO);
+
+                String uuid =
+                        provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_CREATE_SPARK,
+                                userInfo.getAccessToken(), dto, String.class);
+                requestId.put(userInfo.getName(), uuid);
+                return true;
+            } catch (RuntimeException e) {
+                try {
+                    updateComputationalStatus(userInfo.getName(), project, form.getNotebookName(), form.getName(), FAILED);
+                } catch (DatalabException d) {
+                    log.error(COULD_NOT_UPDATE_THE_STATUS_MSG_FORMAT, form.getName(), userInfo.getName(), d);
+                }
+                throw e;
+            }
+        } else {
+            log.debug("Computational with name {} is already existing for user {}", form.getName(),
+                    userInfo.getName());
+            return false;
+        }
+    }
+
+    @Audit(action = TERMINATE, type = COMPUTE)
+    @Override
+    public void terminateComputational(@User UserInfo userInfo, String resourceCreator, @Project String project, String exploratoryName, @ResourceName String computationalName,
+                                       @Info String auditInfo) {
+        try {
+            updateComputationalStatus(resourceCreator, project, exploratoryName, computationalName, TERMINATING);
+
+            final UserInstanceDTO userInstanceDTO = exploratoryDAO.fetchExploratoryFields(resourceCreator, project, exploratoryName);
+            UserComputationalResource compResource = computationalDAO.fetchComputationalFields(resourceCreator, project, exploratoryName, computationalName);
+
+            final DataEngineType dataEngineType = compResource.getDataEngineType();
+            EndpointDTO endpointDTO = endpointService.get(userInstanceDTO.getEndpoint());
+            ComputationalTerminateDTO dto = requestBuilder.newComputationalTerminate(resourceCreator, userInstanceDTO, compResource, endpointDTO);
+
+            final String provisioningUrl = Optional.ofNullable(DATA_ENGINE_TYPE_TERMINATE_URLS.get(dataEngineType))
+                    .orElseThrow(UnsupportedOperationException::new);
+            final String uuid = provisioningService.post(endpointDTO.getUrl() + provisioningUrl, userInfo.getAccessToken(), dto, String.class);
+            requestId.put(resourceCreator, uuid);
+        } catch (RuntimeException re) {
+            try {
+                updateComputationalStatus(resourceCreator, project, exploratoryName, computationalName, FAILED);
+            } catch (DatalabException e) {
+                log.error(COULD_NOT_UPDATE_THE_STATUS_MSG_FORMAT, computationalName, resourceCreator, e);
+            }
+            throw re;
+        }
+    }
+
+    @BudgetLimited
+    @Audit(action = CREATE, type = COMPUTE)
+    @Override
+    public boolean createDataEngineService(@User UserInfo userInfo, @ResourceName String resourceName, ComputationalCreateFormDTO formDTO,
+                                           UserComputationalResource computationalResource, @Project String project, @Info String auditInfo) {
+        final ProjectDTO projectDTO = projectService.get(project);
+        final UserInstanceDTO instance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, formDTO
+                .getNotebookName());
+        final Map<String, String> tags = tagService.getResourceTags(userInfo, instance.getEndpoint(), project,
+                formDTO.getCustomTag(), formDTO.isGpuTag());
+        computationalResource.setTags(tags);
+        boolean isAdded = computationalDAO.addComputational(userInfo.getName(), formDTO.getNotebookName(), project,
+                computationalResource);
+
+        if (isAdded) {
+            try {
+                EndpointDTO endpointDTO = endpointService.get(instance.getEndpoint());
+                String uuid =
+                        provisioningService.post(endpointDTO.getUrl() + COMPUTATIONAL_CREATE_CLOUD_SPECIFIC,
+                                userInfo.getAccessToken(),
+                                requestBuilder.newComputationalCreate(userInfo, projectDTO, instance, formDTO, endpointDTO),
+                                String.class);
+                requestId.put(userInfo.getName(), uuid);
+                return true;
+            } catch (Exception t) {
+                try {
+                    updateComputationalStatus(userInfo.getName(), project, formDTO.getNotebookName(),
+                            formDTO.getName(), FAILED);
+                } catch (DatalabException e) {
+                    log.error(COULD_NOT_UPDATE_THE_STATUS_MSG_FORMAT, formDTO.getName(), userInfo.getName(), e);
+                }
+                throw new DatalabException("Could not send request for creation the computational resource " + formDTO
+                        .getName() + ": " + t.getLocalizedMessage(), t);
+            }
+        } else {
+            log.debug("Used existing computational resource {} for user {}", formDTO.getName(), userInfo.getName());
+            return false;
+        }
+    }
+
+    @Audit(action = STOP, type = COMPUTE)
+    @Override
+    public void stopSparkCluster(@User UserInfo userInfo, String resourceCreator, @Project String project, String expName, @ResourceName String compName, @Info String auditInfo) {
+        final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(resourceCreator, project, expName, true);
+        final UserInstanceStatus requiredStatus = UserInstanceStatus.RUNNING;
+        if (computationalWithStatusResourceExist(compName, userInstance, requiredStatus)) {
+            log.debug("{} spark cluster {} for userInstance {}", STOPPING.toString(), compName, expName);
+            updateComputationalStatus(resourceCreator, project, expName, compName, STOPPING);
+            EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
+            final String uuid = provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_STOP_SPARK,
+                    userInfo.getAccessToken(),
+                    requestBuilder.newComputationalStop(resourceCreator, userInstance, compName, endpointDTO),
+                    String.class);
+            requestId.put(resourceCreator, uuid);
+        } else {
+            throw new IllegalStateException(String.format(DATAENGINE_NOT_PRESENT_FORMAT, requiredStatus.toString(), compName, expName));
+        }
+    }
+
+    @BudgetLimited
+    @Audit(action = START, type = COMPUTE)
+    @Override
+    public void startSparkCluster(@User UserInfo userInfo, String expName, @ResourceName String compName, @Project String project, @Info String auditInfo) {
+        final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, expName, true);
+        final UserInstanceStatus requiredStatus = UserInstanceStatus.STOPPED;
+        if (computationalWithStatusResourceExist(compName, userInstance, requiredStatus)) {
+            log.debug("{} spark cluster {} for userInstance {}", STARTING.toString(), compName, expName);
+            updateComputationalStatus(userInfo.getName(), project, expName, compName, STARTING);
+            EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
+            final String uuid = provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_START_SPARK,
+                    userInfo.getAccessToken(),
+                    requestBuilder.newComputationalStart(userInfo, userInstance, compName, endpointDTO),
+                    String.class);
+            requestId.put(userInfo.getName(), uuid);
+        } else {
+            throw new IllegalStateException(String.format(DATAENGINE_NOT_PRESENT_FORMAT, requiredStatus.toString(), compName, expName));
+        }
+    }
+
+    @Audit(action = RECONFIGURE, type = COMPUTE)
+    @Override
+    public void updateSparkClusterConfig(@User UserInfo userInfo, @Project String project, String exploratoryName, @ResourceName String computationalName, List<ClusterConfig> config, @Info String auditInfo) {
+        final String userName = userInfo.getName();
+        final String token = userInfo.getAccessToken();
+        final UserInstanceDTO userInstanceDTO = exploratoryDAO
+                .fetchExploratoryFields(userName, project, exploratoryName, true);
+        final UserComputationalResource compResource = userInstanceDTO
+                .getResources()
+                .stream()
+                .filter(cr -> cr.getComputationalName().equals(computationalName) && cr.getStatus().equals(UserInstanceStatus.RUNNING.toString()))
+                .findAny()
+                .orElseThrow(() -> new ResourceNotFoundException(String.format(RUNNING_COMP_RES_NOT_FOUND,
+                        computationalName, exploratoryName)));
+        EndpointDTO endpointDTO = endpointService.get(userInstanceDTO.getEndpoint());
+        final ComputationalClusterConfigDTO clusterConfigDto = requestBuilder.newClusterConfigUpdate(userInfo,
+                userInstanceDTO, compResource, config, endpointDTO);
+        final String uuid =
+                provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_RECONFIGURE_SPARK,
+                        token, clusterConfigDto, String.class);
+        computationalDAO.updateComputationalFields(new ComputationalStatusDTO()
+                .withProject(userInstanceDTO.getProject())
+                .withComputationalName(computationalName)
+                .withExploratoryName(exploratoryName)
+                .withConfig(config)
+                .withStatus(RECONFIGURING.toString())
+                .withUser(userName));
+        requestId.put(userName, uuid);
+    }
+
+    /**
+     * Returns computational resource's data by name for user's exploratory.
+     *
+     * @param user              user
+     * @param project           name of project
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @return corresponding computational resource's data or empty data if resource doesn't exist.
+     */
+    @Override
+    public Optional<UserComputationalResource> getComputationalResource(String user, String project, String exploratoryName, String computationalName) {
+        try {
+            return Optional.of(computationalDAO.fetchComputationalFields(user, project, exploratoryName, computationalName));
+        } catch (DatalabException e) {
+            log.warn("Computational resource {} affiliated with exploratory {} for user {} not found.", computationalName, exploratoryName, user, e);
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public List<ClusterConfig> getClusterConfig(UserInfo userInfo, String project, String exploratoryName, String computationalName) {
+        return computationalDAO.getClusterConfig(userInfo.getName(), project, exploratoryName, computationalName);
+    }
+
+    @Audit(action = UPDATE, type = COMPUTE)
+    @Override
+    public void updateAfterStatusCheck(@User UserInfo systemUser, @Project String project, String endpoint, @ResourceName String name, String instanceID,
+                                       UserInstanceStatus status, @Info String auditInfo) {
+        computationalDAO.updateComputeStatus(project, endpoint, name, instanceID, status);
+    }
+
+    /**
+     * Updates the status of computational resource in database.
+     *
+     * @param user              user name.
+     * @param project           project name
+     * @param exploratoryName   name of exploratory.
+     * @param computationalName name of computational resource.
+     * @param status            status
+     */
+    private void updateComputationalStatus(String user, String project, String exploratoryName, String computationalName, UserInstanceStatus status) {
+        ComputationalStatusDTO computationalStatus = new ComputationalStatusDTO()
+                .withUser(user)
+                .withProject(project)
+                .withExploratoryName(exploratoryName)
+                .withComputationalName(computationalName)
+                .withStatus(status);
+
+        UpdateResult updateResult = computationalDAO.updateComputationalStatus(computationalStatus);
+    }
+
+    private SparkStandaloneClusterResource createInitialComputationalResource(SparkStandaloneClusterCreateForm form) {
+        return SparkStandaloneClusterResource.builder()
+                .computationalName(form.getName())
+                .imageName(form.getImage())
+                .templateName(form.getTemplateName())
+                .status(CREATING.toString())
+                .dataEngineInstanceCount(form.getDataEngineInstanceCount())
+                .masterDataEngineInstanceShape(form.getMasterDataEngineInstanceShape())
+                .slaveDataEngineInstanceShape(form.getSlaveDtaEngineInstanceShape())
+                .enabledGPU(form.getEnabledGPU())
+                .masterGpuCount(form.getMasterGpuCount())
+                .masterGpuType(form.getMasterGpuType())
+                .slaveGpuCount(form.getSlaveGpuCount())
+                .slaveGpuType(form.getSlaveGpuType())
+                .config(form.getConfig())
+                .totalInstanceCount(Integer.parseInt(form.getDataEngineInstanceCount()))
+                .build();
+    }
+
+    private boolean computationalWithStatusResourceExist(String compName, UserInstanceDTO ui, UserInstanceStatus status) {
+        return ui.getResources()
+                .stream()
+                .anyMatch(c -> computationalWithNameAndStatus(compName, c, status));
+    }
+
+    private boolean computationalWithNameAndStatus(String computationalName, UserComputationalResource compResource, UserInstanceStatus status) {
+        return compResource.getStatus().equals(status.toString()) &&
+                compResource.getDataEngineType() == SPARK_STANDALONE &&
+                compResource.getComputationalName().equals(computationalName);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImpl.java
new file mode 100644
index 0000000..77ce551
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImpl.java
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.Audit;
+import com.epam.datalab.backendapi.annotation.ResourceName;
+import com.epam.datalab.backendapi.annotation.User;
+import com.epam.datalab.backendapi.dao.EndpointDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.UserRoleDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.EndpointResourcesDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.OdahuService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceConflictException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.ws.rs.core.Response;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.CONNECT;
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.DISCONNECT;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.ENDPOINT;
+import static com.epam.datalab.dto.UserInstanceStatus.TERMINATED;
+
+
+@Slf4j
+public class EndpointServiceImpl implements EndpointService {
+    private static final String HEALTH_CHECK = "healthcheck";
+    private final EndpointDAO endpointDAO;
+    private final ProjectService projectService;
+    private final ExploratoryDAO exploratoryDAO;
+    private final RESTService provisioningService;
+    private final UserRoleDAO userRoleDao;
+    private final OdahuService odahuService;
+
+    @Inject
+    public EndpointServiceImpl(EndpointDAO endpointDAO, ProjectService projectService, ExploratoryDAO exploratoryDAO,
+                               @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
+                               UserRoleDAO userRoleDao, OdahuService odahuService) {
+
+        this.endpointDAO = endpointDAO;
+        this.projectService = projectService;
+        this.exploratoryDAO = exploratoryDAO;
+        this.provisioningService = provisioningService;
+        this.userRoleDao = userRoleDao;
+        this.odahuService = odahuService;
+    }
+
+    @Override
+    public List<EndpointDTO> getEndpoints() {
+        return endpointDAO.getEndpoints();
+    }
+
+    @Override
+    public List<EndpointDTO> getEndpointsWithStatus(EndpointDTO.EndpointStatus status) {
+        return endpointDAO.getEndpointsWithStatus(status.name());
+    }
+
+    @Override
+    public EndpointResourcesDTO getEndpointResources(String endpoint) {
+        List<UserInstanceDTO> exploratories = exploratoryDAO.fetchExploratoriesByEndpointWhereStatusNotIn(endpoint,
+                Arrays.asList(TERMINATED, UserInstanceStatus.FAILED), Boolean.FALSE);
+
+        List<ProjectDTO> projects = projectService.getProjectsByEndpoint(endpoint);
+
+        return new EndpointResourcesDTO(exploratories, projects);
+    }
+
+    @Override
+    public EndpointDTO get(String name) {
+        return endpointDAO.get(name)
+                .orElseThrow(() -> new ResourceNotFoundException("Endpoint with name " + name + " not found"));
+    }
+
+    /**
+     * Create new endpoint object in the System.
+     * The Endpoint objects should contain Unique values of the 'url' and 'name' fields,
+     * i.e two objects with same URLs should not be created in the system.
+     *
+     * @param userInfo     user properties
+     * @param resourceName name of the endpoint
+     * @param endpointDTO  object with endpoint fields
+     */
+    @Audit(action = CONNECT, type = ENDPOINT)
+    @Override
+    public void create(@User UserInfo userInfo, @ResourceName String resourceName, EndpointDTO endpointDTO) {
+        if (endpointDAO.get(endpointDTO.getName()).isPresent()) {
+            throw new ResourceConflictException("The Endpoint with this name exists in system");
+        }
+        if (endpointDAO.getEndpointWithUrl(endpointDTO.getUrl()).isPresent()) {
+            throw new ResourceConflictException("The Endpoint URL with this address exists in system");
+        }
+        CloudProvider cloudProvider = checkUrl(userInfo, endpointDTO.getUrl());
+        if (Objects.isNull(cloudProvider)) {
+            throw new DatalabException("CloudProvider cannot be null");
+        }
+        endpointDAO.create(new EndpointDTO(endpointDTO.getName(), endpointDTO.getUrl(), endpointDTO.getAccount(),
+                endpointDTO.getTag(), EndpointDTO.EndpointStatus.ACTIVE, cloudProvider));
+        userRoleDao.updateMissingRoles(cloudProvider);
+    }
+
+    @Override
+    public void updateEndpointStatus(String name, EndpointDTO.EndpointStatus status) {
+        endpointDAO.updateEndpointStatus(name, status.name());
+    }
+
+    @Override
+    public void remove(UserInfo userInfo, String name) {
+        EndpointDTO endpointDTO = endpointDAO.get(name).orElseThrow(() -> new ResourceNotFoundException(String.format("Endpoint %s does not exist", name)));
+        List<ProjectDTO> projects = projectService.getProjectsByEndpoint(name);
+        checkProjectEndpointResourcesStatuses(projects, name);
+        CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+        removeEndpoint(userInfo, name, cloudProvider, projects);
+    }
+
+    @Audit(action = DISCONNECT, type = ENDPOINT)
+    public void removeEndpoint(@User UserInfo userInfo, @ResourceName String name, CloudProvider cloudProvider,
+                               List<ProjectDTO> projects) {
+        removeEndpointInAllProjects(userInfo, name, projects);
+        endpointDAO.remove(name);
+        List<CloudProvider> remainingProviders = endpointDAO.getEndpoints()
+                .stream()
+                .map(EndpointDTO::getCloudProvider)
+                .collect(Collectors.toList());
+        userRoleDao.removeUnnecessaryRoles(cloudProvider, remainingProviders);
+    }
+
+    @Override
+    public void removeEndpointInAllProjects(UserInfo userInfo, String endpointName, List<ProjectDTO> projects) {
+        projects.stream()
+                .filter(p -> p.getEndpoints().stream()
+                        .noneMatch(e -> e.getName().equals(endpointName) && e.getStatus() == TERMINATED))
+                .forEach(project -> projectService.terminateEndpoint(userInfo, endpointName, project.getName()));
+    }
+
+    @Override
+    public CloudProvider checkUrl(UserInfo userInfo, String url) {
+        Response response;
+        CloudProvider cloudProvider;
+        try {
+            response = provisioningService.get(url + HEALTH_CHECK, userInfo.getAccessToken(), Response.class);
+            cloudProvider = response.readEntity(CloudProvider.class);
+        } catch (Exception e) {
+            log.error("Cannot connect to url '{}'. {}", url, e.getMessage(), e);
+            throw new DatalabException(String.format("Cannot connect to url '%s'.", url));
+        }
+        if (response.getStatus() != 200) {
+            log.warn("Endpoint url {} is not valid", url);
+            throw new ResourceNotFoundException(String.format("Endpoint url '%s' is not valid", url));
+        }
+        return cloudProvider;
+    }
+
+    private void checkProjectEndpointResourcesStatuses(List<ProjectDTO> projects, String endpoint) {
+        boolean isTerminationEnabled = projects
+                .stream()
+                .anyMatch(p ->
+                        odahuService.inProgress(p.getName(), endpoint) ||
+                                !projectService.checkExploratoriesAndComputationalProgress(p.getName(), Collections.singletonList(endpoint)) ||
+                                p.getEndpoints()
+                                        .stream()
+                                        .anyMatch(e -> e.getName().equals(endpoint) &&
+                                                Arrays.asList(UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.STOPPING,
+                                                        UserInstanceStatus.TERMINATING).contains(e.getStatus())));
+
+        if (isTerminationEnabled) {
+            throw new ResourceConflictException(("Can not terminate resources of endpoint because one of project " +
+                    "resource is in processing stage"));
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImpl.java
new file mode 100644
index 0000000..2f23861
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImpl.java
@@ -0,0 +1,280 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.Project;
+import com.epam.datalab.backendapi.annotation.ProjectAdmin;
+import com.epam.datalab.backendapi.annotation.User;
+import com.epam.datalab.backendapi.dao.EnvDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.UserSettingsDAO;
+import com.epam.datalab.backendapi.domain.OdahuDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.resources.dto.UserDTO;
+import com.epam.datalab.backendapi.resources.dto.UserResourceInfo;
+import com.epam.datalab.backendapi.service.*;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.status.EnvResource;
+import com.epam.datalab.dto.status.EnvResourceList;
+import com.epam.datalab.exceptions.ResourceConflictException;
+import com.epam.datalab.model.ResourceEnum;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.epam.datalab.backendapi.resources.dto.UserDTO.Status.ACTIVE;
+import static com.epam.datalab.backendapi.resources.dto.UserDTO.Status.NOT_ACTIVE;
+import static com.epam.datalab.dto.UserInstanceStatus.*;
+import static com.epam.datalab.rest.contracts.ComputationalAPI.AUDIT_MESSAGE;
+
+@Singleton
+@Slf4j
+public class EnvironmentServiceImpl implements EnvironmentService {
+    private static final String ERROR_MSG_FORMAT = "Can not %s environment because on of user resource is in status CREATING or STARTING";
+    private static final String AUDIT_QUOTA_MESSAGE = "Billing quota reached";
+    private static final String AUDIT_UPDATE_STATUS = "Sync up with console status";
+    private static final String DATALAB_SYSTEM_USER = "DataLab system user";
+
+    private final EnvDAO envDAO;
+    private final UserSettingsDAO settingsDAO;
+    private final ExploratoryDAO exploratoryDAO;
+    private final ExploratoryService exploratoryService;
+    private final ComputationalService computationalService;
+    private final SecurityService securityService;
+    private final ProjectService projectService;
+
+    @Inject
+    public EnvironmentServiceImpl(EnvDAO envDAO, UserSettingsDAO settingsDAO, ExploratoryDAO exploratoryDAO,
+                                  ExploratoryService exploratoryService, ComputationalService computationalService,
+                                  SecurityService securityService, ProjectService projectService) {
+        this.envDAO = envDAO;
+        this.settingsDAO = settingsDAO;
+        this.exploratoryDAO = exploratoryDAO;
+        this.exploratoryService = exploratoryService;
+        this.computationalService = computationalService;
+        this.securityService = securityService;
+        this.projectService = projectService;
+    }
+
+    @Override
+    public List<UserDTO> getUsers() {
+        final Set<String> activeUsers = envDAO.fetchActiveEnvUsers();
+        log.trace("Active users: {}", activeUsers);
+        final Set<String> notActiveUsers = envDAO.fetchUsersNotIn(activeUsers);
+        log.trace("Not active users: {}", notActiveUsers);
+        final Stream<UserDTO> activeUsersStream = activeUsers
+                .stream()
+                .map(u -> toUserDTO(u, ACTIVE));
+        final Stream<UserDTO> notActiveUsersStream = notActiveUsers
+                .stream()
+                .map(u -> toUserDTO(u, NOT_ACTIVE));
+        return Stream.concat(activeUsersStream, notActiveUsersStream)
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<UserResourceInfo> getAllEnv(UserInfo user) {
+        log.debug("Getting all user's environment...");
+        List<UserInstanceDTO> expList = exploratoryDAO.getInstances();
+        return projectService.getProjects(user)
+                .stream()
+                .map(projectDTO -> getProjectEnv(projectDTO, expList))
+                .flatMap(Collection::stream)
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public void stopAll() {
+        log.debug("Stopping environment for all users...");
+        projectService.getProjects()
+                .stream()
+                .map(ProjectDTO::getName)
+                .forEach(this::stopProjectEnvironment);
+    }
+
+    @Override
+    public void stopEnvironmentWithServiceAccount(String user) {
+        log.debug("Stopping environment for user {} by scheduler", user);
+        checkState(user, "stop");
+        exploratoryDAO.fetchRunningExploratoryFields(user)
+                .forEach(this::stopNotebookWithServiceAccount);
+    }
+
+    @Override
+    public void stopProjectEnvironment(String project) {
+        log.debug("Stopping environment for project {}", project);
+        checkProjectResourceConditions(project);
+        exploratoryDAO.fetchRunningExploratoryFieldsForProject(project)
+                .forEach(this::stopNotebookWithServiceAccount);
+
+        projectService.get(project).getEndpoints()
+                .stream()
+                .filter(e -> RUNNING == e.getStatus())
+                .forEach(endpoint -> projectService.stop(securityService.getServiceAccountInfo(DATALAB_SYSTEM_USER),
+                        endpoint.getName(), project, AUDIT_QUOTA_MESSAGE));
+    }
+
+    @ProjectAdmin
+    @Override
+    public void stopExploratory(@User UserInfo userInfo, String user, @Project String project, String exploratoryName) {
+        exploratoryService.stop(userInfo, user, project, exploratoryName, null);
+    }
+
+    @ProjectAdmin
+    @Override
+    public void stopComputational(@User UserInfo userInfo, String user, @Project String project, String exploratoryName, String computationalName) {
+        computationalService.stopSparkCluster(userInfo, user, project, exploratoryName, computationalName,
+                String.format(AUDIT_MESSAGE, exploratoryName));
+    }
+
+    @ProjectAdmin
+    @Override
+    public void terminateExploratory(@User UserInfo userInfo, String user, @Project String project, String exploratoryName) {
+        exploratoryService.terminate(userInfo, user, project, exploratoryName, null);
+    }
+
+    @ProjectAdmin
+    @Override
+    public void terminateComputational(@User UserInfo userInfo, String user, @Project String project, String exploratoryName, String computationalName) {
+        computationalService.terminateComputational(userInfo, user, project, exploratoryName, computationalName, String.format(AUDIT_MESSAGE, exploratoryName));
+    }
+
+    @Override
+    public void updateEnvironmentStatuses(EnvResourceList resourceList) {
+        resourceList.getHostList().forEach(this::updateHostStatuses);
+        resourceList.getClusterList().forEach(this::updateHostStatuses);
+    }
+
+    private void updateHostStatuses(EnvResource envResource) {
+        final UserInstanceStatus status = UserInstanceStatus.of(envResource.getStatus());
+        if (Objects.nonNull(status)) {
+            UserInfo systemUser = new UserInfo(DATALAB_SYSTEM_USER, null);
+            final String endpoint = envResource.getEndpoint();
+            final String instanceID = envResource.getId();
+            final String name = envResource.getName();
+            final String project = envResource.getProject();
+
+            switch (envResource.getResourceType()) {
+                case EDGE:
+                    projectService.updateAfterStatusCheck(systemUser, project, endpoint, instanceID, status, AUDIT_UPDATE_STATUS);
+                    break;
+                case EXPLORATORY:
+                    exploratoryService.updateAfterStatusCheck(systemUser, project, endpoint, name, instanceID, status, AUDIT_UPDATE_STATUS);
+                    break;
+                case COMPUTATIONAL:
+                    computationalService.updateAfterStatusCheck(systemUser, project, endpoint, name, instanceID, status, AUDIT_UPDATE_STATUS);
+                    break;
+                default:
+                    log.warn("Resource {} has unknown resource type {}", envResource, envResource.getResourceType());
+            }
+        } else {
+            log.warn("Resource {} has unknown status {}", envResource, envResource.getStatus());
+        }
+    }
+
+    private UserDTO toUserDTO(String u, UserDTO.Status status) {
+        return new UserDTO(u, settingsDAO.getAllowedBudget(u).orElse(null), status);
+    }
+
+    private void checkState(String user, String action) {
+        final List<UserInstanceDTO> userInstances = exploratoryDAO.fetchUserExploratoriesWhereStatusIn(user, Arrays.asList(CREATING, STARTING, CREATING_IMAGE),
+                CREATING, STARTING, CREATING_IMAGE);
+        if (!userInstances.isEmpty()) {
+            log.error(String.format(ERROR_MSG_FORMAT, action));
+            throw new ResourceConflictException(String.format(ERROR_MSG_FORMAT, action));
+        }
+    }
+
+    private void stopNotebookWithServiceAccount(UserInstanceDTO instance) {
+        final UserInfo userInfo = securityService.getServiceAccountInfo(DATALAB_SYSTEM_USER);
+        exploratoryService.stop(userInfo, instance.getUser(), instance.getProject(), instance.getExploratoryName(), AUDIT_QUOTA_MESSAGE);
+    }
+
+    private List<UserResourceInfo> getProjectEnv(ProjectDTO projectDTO, List<UserInstanceDTO> allInstances) {
+        final Stream<UserResourceInfo> userResources = allInstances
+                .stream()
+                .filter(instance -> instance.getProject().equals(projectDTO.getName()))
+                .map(this::toUserResourceInfo);
+
+        Stream<UserResourceInfo> odahuResources = projectDTO.getOdahu()
+                .stream()
+                .map(this::toUserResourceInfo);
+
+        if (projectDTO.getEndpoints() != null) {
+            final Stream<UserResourceInfo> edges = projectDTO.getEndpoints()
+                    .stream()
+                    .map(e -> UserResourceInfo.builder()
+                            .resourceType(ResourceEnum.EDGE_NODE)
+                            .resourceStatus(e.getStatus().toString())
+                            .project(projectDTO.getName())
+                            .endpoint(e.getName())
+                            .ip(e.getEdgeInfo() != null ? e.getEdgeInfo().getPublicIp() : null)
+                            .build());
+            return Stream.concat(edges, Stream.concat(odahuResources, userResources))
+                    .collect(Collectors.toList());
+        } else {
+            return userResources.collect(Collectors.toList());
+        }
+    }
+
+    private UserResourceInfo toUserResourceInfo(UserInstanceDTO userInstance) {
+        return UserResourceInfo.builder()
+                .resourceType(ResourceEnum.NOTEBOOK)
+                .resourceName(userInstance.getExploratoryName())
+                .resourceShape(userInstance.getShape())
+                .resourceStatus(userInstance.getStatus())
+                .computationalResources(userInstance.getResources())
+                .user(userInstance.getUser())
+                .project(userInstance.getProject())
+                .endpoint(userInstance.getEndpoint())
+                .cloudProvider(userInstance.getCloudProvider())
+                .exploratoryUrls(userInstance.getResourceUrl())
+                .gpuCount(userInstance.getGpuCount())
+                .gpuEnabled(userInstance.isEnabledGPU())
+                .gpuType(userInstance.getGpuType())
+                .tags(userInstance.getTags())
+                .build();
+    }
+
+    private UserResourceInfo toUserResourceInfo(OdahuDTO odahuDTO) {
+        return UserResourceInfo.builder()
+                .resourceType(ResourceEnum.ODAHU)
+                .resourceName(odahuDTO.getName())
+                .resourceStatus(odahuDTO.getStatus().toString())
+                .project(odahuDTO.getProject())
+                .build();
+    }
+
+    private void checkProjectResourceConditions(String project) {
+        final List<UserInstanceDTO> userInstances = exploratoryDAO.fetchProjectExploratoriesWhereStatusIn(project,
+                Arrays.asList(CREATING, STARTING, CREATING_IMAGE), CREATING, STARTING, CREATING_IMAGE);
+
+        if (!userInstances.isEmpty()) {
+            log.error(String.format(ERROR_MSG_FORMAT, "stop"));
+            throw new ResourceConflictException(String.format(ERROR_MSG_FORMAT, "stop"));
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImpl.java
new file mode 100644
index 0000000..f5e148d
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImpl.java
@@ -0,0 +1,452 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.*;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.GitCredsDAO;
+import com.epam.datalab.backendapi.dao.ImageExploratoryDAO;
+import com.epam.datalab.backendapi.domain.*;
+import com.epam.datalab.backendapi.resources.dto.ExploratoryCreatePopUp;
+import com.epam.datalab.backendapi.service.*;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.StatusEnvBaseDTO;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.exploratory.*;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.model.exploratory.Exploratory;
+import com.epam.datalab.model.library.Library;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.*;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.NOTEBOOK;
+import static com.epam.datalab.dto.UserInstanceStatus.*;
+import static com.epam.datalab.rest.contracts.ExploratoryAPI.*;
+
+@Slf4j
+@Singleton
+public class ExploratoryServiceImpl implements ExploratoryService {
+    private final ProjectService projectService;
+    private final ExploratoryDAO exploratoryDAO;
+    private final ComputationalDAO computationalDAO;
+    private final GitCredsDAO gitCredsDAO;
+    private final ImageExploratoryDAO imageExploratoryDao;
+    private final RESTService provisioningService;
+    private final RequestBuilder requestBuilder;
+    private final RequestId requestId;
+    private final TagService tagService;
+    private final EndpointService endpointService;
+    private final AuditService auditService;
+    private final SelfServiceApplicationConfiguration configuration;
+
+    @Inject
+    public ExploratoryServiceImpl(ProjectService projectService, ExploratoryDAO exploratoryDAO, ComputationalDAO computationalDAO, GitCredsDAO gitCredsDAO,
+                                  ImageExploratoryDAO imageExploratoryDao, @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
+                                  RequestBuilder requestBuilder, RequestId requestId, TagService tagService, EndpointService endpointService, AuditService auditService,
+                                  SelfServiceApplicationConfiguration configuration) {
+        this.projectService = projectService;
+        this.exploratoryDAO = exploratoryDAO;
+        this.computationalDAO = computationalDAO;
+        this.gitCredsDAO = gitCredsDAO;
+        this.imageExploratoryDao = imageExploratoryDao;
+        this.provisioningService = provisioningService;
+        this.requestBuilder = requestBuilder;
+        this.requestId = requestId;
+        this.tagService = tagService;
+        this.endpointService = endpointService;
+        this.auditService = auditService;
+        this.configuration = configuration;
+    }
+
+    @BudgetLimited
+    @Audit(action = START, type = NOTEBOOK)
+    @Override
+    public String start(@User UserInfo userInfo, @ResourceName String exploratoryName, @Project String project, @Info String auditInfo) {
+        return action(userInfo, userInfo.getName(), project, exploratoryName, EXPLORATORY_START, STARTING);
+    }
+
+    @Audit(action = STOP, type = NOTEBOOK)
+    @Override
+    public String stop(@User UserInfo userInfo, String resourceCreator, @Project String project, @ResourceName String exploratoryName, @Info String auditInfo) {
+        return action(userInfo, resourceCreator, project, exploratoryName, EXPLORATORY_STOP, STOPPING);
+    }
+
+    @Audit(action = TERMINATE, type = NOTEBOOK)
+    @Override
+    public String terminate(@User UserInfo userInfo, String resourceCreator, @Project String project, @ResourceName String exploratoryName, @Info String auditInfo) {
+        return action(userInfo, resourceCreator, project, exploratoryName, EXPLORATORY_TERMINATE, TERMINATING);
+    }
+
+    @BudgetLimited
+    @Audit(action = CREATE, type = NOTEBOOK)
+    @Override
+    public String create(@User UserInfo userInfo, Exploratory exploratory, @Project String project, @ResourceName String exploratoryName) {
+        boolean isAdded = false;
+        try {
+            final ProjectDTO projectDTO = projectService.get(project);
+            final EndpointDTO endpointDTO = endpointService.get(exploratory.getEndpoint());
+            changeImageNameForDeepLearningOnAWSandAzure(exploratory, endpointDTO);
+            final UserInstanceDTO userInstanceDTO = getUserInstanceDTO(userInfo, exploratory, project, endpointDTO.getCloudProvider());
+            exploratoryDAO.insertExploratory(userInstanceDTO);
+            isAdded = true;
+            final ExploratoryGitCredsDTO gitCreds = gitCredsDAO.findGitCreds(userInfo.getName());
+            log.debug("Created exploratory environment {} for user {}", exploratory.getName(), userInfo.getName());
+            final String uuid =
+                    provisioningService.post(endpointDTO.getUrl() + EXPLORATORY_CREATE,
+                            userInfo.getAccessToken(),
+                            requestBuilder.newExploratoryCreate(projectDTO, endpointDTO, exploratory, userInfo,
+                                    gitCreds, userInstanceDTO.getTags()),
+                            String.class);
+            requestId.put(userInfo.getName(), uuid);
+            return uuid;
+        } catch (Exception t) {
+            log.error("Could not update the status of exploratory environment {} with name {} for user {}",
+                    exploratory.getDockerImage(), exploratory.getName(), userInfo.getName(), t);
+            if (isAdded) {
+                updateExploratoryStatusSilent(userInfo.getName(), project, exploratory.getName(), FAILED);
+            }
+            throw new DatalabException("Could not create exploratory environment " + exploratory.getName() + " for user "
+                    + userInfo.getName() + ": " + Optional.ofNullable(t.getCause()).map(Throwable::getMessage).orElse(t.getMessage()), t);
+        }
+    }
+
+    private void changeImageNameForDeepLearningOnAWSandAzure(Exploratory exploratory, EndpointDTO endpointDTO) {
+        if (isDeepLearningOnAwsOrAzure(exploratory, endpointDTO)) {
+            if (exploratory.getImageName() == null || exploratory.getImageName().isEmpty())
+                exploratory.setImageName(exploratory.getVersion());
+        }
+    }
+
+    private boolean isDeepLearningOnAwsOrAzure(Exploratory exploratory, EndpointDTO endpointDTO) {
+        return exploratory.getVersion().equals("Deep Learning AMI (Ubuntu 18.04) Version 42.1") ||
+                exploratory.getVersion().equals("microsoft-dsvm:ubuntu-1804:1804-gen2");
+    }
+
+    @Override
+    public void updateProjectExploratoryStatuses(UserInfo userInfo, String project, String endpoint, UserInstanceStatus status) {
+        exploratoryDAO.fetchProjectExploratoriesWhereStatusNotIn(project, endpoint, TERMINATED, FAILED)
+                .forEach(ui -> updateExploratoryComputeStatuses(userInfo, project, ui.getExploratoryName(), status, ui.getUser()));
+    }
+
+    @Override
+    public void updateProjectExploratoryStatuses(String project, String endpoint, UserInstanceStatus status) {
+        exploratoryDAO.fetchProjectExploratoriesWhereStatusNotIn(project, endpoint, TERMINATED, FAILED)
+                .forEach(ui -> {
+                    updateExploratoryStatus(ui.getUser(), project, ui.getExploratoryName(), status);
+                    updateComputationalStatuses(ui.getUser(), project, ui.getExploratoryName(), TERMINATED, TERMINATED, TERMINATED, FAILED);
+                });
+    }
+
+    @Audit(action = RECONFIGURE, type = NOTEBOOK)
+    @Override
+    public void updateClusterConfig(@User UserInfo userInfo, @Project String project, @ResourceName String exploratoryName, List<ClusterConfig> config) {
+        final String userName = userInfo.getName();
+        final String token = userInfo.getAccessToken();
+        final UserInstanceDTO userInstanceDTO = exploratoryDAO.fetchRunningExploratoryFields(userName, project, exploratoryName);
+        EndpointDTO endpointDTO = endpointService.get(userInstanceDTO.getEndpoint());
+        final ExploratoryReconfigureSparkClusterActionDTO updateClusterConfigDTO =
+                requestBuilder.newClusterConfigUpdate(userInfo, userInstanceDTO, config, endpointDTO);
+        final String uuid = provisioningService.post(endpointDTO.getUrl() + EXPLORATORY_RECONFIGURE_SPARK,
+                token, updateClusterConfigDTO,
+                String.class);
+        requestId.put(userName, uuid);
+        exploratoryDAO.updateExploratoryFields(new ExploratoryStatusDTO()
+                .withUser(userName)
+                .withProject(project)
+                .withExploratoryName(exploratoryName)
+                .withConfig(config)
+                .withStatus(UserInstanceStatus.RECONFIGURING.toString()));
+    }
+
+    /**
+     * Returns user instance's data by it's name.
+     *
+     * @param user            user.
+     * @param project
+     * @param exploratoryName name of exploratory.
+     * @return corresponding user instance's data or empty data if resource doesn't exist.
+     */
+    @Override
+    public Optional<UserInstanceDTO> getUserInstance(String user, String project, String exploratoryName) {
+        try {
+            return Optional.of(exploratoryDAO.fetchExploratoryFields(user, project, exploratoryName));
+        } catch (DatalabException e) {
+            log.warn("User instance with exploratory {}, project {} for user {} not found.", exploratoryName, project, user, e);
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public Optional<UserInstanceDTO> getUserInstance(String user, String project, String exploratoryName, boolean includeCompResources) {
+        try {
+            return Optional.of(exploratoryDAO.fetchExploratoryFields(user, project, exploratoryName, includeCompResources));
+        } catch (DatalabException e) {
+            log.warn("User instance with exploratory {}, project {} for user {} not found.", exploratoryName, project, user, e);
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public List<UserInstanceDTO> findAll() {
+        return exploratoryDAO.getInstances();
+    }
+
+    @Override
+    public List<UserInstanceDTO> findAll(Set<ProjectDTO> projects) {
+        List<String> projectNames = projects
+                .stream()
+                .map(ProjectDTO::getName)
+                .collect(Collectors.toList());
+        return exploratoryDAO.fetchExploratoryFieldsForProjectWithComp(projectNames);
+    }
+
+    @Override
+    public List<ClusterConfig> getClusterConfig(UserInfo user, String project, String exploratoryName) {
+        return exploratoryDAO.getClusterConfig(user.getName(), project, exploratoryName);
+    }
+
+    @Override
+    public ExploratoryCreatePopUp getUserInstances(UserInfo user) {
+        List<ProjectDTO> userProjects = projectService.getUserProjects(user, false);
+        Map<String, List<String>> collect = userProjects.stream()
+                .collect(Collectors.toMap(ProjectDTO::getName, this::getProjectExploratoryNames));
+        return new ExploratoryCreatePopUp(userProjects, collect);
+    }
+
+    @Audit(action = UPDATE, type = NOTEBOOK)
+    @Override
+    public void updateAfterStatusCheck(@User UserInfo userInfo, @Project String project, String endpoint, @ResourceName String name,
+                                       String instanceID, UserInstanceStatus status, @Info String auditInfo) {
+        exploratoryDAO.updateExploratoryStatus(project, endpoint, name, instanceID, status);
+    }
+
+    private List<String> getProjectExploratoryNames(ProjectDTO project) {
+        return exploratoryDAO.fetchExploratoryFieldsForProject(project.getName()).stream()
+                .map(UserInstanceDTO::getExploratoryName)
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * Sends the post request to the provisioning service and update the status of exploratory environment.
+     *
+     * @param userInfo        user info.
+     * @param resourceCreator username of person who has created the resource
+     * @param project         name of project
+     * @param exploratoryName name of exploratory environment.
+     * @param action          action for exploratory environment.
+     * @param status          status for exploratory environment.
+     * @return Invocation request as JSON string.
+     */
+    private String action(UserInfo userInfo, String resourceCreator, String project, String exploratoryName, String action, UserInstanceStatus status) {
+        try {
+            updateExploratoryComputeStatuses(userInfo.getName(), project, exploratoryName, status, resourceCreator);
+
+            UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(resourceCreator, project, exploratoryName);
+            EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
+            final String uuid =
+                    provisioningService.post(endpointDTO.getUrl() + action, userInfo.getAccessToken(),
+                            getExploratoryActionDto(userInfo, resourceCreator, status, userInstance, endpointDTO), String.class);
+            requestId.put(resourceCreator, uuid);
+            return uuid;
+        } catch (Exception t) {
+            log.error("Could not {} exploratory environment {} for user {}",
+                    StringUtils.substringAfter(action, "/"), exploratoryName, resourceCreator, t);
+            updateExploratoryStatusSilent(resourceCreator, project, exploratoryName, FAILED);
+            final String errorMsg = String.format("Could not %s exploratory environment %s: %s",
+                    StringUtils.substringAfter(action, "/"), exploratoryName,
+                    Optional.ofNullable(t.getCause()).map(Throwable::getMessage).orElse(t.getMessage()));
+            throw new DatalabException(errorMsg, t);
+        }
+    }
+
+    @Audit(action = TERMINATE, type = NOTEBOOK)
+    public void updateExploratoryComputeStatuses(@User UserInfo userInfo, @Project String project, @ResourceName String exploratoryName, UserInstanceStatus status, String resourceCreator) {
+        updateExploratoryStatus(resourceCreator, project, exploratoryName, status);
+        updateComputationalStatuses(userInfo.getName(), resourceCreator, project, exploratoryName, status);
+    }
+
+    private void updateExploratoryComputeStatuses(String user, String project, String exploratoryName, UserInstanceStatus status, String resourceCreator) {
+        updateExploratoryStatus(resourceCreator, project, exploratoryName, status);
+        updateComputationalStatuses(user, resourceCreator, project, exploratoryName, status);
+    }
+
+    private void updateComputationalStatuses(String user, String resourceCreator, String project, String exploratoryName, UserInstanceStatus status) {
+        if (status == STOPPING) {
+            if (configuration.isAuditEnabled()) {
+                saveAudit(user, resourceCreator, project, exploratoryName, STOP, RUNNING);
+            }
+            updateComputationalStatuses(resourceCreator, project, exploratoryName, STOPPING, TERMINATING, FAILED, TERMINATED, STOPPED);
+        } else if (status == TERMINATING) {
+            if (configuration.isAuditEnabled()) {
+                saveAudit(user, resourceCreator, project, exploratoryName, TERMINATE, RUNNING, STOPPED);
+            }
+            updateComputationalStatuses(resourceCreator, project, exploratoryName, TERMINATING, TERMINATING, TERMINATED, FAILED);
+        }
+    }
+
+    private void saveAudit(String user, String resourceCreator, String project, String exploratoryName, AuditActionEnum action, UserInstanceStatus... sparkStatuses) {
+        saveAuditForComputational(user, resourceCreator, project, exploratoryName, action, DataEngineType.SPARK_STANDALONE, sparkStatuses);
+        saveAuditForComputational(user, resourceCreator, project, exploratoryName, TERMINATE, DataEngineType.CLOUD_SERVICE, RUNNING, STOPPED);
+    }
+
+    private void saveAuditForComputational(String user, String resourceCreator, String project, String exploratoryName, AuditActionEnum action, DataEngineType cloudService,
+                                           UserInstanceStatus... computationalStatuses) {
+        computationalDAO.getComputationalResourcesWhereStatusIn(resourceCreator, project, Collections.singletonList(cloudService),
+                exploratoryName, computationalStatuses)
+                .forEach(comp -> auditService.save(
+                        AuditDTO.builder()
+                                .user(user)
+                                .resourceName(comp)
+                                .project(project)
+                                .action(action)
+                                .type(AuditResourceTypeEnum.COMPUTE)
+                                .build())
+                );
+    }
+
+    private ExploratoryActionDTO<?> getExploratoryActionDto(UserInfo userInfo, String resourceCreator, UserInstanceStatus status, UserInstanceDTO userInstance,
+                                                            EndpointDTO endpointDTO) {
+        ExploratoryActionDTO<?> dto;
+        if (status != UserInstanceStatus.STARTING) {
+            dto = requestBuilder.newExploratoryStop(resourceCreator, userInstance, endpointDTO);
+        } else {
+            dto = requestBuilder.newExploratoryStart(userInfo, userInstance, endpointDTO, gitCredsDAO.findGitCreds(userInfo.getName()));
+        }
+        return dto;
+    }
+
+
+    /**
+     * Updates the status of exploratory environment.
+     *
+     * @param user            user name
+     * @param project         project name
+     * @param exploratoryName name of exploratory environment.
+     * @param status          status for exploratory environment.
+     */
+    private void updateExploratoryStatus(String user, String project, String exploratoryName, UserInstanceStatus status) {
+        StatusEnvBaseDTO<?> exploratoryStatus = createStatusDTO(user, project, exploratoryName, status);
+        exploratoryDAO.updateExploratoryStatus(exploratoryStatus);
+    }
+
+    /**
+     * Updates the status of exploratory environment without exceptions. If exception occurred then logging it.
+     *
+     * @param user            user name
+     * @param project         project name
+     * @param exploratoryName name of exploratory environment.
+     * @param status          status for exploratory environment.
+     */
+    private void updateExploratoryStatusSilent(String user, String project, String exploratoryName, UserInstanceStatus status) {
+        try {
+            updateExploratoryStatus(user, project, exploratoryName, status);
+        } catch (DatalabException e) {
+            log.error("Could not update the status of exploratory environment {} for user {} to {}",
+                    exploratoryName, user, status, e);
+        }
+    }
+
+    private void updateComputationalStatuses(String user, String project, String exploratoryName, UserInstanceStatus
+            dataEngineStatus, UserInstanceStatus dataEngineServiceStatus, UserInstanceStatus... excludedStatuses) {
+        log.debug("updating status for all computational resources of {} for user {}: DataEngine {}, " +
+                "dataengine-service {}", exploratoryName, user, dataEngineStatus, dataEngineServiceStatus);
+        computationalDAO.updateComputationalStatusesForExploratory(user, project, exploratoryName,
+                dataEngineStatus, dataEngineServiceStatus, excludedStatuses);
+    }
+
+    /**
+     * Instantiates and returns the descriptor of exploratory environment status.
+     *
+     * @param user            user name
+     * @param project         project
+     * @param exploratoryName name of exploratory environment.
+     * @param status          status for exploratory environment.
+     */
+    private StatusEnvBaseDTO<?> createStatusDTO(String user, String project, String exploratoryName, UserInstanceStatus status) {
+        return new ExploratoryStatusDTO()
+                .withUser(user)
+                .withProject(project)
+                .withExploratoryName(exploratoryName)
+                .withStatus(status);
+    }
+
+    private UserInstanceDTO getUserInstanceDTO(UserInfo userInfo, Exploratory exploratory, String project, CloudProvider cloudProvider) {
+        final UserInstanceDTO userInstance = new UserInstanceDTO()
+                .withUser(userInfo.getName())
+                .withExploratoryName(exploratory.getName())
+                .withStatus(CREATING.toString())
+                .withImageName(exploratory.getDockerImage())
+                .withImageVersion(exploratory.getVersion())
+                .withTemplateName(exploratory.getTemplateName())
+                .withClusterConfig(exploratory.getClusterConfig())
+                .withShape(exploratory.getShape())
+                .withProject(project)
+                .withEndpoint(exploratory.getEndpoint())
+                .withCloudProvider(cloudProvider.toString())
+                .withTags(tagService.getResourceTags(userInfo, exploratory.getEndpoint(), project,
+                        exploratory.getExploratoryTag(), exploratory.getEnabledGPU()))
+                .withGPUCount(exploratory.getGpuCount())
+                .withGPUEnabled(exploratory.getEnabledGPU())
+                .withGPUType(exploratory.getGpuType());
+        if (StringUtils.isNotBlank(exploratory.getImageName())) {
+            final List<LibInstallDTO> libInstallDtoList = getImageRelatedLibraries(userInfo, exploratory.getImageName(),
+                    project, exploratory.getEndpoint());
+            userInstance.withLibs(libInstallDtoList);
+        }
+        return userInstance;
+    }
+
+    private List<LibInstallDTO> getImageRelatedLibraries(UserInfo userInfo, String imageFullName, String project,
+                                                         String endpoint) {
+        final List<Library> libraries = imageExploratoryDao.getLibraries(userInfo.getName(), imageFullName, project,
+                endpoint, LibStatus.INSTALLED);
+        return toLibInstallDtoList(libraries);
+    }
+
+    private List<LibInstallDTO> toLibInstallDtoList(List<Library> libraries) {
+        return libraries
+                .stream()
+                .map(this::toLibInstallDto)
+                .collect(Collectors.toList());
+    }
+
+    private LibInstallDTO toLibInstallDto(Library l) {
+        return new LibInstallDTO(l.getGroup(), l.getName(), l.getVersion())
+                .withStatus(String.valueOf(l.getStatus()))
+                .withAddedPackages(l.getAddedPackages())
+                .withErrorMessage(l.getErrorMessage());
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/GitCredentialServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/GitCredentialServiceImpl.java
new file mode 100644
index 0000000..a8540ac
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/GitCredentialServiceImpl.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.Audit;
+import com.epam.datalab.backendapi.annotation.User;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.GitCredsDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.GitCredentialService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.UPDATE;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.GIT_ACCOUNT;
+import static com.epam.datalab.rest.contracts.ExploratoryAPI.EXPLORATORY_GIT_CREDS;
+
+@Slf4j
+@Singleton
+public class GitCredentialServiceImpl implements GitCredentialService {
+
+    private static final boolean CLEAR_USER_PASSWORD = true;
+    @Inject
+    private GitCredsDAO gitCredsDAO;
+    @Inject
+    private ExploratoryDAO exploratoryDAO;
+    @Inject
+    @Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
+    private RESTService provisioningService;
+    @Inject
+    private RequestBuilder requestBuilder;
+    @Inject
+    private RequestId requestId;
+    @Inject
+    private EndpointService endpointService;
+
+    @Audit(action = UPDATE, type = GIT_ACCOUNT)
+    @Override
+    public void updateGitCredentials(@User UserInfo userInfo, ExploratoryGitCredsDTO formDTO) {
+        log.debug("Updating GIT creds for user {} to {}", userInfo.getName(), formDTO);
+        try {
+            gitCredsDAO.updateGitCreds(userInfo.getName(), formDTO);
+            final String failedNotebooks = exploratoryDAO.fetchRunningExploratoryFields(userInfo.getName())
+                    .stream()
+                    .filter(ui -> !updateNotebookGitCredentials(userInfo, formDTO, ui))
+                    .map(UserInstanceDTO::getExploratoryName)
+                    .collect(Collectors.joining(","));
+            if (StringUtils.isNotEmpty(failedNotebooks)) {
+                throw new DatalabException("Requests for notebooks failed: " + failedNotebooks);
+            }
+        } catch (Exception t) {
+            log.error("Cannot update the GIT creds for user {}", userInfo.getName(), t);
+            throw new DatalabException("Cannot update the GIT credentials: " + t.getLocalizedMessage(), t);
+        }
+    }
+
+    @Override
+    public ExploratoryGitCredsDTO getGitCredentials(String user) {
+        log.debug("Loading GIT creds for user {}", user);
+        try {
+            return gitCredsDAO.findGitCreds(user, CLEAR_USER_PASSWORD);
+        } catch (Exception t) {
+            log.error("Cannot load list of GIT creds for user: {}", user, t);
+            throw new DatalabException(String.format("Cannot load GIT credentials for user %s: %s",
+                    user, t.getLocalizedMessage()), t);
+        }
+    }
+
+    private boolean updateNotebookGitCredentials(UserInfo userInfo, ExploratoryGitCredsDTO formDTO,
+                                                 UserInstanceDTO instance) {
+        boolean gitCredentialsUpdated = true;
+        try {
+            log.debug("Updating GIT creds for user {} on exploratory {}",
+                    userInfo.getName(), instance.getExploratoryName());
+            EndpointDTO endpointDTO = endpointService.get(instance.getEndpoint());
+            ExploratoryGitCredsUpdateDTO dto = requestBuilder.newGitCredentialsUpdate(userInfo, instance, endpointDTO, formDTO);
+            final String uuid = provisioningService.post(endpointDTO.getUrl() + EXPLORATORY_GIT_CREDS,
+                    userInfo.getAccessToken(), dto, String.class);
+            requestId.put(userInfo.getName(), uuid);
+        } catch (Exception t) {
+            log.error("Cannot update the GIT creds for user {} on exploratory {}", userInfo.getName(),
+                    instance.getExploratoryName(), t);
+            gitCredentialsUpdated = false;
+        }
+        return gitCredentialsUpdated;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/GuacamoleServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/GuacamoleServiceImpl.java
new file mode 100644
index 0000000..80534fe
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/GuacamoleServiceImpl.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.GuacamoleService;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.KeyAPI;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.guacamole.net.GuacamoleTunnel;
+import org.apache.guacamole.net.InetGuacamoleSocket;
+import org.apache.guacamole.net.SimpleGuacamoleTunnel;
+import org.apache.guacamole.protocol.ConfiguredGuacamoleSocket;
+import org.apache.guacamole.protocol.GuacamoleConfiguration;
+
+import javax.inject.Named;
+import java.net.URI;
+import java.util.Map;
+
+@Slf4j
+@Singleton
+public class GuacamoleServiceImpl implements GuacamoleService {
+
+    private static final String PRIVATE_KEY_PARAM_NAME = "private-key";
+    private static final String HOSTNAME_PARAM = "hostname";
+    private static final String CONNECTION_PROTOCOL_PARAM = "connectionProtocol";
+    private static final String SERVER_HOST_PARAM = "serverHost";
+    private final SelfServiceApplicationConfiguration conf;
+    private final RESTService provisioningService;
+    private final EndpointService endpointService;
+
+    @Inject
+    public GuacamoleServiceImpl(SelfServiceApplicationConfiguration conf,
+                                @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
+                                EndpointService endpointService) {
+        this.conf = conf;
+        this.provisioningService = provisioningService;
+        this.endpointService = endpointService;
+    }
+
+    @Override
+    public GuacamoleTunnel getTunnel(UserInfo userInfo, String host, String endpoint) {
+        try {
+            final String url = endpointService.get(endpoint).getUrl();
+            String key = provisioningService.get(url + KeyAPI.GET_ADMIN_KEY,
+                    userInfo.getAccessToken(), String.class);
+            final String guacamoleServerHost = new URI(url).getHost();
+            InetGuacamoleSocket socket = new InetGuacamoleSocket(guacamoleServerHost, conf.getGuacamolePort());
+            final Map<String, String> guacamoleConf = conf.getGuacamole();
+            guacamoleConf.put(SERVER_HOST_PARAM, guacamoleServerHost);
+            GuacamoleConfiguration guacamoleConfig = getGuacamoleConfig(key, guacamoleConf, host);
+            return new SimpleGuacamoleTunnel(new ConfiguredGuacamoleSocket(socket, guacamoleConfig));
+        } catch (Exception e) {
+            log.error("Can not create guacamole tunnel due to: " + e.getMessage());
+            throw new DatalabException("Can not create guacamole tunnel due to: " + e.getMessage(), e);
+        }
+    }
+
+    private GuacamoleConfiguration getGuacamoleConfig(String privateKeyContent, Map<String, String> guacamoleParams,
+                                                      String host) {
+        GuacamoleConfiguration guacamoleConfiguration = new GuacamoleConfiguration();
+        guacamoleConfiguration.setProtocol(guacamoleParams.get(CONNECTION_PROTOCOL_PARAM));
+        guacamoleConfiguration.setParameters(guacamoleParams);
+        guacamoleConfiguration.setParameter(HOSTNAME_PARAM, host);
+        guacamoleConfiguration.setParameter(PRIVATE_KEY_PARAM_NAME, privateKeyContent);
+        return guacamoleConfiguration;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImpl.java
new file mode 100644
index 0000000..8c68021
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImpl.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.Audit;
+import com.epam.datalab.backendapi.annotation.Info;
+import com.epam.datalab.backendapi.annotation.Project;
+import com.epam.datalab.backendapi.annotation.ResourceName;
+import com.epam.datalab.backendapi.annotation.User;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryLibDAO;
+import com.epam.datalab.backendapi.dao.ImageExploratoryDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.ImageExploratoryService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.exploratory.ExploratoryStatusDTO;
+import com.epam.datalab.dto.exploratory.ImageStatus;
+import com.epam.datalab.exceptions.ResourceAlreadyExistException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.model.ResourceType;
+import com.epam.datalab.model.exploratory.Image;
+import com.epam.datalab.model.library.Library;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ExploratoryAPI;
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.CREATE;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.IMAGE;
+
+@Singleton
+@Slf4j
+public class ImageExploratoryServiceImpl implements ImageExploratoryService {
+    private static final String IMAGE_EXISTS_MSG = "Image with name %s is already exist in project %s";
+    private static final String IMAGE_NOT_FOUND_MSG = "Image with name %s was not found for user %s";
+
+    @Inject
+    private ExploratoryDAO exploratoryDAO;
+    @Inject
+    private ImageExploratoryDAO imageExploratoryDao;
+    @Inject
+    private ExploratoryLibDAO libDAO;
+    @Inject
+    @Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
+    private RESTService provisioningService;
+    @Inject
+    private RequestBuilder requestBuilder;
+    @Inject
+    private EndpointService endpointService;
+    @Inject
+    private ProjectService projectService;
+
+    @Audit(action = CREATE, type = IMAGE)
+    @Override
+    public String createImage(@User UserInfo user, @Project String project, @ResourceName String exploratoryName, String imageName, String imageDescription, @Info String info) {
+        ProjectDTO projectDTO = projectService.get(project);
+        UserInstanceDTO userInstance = exploratoryDAO.fetchRunningExploratoryFields(user.getName(), project, exploratoryName);
+
+        if (imageExploratoryDao.exist(imageName, userInstance.getProject())) {
+            log.error(String.format(IMAGE_EXISTS_MSG, imageName, userInstance.getProject()));
+            throw new ResourceAlreadyExistException(String.format(IMAGE_EXISTS_MSG, imageName, userInstance.getProject()));
+        }
+        final List<Library> libraries = libDAO.getLibraries(user.getName(), project, exploratoryName);
+
+        imageExploratoryDao.save(Image.builder()
+                .name(imageName)
+                .description(imageDescription)
+                .status(ImageStatus.CREATING)
+                .user(user.getName())
+                .libraries(fetchExploratoryLibs(libraries))
+                .computationalLibraries(fetchComputationalLibs(libraries))
+                .dockerImage(userInstance.getImageName())
+                .exploratoryId(userInstance.getId())
+                .project(userInstance.getProject())
+                .endpoint(userInstance.getEndpoint())
+                .build());
+
+        exploratoryDAO.updateExploratoryStatus(new ExploratoryStatusDTO()
+                .withUser(user.getName())
+                .withProject(project)
+                .withExploratoryName(exploratoryName)
+                .withStatus(UserInstanceStatus.CREATING_IMAGE));
+
+        EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
+        return provisioningService.post(endpointDTO.getUrl() + ExploratoryAPI.EXPLORATORY_IMAGE,
+                user.getAccessToken(),
+                requestBuilder.newExploratoryImageCreate(user, userInstance, imageName, endpointDTO, projectDTO), String.class);
+    }
+
+    @Override
+    public void finishImageCreate(Image image, String exploratoryName, String newNotebookIp) {
+        log.debug("Returning exploratory status with name {} to RUNNING for user {}",
+                exploratoryName, image.getUser());
+        exploratoryDAO.updateExploratoryStatus(new ExploratoryStatusDTO()
+                .withUser(image.getUser())
+                .withProject(image.getProject())
+                .withExploratoryName(exploratoryName)
+                .withStatus(UserInstanceStatus.RUNNING));
+        imageExploratoryDao.updateImageFields(image);
+        if (newNotebookIp != null) {
+            log.debug("Changing exploratory ip with name {} for user {} to {}", exploratoryName, image.getUser(),
+                    newNotebookIp);
+            exploratoryDAO.updateExploratoryIp(image.getUser(), image.getProject(), newNotebookIp, exploratoryName);
+        }
+
+    }
+
+    @Override
+    public List<ImageInfoRecord> getNotFailedImages(String user, String dockerImage, String project, String endpoint) {
+        return imageExploratoryDao.getImages(user, dockerImage, project, endpoint, ImageStatus.CREATED, ImageStatus.CREATING);
+    }
+
+    @Override
+    public ImageInfoRecord getImage(String user, String name, String project, String endpoint) {
+        return imageExploratoryDao.getImage(user, name, project, endpoint).orElseThrow(() ->
+                new ResourceNotFoundException(String.format(IMAGE_NOT_FOUND_MSG, name, user)));
+    }
+
+    @Override
+    public List<ImageInfoRecord> getImagesForProject(String project) {
+        return imageExploratoryDao.getImagesForProject(project);
+    }
+
+    private Map<String, List<Library>> fetchComputationalLibs(List<Library> libraries) {
+        return libraries.stream()
+                .filter(resourceTypePredicate(ResourceType.COMPUTATIONAL))
+                .collect(Collectors.toMap(Library::getResourceName, Lists::newArrayList, this::merge));
+    }
+
+    private List<Library> merge(List<Library> oldValue, List<Library> newValue) {
+        oldValue.addAll(newValue);
+        return oldValue;
+    }
+
+    private List<Library> fetchExploratoryLibs(List<Library> libraries) {
+        return libraries.stream()
+                .filter(resourceTypePredicate(ResourceType.EXPLORATORY))
+                .collect(Collectors.toList());
+    }
+
+    private Predicate<Library> resourceTypePredicate(ResourceType resourceType) {
+        return l -> resourceType == l.getType();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InactivityServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InactivityServiceImpl.java
new file mode 100644
index 0000000..96fb050
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InactivityServiceImpl.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.dao.EnvDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.InactivityService;
+import com.epam.datalab.backendapi.service.SecurityService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.computational.ComputationalCheckInactivityDTO;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.dto.exploratory.ExploratoryCheckInactivityAction;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.InfrasctructureAPI;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+
+import java.time.LocalDateTime;
+
+@Slf4j
+public class InactivityServiceImpl implements InactivityService {
+    @Inject
+    private ExploratoryDAO exploratoryDAO;
+    @Inject
+    private ComputationalDAO computationalDAO;
+    @Inject
+    private EnvDAO envDAO;
+    @Inject
+    private RequestBuilder requestBuilder;
+    @Inject
+    @Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
+    private RESTService provisioningService;
+    @Inject
+    private RequestId requestId;
+    @Inject
+    private SecurityService securityService;
+    @Inject
+    private EndpointService endpointService;
+
+    @Override
+    public void updateRunningResourcesLastActivity() {
+        envDAO.findRunningResourcesForCheckInactivity()
+                .forEach(this::updateLastActivity);
+    }
+
+    @Override
+    public void updateLastActivityForExploratory(UserInfo userInfo, String exploratoryName,
+                                                 LocalDateTime lastActivity) {
+        exploratoryDAO.updateLastActivity(userInfo.getName(), exploratoryName, lastActivity);
+    }
+
+    @Override
+    public void updateLastActivityForComputational(UserInfo userInfo, String project, String exploratoryName,
+                                                   String computationalName, LocalDateTime lastActivity) {
+        computationalDAO.updateLastActivity(userInfo.getName(), project, exploratoryName, computationalName, lastActivity);
+    }
+
+    private void updateLastActivity(UserInstanceDTO ui) {
+        if (UserInstanceStatus.RUNNING.toString().equals(ui.getStatus())) {
+            updateExploratoryLastActivity(securityService.getUserInfoOffline(ui.getUser()), ui);
+        }
+        ui.getResources()
+                .stream()
+                .filter(comp -> UserInstanceStatus.RUNNING.toString().equals(comp.getStatus()))
+                .forEach(cr -> updateComputationalLastActivity(securityService.getUserInfoOffline(ui.getUser()), ui, cr));
+    }
+
+    private void updateComputationalLastActivity(UserInfo userInfo, UserInstanceDTO ui, UserComputationalResource cr) {
+        EndpointDTO endpointDTO = endpointService.get(ui.getEndpoint());
+        final ComputationalCheckInactivityDTO dto = requestBuilder.newComputationalCheckInactivity(userInfo, ui, cr, endpointDTO);
+        final String uuid =
+                provisioningService.post(endpointDTO.getUrl() + InfrasctructureAPI.COMPUTATIONAL_CHECK_INACTIVITY,
+                        userInfo.getAccessToken(), dto, String.class);
+        requestId.put(userInfo.getName(), uuid);
+    }
+
+    private void updateExploratoryLastActivity(UserInfo userInfo, UserInstanceDTO ui) {
+        EndpointDTO endpointDTO = endpointService.get(ui.getEndpoint());
+        final ExploratoryCheckInactivityAction dto =
+                requestBuilder.newExploratoryCheckInactivityAction(userInfo, ui, endpointDTO);
+        final String uuid =
+                provisioningService.post(endpointDTO.getUrl() + InfrasctructureAPI.EXPLORATORY_CHECK_INACTIVITY,
+                        userInfo.getAccessToken(), dto, String.class);
+        requestId.put(userInfo.getName(), uuid);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
new file mode 100644
index 0000000..fe2f340
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
@@ -0,0 +1,219 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.domain.*;
+import com.epam.datalab.backendapi.resources.dto.HealthStatusEnum;
+import com.epam.datalab.backendapi.resources.dto.HealthStatusPageDTO;
+import com.epam.datalab.backendapi.resources.dto.ProjectInfrastructureInfo;
+import com.epam.datalab.backendapi.roles.RoleType;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.backendapi.service.BillingService;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.InfrastructureInfoService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.InfrastructureMetaInfoDTO;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.aws.edge.EdgeInfoAws;
+import com.epam.datalab.dto.azure.edge.EdgeInfoAzure;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.dto.gcp.edge.EdgeInfoGcp;
+import com.epam.datalab.dto.status.EnvResource;
+import com.epam.datalab.dto.status.EnvResourceList;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import com.jcabi.manifests.Manifests;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class InfrastructureInfoServiceImpl implements InfrastructureInfoService {
+
+    private static final String RELEASE_NOTES_FORMAT = "https://github.com/apache/incubator-datalab/blob/%s/RELEASE_NOTES.md";
+    private static final String PERMISSION_VIEW = "/api/bucket/view";
+    private static final String PERMISSION_UPLOAD = "/api/bucket/upload";
+    private static final String PERMISSION_DOWNLOAD = "/api/bucket/download";
+    private static final String PERMISSION_DELETE = "/api/bucket/delete";
+    private static final String INFRASTRUCTURE_STATUS = "infrastructure/status";
+
+    private final ExploratoryDAO expDAO;
+    private final SelfServiceApplicationConfiguration configuration;
+    private final ProjectService projectService;
+    private final EndpointService endpointService;
+    private final BillingService billingService;
+    private final RequestBuilder requestBuilder;
+    private final RESTService provisioningService;
+    private final RequestId requestId;
+
+
+    @Inject
+    public InfrastructureInfoServiceImpl(ExploratoryDAO expDAO, SelfServiceApplicationConfiguration configuration, ProjectService projectService,
+                                         EndpointService endpointService, BillingService billingService, RequestBuilder requestBuilder,
+                                         @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService, RequestId requestId) {
+        this.expDAO = expDAO;
+        this.configuration = configuration;
+        this.projectService = projectService;
+        this.endpointService = endpointService;
+        this.billingService = billingService;
+        this.requestBuilder = requestBuilder;
+        this.provisioningService = provisioningService;
+        this.requestId = requestId;
+    }
+
+    @Override
+    public List<ProjectInfrastructureInfo> getUserResources(UserInfo user) {
+        log.debug("Loading list of provisioned resources for user {}", user);
+        List<EndpointDTO> allEndpoints = endpointService.getEndpoints();
+        return projectService.getUserProjects(user, Boolean.FALSE)
+                .stream()
+                .map(p -> {
+                    List<UserInstanceDTO> exploratories = expDAO.findExploratories(user.getName(), p.getName());
+                    return ProjectInfrastructureInfo.builder()
+                            .project(p.getName())
+                            .billingQuoteUsed(billingService.getBillingProjectQuoteUsed(p.getName()))
+                            .shared(getSharedInfo(p.getName()))
+                            .exploratory(exploratories)
+                            .exploratoryBilling(getExploratoryBillingData(exploratories))
+                            .endpoints(getEndpoints(allEndpoints, p))
+                            .odahu(p.getOdahu())
+                            .build();
+                })
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public HealthStatusPageDTO getHeathStatus(UserInfo userInfo) {
+        log.debug("Request the status of resources for user {}", userInfo.getName());
+        return HealthStatusPageDTO.builder()
+                .status(HealthStatusEnum.OK.toString())
+                .listResources(Collections.emptyList())
+                .billingEnabled(configuration.isBillingSchedulerEnabled())
+                .auditEnabled(configuration.isAuditEnabled())
+                .projectAdmin(UserRoles.isProjectAdmin(userInfo))
+                .admin(UserRoles.isAdmin(userInfo))
+                .projectAssigned(projectService.isAnyProjectAssigned(userInfo))
+                .bucketBrowser(HealthStatusPageDTO.BucketBrowser.builder()
+                        .view(checkAccess(userInfo, PERMISSION_VIEW))
+                        .upload(checkAccess(userInfo, PERMISSION_UPLOAD))
+                        .download(checkAccess(userInfo, PERMISSION_DOWNLOAD))
+                        .delete(checkAccess(userInfo, PERMISSION_DELETE))
+                        .build())
+                .build();
+    }
+
+    @Override
+    public InfrastructureMetaInfoDTO getInfrastructureMetaInfo() {
+        final String branch = Manifests.read("GIT-Branch");
+        return InfrastructureMetaInfoDTO.builder()
+                .branch(branch)
+                .commit(Manifests.read("GIT-Commit"))
+                .version(Manifests.read("DataLab-Version"))
+                .releaseNotes(String.format(RELEASE_NOTES_FORMAT, branch))
+                .build();
+    }
+
+    @Override
+    public void updateInfrastructureStatuses(UserInfo user, String endpoint, List<EnvResource> hostInstances, List<EnvResource> clusterInstances) {
+        EnvResourceList envResourceList = EnvResourceList.builder()
+                .hostList(hostInstances)
+                .clusterList(clusterInstances)
+                .build();
+
+        EndpointDTO endpointDTO = endpointService.get(endpoint);
+        log.info("Send request to provisioning service:\n POST:{}, with EnvResources: {}", INFRASTRUCTURE_STATUS,
+                envResourceList);
+        String uuid = provisioningService.post(endpointDTO.getUrl() + INFRASTRUCTURE_STATUS, user.getAccessToken(),
+                requestBuilder.newInfrastructureStatus(user.getName(), endpointDTO.getCloudProvider(), envResourceList),
+                String.class);
+        requestId.put(user.getName(), uuid);
+    }
+
+    private List<BillingReport> getExploratoryBillingData(List<UserInstanceDTO> exploratories) {
+        return exploratories
+                .stream()
+                .map(exp -> billingService.getExploratoryBillingData(exp.getProject(), exp.getEndpoint(),
+                        exp.getExploratoryName(), exp.getResources()
+                                .stream()
+                                .map(UserComputationalResource::getComputationalName)
+                                .collect(Collectors.toList())
+                ))
+                .collect(Collectors.toList());
+    }
+
+    private List<EndpointDTO> getEndpoints(List<EndpointDTO> allEndpoints, ProjectDTO projectDTO) {
+        return allEndpoints
+                .stream()
+                .filter(endpoint -> projectDTO.getEndpoints()
+                        .stream()
+                        .anyMatch(endpoint1 -> endpoint1.getName().equals(endpoint.getName())))
+                .collect(Collectors.toList());
+    }
+
+    private Map<String, Map<String, String>> getSharedInfo(String name) {
+        return projectService.get(name).getEndpoints()
+                .stream()
+                .collect(Collectors.toMap(ProjectEndpointDTO::getName, this::getSharedInfo));
+    }
+
+    private Map<String, String> getSharedInfo(ProjectEndpointDTO endpointDTO) {
+        Optional<EdgeInfo> edgeInfo = Optional.ofNullable(endpointDTO.getEdgeInfo());
+        if (!edgeInfo.isPresent()) {
+            return Collections.emptyMap();
+        }
+        EdgeInfo edge = edgeInfo.get();
+        Map<String, String> shared = new HashMap<>();
+
+        shared.put("status", endpointDTO.getStatus().toString());
+        shared.put("edge_node_ip", edge.getPublicIp());
+        if (edge instanceof EdgeInfoAws) {
+            EdgeInfoAws edgeInfoAws = (EdgeInfoAws) edge;
+            shared.put("user_own_bicket_name", edgeInfoAws.getUserOwnBucketName());
+            shared.put("shared_bucket_name", edgeInfoAws.getSharedBucketName());
+        } else if (edge instanceof EdgeInfoAzure) {
+            EdgeInfoAzure edgeInfoAzure = (EdgeInfoAzure) edge;
+            shared.put("user_container_name", edgeInfoAzure.getUserContainerName());
+            shared.put("shared_container_name", edgeInfoAzure.getSharedContainerName());
+            shared.put("user_storage_account_name", edgeInfoAzure.getUserStorageAccountName());
+            shared.put("shared_storage_account_name", edgeInfoAzure.getSharedStorageAccountName());
+            shared.put("datalake_name", edgeInfoAzure.getDataLakeName());
+            shared.put("datalake_user_directory_name", edgeInfoAzure.getDataLakeDirectoryName());
+            shared.put("datalake_shared_directory_name", edgeInfoAzure.getDataLakeSharedDirectoryName());
+        } else if (edge instanceof EdgeInfoGcp) {
+            EdgeInfoGcp edgeInfoGcp = (EdgeInfoGcp) edge;
+            shared.put("user_own_bucket_name", edgeInfoGcp.getUserOwnBucketName());
+            shared.put("shared_bucket_name", edgeInfoGcp.getSharedBucketName());
+        }
+
+        return shared;
+    }
+
+    private boolean checkAccess(UserInfo userInfo, String permission) {
+        return UserRoles.checkAccess(userInfo, RoleType.PAGE, permission, userInfo.getRoles());
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceImpl.java
new file mode 100644
index 0000000..4508397
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceImpl.java
@@ -0,0 +1,278 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.GpuDAO;
+import com.epam.datalab.backendapi.dao.ProjectDAO;
+import com.epam.datalab.backendapi.dao.SettingsDAO;
+import com.epam.datalab.backendapi.dao.UserGroupDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.resources.dto.SparkStandaloneConfiguration;
+import com.epam.datalab.backendapi.resources.dto.aws.AwsEmrConfiguration;
+import com.epam.datalab.backendapi.resources.dto.gcp.GcpDataprocConfiguration;
+import com.epam.datalab.backendapi.roles.RoleType;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.InfrastructureTemplateService;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.base.computational.FullComputationalTemplate;
+import com.epam.datalab.dto.imagemetadata.ComputationalMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ComputationalResourceShapeDto;
+import com.epam.datalab.dto.imagemetadata.ExploratoryMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ImageMetadataDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.cloud.CloudProvider.AZURE;
+import static com.epam.datalab.rest.contracts.DockerAPI.DOCKER_COMPUTATIONAL;
+import static com.epam.datalab.rest.contracts.DockerAPI.DOCKER_EXPLORATORY;
+
+@Slf4j
+public class InfrastructureTemplateServiceImpl implements InfrastructureTemplateService {
+
+    private final SelfServiceApplicationConfiguration configuration;
+    private final SettingsDAO settingsDAO;
+    private final UserGroupDAO userGroupDao;
+    private final GpuDAO gpuDAO;
+    private final EndpointService endpointService;
+    private final RESTService provisioningService;
+
+    @Inject
+    public InfrastructureTemplateServiceImpl(SelfServiceApplicationConfiguration configuration, SettingsDAO settingsDAO,
+                                             ProjectDAO projectDAO, EndpointService endpointService,
+                                             UserGroupDAO userGroupDao, GpuDAO gpuDAO,
+                                             @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService) {
+        this.configuration = configuration;
+        this.settingsDAO = settingsDAO;
+        this.endpointService = endpointService;
+        this.userGroupDao = userGroupDao;
+        this.gpuDAO = gpuDAO;
+        this.provisioningService = provisioningService;
+    }
+
+    @Override
+    public List<ExploratoryMetadataDTO> getExploratoryTemplates(UserInfo user, String project, String endpoint) {
+        log.debug("Loading list of exploratory templates for user {} for project {}", user.getName(), project);
+        try {
+            EndpointDTO endpointDTO = endpointService.get(endpoint);
+            Set<String> roles = userGroupDao.getUserGroups(user.getName());
+            return changeExploratoryMetadata(user, project, endpointDTO, roles);
+        } catch (DatalabException e) {
+            log.error("Could not load list of exploratory templates for user: {}", user.getName(), e);
+            throw e;
+        }
+    }
+
+    @Override
+    public List<FullComputationalTemplate> getComputationalTemplates(UserInfo user, String project, String endpoint) {
+
+        log.debug("Loading list of computational templates for user {}", user.getName());
+        try {
+            EndpointDTO endpointDTO = endpointService.get(endpoint);
+            ComputationalMetadataDTO[] array =
+                    provisioningService.get(endpointDTO.getUrl() + DOCKER_COMPUTATIONAL,
+                            user.getAccessToken(), ComputationalMetadataDTO[]
+                                    .class);
+            log.info("loaded: {}", (Object) array);
+
+            final Set<String> roles = userGroupDao.getUserGroups(user.getName());
+
+            List<FullComputationalTemplate> s = Arrays.stream(array)
+                    .peek(e -> e.setImage(getSimpleImageName(e.getImage())))
+                    .peek(e -> filterShapes(user, e.getComputationResourceShapes(), RoleType.COMPUTATIONAL_SHAPES, roles))
+                    .filter(e -> UserRoles.checkAccess(user, RoleType.COMPUTATIONAL, e.getImage(), roles))
+                    .map(comp -> fullComputationalTemplate(comp, endpointDTO.getCloudProvider(), project))
+                    .collect(Collectors.toList());
+            log.info("changed: {}", s);
+
+            return s;
+
+        } catch (DatalabException e) {
+            log.error("Could not load list of computational templates for user: {}", user.getName(), e);
+            throw e;
+        }
+    }
+
+    protected FullComputationalTemplate getCloudFullComputationalTemplate(ComputationalMetadataDTO metadataDTO,
+                                                                          CloudProvider cloudProvider) {
+
+        switch (cloudProvider) {
+            case AWS:
+                return new AwsFullComputationalTemplate(metadataDTO,
+                        AwsEmrConfiguration.builder()
+                                .minEmrInstanceCount(configuration.getMinEmrInstanceCount())
+                                .maxEmrInstanceCount(configuration.getMaxEmrInstanceCount())
+                                .maxEmrSpotInstanceBidPct(configuration.getMaxEmrSpotInstanceBidPct())
+                                .minEmrSpotInstanceBidPct(configuration.getMinEmrSpotInstanceBidPct())
+                                .build());
+            case GCP:
+                return new GcpFullComputationalTemplate(metadataDTO,
+                        GcpDataprocConfiguration.builder()
+                                .minInstanceCount(configuration.getMinInstanceCount())
+                                .maxInstanceCount(configuration.getMaxInstanceCount())
+                                .minDataprocPreemptibleInstanceCount(configuration.getMinDataprocPreemptibleCount())
+                                .build());
+            case AZURE:
+                log.error("Dataengine service is not supported currently for {}", AZURE);
+                throw new UnsupportedOperationException("Dataengine service is not supported currently for " + AZURE);
+            default:
+                throw new UnsupportedOperationException("Dataengine service is not supported currently for " + cloudProvider);
+        }
+    }
+
+    private List<ExploratoryMetadataDTO> changeExploratoryMetadata(UserInfo user, String project, EndpointDTO endpointDTO, Set<String> roles) {
+        return getExploratoryMetadata(user, endpointDTO).stream()
+                .peek(e -> e.setImage(getSimpleImageName(e.getImage())))
+                .filter(e -> exploratoryGpuIssuesAzureFilter(e, endpointDTO.getCloudProvider()) &&
+                        UserRoles.checkAccess(user, RoleType.EXPLORATORY, e.getImage(), roles))
+                .peek(e -> filterShapes(user, e.getExploratoryEnvironmentShapes(), RoleType.EXPLORATORY_SHAPES, roles))
+                .peek(e -> addGpu(e, project))
+                .collect(Collectors.toList());
+    }
+
+    private List<ExploratoryMetadataDTO> getExploratoryMetadata(UserInfo user, EndpointDTO endpointDTO) {
+        return Arrays.asList(provisioningService.get(endpointDTO.getUrl() + DOCKER_EXPLORATORY,
+                user.getAccessToken(),
+                ExploratoryMetadataDTO[].class));
+    }
+
+
+    /**
+     * Removes shapes for which user does not have an access
+     *
+     * @param user              user
+     * @param environmentShapes shape types
+     * @param roleType
+     * @param roles
+     */
+    private void filterShapes(UserInfo user, Map<String, List<ComputationalResourceShapeDto>> environmentShapes,
+                              RoleType roleType, Set<String> roles) {
+        environmentShapes.forEach((k, v) -> v.removeIf(compResShapeDto ->
+                !UserRoles.checkAccess(user, roleType, compResShapeDto.getType(), roles))
+        );
+    }
+
+    /**
+     * Temporary filter for creation of exploratory env due to Azure issues
+     */
+    private boolean exploratoryGpuIssuesAzureFilter(ExploratoryMetadataDTO e, CloudProvider cloudProvider) {
+        return (!"redhat".equals(settingsDAO.getConfOsFamily()) || cloudProvider != AZURE) ||
+                !(e.getImage().endsWith("deeplearning") || e.getImage().endsWith("tensor"));
+    }
+
+    /**
+     * Return the image name without suffix version.
+     *
+     * @param imageName the name of image.
+     */
+    private String getSimpleImageName(String imageName) {
+        int separatorIndex = imageName.indexOf(':');
+        return (separatorIndex > 0 ? imageName.substring(0, separatorIndex) : imageName);
+    }
+
+    /**
+     * Wraps metadata with limits
+     *
+     * @param metadataDTO   metadata
+     * @param cloudProvider cloudProvider
+     * @return wrapped object
+     */
+
+    private FullComputationalTemplate fullComputationalTemplate(ComputationalMetadataDTO metadataDTO,
+                                                                CloudProvider cloudProvider, String projectName) {
+
+        DataEngineType dataEngineType = DataEngineType.fromDockerImageName(metadataDTO.getImage());
+        addGpu(metadataDTO, projectName);
+        if (dataEngineType == DataEngineType.CLOUD_SERVICE) {
+            return getCloudFullComputationalTemplate(metadataDTO, cloudProvider);
+        } else if (dataEngineType == DataEngineType.SPARK_STANDALONE) {
+            return new SparkFullComputationalTemplate(metadataDTO,
+                    SparkStandaloneConfiguration.builder()
+                            .maxSparkInstanceCount(configuration.getMaxSparkInstanceCount())
+                            .minSparkInstanceCount(configuration.getMinSparkInstanceCount())
+                            .build());
+        } else {
+            throw new IllegalArgumentException("Unknown data engine " + dataEngineType);
+        }
+    }
+
+    private void addGpu(ImageMetadataDTO e, String projectName) {
+        log.info("Trying to read GPU from DB for {}", projectName);
+        try {
+            if (e instanceof ExploratoryMetadataDTO) {
+                gpuDAO.getGPUByProjectName(projectName).ifPresent(edgeGPU ->
+                        ((ExploratoryMetadataDTO) e).setComputationGPU(edgeGPU.getGpus()));
+            } else
+                gpuDAO.getGPUByProjectName(projectName).ifPresent(edgeGPU ->
+                        ((ComputationalMetadataDTO) e).setComputationGPU(edgeGPU.getGpus()));
+        } catch (Exception ex) {
+            log.info(ex.getMessage());
+        }
+    }
+
+
+    private static class AwsFullComputationalTemplate extends FullComputationalTemplate {
+        @JsonProperty("limits")
+        private AwsEmrConfiguration awsEmrConfiguration;
+
+        AwsFullComputationalTemplate(ComputationalMetadataDTO metadataDTO,
+                                     AwsEmrConfiguration awsEmrConfiguration) {
+            super(metadataDTO);
+            this.awsEmrConfiguration = awsEmrConfiguration;
+        }
+    }
+
+    private static class GcpFullComputationalTemplate extends FullComputationalTemplate {
+        @JsonProperty("limits")
+        private GcpDataprocConfiguration gcpDataprocConfiguration;
+
+        GcpFullComputationalTemplate(ComputationalMetadataDTO metadataDTO,
+                                     GcpDataprocConfiguration gcpDataprocConfiguration) {
+            super(metadataDTO);
+            this.gcpDataprocConfiguration = gcpDataprocConfiguration;
+        }
+    }
+
+    private static class SparkFullComputationalTemplate extends FullComputationalTemplate {
+        @JsonProperty("limits")
+        private SparkStandaloneConfiguration sparkStandaloneConfiguration;
+
+        SparkFullComputationalTemplate(ComputationalMetadataDTO metadataDTO,
+                                       SparkStandaloneConfiguration sparkStandaloneConfiguration) {
+            super(metadataDTO);
+            this.sparkStandaloneConfiguration = sparkStandaloneConfiguration;
+        }
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/LibraryServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/LibraryServiceImpl.java
new file mode 100644
index 0000000..9ee95f2
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/LibraryServiceImpl.java
@@ -0,0 +1,293 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.*;
+import com.epam.datalab.backendapi.dao.BaseDAO;
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryLibDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.NotebookTemplate;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.resources.dto.LibInfoRecord;
+import com.epam.datalab.backendapi.resources.dto.LibKey;
+import com.epam.datalab.backendapi.resources.dto.LibraryStatus;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.LibraryService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.LibraryGroups;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.dto.exploratory.LibInstallDTO;
+import com.epam.datalab.dto.exploratory.LibStatus;
+import com.epam.datalab.dto.exploratory.LibraryInstallDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.model.library.Library;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ComputationalAPI;
+import com.epam.datalab.rest.contracts.ExploratoryAPI;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.bson.Document;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.INSTALL_LIBS;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.COMPUTE;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.NOTEBOOK;
+import static com.epam.datalab.backendapi.domain.NotebookTemplate.*;
+import static com.epam.datalab.dto.LibraryGroups.*;
+
+
+@Slf4j
+@Singleton
+public class LibraryServiceImpl implements LibraryService {
+    private static final String COMPUTATIONAL_NOT_FOUND_MSG = "Computational with name %s was not found";
+    private static final String LIB_ALREADY_INSTALLED = "Library %s is already installing";
+
+    private final ExploratoryDAO exploratoryDAO;
+    private final ExploratoryLibDAO libraryDAO;
+    private final RequestBuilder requestBuilder;
+    private final RESTService provisioningService;
+    private final RequestId requestId;
+    private final EndpointService endpointService;
+
+    @Inject
+    public LibraryServiceImpl(ExploratoryDAO exploratoryDAO, ExploratoryLibDAO libraryDAO, RequestBuilder requestBuilder,
+                              @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
+                              RequestId requestId, EndpointService endpointService, ComputationalDAO computationalDAO) {
+        this.exploratoryDAO = exploratoryDAO;
+        this.libraryDAO = libraryDAO;
+        this.requestBuilder = requestBuilder;
+        this.provisioningService = provisioningService;
+        this.requestId = requestId;
+        this.endpointService = endpointService;
+    }
+
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public List<Document> getLibs(String user, String project, String exploratoryName, String computationalName) {
+        if (StringUtils.isEmpty(computationalName)) {
+            return (List<Document>) libraryDAO.findExploratoryLibraries(user, project, exploratoryName)
+                    .getOrDefault(ExploratoryLibDAO.EXPLORATORY_LIBS, new ArrayList<>());
+        } else {
+            Document document = (Document) libraryDAO.findComputationalLibraries(user, project,
+                    exploratoryName, computationalName)
+                    .getOrDefault(ExploratoryLibDAO.COMPUTATIONAL_LIBS, new Document());
+            return (List<Document>) document.getOrDefault(computationalName, new ArrayList<>());
+        }
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public List<LibInfoRecord> getLibInfo(String user, String project, String exploratoryName) {
+        Document document = libraryDAO.findAllLibraries(user, project, exploratoryName);
+
+        Map<LibKey, List<LibraryStatus>> model = new LinkedHashMap<>();
+        if (document.get(ExploratoryLibDAO.EXPLORATORY_LIBS) != null) {
+            List<Document> exploratoryLibs = (List<Document>) document.get(ExploratoryLibDAO.EXPLORATORY_LIBS);
+            exploratoryLibs.forEach(e -> populateModel(exploratoryName, e, model, "notebook"));
+        }
+        if (document.get(ExploratoryLibDAO.COMPUTATIONAL_LIBS) != null) {
+            Document computationalLibs = getLibsOfActiveComputationalResources(document);
+            populateComputational(computationalLibs, model, "cluster");
+        }
+
+        LinkedList<LibInfoRecord> libInfoRecords = new LinkedList<>();
+        for (Map.Entry<LibKey, List<LibraryStatus>> entry : model.entrySet()) {
+            libInfoRecords.addFirst(new LibInfoRecord(entry.getKey(), entry.getValue()));
+        }
+
+        return libInfoRecords;
+    }
+
+    @Audit(action = INSTALL_LIBS, type = COMPUTE)
+    @Override
+    public String installComputationalLibs(@User UserInfo ui, @Project String project, String expName, @ResourceName String compName,
+                                           List<LibInstallDTO> libs, @Info String auditInfo) {
+        final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(ui.getName(), project, expName, compName);
+        EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
+        final String uuid = provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_LIB_INSTALL,
+                ui.getAccessToken(),
+                toComputationalLibraryInstallDto(ui, project, expName, compName, libs, userInstance, endpointDTO),
+                String.class);
+        requestId.put(ui.getName(), uuid);
+        return uuid;
+    }
+
+    @Audit(action = INSTALL_LIBS, type = NOTEBOOK)
+    @Override
+    public String installExploratoryLibs(@User UserInfo ui, @Project String project, @ResourceName String expName, List<LibInstallDTO> libs, @Info String auditInfo) {
+        final UserInstanceDTO userInstance = exploratoryDAO.fetchRunningExploratoryFields(ui.getName(), project, expName);
+        EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
+        final String uuid = provisioningService.post(endpointDTO.getUrl() + ExploratoryAPI.EXPLORATORY_LIB_INSTALL,
+                ui.getAccessToken(), toExploratoryLibraryInstallDto(ui, project, expName, libs, userInstance, endpointDTO),
+                String.class);
+        requestId.put(ui.getName(), uuid);
+        return uuid;
+    }
+
+    @Override
+    public List<String> getExploratoryLibGroups(UserInfo userInfo, String projectName, String exploratoryName) {
+        UserInstanceDTO userInstanceDTO = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), projectName, exploratoryName);
+        final String templateName = userInstanceDTO.getTemplateName();
+        List<LibraryGroups> groups = new ArrayList<>(Arrays.asList(GROUP_PIP3, GROUP_OTHERS, GROUP_OS_PKG));
+
+        if (isTemplateGroup(templateName, Stream.of(JUPYTER, ZEPPELIN))) {
+            groups.addAll(Arrays.asList(GROUP_R_PKG, GROUP_JAVA));
+        }
+        if (isTemplateGroup(templateName, Stream.of(DEEP_LEARNING, TENSOR))) {
+            groups.add(GROUP_JAVA);
+        }
+        if (isTemplateGroup(templateName, Stream.of(RSTUDIO, TENSOR_RSTUDIO))) {
+            groups.add(GROUP_R_PKG);
+        }
+        if (isTemplateGroup(templateName, Stream.of(DEEP_LEARNING_GCP, TENSOR_GCP))) {
+            groups.add(GROUP_JAVA);
+        }
+
+        return groups
+                .stream()
+                .map(LibraryGroups::toString)
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<String> getComputeLibGroups() {
+        return Stream.of(GROUP_PIP3, GROUP_OTHERS, GROUP_R_PKG, GROUP_OS_PKG, GROUP_JAVA)
+                .map(LibraryGroups::toString)
+                .collect(Collectors.toList());
+    }
+
+    private boolean isTemplateGroup(String templateName, Stream<NotebookTemplate> templateStream) {
+        return templateStream
+                .map(NotebookTemplate::getName)
+                .anyMatch(name -> name.equals(templateName));
+    }
+
+    private LibraryInstallDTO toExploratoryLibraryInstallDto(UserInfo userInfo, String project, String exploratoryName,
+                                                             List<LibInstallDTO> libs, UserInstanceDTO userInstance, EndpointDTO endpointDTO) {
+        final List<LibInstallDTO> libsToInstall = libs.stream()
+                .map(lib -> toLibInstallDto(lib, libraryDAO.getLibrary(userInfo.getName(), project, exploratoryName,
+                        lib.getGroup(), lib.getName())))
+                .peek(l -> libraryDAO.addLibrary(userInfo.getName(), project, exploratoryName, l, l.isOverride()))
+                .collect(Collectors.toList());
+        return requestBuilder.newLibInstall(userInfo, userInstance, endpointDTO, libsToInstall);
+    }
+
+    private LibraryInstallDTO toComputationalLibraryInstallDto(UserInfo userInfo, String project, String expName,
+                                                               String compName, List<LibInstallDTO> libs,
+                                                               UserInstanceDTO userInstance, EndpointDTO endpointDTO) {
+
+        final UserComputationalResource computationalResource = getComputationalResource(compName, userInstance);
+        final List<LibInstallDTO> libsToInstall = libs.stream()
+                .map(lib -> toLibInstallDto(lib, libraryDAO.getLibrary(userInfo.getName(), project,
+                        expName, compName, lib.getGroup(), lib.getName())))
+                .peek(l -> libraryDAO.addLibrary(userInfo.getName(), project, expName, compName,
+                        l, l.isOverride()))
+                .collect(Collectors.toList());
+        return requestBuilder.newLibInstall(userInfo, userInstance, computationalResource, libsToInstall, endpointDTO);
+    }
+
+    private UserComputationalResource getComputationalResource(String computationalName,
+                                                               UserInstanceDTO userInstance) {
+        return userInstance.getResources()
+                .stream()
+                .filter(computational -> computational.getComputationalName().equals(computationalName))
+                .findAny()
+                .orElseThrow(() -> new DatalabException(String.format(COMPUTATIONAL_NOT_FOUND_MSG, computationalName)));
+    }
+
+    private LibInstallDTO toLibInstallDto(LibInstallDTO lib, Library existingLibrary) {
+        final LibInstallDTO l = new LibInstallDTO(lib.getGroup(), lib.getName(), lib.getVersion());
+        l.setStatus(LibStatus.INSTALLING.toString());
+        l.setOverride(shouldOverride(existingLibrary));
+        return l;
+    }
+
+    private boolean shouldOverride(Library library) {
+        if (Objects.nonNull(library) && library.getStatus() == LibStatus.INSTALLING) {
+            throw new DatalabException(String.format(LIB_ALREADY_INSTALLED, library.getName()));
+        } else {
+            return Objects.nonNull(library);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private Document getLibsOfActiveComputationalResources(Document document) {
+        Document computationalLibs = (Document) document.get(ExploratoryLibDAO.COMPUTATIONAL_LIBS);
+
+        if (document.get(ExploratoryDAO.COMPUTATIONAL_RESOURCES) != null) {
+            List<Document> computationalResources = (List<Document>) document.get(ExploratoryDAO
+                    .COMPUTATIONAL_RESOURCES);
+
+            Set<String> terminated = computationalResources.stream()
+                    .filter(doc -> doc.getString(BaseDAO.STATUS).equalsIgnoreCase(UserInstanceStatus.TERMINATED
+                            .toString()))
+                    .map(doc -> doc.getString("computational_name")).collect(Collectors.toSet());
+
+            terminated.forEach(computationalLibs::remove);
+        }
+
+        return computationalLibs;
+    }
+
+
+    private void populateModel(String exploratoryName, Document document, Map<LibKey, List<LibraryStatus>> model,
+                               String resourceType) {
+        String name = document.getString(ExploratoryLibDAO.LIB_NAME);
+        String version = document.getString(ExploratoryLibDAO.LIB_VERSION);
+        String group = document.getString(ExploratoryLibDAO.LIB_GROUP);
+        String status = document.getString(ExploratoryLibDAO.STATUS);
+        List<String> availableVersions = (List<String>) document.get(ExploratoryLibDAO.LIB_AVAILABLE_VERSION);
+        List<String> addedPackages = (List<String>) document.get(ExploratoryLibDAO.LIB_ADDED_PACKAGES);
+        String error = document.getString(ExploratoryLibDAO.ERROR_MESSAGE);
+
+        LibKey libKey = new LibKey(name, version, group);
+        List<LibraryStatus> statuses = model.getOrDefault(libKey, new ArrayList<>());
+
+        if (statuses.isEmpty()) {
+            model.put(libKey, statuses);
+        }
+
+        statuses.add(new LibraryStatus(exploratoryName, resourceType, status, error, availableVersions, addedPackages));
+    }
+
+    @SuppressWarnings("unchecked")
+    private void populateComputational(Document computationalLibs, Map<LibKey, List<LibraryStatus>> model, String
+            resourceType) {
+        for (Map.Entry<String, Object> entry : computationalLibs.entrySet()) {
+            if (entry.getValue() != null) {
+                List<Document> docs = (List<Document>) entry.getValue();
+                docs.forEach(e -> populateModel(entry.getKey(), e, model, resourceType));
+            }
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/MavenCentralLibraryService.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/MavenCentralLibraryService.java
new file mode 100644
index 0000000..26569cc
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/MavenCentralLibraryService.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.domain.MavenSearchArtifactResponse;
+import com.epam.datalab.backendapi.resources.dto.LibraryDTO;
+import com.epam.datalab.backendapi.service.ExternalLibraryService;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.inject.Inject;
+import java.net.URI;
+
+import static java.lang.String.join;
+
+@Singleton
+@Slf4j
+public class MavenCentralLibraryService implements ExternalLibraryService {
+
+    private static final String QUOTE_ENCODED = "%22";
+    private static final String SEARCH_API_QUERY_FORMAT = "/solrsearch/select?q=%s&rows=20&wt=json&core=gav&p=jar";
+    private static final String LIB_NOT_FOUND_MSG = "No matches found";
+    private final RESTService restClient;
+
+    @Inject
+    public MavenCentralLibraryService(@Named(ServiceConsts.MAVEN_SEARCH_API) RESTService restClient) {
+        this.restClient = restClient;
+    }
+
+    @Override
+    public LibraryDTO getLibrary(String groupId, String artifactId, String version) {
+        return getMavenLibrary(groupId, artifactId, version);
+
+    }
+
+    private LibraryDTO getMavenLibrary(String groupId, String artifactId, String version) {
+        final String query = and(artifactQuery(artifactId), groupQuery(groupId), versionQuery(version), jarOrBundlePackage());
+        return restClient.get(URI.create(String.format(SEARCH_API_QUERY_FORMAT, query)),
+                MavenSearchArtifactResponse.class)
+                .getArtifacts()
+                .stream()
+                .findFirst()
+                .map(artifact -> new LibraryDTO(join(":", groupId, artifactId), version))
+                .orElseThrow(() -> new ResourceNotFoundException(LIB_NOT_FOUND_MSG));
+    }
+
+    private String groupQuery(String groupId) {
+        return "g:" + QUOTE_ENCODED + groupId + QUOTE_ENCODED;
+    }
+
+    private String artifactQuery(String artifactId) {
+        return "a:" + QUOTE_ENCODED + artifactId + QUOTE_ENCODED;
+    }
+
+    private String versionQuery(String version) {
+        return "v:" + QUOTE_ENCODED + version + QUOTE_ENCODED;
+    }
+
+    private String jarOrBundlePackage() {
+        return "(p:" + QUOTE_ENCODED + "jar" + QUOTE_ENCODED + "%20OR%20p:" + QUOTE_ENCODED + "bundle" + QUOTE_ENCODED + ")";
+    }
+
+    private String and(String... strings) {
+        return join("+AND+", strings);
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImpl.java
new file mode 100644
index 0000000..a581811
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImpl.java
@@ -0,0 +1,203 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.BudgetLimited;
+import com.epam.datalab.backendapi.annotation.Project;
+import com.epam.datalab.backendapi.dao.OdahuDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.OdahuCreateDTO;
+import com.epam.datalab.backendapi.domain.OdahuDTO;
+import com.epam.datalab.backendapi.domain.OdahuFieldsDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.OdahuService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.odahu.OdahuResult;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceConflictException;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+import static com.epam.datalab.dto.UserInstanceStatus.CONFIGURING;
+import static com.epam.datalab.dto.UserInstanceStatus.CREATING;
+import static com.epam.datalab.dto.UserInstanceStatus.FAILED;
+import static com.epam.datalab.dto.UserInstanceStatus.RUNNING;
+import static com.epam.datalab.dto.UserInstanceStatus.STARTING;
+import static com.epam.datalab.dto.UserInstanceStatus.STOPPED;
+import static com.epam.datalab.dto.UserInstanceStatus.STOPPING;
+import static com.epam.datalab.dto.UserInstanceStatus.TERMINATING;
+
+@Slf4j
+public class OdahuServiceImpl implements OdahuService {
+
+	private static final String CREATE_ODAHU_API = "infrastructure/odahu";
+	private static final String START_ODAHU_API = "infrastructure/odahu/start";
+	private static final String STOP_ODAHU_API = "infrastructure/odahu/stop";
+	private static final String TERMINATE_ODAHU_API = "infrastructure/odahu/terminate";
+
+	private final ProjectService projectService;
+	private final EndpointService endpointService;
+	private final OdahuDAO odahuDAO;
+	private final RESTService provisioningService;
+	private final RequestBuilder requestBuilder;
+	private final RequestId requestId;
+
+	@Inject
+	public OdahuServiceImpl(ProjectService projectService, EndpointService endpointService, OdahuDAO odahuDAO,
+	                        @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
+	                        RequestBuilder requestBuilder, RequestId requestId) {
+		this.projectService = projectService;
+		this.endpointService = endpointService;
+		this.odahuDAO = odahuDAO;
+		this.provisioningService = provisioningService;
+		this.requestBuilder = requestBuilder;
+		this.requestId = requestId;
+	}
+
+
+	@Override
+	public List<OdahuDTO> findOdahu() {
+		return odahuDAO.findOdahuClusters();
+	}
+
+	@Override
+	public Optional<OdahuDTO> get(String project, String endpoint) {
+		return odahuDAO.getByProjectEndpoint(project, endpoint);
+	}
+
+	@BudgetLimited
+	@Override
+	public void create(@Project String project, OdahuCreateDTO odahuCreateDTO, UserInfo user) {
+		log.info("Trying to create odahu cluster for project: " + project);
+		final boolean activeCluster = odahuDAO.findOdahuClusters(odahuCreateDTO.getProject(), odahuCreateDTO.getEndpoint()).stream()
+				.anyMatch(o -> Arrays.asList(CREATING, RUNNING, STARTING, STOPPING, STOPPED, CONFIGURING, TERMINATING).contains(o.getStatus()));
+		if (activeCluster) {
+			throw new ResourceConflictException(String.format("Odahu cluster already exist in system for project %s " +
+					"and endpoint %s", odahuCreateDTO.getProject(), odahuCreateDTO.getEndpoint()));
+		}
+		ProjectDTO projectDTO = projectService.get(project);
+		boolean isAdded = odahuDAO.create(new OdahuDTO(odahuCreateDTO.getName(), odahuCreateDTO.getProject(),
+				odahuCreateDTO.getEndpoint(), CREATING, getTags(odahuCreateDTO)));
+		if (isAdded) {
+			String url = null;
+			EndpointDTO endpointDTO = endpointService.get(odahuCreateDTO.getEndpoint());
+			try {
+				url = endpointDTO.getUrl() + CREATE_ODAHU_API;
+				String uuid =
+						provisioningService.post(url, user.getAccessToken(),
+								requestBuilder.newOdahuCreate(user.getName(), odahuCreateDTO, projectDTO, endpointDTO), String.class);
+				requestId.put(user.getName(), uuid);
+			} catch (Exception e) {
+				log.error("Can not perform {} due to: {}, {}", url, e.getMessage(), e);
+				odahuDAO.updateStatus(odahuCreateDTO.getName(), odahuCreateDTO.getProject(), odahuCreateDTO.getEndpoint(), FAILED);
+			}
+		} else {
+			throw new DatalabException(String.format("The odahu fields of the %s can not be updated in DB.", project));
+		}
+	}
+
+	@BudgetLimited
+	@Override
+	public void start(String name, @Project String project, String endpoint, UserInfo user) {
+		log.info("Trying to start odahu cluster for project: " + project);
+		odahuDAO.updateStatus(name, project, endpoint, STARTING);
+		actionOnCloud(user, START_ODAHU_API, name, project, endpoint);
+	}
+
+	@Override
+	public void stop(String name, String project, String endpoint, UserInfo user) {
+		log.info("Trying to stop odahu cluster for project: " + project);
+		odahuDAO.updateStatus(name, project, endpoint, STOPPING);
+		actionOnCloud(user, STOP_ODAHU_API, name, project, endpoint);
+	}
+
+	@Override
+	public void terminate(String name, String project, String endpoint, UserInfo user) {
+		log.info("Trying to terminate odahu cluster for project: " + project);
+		odahuDAO.findOdahuClusters(project, endpoint).stream()
+				.filter(odahuDTO -> name.equals(odahuDTO.getName())
+						&& !odahuDTO.getStatus().equals(FAILED))
+				.forEach(odahuDTO -> {
+					if (RUNNING == odahuDTO.getStatus()) {
+						odahuDAO.updateStatus(name, project, endpoint, TERMINATING);
+						actionOnCloud(user, TERMINATE_ODAHU_API, name, project, endpoint);
+					} else {
+						log.error("Cannot terminate odahu cluster {}", odahuDTO);
+						throw new DatalabException(String.format("Cannot terminate odahu cluster %s", odahuDTO));
+					}
+				});
+	}
+
+	@Override
+	public void updateStatus(OdahuResult result, UserInstanceStatus status) {
+		if (Objects.nonNull(result.getResourceUrls()) && !result.getResourceUrls().isEmpty()) {
+			odahuDAO.updateStatusAndUrls(result, status);
+		} else {
+			odahuDAO.updateStatus(result.getName(), result.getProjectName(), result.getEndpointName(), status);
+		}
+	}
+
+	@Override
+	public boolean inProgress(String project, String endpoint) {
+		return get(project, endpoint)
+				.filter(odahu -> Arrays.asList(CREATING, STARTING, STOPPING, TERMINATING).contains(odahu.getStatus()))
+				.isPresent();
+	}
+
+	private void actionOnCloud(UserInfo user, String uri, String name, String project, String endpoint) {
+		String url = null;
+		EndpointDTO endpointDTO = endpointService.get(endpoint);
+		ProjectDTO projectDTO = projectService.get(project);
+		try {
+			OdahuFieldsDTO fields = odahuDAO.getFields(name, project, endpoint);
+			url = endpointDTO.getUrl() + uri;
+			String uuid =
+					provisioningService.post(url, user.getAccessToken(),
+							requestBuilder.newOdahuAction(user.getName(), name, projectDTO, endpointDTO, fields), String.class);
+			requestId.put(user.getName(), uuid);
+		} catch (Exception e) {
+			log.error("Can not perform {} due to: {}, {}", url, e.getMessage(), e);
+			odahuDAO.updateStatus(name, project, project, FAILED);
+		}
+	}
+
+	private Map<String, String> getTags(OdahuCreateDTO odahuCreateDTO) {
+		Map<String, String> tags = new HashMap<>();
+		tags.put("custom_tag", odahuCreateDTO.getCustomTag());
+		tags.put("project_tag", odahuCreateDTO.getProject());
+		tags.put("endpoint_tag", odahuCreateDTO.getEndpoint());
+		return tags;
+	}
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
new file mode 100644
index 0000000..4df5d92
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ProjectServiceImpl.java
@@ -0,0 +1,404 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.*;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.ProjectDAO;
+import com.epam.datalab.backendapi.dao.UserGroupDAO;
+import com.epam.datalab.backendapi.domain.*;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.backendapi.service.OdahuService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.constants.ServiceConsts;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.exceptions.ResourceConflictException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.*;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.*;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.EDGE_NODE;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.PROJECT;
+import static java.util.stream.Collectors.toSet;
+import static java.util.stream.Stream.concat;
+
+@Slf4j
+public class ProjectServiceImpl implements ProjectService {
+
+    private static final String CREATE_PRJ_API = "infrastructure/project/create";
+    private static final String TERMINATE_PRJ_API = "infrastructure/project/terminate";
+    private static final String START_PRJ_API = "infrastructure/project/start";
+    private static final String STOP_PRJ_API = "infrastructure/project/stop";
+    private static final String RECREATE_PRJ_API = "infrastructure/project/recreate";
+    private static final String STOP_ACTION = "stop";
+    private static final String TERMINATE_ACTION = "terminate";
+    private static final String TOTAL_BUDGET_PERIOD = "Total";
+    private static final String MONTHLY_BUDGET_PERIOD = "Monthly";
+
+    private static final String AUDIT_ADD_ENDPOINT = "Add endpoint(s): %s\n";
+    private static final String AUDIT_ADD_GROUP = "Add group(s): %s\n";
+    private static final String AUDIT_REMOVE_GROUP = "Remove group(s): %s\n";
+    private static final String AUDIT_UPDATE_BUDGET = "Update quota: %d->%d\nUpdate period: %s->%s";
+    private static final String AUDIT_ADD_EDGE_NODE = "Create edge node for endpoint %s, requested in project %s";
+    private static final String AUDIT_RECREATE_EDGE_NODE = "Recreate edge node for endpoint %s, requested in project %s";
+
+    private final ProjectDAO projectDAO;
+    private final UserGroupDAO userGroupDAO;
+    private final ExploratoryDAO exploratoryDAO;
+    private final ExploratoryService exploratoryService;
+    private final RESTService provisioningService;
+    private final EndpointService endpointService;
+    private final RequestId requestId;
+    private final RequestBuilder requestBuilder;
+    private final SelfServiceApplicationConfiguration configuration;
+    private final OdahuService odahuService;
+
+
+    @Inject
+    public ProjectServiceImpl(ProjectDAO projectDAO, ExploratoryService exploratoryService,
+                              UserGroupDAO userGroupDAO,
+                              @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
+                              RequestId requestId, RequestBuilder requestBuilder, EndpointService endpointService,
+                              ExploratoryDAO exploratoryDAO, SelfServiceApplicationConfiguration configuration,
+                              OdahuService odahuService) {
+        this.projectDAO = projectDAO;
+        this.exploratoryService = exploratoryService;
+        this.userGroupDAO = userGroupDAO;
+        this.provisioningService = provisioningService;
+        this.requestId = requestId;
+        this.requestBuilder = requestBuilder;
+        this.endpointService = endpointService;
+        this.exploratoryDAO = exploratoryDAO;
+        this.configuration = configuration;
+        this.odahuService = odahuService;
+    }
+
+    @Override
+    public List<ProjectDTO> getProjects() {
+        return projectDAO.getProjects();
+    }
+
+    @Override
+    public List<ProjectDTO> getProjects(UserInfo user) {
+        return projectDAO.getProjects()
+                .stream()
+                .filter(project -> UserRoles.isProjectAdmin(user, project.getGroups()) || UserRoles.isAdmin(user))
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<ProjectDTO> getUserProjects(UserInfo userInfo, boolean active) {
+        return projectDAO.getUserProjects(userInfo, active);
+    }
+
+    @Override
+    public List<ProjectDTO> getProjectsByEndpoint(String endpointName) {
+        return projectDAO.getProjectsByEndpoint(endpointName);
+    }
+
+    @Override
+    public void create(UserInfo user, ProjectDTO projectDTO, String projectName) {
+        if (!projectDAO.get(projectDTO.getName()).isPresent()) {
+            projectDAO.create(projectDTO);
+            createProjectOnCloud(user, projectDTO);
+        } else {
+            throw new ResourceConflictException("Project with passed name already exist in system");
+        }
+    }
+
+    @BudgetLimited
+    @Override
+    public void recreate(UserInfo userInfo, String endpoint, @Project String name) {
+        projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.CREATING);
+        recreateEndpoint(userInfo, get(name), endpoint, name, String.format(AUDIT_RECREATE_EDGE_NODE, endpoint, name));
+    }
+
+    @Override
+    public ProjectDTO get(String name) {
+        return projectDAO.get(name)
+                .orElseThrow(projectNotFound());
+    }
+
+    @Audit(action = TERMINATE, type = EDGE_NODE)
+    @Override
+    public void terminateEndpoint(@User UserInfo userInfo, @ResourceName String endpoint, @Project String name) {
+        projectActionOnCloud(userInfo, name, TERMINATE_PRJ_API, endpoint);
+        projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.TERMINATING);
+        exploratoryService.updateProjectExploratoryStatuses(userInfo, name, endpoint, UserInstanceStatus.TERMINATING);
+        odahuService.get(name, endpoint)
+                .filter(o -> UserInstanceStatus.RUNNING == o.getStatus())
+                .ifPresent(odahu -> odahuService.terminate(odahu.getName(), name, endpoint, userInfo));
+    }
+
+    @ProjectAdmin
+    @Override
+    public void terminateEndpoint(@User UserInfo userInfo, List<String> endpoints, @Project String name) {
+        List<ProjectEndpointDTO> endpointDTOs = getProjectEndpointDTOS(endpoints, name);
+        checkProjectRelatedResourcesInProgress(name, endpointDTOs, TERMINATE_ACTION);
+        endpoints.forEach(endpoint -> terminateEndpoint(userInfo, endpoint, name));
+    }
+
+    @BudgetLimited
+    @Audit(action = START, type = EDGE_NODE)
+    @Override
+    public void start(@User UserInfo userInfo, @ResourceName String endpoint, @Project String name) {
+        projectActionOnCloud(userInfo, name, START_PRJ_API, endpoint);
+        projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.STARTING);
+    }
+
+    @ProjectAdmin
+    @Override
+    public void start(@User UserInfo userInfo, List<String> endpoints, @Project String name) {
+        endpoints.forEach(endpoint -> start(userInfo, endpoint, name));
+    }
+
+    @Audit(action = STOP, type = EDGE_NODE)
+    @Override
+    public void stop(@User UserInfo userInfo, @ResourceName String endpoint, @Project String name, @Info String auditInfo) {
+        projectActionOnCloud(userInfo, name, STOP_PRJ_API, endpoint);
+        projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.STOPPING);
+    }
+
+    @ProjectAdmin
+    @Override
+    public void stopWithResources(@User UserInfo userInfo, List<String> endpoints,
+                                  @ResourceName @Project String projectName) {
+        List<ProjectEndpointDTO> endpointDTOs = getProjectEndpointDTOS(endpoints, projectName);
+        checkProjectRelatedResourcesInProgress(projectName, endpointDTOs, STOP_ACTION);
+
+        endpointDTOs
+                .stream()
+                .filter(e -> !Arrays.asList(UserInstanceStatus.TERMINATED, UserInstanceStatus.TERMINATING, UserInstanceStatus.STOPPED,
+                        UserInstanceStatus.FAILED).contains(e.getStatus()))
+                .forEach(e -> stop(userInfo, e.getName(), projectName, null));
+
+        exploratoryDAO.fetchRunningExploratoryFieldsForProject(projectName,
+                endpointDTOs
+                        .stream()
+                        .map(ProjectEndpointDTO::getName)
+                        .collect(Collectors.toList()))
+                .forEach(e -> exploratoryService.stop(userInfo, e.getUser(), projectName, e.getExploratoryName(), null));
+    }
+
+    @ProjectAdmin
+    @Override
+    public void update(@User UserInfo userInfo, UpdateProjectDTO projectDTO, @Project String projectName) {
+        final ProjectDTO project = projectDAO.get(projectDTO.getName()).orElseThrow(projectNotFound());
+        final Set<String> endpoints = project.getEndpoints()
+                .stream()
+                .map(ProjectEndpointDTO::getName)
+                .collect(toSet());
+        final Set<String> newEndpoints = new HashSet<>(projectDTO.getEndpoints());
+        newEndpoints.removeAll(endpoints);
+        final String projectUpdateAudit = updateProjectAudit(projectDTO, project, newEndpoints);
+        updateProject(userInfo, projectName, projectDTO, project, newEndpoints, projectUpdateAudit);
+    }
+
+    @Audit(action = UPDATE, type = PROJECT)
+    public void updateProject(@User UserInfo userInfo, @Project @ResourceName String projectName,
+                              UpdateProjectDTO projectDTO, ProjectDTO project, Set<String> newEndpoints,
+                              @Info String projectAudit) {
+        final List<ProjectEndpointDTO> endpointsToBeCreated = newEndpoints
+                .stream()
+                .map(e -> new ProjectEndpointDTO(e, UserInstanceStatus.CREATING, null))
+                .collect(Collectors.toList());
+        project.getEndpoints().addAll(endpointsToBeCreated);
+        projectDAO.update(new ProjectDTO(project.getName(), projectDTO.getGroups(), project.getKey(),
+                project.getTag(), project.getBudget(), project.getEndpoints(), projectDTO.isSharedImageEnabled()));
+        endpointsToBeCreated.forEach(e -> createEndpoint(userInfo, project, e.getName(), projectName, String.format(AUDIT_ADD_EDGE_NODE, e.getName(), project.getName())));
+    }
+
+    @Override
+    public void updateBudget(UserInfo userInfo, List<UpdateProjectBudgetDTO> dtos) {
+        final List<ProjectDTO> projects = dtos
+                .stream()
+                .map(this::getUpdateProjectDTO)
+                .collect(Collectors.toList());
+
+        projects.forEach(p -> updateBudget(userInfo, p.getName(), p.getBudget(), getUpdateBudgetAudit(p)));
+    }
+
+    @Audit(action = UPDATE, type = PROJECT)
+    public void updateBudget(@User UserInfo userInfo, @Project @ResourceName String name, BudgetDTO budget,
+                             @Info String updateBudgetAudit) {
+        projectDAO.updateBudget(name, budget.getValue(), budget.isMonthlyBudget());
+    }
+
+    @Override
+    public boolean isAnyProjectAssigned(UserInfo userInfo) {
+        final Set<String> userGroups = concat(userInfo.getRoles().stream(),
+                userGroupDAO.getUserGroups(userInfo.getName()).stream())
+                .collect(toSet());
+        return projectDAO.isAnyProjectAssigned(userGroups);
+    }
+
+    @Override
+    public boolean checkExploratoriesAndComputationalProgress(String projectName, List<String> endpoints) {
+        return exploratoryDAO.fetchProjectEndpointExploratoriesWhereStatusIn(projectName, endpoints, Arrays.asList(
+                UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE,
+                UserInstanceStatus.CONFIGURING, UserInstanceStatus.RECONFIGURING, UserInstanceStatus.STOPPING,
+                UserInstanceStatus.TERMINATING),
+                UserInstanceStatus.CREATING, UserInstanceStatus.CONFIGURING, UserInstanceStatus.STARTING,
+                UserInstanceStatus.RECONFIGURING, UserInstanceStatus.CREATING_IMAGE, UserInstanceStatus.STOPPING,
+                UserInstanceStatus.TERMINATING).isEmpty();
+    }
+
+    @Audit(action = UPDATE, type = EDGE_NODE)
+    @Override
+    public void updateAfterStatusCheck(@User UserInfo userInfo, @Project String project, @ResourceName String endpoint,
+                                       String instanceID, UserInstanceStatus status, @Info String auditInfo) {
+        projectDAO.updateEdgeStatus(project, endpoint, status);
+    }
+
+    private void createProjectOnCloud(UserInfo user, ProjectDTO project) {
+        try {
+            project.getEndpoints().forEach(e -> createEndpoint(user, project, e.getName(), project.getName(),
+                            String.format(AUDIT_ADD_EDGE_NODE, e.getName(), project.getName())));
+        } catch (Exception e) {
+            log.error("Can not create project due to: {}", e.getMessage(), e);
+            projectDAO.updateStatus(project.getName(), ProjectDTO.Status.FAILED);
+        }
+    }
+
+    @Audit(action = CREATE, type = EDGE_NODE)
+    public void createEndpoint(@User UserInfo user, ProjectDTO projectDTO, @ResourceName String endpointName,
+                               @Project String projectName, @Info String auditInfo) {
+        createEdgeNode(user, projectDTO, endpointName, CREATE_PRJ_API);
+    }
+
+    @Audit(action = RECREATE, type = EDGE_NODE)
+    public void recreateEndpoint(@User UserInfo user, ProjectDTO projectDTO, @ResourceName String endpointName,
+                                 @Project String projectName, @Info String auditInfo) {
+        createEdgeNode(user, projectDTO, endpointName, RECREATE_PRJ_API);
+    }
+
+    private void createEdgeNode(UserInfo user, ProjectDTO projectDTO, String endpointName, String provisioningApiUri) {
+        EndpointDTO endpointDTO = endpointService.get(endpointName);
+        String uuid = provisioningService.post(endpointDTO.getUrl() + provisioningApiUri, user.getAccessToken(),
+                requestBuilder.newProjectCreate(user, projectDTO, endpointDTO), String.class);
+        requestId.put(user.getName(), uuid);
+    }
+
+    private void projectActionOnCloud(UserInfo user, String projectName, String provisioningApiUri, String endpoint) {
+        try {
+            EndpointDTO endpointDTO = endpointService.get(endpoint);
+            String uuid = provisioningService.post(endpointDTO.getUrl() + provisioningApiUri, user.getAccessToken(),
+                    requestBuilder.newProjectAction(user, projectName, endpointDTO), String.class);
+            requestId.put(user.getName(), uuid);
+        } catch (Exception e) {
+            log.error("Can not post to {} project due to: {}", provisioningApiUri, e.getMessage(), e);
+            projectDAO.updateStatus(projectName, ProjectDTO.Status.FAILED);
+        }
+    }
+
+    private void checkProjectRelatedResourcesInProgress(String projectName, List<ProjectEndpointDTO> endpoints, String action) {
+        boolean edgeAndOdahuProgress = endpoints
+                .stream()
+                .anyMatch(e ->
+                        Arrays.asList(UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.STOPPING,
+                                UserInstanceStatus.TERMINATING).contains(e.getStatus())
+                                || odahuService.inProgress(projectName, e.getName()));
+
+        List<String> endpointNames = endpoints
+                .stream()
+                .map(ProjectEndpointDTO::getName)
+                .collect(Collectors.toList());
+        if (edgeAndOdahuProgress || !checkExploratoriesAndComputationalProgress(projectName, endpointNames)) {
+            throw new ResourceConflictException((String.format("Can not %s environment because one of project " +
+                    "resource is in processing stage", action)));
+        }
+    }
+
+    private String updateProjectAudit(UpdateProjectDTO projectDTO, ProjectDTO project, Set<String> newEndpoints) {
+        if (!configuration.isAuditEnabled()) {
+            return null;
+        }
+        StringBuilder audit = new StringBuilder();
+        final Set<String> newGroups = new HashSet<>(projectDTO.getGroups());
+        newGroups.removeAll(project.getGroups());
+        final Set<String> removedGroups = new HashSet<>(project.getGroups());
+        removedGroups.removeAll(projectDTO.getGroups());
+
+        if (!newEndpoints.isEmpty()) {
+            audit.append(String.format(AUDIT_ADD_ENDPOINT, String.join(", ", newEndpoints)));
+        }
+        if (!newGroups.isEmpty()) {
+            audit.append(String.format(AUDIT_ADD_GROUP, String.join(", ", newGroups)));
+        }
+        if (!removedGroups.isEmpty()) {
+            audit.append(String.format(AUDIT_REMOVE_GROUP, String.join(", ", removedGroups)));
+        }
+        return audit.toString();
+    }
+
+    private String getUpdateBudgetAudit(ProjectDTO p) {
+        if (!configuration.isAuditEnabled()) {
+            return null;
+        }
+        ProjectDTO projectDTO = get(p.getName());
+        Integer value = Optional.ofNullable(projectDTO.getBudget())
+                .map(BudgetDTO::getValue)
+                .orElse(null);
+        Boolean monthlyBudget = Optional.ofNullable(projectDTO.getBudget())
+                .map(BudgetDTO::isMonthlyBudget)
+                .orElse(null);
+        return String.format(AUDIT_UPDATE_BUDGET, value, p.getBudget().getValue(),
+                representBudgetType(monthlyBudget), representBudgetType(p.getBudget().isMonthlyBudget()));
+    }
+
+    private String representBudgetType(Boolean isMonthlyPeriod) {
+        return (isMonthlyPeriod) ? MONTHLY_BUDGET_PERIOD : TOTAL_BUDGET_PERIOD;
+    }
+
+    private List<ProjectEndpointDTO> getProjectEndpointDTOS(List<String> endpoints, @Project String name) {
+        return get(name)
+                .getEndpoints()
+                .stream()
+                .filter(projectEndpointDTO -> endpoints.contains(projectEndpointDTO.getName()))
+                .collect(Collectors.toList());
+    }
+
+    private ProjectDTO getUpdateProjectDTO(UpdateProjectBudgetDTO dto) {
+        BudgetDTO budgetDTO = BudgetDTO.builder()
+                .value(dto.getBudget())
+                .monthlyBudget(dto.isMonthlyBudget())
+                .build();
+        return ProjectDTO.builder()
+                .name(dto.getProject())
+                .budget(budgetDTO)
+                .build();
+    }
+
+    private Supplier<ResourceNotFoundException> projectNotFound() {
+        return () -> new ResourceNotFoundException("Project with passed name not found");
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ReuploadKeyServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ReuploadKeyServiceImpl.java
new file mode 100644
index 0000000..093ac7f
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/ReuploadKeyServiceImpl.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.backendapi.service.ReuploadKeyService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyStatus;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyStatusDTO;
+import com.epam.datalab.model.ResourceData;
+import com.epam.datalab.model.ResourceType;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+
+import static com.epam.datalab.constants.ServiceConsts.PROVISIONING_SERVICE_NAME;
+import static com.epam.datalab.dto.UserInstanceStatus.RUNNING;
+
+@Singleton
+@Slf4j
+public class ReuploadKeyServiceImpl implements ReuploadKeyService {
+
+    @Inject
+    @Named(PROVISIONING_SERVICE_NAME)
+    private RESTService provisioningService;
+    @Inject
+    private RequestBuilder requestBuilder;
+    @Inject
+    private RequestId requestId;
+    @Inject
+    private ExploratoryService exploratoryService;
+    @Inject
+    private ComputationalDAO computationalDAO;
+    @Inject
+    private ExploratoryDAO exploratoryDAO;
+
+    private static final String REUPLOAD_KEY_UPDATE_MSG = "Reuploading key process is successfully finished. " +
+            "Updating 'reupload_key_required' flag to 'false' for {}.";
+    private static final String REUPLOAD_KEY_ERROR_MSG = "Reuploading key process is failed for {}. The next attempt" +
+            "starts after resource restarting.";
+
+    @Override
+    public void updateResourceData(ReuploadKeyStatusDTO dto) {
+        String user = dto.getUser();
+        ResourceData resource = dto.getReuploadKeyCallbackDTO().getResource();
+        log.debug("Updating resource {} to status RUNNING...", resource.toString());
+        updateResourceStatus(user, null, resource, RUNNING);
+        if (dto.getReuploadKeyStatus() == ReuploadKeyStatus.COMPLETED) {
+            log.debug(REUPLOAD_KEY_UPDATE_MSG, resource.toString());
+            updateResourceReuploadKeyFlag(user, null, resource, false);
+        } else {
+            log.error(REUPLOAD_KEY_ERROR_MSG, resource.toString());
+        }
+    }
+
+    private void updateResourceStatus(String user, String project, ResourceData resourceData, UserInstanceStatus newStatus) {
+        if (resourceData.getResourceType() == ResourceType.EXPLORATORY) {
+            exploratoryDAO.updateStatusForExploratory(user, project, resourceData.getExploratoryName(), newStatus);
+        } else if (resourceData.getResourceType() == ResourceType.COMPUTATIONAL) {
+            computationalDAO.updateStatusForComputationalResource(user, project,
+                    resourceData.getExploratoryName(), resourceData.getComputationalName(), newStatus);
+        }
+    }
+
+    private void updateResourceReuploadKeyFlag(String user, String project, ResourceData resourceData, boolean reuploadKeyRequired) {
+        if (resourceData.getResourceType() == ResourceType.EXPLORATORY) {
+            exploratoryDAO.updateReuploadKeyForExploratory(user, project, resourceData.getExploratoryName(), reuploadKeyRequired);
+        } else if (resourceData.getResourceType() == ResourceType.COMPUTATIONAL) {
+            computationalDAO.updateReuploadKeyFlagForComputationalResource(user, project,
+                    resourceData.getExploratoryName(), resourceData.getComputationalName(), reuploadKeyRequired);
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/SchedulerJobServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/SchedulerJobServiceImpl.java
new file mode 100644
index 0000000..546a044
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/SchedulerJobServiceImpl.java
@@ -0,0 +1,514 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.Audit;
+import com.epam.datalab.backendapi.annotation.Project;
+import com.epam.datalab.backendapi.annotation.ResourceName;
+import com.epam.datalab.backendapi.annotation.User;
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.dao.EnvDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.SchedulerJobDAO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.ComputationalService;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.backendapi.service.SchedulerJobService;
+import com.epam.datalab.backendapi.service.SecurityService;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.exceptions.ResourceInappropriateStateException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.model.scheduler.SchedulerJobData;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.SET_UP_SCHEDULER;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.COMPUTE;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.NOTEBOOK;
+import static com.epam.datalab.constants.ServiceConsts.PROVISIONING_SERVICE_NAME;
+import static com.epam.datalab.dto.UserInstanceStatus.CONFIGURING;
+import static com.epam.datalab.dto.UserInstanceStatus.CREATING;
+import static com.epam.datalab.dto.UserInstanceStatus.RUNNING;
+import static com.epam.datalab.dto.UserInstanceStatus.STARTING;
+import static com.epam.datalab.dto.UserInstanceStatus.STOPPED;
+import static com.epam.datalab.dto.UserInstanceStatus.STOPPING;
+import static com.epam.datalab.dto.UserInstanceStatus.TERMINATING;
+import static com.epam.datalab.dto.base.DataEngineType.getDockerImageName;
+import static java.time.ZoneId.systemDefault;
+import static java.util.Collections.singletonList;
+import static java.util.Date.from;
+
+@Slf4j
+@Singleton
+public class SchedulerJobServiceImpl implements SchedulerJobService {
+    private static final String SCHEDULER_NOT_FOUND_MSG = "Scheduler job data not found for user %s with exploratory %s";
+    private static final String AUDIT_MESSAGE = "Scheduled action, requested for notebook %s";
+    private static final long ALLOWED_INACTIVITY_MINUTES = 1L;
+
+    @Inject
+    private SchedulerJobDAO schedulerJobDAO;
+
+    @Inject
+    private ExploratoryDAO exploratoryDAO;
+
+    @Inject
+    private ComputationalDAO computationalDAO;
+
+    @Inject
+    private ExploratoryService exploratoryService;
+
+    @Inject
+    private ComputationalService computationalService;
+
+    @Inject
+    private SecurityService securityService;
+
+    @Inject
+    private EnvDAO envDAO;
+
+    @Inject
+    private RequestId requestId;
+
+    @Inject
+    @Named(PROVISIONING_SERVICE_NAME)
+    private RESTService provisioningService;
+
+    @Override
+    public SchedulerJobDTO fetchSchedulerJobForUserAndExploratory(String user, String project, String exploratoryName) {
+        return schedulerJobDAO.fetchSingleSchedulerJobByUserAndExploratory(user, project, exploratoryName)
+                .orElseThrow(() -> new ResourceNotFoundException(String.format(SCHEDULER_NOT_FOUND_MSG, user,
+                        exploratoryName)));
+    }
+
+    @Override
+    public SchedulerJobDTO fetchSchedulerJobForComputationalResource(String user, String project, String exploratoryName,
+                                                                     String computationalName) {
+        return schedulerJobDAO.fetchSingleSchedulerJobForCluster(user, project, exploratoryName, computationalName)
+                .orElseThrow(() -> new ResourceNotFoundException(String.format(SCHEDULER_NOT_FOUND_MSG, user,
+                        exploratoryName) + " with computational resource " + computationalName));
+    }
+
+    @Audit(action = SET_UP_SCHEDULER, type = NOTEBOOK)
+    @Override
+    public void updateExploratorySchedulerData(@User UserInfo user, @Project String project, @ResourceName String exploratoryName, SchedulerJobDTO dto) {
+        validateExploratoryStatus(user.getName(), project, exploratoryName);
+        populateDefaultSchedulerValues(dto);
+        log.debug("Updating exploratory {} for user {} with new scheduler job data: {}...", exploratoryName, user,
+                dto);
+        exploratoryDAO.updateSchedulerDataForUserAndExploratory(user.getName(), project, exploratoryName, dto);
+
+        if (!dto.inactivityScheduler() && dto.isSyncStartRequired()) {
+            shareSchedulerJobDataToSparkClusters(user.getName(), project, exploratoryName, dto);
+        } else if (!dto.inactivityScheduler()) {
+            computationalDAO.updateSchedulerSyncFlag(user.getName(), project, exploratoryName, dto.isSyncStartRequired());
+        }
+    }
+
+    @Audit(action = SET_UP_SCHEDULER, type = COMPUTE)
+    @Override
+    public void updateComputationalSchedulerData(@User UserInfo user, @Project String project, String exploratoryName, @ResourceName String computationalName, SchedulerJobDTO dto) {
+        validateExploratoryStatus(user.getName(), project, exploratoryName);
+        validateComputationalStatus(user.getName(), project, exploratoryName, computationalName);
+        populateDefaultSchedulerValues(dto);
+        log.debug("Updating computational resource {} affiliated with exploratory {} for user {} with new scheduler " +
+                "job data {}...", computationalName, exploratoryName, user, dto);
+        computationalDAO.updateSchedulerDataForComputationalResource(user.getName(), project, exploratoryName, computationalName, dto);
+    }
+
+    @Override
+    public void stopComputationalByScheduler() {
+        getComputationalSchedulersForStopping(OffsetDateTime.now(), true)
+                .forEach(this::stopComputational);
+    }
+
+    @Override
+    public void stopExploratoryByScheduler() {
+        getExploratorySchedulersForStopping(OffsetDateTime.now(), true)
+                .forEach(this::stopExploratory);
+    }
+
+    @Override
+    public void startExploratoryByScheduler() {
+        getExploratorySchedulersForStarting(OffsetDateTime.now())
+                .forEach(this::startExploratory);
+    }
+
+    @Override
+    public void startComputationalByScheduler() {
+        getComputationalSchedulersForStarting(OffsetDateTime.now())
+                .forEach(job -> startSpark(job.getUser(), job.getExploratoryName(), job.getComputationalName(),
+                        job.getProject()));
+    }
+
+    @Override
+    public void terminateExploratoryByScheduler() {
+        getExploratorySchedulersForTerminating(OffsetDateTime.now())
+                .forEach(this::terminateExploratory);
+
+    }
+
+    @Override
+    public void terminateComputationalByScheduler() {
+        getComputationalSchedulersForTerminating(OffsetDateTime.now()).forEach(this::terminateComputational);
+
+    }
+
+    @Override
+    public void removeScheduler(String user, String exploratoryName) {
+        schedulerJobDAO.removeScheduler(user, exploratoryName);
+    }
+
+    @Override
+    public void removeScheduler(String user, String exploratoryName, String computationalName) {
+        schedulerJobDAO.removeScheduler(user, exploratoryName, computationalName);
+    }
+
+    @Override
+    public List<SchedulerJobData> getActiveSchedulers(String user, long minutesOffset) {
+        final OffsetDateTime desiredDateTime = OffsetDateTime.now().plusMinutes(minutesOffset);
+        final Predicate<SchedulerJobData> userPredicate = s -> user.equals(s.getUser());
+        final Stream<SchedulerJobData> computationalSchedulersStream =
+                getComputationalSchedulersForStopping(desiredDateTime)
+                        .stream()
+                        .filter(userPredicate);
+        final Stream<SchedulerJobData> exploratorySchedulersStream =
+                getExploratorySchedulersForStopping(desiredDateTime)
+                        .stream()
+                        .filter(userPredicate);
+        return Stream.concat(computationalSchedulersStream, exploratorySchedulersStream)
+                .collect(Collectors.toList());
+    }
+
+    private void stopComputational(SchedulerJobData job) {
+        final String project = job.getProject();
+        final String expName = job.getExploratoryName();
+        final String compName = job.getComputationalName();
+        final String user = job.getUser();
+        log.debug("Stopping exploratory {} computational {} for user {} by scheduler", expName, compName, user);
+        computationalService.stopSparkCluster(securityService.getServiceAccountInfo(user), user, project, expName, compName, String.format(AUDIT_MESSAGE, expName));
+    }
+
+    private void terminateComputational(SchedulerJobData job) {
+        final String user = job.getUser();
+        final String expName = job.getExploratoryName();
+        final String compName = job.getComputationalName();
+        final UserInfo userInfo = securityService.getServiceAccountInfo(user);
+        log.debug("Terminating exploratory {} computational {} for user {} by scheduler", expName, compName, user);
+        computationalService.terminateComputational(userInfo, user, job.getProject(), expName, compName, String.format(AUDIT_MESSAGE, expName));
+    }
+
+    private void stopExploratory(SchedulerJobData job) {
+        final String expName = job.getExploratoryName();
+        final String user = job.getUser();
+        final String project = job.getProject();
+        log.debug("Stopping exploratory {} for user {} by scheduler", expName, user);
+        exploratoryService.stop(securityService.getServiceAccountInfo(user), user, project, expName, String.format(AUDIT_MESSAGE, expName));
+    }
+
+    private List<SchedulerJobData> getExploratorySchedulersForTerminating(OffsetDateTime now) {
+        return schedulerJobDAO.getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED)
+                .stream()
+                .filter(canSchedulerForTerminatingBeApplied(now))
+                .collect(Collectors.toList());
+    }
+
+    private List<SchedulerJobData> getComputationalSchedulersForTerminating(OffsetDateTime now) {
+        return schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING)
+                .stream()
+                .filter(canSchedulerForTerminatingBeApplied(now))
+                .collect(Collectors.toList());
+    }
+
+    private void startExploratory(SchedulerJobData schedulerJobData) {
+        final String user = schedulerJobData.getUser();
+        final String exploratoryName = schedulerJobData.getExploratoryName();
+        final String project = schedulerJobData.getProject();
+        log.debug("Starting exploratory {} for user {} by scheduler", exploratoryName, user);
+        exploratoryService.start(securityService.getServiceAccountInfo(user), exploratoryName, project, String.format(AUDIT_MESSAGE, exploratoryName));
+        if (schedulerJobData.getJobDTO().isSyncStartRequired()) {
+            log.trace("Starting computational for exploratory {} for user {} by scheduler", exploratoryName, user);
+            final DataEngineType sparkCluster = DataEngineType.SPARK_STANDALONE;
+            final List<UserComputationalResource> compToBeStarted =
+                    computationalDAO.findComputationalResourcesWithStatus(user, project, exploratoryName, STOPPED);
+
+            compToBeStarted
+                    .stream()
+                    .filter(compResource -> shouldClusterBeStarted(sparkCluster, compResource))
+                    .forEach(comp -> startSpark(user, exploratoryName, comp.getComputationalName(), project));
+        }
+    }
+
+    private void terminateExploratory(SchedulerJobData job) {
+        final String user = job.getUser();
+        final String project = job.getProject();
+        final String expName = job.getExploratoryName();
+        log.debug("Terminating exploratory {} for user {} by scheduler", expName, user);
+        exploratoryService.terminate(securityService.getUserInfoOffline(user), user, project, expName, String.format(AUDIT_MESSAGE, expName));
+    }
+
+    private void startSpark(String user, String expName, String compName, String project) {
+        log.debug("Starting exploratory {} computational {} for user {} by scheduler", expName, compName, user);
+        computationalService.startSparkCluster(securityService.getServiceAccountInfo(user), expName, compName, project, String.format(AUDIT_MESSAGE, expName));
+    }
+
+    private boolean shouldClusterBeStarted(DataEngineType sparkCluster, UserComputationalResource compResource) {
+        return Objects.nonNull(compResource.getSchedulerData()) && compResource.getSchedulerData().isSyncStartRequired()
+                && compResource.getImageName().equals(getDockerImageName(sparkCluster));
+    }
+
+    /**
+     * Performs bulk updating operation with scheduler data for corresponding to exploratory Spark clusters.
+     * All these resources will obtain data which is equal to exploratory's except 'stopping' operation (it will be
+     * performed automatically with notebook stopping since Spark resources have such feature).
+     *
+     * @param user            user's name
+     * @param project         project name
+     * @param exploratoryName name of exploratory resource
+     * @param dto             scheduler job data.
+     */
+    private void shareSchedulerJobDataToSparkClusters(String user, String project, String exploratoryName, SchedulerJobDTO dto) {
+        List<String> correspondingSparkClusters = computationalDAO.getComputationalResourcesWhereStatusIn(user, project,
+                singletonList(DataEngineType.SPARK_STANDALONE),
+                exploratoryName, STARTING, RUNNING, STOPPING, STOPPED);
+        SchedulerJobDTO dtoWithoutStopData = getSchedulerJobWithoutStopData(dto);
+        for (String sparkName : correspondingSparkClusters) {
+            log.debug("Updating computational resource {} affiliated with exploratory {} for user {} with new " +
+                    "scheduler job data {}...", sparkName, exploratoryName, user, dtoWithoutStopData);
+            computationalDAO.updateSchedulerDataForComputationalResource(user, project, exploratoryName,
+                    sparkName, dtoWithoutStopData);
+        }
+    }
+
+    private List<SchedulerJobData> getExploratorySchedulersForStopping(OffsetDateTime currentDateTime) {
+        return schedulerJobDAO.getExploratorySchedulerDataWithStatus(RUNNING)
+                .stream()
+                .filter(canSchedulerForStoppingBeApplied(currentDateTime, true))
+                .collect(Collectors.toList());
+    }
+
+    private List<SchedulerJobData> getExploratorySchedulersForStopping(OffsetDateTime currentDateTime,
+                                                                       boolean checkInactivity) {
+        final Date clusterMaxInactivityAllowedDate =
+                from(LocalDateTime.now().minusMinutes(ALLOWED_INACTIVITY_MINUTES).atZone(systemDefault()).toInstant());
+        return schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(RUNNING,
+                clusterMaxInactivityAllowedDate)
+                .stream()
+                .filter(canSchedulerForStoppingBeApplied(currentDateTime, false)
+                        .or(schedulerJobData -> checkInactivity && exploratoryInactivityCondition(schedulerJobData)))
+                .collect(Collectors.toList());
+    }
+
+    private List<SchedulerJobData> getExploratorySchedulersForStarting(OffsetDateTime currentDateTime) {
+        return schedulerJobDAO.getExploratorySchedulerDataWithStatus(STOPPED)
+                .stream()
+                .filter(canSchedulerForStartingBeApplied(currentDateTime))
+                .collect(Collectors.toList());
+    }
+
+    private List<SchedulerJobData> getComputationalSchedulersForStarting(OffsetDateTime currentDateTime) {
+        return schedulerJobDAO
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, STOPPED)
+                .stream()
+                .filter(canSchedulerForStartingBeApplied(currentDateTime))
+                .collect(Collectors.toList());
+    }
+
+    private Predicate<SchedulerJobData> canSchedulerForStoppingBeApplied(OffsetDateTime currentDateTime, boolean usingOffset) {
+        return schedulerJobData -> shouldSchedulerBeExecuted(schedulerJobData.getJobDTO(),
+                currentDateTime, schedulerJobData.getJobDTO().getStopDaysRepeat(),
+                schedulerJobData.getJobDTO().getEndTime(), usingOffset);
+    }
+
+    private Predicate<SchedulerJobData> canSchedulerForStartingBeApplied(OffsetDateTime currentDateTime) {
+        return schedulerJobData -> shouldSchedulerBeExecuted(schedulerJobData.getJobDTO(),
+                currentDateTime, schedulerJobData.getJobDTO().getStartDaysRepeat(),
+                schedulerJobData.getJobDTO().getStartTime(), false);
+    }
+
+    private Predicate<SchedulerJobData> canSchedulerForTerminatingBeApplied(OffsetDateTime currentDateTime) {
+        return schedulerJobData -> shouldBeTerminated(currentDateTime, schedulerJobData);
+    }
+
+    private boolean shouldBeTerminated(OffsetDateTime currentDateTime, SchedulerJobData schedulerJobData) {
+        final SchedulerJobDTO jobDTO = schedulerJobData.getJobDTO();
+        final ZoneOffset timeZoneOffset = jobDTO.getTimeZoneOffset();
+        final LocalDateTime convertedCurrentTime = localDateTimeAtZone(currentDateTime, timeZoneOffset);
+        final LocalDateTime terminateDateTime = jobDTO.getTerminateDateTime();
+        return Objects.nonNull(terminateDateTime) && isSchedulerActive(jobDTO, convertedCurrentTime) &&
+                convertedCurrentTime.equals(terminateDateTime.atOffset(timeZoneOffset).toLocalDateTime());
+    }
+
+    private List<SchedulerJobData> getComputationalSchedulersForStopping(OffsetDateTime currentDateTime) {
+        return schedulerJobDAO
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING)
+                .stream()
+                .filter(canSchedulerForStoppingBeApplied(currentDateTime, true))
+                .collect(Collectors.toList());
+    }
+
+    private List<SchedulerJobData> getComputationalSchedulersForStopping(OffsetDateTime currentDateTime,
+                                                                         boolean checkInactivity) {
+        return schedulerJobDAO
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING)
+                .stream()
+                .filter(canSchedulerForStoppingBeApplied(currentDateTime, false)
+                        .or(schedulerJobData -> checkInactivity && computationalInactivityCondition(schedulerJobData)))
+                .collect(Collectors.toList());
+    }
+
+    private boolean computationalInactivityCondition(SchedulerJobData jobData) {
+        final SchedulerJobDTO schedulerData = jobData.getJobDTO();
+        return schedulerData.isCheckInactivityRequired() && computationalInactivityExceed(jobData, schedulerData);
+    }
+
+    private boolean computationalInactivityExceed(SchedulerJobData schedulerJobData, SchedulerJobDTO schedulerData) {
+        final String projectName = schedulerJobData.getProject();
+        final String explName = schedulerJobData.getExploratoryName();
+        final String compName = schedulerJobData.getComputationalName();
+        final String user = schedulerJobData.getUser();
+        final UserComputationalResource c = computationalDAO.fetchComputationalFields(user, projectName, explName, compName);
+        final Long maxInactivity = schedulerData.getMaxInactivity();
+        return inactivityCondition(maxInactivity, c.getStatus(), c.getLastActivity());
+    }
+
+    private boolean exploratoryInactivityCondition(SchedulerJobData jobData) {
+        final SchedulerJobDTO schedulerData = jobData.getJobDTO();
+        return schedulerData.isCheckInactivityRequired() && exploratoryInactivityExceed(jobData, schedulerData);
+    }
+
+    private boolean exploratoryInactivityExceed(SchedulerJobData schedulerJobData, SchedulerJobDTO schedulerData) {
+        final String project = schedulerJobData.getProject();
+        final String expName = schedulerJobData.getExploratoryName();
+        final String user = schedulerJobData.getUser();
+        final UserInstanceDTO userInstanceDTO = exploratoryDAO.fetchExploratoryFields(user, project, expName, true);
+        final boolean canBeStopped = userInstanceDTO.getResources()
+                .stream()
+                .map(UserComputationalResource::getStatus)
+                .map(UserInstanceStatus::of)
+                .noneMatch(status -> status.in(TERMINATING, CONFIGURING, CREATING, CREATING));
+        return canBeStopped && inactivityCondition(schedulerData.getMaxInactivity(), userInstanceDTO.getStatus(),
+                userInstanceDTO.getLastActivity());
+    }
+
+    private boolean inactivityCondition(Long maxInactivity, String status, LocalDateTime lastActivity) {
+        return UserInstanceStatus.RUNNING.toString().equals(status) &&
+                Optional.ofNullable(lastActivity)
+                        .map(la -> la.plusMinutes(maxInactivity).isBefore(LocalDateTime.now()))
+                        .orElse(Boolean.FALSE);
+    }
+
+    private void populateDefaultSchedulerValues(SchedulerJobDTO dto) {
+        if (Objects.isNull(dto.getBeginDate()) || StringUtils.isBlank(dto.getBeginDate().toString())) {
+            dto.setBeginDate(LocalDate.now());
+        }
+        if (Objects.isNull(dto.getTimeZoneOffset()) || StringUtils.isBlank(dto.getTimeZoneOffset().toString())) {
+            dto.setTimeZoneOffset(OffsetDateTime.now(systemDefault()).getOffset());
+        }
+    }
+
+    private void validateExploratoryStatus(String user, String project, String exploratoryName) {
+        final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(user, project, exploratoryName);
+        validateResourceStatus(userInstance.getStatus());
+    }
+
+    private void validateComputationalStatus(String user, String project, String exploratoryName, String computationalName) {
+        final UserComputationalResource computationalResource =
+                computationalDAO.fetchComputationalFields(user, project, exploratoryName, computationalName);
+        final String computationalStatus = computationalResource.getStatus();
+        validateResourceStatus(computationalStatus);
+    }
+
+    private void validateResourceStatus(String resourceStatus) {
+        final UserInstanceStatus status = UserInstanceStatus.of(resourceStatus);
+        if (Objects.isNull(status) || status.in(UserInstanceStatus.TERMINATED, TERMINATING,
+                UserInstanceStatus.FAILED)) {
+            throw new ResourceInappropriateStateException(String.format("Can not create/update scheduler for user " +
+                    "instance with status: %s", status));
+        }
+    }
+
+    private boolean shouldSchedulerBeExecuted(SchedulerJobDTO dto, OffsetDateTime dateTime, List<DayOfWeek> daysRepeat,
+                                              LocalTime time, boolean usingOffset) {
+        ZoneOffset timeZoneOffset = dto.getTimeZoneOffset();
+        LocalDateTime convertedDateTime = localDateTimeAtZone(dateTime, timeZoneOffset);
+        return isSchedulerActive(dto, convertedDateTime)
+                && daysRepeat.contains(convertedDateTime.toLocalDate().getDayOfWeek())
+                && timeFilter(time, convertedDateTime.toLocalTime(), timeZoneOffset, usingOffset);
+    }
+
+    private boolean timeFilter(LocalTime time, LocalTime convertedDateTime, ZoneOffset timeZoneOffset, boolean usingOffset) {
+        return usingOffset ? (time.isBefore(convertedDateTime) && time.isAfter(LocalDateTime.now(timeZoneOffset).toLocalTime())) :
+                convertedDateTime.equals(time);
+    }
+
+    private boolean isSchedulerActive(SchedulerJobDTO dto, LocalDateTime convertedDateTime) {
+        return !convertedDateTime.toLocalDate().isBefore(dto.getBeginDate())
+                && finishDateAfterCurrentDate(dto, convertedDateTime);
+    }
+
+    private LocalDateTime localDateTimeAtZone(OffsetDateTime dateTime, ZoneOffset timeZoneOffset) {
+        return dateTime.atZoneSameInstant(ZoneOffset.UTC)
+                .truncatedTo(ChronoUnit.MINUTES)
+                .withZoneSameInstant(timeZoneOffset)
+                .toLocalDateTime();
+    }
+
+    private boolean finishDateAfterCurrentDate(SchedulerJobDTO dto, LocalDateTime currentDateTime) {
+        return Objects.isNull(dto.getFinishDate()) || !currentDateTime.toLocalDate().isAfter(dto.getFinishDate());
+    }
+
+    private SchedulerJobDTO getSchedulerJobWithoutStopData(SchedulerJobDTO dto) {
+        SchedulerJobDTO convertedDto = new SchedulerJobDTO();
+        convertedDto.setBeginDate(dto.getBeginDate());
+        convertedDto.setFinishDate(dto.getFinishDate());
+        convertedDto.setStartTime(dto.getStartTime());
+        convertedDto.setStartDaysRepeat(dto.getStartDaysRepeat());
+        convertedDto.setTerminateDateTime(dto.getTerminateDateTime());
+        convertedDto.setTimeZoneOffset(dto.getTimeZoneOffset());
+        convertedDto.setSyncStartRequired(dto.isSyncStartRequired());
+        return convertedDto;
+    }
+
+}
+
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/SystemInfoServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/SystemInfoServiceImpl.java
new file mode 100644
index 0000000..9a8e064
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/SystemInfoServiceImpl.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.resources.dto.SystemInfoDto;
+import com.epam.datalab.backendapi.service.SystemInfoService;
+import com.epam.datalab.model.systeminfo.DiskInfo;
+import com.epam.datalab.model.systeminfo.MemoryInfo;
+import com.epam.datalab.model.systeminfo.OsInfo;
+import com.epam.datalab.model.systeminfo.ProcessorInfo;
+import com.google.inject.Inject;
+import oshi.SystemInfo;
+import oshi.hardware.CentralProcessor;
+import oshi.hardware.GlobalMemory;
+import oshi.hardware.HardwareAbstractionLayer;
+import oshi.software.os.OperatingSystem;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SystemInfoServiceImpl implements SystemInfoService {
+
+    @Inject
+    private SystemInfo si;
+
+    @Override
+    public SystemInfoDto getSystemInfo() {
+        HardwareAbstractionLayer hal = si.getHardware();
+        final OperatingSystem operatingSystem = si.getOperatingSystem();
+        return new SystemInfoDto(getOsInfo(operatingSystem), getProcessorInfo(hal), getMemoryInfo(hal),
+                getDiskInfoList(File.listRoots()));
+    }
+
+    private OsInfo getOsInfo(OperatingSystem os) {
+        return OsInfo.builder()
+                .manufacturer(os.getManufacturer())
+                .family(os.getFamily())
+                .version(os.getVersion().getVersion())
+                .buildNumber(os.getVersion().getBuildNumber())
+                .build();
+    }
+
+    private ProcessorInfo getProcessorInfo(HardwareAbstractionLayer hal) {
+        CentralProcessor cp = hal.getProcessor();
+        return ProcessorInfo.builder()
+                .model(cp.getModel())
+                .family(cp.getFamily())
+                .name(cp.getName())
+                .id(cp.getProcessorID())
+                .vendor(cp.getVendor())
+                .logicalCoreCount(cp.getLogicalProcessorCount())
+                .physicalCoreCount(cp.getPhysicalProcessorCount())
+                .isCpu64Bit(cp.isCpu64bit())
+                .currentSystemLoad(cp.getSystemCpuLoad())
+                .systemLoadAverage(cp.getSystemLoadAverage())
+                .build();
+    }
+
+    private MemoryInfo getMemoryInfo(HardwareAbstractionLayer hal) {
+        GlobalMemory memory = hal.getMemory();
+        return MemoryInfo.builder()
+                .availableMemory(memory.getAvailable())
+                .totalMemory(memory.getTotal())
+                .swapTotal(memory.getSwapTotal())
+                .swapUsed(memory.getSwapUsed())
+                .pagesPageIn(memory.getSwapPagesIn())
+                .pagesPageOut(memory.getSwapPagesOut())
+                .build();
+    }
+
+    private List<DiskInfo> getDiskInfoList(File[] roots) {
+        return Arrays.stream(roots).map(this::getDiskInfo).collect(Collectors.toList());
+    }
+
+    private DiskInfo getDiskInfo(File fileStore) {
+        return DiskInfo.builder()
+                .serialNumber(fileStore.getName())
+                .usedByteSpace(fileStore.getTotalSpace() - fileStore.getFreeSpace())
+                .totalByteSpace(fileStore.getTotalSpace())
+                .build();
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/UserGroupServiceImpl.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/UserGroupServiceImpl.java
new file mode 100644
index 0000000..528a958
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/service/impl/UserGroupServiceImpl.java
@@ -0,0 +1,228 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.annotation.Audit;
+import com.epam.datalab.backendapi.annotation.ResourceName;
+import com.epam.datalab.backendapi.annotation.User;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.ProjectDAO;
+import com.epam.datalab.backendapi.dao.UserGroupDAO;
+import com.epam.datalab.backendapi.dao.UserRoleDAO;
+import com.epam.datalab.backendapi.domain.AuditDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.resources.dto.UserGroupDto;
+import com.epam.datalab.backendapi.resources.dto.UserRoleDTO;
+import com.epam.datalab.backendapi.roles.UserRoles;
+import com.epam.datalab.backendapi.service.AuditService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.service.UserGroupService;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceConflictException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.CREATE;
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.DELETE;
+import static com.epam.datalab.backendapi.domain.AuditActionEnum.UPDATE;
+import static com.epam.datalab.backendapi.domain.AuditResourceTypeEnum.GROUP;
+
+@Singleton
+@Slf4j
+public class UserGroupServiceImpl implements UserGroupService {
+    private static final String AUDIT_ADD_ROLE_MESSAGE = "Add role(s): %s\n";
+    private static final String AUDIT_REMOVE_ROLE_MESSAGE = "Remove role(s): %s\n";
+    private static final String AUDIT_ADD_USER_MESSAGE = "Add user(s): %s\n";
+    private static final String AUDIT_REMOVE_USER_MESSAGE = "Remove user(s): %s\n";
+    private static final String ROLE_NOT_FOUND_MSG = "Any of role : %s were not found";
+    private static final String ADMIN = "admin";
+    private static final String PROJECT_ADMIN = "projectAdmin";
+    private static final String INAPPROPRIATE_PERMISSION = "User %s doesn't have appropriate permission";
+
+    private final UserGroupDAO userGroupDao;
+    private final UserRoleDAO userRoleDao;
+    private final ProjectDAO projectDAO;
+    private final ProjectService projectService;
+    private final AuditService auditService;
+    private final SelfServiceApplicationConfiguration configuration;
+
+    @Inject
+    public UserGroupServiceImpl(UserGroupDAO userGroupDao, UserRoleDAO userRoleDao, ProjectDAO projectDAO, ProjectService projectService, AuditService auditService,
+                                SelfServiceApplicationConfiguration configuration) {
+        this.userGroupDao = userGroupDao;
+        this.userRoleDao = userRoleDao;
+        this.projectDAO = projectDAO;
+        this.projectService = projectService;
+        this.auditService = auditService;
+        this.configuration = configuration;
+    }
+
+    @Audit(action = CREATE, type = GROUP)
+    @Override
+    public void createGroup(@User UserInfo userInfo, @ResourceName String group, Set<String> roleIds, Set<String> users) {
+        checkAnyRoleFound(roleIds, userRoleDao.addGroupToRole(Collections.singleton(group), roleIds));
+        log.debug("Adding users {} to group {}", users, group);
+        userGroupDao.addUsers(group, users);
+    }
+
+    @Override
+    public void updateGroup(UserInfo userInfo, String group, Map<String, String> roles, Set<String> users) {
+        if (UserRoles.isAdmin(userInfo)) {
+            updateGroup(userInfo.getName(), group, roles, users);
+        } else if (UserRoles.isProjectAdmin(userInfo)) {
+            projectService.getProjects(userInfo)
+                    .stream()
+                    .map(ProjectDTO::getGroups)
+                    .flatMap(Collection::stream)
+                    .filter(g -> g.equalsIgnoreCase(group))
+                    .findAny()
+                    .orElseThrow(() -> new DatalabException(String.format(INAPPROPRIATE_PERMISSION, userInfo.getName())));
+            updateGroup(userInfo.getName(), group, roles, users);
+        } else {
+            throw new DatalabException(String.format(INAPPROPRIATE_PERMISSION, userInfo.getName()));
+        }
+    }
+
+    @Audit(action = DELETE, type = GROUP)
+    @Override
+    public void removeGroup(@User UserInfo userInfo, @ResourceName String groupId) {
+        if (projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
+                UserInstanceStatus.TERMINATING)
+                .stream()
+                .map(ProjectDTO::getGroups)
+                .noneMatch(groups -> groups.contains(groupId))) {
+            userRoleDao.removeGroup(groupId);
+            userGroupDao.removeGroup(groupId);
+        } else {
+            throw new ResourceConflictException("Group can not be removed because it is used in some project");
+        }
+    }
+
+    @Override
+    public List<UserGroupDto> getAggregatedRolesByGroup(UserInfo user) {
+        if (UserRoles.isAdmin(user)) {
+            return userRoleDao.aggregateRolesByGroup();
+        } else if (UserRoles.isProjectAdmin(user)) {
+            Set<String> groups = projectService.getProjects(user)
+                    .stream()
+                    .map(ProjectDTO::getGroups)
+                    .flatMap(Collection::stream)
+                    .collect(Collectors.toSet());
+            return userRoleDao.aggregateRolesByGroup()
+                    .stream()
+                    .filter(userGroup -> groups.contains(userGroup.getGroup()) && !containsAdministrationPermissions(userGroup))
+                    .collect(Collectors.toList());
+        } else {
+            throw new DatalabException(String.format(INAPPROPRIATE_PERMISSION, user.getName()));
+        }
+    }
+
+    private boolean containsAdministrationPermissions(UserGroupDto userGroup) {
+        List<String> ids = userGroup.getRoles()
+                .stream()
+                .map(UserRoleDTO::getId)
+                .collect(Collectors.toList());
+        return ids.contains(ADMIN) || ids.contains(PROJECT_ADMIN);
+    }
+
+    private void updateGroup(String user, String group, Map<String, String> roles, Set<String> users) {
+        Set<String> roleIds = roles.keySet();
+        if (configuration.isAuditEnabled()) {
+            audit(user, group, roles, users);
+        }
+        log.debug("Updating users for group {}: {}", group, users);
+        userGroupDao.updateUsers(group, users);
+        log.debug("Removing group {} from existing roles", group);
+        userRoleDao.removeGroupWhenRoleNotIn(group, roleIds);
+        log.debug("Adding group {} to roles {}", group, roleIds);
+        userRoleDao.addGroupToRole(Collections.singleton(group), roleIds);
+    }
+
+    private void audit(String user, String group, Map<String, String> newRoles, Set<String> users) {
+        final String auditInfo = roleAudit(group, newRoles) + getUserAudit(group, users);
+        AuditDTO auditDTO = AuditDTO.builder()
+                .user(user)
+                .resourceName(group)
+                .action(UPDATE)
+                .type(GROUP)
+                .info(auditInfo)
+                .build();
+        auditService.save(auditDTO);
+    }
+
+    private String getUserAudit(String group, Set<String> users) {
+        StringBuilder auditInfo = new StringBuilder();
+        Set<String> oldUsers = userGroupDao.getUsers(group);
+        HashSet<String> newUsers = new HashSet<>(users);
+        newUsers.removeAll(oldUsers);
+        if (!newUsers.isEmpty()) {
+            auditInfo.append(String.format(AUDIT_ADD_USER_MESSAGE, String.join(", ", newUsers)));
+        }
+        HashSet<String> removedUsers = new HashSet<>(oldUsers);
+        removedUsers.removeAll(users);
+        if (!removedUsers.isEmpty()) {
+            auditInfo.append(String.format(AUDIT_REMOVE_USER_MESSAGE, String.join(", ", removedUsers)));
+        }
+        return auditInfo.toString();
+    }
+
+    private String roleAudit(String group, Map<String, String> newRoles) {
+        StringBuilder auditInfo = new StringBuilder();
+        Map<String, String> oldRoles = userRoleDao.aggregateRolesByGroup()
+                .stream()
+                .filter(g -> g.getGroup().equals(group))
+                .map(UserGroupDto::getRoles)
+                .flatMap(Collection::stream)
+                .collect(Collectors.toMap(UserRoleDTO::getId, UserRoleDTO::getDescription));
+        if (!getRoleDescription(oldRoles, newRoles).isEmpty()) {
+            auditInfo.append(String.format(AUDIT_ADD_ROLE_MESSAGE, getRoleDescription(oldRoles, newRoles)));
+        }
+        if (!getRoleDescription(newRoles, oldRoles).isEmpty()) {
+            auditInfo.append(String.format(AUDIT_REMOVE_ROLE_MESSAGE, getRoleDescription(newRoles, oldRoles)));
+        }
+        return auditInfo.toString();
+    }
+
+    private String getRoleDescription(Map<String, String> newRoles, Map<String, String> oldRoles) {
+        Set<String> removedRoleIds = new HashSet<>(oldRoles.keySet());
+        removedRoleIds.removeAll(newRoles.keySet());
+        return removedRoleIds
+                .stream()
+                .map(oldRoles::get)
+                .collect(Collectors.joining(", "));
+    }
+
+    private void checkAnyRoleFound(Set<String> roleIds, boolean anyRoleFound) {
+        if (!anyRoleFound) {
+            throw new ResourceNotFoundException(String.format(ROLE_NOT_FOUND_MSG, roleIds));
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/servlet/guacamole/GuacamoleServlet.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/servlet/guacamole/GuacamoleServlet.java
new file mode 100644
index 0000000..5cce713
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/servlet/guacamole/GuacamoleServlet.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.servlet.guacamole;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.SecurityDAO;
+import com.epam.datalab.backendapi.service.GuacamoleService;
+import com.epam.datalab.exceptions.DatalabAuthenticationException;
+import com.epam.datalab.exceptions.DatalabException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Inject;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.guacamole.net.GuacamoleTunnel;
+import org.apache.guacamole.servlet.GuacamoleHTTPTunnelServlet;
+import org.apache.http.HttpStatus;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.HttpHeaders;
+import java.io.IOException;
+
+@Slf4j
+public class GuacamoleServlet extends GuacamoleHTTPTunnelServlet {
+    private static final String UNAUTHORIZED_MSG = "User is not authenticated";
+    private static final String DATALAB_PREFIX = "DataLab-";
+    private final GuacamoleService guacamoleService;
+    private final ObjectMapper mapper;
+    private final SecurityDAO securityDAO;
+    private static final String AUTH_HEADER_PREFIX = "Bearer ";
+
+    @Inject
+    public GuacamoleServlet(GuacamoleService guacamoleService, ObjectMapper mapper, SecurityDAO securityDAO) {
+        this.mapper = mapper;
+        this.guacamoleService = guacamoleService;
+        this.securityDAO = securityDAO;
+    }
+
+    @Override
+    protected GuacamoleTunnel doConnect(HttpServletRequest request) {
+        try {
+            final String authorization = request.getHeader(DATALAB_PREFIX + HttpHeaders.AUTHORIZATION);
+            final String credentials = StringUtils.substringAfter(authorization, AUTH_HEADER_PREFIX);
+            final UserInfo userInfo = getUserInfo(credentials);
+            final CreateTerminalDTO createTerminalDTO = mapper.readValue(request.getReader(), CreateTerminalDTO.class);
+            return guacamoleService.getTunnel(userInfo, createTerminalDTO.getHost(), createTerminalDTO.getEndpoint());
+        } catch (IOException e) {
+            log.error("Cannot read request body. Reason {}", e.getMessage(), e);
+            throw new DatalabException("Can not read request body: " + e.getMessage(), e);
+        }
+    }
+
+    @Override
+    protected void handleTunnelRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException {
+        try {
+            super.handleTunnelRequest(request, response);
+        } catch (DatalabAuthenticationException e) {
+            log.error(UNAUTHORIZED_MSG, e);
+            sendError(response, HttpStatus.SC_UNAUTHORIZED, HttpStatus.SC_UNAUTHORIZED, UNAUTHORIZED_MSG);
+        }
+    }
+
+    private UserInfo getUserInfo(String credentials) {
+        try {
+            return securityDAO.getUser(credentials)
+                    .orElseThrow(() -> new DatalabAuthenticationException(UNAUTHORIZED_MSG));
+        } catch (DatalabAuthenticationException e) {
+            log.error(UNAUTHORIZED_MSG, e);
+            throw new DatalabException(UNAUTHORIZED_MSG);
+        }
+    }
+
+    @Data
+    private static class CreateTerminalDTO {
+        private String host;
+        private String endpoint;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/util/BillingUtils.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/BillingUtils.java
new file mode 100644
index 0000000..83f6774
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/BillingUtils.java
@@ -0,0 +1,252 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.util;
+
+import com.epam.datalab.backendapi.domain.BillingReportLine;
+import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import jersey.repackaged.com.google.common.collect.Lists;
+import org.apache.commons.lang3.StringUtils;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.format.FormatStyle;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import static com.epam.datalab.dto.billing.BillingResourceType.BUCKET;
+import static com.epam.datalab.dto.billing.BillingResourceType.COMPUTATIONAL;
+import static com.epam.datalab.dto.billing.BillingResourceType.EDGE;
+import static com.epam.datalab.dto.billing.BillingResourceType.ENDPOINT;
+import static com.epam.datalab.dto.billing.BillingResourceType.EXPLORATORY;
+import static com.epam.datalab.dto.billing.BillingResourceType.IMAGE;
+import static com.epam.datalab.dto.billing.BillingResourceType.SSN;
+import static com.epam.datalab.dto.billing.BillingResourceType.VOLUME;
+
+public class BillingUtils {
+    private static final String[] AVAILABLE_NOTEBOOKS = {"zeppelin", "tensor-rstudio", "rstudio", "tensor", "superset", "jupyterlab", "jupyter", "deeplearning"};
+    private static final String[] BILLING_FILTERED_REPORT_HEADERS = {"DataLab ID", "Project", "DataLab Resource Type", "Status", "Shape", "Product", "Cost"};
+    private static final String[] COMPLETE_REPORT_REPORT_HEADERS = {"DataLab ID", "User", "Project", "DataLab Resource Type", "Status", "Shape", "Product", "Cost"};
+    private static final String REPORT_FIRST_LINE = "Service base name: %s. Available reporting period from: %s to: %s";
+    private static final String TOTAL_LINE = "Total: %s %s";
+    private static final String SSN_FORMAT = "%s-ssn";
+    private static final String ENDPOINT_FORMAT = "%s-%s-endpoint";
+    private static final String EDGE_FORMAT = "%s-%s-%s-edge";
+    private static final String EDGE_VOLUME_FORMAT = "%s-%s-%s-edge-volume-primary";
+    private static final String PROJECT_ENDPOINT_BUCKET_FORMAT = "%s-%s-%s-bucket";
+    private static final String ENDPOINT_SHARED_BUCKET_FORMAT = "%s-%s-shared-bucket";
+    private static final String VOLUME_PRIMARY_FORMAT = "%s-volume-primary";
+    private static final String VOLUME_PRIMARY_COMPUTATIONAL_FORMAT = "%s-%s-volume-primary";
+    private static final String VOLUME_SECONDARY_FORMAT = "%s-volume-secondary";
+    private static final String VOLUME_SECONDARY_COMPUTATIONAL_FORMAT = "%s-%s-volume-secondary";
+    private static final String IMAGE_STANDARD_FORMAT1 = "%s-%s-%s-%s-notebook-image";
+    private static final String IMAGE_STANDARD_FORMAT2 = "%s-%s-%s-notebook-image";
+    private static final String IMAGE_CUSTOM_FORMAT = "%s-%s-%s-%s-%s";
+
+    private static final String SHARED_RESOURCE = "Shared resource";
+    private static final String IMAGE_NAME = "Image";
+
+    private static final String DATAENGINE_NAME_FORMAT = "%d x %s";
+    private static final String DATAENGINE_SERVICE_NAME_FORMAT = "Master: %sSlave: %d x %s";
+
+    public static Stream<BillingReportLine> edgeBillingDataStream(String project, String sbn, String endpoint) {
+        final String userEdgeId = String.format(EDGE_FORMAT, sbn, project, endpoint).toLowerCase();
+        final String edgeVolumeId = String.format(EDGE_VOLUME_FORMAT, sbn, project, endpoint).toLowerCase();
+        final String endpointBucketId = String.format(PROJECT_ENDPOINT_BUCKET_FORMAT, sbn, project, endpoint).toLowerCase();
+
+        return Stream.concat(Stream.of(
+                BillingReportLine.builder().resourceName(endpoint).user(SHARED_RESOURCE).project(project).datalabId(userEdgeId).resourceType(EDGE).build(),
+                BillingReportLine.builder().resourceName("EDGE volume").user(SHARED_RESOURCE).project(project).datalabId(edgeVolumeId).resourceType(VOLUME).build(),
+                BillingReportLine.builder().resourceName("Project endpoint shared bucket").user(SHARED_RESOURCE).project(project).datalabId(endpointBucketId).resourceType(BUCKET).build()
+                ),
+                standardImageBillingDataStream(sbn, project, endpoint)
+        );
+    }
+
+    public static Stream<BillingReportLine> ssnBillingDataStream(String sbn) {
+        final String ssnId = String.format(SSN_FORMAT, sbn);
+        return Stream.of(
+                BillingReportLine.builder().user(SHARED_RESOURCE).project(SHARED_RESOURCE).resourceName("SSN").datalabId(ssnId).resourceType(SSN).build(),
+                BillingReportLine.builder().user(SHARED_RESOURCE).project(SHARED_RESOURCE).resourceName("SSN Volume").datalabId(String.format(VOLUME_PRIMARY_FORMAT, ssnId)).resourceType(VOLUME).build()
+        );
+    }
+
+    public static Stream<BillingReportLine> sharedEndpointBillingDataStream(String endpoint, String sbn) {
+        final String projectEndpointBucketId = String.format(ENDPOINT_SHARED_BUCKET_FORMAT, sbn, endpoint).toLowerCase();
+        final String endpointId = String.format(ENDPOINT_FORMAT, sbn, endpoint).toLowerCase();
+        return Stream.concat(Stream.of(
+                BillingReportLine.builder().resourceName("Endpoint shared bucket").user(SHARED_RESOURCE).project(SHARED_RESOURCE).datalabId(projectEndpointBucketId).resourceType(BUCKET).build(),
+                BillingReportLine.builder().resourceName("Endpoint").user(SHARED_RESOURCE).project(SHARED_RESOURCE).datalabId(endpointId).resourceType(ENDPOINT).build()
+                ),
+                standardImageBillingDataStream(sbn, endpoint));
+    }
+
+    public static Stream<BillingReportLine> exploratoryBillingDataStream(UserInstanceDTO userInstance, Integer maxSparkInstanceCount) {
+        final Stream<BillingReportLine> computationalStream = userInstance.getResources()
+                .stream()
+                .filter(cr -> cr.getComputationalId() != null)
+                .flatMap(cr -> {
+                    final String computationalId = cr.getComputationalId().toLowerCase();
+                    return Stream.concat(Stream.of(
+                            withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).datalabId(computationalId).resourceType(COMPUTATIONAL).shape(getComputationalShape(cr))
+                                    .exploratoryName(userInstance.getExploratoryName()).build(),
+                            withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).datalabId(String.format(VOLUME_PRIMARY_FORMAT, computationalId)).resourceType(VOLUME).build(),
+                            withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).datalabId(String.format(VOLUME_SECONDARY_FORMAT, computationalId)).resourceType(VOLUME).build(),
+                            withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).datalabId(String.format(VOLUME_PRIMARY_COMPUTATIONAL_FORMAT, computationalId, "m"))
+                                    .resourceType(VOLUME).build(),
+                            withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).datalabId(String.format(VOLUME_SECONDARY_COMPUTATIONAL_FORMAT, computationalId, "m"))
+                                    .resourceType(VOLUME).build()
+                            ),
+                            getSlaveVolumes(userInstance, cr, maxSparkInstanceCount)
+                    );
+                });
+        final String exploratoryName = userInstance.getExploratoryName();
+        final String exploratoryId = userInstance.getExploratoryId().toLowerCase();
+        final String primaryVolumeId = String.format(VOLUME_PRIMARY_FORMAT, exploratoryId);
+        final String secondaryVolumeId = String.format(VOLUME_SECONDARY_FORMAT, exploratoryId);
+        final Stream<BillingReportLine> exploratoryStream = Stream.of(
+                withUserProjectEndpoint(userInstance).resourceName(exploratoryName).datalabId(exploratoryId).resourceType(EXPLORATORY).shape(userInstance.getShape()).build(),
+                withUserProjectEndpoint(userInstance).resourceName(exploratoryName).datalabId(primaryVolumeId).resourceType(VOLUME).build(),
+                withUserProjectEndpoint(userInstance).resourceName(exploratoryName).datalabId(secondaryVolumeId).resourceType(VOLUME).build());
+
+        return Stream.concat(computationalStream, exploratoryStream);
+    }
+
+    public static Stream<BillingReportLine> customImageBillingDataStream(ImageInfoRecord image, String sbn) {
+        String imageId = String.format(IMAGE_CUSTOM_FORMAT, sbn, image.getProject(), image.getEndpoint(), image.getApplication(), image.getName()).toLowerCase();
+        return Stream.of(
+                BillingReportLine.builder().resourceName(image.getName()).project(image.getProject()).datalabId(imageId).user(image.getUser()).resourceType(IMAGE).build()
+        );
+    }
+
+    private static Stream<BillingReportLine> getSlaveVolumes(UserInstanceDTO userInstance, UserComputationalResource cr, Integer maxSparkInstanceCount) {
+        List<BillingReportLine> list = new ArrayList<>();
+        for (int i = 1; i <= maxSparkInstanceCount; i++) {
+            list.add(withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).datalabId(String.format(VOLUME_PRIMARY_COMPUTATIONAL_FORMAT, cr.getComputationalId().toLowerCase(), "s" + i))
+                    .resourceType(VOLUME).build());
+            list.add(withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).datalabId(String.format(VOLUME_SECONDARY_COMPUTATIONAL_FORMAT, cr.getComputationalId().toLowerCase(), "s" + i))
+                    .resourceType(VOLUME).build());
+        }
+        return list.stream();
+    }
+
+    private static BillingReportLine.BillingReportLineBuilder withUserProjectEndpoint(UserInstanceDTO userInstance) {
+        return BillingReportLine.builder().user(userInstance.getUser()).project(userInstance.getProject()).endpoint(userInstance.getEndpoint());
+    }
+
+    public static String getComputationalShape(UserComputationalResource resource) {
+        return DataEngineType.fromDockerImageName(resource.getImageName()) == DataEngineType.SPARK_STANDALONE ?
+                String.format(DATAENGINE_NAME_FORMAT, resource.getDataengineInstanceCount(), resource.getDataengineShape()) :
+                String.format(DATAENGINE_SERVICE_NAME_FORMAT, resource.getMasterNodeShape(), resource.getTotalInstanceCount() - 1, resource.getSlaveNodeShape());
+    }
+
+    private static Stream<BillingReportLine> standardImageBillingDataStream(String sbn, String endpoint) {
+        List<BillingReportLine> list = new ArrayList<>();
+        for (String notebook : AVAILABLE_NOTEBOOKS) {
+            list.add(BillingReportLine.builder().resourceName(IMAGE_NAME).datalabId(String.format(IMAGE_STANDARD_FORMAT2, sbn, endpoint, notebook).toLowerCase())
+                    .user(SHARED_RESOURCE).project(SHARED_RESOURCE).resourceType(IMAGE).build());
+        }
+
+        return list.stream();
+    }
+
+    private static Stream<BillingReportLine> standardImageBillingDataStream(String sbn, String project, String endpoint) {
+        List<BillingReportLine> list = new ArrayList<>();
+        for (String notebook : AVAILABLE_NOTEBOOKS) {
+            list.add(BillingReportLine.builder().resourceName(IMAGE_NAME).datalabId(String.format(IMAGE_STANDARD_FORMAT1, sbn, project, endpoint, notebook).toLowerCase())
+                    .project(project).user(SHARED_RESOURCE).resourceType(IMAGE).build());
+        }
+
+        return list.stream();
+    }
+
+	/**
+	 * @param sbn    Service Base Name
+	 * @param from   formatted date, like 2020-04-07
+	 * @param to     formatted date, like 2020-05-07
+	 * @param locale user's locale
+	 * @return line, like:
+	 * "Service base name: SERVICE_BASE_NAME. Available reporting period from: 2020-04-07 to: 2020-04-07"
+	 */
+	public static String getFirstLine(String sbn, LocalDate from, LocalDate to, String locale) {
+		return CSVFormatter.formatLine(Lists.newArrayList(String.format(REPORT_FIRST_LINE, sbn,
+				Optional.ofNullable(from).map(date -> date.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.forLanguageTag(locale)))).orElse(StringUtils.EMPTY),
+				Optional.ofNullable(to).map(date -> date.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.forLanguageTag(locale)))).orElse(StringUtils.EMPTY))),
+				CSVFormatter.SEPARATOR, '\"');
+	}
+
+    /**
+     * headerType there are two types of header according user role
+     *
+     * @return line, like DataLab ID,User,Project,DataLab Resource Type,Status,Shape,Product,Cost
+     * in case of additional header type, the ENUM object will be propagated from the Service Impl Class
+     */
+    public static String getHeader(boolean isReportHeaderCompletable) {
+        if (!isReportHeaderCompletable) {
+            return CSVFormatter.formatLine(Arrays.asList(BillingUtils.BILLING_FILTERED_REPORT_HEADERS), CSVFormatter.SEPARATOR);
+        }
+        return CSVFormatter.formatLine(Arrays.asList(BillingUtils.COMPLETE_REPORT_REPORT_HEADERS), CSVFormatter.SEPARATOR);
+    }
+
+    public static String printLine(BillingReportLine line, boolean isReportHeaderCompletable) {
+        List<String> lines = new ArrayList<>();
+        lines.add(getOrEmpty(line.getDatalabId()));
+        //if user does not have the billing role, the User field should not be present in report
+        if (isReportHeaderCompletable) {
+            lines.add(getOrEmpty(line.getUser()));
+        }
+        lines.add(getOrEmpty(line.getProject()));
+        lines.add(getOrEmpty(Optional.ofNullable(line.getResourceType()).map(r -> StringUtils.capitalize(r.toString().toLowerCase())).orElse(null)));
+        lines.add(getOrEmpty(Optional.ofNullable(line.getStatus()).map(UserInstanceStatus::toString).orElse(null)));
+        lines.add(getOrEmpty(line.getShape()));
+        lines.add(getOrEmpty(line.getProduct()));
+        lines.add(getOrEmpty(Optional.ofNullable(line.getCost()).map(String::valueOf).orElse(null)));
+        return CSVFormatter.formatLine(lines, CSVFormatter.SEPARATOR);
+    }
+
+    /**
+     * @param total                  monetary amount
+     * @param currency               user's currency
+     * @param stringOfAdjustedHeader filtered fields of report header
+     * @return line with cost of resources
+     */
+    public static String getTotal(Double total, String currency, String stringOfAdjustedHeader) {
+        List<String> totalLine = new ArrayList<>();
+        String[] headerFieldsList = stringOfAdjustedHeader.split(String.valueOf(CSVFormatter.SEPARATOR));
+        for (int i = 0; i < headerFieldsList.length - 1; i++) {
+            totalLine.add(StringUtils.EMPTY);
+        }
+        totalLine.add(headerFieldsList.length - 1, String.format(TOTAL_LINE, getOrEmpty(String.valueOf(total)), getOrEmpty(currency)));
+        return CSVFormatter.formatLine(totalLine, CSVFormatter.SEPARATOR);
+
+    }
+
+    private static String getOrEmpty(String s) {
+        return Objects.nonNull(s) ? s : StringUtils.EMPTY;
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/util/CSVFormatter.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/CSVFormatter.java
new file mode 100644
index 0000000..b842022
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/CSVFormatter.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.util;
+
+import java.util.List;
+
+public class CSVFormatter {
+    public static final char SEPARATOR = ',';
+
+    private CSVFormatter() {
+    }
+
+
+    public static String formatLine(List<String> values, char separator) {
+        boolean first = true;
+        StringBuilder builder = new StringBuilder();
+        for (String value : values) {
+            if (!first) {
+                builder.append(separator);
+            }
+            builder.append(followCsvStandard(value));
+            first = false;
+        }
+        return builder.append(System.lineSeparator()).toString();
+    }
+
+    public static String formatLine(List<String> values, char separator, char customQuote) {
+        boolean first = true;
+        StringBuilder builder = new StringBuilder();
+        for (String value : values) {
+            if (!first) {
+                builder.append(separator);
+            }
+            builder.append(customQuote).append(followCsvStandard(value)).append(customQuote);
+            first = false;
+        }
+        return builder.append(System.lineSeparator()).toString();
+    }
+
+    private static String followCsvStandard(String value) {
+
+        String result = value;
+        if (result.contains("\"")) {
+            result = result.replace("\"", "\"\"");
+        }
+        return result;
+
+    }
+
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/util/DateRemoverUtil.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/DateRemoverUtil.java
new file mode 100644
index 0000000..3e76a90
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/DateRemoverUtil.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.util;
+
+/**
+ * Created on 3/15/2017.
+ */
+public class DateRemoverUtil {
+
+    private static final String ERROR_DATE_FORMAT = "\\[Error-\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\]:";
+    private static final String ERROR_WITHOUT_DATE_FORMAT = "\\[Error\\]:";
+
+    private DateRemoverUtil() {
+    }
+
+    public static String removeDateFormErrorMessage(String errorMessage, String errorDateFormat, String replaceWith) {
+        return errorMessage.replaceAll(errorDateFormat, replaceWith);
+    }
+
+    public static String removeDateFormErrorMessage(String errorMessage) {
+        return errorMessage.replaceAll(ERROR_DATE_FORMAT, ERROR_WITHOUT_DATE_FORMAT);
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/util/KeycloakUtil.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/KeycloakUtil.java
new file mode 100644
index 0000000..14c1946
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/KeycloakUtil.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.util;
+
+import com.epam.datalab.exceptions.DatalabException;
+import org.keycloak.common.util.Base64Url;
+import org.keycloak.representations.IDToken;
+import org.keycloak.util.JsonSerialization;
+
+public class KeycloakUtil {
+
+    public static IDToken parseToken(String encoded) {
+        try {
+            String[] parts = encoded.split("\\.");
+            if (parts.length < 2 || parts.length > 3) {
+                throw new IllegalArgumentException("Parsing error");
+            }
+            byte[] bytes = Base64Url.decode(parts[1]);
+            return JsonSerialization.readValue(bytes, IDToken.class);
+        } catch (Exception e) {
+            throw new DatalabException("Can not parse token due to: " + e.getMessage(), e);
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/util/RequestBuilder.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/RequestBuilder.java
new file mode 100644
index 0000000..ad50429
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/util/RequestBuilder.java
@@ -0,0 +1,686 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.util;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.SettingsDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.OdahuCreateDTO;
+import com.epam.datalab.backendapi.domain.OdahuFieldsDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.resources.dto.BackupFormDTO;
+import com.epam.datalab.backendapi.resources.dto.ComputationalCreateFormDTO;
+import com.epam.datalab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
+import com.epam.datalab.backendapi.resources.dto.aws.AwsComputationalCreateForm;
+import com.epam.datalab.backendapi.resources.dto.gcp.GcpComputationalCreateForm;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.*;
+import com.epam.datalab.dto.aws.AwsCloudSettings;
+import com.epam.datalab.dto.aws.computational.AwsComputationalTerminateDTO;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.aws.computational.ComputationalCreateAws;
+import com.epam.datalab.dto.aws.computational.SparkComputationalCreateAws;
+import com.epam.datalab.dto.aws.exploratory.ExploratoryCreateAws;
+import com.epam.datalab.dto.azure.AzureCloudSettings;
+import com.epam.datalab.dto.azure.computational.SparkComputationalCreateAzure;
+import com.epam.datalab.dto.azure.exploratory.ExploratoryActionStartAzure;
+import com.epam.datalab.dto.azure.exploratory.ExploratoryActionStopAzure;
+import com.epam.datalab.dto.azure.exploratory.ExploratoryCreateAzure;
+import com.epam.datalab.dto.backup.EnvBackupDTO;
+import com.epam.datalab.dto.base.CloudSettings;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.epam.datalab.dto.computational.*;
+import com.epam.datalab.dto.exploratory.*;
+import com.epam.datalab.dto.gcp.GcpCloudSettings;
+import com.epam.datalab.dto.gcp.computational.ComputationalCreateGcp;
+import com.epam.datalab.dto.gcp.computational.GcpComputationalTerminateDTO;
+import com.epam.datalab.dto.gcp.computational.SparkComputationalCreateGcp;
+import com.epam.datalab.dto.gcp.exploratory.ExploratoryCreateGcp;
+import com.epam.datalab.dto.odahu.ActionOdahuDTO;
+import com.epam.datalab.dto.odahu.CreateOdahuDTO;
+import com.epam.datalab.dto.project.ProjectActionDTO;
+import com.epam.datalab.dto.project.ProjectCreateDTO;
+import com.epam.datalab.dto.status.EnvResourceList;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.model.exploratory.Exploratory;
+import com.epam.datalab.util.UsernameUtils;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import static com.epam.datalab.cloud.CloudProvider.*;
+
+@Singleton
+@Slf4j
+public class RequestBuilder {
+    private static final String UNSUPPORTED_CLOUD_PROVIDER_MESSAGE = "Unsupported cloud provider ";
+    private static final String AZURE_REFRESH_TOKEN_KEY = "refresh_token";
+
+    @Inject
+    private SelfServiceApplicationConfiguration configuration;
+    @Inject
+    private SettingsDAO settingsDAO;
+
+    private CloudSettings cloudSettings(String user, CloudProvider cloudProvider) {
+        switch (cloudProvider) {
+            case AWS:
+                return AwsCloudSettings.builder()
+                        .awsIamUser(user)
+                        .build();
+            case AZURE:
+                return AzureCloudSettings.builder()
+                        .azureIamUser(user).build();
+            case GCP:
+                return GcpCloudSettings.builder()
+                        .gcpIamUser(user).build();
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private <T extends ResourceBaseDTO<?>> T newResourceBaseDTO(String user, CloudProvider cloudProvider,
+                                                                Class<T> resourceClass) {
+        try {
+            return (T) resourceClass.newInstance()
+                    .withEdgeUserName(getEdgeUserName(user, cloudProvider))
+                    .withCloudSettings(cloudSettings(user, cloudProvider));
+        } catch (Exception e) {
+            throw new DatalabException("Cannot create instance of resource class " + resourceClass.getName() + ". " +
+                    e.getLocalizedMessage(), e);
+        }
+    }
+
+    private String getEdgeUserName(String user, CloudProvider cloudProvider) {
+        String edgeUser = UsernameUtils.removeDomain(user);
+        switch (cloudProvider) {
+            case GCP:
+                return adjustUserName(configuration.getMaxUserNameLength(), edgeUser);
+            case AWS:
+            case AZURE:
+                return edgeUser;
+            default:
+                throw new DatalabException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
+        }
+    }
+
+    private String adjustUserName(int maxLength, String userName) {
+        return userName.length() > maxLength ?
+                UUID.nameUUIDFromBytes(userName.getBytes()).toString().substring(0, maxLength) : userName;
+    }
+
+    @SuppressWarnings("unchecked")
+    private <T extends ResourceSysBaseDTO<?>> T newResourceSysBaseDTO(String user, CloudProvider cloudProvider,
+                                                                      Class<T> resourceClass) {
+        return newResourceBaseDTO(user, cloudProvider, resourceClass);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends ExploratoryCreateDTO<T>> T newExploratoryCreate(ProjectDTO projectDTO, EndpointDTO endpointDTO, Exploratory exploratory,
+                                                                      UserInfo userInfo,
+                                                                      ExploratoryGitCredsDTO exploratoryGitCredsDTO,
+                                                                      Map<String, String> tags) {
+
+        T exploratoryCreate;
+        CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+        switch (cloudProvider) {
+            case AWS:
+                exploratoryCreate = (T) newResourceSysBaseDTO(userInfo.getName(), cloudProvider, ExploratoryCreateAws.class)
+                        .withNotebookInstanceType(exploratory.getShape());
+                break;
+            case AZURE:
+                exploratoryCreate = (T) newResourceSysBaseDTO(userInfo.getName(), cloudProvider, ExploratoryCreateAzure.class)
+                        .withNotebookInstanceSize(exploratory.getShape());
+                if (settingsDAO.isAzureDataLakeEnabled()) {
+                    ((ExploratoryCreateAzure) exploratoryCreate)
+                            .withAzureUserRefreshToken(userInfo.getKeys().get(AZURE_REFRESH_TOKEN_KEY));
+                }
+
+                ((ExploratoryCreateAzure) exploratoryCreate)
+                        .withAzureDataLakeEnabled(Boolean.toString(settingsDAO.isAzureDataLakeEnabled()));
+                break;
+            case GCP:
+                exploratoryCreate = (T) newResourceSysBaseDTO(userInfo.getName(), cloudProvider, ExploratoryCreateGcp.class)
+                        .withNotebookInstanceType(exploratory.getShape());
+                break;
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
+        }
+
+
+        T t = exploratoryCreate.withExploratoryName(exploratory.getName())
+                .withNotebookImage(exploratory.getDockerImage())
+                .withApplicationName(getApplicationNameFromImage(exploratory.getDockerImage()))
+                .withGitCreds(exploratoryGitCredsDTO.getGitCreds())
+                .withImageName(exploratory.getImageName())
+                .withClusterConfig(exploratory.getClusterConfig())
+                .withProject(exploratory.getProject())
+                .withEndpoint(exploratory.getEndpoint())
+                .withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()))
+                .withTags(tags)
+                .withGPUCount(exploratory.getGpuCount())
+                .withGPUType(exploratory.getGpuType())
+                .withEnabledGPU(exploratory.getEnabledGPU());
+        return t;
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends ExploratoryGitCredsUpdateDTO> T newExploratoryStart(UserInfo userInfo,
+                                                                          UserInstanceDTO userInstance,
+                                                                          EndpointDTO endpointDTO,
+                                                                          ExploratoryGitCredsDTO
+                                                                                  exploratoryGitCredsDTO) {
+        CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+        switch (cloudProvider) {
+            case AWS:
+            case GCP:
+                return (T) newResourceSysBaseDTO(userInfo.getName(), cloudProvider, ExploratoryGitCredsUpdateDTO.class)
+                        .withNotebookInstanceName(userInstance.getExploratoryId())
+                        .withGitCreds(exploratoryGitCredsDTO.getGitCreds())
+                        .withNotebookImage(userInstance.getImageName())
+                        .withExploratoryName(userInstance.getExploratoryName())
+                        .withReuploadKeyRequired(userInstance.isReuploadKeyRequired())
+                        .withProject(userInstance.getProject())
+                        .withEndpoint(userInstance.getEndpoint());
+            case AZURE:
+                T exploratoryStart = (T) newResourceSysBaseDTO(userInfo.getName(), cloudProvider, ExploratoryActionStartAzure.class)
+                        .withNotebookInstanceName(userInstance.getExploratoryId())
+                        .withGitCreds(exploratoryGitCredsDTO.getGitCreds())
+                        .withNotebookImage(userInstance.getImageName())
+                        .withExploratoryName(userInstance.getExploratoryName())
+                        .withReuploadKeyRequired(userInstance.isReuploadKeyRequired())
+                        .withProject(userInstance.getProject())
+                        .withEndpoint(userInstance.getEndpoint());
+
+                if (settingsDAO.isAzureDataLakeEnabled()) {
+                    ((ExploratoryActionStartAzure) exploratoryStart)
+                            .withAzureUserRefreshToken(userInfo.getKeys().get(AZURE_REFRESH_TOKEN_KEY));
+                }
+
+                ((ExploratoryActionStartAzure) exploratoryStart)
+                        .withAzureDataLakeEnabled(Boolean.toString(settingsDAO.isAzureDataLakeEnabled()));
+
+                return exploratoryStart;
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends ExploratoryActionDTO<T>> T newExploratoryStop(String user, UserInstanceDTO userInstance, EndpointDTO endpointDTO) {
+
+        T exploratoryStop;
+        CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+
+        switch (cloudProvider) {
+            case AWS:
+            case GCP:
+                exploratoryStop = (T) newResourceSysBaseDTO(user, cloudProvider, ExploratoryActionDTO.class);
+                break;
+            case AZURE:
+                exploratoryStop = (T) newResourceSysBaseDTO(user, cloudProvider, ExploratoryActionStopAzure.class);
+                break;
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
+        }
+
+        return exploratoryStop
+                .withNotebookInstanceName(userInstance.getExploratoryId())
+                .withNotebookImage(userInstance.getImageName())
+                .withExploratoryName(userInstance.getExploratoryName())
+                .withNotebookImage(userInstance.getImageName())
+                .withReuploadKeyRequired(userInstance.isReuploadKeyRequired())
+                .withProject(userInstance.getProject())
+                .withEndpoint(userInstance.getEndpoint());
+    }
+
+    public ExploratoryGitCredsUpdateDTO newGitCredentialsUpdate(UserInfo userInfo, UserInstanceDTO instanceDTO,
+                                                                EndpointDTO endpointDTO,
+                                                                ExploratoryGitCredsDTO exploratoryGitCredsDTO) {
+        checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
+        return newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(), ExploratoryGitCredsUpdateDTO.class)
+                .withNotebookImage(instanceDTO.getImageName())
+                .withApplicationName(getApplicationNameFromImage(instanceDTO.getImageName()))
+                .withProject(instanceDTO.getProject())
+                .withEndpoint(instanceDTO.getEndpoint())
+                .withNotebookInstanceName(instanceDTO.getExploratoryId())
+                .withExploratoryName(instanceDTO.getExploratoryName())
+                .withGitCreds(exploratoryGitCredsDTO.getGitCreds());
+    }
+
+    public LibraryInstallDTO newLibInstall(UserInfo userInfo, UserInstanceDTO userInstance,
+                                           EndpointDTO endpointDTO, List<LibInstallDTO> libs) {
+        checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
+        return newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(), LibraryInstallDTO.class)
+                .withNotebookImage(userInstance.getImageName())
+                .withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
+                .withNotebookInstanceName(userInstance.getExploratoryId())
+                .withExploratoryName(userInstance.getExploratoryName())
+                .withProject(userInstance.getProject())
+                .withEndpoint(endpointDTO.getName())
+                .withLibs(libs);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends LibListExploratoryDTO> T newLibExploratoryList(UserInfo userInfo, UserInstanceDTO userInstance,
+                                                                     EndpointDTO endpointDTO, String group) {
+        checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
+        return (T) newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(), LibListExploratoryDTO.class)
+                .withNotebookInstanceName(userInstance.getExploratoryId())
+                .withProject(userInstance.getProject())
+                .withEndpoint(endpointDTO.getName())
+                .withNotebookImage(userInstance.getImageName())
+                .withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
+                .withExploratoryName(userInstance.getExploratoryName())
+                .withLibCacheKey(group);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends LibraryInstallDTO> T newLibInstall(UserInfo userInfo, UserInstanceDTO userInstance,
+                                                         UserComputationalResource computationalResource,
+                                                         List<LibInstallDTO> libs, EndpointDTO endpointDTO) {
+        checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
+        return (T) newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(), LibraryInstallDTO.class)
+                .withComputationalId(computationalResource.getComputationalId())
+                .withComputationalName(computationalResource.getComputationalName())
+                .withExploratoryName(userInstance.getExploratoryName())
+                .withProject(userInstance.getProject())
+                .withEndpoint(endpointDTO.getName())
+                .withComputationalImage(computationalResource.getImageName())
+                .withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
+                .withLibs(libs);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends LibListComputationalDTO> T newLibComputationalList(UserInfo userInfo,
+                                                                         UserInstanceDTO userInstance,
+                                                                         UserComputationalResource
+                                                                                 computationalResource,
+                                                                         EndpointDTO endpointDTO, String group) {
+
+        checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
+        return (T) newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(), LibListComputationalDTO.class)
+                .withComputationalId(computationalResource.getComputationalId())
+                .withProject(userInstance.getProject())
+                .withEndpoint(endpointDTO.getName())
+                .withComputationalImage(computationalResource.getImageName())
+                .withLibCacheKey(group)
+                .withApplicationName(getApplicationNameFromImage(userInstance.getImageName()));
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends ComputationalBase<T>> T newComputationalCreate(UserInfo userInfo, ProjectDTO projectDTO,
+                                                                     UserInstanceDTO userInstance,
+                                                                     ComputationalCreateFormDTO form,
+                                                                     EndpointDTO endpointDTO) {
+        T computationalCreate;
+        CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+        switch (cloudProvider) {
+            case AZURE:
+                throw new UnsupportedOperationException("Creating dataengine service is not supported yet");
+            case AWS:
+                AwsComputationalCreateForm awsForm = (AwsComputationalCreateForm) form;
+                computationalCreate = (T) newResourceSysBaseDTO(userInfo.getName(), cloudProvider, ComputationalCreateAws.class)
+                        .withInstanceCount(awsForm.getInstanceCount())
+                        .withMasterInstanceType(awsForm.getMasterInstanceType())
+                        .withSlaveInstanceType(awsForm.getSlaveInstanceType())
+                        .withSlaveInstanceSpot(awsForm.getSlaveInstanceSpot())
+                        .withSlaveInstanceSpotPctPrice(awsForm.getSlaveInstanceSpotPctPrice())
+                        .withVersion(awsForm.getVersion())
+                        .withConfig((awsForm.getConfig()))
+                        .withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
+                break;
+            case GCP:
+                GcpComputationalCreateForm gcpForm = (GcpComputationalCreateForm) form;
+                computationalCreate = (T) newResourceSysBaseDTO(userInfo.getName(), cloudProvider, ComputationalCreateGcp.class)
+                        .withMasterInstanceCount(gcpForm.getMasterInstanceCount())
+                        .withSlaveInstanceCount(gcpForm.getSlaveInstanceCount())
+                        .withPreemptibleCount(gcpForm.getPreemptibleCount())
+                        .withMasterInstanceType(gcpForm.getMasterInstanceType())
+                        .withSlaveInstanceType(gcpForm.getSlaveInstanceType())
+                        .withVersion(gcpForm.getVersion())
+                        .withMasterGPUCount(gcpForm.getMasterGpuCount())
+                        .withMasterGPUType(gcpForm.getMasterGpuType())
+                        .withSlaveGPUCount(gcpForm.getSlaveGpuCount())
+                        .withSlaveGPUType(gcpForm.getSlaveGpuType())
+                        .withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
+                break;
+
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
+        }
+
+        return computationalCreate
+                .withExploratoryName(form.getNotebookName())
+                .withComputationalName(form.getName())
+                .withNotebookTemplateName(userInstance.getTemplateName())
+                .withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
+                .withNotebookInstanceName(userInstance.getExploratoryId())
+                .withProject(userInstance.getProject())
+                .withTags(userInstance.getTags())
+                .withEndpoint(userInstance.getEndpoint());
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends ComputationalBase<T>> T newComputationalCreate(UserInfo userInfo, ProjectDTO projectDTO,
+                                                                     UserInstanceDTO userInstance,
+                                                                     SparkStandaloneClusterCreateForm form,
+                                                                     EndpointDTO endpointDTO) {
+
+        T computationalCreate;
+        CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+        switch (cloudProvider) {
+            case AWS:
+                computationalCreate = (T) newResourceSysBaseDTO(userInfo.getName(), cloudProvider, SparkComputationalCreateAws.class)
+                        .withDataEngineInstanceCount(form.getDataEngineInstanceCount())
+                        .withDataEngineMasterShape(form.getMasterDataEngineInstanceShape())
+                        .withDataEngineSlaveShape(form.getMasterDataEngineInstanceShape())
+                        .withConfig(form.getConfig())
+                        .withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
+                break;
+            case AZURE:
+                computationalCreate = (T) newResourceSysBaseDTO(userInfo.getName(), cloudProvider, SparkComputationalCreateAzure.class)
+                        .withDataEngineInstanceCount(form.getDataEngineInstanceCount())
+                        .withDataEngineMasterSize(form.getMasterDataEngineInstanceShape())
+                        .withDataEngineSlaveSize(form.getMasterDataEngineInstanceShape())
+                        .withConfig(form.getConfig())
+                        .withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
+                if (settingsDAO.isAzureDataLakeEnabled()) {
+                    ((SparkComputationalCreateAzure) computationalCreate)
+                            .withAzureUserRefreshToken(userInfo.getKeys().get(AZURE_REFRESH_TOKEN_KEY));
+                }
+
+                ((SparkComputationalCreateAzure) computationalCreate)
+                        .withAzureDataLakeEnabled(Boolean.toString(settingsDAO.isAzureDataLakeEnabled()));
+
+                break;
+            case GCP:
+                computationalCreate = (T) newResourceSysBaseDTO(userInfo.getName(), cloudProvider, SparkComputationalCreateGcp.class)
+                        .withDataengineInstanceCount(form.getDataEngineInstanceCount())
+                        .withDataEngineMasterSize(form.getMasterDataEngineInstanceShape())
+                        .withDataEngineSlaveSize(form.getMasterDataEngineInstanceShape())
+                        .withMasterGPUCount(form.getMasterGpuCount())
+                        .withMasterGPUType(form.getMasterGpuType())
+                        .withSlaveGPUCount(form.getSlaveGpuCount())
+                        .withSlaveGPUType(form.getSlaveGpuType())
+                        .withConfig(form.getConfig())
+                        .withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
+                break;
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
+        }
+
+        return computationalCreate
+                .withExploratoryName(form.getNotebookName())
+                .withComputationalName(form.getName())
+                .withNotebookTemplateName(userInstance.getTemplateName())
+                .withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
+                .withNotebookInstanceName(userInstance.getExploratoryId())
+                .withProject(userInstance.getProject())
+                .withTags(userInstance.getTags())
+                .withEndpoint(userInstance.getEndpoint());
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends ComputationalBase<T>> T newComputationalTerminate(String resourceCreator,
+                                                                        UserInstanceDTO userInstanceDTO,
+                                                                        UserComputationalResource computationalResource,
+                                                                        EndpointDTO endpointDTO) {
+        T computationalTerminate;
+        CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+        switch (cloudProvider) {
+            case AWS:
+                AwsComputationalTerminateDTO terminateDTO = newResourceSysBaseDTO(resourceCreator, cloudProvider,
+                        AwsComputationalTerminateDTO.class);
+                if (computationalResource.getDataEngineType() == DataEngineType.CLOUD_SERVICE) {
+                    terminateDTO.setClusterName(computationalResource.getComputationalId());
+                }
+                computationalTerminate = (T) terminateDTO;
+                break;
+            case AZURE:
+                computationalTerminate = (T) newResourceSysBaseDTO(resourceCreator, cloudProvider, ComputationalTerminateDTO.class);
+                break;
+            case GCP:
+                GcpComputationalTerminateDTO gcpTerminateDTO = newResourceSysBaseDTO(resourceCreator, cloudProvider,
+                        GcpComputationalTerminateDTO.class);
+                if (computationalResource.getDataEngineType() == DataEngineType.CLOUD_SERVICE) {
+                    gcpTerminateDTO.setClusterName(computationalResource.getComputationalId());
+                }
+                computationalTerminate = (T) gcpTerminateDTO;
+                break;
+
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
+        }
+
+        return computationalTerminate
+                .withExploratoryName(userInstanceDTO.getExploratoryName())
+                .withComputationalName(computationalResource.getComputationalName())
+                .withNotebookInstanceName(userInstanceDTO.getExploratoryId())
+                .withProject(userInstanceDTO.getProject())
+                .withEndpoint(userInstanceDTO.getEndpoint());
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends ComputationalBase<T>> T newComputationalStop(String resourceCreator, UserInstanceDTO exploratory,
+                                                                   String computationalName, EndpointDTO endpointDTO) {
+        return (T) newResourceSysBaseDTO(resourceCreator, endpointDTO.getCloudProvider(), ComputationalStopDTO.class)
+                .withExploratoryName(exploratory.getExploratoryName())
+                .withComputationalName(computationalName)
+                .withNotebookInstanceName(exploratory.getExploratoryId())
+                .withApplicationName(getApplicationNameFromImage(exploratory.getImageName()))
+                .withProject(exploratory.getProject())
+                .withEndpoint(endpointDTO.getName());
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends ComputationalBase<T>> T newComputationalStart(UserInfo userInfo, UserInstanceDTO exploratory,
+                                                                    String computationalName, EndpointDTO endpointDTO) {
+        return (T) newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(), ComputationalStartDTO.class)
+                .withExploratoryName(exploratory.getExploratoryName())
+                .withComputationalName(computationalName)
+                .withNotebookInstanceName(exploratory.getExploratoryId())
+                .withApplicationName(getApplicationNameFromImage(exploratory.getImageName()))
+                .withProject(exploratory.getProject())
+                .withEndpoint(endpointDTO.getName());
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends ExploratoryImageDTO> T newExploratoryImageCreate(UserInfo userInfo, UserInstanceDTO userInstance,
+                                                                       String imageName, EndpointDTO endpointDTO, ProjectDTO projectDTO) {
+        checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
+        return (T) newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(), ExploratoryImageDTO.class)
+                .withProject(userInstance.getProject())
+                .withNotebookInstanceName(userInstance.getExploratoryId())
+                .withExploratoryName(userInstance.getExploratoryName())
+                .withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
+                .withNotebookImage(userInstance.getImageName())
+                .withImageName(imageName)
+                .withEndpoint(userInstance.getEndpoint())
+                .withTags(userInstance.getTags())
+                .withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T extends ComputationalBase<T>> T newComputationalCheckInactivity(UserInfo userInfo,
+                                                                              UserInstanceDTO exploratory,
+                                                                              UserComputationalResource cr, EndpointDTO endpointDTO) {
+        return (T) newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(), ComputationalCheckInactivityDTO.class)
+                .withExploratoryName(exploratory.getExploratoryName())
+                .withComputationalName(cr.getComputationalName())
+                .withNotebookInstanceName(exploratory.getExploratoryId())
+                .withApplicationName(getApplicationNameFromImage(exploratory.getImageName()))
+                .withNotebookImageName(exploratory.getImageName())
+                .withImage(cr.getImageName())
+                .withComputationalId(cr.getComputationalId())
+                .withProject(exploratory.getProject())
+                .withEndpoint(endpointDTO.getName());
+    }
+
+
+    @SuppressWarnings("unchecked")
+    public <T extends EnvBackupDTO> T newBackupCreate(BackupFormDTO backupFormDTO, String id) {
+
+        return (T) EnvBackupDTO.builder()
+                .configFiles(backupFormDTO.getConfigFiles())
+                .certificates(backupFormDTO.getCertificates())
+                .keys(backupFormDTO.getKeys())
+                .jars(backupFormDTO.getJars())
+                .databaseBackup(backupFormDTO.isDatabaseBackup())
+                .logsBackup(backupFormDTO.isLogsBackup())
+                .id(id)
+                .build();
+    }
+
+    public ComputationalClusterConfigDTO newClusterConfigUpdate(UserInfo userInfo, UserInstanceDTO userInstanceDTO,
+                                                                UserComputationalResource compRes,
+                                                                List<ClusterConfig> config, EndpointDTO endpointDTO) {
+        CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+        final ComputationalClusterConfigDTO clusterConfigDTO = newResourceSysBaseDTO(userInfo.getName(), cloudProvider,
+                ComputationalClusterConfigDTO.class)
+                .withExploratoryName(userInstanceDTO.getExploratoryName())
+                .withNotebookInstanceName(userInstanceDTO.getExploratoryId())
+                .withComputationalName(compRes.getComputationalName())
+                .withApplicationName(compRes.getImageName())
+                .withProject(userInstanceDTO.getProject())
+                .withEndpoint(userInstanceDTO.getEndpoint());
+        clusterConfigDTO.setCopmutationalId(compRes.getComputationalId());
+        clusterConfigDTO.setConfig(config);
+        if (cloudProvider == AZURE && settingsDAO.isAzureDataLakeEnabled()) {
+            clusterConfigDTO.setAzureUserRefreshToken(userInfo.getKeys().get(AZURE_REFRESH_TOKEN_KEY));
+        }
+
+        return clusterConfigDTO;
+    }
+
+    public ExploratoryReconfigureSparkClusterActionDTO newClusterConfigUpdate(UserInfo userInfo,
+                                                                              UserInstanceDTO userInstance,
+                                                                              List<ClusterConfig> config,
+                                                                              EndpointDTO endpointDTO) {
+
+        CloudProvider cloudProvider = endpointDTO.getCloudProvider();
+        final ExploratoryReconfigureSparkClusterActionDTO dto =
+                newResourceSysBaseDTO(userInfo.getName(), cloudProvider, ExploratoryReconfigureSparkClusterActionDTO.class)
+                        .withNotebookInstanceName(userInstance.getExploratoryId())
+                        .withExploratoryName(userInstance.getExploratoryName())
+                        .withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
+                        .withNotebookImage(userInstance.getImageName())
+                        .withConfig(config)
+                        .withProject(userInstance.getProject())
+                        .withEndpoint(userInstance.getEndpoint());
+        if (cloudProvider == AZURE && settingsDAO.isAzureDataLakeEnabled()) {
+            dto.withAzureUserRefreshToken(userInfo.getKeys().get(AZURE_REFRESH_TOKEN_KEY));
+        }
+
+        return dto;
+    }
+
+    public ExploratoryCheckInactivityAction newExploratoryCheckInactivityAction(UserInfo userInfo,
+                                                                                UserInstanceDTO userInstance,
+                                                                                EndpointDTO endpointDTO) {
+        final ExploratoryCheckInactivityAction dto = newResourceSysBaseDTO(userInfo.getName(), endpointDTO.getCloudProvider(),
+                ExploratoryCheckInactivityAction.class);
+        dto.withNotebookInstanceName(userInstance.getExploratoryId())
+                .withNotebookImage(userInstance.getImageName())
+                .withExploratoryName(userInstance.getExploratoryName())
+                .withReuploadKeyRequired(userInstance.isReuploadKeyRequired())
+                .withProject(userInstance.getProject())
+                .withEndpoint(endpointDTO.getName());
+        return dto;
+    }
+
+    public ProjectCreateDTO newProjectCreate(UserInfo userInfo, ProjectDTO projectDTO, EndpointDTO endpointDTO) {
+        return ProjectCreateDTO.builder()
+                .key(projectDTO.getKey().replace("\n", ""))
+                .name(projectDTO.getName())
+                .tag(projectDTO.getTag())
+                .endpoint(endpointDTO.getName())
+                .build()
+                .withCloudSettings(cloudSettings(userInfo.getName(), endpointDTO.getCloudProvider()));
+    }
+
+    public ProjectActionDTO newProjectAction(UserInfo userInfo, String project, EndpointDTO endpointDTO) {
+        return new ProjectActionDTO(project, endpointDTO.getName())
+                .withCloudSettings(cloudSettings(userInfo.getName(), endpointDTO.getCloudProvider()));
+    }
+
+    public CreateOdahuDTO newOdahuCreate(String user, OdahuCreateDTO odahuCreateDTO, ProjectDTO projectDTO, EndpointDTO endpointDTO) {
+        return CreateOdahuDTO.builder()
+                .name(odahuCreateDTO.getName())
+                .project(projectDTO.getName())
+                .endpoint(odahuCreateDTO.getEndpoint())
+                .key(projectDTO.getKey().replace("\n", ""))
+                .build()
+                .withEdgeUserName(getEdgeUserName(user, endpointDTO.getCloudProvider()))
+                .withCloudSettings(cloudSettings(user, endpointDTO.getCloudProvider()));
+    }
+
+    public ActionOdahuDTO newOdahuAction(String user, String name, ProjectDTO projectDTO, EndpointDTO endpointDTO,
+                                         OdahuFieldsDTO odahuFields) {
+        return ActionOdahuDTO.builder()
+                .name(name)
+                .project(projectDTO.getName())
+                .key(projectDTO.getKey().replace("\n", ""))
+                .endpoint(endpointDTO.getName())
+                .grafanaAdmin(odahuFields.getGrafanaAdmin())
+                .grafanaPassword(odahuFields.getGrafanaPassword())
+                .oauthCookieSecret(odahuFields.getOauthCookieSecret())
+                .decryptToken(odahuFields.getDecryptToken())
+                .build()
+                .withEdgeUserName(getEdgeUserName(user, endpointDTO.getCloudProvider()))
+                .withCloudSettings(cloudSettings(user, endpointDTO.getCloudProvider()));
+    }
+
+    public UserEnvironmentResources newInfrastructureStatus(String user, CloudProvider cloudProvider, EnvResourceList resourceList) {
+        return newResourceSysBaseDTO(user, cloudProvider, UserEnvironmentResources.class)
+                .withResourceList(resourceList);
+    }
+
+    /**
+     * Returns application name basing on docker image
+     *
+     * @param imageName docker image name
+     * @return application name
+     */
+    private String getApplicationNameFromImage(String imageName) {
+        if (imageName != null) {
+            int pos = imageName.indexOf('-');
+            if (pos > 0) {
+                return imageName.substring(pos + 1);
+            }
+        }
+        return "";
+    }
+
+    private void checkInappropriateCloudProviderOrElseThrowException(CloudProvider provider) {
+        if (provider != AWS && provider != AZURE && provider != GCP) {
+            throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + provider);
+        }
+    }
+}
+
+
+
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/MavenLibraryNameValidator.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/MavenLibraryNameValidator.java
new file mode 100644
index 0000000..ea92af5
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/MavenLibraryNameValidator.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.validation;
+
+import com.epam.datalab.backendapi.validation.annotation.LibNameValid;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+@Slf4j
+public class MavenLibraryNameValidator implements ConstraintValidator<LibNameValid, String> {
+    @Override
+    public void initialize(LibNameValid libNameValid) {
+        log.trace("MavenLibraryNameValidator initialized");
+    }
+
+    @Override
+    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
+        return StringUtils.isNotEmpty(s) && s.split(":").length == 3;
+
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/SchedulerJobDTOValidator.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/SchedulerJobDTOValidator.java
new file mode 100644
index 0000000..4b32621
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/SchedulerJobDTOValidator.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.validation;
+
+import com.epam.datalab.backendapi.validation.annotation.SchedulerJobDTOValid;
+import com.epam.datalab.dto.SchedulerJobDTO;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.Objects;
+
+public class SchedulerJobDTOValidator implements ConstraintValidator<SchedulerJobDTOValid, SchedulerJobDTO> {
+    @Override
+    public void initialize(SchedulerJobDTOValid schedulerJobDTOValid) {
+        //do nothing
+    }
+
+    @Override
+    public boolean isValid(SchedulerJobDTO schedulerJobDTO, ConstraintValidatorContext constraintValidatorContext) {
+        if (!schedulerJobDTO.isCheckInactivityRequired() && Objects.isNull(schedulerJobDTO.getTerminateDateTime())) {
+            return !schedulerJobDTO.getStartDaysRepeat().isEmpty() || !schedulerJobDTO.getStopDaysRepeat().isEmpty();
+        } else if (schedulerJobDTO.isCheckInactivityRequired() && Objects.isNull(schedulerJobDTO.getMaxInactivity())) {
+            constraintValidatorContext.disableDefaultConstraintViolation();
+            constraintValidatorContext.buildConstraintViolationWithTemplate("Max inactivity time should be set").addConstraintViolation();
+            return false;
+        } else {
+            return true;
+        }
+    }
+}
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/annotation/LibNameValid.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/annotation/LibNameValid.java
new file mode 100644
index 0000000..22ab4f4
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/annotation/LibNameValid.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.validation.annotation;
+
+import com.epam.datalab.backendapi.validation.MavenLibraryNameValidator;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Constraint(validatedBy = {MavenLibraryNameValidator.class})
+@Target({ElementType.FIELD, ElementType.PARAMETER})
+@Retention(value = RetentionPolicy.RUNTIME)
+public @interface LibNameValid {
+
+
+    String message() default "Wrong library name format. Should be <groupId>:<artifactId>:<versionId>";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/annotation/SchedulerJobDTOValid.java b/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/annotation/SchedulerJobDTOValid.java
new file mode 100644
index 0000000..72f766e
--- /dev/null
+++ b/services/self-service/src/main/java/com/epam/datalab/backendapi/validation/annotation/SchedulerJobDTOValid.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.validation.annotation;
+
+import com.epam.datalab.backendapi.validation.SchedulerJobDTOValidator;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Constraint(validatedBy = {SchedulerJobDTOValidator.class})
+@Target({ElementType.FIELD, ElementType.PARAMETER})
+@Retention(value = RetentionPolicy.RUNTIME)
+public @interface SchedulerJobDTOValid {
+
+
+    String message() default "Start/stop days or termination date is required for scheduler";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/SelfServiceApplication.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/SelfServiceApplication.java
deleted file mode 100644
index 6a12ea5..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/SelfServiceApplication.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi;
-
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.IndexCreator;
-import com.epam.dlab.backendapi.domain.ExploratoryLibCache;
-import com.epam.dlab.backendapi.dropwizard.bundles.DlabKeycloakBundle;
-import com.epam.dlab.backendapi.dropwizard.listeners.MongoStartupListener;
-import com.epam.dlab.backendapi.dropwizard.listeners.RestoreHandlerStartupListener;
-import com.epam.dlab.backendapi.healthcheck.MongoHealthCheck;
-import com.epam.dlab.backendapi.modules.ModuleFactory;
-import com.epam.dlab.backendapi.resources.*;
-import com.epam.dlab.backendapi.resources.callback.*;
-import com.epam.dlab.backendapi.schedulers.internal.ManagedScheduler;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.servlet.guacamole.GuacamoleServlet;
-import com.epam.dlab.cloud.CloudModule;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.migration.mongo.DlabMongoMigration;
-import com.epam.dlab.mongo.MongoServiceFactory;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.mappers.*;
-import com.epam.dlab.util.ServiceUtils;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.name.Names;
-import de.thomaskrille.dropwizard_template_config.TemplateConfigBundle;
-import de.thomaskrille.dropwizard_template_config.TemplateConfigBundleConfiguration;
-import io.dropwizard.Application;
-import io.dropwizard.assets.AssetsBundle;
-import io.dropwizard.forms.MultiPartBundle;
-import io.dropwizard.jersey.setup.JerseyEnvironment;
-import io.dropwizard.jetty.BiDiGzipHandler;
-import io.dropwizard.setup.Bootstrap;
-import io.dropwizard.setup.Environment;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.HandlerWrapper;
-
-/**
- * Self Service based on Dropwizard application.
- */
-@Slf4j
-public class SelfServiceApplication extends Application<SelfServiceApplicationConfiguration> {
-	public static final String GUACAMOLE_SERVLET_PATH = "/api/tunnel";
-	private static Injector appInjector;
-
-	public static Injector getInjector() {
-		return appInjector;
-	}
-
-	public static void setInjector(Injector injector) {
-		SelfServiceApplication.appInjector = injector;
-	}
-
-	public static void main(String... args) throws Exception {
-		if (ServiceUtils.printAppVersion(SelfServiceApplication.class, args)) {
-			return;
-		}
-		new SelfServiceApplication().run(args);
-	}
-
-	@Override
-	public void initialize(Bootstrap<SelfServiceApplicationConfiguration> bootstrap) {
-		super.initialize(bootstrap);
-		bootstrap.addBundle(new MultiPartBundle());
-		bootstrap.addBundle(new AssetsBundle("/webapp/dist", "/", "index.html"));
-		bootstrap.addBundle(new TemplateConfigBundle(
-				new TemplateConfigBundleConfiguration().fileIncludePath(ServiceUtils.getConfPath())
-		));
-
-		bootstrap.addBundle(new DlabKeycloakBundle());
-	}
-
-	@Override
-	public void run(SelfServiceApplicationConfiguration configuration, Environment environment) {
-
-		CloudModule cloudModule = ModuleFactory.getCloudProviderModule(configuration);
-		Injector injector = Guice.createInjector(ModuleFactory.getModule(configuration, environment), cloudModule);
-		setInjector(injector);
-
-		cloudModule.init(environment, injector);
-		if (configuration.isMongoMigrationEnabled()) {
-			environment.lifecycle().addServerLifecycleListener(server -> applyMongoMigration(configuration));
-		}
-		environment.lifecycle().addServerLifecycleListener(injector.getInstance(MongoStartupListener.class));
-		final RestoreHandlerStartupListener restoreHandlerStartupListener =
-				new RestoreHandlerStartupListener(injector.getInstance(Key.get(RESTService.class,
-						Names.named(ServiceConsts.PROVISIONING_SERVICE_NAME))), injector.getInstance(EndpointService.class));
-		environment.lifecycle().addServerLifecycleListener(restoreHandlerStartupListener);
-		environment.lifecycle().addServerLifecycleListener(this::disableGzipHandlerForGuacamoleServlet);
-		environment.lifecycle().manage(injector.getInstance(IndexCreator.class));
-		environment.lifecycle().manage(injector.getInstance(ExploratoryLibCache.class));
-		environment.lifecycle().manage(injector.getInstance(ManagedScheduler.class));
-		environment.healthChecks().register(ServiceConsts.MONGO_NAME, injector.getInstance(MongoHealthCheck.class));
-
-		environment.servlets().addServlet("GuacamoleServlet", injector.getInstance(GuacamoleServlet.class))
-				.addMapping(GUACAMOLE_SERVLET_PATH);
-
-
-		JerseyEnvironment jersey = environment.jersey();
-
-		jersey.register(new RuntimeExceptionMapper());
-		jersey.register(new JsonProcessingExceptionMapper());
-		jersey.register(new ResourceConflictExceptionMapper());
-		jersey.register(new ResourceNotFoundExceptionMapper());
-		jersey.register(new DlabValidationExceptionMapper());
-		jersey.register(new ValidationExceptionMapper());
-		jersey.register(new ResourceQuoteReachedExceptionMapper());
-
-		jersey.register(injector.getInstance(InfrastructureTemplateResource.class));
-		jersey.register(injector.getInstance(InfrastructureInfoResource.class));
-
-		jersey.register(injector.getInstance(EnvironmentStatusCallback.class));
-
-		jersey.register(injector.getInstance(ComputationalCallback.class));
-
-		jersey.register(injector.getInstance(UserSettingsResource.class));
-
-		jersey.register(injector.getInstance(ExploratoryResource.class));
-		jersey.register(injector.getInstance(ExploratoryCallback.class));
-
-		jersey.register(injector.getInstance(LibExploratoryResource.class));
-		jersey.register(injector.getInstance(LibraryCallback.class));
-
-		jersey.register(injector.getInstance(GitCredsResource.class));
-		jersey.register(injector.getInstance(GitCredsCallback.class));
-		jersey.register(injector.getInstance(SchedulerJobResource.class));
-		jersey.register(injector.getInstance(ImageExploratoryResource.class));
-		jersey.register(injector.getInstance(ImageCallback.class));
-		jersey.register(injector.getInstance(BackupResource.class));
-		jersey.register(injector.getInstance(BackupCallback.class));
-		jersey.register(injector.getInstance(EnvironmentResource.class));
-		jersey.register(injector.getInstance(ReuploadKeyCallback.class));
-		jersey.register(injector.getInstance(CheckInactivityCallback.class));
-		jersey.register(injector.getInstance(SystemInfoResource.class));
-		jersey.register(injector.getInstance(UserGroupResource.class));
-		jersey.register(injector.getInstance(UserRoleResource.class));
-		jersey.register(injector.getInstance(ApplicationSettingResource.class));
-		jersey.register(injector.getInstance(KeycloakResource.class));
-		jersey.register(injector.getInstance(EndpointResource.class));
-		jersey.register(injector.getInstance(ProjectResource.class));
-		jersey.register(injector.getInstance(ProjectCallback.class));
-	}
-
-	private void disableGzipHandlerForGuacamoleServlet(Server server) {
-		Handler handler = server.getHandler();
-		while (handler instanceof HandlerWrapper) {
-			handler = ((HandlerWrapper) handler).getHandler();
-			if (handler instanceof BiDiGzipHandler) {
-				log.debug("Disabling Gzip handler for guacamole servlet");
-				((BiDiGzipHandler) handler).setExcludedPaths(GUACAMOLE_SERVLET_PATH);
-			}
-		}
-	}
-
-	private void applyMongoMigration(SelfServiceApplicationConfiguration configuration) {
-		final MongoServiceFactory mongoFactory = configuration.getMongoFactory();
-
-		new DlabMongoMigration(mongoFactory.getHost(), mongoFactory.getPort(), mongoFactory.getUsername(),
-				mongoFactory.getPassword(), mongoFactory.getDatabase()).migrate();
-	}
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/BudgetLimited.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/BudgetLimited.java
deleted file mode 100644
index 1d58792..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/BudgetLimited.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation used to disallow execution of method that is annotated by this annotation in case when
- * budget limit in reached. Budget can be specified in self service configuration
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface BudgetLimited {
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/Project.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/Project.java
deleted file mode 100644
index 0ce3414..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/Project.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-@Target(ElementType.PARAMETER)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Project {
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/ProjectAdmin.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/ProjectAdmin.java
deleted file mode 100644
index 2fca3cd..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/ProjectAdmin.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ProjectAdmin {
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/User.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/User.java
deleted file mode 100644
index b56dd20..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/annotation/User.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(ElementType.PARAMETER)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface User {
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/auth/KeycloakAuthenticator.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/auth/KeycloakAuthenticator.java
deleted file mode 100644
index 2c2e0d1..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/auth/KeycloakAuthenticator.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.auth;
-
-import com.epam.dlab.auth.UserInfo;
-import de.ahus1.keycloak.dropwizard.AbstractKeycloakAuthenticator;
-import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
-import io.dropwizard.auth.AuthenticationException;
-import org.keycloak.KeycloakSecurityContext;
-import org.keycloak.representations.AccessToken;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
-import java.util.Optional;
-
-import static java.util.Collections.emptyList;
-
-public class KeycloakAuthenticator extends AbstractKeycloakAuthenticator<UserInfo> {
-
-	private static final String GROUPS_CLAIM = "groups";
-
-	public KeycloakAuthenticator(KeycloakConfiguration keycloakConfiguration) {
-		super(keycloakConfiguration);
-	}
-
-	@Override
-	public Optional<UserInfo> authenticate(HttpServletRequest request) throws AuthenticationException {
-		return super.authenticate(request);
-
-	}
-
-	@Override
-	@SuppressWarnings("unchecked")
-	protected UserInfo prepareAuthentication(KeycloakSecurityContext keycloakSecurityContext,
-											 HttpServletRequest httpServletRequest,
-											 KeycloakConfiguration keycloakConfiguration) {
-		final AccessToken token = keycloakSecurityContext.getToken();
-		final UserInfo userInfo = new UserInfo(token.getPreferredUsername(),
-				keycloakSecurityContext.getTokenString());
-		userInfo.addRoles((List<String>) token.getOtherClaims().getOrDefault(GROUPS_CLAIM, emptyList()));
-		return userInfo;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/auth/SelfServiceSecurityAuthorizer.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/auth/SelfServiceSecurityAuthorizer.java
deleted file mode 100644
index 2d93b74..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/auth/SelfServiceSecurityAuthorizer.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.auth;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.roles.RoleType;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.google.inject.Singleton;
-import io.dropwizard.auth.Authorizer;
-
-@Singleton
-public class SelfServiceSecurityAuthorizer implements Authorizer<UserInfo> {
-	@Override
-	public boolean authorize(UserInfo principal, String role) {
-		return UserRoles.checkAccess(principal, RoleType.PAGE, role, principal.getRoles());
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/auth/filters/DropwizardBearerTokenFilterImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/auth/filters/DropwizardBearerTokenFilterImpl.java
deleted file mode 100644
index df6f5fa..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/auth/filters/DropwizardBearerTokenFilterImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.auth.filters;
-
-import org.keycloak.adapters.AdapterDeploymentContext;
-import org.keycloak.adapters.KeycloakDeployment;
-import org.keycloak.adapters.NodesRegistrationManagement;
-import org.keycloak.jaxrs.JaxrsBearerTokenFilterImpl;
-
-import javax.annotation.Priority;
-import javax.ws.rs.Priorities;
-import javax.ws.rs.container.PreMatching;
-
-@PreMatching
-@Priority(Priorities.AUTHENTICATION)
-public class DropwizardBearerTokenFilterImpl extends JaxrsBearerTokenFilterImpl {
-
-	public DropwizardBearerTokenFilterImpl(KeycloakDeployment keycloakDeployment) {
-		deploymentContext = new AdapterDeploymentContext(keycloakDeployment);
-		nodesRegistrationManagement = new NodesRegistrationManagement();
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/conf/CloudConfiguration.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/conf/CloudConfiguration.java
deleted file mode 100644
index c86c8ae..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/conf/CloudConfiguration.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.conf;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-public class CloudConfiguration {
-
-	private final String os;
-	private final String serviceBaseName;
-	private final String edgeInstanceSize;
-	private final String subnetId;
-	private final String region;
-	private final String zone;
-	private final String confTagResourceId;
-	private final String securityGroupIds;
-	private final String ssnInstanceSize;
-	private final String notebookVpcId;
-	private final String notebookSubnetId;
-	private final String confKeyDir;
-	private final String vpcId;
-	private final String azureResourceGroupName;
-	private final String ssnStorageAccountTagName;
-	private final String sharedStorageAccountTagName;
-	private final String datalakeTagName;
-	private final String azureClientId;
-	private final String peeringId;
-	private final String gcpProjectId;
-	@JsonProperty("ldap")
-	private final LdapConfig ldapConfig;
-
-	@Data
-	public static class LdapConfig {
-		private final String host;
-		private final String dn;
-		private final String ou;
-		private final String user;
-		private final String password;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/conf/KeycloakConfiguration.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/conf/KeycloakConfiguration.java
deleted file mode 100644
index 212d565..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/conf/KeycloakConfiguration.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.conf;
-
-import lombok.Data;
-
-@Data
-public class KeycloakConfiguration extends de.ahus1.keycloak.dropwizard.KeycloakConfiguration {
-	private String redirectUri;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/conf/SelfServiceApplicationConfiguration.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/conf/SelfServiceApplicationConfiguration.java
deleted file mode 100644
index aaface6..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/conf/SelfServiceApplicationConfiguration.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.conf;
-
-import com.epam.dlab.ServiceConfiguration;
-import com.epam.dlab.backendapi.domain.SchedulerConfigurationData;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.rest.client.RESTServiceFactory;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.dropwizard.client.JerseyClientConfiguration;
-import io.dropwizard.util.Duration;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import javax.validation.Valid;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-import java.util.Map;
-
-/**
- * Configuration for Self Service.
- */
-public class SelfServiceApplicationConfiguration extends ServiceConfiguration {
-
-	@Min(value = 2)
-	@JsonProperty
-	private int minEmrInstanceCount;
-
-	@Max(value = 1000)
-	@JsonProperty
-	private int maxEmrInstanceCount;
-
-	@Min(value = 10)
-	@JsonProperty
-	private int minEmrSpotInstanceBidPct;
-
-	@Max(value = 95)
-	@JsonProperty
-	private int maxEmrSpotInstanceBidPct;
-
-	@Min(value = 2)
-	@JsonProperty
-	private int minSparkInstanceCount;
-
-	@Max(value = 1000)
-	@JsonProperty
-	private int maxSparkInstanceCount;
-
-	@JsonProperty
-	private String ssnInstanceSize;
-
-	@JsonProperty
-	private boolean rolePolicyEnabled = false;
-
-	@JsonProperty
-	private boolean roleDefaultAccess = false;
-
-	@JsonProperty
-	private Duration checkEnvStatusTimeout = Duration.minutes(10);
-
-	@JsonProperty
-	private boolean billingSchedulerEnabled = false;
-
-	@NotEmpty
-	@JsonProperty
-	private String billingConfFile;
-	@JsonProperty
-	private int minInstanceCount;
-	@JsonProperty
-	private int maxInstanceCount;
-	@JsonProperty
-	private int minDataprocPreemptibleCount;
-	@JsonProperty
-	private int maxUserNameLength;
-	@JsonProperty
-	private boolean gcpOuauth2AuthenticationEnabled;
-	@JsonProperty
-	private boolean mongoMigrationEnabled;
-	@JsonProperty
-	private int privateKeySize = 2048;
-	@Valid
-	@NotNull
-	private Map<String, SchedulerConfigurationData> schedulers;
-
-
-	@Valid
-	@NotNull
-	@JsonProperty("jerseyClient")
-	private JerseyClientConfiguration jerseyClient = new JerseyClientConfiguration();
-
-	@Valid
-	@NotNull
-	@JsonProperty(ServiceConsts.MAVEN_SEARCH_API)
-	private RESTServiceFactory mavenApiFactory;
-
-	@Valid
-	@NotNull
-	private Map<String, String> guacamole;
-
-	private String serviceBaseName;
-	private String os;
-
-	private KeycloakConfiguration keycloakConfiguration = new KeycloakConfiguration();
-
-	public Map<String, String> getGuacamole() {
-		return guacamole;
-	}
-
-	public String getGuacamoleHost() {
-		return guacamole.get("serverHost");
-	}
-
-	public Integer getGuacamolePort() {
-		return Integer.valueOf(guacamole.get("serverPort"));
-	}
-
-	public JerseyClientConfiguration getJerseyClientConfiguration() {
-		return jerseyClient;
-	}
-
-	public Map<String, SchedulerConfigurationData> getSchedulers() {
-		return schedulers;
-	}
-
-	public boolean isGcpOuauth2AuthenticationEnabled() {
-		return gcpOuauth2AuthenticationEnabled;
-	}
-
-	/**
-	 * Returns the minimum number of slave EMR instances than could be created.
-	 */
-	public int getMinEmrInstanceCount() {
-		return minEmrInstanceCount;
-	}
-
-	/**
-	 * Returns the maximum number of slave EMR instances than could be created.
-	 */
-	public int getMaxEmrInstanceCount() {
-		return maxEmrInstanceCount;
-	}
-
-	/**
-	 * Returns the timeout for check the status of environment via provisioning service.
-	 */
-	public Duration getCheckEnvStatusTimeout() {
-		return checkEnvStatusTimeout;
-	}
-
-	public int getMinEmrSpotInstanceBidPct() {
-		return minEmrSpotInstanceBidPct;
-	}
-
-	public int getMaxEmrSpotInstanceBidPct() {
-		return maxEmrSpotInstanceBidPct;
-	}
-
-	public int getMinSparkInstanceCount() {
-		return minSparkInstanceCount;
-	}
-
-	public int getMaxSparkInstanceCount() {
-		return maxSparkInstanceCount;
-	}
-
-	/**
-	 * Return the <b>true</b> if using roles policy to DLab features.
-	 */
-	public boolean isRolePolicyEnabled() {
-		return rolePolicyEnabled;
-	}
-
-	/**
-	 * Return the default access to DLab features using roles policy.
-	 */
-	public boolean getRoleDefaultAccess() {
-		return roleDefaultAccess;
-	}
-
-
-	/**
-	 * Return the <b>true</b> if the billing scheduler is enabled.
-	 */
-	public boolean isBillingSchedulerEnabled() {
-		return billingSchedulerEnabled;
-	}
-
-	/**
-	 * Return the default access to DLab features using roles policy.
-	 */
-	public String getBillingConfFile() {
-		return billingConfFile;
-	}
-
-
-	public int getMinInstanceCount() {
-		return minInstanceCount;
-	}
-
-	public int getMaxInstanceCount() {
-		return maxInstanceCount;
-	}
-
-	public int getMinDataprocPreemptibleCount() {
-		return minDataprocPreemptibleCount;
-	}
-
-	public int getMaxUserNameLength() {
-		return maxUserNameLength;
-	}
-
-	public int getPrivateKeySize() {
-		return privateKeySize;
-	}
-
-	public String getSsnInstanceSize() {
-		return ssnInstanceSize;
-	}
-
-	public boolean isMongoMigrationEnabled() {
-		return mongoMigrationEnabled;
-	}
-
-	@NotNull
-	public RESTServiceFactory getMavenApiFactory() {
-		return mavenApiFactory;
-	}
-
-	public KeycloakConfiguration getKeycloakConfiguration() {
-		return keycloakConfiguration;
-	}
-
-	public String getServiceBaseName() {
-		return serviceBaseName;
-	}
-
-	public String getOs() {
-		return os;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BackupDao.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BackupDao.java
deleted file mode 100644
index e48c5ea..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BackupDao.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.resources.dto.BackupInfoRecord;
-import com.epam.dlab.dto.backup.EnvBackupDTO;
-import com.epam.dlab.dto.backup.EnvBackupStatus;
-
-import java.util.List;
-import java.util.Optional;
-
-public interface BackupDao {
-	void createOrUpdate(EnvBackupDTO dto, String user, EnvBackupStatus status);
-
-	List<BackupInfoRecord> getBackups(String userName);
-
-	Optional<BackupInfoRecord> getBackup(String userName, String id);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BackupDaoImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BackupDaoImpl.java
deleted file mode 100644
index f1b599c..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BackupDaoImpl.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.resources.dto.BackupInfoRecord;
-import com.epam.dlab.dto.backup.EnvBackupDTO;
-import com.epam.dlab.dto.backup.EnvBackupStatus;
-import com.google.inject.Singleton;
-import org.bson.Document;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-
-import static com.epam.dlab.backendapi.dao.MongoCollections.REQUEST_ID;
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.eq;
-
-@Singleton
-public class BackupDaoImpl extends BaseDAO implements BackupDao {
-	@Override
-	public void createOrUpdate(EnvBackupDTO dto, String user, EnvBackupStatus status) {
-		final Document idField = backupId(user, dto.getId());
-		final Document backupDocument = convertToBson(dto)
-				.append(STATUS, status.name())
-				.append(ERROR_MESSAGE, status.message())
-				.append(TIMESTAMP, new Date())
-				.append(ID, idField);
-		updateOne(MongoCollections.BACKUPS,
-				and(eq(ID, idField), eq(REQUEST_ID, dto.getId())),
-				new Document(SET, backupDocument), true);
-	}
-
-	@Override
-	public List<BackupInfoRecord> getBackups(String userName) {
-		return find(MongoCollections.BACKUPS, eq(String.format("%s.%s", ID, USER), userName), BackupInfoRecord.class);
-	}
-
-	@Override
-	public Optional<BackupInfoRecord> getBackup(String userName, String id) {
-		return findOne(MongoCollections.BACKUPS, eq(ID, backupId(userName, id)), BackupInfoRecord.class);
-	}
-
-	private Document backupId(String user, String id) {
-		return new Document(USER, user).append(REQUEST_ID, id);
-	}
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseBillingDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseBillingDAO.java
deleted file mode 100644
index 28a6c64..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseBillingDAO.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.domain.BillingReportLine;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.dto.billing.BillingResourceType;
-import com.google.inject.Inject;
-import com.mongodb.client.model.Aggregates;
-import com.mongodb.client.model.Filters;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.math.BigDecimal;
-import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
-
-import static com.epam.dlab.backendapi.dao.MongoCollections.BILLING;
-import static com.mongodb.client.model.Accumulators.max;
-import static com.mongodb.client.model.Accumulators.min;
-import static com.mongodb.client.model.Accumulators.sum;
-import static com.mongodb.client.model.Aggregates.group;
-import static com.mongodb.client.model.Aggregates.match;
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.gte;
-import static com.mongodb.client.model.Filters.in;
-import static com.mongodb.client.model.Filters.lte;
-import static com.mongodb.client.model.Filters.regex;
-import static java.util.Collections.singletonList;
-
-@Slf4j
-public class BaseBillingDAO extends BaseDAO implements BillingDAO {
-	private static final int ONE_HUNDRED = 100;
-	private static final String COST_FIELD = "$cost";
-	private static final String TOTAL_FIELD_NAME = "total";
-	private static final String PROJECT = "project";
-	private static final String APPLICATION = "application";
-	private static final String USAGE_DATE = "usageDate";
-	private static final String USER = "user";
-	private static final String RESOURCE_TYPE = "resource_type";
-	private static final String DLAB_ID = "dlabId";
-	private static final String FROM = "from";
-	private static final String TO = "to";
-	private static final String PRODUCT = "product";
-	private static final String CURRENCY = "currency";
-	private static final String COST = "cost";
-	private static final String RESOURCE_NAME = "resource_name";
-	private static final String ENDPOINT = "endpoint";
-	private static final String SHAPE = "shape";
-	private static final String EXPLORATORY = "exploratoryName";
-
-	@Inject
-	protected SettingsDAO settings;
-	@Inject
-	private UserSettingsDAO userSettingsDAO;
-	@Inject
-	private ProjectDAO projectDAO;
-
-	@Override
-	public Double getTotalCost() {
-		return aggregateBillingData(singletonList(group(null, sum(TOTAL_FIELD_NAME, COST_FIELD))));
-	}
-
-	@Override
-	public Double getUserCost(String user) {
-		final List<Bson> pipeline = Arrays.asList(match(eq(USER, user)),
-				group(null, sum(TOTAL_FIELD_NAME, COST_FIELD)));
-		return aggregateBillingData(pipeline);
-	}
-
-	@Override
-	public Double getProjectCost(String project) {
-		final List<Bson> pipeline = Arrays.asList(match(eq(PROJECT, project)),
-				group(null, sum(TOTAL_FIELD_NAME, COST_FIELD)));
-		return aggregateBillingData(pipeline);
-	}
-
-	@Override
-	public int getBillingQuoteUsed() {
-		return toPercentage(() -> settings.getMaxBudget(), getTotalCost());
-	}
-
-	@Override
-	public int getBillingUserQuoteUsed(String user) {
-		return toPercentage(() -> userSettingsDAO.getAllowedBudget(user), getUserCost(user));
-	}
-
-	@Override
-	public boolean isBillingQuoteReached() {
-		return getBillingQuoteUsed() >= ONE_HUNDRED;
-	}
-
-	@Override
-	public boolean isUserQuoteReached(String user) {
-		final Double userCost = getUserCost(user);
-		return userSettingsDAO.getAllowedBudget(user)
-				.filter(allowedBudget -> userCost.intValue() != 0 && allowedBudget <= userCost)
-				.isPresent();
-	}
-
-	@Override
-	public boolean isProjectQuoteReached(String project) {
-		final Double projectCost = getProjectCost(project);
-		return projectDAO.getAllowedBudget(project)
-				.filter(allowedBudget -> projectCost.intValue() != 0 && allowedBudget <= projectCost)
-				.isPresent();
-	}
-
-	@Override
-	public List<BillingReportLine> findBillingData(String project, String endpoint, List<String> resourceNames) {
-		return find(BILLING, and(eq(PROJECT, project), eq(ENDPOINT, endpoint), in(RESOURCE_NAME, resourceNames)), BillingReportLine.class);
-	}
-
-	@Override
-	public int getBillingProjectQuoteUsed(String project) {
-		return toPercentage(() -> projectDAO.getAllowedBudget(project), getProjectCost(project));
-	}
-
-	public List<BillingReportLine> aggregateBillingData(BillingFilter filter) {
-		List<Bson> pipeline = new ArrayList<>();
-		List<Bson> matchCriteria = matchCriteria(filter);
-		if (!matchCriteria.isEmpty()) {
-			pipeline.add(Aggregates.match(Filters.and(matchCriteria)));
-		}
-		pipeline.add(groupCriteria());
-		return StreamSupport.stream(getCollection(BILLING).aggregate(pipeline).spliterator(), false)
-				.map(this::toBillingReport)
-				.collect(Collectors.toList());
-	}
-
-	@Override
-	public void deleteByUsageDate(String application, String usageDate) {
-		deleteMany(BILLING, and(eq(APPLICATION, application), eq(USAGE_DATE, usageDate)));
-	}
-
-	@Override
-	public void deleteByUsageDateRegex(String application, String usageDate) {
-		deleteMany(BILLING, and(eq(APPLICATION, application), regex(USAGE_DATE, "^" + usageDate)));
-	}
-
-	@Override
-	public void save(List<BillingReportLine> billingData) {
-		if (CollectionUtils.isNotEmpty(billingData)) {
-			insertMany(BILLING, new ArrayList<>(billingData));
-		}
-	}
-
-	private Integer toPercentage(Supplier<Optional<Integer>> allowedBudget, Double totalCost) {
-		return allowedBudget.get()
-				.map(userBudget -> (totalCost * ONE_HUNDRED) / userBudget)
-				.map(Double::intValue)
-				.orElse(BigDecimal.ZERO.intValue());
-	}
-
-	private Double aggregateBillingData(List<Bson> pipeline) {
-		return Optional.ofNullable(aggregate(BILLING, pipeline).first())
-				.map(d -> d.getDouble(TOTAL_FIELD_NAME))
-				.orElse(BigDecimal.ZERO.doubleValue());
-	}
-
-	private Bson groupCriteria() {
-		return group(getGroupingFields(USER, DLAB_ID, RESOURCE_TYPE, RESOURCE_NAME, PROJECT, PRODUCT, CURRENCY, SHAPE, EXPLORATORY),
-				sum(COST, "$" + COST),
-				min(FROM, "$" + FROM),
-				max(TO, "$" + TO));
-	}
-
-	private List<Bson> matchCriteria(BillingFilter filter) {
-		List<Bson> searchCriteria = new ArrayList<>();
-
-		if (CollectionUtils.isNotEmpty(filter.getUsers())) {
-			searchCriteria.add(in(USER, filter.getUsers()));
-		}
-		if (CollectionUtils.isNotEmpty(filter.getResourceTypes())) {
-			searchCriteria.add(in(RESOURCE_TYPE, filter.getResourceTypes()));
-		}
-		if (StringUtils.isNotEmpty(filter.getDlabId())) {
-			searchCriteria.add(regex(DLAB_ID, filter.getDlabId(), "i"));
-		}
-		if (StringUtils.isNotEmpty(filter.getDateStart())) {
-			searchCriteria.add(gte(USAGE_DATE, filter.getDateStart()));
-		}
-		if (StringUtils.isNotEmpty(filter.getDateEnd())) {
-			searchCriteria.add(lte(USAGE_DATE, filter.getDateEnd()));
-		}
-		if (CollectionUtils.isNotEmpty(filter.getProjects())) {
-			searchCriteria.add(in(PROJECT, filter.getProjects()));
-		}
-		if (CollectionUtils.isNotEmpty(filter.getProducts())) {
-			searchCriteria.add(in(PRODUCT, filter.getProducts()));
-		}
-		if (CollectionUtils.isNotEmpty(filter.getShapes())) {
-			searchCriteria.add(regex(SHAPE, "(" + String.join("|", filter.getShapes()) + ")"));
-		}
-
-		return searchCriteria;
-	}
-
-	private BillingReportLine toBillingReport(Document d) {
-		Document id = (Document) d.get("_id");
-		return BillingReportLine.builder()
-				.dlabId(id.getString(DLAB_ID))
-				.project(id.getString(PROJECT))
-				.resourceName(id.getString(RESOURCE_NAME))
-				.exploratoryName(id.getString(EXPLORATORY))
-				.shape(id.getString(SHAPE))
-				.user(id.getString(USER))
-				.product(id.getString(PRODUCT))
-				.resourceType(Optional.ofNullable(id.getString(RESOURCE_TYPE)).map(BillingResourceType::valueOf).orElse(null))
-				.usageDateFrom(d.getDate(FROM).toInstant().atZone(ZoneId.systemDefault()).toLocalDate())
-				.usageDateTo(d.getDate(TO).toInstant().atZone(ZoneId.systemDefault()).toLocalDate())
-				.cost(BigDecimal.valueOf(d.getDouble(COST)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())
-				.currency(id.getString(CURRENCY))
-				.build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java
deleted file mode 100644
index c2ff69b..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseDAO.java
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.mongo.MongoService;
-import com.epam.dlab.util.mongo.modules.IsoDateModule;
-import com.epam.dlab.util.mongo.modules.JavaPrimitiveModule;
-import com.epam.dlab.util.mongo.modules.MongoModule;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.inject.Inject;
-import com.mongodb.BasicDBObject;
-import com.mongodb.MongoException;
-import com.mongodb.client.AggregateIterable;
-import com.mongodb.client.FindIterable;
-import com.mongodb.client.MongoCollection;
-import com.mongodb.client.MongoCursor;
-import com.mongodb.client.MongoIterable;
-import com.mongodb.client.model.UpdateOptions;
-import com.mongodb.client.result.DeleteResult;
-import com.mongodb.client.result.UpdateResult;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.UUID;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.exists;
-import static com.mongodb.client.model.Filters.ne;
-
-/**
- * Implements the base API for Mongo database.
- */
-public class BaseDAO {
-	private static final Logger LOGGER = LoggerFactory.getLogger(BaseDAO.class);
-
-	private static final ObjectMapper MAPPER = new ObjectMapper()
-			.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true)
-			.registerModule(new IsoDateModule())
-			.registerModule(new JavaPrimitiveModule())
-			.registerModule(new MongoModule());
-
-	static final String FIELD_SET_DELIMETER = ".$.";
-	public static final String ID = "_id";
-	static final String SET = "$set";
-	public static final String USER = "user";
-	protected static final String INSTANCE_ID = "instance_id";
-	protected static final String EDGE_STATUS = "edge_status";
-	public static final String STATUS = "status";
-	public static final String ERROR_MESSAGE = "error_message";
-	static final String TIMESTAMP = "timestamp";
-	static final String REUPLOAD_KEY_REQUIRED = "reupload_key_required";
-	protected static final String ADD_TO_SET = "$addToSet";
-	protected static final String UNSET_OPERATOR = "$unset";
-	private static final String PULL = "$pull";
-	private static final String PULL_ALL = "$pullAll";
-	private static final String EACH = "$each";
-	private static final String ELEMENT_AT_OPERATOR = "$arrayElemAt";
-
-	@Inject
-	protected MongoService mongoService;
-
-	/**
-	 * Return <b>true</b> if collection exists.
-	 *
-	 * @param name collection name.
-	 */
-	boolean collectionExists(String name) {
-		return mongoService.collectionExists(name);
-	}
-
-	/**
-	 * Return Mongo collection.
-	 *
-	 * @param collection collection name.
-	 */
-	public MongoCollection<Document> getCollection(String collection) {
-		return mongoService.getCollection(collection);
-	}
-
-	/**
-	 * Inserts the document into the collection.
-	 *
-	 * @param collection collection name.
-	 * @param supplier   document.
-	 */
-	protected void insertOne(String collection, Supplier<Document> supplier) {
-		insertOne(collection, supplier, generateUUID());
-	}
-
-	/**
-	 * Inserts the document into the collection with given the unique id.
-	 *
-	 * @param collection collection name.
-	 * @param document   document.
-	 * @param uuid       unique id.
-	 */
-	protected void insertOne(String collection, Supplier<Document> document, String uuid) {
-		try {
-			mongoService.getCollection(collection)
-					.insertOne(document.get()
-							.append(ID, uuid)
-							.append(TIMESTAMP, new Date()));
-		} catch (MongoException e) {
-			LOGGER.warn("Insert to Mongo DB fails: {}", e.getLocalizedMessage(), e);
-			throw new DlabException("Insert to Mongo DB failed: " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Serializes the object and inserts into the collection.
-	 *
-	 * @param collection collection name.
-	 * @param object     for inserting to collection.
-	 */
-	protected void insertOne(String collection, Object object) {
-		insertOne(collection, object, generateUUID());
-	}
-
-	/**
-	 * Serializes the object and inserts into the collection.
-	 *
-	 * @param collection collection name.
-	 * @param object     for inserting to collection.
-	 * @param uuid       unique id.
-	 */
-	protected void insertOne(String collection, Object object, String uuid) {
-		try {
-			mongoService.getCollection(collection)
-					.insertOne(convertToBson(object)
-							.append(ID, uuid)
-							.append(TIMESTAMP, new Date()));
-		} catch (MongoException e) {
-			LOGGER.warn("Insert to Mongo DB fails: {}", e.getLocalizedMessage(), e);
-			throw new DlabException("Insert to Mongo DB fails: " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Serializes objects and inserts into the collection.
-	 *
-	 * @param collection collection name.
-	 * @param object     for inserting to collection.
-	 */
-	protected void insertMany(String collection, List<Object> object) {
-		try {
-			mongoService.getCollection(collection)
-					.insertMany(convertToBson(object)
-							.stream()
-							.peek(o -> {
-								o.append(ID, generateUUID());
-								o.append(TIMESTAMP, new Date());
-							})
-							.collect(Collectors.toList())
-					);
-		} catch (MongoException e) {
-			LOGGER.warn("Insert to Mongo DB fails: {}", e.getLocalizedMessage(), e);
-			throw new DlabException("Insert to Mongo DB fails: " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Updates single document in the collection by condition.
-	 *
-	 * @param collection collection name.
-	 * @param condition  condition for search documents in collection.
-	 * @param document   document.
-	 */
-	protected UpdateResult updateOne(String collection, Bson condition, Bson document) {
-		try {
-			return mongoService.getCollection(collection)
-					.updateOne(condition, document);
-		} catch (MongoException e) {
-			LOGGER.warn("Update Mongo DB fails: {}", e.getLocalizedMessage(), e);
-			throw new DlabException("Update to Mongo DB fails: " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Update or insert single document in the collection by condition.
-	 *
-	 * @param collection collection name.
-	 * @param condition  condition for search documents in collection.
-	 * @param document   document.
-	 * @param isUpsert   if <b>true</b> document will be updated or inserted.
-	 */
-	protected void updateOne(String collection, Bson condition, Bson document, boolean isUpsert) {
-		try {
-			if (isUpsert) {
-				mongoService.getCollection(collection).updateOne(condition, document,
-						new UpdateOptions().upsert(true));
-			} else {
-				mongoService.getCollection(collection).updateOne(condition, document);
-			}
-		} catch (MongoException e) {
-			LOGGER.warn("Upsert Mongo DB fails: {}", e.getLocalizedMessage(), e);
-			throw new DlabException("Upsert to Mongo DB fails: " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Updates all documents in the collection by condition.
-	 *
-	 * @param collection collection name.
-	 * @param condition  condition for search documents in collection.
-	 * @param document   document.
-	 */
-	UpdateResult updateMany(String collection, Bson condition, Bson document) {
-		try {
-			return mongoService.getCollection(collection)
-					.updateMany(condition, document);
-		} catch (MongoException e) {
-			LOGGER.warn("Update Mongo DB fails: {}", e.getLocalizedMessage(), e);
-			throw new DlabException("Insert to Mongo DB fails: " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Removes single document in the collection by condition.
-	 *
-	 * @param collection collection name.
-	 * @param condition  condition for search documents in collection.
-	 */
-	protected DeleteResult deleteOne(String collection, Bson condition) {
-		try {
-			return mongoService.getCollection(collection)
-					.deleteOne(condition);
-		} catch (MongoException e) {
-			LOGGER.warn("Removing document from Mongo DB fails: {}", e.getLocalizedMessage(), e);
-			throw new DlabException("Removing document from Mongo DB fails: " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Removes many documents in the collection by condition.
-	 *
-	 * @param collection collection name.
-	 * @param condition  condition for search documents in collection.
-	 */
-	protected DeleteResult deleteMany(String collection, Bson condition) {
-		try {
-			return mongoService.getCollection(collection)
-					.deleteMany(condition);
-		} catch (MongoException e) {
-			LOGGER.warn("Removing document from Mongo DB fails: {}", e.getLocalizedMessage(), e);
-			throw new DlabException("Removing document from Mongo DB fails: " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Finds and returns all documents from the collection.
-	 *
-	 * @param collection collection name.
-	 */
-	protected FindIterable<Document> find(String collection) {
-		return mongoService.getCollection(collection).find();
-	}
-
-	/**
-	 * Finds and returns documents from the collection by condition.
-	 *
-	 * @param collection collection name.
-	 * @param condition  condition for search documents in collection.
-	 */
-	protected FindIterable<Document> find(String collection, Bson condition) {
-		return mongoService.getCollection(collection)
-				.find(condition);
-	}
-
-	/**
-	 * Finds and returns all documents from the collection converted to resulted type.
-	 *
-	 * @param collection    collection name.
-	 * @param resultedClass type of class for deserialization.
-	 */
-	protected <T> List<T> find(String collection, Class<T> resultedClass) {
-		return find(collection)
-				.into(new ArrayList<>())
-				.stream()
-				.map(d -> convertFromDocument(d, resultedClass))
-				.collect(Collectors.toList());
-	}
-
-	/**
-	 * Finds and returns documents from the collection by condition.
-	 *
-	 * @param collection    collection name.
-	 * @param condition     condition for search documents in collection.
-	 * @param resultedClass type of class for deserialization.
-	 */
-	protected <T> List<T> find(String collection, Bson condition, Class<T> resultedClass) {
-		return mongoService.getCollection(collection)
-				.find(condition)
-				.into(new ArrayList<>())
-				.stream()
-				.map(d -> convertFromDocument(d, resultedClass))
-				.collect(Collectors.toList());
-	}
-
-	/**
-	 * Finds and returns documents with the specified fields from the collection by condition.
-	 *
-	 * @param collection collection name.
-	 * @param condition  condition for search documents in collection.
-	 * @param projection document describing the fields in the collection to return.
-	 */
-	protected FindIterable<Document> find(String collection, Bson condition, Bson projection) {
-		return mongoService.getCollection(collection)
-				.find(condition)
-				.projection(projection);
-	}
-
-	/**
-	 * Aggregates and returns documents according to the specified aggregation pipeline.
-	 *
-	 * @param collection collection name.
-	 * @param pipeline   the aggregate pipeline.
-	 */
-	public AggregateIterable<Document> aggregate(String collection,
-												 List<? extends Bson> pipeline) {
-		return mongoService.getCollection(collection)
-				.aggregate(pipeline);
-	}
-
-	/**
-	 * Checks that the documents iterator have one document only.
-	 *
-	 * @param documents documents
-	 */
-	private Optional<Document> limitOne(MongoIterable<Document> documents) {
-		Document first = documents.first();
-		try (MongoCursor<Document> iterator = documents.iterator()) {
-			if (iterator.hasNext()) {
-				iterator.next();
-				if (iterator.hasNext()) {
-					throw new DlabException("too many items found while one is expected");
-				}
-			}
-		}
-		return Optional.ofNullable(first);
-	}
-
-	/**
-	 * Finds and returns one document from the collection by condition.
-	 *
-	 * @param collection collection name.
-	 * @param condition  condition for search documents in collection.
-	 * @throws DlabException if documents iterator have more than one document.
-	 */
-	protected Optional<Document> findOne(String collection, Bson condition) {
-		FindIterable<Document> found = find(collection, condition);
-		return limitOne(found);
-	}
-
-	/**
-	 * Finds and returns one document with the specified fields from the collection by condition.
-	 *
-	 * @param collection collection name.
-	 * @param condition  condition for search documents in collection.
-	 * @param projection document describing the fields in the collection to return.
-	 * @throws DlabException if documents iterator have more than one document.
-	 */
-	protected Optional<Document> findOne(String collection,
-										 Bson condition,
-										 Bson projection) {
-		FindIterable<Document> found = find(collection, condition, projection);
-			return limitOne(found);
-	}
-
-	/**
-	 * Serializes given object to document and returns it.
-	 *
-	 * @param object object
-	 */
-	Document convertToBson(Object object) {
-		try {
-			return Document.parse(MAPPER.writeValueAsString(object));
-		} catch (IOException e) {
-			throw new DlabException("error converting to bson", e);
-		}
-	}
-
-	List<Document> convertToBson(List<Object> objects) {
-		return objects
-				.stream()
-				.map(this::convertToBson)
-				.collect(Collectors.toList());
-	}
-
-	/**
-	 * Finds and returns one object as given class from the collection by condition.
-	 *
-	 * @param collection collection name.
-	 * @param condition  condition for search documents in collection.
-	 * @param clazz      type of class for deserialization.
-	 */
-	protected <T> Optional<T> findOne(String collection, Bson condition, Class<T> clazz) {
-		Optional<Document> doc = findOne(collection, condition);
-		return doc.map(document -> convertFromDocument(document, clazz));
-	}
-
-	/**
-	 * Finds and returns one object as given class and with the specified fields from the collection by condition.
-	 *
-	 * @param collection collection name.
-	 * @param condition  condition for search documents in collection.
-	 * @param projection document describing the fields in the collection to return.
-	 * @param clazz      type of class for deserialization.
-	 */
-	protected <T> Optional<T> findOne(String collection, Bson condition, Bson projection, Class<T> clazz) {
-		Optional<Document> doc = findOne(collection, condition, projection);
-		return doc.map(document -> convertFromDocument(document, clazz));
-	}
-
-	/**
-	 * Deserializes given document to object and returns it.
-	 *
-	 * @param document element from database
-	 */
-	<T> T convertFromDocument(Document document, Class<T> clazz) {
-		try {
-			String json = document.toJson();
-			return MAPPER.readValue(json, clazz);
-		} catch (IOException e) {
-			throw new DlabException("error converting from document with id " + document.get(ID), e);
-		}
-	}
-
-	<T> T convertFromDocument(List<Document> documents, TypeReference<T> valueTypeRef) {
-		final String jsonArray = documents.stream()
-				.map(Document::toJson)
-				.collect(Collectors.joining(",", "[", "]"));
-		try {
-			return MAPPER.readValue(jsonArray, valueTypeRef);
-		} catch (IOException e) {
-			throw new DlabException("error converting array " + jsonArray, e);
-		}
-	}
-
-	protected Document getGroupingFields(String... fieldNames) {
-		Document d = new Document();
-		for (String name : fieldNames) {
-			d.put(name, "$" + name);
-		}
-		return d;
-	}
-
-	protected Stream<Document> stream(Iterable<Document> iterable) {
-		return StreamSupport.stream(iterable.spliterator(), false);
-	}
-
-	List<String> statusList(UserInstanceStatus[] statuses) {
-		return Arrays.stream(statuses).map(UserInstanceStatus::toString).collect(Collectors.toList());
-	}
-
-	List<String> statusList(List<UserInstanceStatus> statuses) {
-		return statuses.stream().map(UserInstanceStatus::toString).collect(Collectors.toList());
-	}
-
-	/**
-	 * Returns a unique id.
-	 */
-	private String generateUUID() {
-		return UUID.randomUUID().toString();
-	}
-
-	protected BasicDBObject addToSet(String columnName, Set<String> values) {
-		return new BasicDBObject(ADD_TO_SET, new BasicDBObject(columnName, new BasicDBObject(EACH, values)));
-	}
-
-	protected Bson unset(String columnName, String value) {
-		return new BasicDBObject(UNSET_OPERATOR, new BasicDBObject(columnName, value));
-	}
-
-	protected BasicDBObject pull(String columnName, String value) {
-		return new BasicDBObject(PULL, new BasicDBObject(columnName, value));
-	}
-
-	protected BasicDBObject pullAll(String columnName, Set<String> values) {
-		return new BasicDBObject(PULL_ALL, new BasicDBObject(columnName, values));
-	}
-
-	protected Document elementAt(String arrayColumnName, int index) {
-		return new Document(ELEMENT_AT_OPERATOR, Arrays.asList("$" + arrayColumnName, index));
-	}
-
-	protected Document elementAt(Bson bson, int index) {
-		return new Document(ELEMENT_AT_OPERATOR, Arrays.asList(bson, index));
-	}
-
-	protected Bson notNull(String fieldName) {
-		return and(exists(fieldName), ne(fieldName, null));
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BillingDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BillingDAO.java
deleted file mode 100644
index 67630cd..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BillingDAO.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.domain.BillingReportLine;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-
-import java.util.List;
-
-public interface BillingDAO {
-	Double getTotalCost();
-
-	Double getUserCost(String user);
-
-	Double getProjectCost(String project);
-
-	int getBillingQuoteUsed();
-
-	int getBillingUserQuoteUsed(String user);
-
-	int getBillingProjectQuoteUsed(String project);
-
-	boolean isBillingQuoteReached();
-
-	boolean isUserQuoteReached(String user);
-
-	boolean isProjectQuoteReached(String project);
-
-	List<BillingReportLine> findBillingData(String project, String endpoint, List<String> resourceNames);
-
-	List<BillingReportLine> aggregateBillingData(BillingFilter filter);
-
-	void deleteByUsageDate(String application, String usageDate);
-
-	void deleteByUsageDateRegex(String application, String usageDate);
-
-	void save(List<BillingReportLine> billingData);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ComputationalDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ComputationalDAO.java
deleted file mode 100644
index 683f8fc..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ComputationalDAO.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-
-import com.epam.dlab.backendapi.util.DateRemoverUtil;
-import com.epam.dlab.dto.ResourceURL;
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.dto.StatusEnvBaseDTO;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.computational.ComputationalStatusDTO;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.exceptions.DlabException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.mongodb.client.model.Filters;
-import com.mongodb.client.result.UpdateResult;
-import lombok.extern.slf4j.Slf4j;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.COMPUTATIONAL_RESOURCES;
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.UPTIME;
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.exploratoryCondition;
-import static com.epam.dlab.backendapi.dao.MongoCollections.USER_INSTANCES;
-import static com.epam.dlab.backendapi.dao.SchedulerJobDAO.SCHEDULER_DATA;
-import static com.epam.dlab.dto.UserInstanceStatus.TERMINATED;
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.in;
-import static com.mongodb.client.model.Filters.ne;
-import static com.mongodb.client.model.Filters.not;
-import static com.mongodb.client.model.Projections.elemMatch;
-import static com.mongodb.client.model.Projections.excludeId;
-import static com.mongodb.client.model.Projections.fields;
-import static com.mongodb.client.model.Projections.include;
-import static com.mongodb.client.model.Updates.push;
-import static com.mongodb.client.model.Updates.set;
-import static java.util.stream.Collectors.toList;
-
-/**
- * DAO for user computational resources.
- */
-@Slf4j
-public class ComputationalDAO extends BaseDAO {
-	static final String COMPUTATIONAL_NAME = "computational_name";
-	static final String COMPUTATIONAL_ID = "computational_id";
-	static final String PROJECT = "project";
-
-	static final String IMAGE = "image";
-	private static final String COMPUTATIONAL_URL = "computational_url";
-	private static final String EXPLORATORY_NAME = "exploratory_name";
-	private static final String COMPUTATIONAL_URL_DESC = "description";
-	private static final String COMPUTATIONAL_URL_URL = "url";
-	private static final String COMPUTATIONAL_LAST_ACTIVITY = "last_activity";
-	private static final String CONFIG = "config";
-
-	private static String computationalFieldFilter(String fieldName) {
-		return COMPUTATIONAL_RESOURCES + FIELD_SET_DELIMETER + fieldName;
-	}
-
-	private static Bson computationalCondition(String user, String project, String exploratoryName, String compName) {
-		return and(eq(USER, user), eq(PROJECT, project), eq(EXPLORATORY_NAME, exploratoryName),
-				eq(COMPUTATIONAL_RESOURCES + "." + COMPUTATIONAL_NAME, compName));
-	}
-
-	/**
-	 * Add the user's computational resource for notebook into database.
-	 *
-	 * @param user             user name.
-	 * @param exploratoryName  name of exploratory.
-	 * @param project          name of project
-	 * @param computationalDTO object of computational resource.
-	 * @return <b>true</b> if operation was successful, otherwise <b>false</b>.
-	 */
-	public boolean addComputational(String user, String exploratoryName, String project,
-									UserComputationalResource computationalDTO) {
-		final UpdateResult updateResult = updateOne(USER_INSTANCES,
-				and(exploratoryCondition(user, exploratoryName, project),
-						not(elemMatch(COMPUTATIONAL_RESOURCES,
-								eq(COMPUTATIONAL_NAME, computationalDTO.getComputationalName())))),
-				push(COMPUTATIONAL_RESOURCES, convertToBson(computationalDTO)));
-		return updateResult.getModifiedCount() > 0;
-	}
-
-	/**
-	 * Finds and returns the of computational resource.
-	 *
-	 * @param user              user name.
-	 * @param project           project name
-	 * @param exploratoryName   the name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @throws DlabException if exception occurs
-	 */
-	public UserComputationalResource fetchComputationalFields(String user, String project, String exploratoryName,
-															  String computationalName) {
-		Optional<UserInstanceDTO> opt = findOne(USER_INSTANCES,
-				and(exploratoryCondition(user, exploratoryName, project),
-						Filters.elemMatch(COMPUTATIONAL_RESOURCES, eq(COMPUTATIONAL_NAME, computationalName))),
-				fields(include(COMPUTATIONAL_RESOURCES + ".$"), excludeId()),
-				UserInstanceDTO.class);
-		return opt.map(UserInstanceDTO::getResources)
-				.filter(l -> !l.isEmpty())
-				.map(l -> l.get(0))
-				.orElseThrow(() -> new DlabException("Computational resource " + computationalName + " for user " + user + " with " +
-						"exploratory name " + exploratoryName + " not found."));
-	}
-
-	public List<UserComputationalResource> findComputationalResourcesWithStatus(String user, String project, String exploratoryName,
-																				UserInstanceStatus status) {
-		final UserInstanceDTO userInstanceDTO = findOne(USER_INSTANCES,
-				and(exploratoryCondition(user, exploratoryName, project),
-						elemMatch(COMPUTATIONAL_RESOURCES, eq(STATUS, status.toString()))),
-				fields(include(COMPUTATIONAL_RESOURCES), excludeId()),
-				UserInstanceDTO.class)
-				.orElseThrow(() -> new DlabException(String.format("Computational resource with status %s for user " +
-						"%s with exploratory name %s not found.", status, user, exploratoryName)));
-		return userInstanceDTO.getResources()
-				.stream()
-				.filter(computationalResource -> computationalResource.getStatus().equals(status.toString()))
-				.collect(toList());
-	}
-
-	/**
-	 * Updates the status of computational resource in Mongo database.
-	 *
-	 * @param dto object of computational resource status.
-	 * @return The result of an update operation.
-	 */
-	public UpdateResult updateComputationalStatus(ComputationalStatusDTO dto) {
-		try {
-			Document values = new Document(computationalFieldFilter(STATUS), dto.getStatus());
-			return updateOne(USER_INSTANCES,
-					and(exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
-							elemMatch(COMPUTATIONAL_RESOURCES,
-									and(eq(COMPUTATIONAL_NAME, dto.getComputationalName()),
-											not(eq(STATUS, TERMINATED.toString()))))),
-					new Document(SET, values));
-		} catch (Exception t) {
-			throw new DlabException("Could not update computational resource status", t);
-		}
-	}
-
-	/**
-	 * Updates the status of exploratory notebooks in Mongo database.
-	 *
-	 * @param dto object of exploratory status info.
-	 * @return The result of an update operation.
-	 */
-	public int updateComputationalStatusesForExploratory(StatusEnvBaseDTO<?> dto) {
-		Document values = new Document(computationalFieldFilter(STATUS), dto.getStatus());
-		values.append(computationalFieldFilter(UPTIME), null);
-		int count = 0;
-		UpdateResult result;
-		do {
-			result = updateOne(USER_INSTANCES,
-					and(exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
-							elemMatch(COMPUTATIONAL_RESOURCES,
-									and(not(eq(STATUS, TERMINATED.toString())),
-											not(eq(STATUS, dto.getStatus()))))),
-					new Document(SET, values));
-			count += result.getModifiedCount();
-		}
-		while (result.getModifiedCount() > 0);
-
-		return count;
-	}
-
-	public void updateComputationalStatusesForExploratory(String user, String project, String exploratoryName,
-														  UserInstanceStatus dataengineStatus,
-														  UserInstanceStatus dataengineServiceStatus,
-														  UserInstanceStatus... excludedStatuses) {
-		updateComputationalResource(user, project, exploratoryName, dataengineStatus,
-				DataEngineType.SPARK_STANDALONE, excludedStatuses);
-		updateComputationalResource(user, project, exploratoryName, dataengineServiceStatus,
-				DataEngineType.CLOUD_SERVICE, excludedStatuses);
-	}
-
-	/**
-	 * Updates the status for single computational resource in Mongo database.
-	 *
-	 * @param user              user name.
-	 * @param project           project name
-	 * @param exploratoryName   exploratory's name.
-	 * @param computationalName name of computational resource.
-	 * @param newStatus         new status of computational resource.
-	 */
-
-	public void updateStatusForComputationalResource(String user, String project, String exploratoryName,
-													 String computationalName, UserInstanceStatus newStatus) {
-		updateComputationalField(user, project, exploratoryName, computationalName, STATUS, newStatus.toString());
-	}
-
-
-	private void updateComputationalResource(String user, String project, String exploratoryName,
-											 UserInstanceStatus dataengineServiceStatus, DataEngineType cloudService,
-											 UserInstanceStatus... excludedStatuses) {
-		UpdateResult result;
-		do {
-			result = updateMany(USER_INSTANCES,
-					computationalFilter(user, project, exploratoryName,
-							dataengineServiceStatus.toString(), DataEngineType.getDockerImageName(cloudService), excludedStatuses),
-					new Document(SET,
-							new Document(computationalFieldFilter(STATUS), dataengineServiceStatus.toString())));
-		} while (result.getModifiedCount() > 0);
-	}
-
-	private Bson computationalFilter(String user, String project, String exploratoryName, String computationalStatus,
-									 String computationalImage, UserInstanceStatus[] excludedStatuses) {
-		final String[] statuses = Arrays.stream(excludedStatuses)
-				.map(UserInstanceStatus::toString)
-				.toArray(String[]::new);
-		return and(exploratoryCondition(user, exploratoryName, project),
-				elemMatch(COMPUTATIONAL_RESOURCES, and(eq(IMAGE, computationalImage),
-						not(in(STATUS, statuses)),
-						not(eq(STATUS, computationalStatus)))));
-	}
-
-	/**
-	 * Updates the info of computational resource in Mongo database.
-	 *
-	 * @param dto object of computational resource status.
-	 * @return The result of an update operation.
-	 * @throws DlabException if exception occurs
-	 */
-	public UpdateResult updateComputationalFields(ComputationalStatusDTO dto) {
-		try {
-			Document values = new Document(computationalFieldFilter(STATUS), dto.getStatus());
-			if (dto.getUptime() != null) {
-				values.append(computationalFieldFilter(UPTIME), dto.getUptime());
-			}
-			if (dto.getInstanceId() != null) {
-				values.append(computationalFieldFilter(INSTANCE_ID), dto.getInstanceId());
-			}
-			if (null != dto.getErrorMessage()) {
-				values.append(computationalFieldFilter(ERROR_MESSAGE),
-						DateRemoverUtil.removeDateFormErrorMessage(dto.getErrorMessage()));
-			}
-			if (dto.getComputationalId() != null) {
-				values.append(computationalFieldFilter(COMPUTATIONAL_ID), dto.getComputationalId());
-			}
-			if (dto.getResourceUrl() != null && !dto.getResourceUrl().isEmpty()) {
-				values.append(computationalFieldFilter(COMPUTATIONAL_URL), getResourceUrlData(dto));
-			}
-			if (dto.getLastActivity() != null) {
-				values.append(computationalFieldFilter(COMPUTATIONAL_LAST_ACTIVITY), dto.getLastActivity());
-			}
-			if (dto.getConfig() != null) {
-				values.append(computationalFieldFilter(CONFIG),
-						dto.getConfig().stream().map(this::convertToBson).collect(toList()));
-			}
-			return updateOne(USER_INSTANCES, and(exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
-					elemMatch(COMPUTATIONAL_RESOURCES,
-							and(eq(COMPUTATIONAL_NAME, dto.getComputationalName()),
-									not(eq(STATUS, TERMINATED.toString()))))),
-					new Document(SET, values));
-		} catch (Exception t) {
-			throw new DlabException("Could not update computational resource status", t);
-		}
-	}
-
-	private List<Map<String, String>> getResourceUrlData(ComputationalStatusDTO dto) {
-		return dto.getResourceUrl().stream()
-				.map(this::toUrlDocument)
-				.collect(toList());
-	}
-
-	private LinkedHashMap<String, String> toUrlDocument(ResourceURL url) {
-		LinkedHashMap<String, String> map = new LinkedHashMap<>();
-		map.put(COMPUTATIONAL_URL_DESC, url.getDescription());
-		map.put(COMPUTATIONAL_URL_URL, url.getUrl());
-		return map;
-	}
-
-	/**
-	 * Updates the requirement for reuploading key for single computational resource in Mongo database.
-	 *
-	 * @param user                user name.
-	 * @param project             project name
-	 * @param exploratoryName     exploratory's name.
-	 * @param computationalName   name of computational resource.
-	 * @param reuploadKeyRequired true/false.
-	 */
-
-	public void updateReuploadKeyFlagForComputationalResource(String user, String project, String exploratoryName,
-															  String computationalName, boolean reuploadKeyRequired) {
-		updateComputationalField(user, project, exploratoryName, computationalName, REUPLOAD_KEY_REQUIRED, reuploadKeyRequired);
-	}
-
-	/**
-	 * Returns names of computational resources which status is among existing ones. Also these resources will
-	 * have predefined type.
-	 *
-	 * @param user                  user name.
-	 * @param project               project name
-	 * @param computationalTypes    type list of computational resource which may contain 'dataengine' and/or
-	 *                              'dataengine-service'.
-	 * @param exploratoryName       name of exploratory.
-	 * @param computationalStatuses statuses of computational resource.
-	 * @return list of computational resources' names
-	 */
-
-	@SuppressWarnings("unchecked")
-	public List<String> getComputationalResourcesWhereStatusIn(String user, String project,
-															   List<DataEngineType> computationalTypes,
-															   String exploratoryName,
-															   UserInstanceStatus... computationalStatuses) {
-		return stream((List<Document>) find(USER_INSTANCES, exploratoryCondition(user, exploratoryName, project),
-				fields(include(COMPUTATIONAL_RESOURCES))).first().get(COMPUTATIONAL_RESOURCES))
-				.filter(doc ->
-						statusList(computationalStatuses).contains(doc.getString(STATUS)) &&
-								computationalTypes.contains(DataEngineType.fromDockerImageName(doc.getString(IMAGE))))
-				.map(doc -> doc.getString(COMPUTATIONAL_NAME)).collect(toList());
-	}
-
-	@SuppressWarnings("unchecked")
-	public List<ClusterConfig> getClusterConfig(String user, String project, String exploratoryName, String computationalName) {
-		return findOne(USER_INSTANCES,
-				and(exploratoryCondition(user, exploratoryName, project),
-						Filters.elemMatch(COMPUTATIONAL_RESOURCES, and(eq(COMPUTATIONAL_NAME, computationalName),
-								notNull(CONFIG)))),
-				fields(include(COMPUTATIONAL_RESOURCES + ".$"), excludeId())
-		).map(d -> ((List<Document>) d.get(COMPUTATIONAL_RESOURCES)).get(0))
-				.map(d -> convertFromDocument((List<Document>) d.get(CONFIG),
-						new TypeReference<List<ClusterConfig>>() {
-						}))
-				.orElse(Collections.emptyList());
-	}
-
-	/**
-	 * Updates computational resource's field.
-	 *
-	 * @param user              user name.
-	 * @param project           project name
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @param fieldName         computational field's name for updating.
-	 * @param fieldValue        computational field's value for updating.
-	 */
-
-	private <T> UpdateResult updateComputationalField(String user, String project, String exploratoryName, String computationalName,
-													  String fieldName, T fieldValue) {
-		return updateOne(USER_INSTANCES,
-				computationalCondition(user, project, exploratoryName, computationalName),
-				set(computationalFieldFilter(fieldName), fieldValue));
-	}
-
-	public void updateSchedulerSyncFlag(String user, String project, String exploratoryName, boolean syncFlag) {
-		final String syncStartField = SCHEDULER_DATA + ".sync_start_required";
-		UpdateResult result;
-		do {
-
-			result = updateOne(USER_INSTANCES, and(exploratoryCondition(user, exploratoryName, project),
-					elemMatch(COMPUTATIONAL_RESOURCES, and(ne(SCHEDULER_DATA, null), ne(syncStartField, syncFlag)))),
-					set(computationalFieldFilter(syncStartField), syncFlag));
-
-		} while (result.getModifiedCount() != 0);
-	}
-
-	public UpdateResult updateSchedulerDataForComputationalResource(String user, String project, String exploratoryName,
-																	String computationalName, SchedulerJobDTO dto) {
-		return updateComputationalField(user, project, exploratoryName, computationalName,
-				SCHEDULER_DATA, Objects.isNull(dto) ? null : convertToBson(dto));
-	}
-
-	public void updateLastActivity(String user, String project, String exploratoryName,
-								   String computationalName, LocalDateTime lastActivity) {
-		updateOne(USER_INSTANCES,
-				computationalCondition(user, project, exploratoryName, computationalName),
-				set(computationalFieldFilter(COMPUTATIONAL_LAST_ACTIVITY),
-						Date.from(lastActivity.atZone(ZoneId.systemDefault()).toInstant())));
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/DockerDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/DockerDAO.java
deleted file mode 100644
index c0ecfc4..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/DockerDAO.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.exceptions.DlabException;
-import org.bson.Document;
-
-import static com.epam.dlab.backendapi.dao.MongoCollections.DOCKER_ATTEMPTS;
-
-/** DAO write attempt of Docker
- * */
-public class DockerDAO extends BaseDAO {
-    public static final String RUN = "run";
-
-    /** Write the attempt of docker action.
-     * @param user user name.
-     * @param action action of docker.
-	 * @exception DlabException may be thrown
-     */
-	public void writeDockerAttempt(String user, String action) {
-        insertOne(DOCKER_ATTEMPTS, () -> new Document(USER, user).append("action", action));
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAO.java
deleted file mode 100644
index f28539e..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAO.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-
-import java.util.List;
-import java.util.Optional;
-
-/**
- * The interface specifies behaviour for objects, which retrieve, update, remove
- * the endpoints entities from the DataBase, according passed fields, i.e name, url, status.
- */
-public interface EndpointDAO {
-	List<EndpointDTO> getEndpoints();
-
-	List<EndpointDTO> getEndpointsWithStatus(String status);
-
-	/*** Retrieve the Endpoint entity according required name
-	 * @param name - the Endpoint regular title
-	 * @return the Optional object
-	 */
-	Optional<EndpointDTO> get(String name);
-
-	/*** Retrieve the Endpoint entity according required Endpoint URL
-	 * @param url - the Endpoint web address
-	 * @return the Optional object
-	 */
-	Optional<EndpointDTO> getEndpointWithUrl(String url);
-
-	void create(EndpointDTO endpointDTO);
-
-	void updateEndpointStatus(String name, String status);
-
-	void remove(String name);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAOImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAOImpl.java
deleted file mode 100644
index aec56ec..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EndpointDAOImpl.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.util.List;
-import java.util.Optional;
-import java.util.regex.Pattern;
-
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.regex;
-
-
-public class EndpointDAOImpl extends BaseDAO implements EndpointDAO {
-
-	private static final String ENDPOINTS_COLLECTION = "endpoints";
-	private static final String ENDPOINT_NAME_FIELD = "name";
-	private static final String ENDPOINT_STATUS_FIELD = "status";
-	private static final String ENDPOINT_URL_FIELD = "url";
-
-	@Override
-	public List<EndpointDTO> getEndpoints() {
-		return find(ENDPOINTS_COLLECTION, EndpointDTO.class);
-	}
-
-	@Override
-	public List<EndpointDTO> getEndpointsWithStatus(String status) {
-		return find(ENDPOINTS_COLLECTION, endpointStatusCondition(status), EndpointDTO.class);
-	}
-
-	@Override
-	public Optional<EndpointDTO> getEndpointWithUrl(String url) {
-		return findOne(ENDPOINTS_COLLECTION, endpointUrlCondition(url), EndpointDTO.class);
-	}
-
-	@Override
-	public Optional<EndpointDTO> get(String name) {
-		return findOne(ENDPOINTS_COLLECTION, endpointCondition(name), EndpointDTO.class);
-	}
-
-	@Override
-	public void create(EndpointDTO endpointDTO) {
-		insertOne(ENDPOINTS_COLLECTION, endpointDTO);
-	}
-
-	@Override
-	public void updateEndpointStatus(String name, String status) {
-		final Document updatedFiled = new Document(ENDPOINT_STATUS_FIELD, status);
-		updateOne(ENDPOINTS_COLLECTION, endpointCondition(name), new Document(SET, updatedFiled));
-	}
-
-	@Override
-	public void remove(String name) {
-		deleteOne(ENDPOINTS_COLLECTION, endpointCondition(name));
-	}
-
-	private Bson endpointCondition(String name) {
-		Pattern endPointName = Pattern.compile("^" + name + "$", Pattern.CASE_INSENSITIVE);
-		return regex(ENDPOINT_NAME_FIELD, endPointName);
-	}
-
-	private Bson endpointUrlCondition(String url) {
-		Pattern endPointUrl = Pattern.compile("^" + url + "$", Pattern.CASE_INSENSITIVE);
-		return regex(ENDPOINT_URL_FIELD, endPointUrl);
-	}
-
-	private Bson endpointStatusCondition(String status) {
-		return eq(ENDPOINT_STATUS_FIELD, status);
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EnvDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EnvDAO.java
deleted file mode 100644
index f554873..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/EnvDAO.java
+++ /dev/null
@@ -1,512 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.SelfServiceApplication;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.resources.aws.ComputationalResourceAws;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.status.EnvResource;
-import com.epam.dlab.dto.status.EnvResourceList;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.model.ResourceType;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.mongodb.client.model.Updates;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.COMPUTATIONAL_RESOURCES;
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.EXPLORATORY_NAME;
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.exploratoryCondition;
-import static com.epam.dlab.backendapi.dao.MongoCollections.USER_EDGE;
-import static com.epam.dlab.backendapi.dao.MongoCollections.USER_INSTANCES;
-import static com.epam.dlab.dto.UserInstanceStatus.CONFIGURING;
-import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
-import static com.epam.dlab.dto.UserInstanceStatus.FAILED;
-import static com.epam.dlab.dto.UserInstanceStatus.RUNNING;
-import static com.epam.dlab.dto.UserInstanceStatus.STARTING;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPED;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPING;
-import static com.epam.dlab.dto.UserInstanceStatus.TERMINATED;
-import static com.epam.dlab.dto.UserInstanceStatus.TERMINATING;
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.in;
-import static com.mongodb.client.model.Filters.not;
-import static com.mongodb.client.model.Filters.or;
-import static com.mongodb.client.model.Projections.elemMatch;
-import static com.mongodb.client.model.Projections.excludeId;
-import static com.mongodb.client.model.Projections.fields;
-import static com.mongodb.client.model.Projections.include;
-import static java.util.Objects.nonNull;
-
-/**
- * DAO for updates of the status of environment resources.
- */
-@Singleton
-public class EnvDAO extends BaseDAO {
-	private static final Logger LOGGER = LoggerFactory.getLogger(EnvDAO.class);
-
-	private static final String EDGE_PUBLIC_IP = "public_ip";
-	private static final String COMPUTATIONAL_STATUS = COMPUTATIONAL_RESOURCES + "." + STATUS;
-	private static final String COMPUTATIONAL_STATUS_FILTER = COMPUTATIONAL_RESOURCES + FIELD_SET_DELIMETER + STATUS;
-	private static final String COMPUTATIONAL_SPOT = "slave_node_spot";
-	private static final String IMAGE = "image";
-	private static final String PROJECT = "project";
-	private static final String ENDPOINT = "endpoint";
-
-	private static final Bson INCLUDE_EDGE_FIELDS = include(INSTANCE_ID, EDGE_STATUS, EDGE_PUBLIC_IP);
-	private static final Bson INCLUDE_EXP_FIELDS = include(INSTANCE_ID, STATUS, PROJECT, ENDPOINT,
-			COMPUTATIONAL_RESOURCES + "." + INSTANCE_ID, COMPUTATIONAL_RESOURCES + "." + IMAGE, COMPUTATIONAL_STATUS,
-			EXPLORATORY_NAME, COMPUTATIONAL_RESOURCES + "." + ComputationalDAO.COMPUTATIONAL_NAME);
-	private static final Bson INCLUDE_EXP_UPDATE_FIELDS = include(EXPLORATORY_NAME, INSTANCE_ID, STATUS,
-			COMPUTATIONAL_RESOURCES + "." + ComputationalDAO.COMPUTATIONAL_NAME, COMPUTATIONAL_RESOURCES + "." +
-					INSTANCE_ID,
-			COMPUTATIONAL_STATUS, COMPUTATIONAL_RESOURCES + "." + IMAGE);
-	private static final String COMPUTATIONAL_NAME = "computational_name";
-
-	@Inject
-	private SelfServiceApplicationConfiguration configuration;
-
-	/**
-	 * Finds and returns the list of user resources.
-	 *
-	 * @param user name.
-	 */
-	public Map<String, EnvResourceList> findEnvResources(String user) {
-		List<EnvResource> hostList = new ArrayList<>();
-		List<EnvResource> clusterList = new ArrayList<>();
-
-		stream(find(USER_INSTANCES, eq(USER, user), fields(INCLUDE_EXP_FIELDS, excludeId())))
-				.forEach(exp -> {
-					final String exploratoryName = exp.getString(EXPLORATORY_NAME);
-					final String project = exp.getString(PROJECT);
-					final String endpoint = exp.getString(ENDPOINT);
-					addResource(hostList, exp, STATUS, ResourceType.EXPLORATORY, exploratoryName, project, endpoint);
-					addComputationalResources(hostList, clusterList, exp, exploratoryName);
-				});
-		final Map<String, List<EnvResource>> clustersByEndpoint = clusterList.stream()
-				.collect(Collectors.groupingBy(EnvResource::getEndpoint));
-		return hostList.stream()
-				.collect(Collectors.groupingBy(EnvResource::getEndpoint)).entrySet()
-				.stream()
-				.collect(Collectors.toMap(Map.Entry::getKey, e -> new EnvResourceList()
-						.withHostList(!e.getValue().isEmpty() ? e.getValue() : Collections.emptyList())
-						.withClusterList(clustersByEndpoint.getOrDefault(e.getKey(), clusterList))));
-	}
-
-	@SuppressWarnings("unchecked")
-	public List<UserInstanceDTO> findRunningResourcesForCheckInactivity() {
-		return stream(find(USER_INSTANCES, or(eq(STATUS, RUNNING.toString()),
-				elemMatch(COMPUTATIONAL_RESOURCES, eq(STATUS, RUNNING.toString())))))
-				.map(d -> convertFromDocument(d, UserInstanceDTO.class))
-				.collect(Collectors.toList());
-	}
-
-	private EnvResource toEnvResource(String name, String instanceId, ResourceType resType, String project,
-									  String endpoint) {
-		return new EnvResource(instanceId, name, resType, project, endpoint);
-	}
-
-	@SuppressWarnings("unchecked")
-	private void addComputationalResources(List<EnvResource> hostList, List<EnvResource> clusterList, Document exp,
-										   String exploratoryName) {
-		final String project = exp.getString(PROJECT);
-		getComputationalResources(exp)
-				.forEach(comp -> addComputational(hostList, clusterList, exploratoryName, comp, project,
-						exp.getString(ENDPOINT)));
-	}
-
-	private List<Document> getComputationalResources(Document userInstanceDocument) {
-		return (List<Document>) userInstanceDocument.getOrDefault(COMPUTATIONAL_RESOURCES, Collections.emptyList());
-	}
-
-	private void addComputational(List<EnvResource> hostList, List<EnvResource> clusterList, String exploratoryName,
-								  Document computational, String project, String endpoint) {
-		final List<EnvResource> resourceList = DataEngineType.CLOUD_SERVICE ==
-				DataEngineType.fromDockerImageName(computational.getString(IMAGE)) ? clusterList :
-				hostList;
-		addResource(resourceList, computational, STATUS, ResourceType.COMPUTATIONAL,
-				String.join("_", exploratoryName, computational.getString(COMPUTATIONAL_NAME)), project, endpoint);
-	}
-
-	/**
-	 * Updates the status of exploratory and computational for user.
-	 *
-	 * @param user    the name of user.
-	 * @param project name of project
-	 * @param list    the status of node.
-	 */
-	public void updateEnvStatus(String user, String project, EnvResourceList list) {
-		if (list != null && notEmpty(list.getHostList())) {
-			updateEdgeStatus(user, list.getHostList());
-			if (!list.getHostList().isEmpty()) {
-				stream(find(USER_INSTANCES, eq(USER, user),
-						fields(INCLUDE_EXP_UPDATE_FIELDS, excludeId())))
-						.filter(this::instanceIdPresent)
-						.forEach(exp -> updateUserResourceStatuses(user, project, list, exp));
-			}
-		}
-	}
-
-	public Set<String> fetchActiveEnvUsers() {
-		return Stream.concat(
-				stream(find(USER_INSTANCES, eq(STATUS, UserInstanceStatus.RUNNING.toString()),
-						fields(include(USER), excludeId()))).map(d -> d.getString(USER)),
-				stream(find(USER_EDGE, eq(EDGE_STATUS, UserInstanceStatus.RUNNING.toString()),
-						fields(include(ID)))).map(d -> d.getString(ID))
-		).collect(Collectors.toSet());
-	}
-
-	public Set<String> fetchUsersNotIn(Set<String> users) {
-		return stream(find(USER_EDGE, not(in(ID, users)),
-				fields(include(ID)))).map(d -> d.getString(ID))
-				.collect(Collectors.toSet());
-	}
-
-	@SuppressWarnings("unchecked")
-	private void updateUserResourceStatuses(String user, String project, EnvResourceList list, Document exp) {
-		final String exploratoryName = exp.getString(EXPLORATORY_NAME);
-		getEnvResourceAndRemove(list.getHostList(), exp.getString(INSTANCE_ID))
-				.ifPresent(resource -> updateExploratoryStatus(user, project, exploratoryName,
-						exp.getString(STATUS), resource.getStatus()));
-
-		(getComputationalResources(exp))
-				.stream()
-				.filter(this::instanceIdPresent)
-				.forEach(comp -> updateComputational(user, project, list, exploratoryName, comp));
-	}
-
-	private void updateComputational(String user, String project, EnvResourceList list, String exploratoryName, Document comp) {
-		final List<EnvResource> listToCheck = DataEngineType.CLOUD_SERVICE ==
-				DataEngineType.fromDockerImageName(comp.getString(IMAGE)) ?
-				list.getClusterList() : list.getHostList();
-		getEnvResourceAndRemove(listToCheck, comp.getString(INSTANCE_ID))
-				.ifPresent(resource -> updateComputationalStatus(user, project, exploratoryName,
-						comp.getString(ComputationalDAO.COMPUTATIONAL_NAME), comp.getString(STATUS), resource.getStatus()));
-	}
-
-	private boolean instanceIdPresent(Document d) {
-		return nonNull(d.getString(INSTANCE_ID));
-	}
-
-	private Optional<String> getInstanceId(Document document) {
-		return Optional.ofNullable(document.getString(INSTANCE_ID));
-	}
-
-
-	/**
-	 * Find and return the id of instance for EDGE node.
-	 *
-	 * @param user the name of user.
-	 */
-	private Optional<Document> getEdgeNode(String user) {
-		return findOne(USER_EDGE,
-				eq(ID, user),
-				fields(INCLUDE_EDGE_FIELDS, excludeId()));
-	}
-
-	/**
-	 * Find and return the resource item for given id (of instance or cluster) or <b>null<b> otherwise.
-	 *
-	 * @param list the list of resources.
-	 * @param id   the id of instance or cluster.
-	 */
-	private Optional<EnvResource> getEnvResourceAndRemove(List<EnvResource> list, String id) {
-		if (list != null) {
-			return IntStream.range(0, list.size())
-					.filter(i -> list.get(i).getId().equals(id))
-					.mapToObj(i -> getAndRemove(list, i)).findAny();
-		}
-		return Optional.empty();
-	}
-
-	private EnvResource getAndRemove(List<EnvResource> list, int i) {
-		final EnvResource envResource = list.get(i);
-		list.remove(i);
-		return envResource;
-	}
-
-	/**
-	 * Translate the status of instance in Amazon into exploratory's status.
-	 *
-	 * @param oldStatus the current status of exploratory.
-	 * @param newStatus the current status of instance in Amazon.
-	 */
-	private UserInstanceStatus getInstanceNewStatus(UserInstanceStatus oldStatus, String newStatus) {
-		/* AWS statuses: pending, running, shutting-down, terminated, stopping, stopped */
-		UserInstanceStatus status;
-		if ("pending".equalsIgnoreCase(newStatus) || "stopping".equalsIgnoreCase(newStatus)) {
-			return oldStatus;
-		} else if ("shutting-down".equalsIgnoreCase(newStatus)) {
-			status = TERMINATING;
-		} else {
-			status = UserInstanceStatus.of(newStatus);
-		}
-
-		switch (oldStatus) {
-			case CREATING_IMAGE:
-				return !status.in(UserInstanceStatus.TERMINATED, TERMINATING,
-						UserInstanceStatus.RUNNING) ? status : oldStatus;
-			case CREATING:
-				return (status.in(UserInstanceStatus.TERMINATED, UserInstanceStatus.STOPPED) ? status : oldStatus);
-			case RUNNING:
-			case STOPPING:
-				return (status.in(TERMINATING, UserInstanceStatus.TERMINATED,
-						UserInstanceStatus.STOPPING, UserInstanceStatus.STOPPED) ? status : oldStatus);
-			case STARTING:
-				return (status.in(TERMINATING, UserInstanceStatus.TERMINATED,
-						UserInstanceStatus.STOPPING) ? status : oldStatus);
-			case STOPPED:
-				return (status.in(TERMINATING, UserInstanceStatus.TERMINATED,
-						UserInstanceStatus.RUNNING) ? status : oldStatus);
-			case TERMINATING:
-				return (status.in(UserInstanceStatus.TERMINATED) ? status : oldStatus);
-			case FAILED:
-			case TERMINATED:
-			default:
-				return oldStatus;
-		}
-	}
-
-	/**
-	 * Updates the status of EDGE node for user.
-	 *
-	 * @param user     the name of user.
-	 * @param hostList list with instance ids for edge resources
-	 * @throws DlabException in case of exception
-	 */
-	private void updateEdgeStatus(String user, List<EnvResource> hostList) {
-		LOGGER.trace("Update EDGE status for user {}", user);
-		getEdgeNode(user)
-				.ifPresent(edge -> getInstanceId(edge)
-						.ifPresent(instanceId -> getEnvResourceAndRemove(hostList, instanceId)
-								.ifPresent(r -> updateEdgeStatus(user, edge, instanceId, r))));
-
-	}
-
-	private void updateEdgeStatus(String user, Document edge, String instanceId, EnvResource r) {
-		final String oldStatus = edge.getString(EDGE_STATUS);
-		LOGGER.trace("Update EDGE status for user {} with instance_id {} from {} to {}",
-				user, instanceId, oldStatus, r.getStatus());
-		UserInstanceStatus oStatus =
-				(oldStatus == null ? UserInstanceStatus.CREATING : UserInstanceStatus.of(oldStatus));
-		UserInstanceStatus status = oStatus != FAILED ? getInstanceNewStatus(oStatus, r.getStatus()) :
-				UserInstanceStatus.of(r.getStatus());
-		LOGGER.trace("EDGE status translated for user {} with instanceId {} from {} to {}",
-				user, instanceId, r.getStatus(), status);
-		Optional.ofNullable(status)
-				.filter(s -> s != oStatus)
-				.ifPresent(s -> {
-					LOGGER.debug("EDGE status will be updated from {} to {}", oldStatus, status);
-					updateOne(USER_EDGE, eq(ID, user),
-							Updates.set(EDGE_STATUS, status.toString()));
-				});
-	}
-
-	/**
-	 * Update the status of exploratory if it needed.
-	 *
-	 * @param user            the user name
-	 * @param project         project name
-	 * @param exploratoryName the name of exploratory
-	 * @param oldStatus       old status
-	 * @param newStatus       new status
-	 */
-	private void updateExploratoryStatus(String user, String project, String exploratoryName,
-										 String oldStatus, String newStatus) {
-		LOGGER.trace("Update exploratory status for user {} with exploratory {} from {} to {}", user, exploratoryName,
-				oldStatus, newStatus);
-		UserInstanceStatus oStatus = UserInstanceStatus.of(oldStatus);
-		UserInstanceStatus status = getInstanceNewStatus(oStatus, newStatus);
-		LOGGER.trace("Exploratory status translated for user {} with exploratory {} from {} to {}", user,
-				exploratoryName, newStatus, status);
-
-		if (oStatus != status) {
-			LOGGER.debug("Exploratory status for user {} with exploratory {} will be updated from {} to {}", user,
-					exploratoryName, oldStatus, status);
-			updateOne(USER_INSTANCES,
-					exploratoryCondition(user, exploratoryName, project),
-					Updates.set(STATUS, status.toString()));
-		}
-	}
-
-	/**
-	 * Translate the status of cluster in Amazon into computational's status.
-	 *
-	 * @param oldStatus the current status of computational.
-	 * @param newStatus the current status of cluster in Amazon.
-	 */
-	private UserInstanceStatus getComputationalNewStatus(UserInstanceStatus oldStatus, String newStatus) {
-		/* AWS statuses: bootstrapping, running, starting, terminated, terminated_with_errors, terminating, waiting */
-		UserInstanceStatus status;
-		if ("terminated".equalsIgnoreCase(newStatus) || "terminated_with_errors".equalsIgnoreCase(newStatus)) {
-			status = UserInstanceStatus.TERMINATED;
-		} else {
-			status = Optional.ofNullable(UserInstanceStatus.of(newStatus)).orElse(oldStatus);
-		}
-
-		switch (oldStatus) {
-			case CREATING:
-			case CONFIGURING:
-			case RUNNING:
-				return (status.in(UserInstanceStatus.TERMINATED, TERMINATING,
-						UserInstanceStatus.STOPPING, UserInstanceStatus.STOPPED) ? status : oldStatus);
-			case TERMINATING:
-				return (status.in(UserInstanceStatus.TERMINATED) ? status : oldStatus);
-			case STARTING:
-			case STOPPED:
-			case STOPPING:
-				return status;
-			case FAILED:
-			case TERMINATED:
-			default:
-				return oldStatus;
-		}
-	}
-
-	/**
-	 * Update the status of exploratory if it needed.
-	 *
-	 * @param user              the user name.
-	 * @param project           project name
-	 * @param exploratoryName   the name of exploratory.
-	 * @param computationalName the name of computational.
-	 * @param oldStatus         old status.
-	 * @param newStatus         new status.
-	 */
-	private void updateComputationalStatus(String user, String project, String exploratoryName, String computationalName,
-										   String oldStatus, String newStatus) {
-		LOGGER.trace("Update computational status for user {} with exploratory {} and computational {} from {} to {}",
-				user, exploratoryName, computationalName, oldStatus, newStatus);
-		UserInstanceStatus oStatus = UserInstanceStatus.of(oldStatus);
-		UserInstanceStatus status = getComputationalNewStatus(oStatus, newStatus);
-		LOGGER.trace("Translate computational status for user {} with exploratory {} and computational {} from {} to" +
-						" " +
-						"{}",
-				user, exploratoryName, computationalName, newStatus, status);
-
-		if (oStatus != status) {
-			LOGGER.debug("Computational status for user {} with exploratory {} and computational {} will be updated " +
-							"from {} to {}",
-					user, exploratoryName, computationalName, oldStatus, status);
-			if (status == UserInstanceStatus.TERMINATED &&
-					terminateComputationalSpot(user, project, exploratoryName, computationalName)) {
-				return;
-			}
-			Document values = new Document(COMPUTATIONAL_STATUS_FILTER, status.toString());
-			updateOne(USER_INSTANCES,
-					and(exploratoryCondition(user, exploratoryName, project),
-							elemMatch(COMPUTATIONAL_RESOURCES,
-									and(eq(ComputationalDAO.COMPUTATIONAL_NAME, computationalName))
-							)
-					),
-					new Document(SET, values));
-		}
-	}
-
-	/**
-	 * Terminate EMR if it is spot.
-	 *
-	 * @param user              the user name.
-	 * @param project           name of project
-	 * @param exploratoryName   the name of exploratory.
-	 * @param computationalName the name of computational.
-	 * @return <b>true</b> if computational is spot and should be terminated by docker, otherwise <b>false</b>.
-	 */
-	private boolean terminateComputationalSpot(String user, String project, String exploratoryName, String computationalName) {
-		LOGGER.trace("Check computatation is spot for user {} with exploratory {} and computational {}", user,
-				exploratoryName, computationalName);
-		Document doc = findOne(USER_INSTANCES,
-				exploratoryCondition(user, exploratoryName, project),
-				and(elemMatch(COMPUTATIONAL_RESOURCES,
-						and(eq(ComputationalDAO.COMPUTATIONAL_NAME, computationalName),
-								eq(COMPUTATIONAL_SPOT, true),
-								not(eq(STATUS, TERMINATED.toString())))),
-						include(COMPUTATIONAL_RESOURCES + "." + COMPUTATIONAL_SPOT))
-		).orElse(null);
-		if (doc == null || doc.get(COMPUTATIONAL_RESOURCES) == null) {
-			return false;
-		}
-
-		UserInfo userInfo = null;
-		if (userInfo == null) {
-			// User logged off. Computational will be terminated when user logged in.
-			return true;
-		}
-
-		String accessToken = userInfo.getAccessToken();
-		LOGGER.debug("Computational will be terminated for user {} with exploratory {} and computational {}",
-				user, exploratoryName, computationalName);
-		try {
-			// Send post request to provisioning service to terminate spot EMR.
-			ComputationalResourceAws computational = new ComputationalResourceAws();
-			SelfServiceApplication.getInjector().injectMembers(computational);
-			UserInfo ui = new UserInfo(user, accessToken);
-			computational.terminate(ui, project, exploratoryName, computationalName);
-		} catch (Exception e) {
-			// Cannot terminate EMR, just update status to terminated
-			LOGGER.warn("Can't terminate computational for user {} with exploratory {} and computational {}. {}",
-					user, exploratoryName, computationalName, e.getLocalizedMessage(), e);
-			return false;
-		}
-
-		return true;
-	}
-
-
-	/**
-	 * Add the resource to list if it have instance_id.
-	 *
-	 * @param list            the list to add.
-	 * @param document        document with resource.
-	 * @param statusFieldName name of field that contains status information
-	 * @param resourceType    type if resource EDGE/NOTEBOOK
-	 */
-	private void addResource(List<EnvResource> list, Document document, String statusFieldName,
-							 ResourceType resourceType, String name, String project, String endpoint) {
-		LOGGER.trace("Add resource from {}", document);
-		getInstanceId(document).ifPresent(instanceId ->
-				Optional.ofNullable(UserInstanceStatus.of(document.getString(statusFieldName)))
-						.filter(s -> s.in(CONFIGURING, CREATING, RUNNING, STARTING, STOPPED, STOPPING, TERMINATING) ||
-								(FAILED == s && ResourceType.EDGE == resourceType))
-						.ifPresent(s -> list.add(toEnvResource(name, instanceId, resourceType, project, endpoint))));
-	}
-
-	private boolean notEmpty(List<EnvResource> hostList) {
-		return hostList != null && !hostList.isEmpty();
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryDAO.java
deleted file mode 100644
index fc44569..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryDAO.java
+++ /dev/null
@@ -1,487 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-
-import com.epam.dlab.backendapi.util.DateRemoverUtil;
-import com.epam.dlab.dto.ResourceURL;
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.dto.StatusEnvBaseDTO;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.exploratory.ExploratoryStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.google.inject.Singleton;
-import com.mongodb.client.result.UpdateResult;
-import lombok.extern.slf4j.Slf4j;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.util.Collections;
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import static com.epam.dlab.backendapi.dao.MongoCollections.USER_INSTANCES;
-import static com.epam.dlab.backendapi.dao.SchedulerJobDAO.SCHEDULER_DATA;
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.in;
-import static com.mongodb.client.model.Filters.not;
-import static com.mongodb.client.model.Filters.or;
-import static com.mongodb.client.model.Projections.exclude;
-import static com.mongodb.client.model.Projections.excludeId;
-import static com.mongodb.client.model.Projections.fields;
-import static com.mongodb.client.model.Projections.include;
-import static com.mongodb.client.model.Updates.set;
-import static java.util.stream.Collectors.toList;
-
-/**
- * DAO for user exploratory.
- */
-@Slf4j
-@Singleton
-public class ExploratoryDAO extends BaseDAO {
-	public static final String COMPUTATIONAL_RESOURCES = "computational_resources";
-	static final String EXPLORATORY_ID = "exploratory_id";
-	static final String EXPLORATORY_NAME = "exploratory_name";
-	static final String UPTIME = "up_time";
-
-	private static final String COMPUTATIONAL_NAME = "computational_name";
-	private static final String EXPLORATORY_URL = "exploratory_url";
-	private static final String EXPLORATORY_URL_DESC = "description";
-	private static final String EXPLORATORY_URL_URL = "url";
-	private static final String EXPLORATORY_USER = "exploratory_user";
-	private static final String EXPLORATORY_PASS = "exploratory_pass";
-	private static final String CLUSTER_CONFIG = "cluster_config";
-	private static final String EXPLORATORY_PRIVATE_IP = "private_ip";
-	public static final String EXPLORATORY_NOT_FOUND_MSG = "Exploratory for user %s with name %s not found";
-	private static final String EXPLORATORY_LAST_ACTIVITY = "last_activity";
-	private static final String PROJECT = "project";
-	private static final String ENDPOINT = "endpoint";
-
-	public ExploratoryDAO() {
-		log.info("{} is initialized", getClass().getSimpleName());
-	}
-
-	static Bson exploratoryCondition(String user, String exploratoryName, String project) {
-		return and(eq(USER, user), eq(EXPLORATORY_NAME, exploratoryName), eq(PROJECT, project));
-	}
-
-	private static Bson runningExploratoryCondition(String user, String exploratoryName, String project) {
-		return and(eq(USER, user), eq(PROJECT, project),
-				and(eq(EXPLORATORY_NAME, exploratoryName), eq(STATUS, UserInstanceStatus.RUNNING.toString())));
-	}
-
-	static Bson runningExploratoryAndComputationalCondition(String user, String project, String exploratoryName,
-															String computationalName) {
-		return and(eq(USER, user), eq(PROJECT, project),
-				and(eq(EXPLORATORY_NAME, exploratoryName), eq(STATUS, UserInstanceStatus.RUNNING.toString()),
-						eq(COMPUTATIONAL_RESOURCES + "." + COMPUTATIONAL_NAME, computationalName),
-						eq(COMPUTATIONAL_RESOURCES + "." + STATUS, UserInstanceStatus.RUNNING.toString())));
-	}
-
-	/**
-	 * Finds and returns the list of user resources.
-	 *
-	 * @param user name
-	 * @return list of user resources
-	 */
-	public Iterable<Document> findExploratory(String user) {
-		return find(USER_INSTANCES, eq(USER, user),
-				fields(exclude(ExploratoryLibDAO.EXPLORATORY_LIBS, ExploratoryLibDAO.COMPUTATIONAL_LIBS, SCHEDULER_DATA,
-						EXPLORATORY_USER, EXPLORATORY_PASS)));
-	}
-
-	/**
-	 * Finds and returns the info of all user's running notebooks.
-	 *
-	 * @param user user name.
-	 */
-	public List<UserInstanceDTO> fetchRunningExploratoryFields(String user) {
-		return getUserInstances(and(eq(USER, user), eq(STATUS, UserInstanceStatus.RUNNING.toString())), false);
-	}
-
-	public List<UserInstanceDTO> fetchRunningExploratoryFieldsForProject(String project) {
-		return getUserInstances(and(eq(PROJECT, project), eq(STATUS, UserInstanceStatus.RUNNING.toString())), false);
-	}
-
-	public List<UserInstanceDTO> fetchRunningExploratoryFieldsForProject(String project, List<String> endpoints) {
-		return getUserInstances(and(eq(PROJECT, project), eq(STATUS, UserInstanceStatus.RUNNING.toString()), in(ENDPOINT, endpoints)), false);
-	}
-
-	public List<UserInstanceDTO> fetchExploratoryFieldsForProject(String project) {
-		return getUserInstances(and(eq(PROJECT, project)), false);
-	}
-
-	public List<UserInstanceDTO> fetchExploratoryFieldsForProjectWithComp(String project) {
-		return getUserInstances(and(eq(PROJECT, project)), true);
-	}
-
-	public List<UserInstanceDTO> fetchExploratoryFieldsForProjectWithComp(List<String> projects) {
-		return getUserInstances(and(in(PROJECT, projects)), true);
-	}
-
-	public List<UserInstanceDTO> findExploratories(String project, String endpoint, String user) {
-		return getUserInstances(and(eq(PROJECT, project), eq(ENDPOINT, endpoint), eq(USER, user)), true);
-	}
-
-	public List<UserInstanceDTO> fetchUserExploratoriesWhereStatusIn(String user, boolean computationalFieldsRequired,
-																	 UserInstanceStatus... statuses) {
-		final List<String> statusList = statusList(statuses);
-		return getUserInstances(
-				and(
-						eq(USER, user),
-						in(STATUS, statusList)
-				),
-				computationalFieldsRequired);
-	}
-
-	/**
-	 * Finds and returns the info of all user's notebooks whose status or status of affiliated computational resource
-	 * is present among predefined ones.
-	 *
-	 * @param user                  user name.
-	 * @param exploratoryStatuses   array of exploratory statuses.
-	 * @param computationalStatuses array of computational statuses.
-	 */
-	public List<UserInstanceDTO> fetchUserExploratoriesWhereStatusIn(String user,
-																	 List<UserInstanceStatus> exploratoryStatuses,
-																	 UserInstanceStatus... computationalStatuses) {
-		final List<String> exploratoryStatusList = statusList(exploratoryStatuses);
-		final List<String> computationalStatusList = statusList(computationalStatuses);
-		return getUserInstances(
-				and(
-						eq(USER, user),
-						or(in(STATUS, exploratoryStatusList),
-								in(COMPUTATIONAL_RESOURCES + "." + STATUS, computationalStatusList))
-				),
-				false);
-	}
-
-	public List<UserInstanceDTO> fetchProjectExploratoriesWhereStatusIn(String project,
-																		List<UserInstanceStatus> exploratoryStatuses,
-																		UserInstanceStatus... computationalStatuses) {
-		final List<String> exploratoryStatusList = statusList(exploratoryStatuses);
-		final List<String> computationalStatusList = statusList(computationalStatuses);
-		return getUserInstances(
-				and(
-						eq(PROJECT, project),
-						or(in(STATUS, exploratoryStatusList),
-								in(COMPUTATIONAL_RESOURCES + "." + STATUS, computationalStatusList))
-				),
-				false);
-	}
-
-	public List<UserInstanceDTO> fetchProjectEndpointExploratoriesWhereStatusIn(String project, List<String> endpoints,
-																				List<UserInstanceStatus> exploratoryStatuses,
-																				UserInstanceStatus... computationalStatuses) {
-		final List<String> exploratoryStatusList = statusList(exploratoryStatuses);
-		final List<String> computationalStatusList = statusList(computationalStatuses);
-		return getUserInstances(
-				and(
-						eq(PROJECT, project),
-						in(ENDPOINT, endpoints),
-						or(in(STATUS, exploratoryStatusList),
-								in(COMPUTATIONAL_RESOURCES + "." + STATUS, computationalStatusList))
-				),
-				false);
-	}
-
-	public List<UserInstanceDTO> fetchProjectExploratoriesWhereStatusNotIn(String project, String endpoint,
-																		   UserInstanceStatus... statuses) {
-		final List<String> statusList = statusList(statuses);
-		return getUserInstances(
-				and(
-						eq(PROJECT, project),
-						eq(ENDPOINT, endpoint),
-						not(in(STATUS, statusList))
-				),
-				false);
-	}
-
-	public List<UserInstanceDTO> fetchExploratoriesByEndpointWhereStatusNotIn(String endpoint,
-																			  List<UserInstanceStatus> statuses) {
-		final List<String> exploratoryStatusList = statusList(statuses);
-
-		return getUserInstances(
-				and(
-						eq(ENDPOINT, endpoint),
-						not(in(STATUS, exploratoryStatusList))
-				),
-				false);
-	}
-
-	private List<UserInstanceDTO> getUserInstances(Bson condition, boolean computationalFieldsRequired) {
-		return stream(getCollection(USER_INSTANCES)
-				.find(condition)
-				.projection(computationalFieldsRequired ? null : fields(exclude(COMPUTATIONAL_RESOURCES))))
-				.map(d -> convertFromDocument(d, UserInstanceDTO.class))
-				.collect(Collectors.toList());
-	}
-
-	/**
-	 * Finds and returns the info about all exploratories in database.
-	 **/
-	public List<UserInstanceDTO> getInstances() {
-		return stream(getCollection(USER_INSTANCES)
-				.find())
-				.map(d -> convertFromDocument(d, UserInstanceDTO.class))
-				.collect(Collectors.toList());
-	}
-
-	public void updateLastActivity(String user, String exploratoryName, LocalDateTime lastActivity) {
-		updateOne(USER_INSTANCES, and(eq(USER, user), eq(EXPLORATORY_NAME, exploratoryName)),
-				set(EXPLORATORY_LAST_ACTIVITY, toDate(lastActivity)));
-	}
-
-	private Date toDate(LocalDateTime lastActivity) {
-		return Date.from(lastActivity.atZone(ZoneId.systemDefault()).toInstant());
-	}
-
-	/**
-	 * Finds and returns the info of exploratory (without info about computational resources).
-	 *
-	 * @param user            user name.
-	 * @param project         project name
-	 * @param exploratoryName the name of exploratory.
-	 */
-	public UserInstanceDTO fetchExploratoryFields(String user, String project, String exploratoryName) {
-		return getExploratory(user, project, exploratoryName, false).orElseThrow(() ->
-				new ResourceNotFoundException(String.format(EXPLORATORY_NOT_FOUND_MSG, user, exploratoryName)));
-
-	}
-
-	public UserInstanceDTO fetchExploratoryFields(String user, String project, String exploratoryName, boolean includeCompResources) {
-		return getExploratory(user, project, exploratoryName, includeCompResources).orElseThrow(() ->
-				new ResourceNotFoundException(String.format(EXPLORATORY_NOT_FOUND_MSG, user, exploratoryName)));
-
-	}
-
-	private Optional<UserInstanceDTO> getExploratory(String user, String project, String exploratoryName,
-													 boolean includeCompResources) {
-		return findOne(USER_INSTANCES,
-				exploratoryCondition(user, exploratoryName, project),
-				includeCompResources ? null : fields(exclude(COMPUTATIONAL_RESOURCES)),
-				UserInstanceDTO.class);
-	}
-
-	/**
-	 * Finds and returns the info of running exploratory with running cluster.
-	 *
-	 * @param user              user name.
-	 * @param project           name of project
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of cluster
-	 */
-	public UserInstanceDTO fetchExploratoryFields(String user, String project, String exploratoryName, String computationalName) {
-		return findOne(USER_INSTANCES,
-				runningExploratoryAndComputationalCondition(user, project, exploratoryName, computationalName),
-				UserInstanceDTO.class)
-				.orElseThrow(() -> new DlabException(String.format("Running notebook %s with running cluster %s not " +
-								"found for user %s",
-						exploratoryName, computationalName, user)));
-	}
-
-	/**
-	 * Finds and returns the info of running exploratory.
-	 *
-	 * @param user            user name.
-	 * @param project         project
-	 * @param exploratoryName name of exploratory.
-	 */
-	public UserInstanceDTO fetchRunningExploratoryFields(String user, String project, String exploratoryName) {
-		return findOne(USER_INSTANCES, runningExploratoryCondition(user, exploratoryName, project),
-				fields(exclude(COMPUTATIONAL_RESOURCES)), UserInstanceDTO.class)
-				.orElseThrow(() -> new DlabException(
-						String.format("Running exploratory instance for user %s with name %s not found.",
-								user, exploratoryName)));
-	}
-
-	/**
-	 * Inserts the info about notebook into Mongo database.
-	 *
-	 * @param dto the info about notebook
-	 */
-	public void insertExploratory(UserInstanceDTO dto) {
-		insertOne(USER_INSTANCES, dto);
-	}
-
-	/**
-	 * Updates the status of exploratory in Mongo database.
-	 *
-	 * @param dto object of exploratory status info.
-	 * @return The result of an update operation.
-	 */
-	public UpdateResult updateExploratoryStatus(StatusEnvBaseDTO<?> dto) {
-		return updateOne(USER_INSTANCES,
-				exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
-				set(STATUS, dto.getStatus()));
-	}
-
-	/**
-	 * Updates status for single exploratory in Mongo database.
-	 *
-	 * @param user            user.
-	 * @param project         project name
-	 * @param exploratoryName name of exploratory.
-	 * @param newStatus       new status of exploratory.
-	 * @return The result of an update operation.
-	 */
-	public UpdateResult updateStatusForExploratory(String user, String project, String exploratoryName, UserInstanceStatus newStatus) {
-		return updateOne(USER_INSTANCES,
-				exploratoryCondition(user, exploratoryName, project),
-				set(STATUS, newStatus.toString()));
-	}
-
-	/**
-	 * Updates the scheduler's data for exploratory in Mongo database.
-	 *
-	 * @param user            user.
-	 * @param project         name of project
-	 * @param exploratoryName name of exploratory.
-	 * @param dto             object of scheduler data.
-	 * @return The result of an update operation.
-	 */
-	public UpdateResult updateSchedulerDataForUserAndExploratory(String user, String project, String exploratoryName,
-																 SchedulerJobDTO dto) {
-		return updateOne(USER_INSTANCES,
-				exploratoryCondition(user, exploratoryName, project),
-				set(SCHEDULER_DATA, Objects.isNull(dto) ? null : convertToBson(dto)));
-	}
-
-	/**
-	 * Updates the requirement for reuploading key for single exploratory in Mongo database.
-	 *
-	 * @param user                user name.
-	 * @param project             project name
-	 * @param exploratoryName     exploratory's name
-	 * @param reuploadKeyRequired true/false.
-	 */
-	public void updateReuploadKeyForExploratory(String user, String project, String exploratoryName, boolean reuploadKeyRequired) {
-		updateOne(USER_INSTANCES,
-				exploratoryCondition(user, exploratoryName, project),
-				set(REUPLOAD_KEY_REQUIRED, reuploadKeyRequired));
-	}
-
-
-	/**
-	 * Updates the info of exploratory in Mongo database.
-	 *
-	 * @param dto object of exploratory status info.
-	 * @return The result of an update operation.
-	 */
-	@SuppressWarnings("serial")
-	public UpdateResult updateExploratoryFields(ExploratoryStatusDTO dto) {
-		Document values = new Document(STATUS, dto.getStatus()).append(UPTIME, dto.getUptime());
-		if (dto.getInstanceId() != null) {
-			values.append(INSTANCE_ID, dto.getInstanceId());
-		}
-		if (dto.getErrorMessage() != null) {
-			values.append(ERROR_MESSAGE, DateRemoverUtil.removeDateFormErrorMessage(dto.getErrorMessage()));
-		}
-		if (dto.getExploratoryId() != null) {
-			values.append(EXPLORATORY_ID, dto.getExploratoryId());
-		}
-
-		if (dto.getLastActivity() != null) {
-			values.append(EXPLORATORY_LAST_ACTIVITY, dto.getLastActivity());
-		}
-
-		if (dto.getResourceUrl() != null) {
-			values.append(EXPLORATORY_URL, dto.getResourceUrl().stream()
-					.map(url -> {
-								LinkedHashMap<String, String> map = new LinkedHashMap<>();
-								map.put(EXPLORATORY_URL_DESC, url.getDescription());
-								map.put(EXPLORATORY_URL_URL, url.getUrl());
-								return map;
-							}
-					).collect(Collectors.toList()));
-		} else if (dto.getPrivateIp() != null) {
-			UserInstanceDTO inst = fetchExploratoryFields(dto.getUser(), dto.getProject(), dto.getExploratoryName());
-			if (!inst.getPrivateIp().equals(dto.getPrivateIp()) && inst.getResourceUrl() != null) {
-				values.append(EXPLORATORY_URL, inst.getResourceUrl().stream()
-						.map(url -> replaceIp(dto.getPrivateIp(), inst, url))
-						.collect(Collectors.toList()));
-			}
-		}
-
-		if (dto.getPrivateIp() != null) {
-			values.append(EXPLORATORY_PRIVATE_IP, dto.getPrivateIp());
-		}
-		if (dto.getExploratoryUser() != null) {
-			values.append(EXPLORATORY_USER, dto.getExploratoryUser());
-		}
-		if (dto.getExploratoryPassword() != null) {
-			values.append(EXPLORATORY_PASS, dto.getExploratoryPassword());
-		}
-		if (dto.getConfig() != null) {
-			values.append(CLUSTER_CONFIG, dto.getConfig().stream().map(this::convertToBson).collect(toList()));
-		}
-		return updateOne(USER_INSTANCES,
-				exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
-				new Document(SET, values));
-	}
-
-	public void updateExploratoryIp(String user, String project, String ip, String exploratoryName) {
-
-		UserInstanceDTO inst = fetchExploratoryFields(user, project, exploratoryName);
-		if (!inst.getPrivateIp().equals(ip)) {
-			Document values = new Document();
-			values.append(EXPLORATORY_PRIVATE_IP, ip);
-			if (inst.getResourceUrl() != null) {
-				values.append(EXPLORATORY_URL, inst.getResourceUrl().stream()
-						.map(url -> replaceIp(ip, inst, url)
-						).collect(Collectors.toList()));
-			}
-
-			updateOne(USER_INSTANCES,
-					exploratoryCondition(user, exploratoryName, project),
-					new Document(SET, values));
-		}
-
-	}
-
-	@SuppressWarnings("unchecked")
-	public List<ClusterConfig> getClusterConfig(String user, String project, String exploratoryName) {
-		return findOne(USER_INSTANCES, and(exploratoryCondition(user, exploratoryName, project), notNull(CLUSTER_CONFIG)),
-				fields(include(CLUSTER_CONFIG), excludeId()))
-				.map(d -> convertFromDocument((List<Document>) d.get(CLUSTER_CONFIG),
-						new TypeReference<List<ClusterConfig>>() {
-						}))
-				.orElse(Collections.emptyList());
-	}
-
-	private Map<String, String> replaceIp(String ip, UserInstanceDTO inst, ResourceURL url) {
-		Map<String, String> map = new LinkedHashMap<>();
-		map.put(EXPLORATORY_URL_DESC, url.getDescription());
-		map.put(EXPLORATORY_URL_URL, url.getUrl().replace(inst.getPrivateIp(), ip));
-		return map;
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryLibDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryLibDAO.java
deleted file mode 100644
index bcec258..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ExploratoryLibDAO.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.util.DateRemoverUtil;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import com.epam.dlab.dto.exploratory.LibInstallStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.model.ResourceType;
-import com.epam.dlab.model.library.Library;
-import com.mongodb.client.model.Projections;
-import org.apache.commons.lang3.StringUtils;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.COMPUTATIONAL_RESOURCES;
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.exploratoryCondition;
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.runningExploratoryAndComputationalCondition;
-import static com.epam.dlab.backendapi.dao.MongoCollections.USER_INSTANCES;
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Projections.elemMatch;
-import static com.mongodb.client.model.Projections.excludeId;
-import static com.mongodb.client.model.Projections.fields;
-import static com.mongodb.client.model.Projections.include;
-import static com.mongodb.client.model.Updates.push;
-
-/**
- * DAO for user libraries.
- */
-public class ExploratoryLibDAO extends BaseDAO {
-	public static final String EXPLORATORY_LIBS = "libs";
-	public static final String COMPUTATIONAL_LIBS = "computational_libs";
-	public static final String LIB_GROUP = "group";
-	public static final String LIB_NAME = "name";
-	public static final String LIB_VERSION = "version";
-	private static final String LIB_INSTALL_DATE = "install_date";
-	private static final String LIB_ERROR_MESSAGE = "error_message";
-	private static final String COMPUTATIONAL_NAME_FIELD = "computational_name";
-
-	/**
-	 * Return condition for search library into exploratory data.
-	 *
-	 * @param libraryGroup the name of group.
-	 * @param libraryName  the name of library.
-	 */
-	private static Bson libraryConditionExploratory(String libraryGroup, String libraryName) {
-		return elemMatch(EXPLORATORY_LIBS,
-				libCondition(libraryGroup, libraryName));
-	}
-
-
-	/**
-	 * Return condition for search library into computational data.
-	 *
-	 * @param computationalName computational name
-	 * @param libraryGroup      the name of group.
-	 * @param libraryName       the name of library.
-	 */
-	private static Bson libraryConditionComputational(String computationalName, String libraryGroup,
-													  String libraryName) {
-		return elemMatch(COMPUTATIONAL_LIBS + "." + computationalName,
-				and(eq(LIB_GROUP, libraryGroup), eq(LIB_NAME, libraryName)));
-	}
-
-	/**
-	 * Return field filter for libraries properties in exploratory data.
-	 *
-	 * @param fieldName
-	 * @return
-	 */
-	private static String libraryFieldFilter(String fieldName) {
-		return EXPLORATORY_LIBS + FIELD_SET_DELIMETER + fieldName;
-	}
-
-
-	private static String computationalLibraryFieldFilter(String computational, String fieldName) {
-		return COMPUTATIONAL_LIBS + "." + computational + FIELD_SET_DELIMETER + fieldName;
-	}
-
-	private Document findLibraries(String user, String project, String exploratoryName, Bson include) {
-		Optional<Document> opt = findOne(USER_INSTANCES,
-				exploratoryCondition(user, exploratoryName, project),
-				fields(excludeId(), include));
-
-		return opt.orElseGet(Document::new);
-
-	}
-
-	public List<Library> getLibraries(String user, String project, String exploratoryName) {
-		final Document libsDocument = findAllLibraries(user, project, exploratoryName);
-		return Stream
-				.concat(
-						libraryStream(libsDocument, exploratoryName, EXPLORATORY_LIBS, ResourceType.EXPLORATORY),
-						computationalLibStream(libsDocument))
-				.collect(Collectors.toList());
-	}
-
-	public Document findAllLibraries(String user, String project, String exploratoryName) {
-		return findLibraries(user, project, exploratoryName, include(EXPLORATORY_LIBS, COMPUTATIONAL_LIBS,
-				COMPUTATIONAL_RESOURCES));
-	}
-
-	public Document findExploratoryLibraries(String user, String project, String exploratoryName) {
-		return findLibraries(user, project, exploratoryName, include(EXPLORATORY_LIBS));
-	}
-
-	public Document findComputationalLibraries(String user, String project, String exploratoryName, String computationalName) {
-		return findLibraries(user, project, exploratoryName, include(COMPUTATIONAL_LIBS + "." + computationalName));
-	}
-
-	@SuppressWarnings("unchecked")
-	public Library getLibrary(String user, String project, String exploratoryName, String libraryGroup, String libraryName) {
-		Optional<Document> userInstance = findOne(USER_INSTANCES,
-				and(exploratoryCondition(user, exploratoryName, project),
-						elemMatch(EXPLORATORY_LIBS,
-								and(eq(LIB_GROUP, libraryGroup), eq(LIB_NAME, libraryName))
-						)),
-				Projections.fields(excludeId(), Projections.include(EXPLORATORY_LIBS)));
-
-		if (userInstance.isPresent()) {
-			final Object exloratoryLibs = userInstance.get().get(EXPLORATORY_LIBS);
-			List<Document> libs = exloratoryLibs != null ? (List<Document>) exloratoryLibs : Collections.emptyList();
-			return libs.stream()
-					.filter(libraryPredicate(libraryGroup, libraryName))
-					.map(d -> convertFromDocument(d, Library.class))
-					.findAny().orElse(null);
-
-		}
-
-		return null;
-	}
-
-	@SuppressWarnings("unchecked")
-	public Library getLibrary(String user, String project, String exploratoryName, String computationalName,
-							  String libraryGroup, String libraryName) {
-		Optional<Document> libraryStatus = findOne(USER_INSTANCES,
-				and(runningExploratoryAndComputationalCondition(user, project, exploratoryName, computationalName),
-						libraryConditionComputational(computationalName, libraryGroup, libraryName)
-				),
-
-				Projections.fields(excludeId(),
-						Projections.include(
-								COMPUTATIONAL_LIBS + "." + computationalName + "." + STATUS,
-								COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_GROUP,
-								COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_NAME)
-				)
-		);
-
-		return libraryStatus.map(document -> ((List<Document>) (((Document) document.get(COMPUTATIONAL_LIBS)).get(computationalName)))
-				.stream()
-				.filter(libraryPredicate(libraryGroup, libraryName))
-				.map(l -> convertFromDocument(l, Library.class))
-				.findAny().orElse(null)).orElse(null);
-	}
-
-	private Predicate<Document> libraryPredicate(String libraryGroup, String libraryName) {
-		return l -> libraryGroup.equals(l.getString(LIB_GROUP))
-				&& libraryName.equals(l.getString(LIB_NAME));
-	}
-
-	/**
-	 * Add the user's library for exploratory into database.
-	 *
-	 * @param user            user name.
-	 * @param project         project name
-	 * @param exploratoryName name of exploratory.
-	 * @param library         library.
-	 * @return <b>true</b> if operation was successful, otherwise <b>false</b>.
-	 */
-	public boolean addLibrary(String user, String project, String exploratoryName, LibInstallDTO library, boolean reinstall) {
-		Optional<Document> opt = findOne(USER_INSTANCES,
-				and(exploratoryCondition(user, exploratoryName, project),
-						elemMatch(EXPLORATORY_LIBS,
-								and(eq(LIB_GROUP, library.getGroup()), eq(LIB_NAME, library.getName())))));
-		if (!opt.isPresent()) {
-			updateOne(USER_INSTANCES,
-					exploratoryCondition(user, exploratoryName, project),
-					push(EXPLORATORY_LIBS, convertToBson(library)));
-			return true;
-		} else {
-			Document values = updateLibraryFields(library, null);
-			if (reinstall) {
-				values.append(libraryFieldFilter(LIB_INSTALL_DATE), null);
-				values.append(libraryFieldFilter(LIB_ERROR_MESSAGE), null);
-			}
-
-			updateOne(USER_INSTANCES, and(exploratoryCondition(user, exploratoryName, project),
-					elemMatch(EXPLORATORY_LIBS,
-							and(eq(LIB_GROUP, library.getGroup()), eq(LIB_NAME, library.getName())))),
-					new Document(SET, values));
-			return false;
-		}
-	}
-
-	/**
-	 * Add the user's library for exploratory into database.
-	 *
-	 * @param user              user name.
-	 * @param project           project name
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational.
-	 * @param library           library.
-	 * @return <b>true</b> if operation was successful, otherwise <b>false</b>.
-	 */
-	public boolean addLibrary(String user, String project, String exploratoryName, String computationalName,
-							  LibInstallDTO library, boolean reinstall) {
-
-		Optional<Document> opt = findOne(USER_INSTANCES,
-				and(runningExploratoryAndComputationalCondition(user, project, exploratoryName, computationalName),
-						eq(COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_GROUP, library.getGroup()),
-						eq(COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_NAME, library.getName())));
-
-		if (!opt.isPresent()) {
-			updateOne(USER_INSTANCES,
-					runningExploratoryAndComputationalCondition(user, project, exploratoryName, computationalName),
-					push(COMPUTATIONAL_LIBS + "." + computationalName, convertToBson(library)));
-			return true;
-		} else {
-			Document values = updateComputationalLibraryFields(computationalName, library, null);
-			if (reinstall) {
-				values.append(computationalLibraryFieldFilter(computationalName, LIB_INSTALL_DATE), null);
-				values.append(computationalLibraryFieldFilter(computationalName, LIB_ERROR_MESSAGE), null);
-			}
-
-			updateOne(USER_INSTANCES, and(
-					exploratoryCondition(user, exploratoryName, project),
-					eq(COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_GROUP, library.getGroup()),
-					eq(COMPUTATIONAL_LIBS + "." + computationalName + "." + LIB_NAME, library.getName())),
-
-					new Document(SET, values));
-
-			return false;
-		}
-	}
-
-	/**
-	 * Updates the info about libraries for exploratory/computational in Mongo database.
-	 *
-	 * @param dto object of computational resource status.
-	 */
-	public void updateLibraryFields(LibInstallStatusDTO dto) {
-		if (dto.getLibs() == null) {
-			return;
-		}
-
-		if (StringUtils.isEmpty(dto.getComputationalName())) {
-			updateExploratoryLibraryFields(dto);
-		} else {
-			updateComputationalLibraryFields(dto);
-		}
-	}
-
-	private void updateExploratoryLibraryFields(LibInstallStatusDTO dto) {
-		for (LibInstallDTO lib : dto.getLibs()) {
-			try {
-				Document values = updateLibraryFields(lib, dto.getUptime());
-
-				updateOne(USER_INSTANCES,
-						and(exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
-								libraryConditionExploratory(lib.getGroup(), lib.getName())),
-						new Document(SET, values));
-			} catch (Exception e) {
-				throw new DlabException(String.format("Could not update library %s for %s",
-						lib, dto.getExploratoryName()), e);
-			}
-		}
-	}
-
-	private void updateComputationalLibraryFields(LibInstallStatusDTO dto) {
-		for (LibInstallDTO lib : dto.getLibs()) {
-			try {
-				Document values = updateComputationalLibraryFields(dto.getComputationalName(), lib, dto.getUptime());
-
-				updateOne(USER_INSTANCES,
-						and(exploratoryCondition(dto.getUser(), dto.getExploratoryName(), dto.getProject()),
-								elemMatch(COMPUTATIONAL_LIBS + "." + dto.getComputationalName(),
-										libCondition(lib.getGroup(), lib.getName()))),
-						new Document(SET, values));
-			} catch (Exception e) {
-				throw new DlabException(String.format("Could not update library %s for %s/%s",
-						lib, dto.getExploratoryName(), dto.getComputationalName()), e);
-			}
-		}
-	}
-
-	private static Bson libCondition(String group, String name) {
-		return and(eq(LIB_GROUP, group), eq(LIB_NAME, name));
-	}
-
-	private Document updateLibraryFields(LibInstallDTO lib, Date uptime) {
-		Document values = new Document(libraryFieldFilter(STATUS), lib.getStatus());
-		if (lib.getVersion() != null) {
-			values.append(libraryFieldFilter(LIB_VERSION), lib.getVersion());
-		}
-		if (uptime != null) {
-			values.append(libraryFieldFilter(LIB_INSTALL_DATE), uptime);
-		}
-
-		if (lib.getErrorMessage() != null) {
-			values.append(libraryFieldFilter(LIB_ERROR_MESSAGE),
-					DateRemoverUtil.removeDateFormErrorMessage(lib.getErrorMessage()));
-		}
-
-		return values;
-	}
-
-	private Document updateComputationalLibraryFields(String computational, LibInstallDTO lib, Date uptime) {
-		Document values = new Document(computationalLibraryFieldFilter(computational, STATUS), lib.getStatus());
-		if (lib.getVersion() != null) {
-			values.append(computationalLibraryFieldFilter(computational, LIB_VERSION), lib.getVersion());
-		}
-		if (uptime != null) {
-			values.append(computationalLibraryFieldFilter(computational, LIB_INSTALL_DATE), uptime);
-		}
-
-		if (lib.getErrorMessage() != null) {
-			values.append(computationalLibraryFieldFilter(computational, LIB_ERROR_MESSAGE),
-					DateRemoverUtil.removeDateFormErrorMessage(lib.getErrorMessage()));
-		}
-
-		return values;
-	}
-
-	@SuppressWarnings("unchecked")
-	private Stream<Library> computationalLibStream(Document libsDocument) {
-		return ((List<Document>) libsDocument.getOrDefault(COMPUTATIONAL_RESOURCES, Collections.emptyList()))
-				.stream()
-				.map(d -> d.getString(COMPUTATIONAL_NAME_FIELD))
-				.flatMap(compName -> libraryStream(
-						(Document) libsDocument.getOrDefault(COMPUTATIONAL_LIBS, new Document()),
-						compName,
-						compName, ResourceType.COMPUTATIONAL));
-	}
-
-	@SuppressWarnings("unchecked")
-	private Stream<Library> libraryStream(Document libsDocument, String resourceName, String libFieldName,
-										  ResourceType libType) {
-		return ((List<Document>) libsDocument.getOrDefault(libFieldName, Collections.emptyList()))
-				.stream()
-				.map(d -> convertFromDocument(d, Library.class))
-				.peek(l -> l.withType(libType).withResourceName(resourceName));
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/GitCredsDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/GitCredsDAO.java
deleted file mode 100644
index 817f127..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/GitCredsDAO.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.dto.exploratory.ExploratoryGitCreds;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsDTO;
-import org.bson.Document;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-
-import static com.epam.dlab.backendapi.dao.MongoCollections.GIT_CREDS;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Projections.*;
-
-/** DAO for user exploratory.
- */
-public class GitCredsDAO extends BaseDAO {
-	private static final String FIELD_GIT_CREDS = "git_creds";
-
-    /** Find and return the list of GIT credentials for user. 
-     * @param user name.
-	 * @return GIT credentials DTO
-     */
-    public ExploratoryGitCredsDTO findGitCreds(String user) {
-    	return findGitCreds(user, false);
-    }
-
-    /** Find and return the list of GIT credentials for user. 
-     * @param user name.
-     * @param clearPassword clear user password if set to <b>true</b>.
-	 * @return GIT credentials DTO
-     */
-    public ExploratoryGitCredsDTO findGitCreds(String user, boolean clearPassword) {
-    	Optional<ExploratoryGitCredsDTO> opt = findOne(GIT_CREDS,
-    													eq(ID, user),
-    													fields(include(FIELD_GIT_CREDS), excludeId()),
-    													ExploratoryGitCredsDTO.class);
-		ExploratoryGitCredsDTO creds = (opt.orElseGet(ExploratoryGitCredsDTO::new));
-    	List<ExploratoryGitCreds> list = creds.getGitCreds();
-    	if (clearPassword && list != null) {
-    		for (ExploratoryGitCreds cred : list) {
-				cred.setPassword(null);
-			}
-    	}
-    	
-    	return creds;
-    }
-
-    /** Update the GIT credentials for user.
-     * @param user name.
-     * @param dto GIT credentials.
-     */
-	public void updateGitCreds(String user, ExploratoryGitCredsDTO dto) {
-    	List<ExploratoryGitCreds> list = findGitCreds(user).getGitCreds();
-    	if (list != null && dto.getGitCreds() != null) {
-        	Collections.sort(dto.getGitCreds());
-    		// Restore passwords from Mongo DB.
-    		for (ExploratoryGitCreds cred : dto.getGitCreds()) {
-    			if (cred.getPassword() == null) {
-    				int index = Collections.binarySearch(list, cred);
-    				if (index >= 0) {
-    					cred.setPassword(list.get(index).getPassword());
-    				}
-    			}
-			}
-    	}
-
-		Document d = new Document(SET, convertToBson(dto).append(ID, user));
-		updateOne(GIT_CREDS, eq(ID, user), d, true);
-    }
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDao.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDao.java
deleted file mode 100644
index 2665d47..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDao.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.resources.dto.ImageInfoRecord;
-import com.epam.dlab.dto.exploratory.ImageStatus;
-import com.epam.dlab.dto.exploratory.LibStatus;
-import com.epam.dlab.model.exploratory.Image;
-import com.epam.dlab.model.library.Library;
-
-import java.util.List;
-import java.util.Optional;
-
-public interface ImageExploratoryDao {
-
-	boolean exist(String image, String project);
-
-	void save(Image image);
-
-	void updateImageFields(Image image);
-
-	List<ImageInfoRecord> getImages(String user, String dockerImage, String project, String endpoint, ImageStatus... statuses);
-
-	List<ImageInfoRecord> getImagesForProject(String project);
-
-	Optional<ImageInfoRecord> getImage(String user, String name, String project, String endpoint);
-
-	List<Library> getLibraries(String user, String imageFullName, String project, String endpoint, LibStatus status);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDaoImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDaoImpl.java
deleted file mode 100644
index 808dfbe..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ImageExploratoryDaoImpl.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.resources.dto.ImageInfoRecord;
-import com.epam.dlab.dto.exploratory.ImageStatus;
-import com.epam.dlab.dto.exploratory.LibStatus;
-import com.epam.dlab.model.exploratory.Image;
-import com.epam.dlab.model.library.Library;
-import com.google.inject.Singleton;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-import static com.mongodb.client.model.Filters.*;
-import static com.mongodb.client.model.Projections.elemMatch;
-import static com.mongodb.client.model.Projections.*;
-
-@Singleton
-public class ImageExploratoryDaoImpl extends BaseDAO implements ImageExploratoryDao {
-
-	private static final String LIBRARIES = "libraries";
-	private static final String IMAGE_NAME = "name";
-	private static final String IMAGE_APPLICATION = "application";
-	private static final String IMAGE_FULL_NAME = "fullName";
-	private static final String EXTERNAL_NAME = "externalName";
-	private static final String DOCKER_IMAGE = "dockerImage";
-	private static final String PROJECT = "project";
-	private static final String ENDPOINT = "endpoint";
-
-	@Override
-	public boolean exist(String image, String project) {
-		return findOne(MongoCollections.IMAGES, imageProjectCondition(image, project)).isPresent();
-	}
-
-	@Override
-	public void save(Image image) {
-		insertOne(MongoCollections.IMAGES, image);
-	}
-
-	@Override
-	public void updateImageFields(Image image) {
-		final Bson condition = userImageCondition(image.getUser(), image.getName(), image.getProject(), image.getEndpoint());
-		final Document updatedFields = getUpdatedFields(image);
-		updateOne(MongoCollections.IMAGES, condition, new Document(SET, updatedFields));
-	}
-
-	@Override
-	public List<ImageInfoRecord> getImages(String user, String dockerImage, String project, String endpoint, ImageStatus... statuses) {
-		return find(MongoCollections.IMAGES,
-				userImagesCondition(user, dockerImage, project, endpoint, statuses),
-				ImageInfoRecord.class);
-	}
-
-	@Override
-	public List<ImageInfoRecord> getImagesForProject(String project) {
-		return find(MongoCollections.IMAGES,
-				eq(PROJECT, project),
-				ImageInfoRecord.class);
-	}
-
-	@Override
-	public Optional<ImageInfoRecord> getImage(String user, String name, String project, String endpoint) {
-		return findOne(MongoCollections.IMAGES, userImageCondition(user, name, project, endpoint), ImageInfoRecord.class);
-	}
-
-	@Override
-	@SuppressWarnings("unchecked")
-	public List<Library> getLibraries(String user, String imageFullName, String project, String endpoint, LibStatus status) {
-		return ((List<Document>) libDocument(user, imageFullName, project, endpoint, status)
-				.orElse(emptyLibrariesDocument()).get(LIBRARIES))
-				.stream()
-				.map(d -> convertFromDocument(d, Library.class))
-				.collect(Collectors.toList());
-	}
-
-	private Optional<Document> libDocument(String user, String imageFullName, String project, String endpoint,
-										   LibStatus status) {
-		return findOne(MongoCollections.IMAGES,
-				imageLibraryCondition(user, imageFullName, project, endpoint, status),
-				fields(include(LIBRARIES), excludeId()));
-	}
-
-	private Document emptyLibrariesDocument() {
-		return new Document(LIBRARIES, Collections.emptyList());
-	}
-
-	private Bson imageLibraryCondition(String user, String imageFullName, String project, String endpoint,
-									   LibStatus status) {
-		return and(eq(USER, user), eq(IMAGE_NAME, imageFullName), eq(PROJECT, project), eq(ENDPOINT, endpoint),
-				elemMatch(LIBRARIES, eq(STATUS, status.name())));
-	}
-
-	private Bson userImagesCondition(String user, String dockerImage, String project, String endpoint, ImageStatus... statuses) {
-		final Bson userImagesCondition = userImagesCondition(user, project, endpoint, statuses);
-		if (Objects.nonNull(dockerImage)) {
-			return and(userImagesCondition, eq(DOCKER_IMAGE, dockerImage));
-		} else {
-			return userImagesCondition;
-		}
-
-	}
-
-	private Bson userImagesCondition(String user, String project, String endpoint, ImageStatus... statuses) {
-
-		final List<String> statusList = Arrays
-				.stream(statuses)
-				.map(ImageStatus::name)
-				.collect(Collectors.toList());
-		return and(eq(USER, user), in(STATUS, statusList), eq(PROJECT, project), eq(ENDPOINT, endpoint));
-	}
-
-
-	private Bson userImageCondition(String user, String imageName, String project, String endpoint) {
-		return and(eq(USER, user), eq(IMAGE_NAME, imageName), eq(PROJECT, project), eq(ENDPOINT, endpoint));
-	}
-
-	private Bson imageProjectCondition(String image, String project) {
-		return and(eq(IMAGE_NAME, image), eq(PROJECT, project));
-	}
-
-	private Document getUpdatedFields(Image image) {
-		return new Document(STATUS, image.getStatus().toString())
-				.append(IMAGE_FULL_NAME, image.getFullName())
-				.append(IMAGE_APPLICATION, image.getApplication())
-				.append(EXTERNAL_NAME, image.getExternalName());
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/IndexCreator.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/IndexCreator.java
deleted file mode 100644
index f6e8bb6..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/IndexCreator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.mongodb.client.model.IndexOptions;
-import com.mongodb.client.model.Indexes;
-import io.dropwizard.lifecycle.Managed;
-
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.EXPLORATORY_NAME;
-import static com.epam.dlab.backendapi.dao.MongoCollections.USER_INSTANCES;
-
-/** Creates the indexes for mongo collections. */
-public class IndexCreator extends BaseDAO implements Managed {
-    private static final String PROJECT_FIELD = "project";
-    @Override
-	public void start() {
-        mongoService.getCollection(USER_INSTANCES)
-                .createIndex(Indexes.ascending(USER, EXPLORATORY_NAME, PROJECT_FIELD), new IndexOptions().unique(true));
-        // TODO: Make refactoring and append indexes for other mongo collections
-    }
-
-    @Override
-	public void stop() {
-		//Add some functionality if necessary
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/MongoCollections.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/MongoCollections.java
deleted file mode 100644
index 59343c9..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/MongoCollections.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-/** Names of Mongo collections. */
-public class MongoCollections {
-	/** Environment settings. */
-	public static final String SETTINGS = "settings";
-    /** Attempts of the user login into DLab. */
-	static final String LOGIN_ATTEMPTS = "loginAttempts";
-    /** Attempts the actions of docker. */
-	static final String DOCKER_ATTEMPTS = "dockerAttempts";
-    /** User keys and credentials. */
-	static final String USER_KEYS = "userKeys";
-    /** User AWS credentials. */
-	public static final String USER_EDGE = "userCloudCredentials";
-    /** Instances of user. */
-	public static final String USER_INSTANCES = "userInstances";
-    /** Name of shapes. */
-	public static final String SHAPES = "shapes";
-	static final String USER_SETTINGS = "userSettings";
-    /* Billing data. */
-	public static final String BILLING = "billing";
-    /** User roles. */
-	static final String ROLES = "roles";
-    /** GIT credentials of user. */
-	public static final String GIT_CREDS = "gitCreds";
-    /** RequestId */
-	static final String REQUEST_ID = "requestId";
-    /** Images */
-	public static final String IMAGES = "images";
-	/**
-	 * Backup
-	 */
-	public static final String BACKUPS = "backup";
-
-	public static final String USER_GROUPS = "userGroups";
-
-	private MongoCollections() {
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/MongoSetting.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/MongoSetting.java
deleted file mode 100644
index bfa4e84..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/MongoSetting.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-/**
- * Name of fields in the Mongo collection {@link MongoCollections#SETTINGS}.
- */
-public enum MongoSetting {
-
-	// General properties
-	/**
-	 * Base name of service.
-	 */
-	SERIVICE_BASE_NAME("conf_service_base_name"),
-	/**
-	 * Name of directory for user key.
-	 */
-	CONF_KEY_DIRECTORY("conf_key_dir"),
-	/**
-	 * Name of resource id.
-	 */
-	CONF_TAG_RESOURCE_ID("conf_tag_resource_id"),
-	/**
-	 * Name of OS family.
-	 */
-	CONF_OS_FAMILY("conf_os_family"),
-
-	CONF_MAX_BUDGET("conf_max_budget"),
-	SSN_STORAGE_ACCOUNT_TAG_NAME("ssn_storage_account_tag_name"),
-	SHARED_STORAGE_ACCOUNT_TAG_NAME("shared_storage_account_tag_name"),
-
-	LDAP_HOSTNAME("ldap_hostname"),
-	LDAP_DN("ldap_dn"),
-	LDAP_OU("ldap_ou"),
-	LDAP_USER("ldap_service_username"),
-	LDAP_PASSWORD("ldap_service_password"),
-
-	PEERING_ID("peering_id"),
-
-
-	// AWS Related properties
-	/**
-	 * Name of AWS region.
-	 */
-	AWS_REGION("aws_region"),
-	/**
-	 * Id of security group.
-	 */
-	AWS_SECURITY_GROUPS("aws_security_groups_ids"),
-	/**
-	 * Id of virtual private cloud for AWS account.
-	 */
-	AWS_VPC_ID("aws_vpc_id"),
-	/**
-	 * Id of virtual private cloud subnet for AWS account.
-	 */
-	AWS_SUBNET_ID("aws_subnet_id"),
-	AWS_NOTEBOOK_VPC_ID("aws_notebook_vpc_id"),
-	AWS_NOTEBOOK_SUBNET_ID("aws_notebook_subnet_id"),
-	AWS_ZONE("aws_zone"),
-
-
-	// Azure related properties
-	AZURE_REGION("azure_region"),
-	AZURE_RESOURCE_GROUP_NAME("azure_resource_group_name"),
-	AZURE_SUBNET_NAME("azure_subnet_name"),
-	AZURE_VPC_NAME("azure_vpc_name"),
-	AZURE_SECURITY_GROUP_NAME("azure_security_group_name"),
-	AZURE_EDGE_INSTANCE_SIZE("edge_instance_size"),
-	SSN_INSTANCE_SIZE("ssn_instance_size"),
-	AZURE_DATA_LAKE_NAME_TAG("datalake_tag_name"),
-	AZURE_DATA_LAKE_CLIENT_ID("azure_client_id"),
-
-	// GCP related properties
-	GCP_REGION("gcp_region"),
-	GCP_ZONE("gcp_zone"),
-	GCP_SUBNET_NAME("gcp_subnet_name"),
-	GCP_PROJECT_ID("gcp_project_id"),
-	GCP_VPC_NAME("gcp_vpc_name");
-
-	private String id;
-
-	MongoSetting(String id) {
-		this.id = id;
-	}
-
-	public String getId() {
-		return id;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAO.java
deleted file mode 100644
index c94daae..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAO.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-
-public interface ProjectDAO {
-	List<ProjectDTO> getProjects();
-
-	List<ProjectDTO> getProjectsWithEndpointStatusNotIn(UserInstanceStatus... statuses);
-
-	List<ProjectDTO> getUserProjects(UserInfo userInfo, boolean active);
-
-	void create(ProjectDTO projectDTO);
-
-	void updateStatus(String projectName, ProjectDTO.Status status);
-
-	void updateEdgeStatus(String projectName, String endpoint, UserInstanceStatus status);
-
-	void updateEdgeInfo(String projectName, String endpointName, EdgeInfo edgeInfo);
-
-	Optional<ProjectDTO> get(String name);
-
-	List<ProjectDTO> getProjectsByEndpoint(String endpointName);
-
-	boolean update(ProjectDTO projectDTO);
-
-	void remove(String name);
-
-	Optional<Integer> getAllowedBudget(String project);
-
-	void updateBudget(String project, Integer budget);
-
-	boolean isAnyProjectAssigned(Set<String> groups);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java
deleted file mode 100644
index fc79656..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/ProjectDAOImpl.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.google.common.collect.Iterables;
-import com.google.inject.Inject;
-import com.mongodb.BasicDBObject;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.elemMatch;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.in;
-import static com.mongodb.client.model.Filters.not;
-
-public class ProjectDAOImpl extends BaseDAO implements ProjectDAO {
-
-	private static final String PROJECTS_COLLECTION = "Projects";
-	private static final String GROUPS = "groups";
-	private static final String ENDPOINTS = "endpoints";
-	private static final String STATUS_FIELD = "status";
-	private static final String SHARED_IMAGE_FIELD = "sharedImageEnabled";
-	private static final String ENDPOINT_STATUS_FIELD = "endpoints." + STATUS_FIELD;
-	private static final String EDGE_INFO_FIELD = "edgeInfo";
-	private static final String ENDPOINT_FIELD = "endpoints.$.";
-	private static final String ANYUSER = Pattern.quote("$anyuser");
-
-	private final UserGroupDao userGroupDao;
-
-	@Inject
-	public ProjectDAOImpl(UserGroupDao userGroupDao) {
-		this.userGroupDao = userGroupDao;
-	}
-
-
-	@Override
-	public List<ProjectDTO> getProjects() {
-		return find(PROJECTS_COLLECTION, ProjectDTO.class);
-	}
-
-	@Override
-	public List<ProjectDTO> getProjectsWithEndpointStatusNotIn(UserInstanceStatus... statuses) {
-		final List<String> statusList =
-				Arrays.stream(statuses).map(UserInstanceStatus::name).collect(Collectors.toList());
-
-		return find(PROJECTS_COLLECTION, not(in(ENDPOINT_STATUS_FIELD, statusList)), ProjectDTO.class);
-	}
-
-	@Override
-	public List<ProjectDTO> getUserProjects(UserInfo userInfo, boolean active) {
-		final Set<String> groups = Stream.concat(userGroupDao.getUserGroups(userInfo.getName()).stream(),
-				userInfo.getRoles().stream())
-				.collect(Collectors.toSet());
-		return find(PROJECTS_COLLECTION, userProjectCondition(groups, active), ProjectDTO.class);
-	}
-
-	@Override
-	public void create(ProjectDTO projectDTO) {
-		insertOne(PROJECTS_COLLECTION, projectDTO);
-	}
-
-	@Override
-	public void updateStatus(String projectName, ProjectDTO.Status status) {
-		updateOne(PROJECTS_COLLECTION, projectCondition(projectName),
-				new Document(SET, new Document(STATUS_FIELD, status.toString())));
-	}
-
-	@Override
-	public void updateEdgeStatus(String projectName, String endpoint, UserInstanceStatus status) {
-		BasicDBObject dbObject = new BasicDBObject();
-		dbObject.put(ENDPOINT_FIELD + STATUS_FIELD, status.name());
-		updateOne(PROJECTS_COLLECTION, projectAndEndpointCondition(projectName,
-				endpoint), new Document(SET, dbObject));
-	}
-
-	@Override
-	public void updateEdgeInfo(String projectName, String endpointName, EdgeInfo edgeInfo) {
-		BasicDBObject dbObject = new BasicDBObject();
-		dbObject.put(ENDPOINT_FIELD + STATUS_FIELD, UserInstanceStatus.RUNNING.name());
-		dbObject.put(ENDPOINT_FIELD + EDGE_INFO_FIELD, convertToBson(edgeInfo));
-		updateOne(PROJECTS_COLLECTION, projectAndEndpointCondition(projectName, endpointName), new Document(SET,
-				dbObject));
-	}
-
-	@Override
-	public Optional<ProjectDTO> get(String name) {
-		return findOne(PROJECTS_COLLECTION, projectCondition(name), ProjectDTO.class);
-	}
-
-	@Override
-	public List<ProjectDTO> getProjectsByEndpoint(String endpointName) {
-		return find(PROJECTS_COLLECTION, elemMatch(ENDPOINTS, eq("name", endpointName)), ProjectDTO.class);
-	}
-
-	@Override
-	public boolean update(ProjectDTO projectDTO) {
-		BasicDBObject updateProject = new BasicDBObject();
-		updateProject.put(GROUPS, projectDTO.getGroups());
-		updateProject.put(ENDPOINTS,
-				projectDTO.getEndpoints().stream().map(this::convertToBson).collect(Collectors.toList()));
-		updateProject.put(SHARED_IMAGE_FIELD, projectDTO.isSharedImageEnabled());
-		return updateOne(PROJECTS_COLLECTION, projectCondition(projectDTO.getName()),
-				new Document(SET, updateProject)).getMatchedCount() > 0L;
-	}
-
-	@Override
-	public void remove(String name) {
-		deleteOne(PROJECTS_COLLECTION, projectCondition(name));
-	}
-
-	@Override
-	public Optional<Integer> getAllowedBudget(String project) {
-		return get(project).map(ProjectDTO::getBudget);
-	}
-
-	@Override
-	public void updateBudget(String project, Integer budget) {
-		updateOne(PROJECTS_COLLECTION, projectCondition(project), new Document(SET, new Document("budget", budget)));
-	}
-
-	@Override
-	public boolean isAnyProjectAssigned(Set<String> groups) {
-		final String groupsRegex = !groups.isEmpty() ? String.join("|", groups) + "|" + ANYUSER : ANYUSER;
-		return !Iterables.isEmpty(find(PROJECTS_COLLECTION, elemMatch(GROUPS, regexCaseInsensitive(groupsRegex))));
-	}
-
-	private Bson projectCondition(String name) {
-		return eq("name", name);
-	}
-
-	private Bson userProjectCondition(Set<String> groups, boolean active) {
-		final String groupsRegex = !groups.isEmpty() ? String.join("|", groups) + "|" + ANYUSER : ANYUSER;
-		if (active) {
-			return and(elemMatch(GROUPS, regexCaseInsensitive(groupsRegex)),
-					eq(ENDPOINT_STATUS_FIELD, UserInstanceStatus.RUNNING.name()));
-		}
-		return elemMatch(GROUPS, regexCaseInsensitive(groupsRegex));
-	}
-
-	private Bson projectAndEndpointCondition(String projectName, String endpointName) {
-		return and(eq("name", projectName), eq("endpoints.name", endpointName));
-	}
-
-	private Document regexCaseInsensitive(String values) {
-		return new Document("$regex",
-				"^(" + values + ")$").append("$options", "i");
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/RequestIdDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/RequestIdDAO.java
deleted file mode 100644
index f90d2e1..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/RequestIdDAO.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.domain.RequestIdDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.mongodb.client.model.Updates;
-import com.mongodb.client.result.DeleteResult;
-import org.bson.Document;
-
-import java.util.Date;
-import java.util.Optional;
-
-import static com.epam.dlab.backendapi.dao.MongoCollections.REQUEST_ID;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.lt;
-
-/** DAO for request id.
- */
-public class RequestIdDAO extends BaseDAO {
-    private static final String EXPIRATION_TIME = "expirationTime";
-
-	public RequestIdDTO get(String id) {
-		Optional<RequestIdDTO> opt = findOne(REQUEST_ID, eq(ID, id), RequestIdDTO.class);
-		if (!opt.isPresent()) {
-			throw new DlabException("Request id " + id + " not found.");
-		}
-		return opt.get();
-    }
-
-	public void put(RequestIdDTO requestId) {
-		getCollection(REQUEST_ID)
-			.insertOne(convertToBson(requestId));
-    }
-
-	public void delete(String id) {
-		getCollection(REQUEST_ID).deleteOne(eq(ID, id));
-    }
-
-	public void resetExpirationTime() {
-		Date time = new Date();
-		getCollection(REQUEST_ID).updateMany(new Document(), Updates.set(EXPIRATION_TIME, time));
-    }
-
-	public long removeExpired() {
-		DeleteResult result = getCollection(REQUEST_ID)
-								.deleteMany(lt(EXPIRATION_TIME, new Date()));
-		return result.getDeletedCount();
-    }
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/SchedulerJobDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/SchedulerJobDAO.java
deleted file mode 100644
index fc292dd..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/SchedulerJobDAO.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.model.scheduler.SchedulerJobData;
-import com.google.inject.Singleton;
-import com.mongodb.client.FindIterable;
-import com.mongodb.client.model.Filters;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static com.epam.dlab.backendapi.dao.ComputationalDAO.COMPUTATIONAL_NAME;
-import static com.epam.dlab.backendapi.dao.ComputationalDAO.IMAGE;
-import static com.epam.dlab.backendapi.dao.ComputationalDAO.PROJECT;
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.COMPUTATIONAL_RESOURCES;
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.EXPLORATORY_NAME;
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.exploratoryCondition;
-import static com.epam.dlab.backendapi.dao.MongoCollections.USER_INSTANCES;
-import static com.epam.dlab.dto.base.DataEngineType.fromDockerImageName;
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.exists;
-import static com.mongodb.client.model.Filters.in;
-import static com.mongodb.client.model.Filters.lte;
-import static com.mongodb.client.model.Filters.ne;
-import static com.mongodb.client.model.Filters.or;
-import static com.mongodb.client.model.Projections.excludeId;
-import static com.mongodb.client.model.Projections.fields;
-import static com.mongodb.client.model.Projections.include;
-import static java.util.stream.Collectors.toList;
-
-/**
- * DAO for user's scheduler jobs.
- */
-@Slf4j
-@Singleton
-public class SchedulerJobDAO extends BaseDAO {
-
-	static final String SCHEDULER_DATA = "scheduler_data";
-	private static final String CONSIDER_INACTIVITY_FLAG = SCHEDULER_DATA + ".consider_inactivity";
-	public static final String TIMEZONE_PREFIX = "UTC";
-	private static final String LAST_ACTIVITY = "last_activity";
-	private static final String CHECK_INACTIVITY_REQUIRED = "check_inactivity_required";
-	private static final String CHECK_INACTIVITY_FLAG = SCHEDULER_DATA + "." + CHECK_INACTIVITY_REQUIRED;
-
-
-	public SchedulerJobDAO() {
-		log.info("{} is initialized", getClass().getSimpleName());
-	}
-
-	/**
-	 * Returns condition for search scheduler for exploratory which is not null.
-	 *
-	 * @return Bson condition.
-	 */
-	private Bson schedulerNotNullCondition() {
-		return and(exists(SCHEDULER_DATA), ne(SCHEDULER_DATA, null));
-	}
-
-	/**
-	 * Finds and returns the info of user's single scheduler job by exploratory name.
-	 *
-	 * @param user            user name.
-	 * @param project         project name
-	 * @param exploratoryName the name of exploratory.
-	 * @return scheduler job data.
-	 */
-	public Optional<SchedulerJobDTO> fetchSingleSchedulerJobByUserAndExploratory(String user, String project, String exploratoryName) {
-		return findOne(USER_INSTANCES,
-				and(exploratoryCondition(user, exploratoryName, project), schedulerNotNullCondition()),
-				fields(include(SCHEDULER_DATA), excludeId()))
-				.map(d -> convertFromDocument((Document) d.get(SCHEDULER_DATA), SchedulerJobDTO.class));
-	}
-
-	/**
-	 * Finds and returns the info of user's single scheduler job for computational resource.
-	 *
-	 * @param user              user name.
-	 * @param project           project name
-	 * @param exploratoryName   the name of exploratory.
-	 * @param computationalName the name of computational resource.
-	 * @return scheduler job data.
-	 */
-
-	@SuppressWarnings("unchecked")
-	public Optional<SchedulerJobDTO> fetchSingleSchedulerJobForCluster(String user, String project, String exploratoryName,
-																	   String computationalName) {
-		return findOne(USER_INSTANCES,
-				exploratoryCondition(user, exploratoryName, project),
-				fields(include(COMPUTATIONAL_RESOURCES), excludeId()))
-				.map(d -> (List<Document>) d.get(COMPUTATIONAL_RESOURCES))
-				.map(list -> list.stream().filter(d -> d.getString(COMPUTATIONAL_NAME).equals(computationalName))
-						.findAny().orElse(new Document()))
-				.map(d -> (Document) d.get(SCHEDULER_DATA))
-				.map(d -> convertFromDocument(d, SchedulerJobDTO.class));
-	}
-
-	/**
-	 * Finds and returns the list of all scheduler jobs for starting/stopping/terminating exploratories regarding to
-	 * parameter passed.
-	 *
-	 * @param status 'running' value for starting exploratory, 'stopped' - for stopping and 'terminated' -
-	 *               for
-	 *               terminating.
-	 * @return list of scheduler jobs.
-	 */
-	public List<SchedulerJobData> getExploratorySchedulerDataWithStatus(UserInstanceStatus status) {
-		FindIterable<Document> userInstances = userInstancesWithScheduler(eq(STATUS, status.toString()));
-
-		return stream(userInstances).map(d -> convertFromDocument(d, SchedulerJobData.class))
-				.collect(toList());
-	}
-
-	public List<SchedulerJobData> getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(UserInstanceStatus status,
-																								  Date lastActivity) {
-		return stream(find(USER_INSTANCES,
-				and(
-						eq(STATUS, status.toString()),
-						schedulerNotNullCondition(),
-						or(and(eq(CONSIDER_INACTIVITY_FLAG, true),
-								or(eq(COMPUTATIONAL_RESOURCES, Collections.emptyList()),
-										and(ne(COMPUTATIONAL_RESOURCES, Collections.emptyList()),
-												Filters.elemMatch(COMPUTATIONAL_RESOURCES,
-														lte(LAST_ACTIVITY, lastActivity))))),
-								eq(CONSIDER_INACTIVITY_FLAG, false)
-						)
-				),
-				fields(excludeId(), include(USER, PROJECT, EXPLORATORY_NAME, SCHEDULER_DATA))))
-				.map(d -> convertFromDocument(d, SchedulerJobData.class))
-				.collect(toList());
-	}
-
-	public List<SchedulerJobData> getExploratorySchedulerDataWithOneOfStatus(UserInstanceStatus... statuses) {
-		FindIterable<Document> userInstances = userInstancesWithScheduler(in(STATUS,
-				Arrays.stream(statuses).map(UserInstanceStatus::toString).collect(toList())));
-
-		return stream(userInstances).map(d -> convertFromDocument(d, SchedulerJobData.class))
-				.collect(toList());
-	}
-
-	public List<SchedulerJobData> getComputationalSchedulerDataWithOneOfStatus(UserInstanceStatus exploratoryStatus,
-																			   DataEngineType dataEngineType,
-																			   UserInstanceStatus... statuses) {
-		return stream(computationalResourcesWithScheduler(exploratoryStatus))
-				.map(doc -> computationalSchedulerDataStream(doc, dataEngineType, statuses))
-				.flatMap(Function.identity())
-				.collect(toList());
-	}
-
-	public List<SchedulerJobData> getComputationalSchedulerDataWithOneOfStatus(UserInstanceStatus exploratoryStatus,
-																			   UserInstanceStatus... statuses) {
-		return stream(computationalResourcesWithScheduler(exploratoryStatus))
-				.map(doc -> computationalSchedulerData(doc, statuses).map(compResource -> toSchedulerData(doc,
-						compResource)))
-				.flatMap(Function.identity())
-				.collect(toList());
-	}
-
-	private FindIterable<Document> computationalResourcesWithScheduler(UserInstanceStatus exploratoryStatus) {
-		final Bson computationalSchedulerCondition = Filters.elemMatch(COMPUTATIONAL_RESOURCES,
-				and(schedulerNotNullCondition()));
-		return find(USER_INSTANCES,
-				and(eq(STATUS, exploratoryStatus.toString()), computationalSchedulerCondition),
-				fields(excludeId(), include(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_RESOURCES)));
-	}
-
-	public void removeScheduler(String user, String exploratory) {
-		updateOne(USER_INSTANCES, and(eq(USER, user), eq(EXPLORATORY_NAME, exploratory)),
-				unset(SCHEDULER_DATA, StringUtils.EMPTY));
-	}
-
-	public void removeScheduler(String user, String exploratory, String computational) {
-		updateOne(USER_INSTANCES, and(eq(USER, user), eq(EXPLORATORY_NAME, exploratory),
-				Filters.elemMatch(COMPUTATIONAL_RESOURCES, eq(COMPUTATIONAL_NAME, computational))),
-				unset(COMPUTATIONAL_RESOURCES + ".$." + SCHEDULER_DATA, StringUtils.EMPTY));
-	}
-
-	private FindIterable<Document> userInstancesWithScheduler(Bson statusCondition) {
-		return find(USER_INSTANCES,
-				and(
-						statusCondition,
-						schedulerNotNullCondition(), eq(CHECK_INACTIVITY_FLAG, false)
-				),
-				fields(excludeId(), include(USER, EXPLORATORY_NAME, PROJECT, SCHEDULER_DATA)));
-	}
-
-	private Stream<SchedulerJobData> computationalSchedulerDataStream(Document doc, DataEngineType computationalType,
-																	  UserInstanceStatus... computationalStatuses) {
-		return computationalSchedulerData(doc, computationalStatuses)
-				.filter(compResource -> fromDockerImageName(compResource.getString(IMAGE)) == computationalType)
-				.map(compResource -> toSchedulerData(doc, compResource));
-	}
-
-	private SchedulerJobData toSchedulerData(Document userInstanceDocument, Document compResource) {
-		final String user = userInstanceDocument.getString(USER);
-		final String project = userInstanceDocument.getString(PROJECT);
-		final String exploratoryName = userInstanceDocument.getString(EXPLORATORY_NAME);
-		final String computationalName = compResource.getString(COMPUTATIONAL_NAME);
-		final SchedulerJobDTO schedulerData = convertFromDocument((Document) compResource.get(SCHEDULER_DATA),
-				SchedulerJobDTO.class);
-		return new SchedulerJobData(user, exploratoryName, computationalName, project, schedulerData);
-	}
-
-	@SuppressWarnings("unchecked")
-	private Stream<Document> computationalSchedulerData(Document doc, UserInstanceStatus... computationalStatuses) {
-		final Set<String> statusSet = Arrays.stream(computationalStatuses)
-				.map(UserInstanceStatus::toString)
-				.collect(Collectors.toSet());
-		return ((List<Document>) doc.get(COMPUTATIONAL_RESOURCES))
-				.stream()
-				.filter(compResource -> Objects.nonNull(compResource.get(SCHEDULER_DATA)) &&
-						statusSet.contains(compResource.getString(STATUS)));
-	}
-}
-
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/SecurityDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/SecurityDAO.java
deleted file mode 100644
index 0c76422..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/SecurityDAO.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.auth.dto.UserCredentialDTO;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.util.UsernameUtils;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.mongodb.client.FindIterable;
-import com.mongodb.client.model.Projections;
-import org.bson.Document;
-import org.keycloak.representations.AccessTokenResponse;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-import static com.epam.dlab.backendapi.dao.MongoCollections.LOGIN_ATTEMPTS;
-import static com.epam.dlab.backendapi.dao.MongoCollections.ROLES;
-import static com.mongodb.client.model.Filters.*;
-import static com.mongodb.client.model.Projections.*;
-
-/**
- * DAO write the attempt of user login into DLab.
- */
-@Singleton
-public class SecurityDAO extends BaseDAO {
-
-	@Inject
-	private SelfServiceApplicationConfiguration conf;
-	private static final String SECURITY_COLLECTION = "security";
-	private static final String TOKEN_RESPONSE = "tokenResponse";
-
-	/**
-	 * Write the attempt of user login into Mongo database.
-	 *
-	 * @param credentials user credentials.
-	 */
-	public void writeLoginAttempt(UserCredentialDTO credentials) {
-		insertOne(LOGIN_ATTEMPTS,
-				() -> new Document("login", credentials.getUsername()).append("iamlogin", UsernameUtils.removeDomain
-						(credentials.getUsername())));
-	}
-
-	/**
-	 * Return the roles or throw exception if roles collection does not exists.
-	 */
-	public FindIterable<Document> getRoles() {
-		if (!collectionExists(ROLES)) {
-			throw new DlabException("Collection \"" + ROLES + "\" does not exists.");
-		}
-		return find(ROLES, ne(ID, "_Example"), fields(exclude("description")));
-	}
-
-	public Map<String, Set<String>> getGroups() {
-		return stream(find("userGroups"))
-				.collect(Collectors.toMap(d -> d.getString(ID).toLowerCase(), this::toUsers));
-
-	}
-
-	public void saveUser(String userName, AccessTokenResponse accessTokenResponse) {
-		updateOne(SECURITY_COLLECTION, eq(ID, userName),
-				new Document(SET,
-						new Document()
-								.append(ID, userName)
-								.append("created", new Date())
-								.append("last_access", new Date())
-								.append(TOKEN_RESPONSE, convertToBson(accessTokenResponse))),
-				true);
-	}
-
-	public void updateUser(String userName, AccessTokenResponse accessTokenResponse) {
-		updateOne(SECURITY_COLLECTION, eq(ID, userName),
-				new Document(SET,
-						new Document()
-								.append(ID, userName)
-								.append("last_access", new Date())
-								.append(TOKEN_RESPONSE, convertToBson(accessTokenResponse))));
-	}
-
-	public Optional<UserInfo> getUser(String token) {
-		return Optional.ofNullable(mongoService.getCollection(SECURITY_COLLECTION)
-				.findOneAndUpdate(and(eq(TOKEN_RESPONSE + ".access_token", token), gte("last_access",
-						new Date(new Date().getTime() - conf.getInactiveUserTimeoutMillSec()))), new Document("$set",
-						new Document("last_access", new Date()))))
-				.map(d -> new UserInfo(d.getString(ID), token));
-	}
-
-
-	public Optional<AccessTokenResponse> getTokenResponse(String user) {
-		return findOne(SECURITY_COLLECTION, eq(ID, user), Projections.fields(include(TOKEN_RESPONSE)))
-				.map(d -> convertFromDocument((Document) d.get(TOKEN_RESPONSE), AccessTokenResponse.class));
-	}
-
-	@SuppressWarnings("unchecked")
-	private Set<String> toUsers(Document d) {
-		final Object users = d.get("users");
-		return users == null ? Collections.emptySet() :
-				new HashSet<>(((List<String>) users).stream().map(String::toLowerCase).collect(Collectors.toList()));
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/SettingsDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/SettingsDAO.java
deleted file mode 100644
index d5770e1..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/SettingsDAO.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.exceptions.DlabException;
-import com.mongodb.client.model.UpdateOptions;
-import org.apache.commons.lang3.StringUtils;
-import org.bson.Document;
-
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import static com.epam.dlab.backendapi.dao.MongoCollections.SETTINGS;
-import static com.epam.dlab.backendapi.dao.MongoSetting.*;
-import static com.mongodb.client.model.Filters.eq;
-import static org.apache.commons.lang3.StringUtils.EMPTY;
-
-/**
- * Stores the environment settings.
- */
-public class SettingsDAO extends BaseDAO {
-	private static final String VALUE = "value";
-
-	/**
-	 * Returns the base name of service.
-	 */
-	public String getServiceBaseName() {
-		return getSetting(SERIVICE_BASE_NAME);
-	}
-
-	public void setServiceBaseName(String sbn) {
-		setSetting(SERIVICE_BASE_NAME, sbn);
-	}
-
-	/**
-	 * Returns the name of OS family.
-	 */
-	public String getConfOsFamily() {
-		return getSetting(CONF_OS_FAMILY);
-	}
-
-	public void setConfOsFamily(String osFamily) {
-		setSetting(CONF_OS_FAMILY, osFamily);
-	}
-
-	/**
-	 * Returns the name of directory for user key.
-	 */
-	public String getConfKeyDir() {
-		return getSetting(CONF_KEY_DIRECTORY);
-	}
-
-	public void setConfKeyDir(String confKeyDir) {
-		setSetting(CONF_KEY_DIRECTORY, confKeyDir);
-	}
-
-	/**
-	 * Returns the name of tag for resource id.
-	 */
-	public String getConfTagResourceId() {
-		return getSetting(CONF_TAG_RESOURCE_ID);
-	}
-
-	public void setConfTagResourceId(String confTagResourceId) {
-		setSetting(CONF_TAG_RESOURCE_ID, confTagResourceId);
-	}
-
-	public Optional<Integer> getMaxBudget() {
-		return getOptionalSetting(CONF_MAX_BUDGET)
-				.map(Integer::valueOf);
-
-	}
-
-	public String getAwsZone() {
-		return getSetting(AWS_ZONE);
-	}
-
-	public void setAwsZone(String awsZone) {
-		setSetting(AWS_ZONE, awsZone);
-	}
-
-	public String getLdapHost() {
-		return getSetting(LDAP_HOSTNAME);
-	}
-
-	public void setLdapHost(String ldapHost) {
-		setSetting(LDAP_HOSTNAME, ldapHost);
-	}
-
-	public String getLdapOu() {
-		return getSetting(LDAP_OU);
-	}
-
-	public void setLdapOu(String ldapOu) {
-		setSetting(LDAP_OU, ldapOu);
-	}
-
-	public String getLdapDn() {
-		return getSetting(LDAP_DN);
-	}
-
-	public void setLdapDn(String ldapDn) {
-		setSetting(LDAP_DN, ldapDn);
-	}
-
-	public String getLdapUser() {
-		return getSetting(LDAP_USER);
-	}
-
-	public void setLdapUser(String user) {
-		setSetting(LDAP_USER, user);
-	}
-
-	public String getLdapPassword() {
-		return getSetting(LDAP_PASSWORD);
-	}
-
-	public void setLdapPassword(String ldapPassword) {
-		setSetting(LDAP_PASSWORD, ldapPassword);
-	}
-
-	/**
-	 * Returns the name of AWS region.
-	 */
-	public String getAwsRegion() {
-		return getSetting(AWS_REGION);
-	}
-
-	public void setAwsRegion(String awsRegion) {
-		setSetting(AWS_REGION, awsRegion);
-	}
-
-	/**
-	 * Returns the id of security group.
-	 */
-	public String getAwsSecurityGroups() {
-		return getSetting(AWS_SECURITY_GROUPS);
-	}
-
-	public void setAwsSecurityGroups(String awsSecurityGroups) {
-		setSetting(AWS_SECURITY_GROUPS, awsSecurityGroups);
-	}
-
-	/**
-	 * Returns the id of virtual private cloud for AWS account.
-	 */
-	public String getAwsVpcId() {
-		return getSetting(AWS_VPC_ID);
-	}
-
-	public void setAwsVpcId(String awsVpcId) {
-		setSetting(AWS_VPC_ID, awsVpcId);
-	}
-
-	/**
-	 * Returns the id of virtual private cloud subnet for AWS account.
-	 */
-	public void setAwsSubnetId(String awsSubnetId) {
-		setSetting(AWS_SUBNET_ID, awsSubnetId);
-	}
-
-	public String getAwsSubnetId() {
-		return getSetting(AWS_SUBNET_ID);
-	}
-
-	public String getAwsNotebookVpcId() {
-		return getSetting(AWS_NOTEBOOK_VPC_ID);
-	}
-
-	public void setSsnStorageAccountTagName(String ssnStorageAccountTagName) {
-		setSetting(SSN_STORAGE_ACCOUNT_TAG_NAME, ssnStorageAccountTagName);
-	}
-
-	public String getSsnStorageAccountTagName() {
-		return getSetting(SSN_STORAGE_ACCOUNT_TAG_NAME);
-	}
-
-	public void setSharedStorageAccountTagName(String sharedStorageAccountTagName) {
-		setSetting(SHARED_STORAGE_ACCOUNT_TAG_NAME, sharedStorageAccountTagName);
-	}
-
-	public String getSharedStorageAccountTagName() {
-		return getSetting(SHARED_STORAGE_ACCOUNT_TAG_NAME);
-	}
-
-	public void setPeeringId(String peeringId) {
-		setSetting(PEERING_ID, peeringId);
-	}
-
-	public void setAwsNotebookVpcId(String awsNotebookVpcId) {
-		setSetting(AWS_NOTEBOOK_VPC_ID, awsNotebookVpcId);
-	}
-
-	public String getAwsNotebookSubnetId() {
-		return getSetting(AWS_NOTEBOOK_SUBNET_ID);
-	}
-
-	public void setAwsNotebookSubnetId(String awsNotebookSubnetId) {
-		setSetting(AWS_NOTEBOOK_SUBNET_ID, awsNotebookSubnetId);
-	}
-
-	public String getAzureRegion() {
-		return getSetting(AZURE_REGION);
-	}
-
-	public String getAzureResourceGroupName() {
-		return getSetting(AZURE_RESOURCE_GROUP_NAME);
-	}
-
-	public String getAzureSubnetName() {
-		return getSetting(AZURE_SUBNET_NAME);
-	}
-
-	public String getAzureVpcName() {
-		return getSetting(AZURE_VPC_NAME);
-	}
-
-	public String getAzureSecurityGroupName() {
-		return getSetting(AZURE_SECURITY_GROUP_NAME);
-	}
-
-	public String getAzureEdgeInstanceSize() {
-		return getSetting(AZURE_EDGE_INSTANCE_SIZE);
-	}
-
-	public String getSsnInstanceSize() {
-		return getSetting(SSN_INSTANCE_SIZE);
-	}
-
-	public String getAzureDataLakeNameTag() {
-		return getSetting(AZURE_DATA_LAKE_NAME_TAG, "");
-	}
-
-	public boolean isAzureDataLakeEnabled() {
-		String dataLakeTagName = getAzureDataLakeNameTag();
-		return dataLakeTagName != null && !dataLakeTagName.isEmpty();
-	}
-
-	public String getAzureDataLakeClientId() {
-		return getSetting(AZURE_DATA_LAKE_CLIENT_ID);
-	}
-
-	public void setAzureRegion(String region) {
-		setSetting(AZURE_REGION, region);
-	}
-
-	public void setAzureResourceGroupName(String resourceGroupName) {
-		setSetting(AZURE_RESOURCE_GROUP_NAME, resourceGroupName);
-	}
-
-	public void setAzureSubnetName(String subnetName) {
-		setSetting(AZURE_SUBNET_NAME, subnetName);
-	}
-
-	public void setAzureVpcName(String vpcName) {
-		setSetting(AZURE_VPC_NAME, vpcName);
-	}
-
-	public void setAzureSecurityGroupName(String securityGroupName) {
-		setSetting(AZURE_SECURITY_GROUP_NAME, securityGroupName);
-	}
-
-	public void setAzureEdgeInstanceSize(String azureEdgeInstanceSize) {
-		setSetting(AZURE_EDGE_INSTANCE_SIZE, azureEdgeInstanceSize);
-	}
-
-	public void setSsnInstanceSize(String ssnInstanceSize) {
-		setSetting(SSN_INSTANCE_SIZE, ssnInstanceSize);
-	}
-
-	public void setAzureDataLakeNameTag(String dataLakeNameTag) {
-		setSetting(AZURE_DATA_LAKE_NAME_TAG, dataLakeNameTag);
-	}
-
-	public void setAzureDataLakeClientId(String dataLakeClientId) {
-		setSetting(AZURE_DATA_LAKE_CLIENT_ID, dataLakeClientId);
-	}
-
-	public String getGcpRegion() {
-		return getSetting(GCP_REGION);
-	}
-
-	public void setGcpRegion(String region) {
-		setSetting(GCP_REGION, region);
-	}
-
-	public String getGcpZone() {
-		return getSetting(GCP_ZONE);
-	}
-
-	public void setGcpZone(String zone) {
-		setSetting(GCP_ZONE, zone);
-	}
-
-	public String getGcpSubnetName() {
-		return getSetting(GCP_SUBNET_NAME);
-	}
-
-	public void setGcpSubnetName(String subnet) {
-		setSetting(GCP_SUBNET_NAME, subnet);
-	}
-
-	public String getGcpProjectId() {
-		return getSetting(GCP_PROJECT_ID);
-	}
-
-	public void setGcpProjectId(String projectId) {
-		setSetting(GCP_PROJECT_ID, projectId);
-	}
-
-	public String getGcpVpcName() {
-		return getSetting(GCP_VPC_NAME);
-	}
-
-	public void setGcpVpcName(String vpcName) {
-		setSetting(GCP_VPC_NAME, vpcName);
-	}
-
-	public void setMaxBudget(Long budget) {
-		setSetting(CONF_MAX_BUDGET, budget.toString());
-	}
-
-	public void removeSetting(MongoSetting setting) {
-		getCollection(SETTINGS).deleteOne(eq(ID, setting.getId()));
-	}
-
-	public Map<String, Object> getSettings() {
-		return stream(getCollection(SETTINGS).find())
-				.collect(Collectors.toMap(d -> d.getString(ID), d -> d.get(VALUE)));
-	}
-
-	/**
-	 * Returns the value of property from Mongo database.
-	 *
-	 * @param setting the name of property.
-	 */
-	private String getSetting(MongoSetting setting) {
-		Document d = settingDocument(setting);
-		if (d == null) {
-			throw new DlabException("Setting property " + setting + " not found");
-		}
-		return d.getOrDefault(VALUE, EMPTY).toString();
-	}
-
-	private Optional<String> getOptionalSetting(MongoSetting setting) {
-		Document d = settingDocument(setting);
-		return Optional.ofNullable(d).map(doc -> doc.getString(VALUE));
-	}
-
-	private Document settingDocument(MongoSetting setting) {
-		return mongoService
-				.getCollection(SETTINGS)
-				.find(eq(ID, setting.getId()))
-				.first();
-	}
-
-	private void setSetting(MongoSetting mongoSetting, String value) {
-		if (StringUtils.isNotEmpty(value)) {
-			mongoService.getCollection(SETTINGS)
-					.updateOne(eq(ID, mongoSetting.getId()), new Document("$set", new Document(VALUE, value)),
-							new UpdateOptions().upsert(true));
-		}
-	}
-
-
-	private String getSetting(MongoSetting setting, String defaultValue) {
-		Document d = settingDocument(setting);
-		if (d == null) {
-			return defaultValue;
-		}
-		return d.getOrDefault(VALUE, defaultValue).toString();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDao.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDao.java
deleted file mode 100644
index ae221f1..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDao.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.dao;
-
-import java.util.Set;
-
-public interface UserGroupDao {
-	void addUsers(String group, Set<String> users);
-
-	void updateUsers(String group, Set<String> users);
-
-	void removeGroup(String groupId);
-
-	Set<String> getUserGroups(String user);
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDaoImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDaoImpl.java
deleted file mode 100644
index cc0da31..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserGroupDaoImpl.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.dao;
-
-import com.google.inject.Singleton;
-import org.bson.Document;
-
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static com.epam.dlab.backendapi.dao.MongoCollections.USER_GROUPS;
-import static com.mongodb.client.model.Filters.elemMatch;
-import static com.mongodb.client.model.Filters.eq;
-
-@Singleton
-public class UserGroupDaoImpl extends BaseDAO implements UserGroupDao {
-
-	private static final String USERS_FIELD = "users";
-
-	@Override
-	public void addUsers(String group, Set<String> users) {
-		updateOne(USER_GROUPS, eq(ID, group), addToSet(USERS_FIELD, users), true);
-	}
-
-	@Override
-	public void updateUsers(String group, Set<String> users) {
-		updateOne(USER_GROUPS, eq(ID, group), new Document(SET, new Document(USERS_FIELD, users)), true);
-	}
-
-	@Override
-	public void removeGroup(String groupId) {
-		deleteOne(USER_GROUPS, eq(ID, groupId));
-	}
-
-	@Override
-	public Set<String> getUserGroups(String user) {
-		return stream(find(USER_GROUPS, elemMatch(USERS_FIELD, new Document("$regex", "^" + user + "$")
-				.append("$options", "i"))))
-				.map(document -> document.getString(ID))
-				.collect(Collectors.toSet());
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDao.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDao.java
deleted file mode 100644
index 48abb54..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDao.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.resources.dto.UserGroupDto;
-import com.epam.dlab.backendapi.resources.dto.UserRoleDto;
-import com.epam.dlab.cloud.CloudProvider;
-
-import java.util.List;
-import java.util.Set;
-
-public interface UserRoleDao {
-	List<UserRoleDto> findAll();
-
-	void insert(UserRoleDto dto);
-
-	void insert(List<UserRoleDto> roles);
-
-	boolean update(UserRoleDto dto);
-
-	void updateMissingRoles(CloudProvider cloudProvider);
-
-	boolean addGroupToRole(Set<String> groups, Set<String> roleIds);
-
-	void removeGroupWhenRoleNotIn(String group, Set<String> roleIds);
-
-	void removeUnnecessaryRoles(CloudProvider cloudProviderToBeRemoved, List<CloudProvider> remainingProviders);
-
-	void remove(String roleId);
-
-	boolean removeGroup(String groupId);
-
-	List<UserGroupDto> aggregateRolesByGroup();
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDaoImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDaoImpl.java
deleted file mode 100644
index 5bc845a..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDaoImpl.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.backendapi.resources.dto.UserGroupDto;
-import com.epam.dlab.backendapi.resources.dto.UserRoleDto;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.exceptions.DlabException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.inject.Singleton;
-import com.mongodb.client.model.BsonField;
-import com.mongodb.client.result.UpdateResult;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static com.epam.dlab.backendapi.dao.MongoCollections.USER_GROUPS;
-import static com.mongodb.client.model.Aggregates.group;
-import static com.mongodb.client.model.Aggregates.lookup;
-import static com.mongodb.client.model.Aggregates.project;
-import static com.mongodb.client.model.Aggregates.unwind;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.in;
-import static com.mongodb.client.model.Filters.not;
-import static java.lang.String.format;
-import static java.util.stream.Collectors.toList;
-
-@Singleton
-public class UserRoleDaoImpl extends BaseDAO implements UserRoleDao {
-	private static final ObjectMapper MAPPER = new ObjectMapper();
-	private static final String ROLES_FILE_FORMAT = "/mongo/%s/mongo_roles.json";
-	private static final String USERS_FIELD = "users";
-	private static final String GROUPS_FIELD = "groups";
-	private static final String DESCRIPTION = "description";
-	private static final String TYPE = "type";
-	private static final String CLOUD = "cloud";
-	private static final String ROLES = "roles";
-	private static final String GROUPS = "$groups";
-	private static final String GROUP = "group";
-	private static final String EXPLORATORY_SHAPES_FIELD = "exploratory_shapes";
-	private static final String PAGES_FIELD = "pages";
-	private static final String EXPLORATORIES_FIELD = "exploratories";
-	private static final String COMPUTATIONALS_FIELD = "computationals";
-	private static final String GROUP_INFO = "groupInfo";
-
-
-	@Override
-	public List<UserRoleDto> findAll() {
-		return find(MongoCollections.ROLES, UserRoleDto.class);
-	}
-
-	@Override
-	public void insert(UserRoleDto dto) {
-		insertOne(MongoCollections.ROLES, dto, dto.getId());
-	}
-
-	@Override
-	public void insert(List<UserRoleDto> roles) {
-		roles.forEach(this::insert);
-	}
-
-	@Override
-	public boolean update(UserRoleDto dto) {
-		final Document userRoleDocument = convertToBson(dto).append(TIMESTAMP, new Date());
-		return conditionMatched(updateOne(MongoCollections.ROLES,
-				eq(ID, dto.getId()),
-				new Document(SET, userRoleDocument)));
-	}
-
-	@Override
-	public void updateMissingRoles(CloudProvider cloudProvider) {
-		getUserRoleFromFile(cloudProvider)
-				.stream()
-				.peek(u -> u.setGroups(Collections.emptySet()))
-				.filter(u -> findAll()
-						.stream()
-						.map(UserRoleDto::getId)
-						.noneMatch(id -> id.equals(u.getId())))
-				.forEach(this::insert);
-
-		addGroupToRole(aggregateRolesByGroup()
-						.stream()
-						.map(UserGroupDto::getGroup)
-						.collect(Collectors.toSet()),
-				getDefaultShapes(cloudProvider));
-	}
-
-	@Override
-	public boolean addGroupToRole(Set<String> groups, Set<String> roleIds) {
-		return conditionMatched(updateMany(MongoCollections.ROLES, in(ID, roleIds), addToSet(GROUPS_FIELD,
-				groups)));
-	}
-
-	@Override
-	public void removeGroupWhenRoleNotIn(String group, Set<String> roleIds) {
-		updateMany(MongoCollections.ROLES, not(in(ID, roleIds)), pull(GROUPS_FIELD, group));
-	}
-
-	@Override
-	public void removeUnnecessaryRoles(CloudProvider cloudProviderToBeRemoved, List<CloudProvider> remainingProviders) {
-		if (remainingProviders.contains(cloudProviderToBeRemoved)) {
-			return;
-		}
-
-		List<UserRoleDto> remainingRoles = new ArrayList<>();
-		remainingProviders.forEach(p -> remainingRoles.addAll(getUserRoleFromFile(p)));
-
-		getUserRoleFromFile(cloudProviderToBeRemoved).stream()
-				.map(UserRoleDto::getId)
-				.filter(u -> remainingRoles.stream()
-						.map(UserRoleDto::getId)
-						.noneMatch(id -> id.equals(u)))
-				.forEach(this::remove);
-	}
-
-	@Override
-	public void remove(String roleId) {
-		deleteOne(MongoCollections.ROLES, eq(ID, roleId));
-	}
-
-	@Override
-	public boolean removeGroup(String groupId) {
-		return conditionMatched(updateMany(MongoCollections.ROLES, in(GROUPS_FIELD, groupId), pull(GROUPS_FIELD,
-				groupId)));
-	}
-
-	@Override
-	public List<UserGroupDto> aggregateRolesByGroup() {
-		final Document role = roleDocument();
-		final Bson groupBy = group(GROUPS, new BsonField(ROLES, new Document(ADD_TO_SET, role)));
-		final Bson lookup = lookup(USER_GROUPS, ID, ID, GROUP_INFO);
-		final List<Bson> pipeline = Arrays.asList(unwind(GROUPS), groupBy, lookup,
-				project(new Document(GROUP, "$" + ID).append(GROUP_INFO, elementAt(GROUP_INFO, 0))
-						.append(ROLES, "$" + ROLES)),
-				project(new Document(GROUP, "$" + ID).append(USERS_FIELD, "$" + GROUP_INFO + "." + USERS_FIELD)
-						.append(ROLES, "$" + ROLES)));
-
-		return stream(aggregate(MongoCollections.ROLES, pipeline))
-				.map(d -> convertFromDocument(d, UserGroupDto.class))
-				.collect(toList());
-	}
-
-	private List<UserRoleDto> getUserRoleFromFile(CloudProvider cloudProvider) {
-		try (InputStream is = getClass().getResourceAsStream(format(ROLES_FILE_FORMAT, cloudProvider.getName()))) {
-			return MAPPER.readValue(is, new TypeReference<List<UserRoleDto>>() {
-			});
-		} catch (IOException e) {
-			throw new IllegalStateException("Can not marshall dlab roles due to: " + e.getMessage());
-		}
-	}
-
-	private Set<String> getDefaultShapes(CloudProvider cloudProvider) {
-		if (cloudProvider == CloudProvider.AWS) {
-			return Stream.of("nbShapes_t2.medium_fetching", "compShapes_c4.xlarge_fetching")
-					.collect(Collectors.toSet());
-		} else if (cloudProvider == CloudProvider.GCP) {
-			return Stream.of("compShapes_n1-standard-2_fetching", "nbShapes_n1-standard-2_fetching")
-					.collect(Collectors.toSet());
-		} else if (cloudProvider == CloudProvider.AZURE) {
-			return Stream.of("nbShapes_Standard_E4s_v3_fetching", "compShapes_Standard_E4s_v3_fetching")
-					.collect(Collectors.toSet());
-		} else {
-			throw new DlabException("Unsupported cloud provider " + cloudProvider);
-		}
-	}
-
-	private Document roleDocument() {
-		return new Document().append(ID, "$" + ID)
-				.append(DESCRIPTION, "$" + DESCRIPTION)
-				.append(TYPE, "$" + TYPE)
-				.append(CLOUD, "$" + CLOUD)
-				.append(USERS_FIELD, "$" + USERS_FIELD)
-				.append(EXPLORATORY_SHAPES_FIELD, "$" + EXPLORATORY_SHAPES_FIELD)
-				.append(PAGES_FIELD, "$" + PAGES_FIELD)
-				.append(EXPLORATORIES_FIELD, "$" + EXPLORATORIES_FIELD)
-				.append(COMPUTATIONALS_FIELD, "$" + COMPUTATIONALS_FIELD);
-	}
-
-	private boolean conditionMatched(UpdateResult updateResult) {
-		return updateResult.getMatchedCount() > 0;
-	}
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserSettingsDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserSettingsDAO.java
deleted file mode 100644
index 695ae0c..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserSettingsDAO.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dao;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.UserDTO;
-import io.dropwizard.auth.Auth;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Optional;
-
-import static com.epam.dlab.backendapi.dao.MongoCollections.USER_SETTINGS;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Updates.set;
-
-/**
- * DAO for the user preferences.
- */
-public class UserSettingsDAO extends BaseDAO {
-	private static final String USER_UI_SETTINGS_FIELD = "userUISettings";
-	private static final String USER_ALLOWED_BUDGET = "allowedBudget";
-
-	/**
-	 * Returns the user preferences of UI dashboard.
-	 *
-	 * @param userInfo user info.
-	 * @return JSON content.
-	 */
-	public String getUISettings(@Auth UserInfo userInfo) {
-		return findOne(USER_SETTINGS, eq(ID, userInfo.getName()))
-				.map(d -> d.getString(USER_UI_SETTINGS_FIELD))
-				.orElse(StringUtils.EMPTY);
-	}
-
-	/**
-	 * Store the user preferences of UI dashboard.
-	 *
-	 * @param userInfo user info.
-	 * @param settings user preferences in JSON format.
-	 */
-	public void setUISettings(UserInfo userInfo, String settings) {
-		updateOne(USER_SETTINGS,
-				eq(ID, userInfo.getName()),
-				set(USER_UI_SETTINGS_FIELD, settings),
-				true);
-	}
-
-	public void updateBudget(UserDTO allowedBudgetDTO) {
-		updateOne(USER_SETTINGS,
-				eq(ID, allowedBudgetDTO.getName()),
-				set(USER_ALLOWED_BUDGET, allowedBudgetDTO.getBudget()),
-				true);
-	}
-
-	public Optional<Integer> getAllowedBudget(String user) {
-		return findOne(USER_SETTINGS, eq(ID, user))
-				.flatMap(d -> Optional.ofNullable(d.getInteger(USER_ALLOWED_BUDGET)));
-	}
-
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/BillingReport.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/BillingReport.java
deleted file mode 100644
index 2bb2062..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/BillingReport.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Data;
-
-import java.time.LocalDate;
-import java.util.List;
-
-@Data
-@Builder
-public class BillingReport {
-    private String sbn;
-    private String name;
-    @JsonProperty("report_lines")
-    private List<BillingReportLine> reportLines;
-    @JsonProperty("from")
-    private LocalDate usageDateFrom;
-    @JsonProperty("to")
-    private LocalDate usageDateTo;
-    @JsonProperty("total_cost")
-    private double totalCost;
-    private String currency;
-    @JsonProperty("is_full")
-    private boolean isFull;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/BillingReportLine.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/BillingReportLine.java
deleted file mode 100644
index a9cdd12..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/BillingReportLine.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.billing.BillingResourceType;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Data;
-
-import java.time.LocalDate;
-
-@Data
-@Builder
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class BillingReportLine {
-    private String dlabId;
-    private String application;
-    @JsonProperty("resource_name")
-    private String resourceName;
-    private String project;
-    private String endpoint;
-    private String user;
-    @JsonProperty("from")
-    private LocalDate usageDateFrom;
-    @JsonProperty("to")
-    private LocalDate usageDateTo;
-    private String usageDate;
-    private String product;
-    private String usageType;
-    private Double cost;
-    private String currency;
-    @JsonProperty("resource_type")
-    private BillingResourceType resourceType;
-    private UserInstanceStatus status;
-    private String shape;
-    private String exploratoryName;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/CreateProjectDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/CreateProjectDTO.java
deleted file mode 100644
index 44f8eef..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/CreateProjectDTO.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
-import java.util.Set;
-
-@Data
-public class CreateProjectDTO {
-	@NotNull
-	private final String name;
-	@NotNull
-	private final Set<String> groups;
-	@NotNull final Set<String> endpoints;
-	@NotNull
-	@Pattern(regexp = "^ssh-.*\\n?", message = "format is incorrect. Please use the openSSH format")
-	private final String key;
-	@NotNull
-	private final String tag;
-	@JsonProperty("shared_image_enabled")
-	private boolean sharedImageEnabled;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointDTO.java
deleted file mode 100644
index f288a68..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointDTO.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.cloud.CloudProvider;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import org.hibernate.validator.constraints.NotBlank;
-import org.hibernate.validator.constraints.NotEmpty;
-import org.hibernate.validator.constraints.URL;
-
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class EndpointDTO {
-
-	private static final String URL_REGEXP_VALIDATION = "^(http(s)?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
-	@NotBlank(message = "field cannot be empty")
-	private final String name;
-	@URL(regexp = URL_REGEXP_VALIDATION, message = "field is in improper format!")
-	private final String url;
-	@NotBlank(message = "field cannot be empty")
-	private final String account;
-	@JsonProperty("endpoint_tag")
-	private final String tag;
-	private final EndpointStatus status;
-	private final CloudProvider cloudProvider;
-
-	public enum EndpointStatus {
-		ACTIVE,
-		INACTIVE
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointResourcesDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointResourcesDTO.java
deleted file mode 100644
index 85f4418..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointResourcesDTO.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.dto.UserInstanceDTO;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-@AllArgsConstructor
-public class EndpointResourcesDTO {
-    private List<UserInstanceDTO> exploratories;
-    private List<ProjectDTO> projects;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibCache.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibCache.java
deleted file mode 100644
index 0faf66c..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibCache.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.LibListComputationalDTO;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ComputationalAPI;
-import com.epam.dlab.rest.contracts.ExploratoryAPI;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import io.dropwizard.lifecycle.Managed;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Cache of libraries for exploratory.
- */
-@Singleton
-public class ExploratoryLibCache implements Managed, Runnable {
-	private static final Logger LOGGER = LoggerFactory.getLogger(ExploratoryLibCache.class);
-
-	@Inject
-	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-
-	@Inject
-	private RequestBuilder requestBuilder;
-
-	@Inject
-	private RequestId requestId;
-	@Inject
-	private EndpointService endpointService;
-
-	/**
-	 * Instance of cache.
-	 */
-	private static ExploratoryLibCache libCache;
-
-	/**
-	 * Thread of the cache.
-	 */
-	private Thread thread;
-
-	/**
-	 * List of libraries.
-	 */
-	private Map<String, ExploratoryLibList> cache = new HashMap<>();
-
-	/**
-	 * Return the list of libraries.
-	 */
-	public static ExploratoryLibCache getCache() {
-		synchronized (libCache) {
-			if (libCache.thread == null) {
-				LOGGER.debug("Library cache thread not running and will be started ...");
-				libCache.thread = new Thread(libCache, libCache.getClass().getSimpleName());
-				libCache.thread.start();
-			}
-		}
-		return libCache;
-	}
-
-	@Override
-	public void start() {
-		if (libCache == null) {
-			libCache = this;
-		}
-	}
-
-	@Override
-	public void stop() {
-		if (libCache != null) {
-			synchronized (libCache) {
-				if (libCache.thread != null) {
-					LOGGER.debug("Library cache thread will be stopped ...");
-					libCache.thread.interrupt();
-					libCache.thread = null;
-					LOGGER.debug("Library cache thread has been stopped");
-				}
-				libCache.cache.clear();
-			}
-		}
-	}
-
-	/**
-	 * Return the list of libraries groups from cache.
-	 *
-	 * @param userInfo     the user info.
-	 * @param userInstance the notebook info.
-	 * @return list of libraries groups
-	 */
-	public List<String> getLibGroupList(UserInfo userInfo, UserInstanceDTO userInstance) {
-		ExploratoryLibList libs = getLibs(userInfo, userInstance);
-		return libs.getGroupList();
-	}
-
-	/**
-	 * Return the list of libraries for docker image and group start with prefix from cache.
-	 *
-	 * @param userInfo     the user info.
-	 * @param userInstance the notebook info.
-	 * @param group        the name of group.
-	 * @param startWith    the prefix for library name.
-	 */
-	public List<LibraryDTO> getLibList(UserInfo userInfo, UserInstanceDTO userInstance, String group,
-									   String startWith) {
-		ExploratoryLibList libs = getLibs(userInfo, userInstance);
-		return libs.getLibs(group, startWith);
-	}
-
-	/**
-	 * Return the list of libraries for docker image from cache.
-	 *
-	 * @param userInfo     the user info.
-	 * @param userInstance the notebook info.
-	 */
-	private ExploratoryLibList getLibs(UserInfo userInfo, UserInstanceDTO userInstance) {
-		ExploratoryLibList libs;
-		String cacheKey = libraryCacheKey(userInstance);
-		synchronized (cache) {
-			cache.computeIfAbsent(cacheKey, libraries -> new ExploratoryLibList(cacheKey, null));
-			libs = cache.get(cacheKey);
-			if (libs.isUpdateNeeded() && !libs.isUpdating()) {
-				libs.setUpdating();
-				requestLibList(userInfo, userInstance);
-			}
-		}
-
-		return libs;
-	}
-
-	public static String libraryCacheKey(UserInstanceDTO instanceDTO) {
-		if (instanceDTO.getResources() != null && !instanceDTO.getResources().isEmpty()) {
-			if (instanceDTO.getResources().size() > 1) {
-				throw new IllegalStateException("Several clusters in userInstance");
-			}
-
-			UserComputationalResource userComputationalResource = instanceDTO.getResources().get(0);
-			return (DataEngineType.fromDockerImageName(userComputationalResource.getImageName()) == DataEngineType.SPARK_STANDALONE)
-					? instanceDTO.getImageName()
-					: libraryCacheKey(instanceDTO.getImageName(), userComputationalResource.getImageName());
-
-		} else {
-			return instanceDTO.getImageName();
-		}
-	}
-
-	private static String libraryCacheKey(String exploratoryImage, String computationalImage) {
-		return exploratoryImage + "/" + computationalImage;
-	}
-
-
-	/**
-	 * Update the list of libraries for docker image in cache.
-	 *
-	 * @param imageName the name of image.
-	 * @param content   the content of libraries list.
-	 */
-	public void updateLibList(String imageName, String content) {
-		synchronized (cache) {
-			cache.remove(imageName);
-			cache.put(imageName,
-					new ExploratoryLibList(imageName, content));
-		}
-	}
-
-	/**
-	 * Remove the list of libraries for docker image from cache.
-	 *
-	 * @param imageName docker image name
-	 */
-	public void removeLibList(String imageName) {
-		synchronized (cache) {
-			cache.remove(imageName);
-		}
-	}
-
-	/**
-	 * Send request to provisioning service for the list of libraries.
-	 *
-	 * @param userInfo     the user info.
-	 * @param userInstance the notebook info.
-	 */
-	private void requestLibList(UserInfo userInfo, UserInstanceDTO userInstance) {
-		try {
-
-			LOGGER.debug("Ask docker for the list of libraries for user {} and exploratory {} computational {}",
-					userInfo.getName(), userInstance.getExploratoryId(),
-					userInstance.getResources());
-
-			String uuid;
-			if (userInstance.getResources() != null && !userInstance.getResources().isEmpty()) {
-				UserComputationalResource userComputationalResource = userInstance.getResources().get(0);
-				EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-				LibListComputationalDTO dto = requestBuilder.newLibComputationalList(userInfo, userInstance,
-						userComputationalResource, endpointDTO);
-
-				uuid = provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_LIB_LIST,
-						userInfo.getAccessToken(),
-						dto, String.class);
-			} else {
-				EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-				ExploratoryActionDTO<?> dto = requestBuilder.newLibExploratoryList(userInfo, userInstance, endpointDTO);
-				uuid = provisioningService.post(endpointDTO.getUrl() + ExploratoryAPI.EXPLORATORY_LIB_LIST,
-						userInfo.getAccessToken(), dto,
-						String.class);
-			}
-
-			requestId.put(userInfo.getName(), uuid);
-
-		} catch (Exception e) {
-			LOGGER.warn("Ask docker for the status of resources for user {} and exploratory {} fails: {}",
-					userInfo.getName(), userInstance, e.getLocalizedMessage(), e);
-		}
-	}
-
-
-	@Override
-	public void run() {
-		while (true) {
-			try {
-				Thread.sleep(ExploratoryLibList.UPDATE_REQUEST_TIMEOUT_MILLIS);
-
-				synchronized (cache) {
-					cache.entrySet().removeIf(e -> e.getValue().isExpired());
-				}
-
-				if (cache.size() == 0) {
-					synchronized (libCache) {
-						thread = null;
-						LOGGER.debug("Library cache thread have no data and will be finished");
-						return;
-					}
-				}
-			} catch (InterruptedException e) {
-				LOGGER.trace("Library cache thread has been interrupted");
-				Thread.currentThread().interrupt();
-				break;
-			} catch (Exception e) {
-				LOGGER.warn("Library cache thread unhandled error: {}", e.getLocalizedMessage(), e);
-			}
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibList.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibList.java
deleted file mode 100644
index 3c79963..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryLibList.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.base.MoreObjects;
-import io.dropwizard.util.Duration;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.IOException;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * Class to store the info about libraries.
- */
-@Slf4j
-public class ExploratoryLibList {
-
-	/**
-	 * Timeout in milliseconds when the info is out of date.
-	 */
-	private static final long EXPIRED_TIMEOUT_MILLIS = Duration.hours(2).toMilliseconds();
-
-	/**
-	 * Timeout in milliseconds until the is out of date.
-	 */
-	private static final long UPDATE_TIMEOUT_MILLIS = Duration.minutes(30).toMilliseconds();
-
-	/**
-	 * Timeout in milliseconds for request to update lib.
-	 */
-	protected static final long UPDATE_REQUEST_TIMEOUT_MILLIS = Duration.minutes(15).toMilliseconds();
-
-	/**
-	 * Image name.
-	 */
-	private String imageName;
-
-	/**
-	 * List of libraries group:libraries:version.
-	 */
-	private Map<String, Map<String, String>> libs = new HashMap<>();
-
-	/**
-	 * Time in milliseconds when the info is out of date.
-	 */
-	private long expiredTimeMillis = 0;
-
-	/**
-	 * Last access time in milliseconds to the info.
-	 */
-	private long accessTimeMillis = 0;
-
-	/**
-	 * Update start time in milliseconds.
-	 */
-	private long updateStartTimeMillis = 0;
-
-	/**
-	 * Update in progress.
-	 */
-	private boolean updating = false;
-
-
-	/**
-	 * Instantiate the list of libraries.
-	 *
-	 * @param imageName the name of docker's image.
-	 * @param content   JSON string.
-	 */
-	ExploratoryLibList(String imageName, String content) {
-		this.imageName = imageName;
-		if (content != null) {
-			setLibs(content);
-		}
-	}
-
-	/**
-	 * Return the list of all groups.
-	 */
-	public List<String> getGroupList() {
-		List<String> list = new ArrayList<>(libs.keySet());
-		Collections.sort(list);
-		return list;
-	}
-
-	/**
-	 * Return the name of docker image;
-	 */
-	public String getImageName() {
-		return imageName;
-	}
-
-	/**
-	 * Return the full list of libraries for group.
-	 *
-	 * @param group the name of group.
-	 */
-	public Map<String, String> getLibs(String group) {
-		return libs.get(group);
-	}
-
-	/**
-	 * Return the full list of libraries for group.
-	 *
-	 * @param content JSON string.
-	 */
-	private void setLibs(String content) {
-		ObjectMapper mapper = new ObjectMapper();
-		try {
-			synchronized (this) {
-				libs.clear();
-				@SuppressWarnings("unchecked")
-				Map<String, Map<String, String>> map = mapper.readValue(content, Map.class);
-				for (Map.Entry<String, Map<String, String>> entry : map.entrySet()) {
-					Map<String, String> group = entry.getValue();
-					String groupName = entry.getKey();
-					log.debug("Update {} image with lib group {} with {} libraries", imageName, groupName,
-							(group != null) ? group.size() : null);
-					libs.put(groupName, new TreeMap<>(group));
-				}
-				expiredTimeMillis = System.currentTimeMillis() + EXPIRED_TIMEOUT_MILLIS;
-				accessTimeMillis = System.currentTimeMillis();
-				updating = false;
-			}
-		} catch (IOException e) {
-			throw new DlabException("Cannot deserialize the list of libraries. " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	/**
-	 * Search and return the list of libraries for name's prefix <b>startWith</b>.
-	 *
-	 * @param group     the name of group.
-	 * @param startWith the prefix for library name.
-	 */
-	public List<LibraryDTO> getLibs(String group, String startWith) {
-
-		String startsWithLower = startWith.toLowerCase();
-
-		Map<String, String> libMap = getLibs(group);
-
-		if (libMap == null) {
-			return Collections.emptyList();
-		}
-
-		return libMap.entrySet().stream()
-				.filter(e -> e.getKey().toLowerCase().startsWith(startsWithLower))
-				.map(e -> new LibraryDTO(e.getKey(), e.getValue()))
-				.collect(Collectors.toList());
-	}
-
-	/**
-	 * Set last access time.
-	 */
-	private void touch() {
-		accessTimeMillis = System.currentTimeMillis();
-	}
-
-	/**
-	 * Return <b>true</b> if the info is out of date.
-	 */
-	public boolean isExpired() {
-		touch();
-		return (expiredTimeMillis < System.currentTimeMillis());
-	}
-
-	/**
-	 * Return <b>true</b> if the info needs to update.
-	 */
-	public boolean isUpdateNeeded() {
-		touch();
-		return (accessTimeMillis > expiredTimeMillis - UPDATE_TIMEOUT_MILLIS);
-	}
-
-	/**
-	 * Set updating in progress.
-	 */
-	public void setUpdating() {
-		updateStartTimeMillis = System.currentTimeMillis();
-		updating = true;
-	}
-
-	/**
-	 * Return <b>true</b> if the update in progress.
-	 */
-	public boolean isUpdating() {
-		if (updating &&
-				updateStartTimeMillis + UPDATE_REQUEST_TIMEOUT_MILLIS < System.currentTimeMillis()) {
-			updating = false;
-		}
-		return updating;
-	}
-
-
-	@Override
-	public String toString() {
-		return MoreObjects.toStringHelper(this)
-				.add("imageName", imageName)
-				.add("expiredTimeMillis", expiredTimeMillis)
-				.add("accessTimeMillis", accessTimeMillis)
-				.add("updateStartTimeMillis", updateStartTimeMillis)
-				.add("isUpdating", updating)
-				.add("libs", (libs == null ? "null" : "..."))
-				.toString();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/MavenSearchArtifactResponse.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/MavenSearchArtifactResponse.java
deleted file mode 100644
index 3bf0154..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/MavenSearchArtifactResponse.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Getter;
-
-import java.util.List;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-@Getter
-public class MavenSearchArtifactResponse {
-
-	@JsonProperty("response")
-	private Response response;
-
-	public void setResponse(Response response) {
-		this.response = response;
-	}
-
-	public int getArtifactCount() {
-		return response.artifactCount;
-	}
-
-	public List<Response.Artifact> getArtifacts() {
-		return response.artifacts;
-	}
-
-	@JsonIgnoreProperties(ignoreUnknown = true)
-	public static class Response {
-		@JsonProperty("numFound")
-		private int artifactCount;
-		@JsonProperty("docs")
-		private List<Artifact> artifacts;
-
-		public void setArtifacts(List<Artifact> artifacts) {
-			this.artifacts = artifacts;
-		}
-
-		@JsonIgnoreProperties(ignoreUnknown = true)
-		public static class Artifact {
-			private String id;
-			@JsonProperty("v")
-			private String version;
-
-			public String getId() {
-				return id;
-			}
-
-			public void setId(String id) {
-				this.id = id;
-			}
-
-			public String getVersion() {
-				return version;
-			}
-
-			public void setVersion(String version) {
-				this.version = version;
-			}
-		}
-	}
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java
deleted file mode 100644
index 72d6697..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectDTO.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
-import java.util.List;
-import java.util.Set;
-
-@Data
-@Builder
-@AllArgsConstructor
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class ProjectDTO {
-	@NotNull
-	private final String name;
-	@NotNull
-	private final Set<String> groups;
-	@NotNull
-	@Pattern(regexp = "^ssh-.*\\n", message = "format is incorrect. Please use the openSSH format")
-	private final String key;
-	@NotNull
-	private final String tag;
-	private final Integer budget;
-	private final List<ProjectEndpointDTO> endpoints;
-	private final boolean sharedImageEnabled;
-
-
-	public enum Status {
-		CREATING,
-		ACTIVE,
-		FAILED,
-		DELETED,
-		DELETING,
-		DEACTIVATING,
-		ACTIVATING,
-		NOT_ACTIVE;
-
-		public static Status from(UserInstanceStatus userInstanceStatus) {
-			if (userInstanceStatus == UserInstanceStatus.RUNNING) {
-				return ACTIVE;
-			} else if (userInstanceStatus == UserInstanceStatus.TERMINATED) {
-				return DELETED;
-			} else if (userInstanceStatus == UserInstanceStatus.TERMINATING) {
-				return DELETING;
-			} else if (userInstanceStatus == UserInstanceStatus.STOPPING) {
-				return DEACTIVATING;
-			} else if (userInstanceStatus == UserInstanceStatus.STOPPED) {
-				return NOT_ACTIVE;
-			} else if (userInstanceStatus == UserInstanceStatus.STARTING) {
-				return ACTIVATING;
-			} else if (userInstanceStatus == UserInstanceStatus.CREATING) {
-				return CREATING;
-			} else if (userInstanceStatus == UserInstanceStatus.FAILED) {
-				return FAILED;
-			}
-			return Status.valueOf(userInstanceStatus.name());
-		}
-
-		public static UserInstanceStatus from(Status status) {
-			if (status == ACTIVE) {
-				return UserInstanceStatus.RUNNING;
-			} else if (status == ACTIVATING) {
-				return UserInstanceStatus.STARTING;
-			} else if (status == DEACTIVATING) {
-				return UserInstanceStatus.STOPPING;
-			} else if (status == NOT_ACTIVE) {
-				return UserInstanceStatus.STOPPED;
-			} else if (status == DELETING) {
-				return UserInstanceStatus.TERMINATING;
-			} else if (status == DELETED) {
-				return UserInstanceStatus.TERMINATED;
-			} else if (status == CREATING) {
-				return UserInstanceStatus.CREATING;
-			} else if (status == FAILED) {
-				return UserInstanceStatus.FAILED;
-			}
-			throw new IllegalArgumentException();
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectEndpointDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectEndpointDTO.java
deleted file mode 100644
index 66b1dac..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ProjectEndpointDTO.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import lombok.Data;
-
-@Data
-public class ProjectEndpointDTO {
-	private final String name;
-	private final UserInstanceStatus status;
-	private final EdgeInfo edgeInfo;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/RequestId.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/RequestId.java
deleted file mode 100644
index 7aa6bb0..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/RequestId.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.backendapi.dao.RequestIdDAO;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import io.dropwizard.util.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Date;
-import java.util.UUID;
-
-/** Stores and checks the id of requests for Provisioning Service.
- */
-@Singleton
-public class RequestId {
-    private static final Logger LOGGER = LoggerFactory.getLogger(RequestId.class);
-
-	/**	Timeout in milliseconds when the request id is out of date. */
-	private static final long EXPIRED_TIMEOUT_MILLIS = Duration.hours(12).toMilliseconds();
-
-	@Inject
-	private RequestIdDAO dao;
-	
-	/** Add the request id for user.
-	 * @param username the name of user.
-	 * @param uuid UUID.
-	 */
-	public String put(String username, String uuid) {
-		LOGGER.trace("Register request id {} for user {}", uuid, username);
-		dao.put(new RequestIdDTO()
-				.withId(uuid)
-				.withUser(username)
-				.withRequestTime(new Date())
-				.withExpirationTime(new Date(System.currentTimeMillis() + EXPIRED_TIMEOUT_MILLIS)));
-		return uuid;
-	}
-	
-	/** Generate, add and return new UUID.
-	 * @param username the name of user.
-	 * @return new UUID
-	 */
-	public String get(String username) {
-		return put(UUID.randomUUID().toString(), username);
-	}
-	
-	/** Remove UUID if it exist. 
-	 * @param uuid UUID.
-	 */
-	public void remove(String uuid) {
-		LOGGER.trace("Unregister request id {}", uuid);
-		dao.delete(uuid);
-	}
-
-	/** Check and remove UUID, if it not exists throw exception.
-	 * @param uuid UUID.
-	 * @return username
-	 */
-	public String checkAndRemove(String uuid) {
-		String username = dao.get(uuid).getUser();
-		LOGGER.trace("Unregister request id {} for user {}", uuid, username);
-		dao.delete(uuid);
-		return username;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/RequestIdDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/RequestIdDTO.java
deleted file mode 100644
index c4074e3..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/RequestIdDTO.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import java.util.Date;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-/** Store request id info.
- * @author Usein_Faradzhev
- *
- */
-public class RequestIdDTO {
-    @JsonProperty("_id")
-    private String id;
-    
-    @JsonProperty
-    private String user;
-
-    @JsonProperty
-    private Date requestTime;
-    
-    @JsonProperty
-    private Date expirationTime;
-    
-    /** Return request id. */
-    public String getId() {
-        return id;
-    }
-
-    /** Set request id. */
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    /** Set request id. */
-    public RequestIdDTO withId(String id) {
-        setId(id);
-        return this;
-    }
-
-    /** Return user name. */
-    public String getUser() {
-        return user;
-    }
-
-    /** Set user name. */
-    public void setUser(String user) {
-        this.user = user;
-    }
-
-    /** Set user name. */
-    public RequestIdDTO withUser(String user) {
-        setUser(user);
-        return this;
-    }
-
-    /** Return request time. */
-    public Date getRequestTime() {
-        return requestTime;
-    }
-
-    /** Set request time. */
-    public void setRequestTime(Date requestTime) {
-        this.requestTime = requestTime;
-    }
-
-    /** Set request time. */
-    public RequestIdDTO withRequestTime(Date requestTime) {
-        setRequestTime(requestTime);
-        return this;
-    }
-
-    /** Return expiration time. */
-    public Date getExpirationTime() {
-        return expirationTime;
-    }
-
-    /** Set expiration time. */
-    public void setExpirationTime(Date expirationTime) {
-        this.expirationTime = expirationTime;
-    }
-
-    /** Set expiration time. */
-    public RequestIdDTO withExpirationTime(Date expirationTime) {
-        setExpirationTime(expirationTime);
-        return this;
-    }
-    
-    public ToStringHelper toStringHelper(Object self) {
-    	return MoreObjects.toStringHelper(self)
-    	        .add("id", id)
-    	        .add("user", user)
-    	        .add("requestTime", requestTime)
-    	        .add("expirationTime", expirationTime);
-    }
-    
-    @Override
-    public String toString() {
-    	return toStringHelper(this).toString();
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/SchedulerConfigurationData.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/SchedulerConfigurationData.java
deleted file mode 100644
index 58090b2..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/SchedulerConfigurationData.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-
-@Data
-public class SchedulerConfigurationData {
-	private final boolean enabled;
-	@NotNull
-	private final String cron;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/UpdateProjectBudgetDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/UpdateProjectBudgetDTO.java
deleted file mode 100644
index f686978..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/UpdateProjectBudgetDTO.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class UpdateProjectBudgetDTO {
-	@NotNull
-	private final String project;
-	@NotNull
-	private final Integer budget;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/UpdateProjectDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/UpdateProjectDTO.java
deleted file mode 100644
index 4622ac5..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/UpdateProjectDTO.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.domain;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-import java.util.Set;
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class UpdateProjectDTO {
-	@NotNull
-	private final String name;
-	@NotNull
-	private final Set<String> endpoints;
-	@NotNull
-	private final Set<String> groups;
-	@JsonProperty("shared_image_enabled")
-	private final boolean sharedImageEnabled;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/bundles/DlabKeycloakBundle.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/bundles/DlabKeycloakBundle.java
deleted file mode 100644
index d15d6e8..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/bundles/DlabKeycloakBundle.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dropwizard.bundles;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.auth.KeycloakAuthenticator;
-import com.epam.dlab.backendapi.auth.SelfServiceSecurityAuthorizer;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.google.inject.Inject;
-import de.ahus1.keycloak.dropwizard.KeycloakBundle;
-import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
-import io.dropwizard.auth.Authenticator;
-import io.dropwizard.auth.Authorizer;
-import io.dropwizard.setup.Environment;
-
-import java.security.Principal;
-
-public class DlabKeycloakBundle extends KeycloakBundle<SelfServiceApplicationConfiguration> {
-
-	@Inject
-	private KeycloakAuthenticator authenticator;
-
-	@Override
-	protected KeycloakConfiguration getKeycloakConfiguration(SelfServiceApplicationConfiguration configuration) {
-		return configuration.getKeycloakConfiguration();
-	}
-
-	@Override
-	protected Class<? extends Principal> getUserClass() {
-		return UserInfo.class;
-	}
-
-	@Override
-	protected Authorizer createAuthorizer() {
-		return new SelfServiceSecurityAuthorizer();
-	}
-
-	@Override
-	protected Authenticator createAuthenticator(KeycloakConfiguration configuration) {
-		return new KeycloakAuthenticator(configuration);
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java
deleted file mode 100644
index 9d9c9f7..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/MongoStartupListener.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dropwizard.listeners;
-
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.EndpointDAO;
-import com.epam.dlab.backendapi.dao.SettingsDAO;
-import com.epam.dlab.backendapi.dao.UserRoleDao;
-import com.epam.dlab.backendapi.resources.dto.UserRoleDto;
-import com.epam.dlab.cloud.CloudProvider;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.inject.Inject;
-import io.dropwizard.lifecycle.ServerLifecycleListener;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.jetty.server.Server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-import static java.lang.String.format;
-import static java.util.Comparator.comparing;
-import static java.util.stream.Collectors.collectingAndThen;
-import static java.util.stream.Collectors.toCollection;
-
-
-@Slf4j
-public class MongoStartupListener implements ServerLifecycleListener {
-
-	private static final String ROLES_FILE_FORMAT = "/mongo/%s/mongo_roles.json";
-	private static final ObjectMapper MAPPER = new ObjectMapper();
-	private final UserRoleDao userRoleDao;
-	private final SelfServiceApplicationConfiguration configuration;
-	private final SettingsDAO settingsDAO;
-	private final EndpointDAO endpointDAO;
-
-	@Inject
-	public MongoStartupListener(UserRoleDao userRoleDao, SelfServiceApplicationConfiguration configuration,
-								SettingsDAO settingsDAO, EndpointDAO endpointDAO) {
-		this.userRoleDao = userRoleDao;
-		this.configuration = configuration;
-		this.settingsDAO = settingsDAO;
-		this.endpointDAO = endpointDAO;
-	}
-
-	@Override
-	public void serverStarted(Server server) {
-		settingsDAO.setServiceBaseName(configuration.getServiceBaseName());
-		settingsDAO.setConfOsFamily(configuration.getOs());
-		settingsDAO.setSsnInstanceSize(configuration.getSsnInstanceSize());
-		if (userRoleDao.findAll().isEmpty()) {
-			log.debug("Populating DLab roles into database");
-			userRoleDao.insert(getRoles());
-		} else {
-			log.info("Roles already populated. Do nothing ...");
-		}
-	}
-
-	private List<UserRoleDto> getRoles() {
-		Set<UserRoleDto> userRoles = new HashSet<>();
-		endpointDAO.getEndpoints().forEach(e -> userRoles.addAll(getUserRoleFromFile(e.getCloudProvider())));
-		return userRoles.stream().collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparing(UserRoleDto::getId))),
-				ArrayList::new));
-	}
-
-	private List<UserRoleDto> getUserRoleFromFile(CloudProvider cloudProvider) {
-		try (InputStream is = getClass().getResourceAsStream(format(ROLES_FILE_FORMAT, cloudProvider.getName()))) {
-			return MAPPER.readValue(is, new TypeReference<List<UserRoleDto>>() {
-			});
-		} catch (IOException e) {
-			log.error("Can not marshall dlab roles due to: {}", e.getMessage());
-			throw new IllegalStateException("Can not marshall dlab roles due to: " + e.getMessage());
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/RestoreHandlerStartupListener.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/RestoreHandlerStartupListener.java
deleted file mode 100644
index 0de166c..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dropwizard/listeners/RestoreHandlerStartupListener.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.dropwizard.listeners;
-
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.rest.client.RESTService;
-import io.dropwizard.lifecycle.ServerLifecycleListener;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.eclipse.jetty.server.Server;
-
-@Slf4j
-public class RestoreHandlerStartupListener implements ServerLifecycleListener {
-
-	private final RESTService provisioningService;
-	private final EndpointService endpointService;
-
-	public RestoreHandlerStartupListener(RESTService provisioningService, EndpointService endpointService) {
-		this.provisioningService = provisioningService;
-		this.endpointService = endpointService;
-	}
-
-	@Override
-	public void serverStarted(Server server) {
-		try {
-			endpointService.getEndpointsWithStatus(EndpointDTO.EndpointStatus.ACTIVE)
-					.forEach(e -> provisioningService.post(e.getUrl() + "/handler/restore", StringUtils.EMPTY, Object.class));
-		} catch (Exception e) {
-			log.error("Exception occurred during restore handler request: {}", e.getMessage());
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/healthcheck/MongoHealthCheck.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/healthcheck/MongoHealthCheck.java
deleted file mode 100644
index 262671c..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/healthcheck/MongoHealthCheck.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.healthcheck;
-
-import com.codahale.metrics.health.HealthCheck;
-import com.epam.dlab.mongo.MongoService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class MongoHealthCheck extends HealthCheck {
-	private final MongoService mongoService;
-
-	@Inject
-	public MongoHealthCheck(MongoService mongoService) {
-		this.mongoService = mongoService;
-	}
-
-	@Override
-	protected Result check() {
-		try {
-			mongoService.ping();
-		} catch (Exception e) {
-			log.error("Mongo is unavailable {}", e.getMessage());
-			return Result.unhealthy(e.getMessage());
-		}
-		return Result.healthy();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/BudgetLimitInterceptor.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/BudgetLimitInterceptor.java
deleted file mode 100644
index 43fdaf6..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/BudgetLimitInterceptor.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.interceptor;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.annotation.Project;
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.exceptions.ResourceQuoteReachedException;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.aopalliance.intercept.MethodInterceptor;
-import org.aopalliance.intercept.MethodInvocation;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Parameter;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.stream.IntStream;
-
-@Slf4j
-public class BudgetLimitInterceptor implements MethodInterceptor {
-	@Inject
-	private BillingDAO billingDAO;
-
-	@Override
-	public Object invoke(MethodInvocation mi) throws Throwable {
-		if (projectQuoteReached(mi) || billingDAO.isBillingQuoteReached()) {
-			final Method method = mi.getMethod();
-			log.warn("Execution of method {} failed because of reaching resource limit quote", method.getName());
-			throw new ResourceQuoteReachedException("Operation can not be finished. Resource quote is reached");
-		} else {
-			return mi.proceed();
-		}
-	}
-
-	private Boolean userQuoteReached(MethodInvocation mi) {
-		return Arrays.stream(mi.getArguments())
-				.filter(arg -> arg.getClass().equals(UserInfo.class))
-				.findAny()
-				.map(u -> ((UserInfo) u).getName())
-				.map(billingDAO::isUserQuoteReached)
-				.orElse(Boolean.FALSE);
-	}
-
-	private Boolean projectQuoteReached(MethodInvocation mi) {
-
-		final Parameter[] parameters = mi.getMethod().getParameters();
-		return IntStream.range(0, parameters.length)
-				.filter(i -> Objects.nonNull(parameters[i].getAnnotation(Project.class)))
-				.mapToObj(i -> (String) mi.getArguments()[i])
-				.findAny()
-				.map(billingDAO::isProjectQuoteReached)
-				.orElse(Boolean.FALSE);
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/ProjectAdminInterceptor.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/ProjectAdminInterceptor.java
deleted file mode 100644
index a536dab..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/interceptor/ProjectAdminInterceptor.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.interceptor;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.annotation.Project;
-import com.epam.dlab.backendapi.annotation.User;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.exceptions.ResourceQuoteReachedException;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.aopalliance.intercept.MethodInterceptor;
-import org.aopalliance.intercept.MethodInvocation;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Parameter;
-import java.util.Objects;
-import java.util.stream.IntStream;
-
-@Slf4j
-public class ProjectAdminInterceptor implements MethodInterceptor {
-    @Inject
-    private ProjectService projectService;
-
-    @Override
-    public Object invoke(MethodInvocation mi) throws Throwable {
-        if (grantAccess(mi)) {
-            return mi.proceed();
-        } else {
-            final Method method = mi.getMethod();
-            log.warn("Execution of method {} failed because user doesn't have appropriate permission", method.getName());
-            throw new ResourceQuoteReachedException("Operation can not be finished. User doesn't have appropriate permission");
-        }
-    }
-
-    private boolean grantAccess(MethodInvocation mi) {
-        final Parameter[] parameters = mi.getMethod().getParameters();
-        String project = IntStream.range(0, parameters.length)
-                .filter(i -> Objects.nonNull(parameters[i].getAnnotation(Project.class)))
-                .mapToObj(i -> (String) mi.getArguments()[i])
-                .findAny()
-                .orElseThrow(() -> new DlabException("Project parameter wanted!"));
-        UserInfo userInfo = IntStream.range(0, parameters.length)
-                .filter(i -> Objects.nonNull(parameters[i].getAnnotation(User.class)))
-                .mapToObj(i -> (UserInfo) mi.getArguments()[i])
-                .findAny()
-                .orElseThrow(() -> new DlabException("UserInfo parameter wanted!"));
-
-        return checkPermission(userInfo, project);
-    }
-
-    private boolean checkPermission(UserInfo userInfo, String project) {
-        return UserRoles.isAdmin(userInfo) || UserRoles.isProjectAdmin(userInfo, projectService.get(project).getGroups());
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/CloudProviderModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/CloudProviderModule.java
deleted file mode 100644
index 8b41baf..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/CloudProviderModule.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.modules;
-
-import com.epam.dlab.backendapi.SelfServiceApplication;
-import com.epam.dlab.backendapi.annotation.BudgetLimited;
-import com.epam.dlab.backendapi.annotation.ProjectAdmin;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.interceptor.BudgetLimitInterceptor;
-import com.epam.dlab.backendapi.interceptor.ProjectAdminInterceptor;
-import com.epam.dlab.backendapi.resources.BillingResource;
-import com.epam.dlab.backendapi.resources.aws.ComputationalResourceAws;
-import com.epam.dlab.backendapi.resources.azure.ComputationalResourceAzure;
-import com.epam.dlab.backendapi.resources.gcp.ComputationalResourceGcp;
-import com.epam.dlab.backendapi.resources.gcp.GcpOauthResource;
-import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.service.InfrastructureInfoService;
-import com.epam.dlab.backendapi.service.InfrastructureTemplateService;
-import com.epam.dlab.backendapi.service.impl.BillingServiceImpl;
-import com.epam.dlab.backendapi.service.impl.InfrastructureInfoServiceImpl;
-import com.epam.dlab.backendapi.service.impl.InfrastructureTemplateServiceImpl;
-import com.epam.dlab.cloud.CloudModule;
-import com.epam.dlab.mongo.MongoServiceFactory;
-import com.fiestacabin.dropwizard.quartz.SchedulerConfiguration;
-import com.google.inject.Injector;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import io.dropwizard.setup.Environment;
-import org.quartz.Scheduler;
-import org.quartz.SchedulerException;
-import org.quartz.impl.StdSchedulerFactory;
-
-import static com.google.inject.matcher.Matchers.annotatedWith;
-import static com.google.inject.matcher.Matchers.any;
-
-public class CloudProviderModule extends CloudModule {
-
-    private static final String MONGO_URI_FORMAT = "mongodb://%s:%s@%s:%d/%s";
-    private static final String QUARTZ_MONGO_URI_PROPERTY = "org.quartz.jobStore.mongoUri";
-    private static final String QUARTZ_DB_NAME = "org.quartz.jobStore.dbName";
-
-    private SelfServiceApplicationConfiguration configuration;
-
-    public CloudProviderModule(SelfServiceApplicationConfiguration configuration) {
-        this.configuration = configuration;
-    }
-
-    @Override
-    protected void configure() {
-        bind(BillingService.class).to(BillingServiceImpl.class);
-        bind(InfrastructureInfoService.class).to(InfrastructureInfoServiceImpl.class);
-        bind(InfrastructureTemplateService.class).to(InfrastructureTemplateServiceImpl.class);
-        bind(SchedulerConfiguration.class).toInstance(
-                new SchedulerConfiguration(SelfServiceApplication.class.getPackage().getName()));
-
-        final BudgetLimitInterceptor budgetLimitInterceptor = new BudgetLimitInterceptor();
-        final ProjectAdminInterceptor projectAdminInterceptor = new ProjectAdminInterceptor();
-        requestInjection(budgetLimitInterceptor);
-        requestInjection(projectAdminInterceptor);
-        bindInterceptor(any(), annotatedWith(BudgetLimited.class), budgetLimitInterceptor);
-        bindInterceptor(any(), annotatedWith(ProjectAdmin.class), projectAdminInterceptor);
-    }
-
-    @Override
-    public void init(Environment environment, Injector injector) {
-        environment.jersey().register(injector.getInstance(BillingResource.class));
-        environment.jersey().register(injector.getInstance(ComputationalResourceAws.class));
-        environment.jersey().register(injector.getInstance(ComputationalResourceAzure.class));
-        environment.jersey().register(injector.getInstance(ComputationalResourceGcp.class));
-        if (injector.getInstance(SelfServiceApplicationConfiguration.class).isGcpOuauth2AuthenticationEnabled()) {
-            environment.jersey().register(injector.getInstance(GcpOauthResource.class));
-        }
-    }
-
-    @Provides
-    @Singleton
-    Scheduler provideScheduler(SelfServiceApplicationConfiguration configuration) throws SchedulerException {
-        final MongoServiceFactory mongoFactory = configuration.getMongoFactory();
-        final String database = mongoFactory.getDatabase();
-        final String mongoUri = String.format(MONGO_URI_FORMAT, mongoFactory.getUsername(), mongoFactory.getPassword(),
-                mongoFactory.getHost(), mongoFactory.getPort(), database);
-        System.setProperty(QUARTZ_MONGO_URI_PROPERTY, mongoUri);
-        System.setProperty(QUARTZ_DB_NAME, database);
-        return StdSchedulerFactory.getDefaultScheduler();
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/DevModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/DevModule.java
deleted file mode 100644
index 9275319..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/DevModule.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.modules;
-
-import com.epam.dlab.ModuleBase;
-import com.epam.dlab.auth.contract.SecurityAPI;
-import com.epam.dlab.backendapi.auth.SelfServiceSecurityAuthorizer;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.BackupDao;
-import com.epam.dlab.backendapi.dao.BackupDaoImpl;
-import com.epam.dlab.backendapi.dao.BaseBillingDAO;
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.dao.EndpointDAO;
-import com.epam.dlab.backendapi.dao.EndpointDAOImpl;
-import com.epam.dlab.backendapi.dao.ImageExploratoryDao;
-import com.epam.dlab.backendapi.dao.ImageExploratoryDaoImpl;
-import com.epam.dlab.backendapi.dao.ProjectDAO;
-import com.epam.dlab.backendapi.dao.ProjectDAOImpl;
-import com.epam.dlab.backendapi.dao.UserGroupDao;
-import com.epam.dlab.backendapi.dao.UserGroupDaoImpl;
-import com.epam.dlab.backendapi.dao.UserRoleDao;
-import com.epam.dlab.backendapi.dao.UserRoleDaoImpl;
-import com.epam.dlab.backendapi.service.AccessKeyService;
-import com.epam.dlab.backendapi.service.ApplicationSettingService;
-import com.epam.dlab.backendapi.service.ApplicationSettingServiceImpl;
-import com.epam.dlab.backendapi.service.BackupService;
-import com.epam.dlab.backendapi.service.ComputationalService;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.EnvironmentService;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.service.ExternalLibraryService;
-import com.epam.dlab.backendapi.service.GitCredentialService;
-import com.epam.dlab.backendapi.service.GuacamoleService;
-import com.epam.dlab.backendapi.service.ImageExploratoryService;
-import com.epam.dlab.backendapi.service.InactivityService;
-import com.epam.dlab.backendapi.service.KeycloakService;
-import com.epam.dlab.backendapi.service.KeycloakServiceImpl;
-import com.epam.dlab.backendapi.service.LibraryService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.ReuploadKeyService;
-import com.epam.dlab.backendapi.service.SchedulerJobService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.epam.dlab.backendapi.service.SecurityServiceImpl;
-import com.epam.dlab.backendapi.service.SystemInfoService;
-import com.epam.dlab.backendapi.service.TagService;
-import com.epam.dlab.backendapi.service.TagServiceImpl;
-import com.epam.dlab.backendapi.service.UserGroupService;
-import com.epam.dlab.backendapi.service.UserRoleService;
-import com.epam.dlab.backendapi.service.UserRoleServiceImpl;
-import com.epam.dlab.backendapi.service.UserSettingService;
-import com.epam.dlab.backendapi.service.UserSettingServiceImpl;
-import com.epam.dlab.backendapi.service.impl.AccessKeyServiceImpl;
-import com.epam.dlab.backendapi.service.impl.BackupServiceImpl;
-import com.epam.dlab.backendapi.service.impl.ComputationalServiceImpl;
-import com.epam.dlab.backendapi.service.impl.EndpointServiceImpl;
-import com.epam.dlab.backendapi.service.impl.EnvironmentServiceImpl;
-import com.epam.dlab.backendapi.service.impl.ExploratoryServiceImpl;
-import com.epam.dlab.backendapi.service.impl.GitCredentialServiceImpl;
-import com.epam.dlab.backendapi.service.impl.GuacamoleServiceImpl;
-import com.epam.dlab.backendapi.service.impl.ImageExploratoryServiceImpl;
-import com.epam.dlab.backendapi.service.impl.InactivityServiceImpl;
-import com.epam.dlab.backendapi.service.impl.LibraryServiceImpl;
-import com.epam.dlab.backendapi.service.impl.MavenCentralLibraryService;
-import com.epam.dlab.backendapi.service.impl.ProjectServiceImpl;
-import com.epam.dlab.backendapi.service.impl.ReuploadKeyServiceImpl;
-import com.epam.dlab.backendapi.service.impl.SchedulerJobServiceImpl;
-import com.epam.dlab.backendapi.service.impl.SystemInfoServiceImpl;
-import com.epam.dlab.backendapi.service.impl.UserGroupServiceImpl;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.mongo.MongoService;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.DockerAPI;
-import com.google.inject.name.Names;
-import io.dropwizard.auth.Authorizer;
-import io.dropwizard.client.JerseyClientBuilder;
-import io.dropwizard.setup.Environment;
-import org.eclipse.jetty.servlets.CrossOriginFilter;
-import org.glassfish.jersey.logging.LoggingFeature;
-
-import javax.servlet.DispatcherType;
-import javax.servlet.FilterRegistration;
-import javax.ws.rs.client.Client;
-import java.util.EnumSet;
-
-/**
- * Mock class for an application configuration of SelfService for developer mode.
- */
-public class DevModule extends ModuleBase<SelfServiceApplicationConfiguration> implements SecurityAPI, DockerAPI {
-
-	public static final String TOKEN = "token123";
-
-	/**
-	 * Instantiates an application configuration of SelfService for developer mode.
-	 *
-	 * @param configuration application configuration of SelfService.
-	 * @param environment   environment of SelfService.
-	 */
-	DevModule(SelfServiceApplicationConfiguration configuration, Environment environment) {
-		super(configuration, environment);
-	}
-
-	@Override
-	protected void configure() {
-		configureCors(environment);
-		final Client httpClient =
-				new JerseyClientBuilder(environment)
-						.using(configuration.getJerseyClientConfiguration())
-						.build("httpClient")
-						.register(new LoggingFeature());
-		bind(SecurityService.class).to(SecurityServiceImpl.class);
-		bind(KeycloakService.class).to(KeycloakServiceImpl.class);
-		bind(Client.class).toInstance(httpClient);
-		bind(SelfServiceApplicationConfiguration.class).toInstance(configuration);
-		bind(MongoService.class).toInstance(configuration.getMongoFactory().build(environment));
-		bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.PROVISIONING_SERVICE_NAME))
-				.toInstance(configuration.getProvisioningFactory()
-						.build(environment, ServiceConsts.PROVISIONING_SERVICE_NAME));
-		bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.BILLING_SERVICE_NAME))
-				.toInstance(configuration.getBillingFactory()
-						.build(environment, ServiceConsts.BILLING_SERVICE_NAME));
-		bind(ImageExploratoryService.class).to(ImageExploratoryServiceImpl.class);
-		bind(ImageExploratoryDao.class).to(ImageExploratoryDaoImpl.class);
-		bind(BackupService.class).to(BackupServiceImpl.class);
-		bind(BackupDao.class).to(BackupDaoImpl.class);
-		bind(ExploratoryService.class).to(ExploratoryServiceImpl.class);
-		bind(TagService.class).to(TagServiceImpl.class);
-		bind(InactivityService.class).to(InactivityServiceImpl.class);
-		bind(Authorizer.class).to(SelfServiceSecurityAuthorizer.class);
-		bind(AccessKeyService.class).to(AccessKeyServiceImpl.class);
-		bind(GitCredentialService.class).to(GitCredentialServiceImpl.class);
-		bind(ComputationalService.class).to(ComputationalServiceImpl.class);
-		bind(LibraryService.class).to(LibraryServiceImpl.class);
-		bind(SchedulerJobService.class).to(SchedulerJobServiceImpl.class);
-		bind(EnvironmentService.class).to(EnvironmentServiceImpl.class);
-		bind(ReuploadKeyService.class).to(ReuploadKeyServiceImpl.class);
-		bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.MAVEN_SEARCH_API))
-				.toInstance(configuration.getMavenApiFactory().build(environment, ServiceConsts.MAVEN_SEARCH_API));
-
-		bind(ExternalLibraryService.class).to(MavenCentralLibraryService.class);
-		bind(SystemInfoService.class).to(SystemInfoServiceImpl.class);
-		bind(UserGroupService.class).to(UserGroupServiceImpl.class);
-		bind(UserRoleService.class).to(UserRoleServiceImpl.class);
-		bind(UserRoleDao.class).to(UserRoleDaoImpl.class);
-		bind(UserGroupDao.class).to(UserGroupDaoImpl.class);
-		bind(ApplicationSettingService.class).to(ApplicationSettingServiceImpl.class);
-		bind(UserSettingService.class).to(UserSettingServiceImpl.class);
-		bind(GuacamoleService.class).to(GuacamoleServiceImpl.class);
-		bind(EndpointService.class).to(EndpointServiceImpl.class);
-		bind(EndpointDAO.class).to(EndpointDAOImpl.class);
-		bind(ProjectService.class).to(ProjectServiceImpl.class);
-		bind(ProjectDAO.class).to(ProjectDAOImpl.class);
-		bind(BillingDAO.class).to(BaseBillingDAO.class);
-	}
-
-	private void configureCors(Environment environment) {
-		final FilterRegistration.Dynamic cors =
-				environment.servlets().addFilter("CORS", CrossOriginFilter.class);
-
-		cors.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
-		cors.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin," +
-				"Authorization");
-		cors.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "OPTIONS,GET,PUT,POST,DELETE,HEAD");
-		cors.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM, "true");
-
-		cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
-
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java
deleted file mode 100644
index eb8d3bc..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.modules;
-
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.cloud.CloudModule;
-import com.google.inject.AbstractModule;
-import io.dropwizard.setup.Environment;
-
-public class ModuleFactory {
-
-	private ModuleFactory() {
-	}
-
-	/**
-	 * Instantiates an application configuration of SelfService for production or tests if
-	 * the mock property of configuration is set to <b>true</b> and method
-	 * {@link SelfServiceApplicationConfiguration#isMocked()}
-	 * returns <b>true</b> value.
-	 *
-	 * @param configuration application configuration of SelfService.
-	 * @param environment   environment of SelfService.
-	 */
-	public static AbstractModule getModule(SelfServiceApplicationConfiguration configuration, Environment
-			environment) {
-		return configuration.isDevMode()
-				? new DevModule(configuration, environment)
-				: new ProductionModule(configuration, environment);
-	}
-
-	public static CloudModule getCloudProviderModule(SelfServiceApplicationConfiguration configuration) {
-		return new CloudProviderModule(configuration);
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
deleted file mode 100644
index d20adbf..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.modules;
-
-import com.epam.dlab.ModuleBase;
-import com.epam.dlab.backendapi.auth.SelfServiceSecurityAuthorizer;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.BackupDao;
-import com.epam.dlab.backendapi.dao.BackupDaoImpl;
-import com.epam.dlab.backendapi.dao.BaseBillingDAO;
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.dao.EndpointDAO;
-import com.epam.dlab.backendapi.dao.EndpointDAOImpl;
-import com.epam.dlab.backendapi.dao.ImageExploratoryDao;
-import com.epam.dlab.backendapi.dao.ImageExploratoryDaoImpl;
-import com.epam.dlab.backendapi.dao.ProjectDAO;
-import com.epam.dlab.backendapi.dao.ProjectDAOImpl;
-import com.epam.dlab.backendapi.dao.UserGroupDao;
-import com.epam.dlab.backendapi.dao.UserGroupDaoImpl;
-import com.epam.dlab.backendapi.dao.UserRoleDao;
-import com.epam.dlab.backendapi.dao.UserRoleDaoImpl;
-import com.epam.dlab.backendapi.service.AccessKeyService;
-import com.epam.dlab.backendapi.service.ApplicationSettingService;
-import com.epam.dlab.backendapi.service.ApplicationSettingServiceImpl;
-import com.epam.dlab.backendapi.service.BackupService;
-import com.epam.dlab.backendapi.service.ComputationalService;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.EnvironmentService;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.service.ExternalLibraryService;
-import com.epam.dlab.backendapi.service.GitCredentialService;
-import com.epam.dlab.backendapi.service.GuacamoleService;
-import com.epam.dlab.backendapi.service.ImageExploratoryService;
-import com.epam.dlab.backendapi.service.InactivityService;
-import com.epam.dlab.backendapi.service.KeycloakService;
-import com.epam.dlab.backendapi.service.KeycloakServiceImpl;
-import com.epam.dlab.backendapi.service.LibraryService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.ReuploadKeyService;
-import com.epam.dlab.backendapi.service.SchedulerJobService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.epam.dlab.backendapi.service.SecurityServiceImpl;
-import com.epam.dlab.backendapi.service.SystemInfoService;
-import com.epam.dlab.backendapi.service.TagService;
-import com.epam.dlab.backendapi.service.TagServiceImpl;
-import com.epam.dlab.backendapi.service.UserGroupService;
-import com.epam.dlab.backendapi.service.UserRoleService;
-import com.epam.dlab.backendapi.service.UserRoleServiceImpl;
-import com.epam.dlab.backendapi.service.UserSettingService;
-import com.epam.dlab.backendapi.service.UserSettingServiceImpl;
-import com.epam.dlab.backendapi.service.impl.AccessKeyServiceImpl;
-import com.epam.dlab.backendapi.service.impl.BackupServiceImpl;
-import com.epam.dlab.backendapi.service.impl.ComputationalServiceImpl;
-import com.epam.dlab.backendapi.service.impl.EndpointServiceImpl;
-import com.epam.dlab.backendapi.service.impl.EnvironmentServiceImpl;
-import com.epam.dlab.backendapi.service.impl.ExploratoryServiceImpl;
-import com.epam.dlab.backendapi.service.impl.GitCredentialServiceImpl;
-import com.epam.dlab.backendapi.service.impl.GuacamoleServiceImpl;
-import com.epam.dlab.backendapi.service.impl.ImageExploratoryServiceImpl;
-import com.epam.dlab.backendapi.service.impl.InactivityServiceImpl;
-import com.epam.dlab.backendapi.service.impl.LibraryServiceImpl;
-import com.epam.dlab.backendapi.service.impl.MavenCentralLibraryService;
-import com.epam.dlab.backendapi.service.impl.ProjectServiceImpl;
-import com.epam.dlab.backendapi.service.impl.ReuploadKeyServiceImpl;
-import com.epam.dlab.backendapi.service.impl.SchedulerJobServiceImpl;
-import com.epam.dlab.backendapi.service.impl.SystemInfoServiceImpl;
-import com.epam.dlab.backendapi.service.impl.UserGroupServiceImpl;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.mongo.MongoService;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.inject.name.Names;
-import io.dropwizard.auth.Authorizer;
-import io.dropwizard.client.JerseyClientBuilder;
-import io.dropwizard.setup.Environment;
-import org.glassfish.jersey.logging.LoggingFeature;
-
-import javax.ws.rs.client.Client;
-
-/**
- * Production class for an application configuration of SelfService.
- */
-public class ProductionModule extends ModuleBase<SelfServiceApplicationConfiguration> {
-
-	/**
-	 * Instantiates an application configuration of SelfService for production environment.
-	 *
-	 * @param configuration application configuration of SelfService.
-	 * @param environment   environment of SelfService.
-	 */
-	public ProductionModule(SelfServiceApplicationConfiguration configuration, Environment environment) {
-		super(configuration, environment);
-	}
-
-	@Override
-	protected void configure() {
-		final Client httpClient =
-				new JerseyClientBuilder(environment)
-						.using(configuration.getJerseyClientConfiguration())
-						.build("httpClient")
-						.register(new LoggingFeature());
-		bind(SelfServiceApplicationConfiguration.class).toInstance(configuration);
-		bind(MongoService.class).toInstance(configuration.getMongoFactory().build(environment));
-		bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.SECURITY_SERVICE_NAME))
-				.toInstance(configuration.getSecurityFactory().build(environment, ServiceConsts
-						.SECURITY_SERVICE_NAME));
-		bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.PROVISIONING_SERVICE_NAME))
-				.toInstance(configuration.getProvisioningFactory().build(environment, ServiceConsts
-						.PROVISIONING_SERVICE_NAME));
-		bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.BILLING_SERVICE_NAME))
-				.toInstance(configuration.getBillingFactory()
-						.build(environment, ServiceConsts.BILLING_SERVICE_NAME));
-		bind(ImageExploratoryService.class).to(ImageExploratoryServiceImpl.class);
-		bind(ImageExploratoryDao.class).to(ImageExploratoryDaoImpl.class);
-		bind(BackupService.class).to(BackupServiceImpl.class);
-		bind(BackupDao.class).to(BackupDaoImpl.class);
-		bind(ExploratoryService.class).to(ExploratoryServiceImpl.class);
-		bind(Authorizer.class).to(SelfServiceSecurityAuthorizer.class);
-		bind(AccessKeyService.class).to(AccessKeyServiceImpl.class);
-		bind(GitCredentialService.class).to(GitCredentialServiceImpl.class);
-		bind(ComputationalService.class).to(ComputationalServiceImpl.class);
-		bind(LibraryService.class).to(LibraryServiceImpl.class);
-		bind(SchedulerJobService.class).to(SchedulerJobServiceImpl.class);
-		bind(EnvironmentService.class).to(EnvironmentServiceImpl.class);
-		bind(ReuploadKeyService.class).to(ReuploadKeyServiceImpl.class);
-		bind(RESTService.class).annotatedWith(Names.named(ServiceConsts.MAVEN_SEARCH_API))
-				.toInstance(configuration.getMavenApiFactory().build(environment, ServiceConsts.MAVEN_SEARCH_API));
-		bind(ExternalLibraryService.class).to(MavenCentralLibraryService.class);
-		bind(SystemInfoService.class).to(SystemInfoServiceImpl.class);
-		bind(UserGroupService.class).to(UserGroupServiceImpl.class);
-		bind(UserRoleService.class).to(UserRoleServiceImpl.class);
-		bind(UserRoleDao.class).to(UserRoleDaoImpl.class);
-		bind(UserGroupDao.class).to(UserGroupDaoImpl.class);
-		bind(InactivityService.class).to(InactivityServiceImpl.class);
-		bind(ApplicationSettingService.class).to(ApplicationSettingServiceImpl.class);
-		bind(UserSettingService.class).to(UserSettingServiceImpl.class);
-		bind(GuacamoleService.class).to(GuacamoleServiceImpl.class);
-		bind(EndpointService.class).to(EndpointServiceImpl.class);
-		bind(EndpointDAO.class).to(EndpointDAOImpl.class);
-		bind(ProjectService.class).to(ProjectServiceImpl.class);
-		bind(ProjectDAO.class).to(ProjectDAOImpl.class);
-		bind(BillingDAO.class).to(BaseBillingDAO.class);
-		bind(TagService.class).to(TagServiceImpl.class);
-		bind(SecurityService.class).to(SecurityServiceImpl.class);
-		bind(KeycloakService.class).to(KeycloakServiceImpl.class);
-		bind(Client.class).toInstance(httpClient);
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ApplicationSettingResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ApplicationSettingResource.java
deleted file mode 100644
index 92f079d..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ApplicationSettingResource.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.service.ApplicationSettingService;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.annotation.security.RolesAllowed;
-import javax.validation.constraints.Min;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Slf4j
-@Path("/settings")
-@RolesAllowed("/api/settings")
-public class ApplicationSettingResource {
-
-
-	private final ApplicationSettingService settingService;
-
-	@Inject
-	public ApplicationSettingResource(ApplicationSettingService settingService) {
-		this.settingService = settingService;
-	}
-
-	@PUT
-	@Path("budget/{maxBudgetAllowed}")
-	public Response setMaxBudget(@Auth UserInfo userInfo,
-								 @PathParam("maxBudgetAllowed") @Min(1) Long maxBudget) {
-		settingService.setMaxBudget(maxBudget);
-		return Response.noContent().build();
-	}
-
-	@DELETE
-	@Path("budget")
-	public Response removeAllowedBudget(@Auth UserInfo userInfo) {
-		log.debug("User {} is removing max budget application setting", userInfo.getName());
-		settingService.removeMaxBudget();
-		return Response.noContent().build();
-	}
-
-	@GET
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response getSettings(@Auth UserInfo userInfo) {
-		return Response.ok(settingService.getSettings()).build();
-
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BackupResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BackupResource.java
deleted file mode 100644
index 3f4125d..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BackupResource.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.resources.dto.BackupFormDTO;
-import com.epam.dlab.backendapi.service.BackupService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.dto.backup.EnvBackupDTO;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.annotation.security.RolesAllowed;
-import javax.validation.Valid;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.UUID;
-
-
-@Slf4j
-@Path("/infrastructure/backup")
-@RolesAllowed("/api/infrastructure/backup")
-public class BackupResource {
-
-	private final BackupService backupService;
-	private final RequestBuilder requestBuilder;
-	private final RequestId requestId;
-
-	@Inject
-	public BackupResource(BackupService backupService, RequestBuilder requestBuilder, RequestId requestId) {
-		this.backupService = backupService;
-		this.requestBuilder = requestBuilder;
-		this.requestId = requestId;
-	}
-
-	@POST
-	@Consumes(MediaType.APPLICATION_JSON)
-	@Produces(MediaType.TEXT_PLAIN)
-	public Response createBackup(@Auth UserInfo userInfo,
-								 @Valid BackupFormDTO backupFormDTO) {
-		log.debug("Creating backup for user {} with parameters {}", userInfo.getName(), backupFormDTO);
-		final EnvBackupDTO dto = requestBuilder.newBackupCreate(backupFormDTO, UUID.randomUUID().toString());
-		final String uuid = backupService.createBackup(dto, userInfo);
-		requestId.put(userInfo.getName(), uuid);
-		return Response.accepted(uuid).build();
-	}
-
-
-	@GET
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response getBackups(@Auth UserInfo userInfo) {
-		log.debug("Getting backups for user {}", userInfo.getName());
-		return Response.ok(backupService.getBackups(userInfo.getName())).build();
-	}
-
-	@GET
-	@Path("{id}")
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response getBackup(@Auth UserInfo userInfo,
-							  @PathParam("id") String id) {
-		log.debug("Getting backup with id {} for user {}", id, userInfo.getName());
-		return Response.ok(backupService.getBackup(userInfo.getName(), id)).build();
-	}
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BillingResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BillingResource.java
deleted file mode 100644
index 1916a38..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BillingResource.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.backendapi.service.BillingService;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path("/billing")
-@Consumes(MediaType.APPLICATION_JSON)
-public class BillingResource {
-
-    private final BillingService billingService;
-
-    @Inject
-    public BillingResource(BillingService billingService) {
-        this.billingService = billingService;
-    }
-
-    @POST
-    @Path("/report")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBillingReport(@Auth UserInfo userInfo, @Valid @NotNull BillingFilter filter) {
-        return Response.ok(billingService.getBillingReport(userInfo, filter)).build();
-    }
-
-    @POST
-    @Path("/report/download")
-    @Produces(MediaType.APPLICATION_OCTET_STREAM)
-    public Response downloadBillingReport(@Auth UserInfo userInfo, @Valid @NotNull BillingFilter filter) {
-        return Response.ok(billingService.downloadReport(userInfo, filter))
-                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"billing-report.csv\"")
-                .build();
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
deleted file mode 100644
index 3b49b42..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EndpointResource.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.EndpointResourcesDTO;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.rest.dto.ErrorDTO;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.headers.Header;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-
-import javax.annotation.security.RolesAllowed;
-import javax.validation.Valid;
-import javax.ws.rs.*;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-import java.net.URI;
-
-@Path("endpoint")
-@RolesAllowed("/api/endpoint")
-public class EndpointResource {
-
-	private final EndpointService endpointService;
-	@Context
-	private UriInfo uriInfo;
-
-	@Inject
-	public EndpointResource(EndpointService endpointService) {
-		this.endpointService = endpointService;
-	}
-
-	@Operation(summary = "Create endpoint", tags = "endpoint")
-	@ApiResponses({
-			@ApiResponse(responseCode = "201", description = "Endpoint is successfully created",
-					headers =
-					@Header(required = true, name = "Location", description = "URI of created endpoint resource",
-							schema = @Schema(type = "string"))),
-			@ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
-					MediaType.APPLICATION_JSON,
-					schema = @Schema(implementation = ErrorDTO.class))),
-			@ApiResponse(responseCode = "409", description = "Endpoint with passed name already exist in system",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON,
-							schema = @Schema(implementation = ErrorDTO.class)))
-	})
-	@Consumes(MediaType.APPLICATION_JSON)
-	@POST
-	public Response createEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo, @Valid EndpointDTO endpointDTO) {
-		endpointService.create(userInfo, endpointDTO);
-		final URI uri = uriInfo.getRequestUriBuilder().path(endpointDTO.getName()).build();
-		return Response
-				.ok()
-				.location(uri)
-				.build();
-	}
-
-	@Operation(summary = "Get endpoint info", tags = "endpoint")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Return information about endpoint",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
-					@Schema(implementation = EndpointDTO.class))),
-			@ApiResponse(responseCode = "404", description = "Endpoint with passed name not found",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON,
-							schema = @Schema(implementation = ErrorDTO.class)))
-	})
-	@GET
-	@Path("{name}")
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response getEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo,
-								@Parameter(description = "Endpoint name")
-								@PathParam("name") String name) {
-		return Response.ok(endpointService.get(name)).build();
-	}
-
-	@Operation(summary = "Get endpoints available in system", tags = "endpoint")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Return information about endpoints",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
-					@Schema(implementation = EndpointDTO.class)))
-	})
-	@GET
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response getEndpoints(@Parameter(hidden = true) @Auth UserInfo userInfo) {
-		return Response.ok(endpointService.getEndpoints()).build();
-	}
-
-	@Operation(summary = "Get resources related to the endpoint", tags = "endpoint")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Return information about resources of endpoint",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
-					@Schema(implementation = EndpointResourcesDTO.class)))
-	})
-	@GET
-	@Path("{name}/resources")
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response getEndpointResources(@Parameter(hidden = true) @Auth UserInfo userInfo,
-										 @Parameter(description = "Endpoint name")
-										 @PathParam("name") String name) {
-		return Response.ok(endpointService.getEndpointResources(name)).build();
-	}
-
-	@Operation(summary = "Remove endpoint", tags = "endpoint")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Endpoint is successfully removed"),
-			@ApiResponse(responseCode = "404", description = "Endpoint with passed name not found",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON,
-							schema = @Schema(implementation = ErrorDTO.class)))
-	})
-	@DELETE
-	@Path("{name}")
-	public Response removeEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo,
-								   @Parameter(description = "Endpoint name")
-								   @PathParam("name") String name,
-								   @Parameter(description = "Delete endpoint only or with related resources")
-								   @QueryParam("with-resources") @DefaultValue("false") boolean withResources) {
-		endpointService.remove(userInfo, name, withResources);
-		return Response.ok().build();
-	}
-
-	@Operation(summary = "Check whether endpoint url is valid", tags = "endpoint")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Valid endpoint url"),
-			@ApiResponse(responseCode = "404", description = "Endpoint url is not valid"),
-	})
-	@GET
-	@Path("url/{url}")
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response checkEndpointUrl(@Parameter(hidden = true) @Auth UserInfo userInfo,
-									 @Parameter(description = "Endpoint url")
-									 @PathParam("url") String url) {
-		endpointService.checkUrl(userInfo, url);
-		return Response.ok().build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EnvironmentResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EnvironmentResource.java
deleted file mode 100644
index 3553ff4..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/EnvironmentResource.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.service.EnvironmentService;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path("environment")
-@Slf4j
-@RolesAllowed("environment/*")
-public class EnvironmentResource {
-
-	private EnvironmentService environmentService;
-
-	@Inject
-	public EnvironmentResource(EnvironmentService environmentService) {
-		this.environmentService = environmentService;
-	}
-
-	@GET
-	@Path("all")
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response getAllEnv(@Auth UserInfo userInfo) {
-		log.debug("Admin {} requested information about all user's environment", userInfo.getName());
-		return Response.ok(environmentService.getAllEnv(userInfo)).build();
-	}
-
-	@POST
-	@Consumes(MediaType.TEXT_PLAIN)
-	@Produces(MediaType.APPLICATION_JSON)
-	@Path("stop/{projectName}/{exploratoryName}")
-	public Response stopNotebook(@Auth UserInfo userInfo, @NotEmpty String user,
-								 @PathParam("projectName") String projectName,
-								 @PathParam("exploratoryName") String exploratoryName) {
-		log.info("Admin {} is stopping notebook {} of user {}", userInfo.getName(), exploratoryName, user);
-		environmentService.stopExploratory(userInfo, user, projectName, exploratoryName);
-		return Response.ok().build();
-	}
-
-	@POST
-	@Consumes(MediaType.TEXT_PLAIN)
-	@Produces(MediaType.APPLICATION_JSON)
-	@Path("stop/{projectName}/{exploratoryName}/{computationalName}")
-	public Response stopCluster(@Auth UserInfo userInfo, @NotEmpty String user,
-								@PathParam("projectName") String projectName,
-								@PathParam("exploratoryName") String exploratoryName,
-								@PathParam("computationalName") String computationalName) {
-		log.info("Admin {} is stopping computational resource {} affiliated with exploratory {} of user {}",
-				userInfo.getName(), computationalName, exploratoryName, user);
-		environmentService.stopComputational(userInfo, user, projectName, exploratoryName, computationalName);
-		return Response.ok().build();
-	}
-
-	@POST
-	@Consumes(MediaType.TEXT_PLAIN)
-	@Produces(MediaType.APPLICATION_JSON)
-	@Path("terminate/{projectName}/{exploratoryName}")
-	public Response terminateNotebook(@Auth UserInfo userInfo, @NotEmpty String user,
-									  @PathParam("projectName") String projectName,
-									  @PathParam("exploratoryName") String exploratoryName) {
-		log.info("Admin {} is terminating notebook {} of user {}", userInfo.getName(), exploratoryName, user);
-		environmentService.terminateExploratory(userInfo, user, projectName, exploratoryName);
-		return Response.ok().build();
-	}
-
-	@POST
-	@Consumes(MediaType.TEXT_PLAIN)
-	@Produces(MediaType.APPLICATION_JSON)
-	@Path("terminate/{projectName}/{exploratoryName}/{computationalName}")
-	public Response terminateCluster(@Auth UserInfo userInfo, @NotEmpty String user,
-									 @PathParam("projectName") String projectName,
-									 @PathParam("exploratoryName") String exploratoryName,
-									 @PathParam("computationalName") String computationalName) {
-		log.info("Admin {} is terminating computational resource {} affiliated with exploratory {} of user {}",
-				userInfo.getName(), computationalName, exploratoryName, user);
-		environmentService.terminateComputational(userInfo, user, projectName, exploratoryName, computationalName);
-		return Response.ok().build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ExploratoryResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ExploratoryResource.java
deleted file mode 100644
index 7b29af1..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ExploratoryResource.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.auth.rest.UserSessionDurationAuthorizer;
-import com.epam.dlab.backendapi.resources.dto.ExploratoryActionFormDTO;
-import com.epam.dlab.backendapi.resources.dto.ExploratoryCreateFormDTO;
-import com.epam.dlab.backendapi.roles.RoleType;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.model.exploratory.Exploratory;
-import com.epam.dlab.rest.contracts.ExploratoryAPI;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.annotation.security.RolesAllowed;
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * Provides the REST API for the exploratory.
- */
-@Path("/infrastructure_provision/exploratory_environment")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ExploratoryResource implements ExploratoryAPI {
-
-	private ExploratoryService exploratoryService;
-
-	@Inject
-	public ExploratoryResource(ExploratoryService exploratoryService) {
-		this.exploratoryService = exploratoryService;
-	}
-
-	@GET
-	public Response getExploratoryPopUp(@Auth UserInfo userInfo) {
-		return Response.ok(exploratoryService.getUserInstances(userInfo)).build();
-	}
-	/**
-	 * Creates the exploratory environment for user.
-	 *
-	 * @param userInfo user info.
-	 * @param formDTO  description for the exploratory environment.
-	 * @return {@link Response.Status#OK} request for provisioning service has been accepted.<br>
-	 * {@link Response.Status#FOUND} request for provisioning service has been duplicated.
-	 */
-	@PUT
-	public Response create(@Auth UserInfo userInfo,
-						   @Valid @NotNull ExploratoryCreateFormDTO formDTO) {
-		log.debug("Creating exploratory environment {} with name {} for user {}",
-				formDTO.getImage(), formDTO.getName(), userInfo.getName());
-		if (!UserRoles.checkAccess(userInfo, RoleType.EXPLORATORY, formDTO.getImage(), userInfo.getRoles())) {
-			log.warn("Unauthorized attempt to create a {} by user {}", formDTO.getImage(), userInfo.getName());
-			throw new DlabException("You do not have the privileges to create a " + formDTO.getTemplateName());
-		}
-		String uuid = exploratoryService.create(userInfo, getExploratory(formDTO), formDTO.getProject());
-		return Response.ok(uuid).build();
-
-	}
-
-
-	/**
-	 * Starts exploratory environment for user.
-	 *
-	 * @param userInfo user info.
-	 * @param formDTO  description of exploratory action.
-	 * @return Invocation response as JSON string.
-	 */
-	@POST
-	@RolesAllowed(UserSessionDurationAuthorizer.SHORT_USER_SESSION_DURATION)
-	public String start(@Auth UserInfo userInfo,
-						@Valid @NotNull ExploratoryActionFormDTO formDTO) {
-		log.debug("Starting exploratory environment {} for user {}", formDTO.getNotebookInstanceName(),
-				userInfo.getName());
-		return exploratoryService.start(userInfo, formDTO.getNotebookInstanceName(), formDTO.getProjectName());
-	}
-
-	/**
-	 * Stops exploratory environment for user.
-	 *
-	 * @param userInfo user info.
-	 * @param name     name of exploratory environment.
-	 * @return Invocation response as JSON string.
-	 */
-	@DELETE
-	@Path("/{project}/{name}/stop")
-	public String stop(@Auth UserInfo userInfo,
-					   @PathParam("project") String project,
-					   @PathParam("name") String name) {
-		log.debug("Stopping exploratory environment {} for user {}", name, userInfo.getName());
-		return exploratoryService.stop(userInfo, project, name);
-	}
-
-	/**
-	 * Terminates exploratory environment for user.
-	 *
-	 * @param userInfo user info.
-	 * @param name     name of exploratory environment.
-	 * @return Invocation response as JSON string.
-	 */
-	@DELETE
-	@Path("/{project}/{name}/terminate")
-	public String terminate(@Auth UserInfo userInfo,
-							@PathParam("project") String project,
-							@PathParam("name") String name) {
-		log.debug("Terminating exploratory environment {} for user {}", name, userInfo.getName());
-		return exploratoryService.terminate(userInfo, project, name);
-	}
-
-	@PUT
-	@Path("/{project}/{name}/reconfigure")
-	public Response reconfigureSpark(@Auth UserInfo userInfo,
-									 @PathParam("project") String project,
-									 @PathParam("name") String name,
-									 List<ClusterConfig> config) {
-		log.debug("Updating exploratory {} spark cluster for user {}", name, userInfo.getName());
-		exploratoryService.updateClusterConfig(userInfo, project, name, config);
-		return Response.ok().build();
-	}
-
-	@GET
-	@Path("/{project}/{name}/cluster/config")
-	public Response getClusterConfig(@Auth UserInfo userInfo,
-									 @PathParam("project") String project,
-									 @PathParam("name") String name) {
-		log.debug("Getting exploratory {} spark cluster configuration for user {}", name, userInfo.getName());
-		return Response.ok(exploratoryService.getClusterConfig(userInfo, project, name)).build();
-	}
-
-	private Exploratory getExploratory(ExploratoryCreateFormDTO formDTO) {
-		return Exploratory.builder()
-				.name(formDTO.getName())
-				.dockerImage(formDTO.getImage())
-				.imageName(formDTO.getImageName())
-				.templateName(formDTO.getTemplateName())
-				.version(formDTO.getVersion())
-				.clusterConfig(formDTO.getClusterConfig())
-				.shape(formDTO.getShape())
-				.endpoint(formDTO.getEndpoint())
-				.project(formDTO.getProject())
-				.exploratoryTag(formDTO.getExploratoryTag())
-				.build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/GitCredsResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/GitCredsResource.java
deleted file mode 100644
index 5628771..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/GitCredsResource.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.service.GitCredentialService;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsDTO;
-import com.epam.dlab.rest.contracts.ExploratoryAPI;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * Provides the REST API for managing git credentials
- */
-@Path("/user/git_creds")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class GitCredsResource implements ExploratoryAPI {
-
-	private GitCredentialService gitCredentialService;
-
-	@Inject
-	public GitCredsResource(GitCredentialService gitCredentialService) {
-		this.gitCredentialService = gitCredentialService;
-	}
-
-	/**
-	 * Update GIT credentials for user.
-	 *
-	 * @param userInfo user info.
-	 * @param formDTO  the list of credentials.
-	 * @return {@link Response.Status#OK} request for provisioning service has been accepted.<br>
-	 */
-	@PUT
-	public Response updateGitCreds(@Auth UserInfo userInfo,
-								   @Valid @NotNull ExploratoryGitCredsDTO formDTO) {
-		gitCredentialService.updateGitCredentials(userInfo, formDTO);
-		return Response.ok().build();
-	}
-
-	/**
-	 * Returns info about GIT credentials for user.
-	 *
-	 * @param userInfo user info.
-	 */
-	@GET
-	public ExploratoryGitCredsDTO getGitCreds(@Auth UserInfo userInfo) {
-		return gitCredentialService.getGitCredentials(userInfo.getName());
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ImageExploratoryResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ImageExploratoryResource.java
deleted file mode 100644
index f913e2b..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ImageExploratoryResource.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.resources.dto.ExploratoryImageCreateFormDTO;
-import com.epam.dlab.backendapi.resources.dto.ImageInfoRecord;
-import com.epam.dlab.backendapi.service.ImageExploratoryService;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriBuilder;
-import javax.ws.rs.core.UriInfo;
-import java.net.URI;
-import java.util.List;
-
-/**
- * Manages images for exploratory and computational environment
- */
-@Path("/infrastructure_provision/exploratory_environment/image")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ImageExploratoryResource {
-
-	private ImageExploratoryService imageExploratoryService;
-	private RequestId requestId;
-
-	@Inject
-	public ImageExploratoryResource(ImageExploratoryService imageExploratoryService, RequestId requestId) {
-		this.imageExploratoryService = imageExploratoryService;
-		this.requestId = requestId;
-	}
-
-	@POST
-	public Response createImage(@Auth UserInfo ui,
-								@Valid @NotNull ExploratoryImageCreateFormDTO formDTO,
-								@Context UriInfo uriInfo) {
-		log.debug("Creating an image {} for user {}", formDTO, ui.getName());
-		String uuid = imageExploratoryService.createImage(ui, formDTO.getProjectName(), formDTO.getNotebookName(),
-				formDTO.getName(), formDTO.getDescription());
-		requestId.put(ui.getName(), uuid);
-
-		final URI imageUri = UriBuilder.fromUri(uriInfo.getRequestUri())
-				.path(formDTO.getName())
-				.build();
-		return Response.accepted(uuid).location(imageUri).build();
-	}
-
-	@GET
-	public Response getImages(@Auth UserInfo ui,
-							  @QueryParam("docker_image") String dockerImage,
-							  @QueryParam("project") String project,
-							  @QueryParam("endpoint") String endpoint) {
-		log.debug("Getting images for user {}, project {}", ui.getName(), project);
-		final List<ImageInfoRecord> images = imageExploratoryService.getNotFailedImages(ui.getName(), dockerImage,
-				project, endpoint);
-		return Response.ok(images).build();
-	}
-
-	@GET
-	@Path("all")
-	public Response getAllImagesForProject(@Auth UserInfo ui, @NotNull @QueryParam("project") String project) {
-		log.debug("Getting images for user {}, project {}", ui.getName(), project);
-		final List<ImageInfoRecord> images = imageExploratoryService.getImagesForProject(project);
-		return Response.ok(images).build();
-	}
-
-	@GET
-	@Path("{name}")
-	public Response getImage(@Auth UserInfo ui,
-							 @PathParam("name") String name,
-							 @QueryParam("project") String project,
-							 @QueryParam("endpoint") String endpoint) {
-		log.debug("Getting image with name {} for user {}", name, ui.getName());
-		return Response.ok(imageExploratoryService.getImage(ui.getName(), name, project, endpoint)).build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResource.java
deleted file mode 100644
index c8952f3..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResource.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
-import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
-import com.epam.dlab.backendapi.service.InfrastructureInfoService;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * Provides the REST API for the basic information about infrastructure.
- */
-@Path("/infrastructure")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class InfrastructureInfoResource {
-
-	private InfrastructureInfoService infrastructureInfoService;
-
-	@Inject
-	public InfrastructureInfoResource(InfrastructureInfoService infrastructureInfoService) {
-		this.infrastructureInfoService = infrastructureInfoService;
-	}
-
-	/**
-	 * Return status of self-service.
-	 */
-	@GET
-	public Response status() {
-		return Response.status(Response.Status.OK).build();
-	}
-
-	/**
-	 * Returns the status of infrastructure: edge.
-	 *
-	 * @param userInfo user info.
-	 */
-	@GET
-	@Path("/status")
-	public HealthStatusPageDTO status(@Auth UserInfo userInfo,
-									  @QueryParam("full") @DefaultValue("0") int fullReport) {
-		return infrastructureInfoService.getHeathStatus(userInfo, fullReport != 0);
-	}
-
-	/**
-	 * Returns the list of the provisioned user resources.
-	 *
-	 * @param userInfo user info.
-	 */
-	@GET
-	@Path("/info")
-	public List<ProjectInfrastructureInfo> getUserResources(@Auth UserInfo userInfo) {
-		return infrastructureInfoService.getUserResources(userInfo);
-
-	}
-
-	@GET
-	@Path("/meta")
-	public Response getVersion(@Auth UserInfo userInfo) {
-		return Response.ok(infrastructureInfoService.getInfrastructureMetaInfo())
-				.build();
-
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureTemplateResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureTemplateResource.java
deleted file mode 100644
index df85ff3..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/InfrastructureTemplateResource.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.service.InfrastructureTemplateService;
-import com.epam.dlab.dto.base.computational.FullComputationalTemplate;
-import com.epam.dlab.dto.imagemetadata.ExploratoryMetadataDTO;
-import com.epam.dlab.rest.contracts.DockerAPI;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-
-/**
- * Provides the REST API to retrieve exploratory/computational templates.
- */
-@Path("/infrastructure_templates")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class InfrastructureTemplateResource implements DockerAPI {
-
-	private InfrastructureTemplateService infrastructureTemplateService;
-
-	@Inject
-	public InfrastructureTemplateResource(InfrastructureTemplateService infrastructureTemplateService) {
-		this.infrastructureTemplateService = infrastructureTemplateService;
-	}
-
-	/**
-	 * Returns the list of the computational resources templates for user.
-	 *
-	 * @param userInfo user info.
-	 */
-	@GET
-	@Path("/{project}/{endpoint}/computational_templates")
-	public Iterable<FullComputationalTemplate> getComputationalTemplates(@Auth UserInfo userInfo,
-																		 @PathParam("project") String project,
-																		 @PathParam("endpoint") String endpoint) {
-		return infrastructureTemplateService.getComputationalTemplates(userInfo, project, endpoint);
-	}
-
-	/**
-	 * Returns the list of the exploratory environment templates for user.
-	 *
-	 * @param userInfo user info.
-	 */
-	@GET
-	@Path("/{project}/{endpoint}/exploratory_templates")
-	public Iterable<ExploratoryMetadataDTO> getExploratoryTemplates(@Auth UserInfo userInfo,
-																	@PathParam("project") String project,
-																	@PathParam("endpoint") String endpoint) {
-		return infrastructureTemplateService.getExploratoryTemplates(userInfo, project, endpoint);
-	}
-}
-
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/KeycloakResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/KeycloakResource.java
deleted file mode 100644
index 836597b..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/KeycloakResource.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.conf.KeycloakConfiguration;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.SecurityDAO;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.KeycloakService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.epam.dlab.exceptions.DlabException;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import org.keycloak.representations.AccessTokenResponse;
-
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import static java.lang.String.format;
-
-@Path("/oauth")
-public class KeycloakResource {
-	private static final String LOGIN_URI_FORMAT = "%s/realms/%s/protocol/openid-connect/auth?client_id=%s" +
-			"&redirect_uri=%s&response_type=code";
-	private static final String KEYCLOAK_LOGOUT_URI_FORMAT = "%s/realms/%s/protocol/openid-connect/logout" +
-			"?redirect_uri=%s";
-	private final SecurityService securityService;
-	private final KeycloakService keycloakService;
-	private final SecurityDAO securityDAO;
-	private final String loginUri;
-	private final String logoutUri;
-	private final String redirectUri;
-	private final boolean defaultAccess;
-
-	@Inject
-	public KeycloakResource(SecurityService securityService, SelfServiceApplicationConfiguration configuration,
-							SecurityDAO securityDAO, KeycloakService keycloakService) {
-		this.securityDAO = securityDAO;
-		this.defaultAccess = configuration.getRoleDefaultAccess();
-		final KeycloakConfiguration keycloakConfiguration = configuration.getKeycloakConfiguration();
-		this.redirectUri = keycloakConfiguration.getRedirectUri();
-		this.securityService = securityService;
-		this.keycloakService = keycloakService;
-
-		loginUri =
-				format(LOGIN_URI_FORMAT,
-						keycloakConfiguration.getAuthServerUrl(),
-						keycloakConfiguration.getRealm(),
-						keycloakConfiguration.getResource(),
-						redirectUri);
-		logoutUri =
-				format(KEYCLOAK_LOGOUT_URI_FORMAT,
-						keycloakConfiguration.getAuthServerUrl(),
-						keycloakConfiguration.getRealm(),
-						redirectUri);
-	}
-
-	@GET
-	@Produces(MediaType.TEXT_PLAIN)
-	public Response getLoginUri() throws URISyntaxException {
-		return Response.ok(new URI(loginUri).toString())
-				.build();
-	}
-
-	@POST
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response getUser(@QueryParam("code") String code) {
-		return Response.ok(securityService.getUserInfo(code)).build();
-	}
-
-	@POST
-	@Path("/authorize")
-	public Response authorize(@Auth UserInfo userInfo) {
-		UserRoles.initialize(securityDAO, defaultAccess);
-		return Response.ok().build();
-	}
-
-	@GET
-	@Path("/logout")
-	public Response getLogoutUrl() throws URISyntaxException {
-		return Response.noContent()
-				.location(new URI(logoutUri))
-				.build();
-	}
-
-	@POST
-	@Path("/refresh/{refresh_token}")
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response refreshAccessToken(@PathParam("refresh_token") String refreshToken) throws URISyntaxException {
-		AccessTokenResponse tokenResponse;
-		try {
-			tokenResponse = keycloakService.generateAccessToken(refreshToken);
-		} catch (DlabException e) {
-			return Response.status(Response.Status.BAD_REQUEST)
-					.location(new URI(logoutUri))
-					.build();
-		}
-		return Response.ok(new TokenInfo(tokenResponse.getToken(), tokenResponse.getRefreshToken())).build();
-	}
-
-	class TokenInfo {
-		@JsonProperty("access_token")
-		private final String accessToken;
-		@JsonProperty("refresh_token")
-		private final String refreshToken;
-
-		TokenInfo(String accessToken, String refreshToken) {
-			this.accessToken = accessToken;
-			this.refreshToken = refreshToken;
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/LibExploratoryResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/LibExploratoryResource.java
deleted file mode 100644
index 841ed73..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/LibExploratoryResource.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.domain.ExploratoryLibCache;
-import com.epam.dlab.backendapi.resources.dto.LibInfoRecord;
-import com.epam.dlab.backendapi.resources.dto.LibInstallFormDTO;
-import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
-import com.epam.dlab.backendapi.resources.dto.SearchLibsFormDTO;
-import com.epam.dlab.backendapi.service.ExternalLibraryService;
-import com.epam.dlab.backendapi.service.LibraryService;
-import com.epam.dlab.backendapi.validation.annotation.LibNameValid;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.bson.Document;
-import org.hibernate.validator.constraints.NotBlank;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Manages libraries for exploratory and computational environment
- */
-@Path("/infrastructure_provision/exploratory_environment")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class LibExploratoryResource {
-
-
-	private static final String DROPWIZARD_ARTIFACT = "io.dropwizard:dropwizard-core:1.3.5";
-	private final ExternalLibraryService externalLibraryService;
-	private ExploratoryDAO exploratoryDAO;
-	private LibraryService libraryService;
-
-	@Inject
-	public LibExploratoryResource(ExploratoryDAO exploratoryDAO, LibraryService libraryService,
-								  ExternalLibraryService externalLibraryService) {
-		this.exploratoryDAO = exploratoryDAO;
-		this.libraryService = libraryService;
-		this.externalLibraryService = externalLibraryService;
-	}
-
-	/**
-	 * Returns the list of libraries groups for exploratory.
-	 *
-	 * @param userInfo          user info.
-	 * @param exploratoryName   name of exploratory
-	 * @param computationalName name of computational cluster
-	 * @return library groups
-	 */
-	@GET
-	@Path("/lib_groups")
-	public Iterable<String> getLibGroupList(@Auth UserInfo userInfo,
-											@QueryParam("project_name") @NotBlank String projectName,
-											@QueryParam("exploratory_name") @NotBlank String exploratoryName,
-											@QueryParam("computational_name") String computationalName) {
-
-		log.trace("Loading list of lib groups for user {} and exploratory {}, computational {}", userInfo.getName(),
-				exploratoryName, computationalName);
-		try {
-			if (StringUtils.isEmpty(computationalName)) {
-				UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), projectName,
-						exploratoryName);
-				return ExploratoryLibCache.getCache().getLibGroupList(userInfo, userInstance);
-			} else {
-				UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), projectName,
-						exploratoryName, computationalName);
-
-				userInstance.setResources(userInstance.getResources().stream()
-						.filter(e -> e.getComputationalName().equals(computationalName))
-						.collect(Collectors.toList()));
-
-				return ExploratoryLibCache.getCache().getLibGroupList(userInfo, userInstance);
-			}
-		} catch (Exception t) {
-			log.error("Cannot load list of lib groups for user {} and exploratory {}", userInfo.getName(),
-					exploratoryName, t);
-			throw new DlabException("Cannot load list of libraries groups: " + t.getLocalizedMessage(), t);
-		}
-	}
-
-	/**
-	 * Returns list of installed/failed libraries for dlab resource <code>exploratoryName<code/>
-	 * and <code>computationalName<code/> resource
-	 *
-	 * @param userInfo          user info
-	 * @param exploratoryName   name of exploratory resource
-	 * @param computationalName name of computational cluster
-	 * @return list of libraries
-	 */
-	@GET
-	@Path("/lib_list")
-	public List<Document> getLibList(@Auth UserInfo userInfo,
-									 @QueryParam("project_name") @NotBlank String projectName,
-									 @QueryParam("exploratory_name") @NotBlank String exploratoryName,
-									 @QueryParam("computational_name") String computationalName) {
-
-		log.debug("Loading list of libraries for user {} and exploratory {} and computational {}", userInfo.getName(),
-				exploratoryName, computationalName);
-		try {
-			return libraryService.getLibs(userInfo.getName(), projectName, exploratoryName, computationalName);
-
-		} catch (Exception t) {
-			log.error("Cannot load installed libraries for user {} and exploratory {} an", userInfo.getName(),
-					exploratoryName, t);
-			throw new DlabException("Cannot load installed libraries: " + t.getLocalizedMessage(), t);
-		}
-	}
-
-	/**
-	 * Returns formatted representation of installed libraries or libraries that were tried to be installed for
-	 * exploratory
-	 * and computational resources that relate to <code>exploratoryName<code/> exploratory resource with its's
-	 * statuses.
-	 *
-	 * @param userInfo        user info.
-	 * @param exploratoryName name of exploratory resource.
-	 * @return list of installed/failed libraries
-	 */
-	@GET
-	@Path("/lib_list/formatted")
-	public List<LibInfoRecord> getLibListFormatted(@Auth UserInfo userInfo,
-												   @QueryParam("project_name") @NotBlank String projectName,
-												   @QueryParam("exploratory_name") @NotBlank String exploratoryName) {
-
-		log.debug("Loading formatted list of libraries for user {} and exploratory {}", userInfo.getName(),
-				exploratoryName);
-		try {
-			return libraryService.getLibInfo(userInfo.getName(), projectName, exploratoryName);
-		} catch (Exception t) {
-			log.error("Cannot load list of libraries for user {} and exploratory {}", userInfo.getName(),
-					exploratoryName, t);
-			throw new DlabException("Cannot load  formatted list of installed libraries: " + t.getLocalizedMessage(),
-					t);
-		}
-	}
-
-	/**
-	 * Install libraries to the exploratory environment.
-	 *
-	 * @param userInfo user info.
-	 * @param formDTO  description of libraries which will be installed to the exploratory environment.
-	 * @return Invocation response as JSON string.
-	 */
-	@POST
-	@Path("/lib_install")
-	public Response libInstall(@Auth UserInfo userInfo,
-							   @Valid @NotNull LibInstallFormDTO formDTO) {
-		log.debug("Installing libs to environment {} for user {}", formDTO, userInfo.getName());
-		String project = formDTO.getProject();
-		final String exploratoryName = formDTO.getNotebookName();
-		final List<LibInstallDTO> libs = formDTO.getLibs();
-		final String computationalName = formDTO.getComputationalName();
-		String uuid = StringUtils.isEmpty(computationalName) ?
-				libraryService.installExploratoryLibs(userInfo, project, exploratoryName, libs) :
-				libraryService.installComputationalLibs(userInfo, project, exploratoryName, computationalName, libs);
-		return Response.ok(uuid)
-				.build();
-    }
-
-	/**
-	 * Returns the list of available libraries for exploratory basing on search conditions provided in @formDTO.
-	 *
-	 * @param userInfo user info.
-	 * @param formDTO  search condition for find libraries for the exploratory environment.
-	 * @return found libraries
-	 */
-	@POST
-	@Path("search/lib_list")
-	public List<LibraryDTO> getLibList(@Auth UserInfo userInfo,
-									   @Valid @NotNull SearchLibsFormDTO formDTO) {
-		log.trace("Search list of libs for user {} with condition {}", userInfo.getName(), formDTO);
-		try {
-
-			UserInstanceDTO userInstance;
-
-			if (StringUtils.isNotEmpty(formDTO.getComputationalName())) {
-
-				userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), formDTO.getProjectName(),
-						formDTO.getNotebookName(), formDTO.getComputationalName());
-
-				userInstance.setResources(userInstance.getResources().stream()
-						.filter(e -> e.getComputationalName().equals(formDTO.getComputationalName()))
-						.collect(Collectors.toList()));
-
-			} else {
-				userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), formDTO.getProjectName(),
-						formDTO.getNotebookName());
-			}
-
-			return ExploratoryLibCache.getCache().getLibList(userInfo, userInstance, formDTO.getGroup(), formDTO
-					.getStartWith());
-		} catch (Exception t) {
-			log.error("Cannot search libs for user {} with condition {}",
-					userInfo.getName(), formDTO, t);
-			throw new DlabException("Cannot search libraries: " + t.getLocalizedMessage(), t);
-		}
-	}
-
-
-	@GET
-	@Path("search/lib_list/maven")
-	public Response getMavenArtifactInfo(@Auth UserInfo userInfo,
-										 @LibNameValid @QueryParam("artifact") String artifact) {
-		final String[] libNameParts = artifact.split(":");
-		return Response.ok(externalLibraryService.getLibrary(libNameParts[0], libNameParts[1], libNameParts[2])).build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
deleted file mode 100644
index 6af8729..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/ProjectResource.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.CreateProjectDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
-import com.epam.dlab.backendapi.domain.UpdateProjectBudgetDTO;
-import com.epam.dlab.backendapi.domain.UpdateProjectDTO;
-import com.epam.dlab.backendapi.resources.dto.ProjectActionFormDTO;
-import com.epam.dlab.backendapi.service.AccessKeyService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.rest.dto.ErrorDTO;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.headers.Header;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-
-import javax.annotation.security.RolesAllowed;
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-import java.net.URI;
-import java.util.List;
-import java.util.stream.Collectors;
-
-@Path("project")
-public class ProjectResource {
-	private final ProjectService projectService;
-	private final AccessKeyService keyService;
-	@Context
-	private UriInfo uriInfo;
-
-	@Inject
-	public ProjectResource(ProjectService projectService, AccessKeyService keyService) {
-		this.projectService = projectService;
-		this.keyService = keyService;
-	}
-
-
-	@Operation(summary = "Create project", tags = "project")
-	@ApiResponses({
-			@ApiResponse(responseCode = "201", description = "Project is successfully created",
-					headers =
-					@Header(required = true, name = "Location", description = "URI of created project resource",
-							schema = @Schema(type = "string"))),
-			@ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
-					MediaType.APPLICATION_JSON,
-					schema = @Schema(implementation = ErrorDTO.class))),
-			@ApiResponse(responseCode = "409", description = "Project with passed name already exist in system",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON,
-							schema = @Schema(implementation = ErrorDTO.class)))
-	})
-	@POST
-	@Consumes(MediaType.APPLICATION_JSON)
-	@RolesAllowed("/api/project/create")
-	public Response createProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
-								  @Valid CreateProjectDTO projectDTO) {
-		projectService.create(userInfo, new ProjectDTO(projectDTO.getName(), projectDTO.getGroups(),
-				projectDTO.getKey(), projectDTO.getTag(), null,
-				projectDTO.getEndpoints().stream().map(e -> new ProjectEndpointDTO(e, UserInstanceStatus.CREATING,
-						null)).collect(Collectors.toList()), projectDTO.isSharedImageEnabled()));
-		final URI uri = uriInfo.getRequestUriBuilder().path(projectDTO.getName()).build();
-		return Response
-				.ok()
-				.location(uri)
-				.build();
-	}
-
-	@Operation(summary = "Start project", tags = "project")
-	@ApiResponses({
-			@ApiResponse(responseCode = "202", description = "Project is starting"),
-			@ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
-					MediaType.APPLICATION_JSON,
-					schema = @Schema(implementation = ErrorDTO.class)))
-	})
-	@Path("start")
-	@POST
-	@Consumes(MediaType.APPLICATION_JSON)
-	@RolesAllowed("/api/project")
-	public Response startProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
-								 @NotNull @Valid ProjectActionFormDTO startProjectDto) {
-		projectService.start(userInfo, startProjectDto.getEndpoints(), startProjectDto.getProjectName());
-		return Response
-				.accepted()
-				.build();
-	}
-
-	@Operation(summary = "Stop project", tags = "project")
-	@ApiResponses({
-			@ApiResponse(responseCode = "202", description = "Project is stopping"),
-			@ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
-					MediaType.APPLICATION_JSON,
-					schema = @Schema(implementation = ErrorDTO.class)))
-	})
-	@Path("stop")
-	@POST
-	@Consumes(MediaType.APPLICATION_JSON)
-	@RolesAllowed("/api/project")
-	public Response stopProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
-								@NotNull @Valid ProjectActionFormDTO stopProjectDTO) {
-		projectService.stopWithResources(userInfo, stopProjectDTO.getEndpoints(), stopProjectDTO.getProjectName());
-		return Response
-				.accepted()
-				.build();
-	}
-
-	@Operation(summary = "Get project info", tags = "project")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Return information about project",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
-					@Schema(implementation = ProjectDTO.class))),
-			@ApiResponse(responseCode = "404", description = "Project with passed name not found",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON,
-							schema = @Schema(implementation = ErrorDTO.class)))
-	})
-	@GET
-	@Path("{name}")
-	@Produces(MediaType.APPLICATION_JSON)
-	@RolesAllowed("/api/project")
-	public Response getProject(@Parameter(hidden = true) @Auth UserInfo userInfo,
-							   @Parameter(description = "Project name")
-							   @PathParam("name") String name) {
-		return Response
-				.ok(projectService.get(name))
-				.build();
-	}
-
-	@Operation(summary = "Get available projects", tags = "project")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Return information about projects",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
-					@Schema(implementation = ProjectDTO.class))),
-	})
-	@GET
-	@Produces(MediaType.APPLICATION_JSON)
-	@RolesAllowed("/api/project")
-	public Response getProjects(@Parameter(hidden = true) @Auth UserInfo userInfo) {
-		return Response
-				.ok(projectService.getProjects(userInfo))
-				.build();
-	}
-
-	@Operation(summary = "Get projects assigned to user", tags = "project")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Return information about projects",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON, schema =
-					@Schema(implementation = ProjectDTO.class))),
-	})
-	@GET
-	@Path("/me")
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response getUserProjects(@Parameter(hidden = true) @Auth UserInfo userInfo,
-									@QueryParam("active") @DefaultValue("false") boolean active) {
-		return Response
-				.ok(projectService.getUserProjects(userInfo, active))
-				.build();
-	}
-
-	@Operation(summary = "Update project", tags = "project")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Project is successfully updated"),
-			@ApiResponse(responseCode = "400", description = "Validation error", content = @Content(mediaType =
-					MediaType.APPLICATION_JSON,
-					schema = @Schema(implementation = ErrorDTO.class))),
-			@ApiResponse(responseCode = "404", description = "Project with passed name not found",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON,
-							schema = @Schema(implementation = ErrorDTO.class)))
-	})
-	@PUT
-	@RolesAllowed("/api/project")
-	public Response updateProject(@Parameter(hidden = true) @Auth UserInfo userInfo, UpdateProjectDTO projectDTO) {
-		projectService.update(userInfo, projectDTO, projectDTO.getName());
-		return Response.ok().build();
-	}
-
-	@Operation(summary = "Remove project", tags = "project")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Project is successfully removed"),
-			@ApiResponse(responseCode = "404", description = "Project with passed name not found",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON,
-							schema = @Schema(implementation = ErrorDTO.class)))
-	})
-	@POST
-	@Path("terminate")
-	@RolesAllowed("/api/project")
-	public Response removeProjectEndpoint(@Parameter(hidden = true) @Auth UserInfo userInfo,
-										  @NotNull @Valid ProjectActionFormDTO projectActionDTO) {
-		projectService.terminateEndpoint(userInfo, projectActionDTO.getEndpoints(), projectActionDTO.getProjectName());
-		return Response.ok().build();
-	}
-
-	@Operation(summary = "Updates project budget", tags = "project")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Project budget is successfully updated"),
-			@ApiResponse(responseCode = "404", description = "Project with specified name not found"),
-			@ApiResponse(responseCode = "400", description = "Validation error",
-					content = @Content(mediaType = MediaType.APPLICATION_JSON,
-							schema = @Schema(implementation = ErrorDTO.class)))
-	})
-	@PUT
-	@Path("/budget")
-	@RolesAllowed("/api/project")
-	public Response updateBudget(
-			@Parameter(hidden = true) @Auth UserInfo userInfo,
-			@Parameter(description = "Project name")
-					List<UpdateProjectBudgetDTO> dtos) {
-		final List<ProjectDTO> projects = dtos
-				.stream()
-				.map(dto -> ProjectDTO.builder().name(dto.getProject()).budget(dto.getBudget()).build())
-				.collect(Collectors.toList());
-		projectService.updateBudget(projects);
-		return Response.ok().build();
-	}
-
-	@Operation(summary = "Generate keys for project", tags = "project")
-	@ApiResponses({
-			@ApiResponse(responseCode = "200", description = "Keys are successfully generated")
-	})
-	@POST
-	@Path("/keys")
-	@Consumes(MediaType.APPLICATION_JSON)
-	@Produces(MediaType.APPLICATION_JSON)
-	@RolesAllowed("/api/project")
-	public Response generate(@Parameter(hidden = true) @Auth UserInfo userInfo) {
-		return Response
-				.ok(keyService.generateKeys(userInfo))
-				.build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/SchedulerJobResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/SchedulerJobResource.java
deleted file mode 100644
index dd8f82f..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/SchedulerJobResource.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.service.SchedulerJobService;
-import com.epam.dlab.backendapi.validation.annotation.SchedulerJobDTOValid;
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * Manages scheduler jobs for exploratory environment
- */
-@Path("/infrastructure_provision/exploratory_environment/scheduler")
-@Slf4j
-public class SchedulerJobResource {
-
-	private SchedulerJobService schedulerJobService;
-
-	@Inject
-	public SchedulerJobResource(SchedulerJobService schedulerJobService) {
-		this.schedulerJobService = schedulerJobService;
-	}
-
-
-	/**
-	 * Updates exploratory <code>exploratoryName<code/> for user <code>userInfo<code/> with new scheduler job data
-	 *
-	 * @param userInfo        user info
-	 * @param exploratoryName name of exploratory resource
-	 * @param dto             scheduler job data
-	 * @return response
-	 */
-	@POST
-	@Path("/{projectName}/{exploratoryName}")
-	@Consumes(MediaType.APPLICATION_JSON)
-	public Response updateExploratoryScheduler(@Auth UserInfo userInfo,
-											   @PathParam("projectName") String projectName,
-											   @PathParam("exploratoryName") String exploratoryName,
-											   @SchedulerJobDTOValid SchedulerJobDTO dto) {
-		schedulerJobService.updateExploratorySchedulerData(userInfo.getName(), projectName, exploratoryName, dto);
-		return Response.ok().build();
-	}
-
-	/**
-	 * Removes exploratory <code>exploratoryName<code/> for user <code>userInfo<code/>
-	 *
-	 * @param userInfo        user info
-	 * @param exploratoryName name of exploratory resource
-	 * @return response
-	 */
-	@DELETE
-	@Path("/{exploratoryName}")
-	public Response removeExploratoryScheduler(@Auth UserInfo userInfo,
-											   @PathParam("exploratoryName") String exploratoryName) {
-		log.debug("User {} is trying to remove scheduler for exploratory {}", userInfo.getName(), exploratoryName);
-		schedulerJobService.removeScheduler(userInfo.getName(), exploratoryName);
-		return Response.ok().build();
-	}
-
-	/**
-	 * Updates computational resource <code>computationalName<code/> affiliated with exploratory
-	 * <code>exploratoryName<code/> for user <code>userInfo<code/> with new scheduler job data
-	 *
-	 * @param userInfo          user info
-	 * @param exploratoryName   name of exploratory resource
-	 * @param computationalName name of computational resource
-	 * @param dto               scheduler job data
-	 * @return response
-	 */
-	@POST
-	@Path("/{projectName}/{exploratoryName}/{computationalName}")
-	@Consumes(MediaType.APPLICATION_JSON)
-	public Response updateComputationalScheduler(@Auth UserInfo userInfo,
-												 @PathParam("projectName") String projectName,
-												 @PathParam("exploratoryName") String exploratoryName,
-												 @PathParam("computationalName") String computationalName,
-												 @SchedulerJobDTOValid SchedulerJobDTO dto) {
-		schedulerJobService.updateComputationalSchedulerData(userInfo.getName(), projectName, exploratoryName,
-				computationalName, dto);
-		return Response.ok().build();
-    }
-
-	/**
-	 * Updates computational resource <code>computationalName<code/> affiliated with exploratory
-	 * <code>exploratoryName<code/> for user <code>userInfo<code/> with new scheduler job data
-	 *
-	 * @param userInfo          user info
-	 * @param exploratoryName   name of exploratory resource
-	 * @param computationalName name of computational resource
-	 * @return response
-	 */
-	@DELETE
-	@Path("/{exploratoryName}/{computationalName}")
-	public Response removeComputationalScheduler(@Auth UserInfo userInfo,
-												 @PathParam("exploratoryName") String exploratoryName,
-												 @PathParam("computationalName") String computationalName) {
-		log.debug("User {} is trying to remove scheduler for computational {} connected with exploratory {}",
-				userInfo.getName(), computationalName, exploratoryName);
-		schedulerJobService.removeScheduler(userInfo.getName(), exploratoryName, computationalName);
-		return Response.ok().build();
-	}
-
-
-	/**
-	 * Returns scheduler job for exploratory resource <code>exploratoryName<code/>
-	 *
-	 * @param userInfo        user info
-	 * @param exploratoryName name of exploratory resource
-	 * @return scheduler job data
-	 */
-	@GET
-	@Path("/{projectName}/{exploratoryName}")
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response fetchSchedulerJobForUserAndExploratory(@Auth UserInfo userInfo,
-														   @PathParam("projectName") String projectName,
-														   @PathParam("exploratoryName") String exploratoryName) {
-		log.debug("Loading scheduler job for user {} and exploratory {}...", userInfo.getName(), exploratoryName);
-		final SchedulerJobDTO schedulerJob =
-				schedulerJobService.fetchSchedulerJobForUserAndExploratory(userInfo.getName(), projectName, exploratoryName);
-		return Response.ok(schedulerJob).build();
-	}
-
-	/**
-	 * Returns scheduler job for computational resource <code>computationalName<code/> affiliated with
-	 * exploratory <code>exploratoryName<code/>
-	 *
-	 * @param userInfo          user info
-	 * @param exploratoryName   name of exploratory resource
-	 * @param computationalName name of computational resource
-	 * @return scheduler job data
-	 */
-	@GET
-	@Path("/{projectName}/{exploratoryName}/{computationalName}")
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response fetchSchedulerJobForComputationalResource(@Auth UserInfo userInfo,
-															  @PathParam("exploratoryName") String exploratoryName,
-															  @PathParam("projectName") String projectName,
-															  @PathParam("computationalName") String computationalName) {
-		log.debug("Loading scheduler job for user {}, exploratory {} and computational resource {}...",
-				userInfo.getName(), exploratoryName, computationalName);
-		final SchedulerJobDTO schedulerJob = schedulerJobService
-				.fetchSchedulerJobForComputationalResource(userInfo.getName(), projectName, exploratoryName, computationalName);
-		return Response.ok(schedulerJob).build();
-	}
-
-	@GET
-	@Path("active")
-	@Produces(MediaType.APPLICATION_JSON)
-	public Response getActiveSchedulers(@Auth UserInfo userInfo,
-										@QueryParam("minuteOffset") long minuteOffset) {
-		log.trace("Getting active schedulers for user {} and offset {}", userInfo.getName(), minuteOffset);
-		return Response.ok(schedulerJobService.getActiveSchedulers(userInfo.getName(), minuteOffset)).build();
-	}
-
-}
-
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/SystemInfoResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/SystemInfoResource.java
deleted file mode 100644
index 9e646d0..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/SystemInfoResource.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.SystemInfoDto;
-import com.epam.dlab.backendapi.service.SystemInfoService;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Slf4j
-@Path("sysinfo")
-@Produces(MediaType.APPLICATION_JSON)
-@RolesAllowed("sysinfo")
-public class SystemInfoResource {
-
-	private SystemInfoService systemInfoService;
-
-	@Inject
-	public SystemInfoResource(SystemInfoService systemInfoService) {
-		this.systemInfoService = systemInfoService;
-	}
-
-
-	@GET
-
-	public Response getSystemInfo(@Auth UserInfo userInfo) {
-		log.debug("Getting system info for user {}...", userInfo.getName());
-		final SystemInfoDto systemInfoDto = systemInfoService.getSystemInfo();
-		return Response.ok(systemInfoDto).build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/UserGroupResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/UserGroupResource.java
deleted file mode 100644
index 8cd3381..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/UserGroupResource.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.GroupDTO;
-import com.epam.dlab.backendapi.service.UserGroupService;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.annotation.security.RolesAllowed;
-import javax.validation.Valid;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Slf4j
-@Path("group")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class UserGroupResource {
-
-	private final UserGroupService userGroupService;
-
-	@Inject
-	public UserGroupResource(UserGroupService userGroupService) {
-		this.userGroupService = userGroupService;
-	}
-
-
-	@POST
-	@RolesAllowed("/roleManagement/create")
-	public Response createGroup(@Auth UserInfo userInfo, @Valid GroupDTO dto) {
-		log.debug("Creating new group {}", dto.getName());
-		userGroupService.createGroup(dto.getName(), dto.getRoleIds(), dto.getUsers());
-		return Response.ok().build();
-	}
-
-	@PUT
-	@RolesAllowed("/roleManagement")
-	public Response updateGroup(@Auth UserInfo userInfo, @Valid GroupDTO dto) {
-		log.debug("Updating group {}", dto.getName());
-		userGroupService.updateGroup(userInfo, dto.getName(), dto.getRoleIds(), dto.getUsers());
-		return Response.ok().build();
-	}
-
-	@GET
-	@RolesAllowed("/roleManagement")
-	public Response getGroups(@Auth UserInfo userInfo) {
-		log.debug("Getting all groups for admin {}...", userInfo.getName());
-		return Response.ok(userGroupService.getAggregatedRolesByGroup(userInfo)).build();
-	}
-
-	@DELETE
-	@Path("{id}")
-	@RolesAllowed("/roleManagement/delete")
-	public Response deleteGroup(@Auth UserInfo userInfo, @PathParam("id") String group) {
-		log.info("Admin {} is trying to delete group {} from application", userInfo.getName(), group);
-		userGroupService.removeGroup(group);
-		return Response.ok().build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/UserRoleResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/UserRoleResource.java
deleted file mode 100644
index 52ad739..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/UserRoleResource.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.UserRoleDto;
-import com.epam.dlab.backendapi.service.UserRoleService;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Slf4j
-@Path("role")
-@RolesAllowed("/roleManagement")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class UserRoleResource {
-
-	private final UserRoleService userRoleService;
-
-	@Inject
-	public UserRoleResource(UserRoleService roleService) {
-		this.userRoleService = roleService;
-	}
-
-	@GET
-	public Response getRoles(@Auth UserInfo userInfo) {
-		log.debug("Getting all roles for admin {}...", userInfo.getName());
-		return Response.ok(userRoleService.getUserRoles()).build();
-	}
-
-	@POST
-	public Response createRole(@Auth UserInfo userInfo, UserRoleDto dto) {
-		log.info("Creating new role {} on behalf of admin {}...", dto, userInfo.getName());
-		userRoleService.createRole(dto);
-		return Response.ok().build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/UserSettingsResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/UserSettingsResource.java
deleted file mode 100644
index a32dad8..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/UserSettingsResource.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.UserDTO;
-import com.epam.dlab.backendapi.service.UserSettingService;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import org.hibernate.validator.constraints.NotBlank;
-import org.hibernate.validator.constraints.NotEmpty;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.security.RolesAllowed;
-import javax.validation.Valid;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-
-@Path("/user/settings")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class UserSettingsResource {
-	private static final Logger LOGGER = LoggerFactory.getLogger(UserSettingsResource.class);
-
-	private UserSettingService userSettingService;
-
-	@Inject
-	public UserSettingsResource(UserSettingService userSettingService) {
-		this.userSettingService = userSettingService;
-	}
-
-	@GET
-	public String getSettings(@Auth UserInfo userInfo) {
-		String settings = userSettingService.getUISettings(userInfo);
-		LOGGER.debug("Returns settings for user {}, content is {}", userInfo.getName(), settings);
-		return settings;
-	}
-
-	@POST
-	public Response saveSettings(@Auth UserInfo userInfo,
-								 @NotBlank String settings) {
-		LOGGER.debug("Saves settings for user {}, content is {}", userInfo.getName(), settings);
-		userSettingService.saveUISettings(userInfo, settings);
-		return Response.ok().build();
-	}
-
-	@PUT
-	@Path("budget")
-	@RolesAllowed("/user/settings")
-	public Response updateUsersBudget(@Auth UserInfo userInfo,
-									  @Valid @NotEmpty List<UserDTO> budgets) {
-		LOGGER.debug("User {} is updating allowed budget for users: {}", userInfo.getName(), budgets);
-		userSettingService.updateUsersBudget(budgets);
-		return Response.ok().build();
-	}
-
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java
deleted file mode 100644
index 87f99bd..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/aws/ComputationalResourceAws.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.resources.aws;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
-import com.epam.dlab.backendapi.resources.dto.aws.AwsComputationalCreateForm;
-import com.epam.dlab.backendapi.roles.RoleType;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.ComputationalService;
-import com.epam.dlab.dto.aws.computational.AwsComputationalResource;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.contracts.ComputationalAPI;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import io.swagger.v3.oas.annotations.Parameter;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
-import static com.epam.dlab.dto.base.DataEngineType.SPARK_STANDALONE;
-
-
-/**
- * Provides the REST API for the computational resource on AWS.
- */
-@Path("/aws/infrastructure_provision/computational_resources")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ComputationalResourceAws implements ComputationalAPI {
-	@Inject
-	private SelfServiceApplicationConfiguration configuration;
-	@Inject
-	private ComputationalService computationalService;
-
-	@GET
-	@Path("/{project}/{endpoint}/templates")
-	public Response getTemplates(@Auth @Parameter(hidden = true) UserInfo userInfo, @PathParam("project") String project,
-								 @PathParam("endpoint") String endpoint) {
-		return Response.ok(computationalService.getComputationalNamesAndTemplates(userInfo, project, endpoint)).build();
-	}
-
-	/**
-	 * Asynchronously creates EMR cluster
-	 *
-	 * @param userInfo user info.
-	 * @param form     DTO info about creation of the computational resource.
-	 * @return 200 OK - if request success, 302 Found - for duplicates.
-	 * @throws IllegalArgumentException if docker image name is malformed
-	 */
-	@PUT
-	@Path("dataengine-service")
-	public Response createDataEngineService(@Auth @Parameter(hidden = true) UserInfo userInfo,
-											@Parameter @Valid @NotNull AwsComputationalCreateForm form) {
-
-		log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
-
-		if (DataEngineType.CLOUD_SERVICE == DataEngineType.fromDockerImageName(form.getImage())) {
-
-			validate(userInfo, form);
-
-			AwsComputationalResource awsComputationalResource = AwsComputationalResource.builder()
-					.computationalName(form.getName())
-					.imageName(form.getImage())
-					.templateName(form.getTemplateName())
-					.status(CREATING.toString())
-					.masterShape(form.getMasterInstanceType())
-					.slaveShape(form.getSlaveInstanceType())
-					.slaveSpot(form.getSlaveInstanceSpot())
-					.slaveSpotPctPrice(form.getSlaveInstanceSpotPctPrice())
-					.slaveNumber(form.getInstanceCount())
-					.config(form.getConfig())
-					.version(form.getVersion())
-					.build();
-			boolean resourceAdded = computationalService.createDataEngineService(userInfo, form,
-					awsComputationalResource, form.getProject());
-			return resourceAdded ? Response.ok().build() : Response.status(Response.Status.FOUND).build();
-		}
-
-		throw new IllegalArgumentException("Malformed image " + form.getImage());
-	}
-
-	/**
-	 * Asynchronously triggers creation of Spark cluster
-	 *
-	 * @param userInfo user info.
-	 * @param form     DTO info about creation of the computational resource.
-	 * @return 200 OK - if request success, 302 Found - for duplicates.
-	 */
-
-	@PUT
-	@Path("dataengine")
-	public Response createDataEngine(@Auth UserInfo userInfo,
-									 @Valid @NotNull SparkStandaloneClusterCreateForm form) {
-		log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
-
-		validate(form);
-		return computationalService.createSparkCluster(userInfo, form, form.getProject())
-				? Response.ok().build()
-				: Response.status(Response.Status.FOUND).build();
-	}
-
-	/**
-	 * Sends request to provisioning service for termination the computational resource for user.
-	 *
-	 * @param userInfo          user info.
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @return 200 OK if operation is successfully triggered
-	 */
-	@DELETE
-	@Path("/{projectName}/{exploratoryName}/{computationalName}/terminate")
-	public Response terminate(@Auth UserInfo userInfo,
-							  @PathParam("projectName") String projectName,
-							  @PathParam("exploratoryName") String exploratoryName,
-							  @PathParam("computationalName") String computationalName) {
-		log.debug("Terminating computational resource {} for user {}", computationalName, userInfo.getName());
-
-		computationalService.terminateComputational(userInfo, projectName, exploratoryName, computationalName);
-
-		return Response.ok().build();
-	}
-
-	/**
-	 * Sends request to provisioning service for stopping the computational resource for user.
-	 *
-	 * @param userInfo          user info.
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @return 200 OK if operation is successfully triggered
-	 */
-	@DELETE
-	@Path("/{project}/{exploratoryName}/{computationalName}/stop")
-	public Response stop(@Auth UserInfo userInfo,
-						 @PathParam("project") String project,
-						 @PathParam("exploratoryName") String exploratoryName,
-						 @PathParam("computationalName") String computationalName) {
-		log.debug("Stopping computational resource {} for user {}", computationalName, userInfo.getName());
-
-		computationalService.stopSparkCluster(userInfo, project, exploratoryName, computationalName);
-
-		return Response.ok().build();
-    }
-
-	/**
-	 * Sends request to provisioning service for starting the computational resource for user.
-	 *
-	 * @param userInfo          user info.
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @return 200 OK if operation is successfully triggered
-	 */
-	@PUT
-	@Path("/{project}/{exploratoryName}/{computationalName}/start")
-	public Response start(@Auth UserInfo userInfo,
-						  @PathParam("exploratoryName") String exploratoryName,
-						  @PathParam("computationalName") String computationalName,
-						  @PathParam("project") String project) {
-		log.debug("Starting computational resource {} for user {}", computationalName, userInfo.getName());
-
-		computationalService.startSparkCluster(userInfo, exploratoryName, computationalName, project);
-
-		return Response.ok().build();
-	}
-
-	@PUT
-	@Path("dataengine/{projectName}/{exploratoryName}/{computationalName}/config")
-	public Response updateDataEngineConfig(@Auth UserInfo userInfo,
-										   @PathParam("projectName") String projectName,
-										   @PathParam("exploratoryName") String exploratoryName,
-										   @PathParam("computationalName") String computationalName,
-										   @Valid @NotNull List<ClusterConfig> config) {
-
-		computationalService.updateSparkClusterConfig(userInfo, projectName, exploratoryName, computationalName, config);
-		return Response.ok().build();
-	}
-
-	@GET
-	@Path("/{projectName}/{exploratoryName}/{computationalName}/config")
-	public Response getClusterConfig(@Auth UserInfo userInfo,
-									 @PathParam("projectName") String projectName,
-									 @PathParam("exploratoryName") String exploratoryName,
-									 @PathParam("computationalName") String computationalName) {
-		return Response.ok(computationalService.getClusterConfig(userInfo, projectName, exploratoryName, computationalName)).build();
-	}
-
-	private void validate(SparkStandaloneClusterCreateForm form) {
-
-		int instanceCount = Integer.parseInt(form.getDataEngineInstanceCount());
-
-		if (instanceCount < configuration.getMinSparkInstanceCount()
-				|| instanceCount > configuration.getMaxSparkInstanceCount()) {
-			throw new IllegalArgumentException(String.format("Instance count should be in range [%d..%d]",
-					configuration.getMinSparkInstanceCount(), configuration.getMaxSparkInstanceCount()));
-		}
-
-		if (DataEngineType.fromDockerImageName(form.getImage()) != SPARK_STANDALONE) {
-			throw new IllegalArgumentException(String.format("Unknown data engine %s", form.getImage()));
-		}
-	}
-
-	private void validate(UserInfo userInfo, AwsComputationalCreateForm formDTO) {
-		if (!UserRoles.checkAccess(userInfo, RoleType.COMPUTATIONAL, formDTO.getImage(), userInfo.getRoles())) {
-			log.warn("Unauthorized attempt to create a {} by user {}", formDTO.getImage(), userInfo.getName());
-			throw new DlabException("You do not have the privileges to create a " + formDTO.getTemplateName());
-		}
-
-		int slaveInstanceCount = Integer.parseInt(formDTO.getInstanceCount());
-		if (slaveInstanceCount < configuration.getMinEmrInstanceCount() || slaveInstanceCount >
-				configuration.getMaxEmrInstanceCount()) {
-			log.debug("Creating computational resource {} for user {} fail: Limit exceeded to creation slave " +
-							"instances. Minimum is {}, maximum is {}",
-					formDTO.getName(), userInfo.getName(), configuration.getMinEmrInstanceCount(),
-					configuration.getMaxEmrInstanceCount());
-			throw new DlabException("Limit exceeded to creation slave instances. Minimum is " +
-					configuration.getMinEmrInstanceCount() + ", maximum is " + configuration.getMaxEmrInstanceCount() +
-					".");
-		}
-
-		if (formDTO.getSlaveInstanceSpotPctPrice() != null) {
-			int slaveSpotInstanceBidPct = formDTO.getSlaveInstanceSpotPctPrice();
-			if (formDTO.getSlaveInstanceSpot() && (slaveSpotInstanceBidPct < configuration.getMinEmrSpotInstanceBidPct()
-					|| slaveSpotInstanceBidPct > configuration.getMaxEmrSpotInstanceBidPct())) {
-				log.debug("Creating computational resource {} for user {} fail: Spot instances bidding percentage " +
-								"value " +
-								"out of the boundaries. Minimum is {}, maximum is {}",
-						formDTO.getName(), userInfo.getName(), configuration.getMinEmrSpotInstanceBidPct(),
-						configuration.getMaxEmrSpotInstanceBidPct());
-				throw new DlabException("Spot instances bidding percentage value out of the boundaries. Minimum is " +
-						configuration.getMinEmrSpotInstanceBidPct() + ", maximum is " +
-						configuration.getMaxEmrSpotInstanceBidPct() + ".");
-			}
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/azure/AzureOauthResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/azure/AzureOauthResource.java
deleted file mode 100644
index 8c999a9..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/azure/AzureOauthResource.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources.azure;
-
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.azure.auth.AuthorizationCodeFlowResponse;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.auth.contract.SecurityAPI;
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
-
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.net.URI;
-
-@Path("/user/azure")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class AzureOauthResource {
-
-	@Inject
-	@Named(ServiceConsts.SECURITY_SERVICE_NAME)
-	private RESTService securityService;
-
-
-	@GET
-	@Path("/init")
-	public Response redirectedUrl() {
-		return Response.seeOther(URI.create(securityService.get(SecurityAPI.INIT_LOGIN_OAUTH_AZURE, String.class)))
-				.build();
-	}
-
-	@POST
-	@Path("/oauth")
-	public Response login(AuthorizationCodeFlowResponse codeFlowResponse) {
-		return securityService.post(SecurityAPI.LOGIN_OAUTH_AZURE, codeFlowResponse, Response.class);
-	}
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java
deleted file mode 100644
index 29f9794..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/azure/ComputationalResourceAzure.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.azure;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.auth.rest.UserSessionDurationAuthorizer;
-import com.epam.dlab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
-import com.epam.dlab.backendapi.roles.RoleType;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.ComputationalService;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.exceptions.DlabException;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import io.swagger.v3.oas.annotations.Parameter;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.annotation.security.RolesAllowed;
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * Provides the REST API for the computational resource on Azure.
- */
-@Path("/azure/infrastructure_provision/computational_resources")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ComputationalResourceAzure {
-	private final ComputationalService computationalService;
-
-	@Inject
-	public ComputationalResourceAzure(ComputationalService computationalService) {
-		this.computationalService = computationalService;
-	}
-
-	@GET
-	@Path("/{project}/{endpoint}/templates")
-	public Response getTemplates(@Auth @Parameter(hidden = true) UserInfo userInfo, @PathParam("project") String project,
-								 @PathParam("endpoint") String endpoint) {
-		return Response.ok(computationalService.getComputationalNamesAndTemplates(userInfo, project, endpoint)).build();
-	}
-
-	/**
-	 * Asynchronously creates computational Spark cluster.
-	 *
-	 * @param userInfo user info.
-	 * @param form     user info about creation of the computational resource.
-	 * @return 200 OK if request success, 302 Found - for duplicates, otherwise throws exception.
-	 * @throws IllegalArgumentException if input is not valid or exceeds configuration limits
-	 */
-	@PUT
-	@Path("dataengine")
-	@RolesAllowed(UserSessionDurationAuthorizer.SHORT_USER_SESSION_DURATION)
-	public Response createDataEngine(@Auth UserInfo userInfo,
-									 @Valid @NotNull SparkStandaloneClusterCreateForm form) {
-		log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
-
-		if (!UserRoles.checkAccess(userInfo, RoleType.COMPUTATIONAL, form.getImage(), userInfo.getRoles())) {
-			log.warn("Unauthorized attempt to create a {} by user {}", form.getImage(), userInfo.getName());
-			throw new DlabException("You do not have the privileges to create a " + form.getTemplateName());
-		}
-
-		return computationalService.createSparkCluster(userInfo, form, form.getProject())
-				? Response.ok().build()
-				: Response.status(Response.Status.FOUND).build();
-
-	}
-
-	/**
-	 * Sends request to provisioning service for termination the computational resource for user.
-	 *
-	 * @param userInfo          user info.
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @return 200 OK if operation is successfully triggered
-	 */
-	@DELETE
-	@Path("/{projectName}/{exploratoryName}/{computationalName}/terminate")
-	public Response terminate(@Auth UserInfo userInfo,
-							  @PathParam("projectName") String projectName,
-							  @PathParam("exploratoryName") String exploratoryName,
-							  @PathParam("computationalName") String computationalName) {
-
-		log.debug("Terminating computational resource {} for user {}", computationalName, userInfo.getName());
-
-		computationalService.terminateComputational(userInfo, projectName, exploratoryName, computationalName);
-
-		return Response.ok().build();
-	}
-
-	/**
-	 * Sends request to provisioning service for stopping the computational resource for user.
-	 *
-	 * @param userInfo          user info.
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @return 200 OK if operation is successfully triggered
-	 */
-	@DELETE
-	@Path("/{project}/{exploratoryName}/{computationalName}/stop")
-	public Response stop(@Auth UserInfo userInfo,
-						 @PathParam("project") String project,
-						 @PathParam("exploratoryName") String exploratoryName,
-						 @PathParam("computationalName") String computationalName) {
-		log.debug("Stopping computational resource {} for user {}", computationalName, userInfo.getName());
-
-		computationalService.stopSparkCluster(userInfo, project, exploratoryName, computationalName);
-
-		return Response.ok().build();
-	}
-
-	/**
-	 * Sends request to provisioning service for starting the computational resource for user.
-	 *
-	 * @param userInfo          user info.
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @return 200 OK if operation is successfully triggered
-	 */
-	@PUT
-	@Path("/{project}/{exploratoryName}/{computationalName}/start")
-	public Response start(@Auth UserInfo userInfo,
-						  @PathParam("exploratoryName") String exploratoryName,
-						  @PathParam("computationalName") String computationalName,
-						  @PathParam("project") String project) {
-		log.debug("Starting computational resource {} for user {}", computationalName, userInfo.getName());
-
-		computationalService.startSparkCluster(userInfo, exploratoryName, computationalName, project);
-
-		return Response.ok().build();
-	}
-
-	@PUT
-	@Path("dataengine/{projectName}/{exploratoryName}/{computationalName}/config")
-	public Response updateDataEngineConfig(@Auth UserInfo userInfo,
-										   @PathParam("projectName") String projectName,
-										   @PathParam("exploratoryName") String exploratoryName,
-										   @PathParam("computationalName") String computationalName,
-										   @Valid @NotNull List<ClusterConfig> config) {
-
-		computationalService.updateSparkClusterConfig(userInfo, projectName, exploratoryName, computationalName, config);
-		return Response.ok().build();
-	}
-
-	@GET
-	@Path("/{projectName}/{exploratoryName}/{computationalName}/config")
-	public Response getClusterConfig(@Auth UserInfo userInfo,
-									 @PathParam("projectName") String projectName,
-									 @PathParam("exploratoryName") String exploratoryName,
-									 @PathParam("computationalName") String computationalName) {
-		return Response.ok(computationalService.getClusterConfig(userInfo, projectName, exploratoryName, computationalName)).build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/BackupCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/BackupCallback.java
deleted file mode 100644
index 102f8bf..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/BackupCallback.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.callback;
-
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.BackupService;
-import com.epam.dlab.dto.backup.EnvBackupStatusDTO;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-
-@Path("infrastructure/backup")
-@Consumes(MediaType.APPLICATION_JSON)
-@Slf4j
-public class BackupCallback {
-
-	@Inject
-	private BackupService backupService;
-
-	@Inject
-	private RequestId requestId;
-
-	@Context
-	private UriInfo uriInfo;
-
-	@POST
-	@Path("/status")
-	public Response status(EnvBackupStatusDTO dto) {
-		requestId.remove(dto.getRequestId());
-		log.debug("Updating status of backup status to {}", dto);
-		backupService.updateStatus(dto.getEnvBackupDTO(), dto.getUser(),
-				dto.getEnvBackupStatus().withErrorMessage(dto.getErrorMessage()));
-		return Response.created(uriInfo.getRequestUri()).build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/CheckInactivityCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/CheckInactivityCallback.java
deleted file mode 100644
index abf4c6d..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/CheckInactivityCallback.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources.callback;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.InactivityService;
-import com.epam.dlab.dto.computational.CheckInactivityStatusDTO;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.time.LocalDateTime;
-
-import static java.time.Instant.ofEpochSecond;
-import static java.time.ZoneId.systemDefault;
-
-@Path("/infrastructure/inactivity/callback")
-@Consumes(MediaType.APPLICATION_JSON)
-@Slf4j
-public class CheckInactivityCallback {
-
-	@Inject
-	private RequestId requestId;
-	@Inject
-	private InactivityService inactivityService;
-
-	@POST
-	@Path("exploratory")
-	public Response updateExploratoryLastActivity(CheckInactivityStatusDTO dto) {
-		requestId.checkAndRemove(dto.getRequestId());
-		inactivityService.updateLastActivityForExploratory(new UserInfo(dto.getUser(), null), dto.getExploratoryName(),
-				toLocalDateTime(dto.getLastActivityUnixTime()));
-		return Response.ok().build();
-	}
-
-	@POST
-	@Path("computational")
-	public Response updateComputationalLastActivity(CheckInactivityStatusDTO dto) {
-		requestId.checkAndRemove(dto.getRequestId());
-		inactivityService.updateLastActivityForComputational(new UserInfo(dto.getUser(), null), null,
-				dto.getExploratoryName(), dto.getComputationalName(), toLocalDateTime(dto.getLastActivityUnixTime()));
-		return Response.ok().build();
-	}
-
-	private LocalDateTime toLocalDateTime(long unixTime) {
-		return ofEpochSecond(unixTime).atZone(systemDefault()).toLocalDateTime();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ComputationalCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ComputationalCallback.java
deleted file mode 100644
index 2b286b5..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ComputationalCallback.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.callback;
-
-import com.epam.dlab.backendapi.dao.ComputationalDAO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.ComputationalService;
-import com.epam.dlab.backendapi.service.ReuploadKeyService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.computational.ComputationalStatusDTO;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Date;
-
-@Path("/infrastructure_provision/computational_resources")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ComputationalCallback {
-
-	@Inject
-	private ComputationalDAO computationalDAO;
-	@Inject
-	private RequestId requestId;
-	@Inject
-	private SecurityService securityService;
-	@Inject
-	private ReuploadKeyService reuploadKeyService;
-	@Inject
-	private ComputationalService computationalService;
-
-	/**
-	 * Updates the status of the computational resource for user.
-	 *
-	 * @param dto DTO info about the status of the computational resource.
-	 * @return 200 OK - if request success otherwise throws exception.
-	 */
-	@POST
-	@Path(ApiCallbacks.STATUS_URI)
-	public Response status(ComputationalStatusDTO dto) {
-		log.debug("Updating status for computational resource {} for user {}: {}",
-				dto.getComputationalName(), dto.getUser(), dto);
-		String uuid = dto.getRequestId();
-		requestId.checkAndRemove(uuid);
-
-		UserComputationalResource compResource = computationalService.getComputationalResource(dto.getUser(), dto.getProject(),
-				dto.getExploratoryName(), dto.getComputationalName())
-				.orElseThrow(() ->
-						new DlabException(String.format("Computational resource %s of exploratory environment %s of " +
-										"project %s for user %s doesn't exist", dto.getComputationalName(),
-								dto.getExploratoryName(), dto.getProject(), dto.getUser())));
-		log.debug("Current status for computational resource {} of exploratory environment {} for user {} is {}",
-				dto.getComputationalName(), dto.getExploratoryName(), dto.getUser(),
-				compResource.getStatus());
-		try {
-			computationalDAO.updateComputationalFields(dto.withLastActivity(new Date()));
-		} catch (DlabException e) {
-			log.error("Could not update status for computational resource {} for user {} to {}: {}", dto, e);
-			throw e;
-		}
-		if (UserInstanceStatus.CONFIGURING == UserInstanceStatus.of(dto.getStatus())) {
-			log.debug("Waiting for configuration of the computational resource {} for user {}",
-					dto.getComputationalName(), dto.getUser());
-			requestId.put(dto.getUser(), uuid);
-		}
-		return Response.ok().build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/EnvironmentStatusCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/EnvironmentStatusCallback.java
deleted file mode 100644
index d4c059e..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/EnvironmentStatusCallback.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.callback;
-
-import com.epam.dlab.backendapi.dao.EnvDAO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.status.EnvStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path("/infrastructure")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class EnvironmentStatusCallback {
-
-    @Inject
-	private EnvDAO envDAO;
-	@Inject
-	private RequestId requestId;
-
-    /**
-     * Updates the status of the resources for user.
-     *
-     * @param dto DTO info about the statuses of resources.
-     * @return Always return code 200 (OK).
-     */
-    @POST
-    @Path(ApiCallbacks.STATUS_URI)
-    public Response status(EnvStatusDTO dto) {
-        log.trace("Updating the status of resources for user {}: {}", dto.getUser(), dto);
-		requestId.checkAndRemove(dto.getRequestId());
-        try {
-            if (UserInstanceStatus.FAILED == UserInstanceStatus.of(dto.getStatus())) {
-                log.warn("Request for the status of resources for user {} fails: {}", dto.getUser(), dto.getErrorMessage());
-            } else {
-                envDAO.updateEnvStatus(dto.getUser(), null, dto.getResourceList());
-            }
-        } catch (DlabException e) {
-            log.warn("Could not update status of resources for user {}: {}", dto.getUser(), e.getLocalizedMessage(), e);
-        }
-        return Response.ok().build();
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ExploratoryCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ExploratoryCallback.java
deleted file mode 100644
index c275a18..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ExploratoryCallback.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.callback;
-
-import com.epam.dlab.backendapi.dao.ComputationalDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.service.ReuploadKeyService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.exploratory.ExploratoryStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Date;
-
-import static com.epam.dlab.dto.UserInstanceStatus.FAILED;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPED;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPING;
-import static com.epam.dlab.dto.UserInstanceStatus.TERMINATED;
-import static com.epam.dlab.dto.UserInstanceStatus.TERMINATING;
-
-
-@Path("/infrastructure_provision/exploratory_environment")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ExploratoryCallback {
-
-	private static final String USER_INSTANCE_NOT_EXIST_MSG = "User instance with exploratory name %s for user %s " +
-			"doesn't exist";
-	@Inject
-	private ExploratoryDAO exploratoryDAO;
-	@Inject
-	private ComputationalDAO computationalDAO;
-	@Inject
-	private RequestId requestId;
-	@Inject
-	private SecurityService securityService;
-	@Inject
-	private ReuploadKeyService reuploadKeyService;
-	@Inject
-	private ExploratoryService exploratoryService;
-
-	/**
-	 * Changes the status of exploratory environment.
-	 *
-	 * @param dto description of status.
-	 * @return 200 OK - if request success.
-	 */
-	@POST
-	@Path(ApiCallbacks.STATUS_URI)
-	public Response status(ExploratoryStatusDTO dto) {
-		log.debug("Updating status for exploratory environment {} for user {} to {}",
-				dto.getExploratoryName(), dto.getUser(), dto.getStatus());
-		requestId.checkAndRemove(dto.getRequestId());
-
-		UserInstanceDTO instance = exploratoryService.getUserInstance(dto.getUser(), dto.getProject(), dto.getExploratoryName())
-				.orElseThrow(() -> new DlabException(String.format(USER_INSTANCE_NOT_EXIST_MSG,
-						dto.getExploratoryName(), dto.getUser())));
-
-		UserInstanceStatus currentStatus = UserInstanceStatus.of(instance.getStatus());
-		log.debug("Current status for exploratory environment {} for user {} is {}",
-				dto.getExploratoryName(), dto.getUser(), currentStatus);
-
-		try {
-			exploratoryDAO.updateExploratoryFields(dto.withLastActivity(new Date()));
-			if (currentStatus == TERMINATING) {
-				updateComputationalStatuses(dto.getUser(), dto.getProject(), dto.getExploratoryName(),
-						UserInstanceStatus.of(dto.getStatus()));
-			} else if (currentStatus == STOPPING) {
-				updateComputationalStatuses(dto.getUser(), dto.getProject(), dto.getExploratoryName(),
-						UserInstanceStatus.of(dto.getStatus()), TERMINATED, FAILED, TERMINATED, STOPPED);
-			}
-		} catch (DlabException e) {
-			log.error("Could not update status for exploratory environment {} in project {} for user {} to {}",
-					dto.getExploratoryName(), dto.getProject(), dto.getUser(), dto.getStatus(), e);
-			throw new DlabException("Could not update status for exploratory environment " + dto.getExploratoryName() +
-					" for user " + dto.getUser() + " to " + dto.getStatus() + ": " + e.getLocalizedMessage(), e);
-		}
-
-		return Response.ok().build();
-	}
-
-	/**
-	 * Updates the computational status of exploratory environment.
-	 *
-	 * @param user            user name
-	 * @param project         project name
-	 * @param exploratoryName name of exploratory environment.
-	 * @param status          status for exploratory environment.
-	 */
-	private void updateComputationalStatuses(String user, String project, String exploratoryName, UserInstanceStatus status) {
-		log.debug("updating status for all computational resources of {} for user {}: {}", exploratoryName, user,
-				status);
-		computationalDAO.updateComputationalStatusesForExploratory(new ExploratoryStatusDTO()
-				.withUser(user)
-				.withExploratoryName(exploratoryName)
-				.withProject(project)
-				.withStatus(status));
-	}
-
-	private void updateComputationalStatuses(String user, String project, String exploratoryName, UserInstanceStatus
-			dataEngineStatus, UserInstanceStatus dataEngineServiceStatus, UserInstanceStatus... excludedStatuses) {
-		log.debug("updating status for all computational resources of {} for user {}: DataEngine {}, " +
-				"dataengine-service {}", exploratoryName, user, dataEngineStatus, dataEngineServiceStatus);
-		computationalDAO.updateComputationalStatusesForExploratory(user, project, exploratoryName,
-				dataEngineStatus, dataEngineServiceStatus, excludedStatuses);
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/GitCredsCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/GitCredsCallback.java
deleted file mode 100644
index 5570232..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/GitCredsCallback.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.callback;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.exploratory.ExploratoryStatusDTO;
-import com.epam.dlab.rest.contracts.ApiCallbacks;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path("/user/git_creds")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class GitCredsCallback {
-
-	@Inject
-	private RequestId requestId;
-
-    /**
-     * Update GIT credentials status in Mongo DB for user.
-     *
-     * @param dto description of status.
-     * @return 200 OK - if request success.
-     */
-    @POST
-    @Path(ApiCallbacks.STATUS_URI)
-    public Response status(ExploratoryStatusDTO dto) {
-        if (UserInstanceStatus.CREATED != UserInstanceStatus.of(dto.getStatus())) {
-            //TODO Handle error status?
-            log.error("Git creds has not been updated for exploratory environment {} for user {}, status is {}",
-                    dto.getExploratoryName(), dto.getUser(), dto.getStatus());
-        } else {
-            log.debug("Git creds has been updated for exploratory environment {} for user {}, status is {}",
-                    dto.getExploratoryName(), dto.getUser(), dto.getStatus());
-        }
-		requestId.checkAndRemove(dto.getRequestId());
-        return Response.ok().build();
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ImageCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ImageCallback.java
deleted file mode 100644
index 66b54b6..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ImageCallback.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.callback;
-
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.ImageExploratoryService;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.exploratory.ImageCreateStatusDTO;
-import com.epam.dlab.dto.exploratory.ImageStatus;
-import com.epam.dlab.model.exploratory.Image;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path("/infrastructure_provision/image")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ImageCallback {
-
-	@Inject
-	private ImageExploratoryService imageExploratoryService;
-	@Inject
-	private RequestId requestId;
-
-	@POST
-	@Path("/image_status")
-	public Response imageCreateStatus(ImageCreateStatusDTO dto) {
-		log.debug("Updating status of image {} for user {} to {}", dto.getName(), dto.getUser(), dto);
-		requestId.remove(dto.getRequestId());
-		imageExploratoryService.finishImageCreate(getImage(dto), dto.getExploratoryName(), dto.getImageCreateDTO()
-				.getIp());
-		return Response.status(Response.Status.CREATED).build();
-	}
-
-	private Image getImage(ImageCreateStatusDTO dto) {
-		return Image.builder()
-				.name(dto.getName())
-				.user(dto.getUser())
-				.project(dto.getProject())
-				.endpoint(dto.getEndpoint())
-				.externalName(dto.getImageCreateDTO().getExternalName())
-				.fullName(dto.getImageCreateDTO().getFullName())
-				.status(UserInstanceStatus.FAILED == UserInstanceStatus.of(dto.getStatus()) ?
-						ImageStatus.FAILED : dto.getImageCreateDTO().getStatus())
-				.application(dto.getImageCreateDTO().getApplication()).build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/LibraryCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/LibraryCallback.java
deleted file mode 100644
index be8c2f1..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/LibraryCallback.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.callback;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ExploratoryLibDAO;
-import com.epam.dlab.backendapi.domain.ExploratoryLibCache;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.exploratory.LibInstallStatusDTO;
-import com.epam.dlab.dto.exploratory.LibListStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-@Path("/infrastructure_provision/library")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class LibraryCallback {
-
-	@Inject
-	private ExploratoryLibDAO libraryDAO;
-	@Inject
-	private RequestId requestId;
-
-	/**
-	 * Changes the status of installed libraries for exploratory environment.
-	 *
-	 * @param dto description of status.
-	 * @return 200 OK - if request success.
-	 */
-	@POST
-	@Path("/lib_status")
-	public Response libInstallStatus(LibInstallStatusDTO dto) {
-		log.debug("Updating status of libraries for exploratory environment {} for user {} to {}",
-				dto.getExploratoryName(), dto.getUser(), dto);
-		requestId.checkAndRemove(dto.getRequestId());
-		try {
-			libraryDAO.updateLibraryFields(dto);
-		} catch (DlabException e) {
-			log.error("Cannot update status of libraries for exploratory environment {} for user {} to {}",
-					dto.getExploratoryName(), dto.getUser(), dto, e);
-			throw new DlabException("Cannot update status of libaries for exploratory environment " + dto.getExploratoryName() +
-					" for user " + dto.getUser() + ": " + e.getLocalizedMessage(), e);
-		}
-
-		return Response.ok().build();
-	}
-
-
-	/**
-	 * Updates the list of libraries.
-	 *
-	 * @param dto DTO the list of libraries.
-	 * @return Always return code 200 (OK).
-	 */
-	@POST
-	@Path("/update_lib_list")
-	public Response updateLibList(LibListStatusDTO dto) {
-		log.debug("Updating the list of libraries for image {}", dto.getImageName());
-		requestId.checkAndRemove(dto.getRequestId());
-		try {
-			if (UserInstanceStatus.FAILED == UserInstanceStatus.of(dto.getStatus())) {
-				log.warn("Request for the list of libraries fails: {}", dto.getErrorMessage());
-				ExploratoryLibCache.getCache().removeLibList(dto.getImageName());
-			} else {
-				ExploratoryLibCache.getCache().updateLibList(dto.getImageName(), dto.getLibs());
-			}
-		} catch (Exception e) {
-			log.warn("Cannot update the list of libs: {}", e.getLocalizedMessage(), e);
-		}
-		// Always necessary send OK for status request
-		return Response.ok().build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ProjectCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ProjectCallback.java
deleted file mode 100644
index 4500e5e..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ProjectCallback.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.callback;
-
-import com.epam.dlab.backendapi.dao.ProjectDAO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.project.ProjectResult;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Objects;
-
-@Path("/project/status")
-@Consumes(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ProjectCallback {
-
-	private final ProjectDAO projectDAO;
-	private final ExploratoryService exploratoryService;
-	private final RequestId requestId;
-
-	@Inject
-	public ProjectCallback(ProjectDAO projectDAO, ExploratoryService exploratoryService, RequestId requestId) {
-		this.projectDAO = projectDAO;
-		this.exploratoryService = exploratoryService;
-		this.requestId = requestId;
-	}
-
-
-	@POST
-	public Response updateProjectStatus(ProjectResult projectResult) {
-		requestId.checkAndRemove(projectResult.getRequestId());
-		final String projectName = projectResult.getProjectName();
-		final UserInstanceStatus status = UserInstanceStatus.of(projectResult.getStatus());
-		if (UserInstanceStatus.RUNNING == status && Objects.nonNull(projectResult.getEdgeInfo())) {
-			projectDAO.updateEdgeInfo(projectName, projectResult.getEndpointName(), projectResult.getEdgeInfo());
-		} else {
-			updateExploratoriesStatusIfNeeded(status, projectResult.getProjectName(), projectResult.getEndpointName());
-			projectDAO.updateEdgeStatus(projectName, projectResult.getEndpointName(), status);
-		}
-		return Response.ok().build();
-	}
-
-	private void updateExploratoriesStatusIfNeeded(UserInstanceStatus status, String projectName, String endpoint) {
-		if (UserInstanceStatus.TERMINATED == status) {
-			exploratoryService.updateProjectExploratoryStatuses(projectName, endpoint, UserInstanceStatus.TERMINATED);
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ReuploadKeyCallback.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ReuploadKeyCallback.java
deleted file mode 100644
index 837498a..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/callback/ReuploadKeyCallback.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.callback;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.ReuploadKeyService;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyStatusDTO;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-
-@Path("infrastructure/reupload_key")
-@Consumes(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ReuploadKeyCallback {
-
-	@Inject
-	private RequestId requestId;
-	@Inject
-	private ReuploadKeyService reuploadKeyService;
-
-	@Context
-	private UriInfo uriInfo;
-
-	@POST
-	@Path("/callback")
-	public Response reuploadKeyResponse(ReuploadKeyStatusDTO dto) {
-		requestId.remove(dto.getRequestId());
-		reuploadKeyService.updateResourceData(dto);
-		return Response.ok(uriInfo.getRequestUri()).build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BackupFormDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BackupFormDTO.java
deleted file mode 100644
index 36f08e9..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BackupFormDTO.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import lombok.Data;
-import lombok.ToString;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import java.util.List;
-
-@Data
-@ToString
-public class BackupFormDTO {
-	@NotEmpty
-	private final List<String> configFiles;
-	@NotEmpty
-	private final List<String> keys;
-	@NotEmpty
-	private final List<String> certificates;
-	private final List<String> jars;
-	private final boolean databaseBackup;
-	private final boolean logsBackup;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BackupInfoRecord.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BackupInfoRecord.java
deleted file mode 100644
index 3a3dfa8..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BackupInfoRecord.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.dto.backup.EnvBackupStatus;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.Date;
-import java.util.List;
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class BackupInfoRecord {
-
-	private final List<String> configFiles;
-	private final List<String> keys;
-	private final List<String> certificates;
-	private final List<String> jars;
-	private final boolean databaseBackup;
-	private final boolean logsBackup;
-	private final String backupFile;
-	private final EnvBackupStatus status;
-	@JsonProperty("error_message")
-	private final String errorMessage;
-	private final Date timestamp;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BillingFilter.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BillingFilter.java
deleted file mode 100644
index 52363a8..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BillingFilter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.NonNull;
-
-import java.util.Collections;
-import java.util.List;
-
-@Data
-@NoArgsConstructor
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class BillingFilter {
-	@NonNull
-	private List<String> users;
-	@NonNull
-	@JsonProperty("dlab_id")
-	private String dlabId;
-	@NonNull
-	@JsonProperty("date_start")
-	private String dateStart;
-	@NonNull
-	@JsonProperty("date_end")
-	private String dateEnd;
-	@NonNull
-	@JsonProperty("resource_type")
-	private List<String> resourceTypes;
-	@NonNull
-	private List<UserInstanceStatus> statuses = Collections.emptyList();
-	@NonNull
-	private List<String> projects;
-	@NonNull
-	private List<String> products;
-	@NonNull
-	private List<String> shapes;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ComputationalCreateFormDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ComputationalCreateFormDTO.java
deleted file mode 100644
index ce619e4..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ComputationalCreateFormDTO.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import org.hibernate.validator.constraints.NotBlank;
-
-import javax.validation.Valid;
-import java.util.List;
-
-/**
- * Stores info about creation of the computational resource.
- */
-@Data
-public class ComputationalCreateFormDTO {
-
-	@NotBlank
-	@JsonProperty("template_name")
-	private String templateName;
-
-	@NotBlank
-	@JsonProperty
-	private String image;
-
-	@NotBlank
-	@JsonProperty
-	private String name;
-
-	@NotBlank
-	@JsonProperty
-	private String project;
-	@JsonProperty("custom_tag")
-	private String customTag;
-
-	@NotBlank
-	@JsonProperty("notebook_name")
-	private String notebookName;
-
-	@JsonProperty("check_inactivity_required")
-	private boolean checkInactivityRequired = true;
-
-	@Valid
-	private List<ClusterConfig> config;
-
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ComputationalTemplatesDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ComputationalTemplatesDTO.java
deleted file mode 100644
index 9871918..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ComputationalTemplatesDTO.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.dto.base.computational.FullComputationalTemplate;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class ComputationalTemplatesDTO {
-    private final List<FullComputationalTemplate> templates;
-    @JsonProperty("user_computations")
-    private final List<String> userComputations;
-    @JsonProperty("project_computations")
-    private final List<String> projectComputations;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryActionFormDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryActionFormDTO.java
deleted file mode 100644
index d3361df..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryActionFormDTO.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import org.hibernate.validator.constraints.NotBlank;
-
-/**
- * Stores info about action on the exploratory resource.
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class ExploratoryActionFormDTO {
-    @NotBlank
-    @JsonProperty("notebook_instance_name")
-    private String notebookInstanceName;
-
-    @NotBlank
-    @JsonProperty("project_name")
-    private String projectName;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryCreateFormDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryCreateFormDTO.java
deleted file mode 100644
index e157b8b..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryCreateFormDTO.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-import org.hibernate.validator.constraints.NotBlank;
-
-import java.util.List;
-
-/**
- * Stores info about new exploratory.
- */
-public class ExploratoryCreateFormDTO {
-	@NotBlank
-	@JsonProperty
-	private String image;
-
-	@NotBlank
-	@JsonProperty("template_name")
-	private String templateName;
-
-	@NotBlank
-	@JsonProperty
-	private String name;
-
-	@NotBlank
-	@JsonProperty
-	private String project;
-	@JsonProperty("custom_tag")
-	private String exploratoryTag;
-
-	@NotBlank
-	@JsonProperty
-	private String endpoint;
-
-	@NotBlank
-	@JsonProperty
-	private String shape;
-
-	@NotBlank
-	@JsonProperty
-	private String version;
-
-	@JsonProperty("notebook_image_name")
-	private String imageName;
-
-	@JsonProperty("cluster_config")
-	private List<ClusterConfig> clusterConfig;
-
-	/**
-	 * Returns the image name of notebook.
-	 */
-	public String getImage() {
-		return image;
-	}
-
-	/**
-	 * Sets the image name of notebook.
-	 */
-	public void setImage(String image) {
-		this.image = image;
-	}
-
-	/**
-	 * Returns name of template.
-	 */
-	public String getTemplateName() {
-		return templateName;
-	}
-
-	/**
-	 * Sets name of template.
-	 */
-	public void setTemplateName(String templateName) {
-		this.templateName = templateName;
-	}
-
-	/**
-	 * Returns name of notebook.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Sets name of notebook.
-	 */
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	/**
-	 * Returns name of shape.
-	 */
-	public String getShape() {
-		return shape;
-	}
-
-	/**
-	 * Sets name of shape.
-	 */
-	public void setShape(String shape) {
-		this.shape = shape;
-	}
-
-	/**
-	 * Returns version.
-	 */
-	public String getVersion() {
-		return version;
-	}
-
-	/**
-	 * Sets version.
-	 */
-	public void setVersion(String version) {
-		this.version = version;
-	}
-
-	/**
-	 * Returns image name from which notebook should be created
-	 */
-	public String getImageName() {
-		return imageName;
-	}
-
-	/**
-	 * Sets image name from which notebook should be created
-	 */
-	public void setImageName(String imageName) {
-		this.imageName = imageName;
-	}
-
-	public List<ClusterConfig> getClusterConfig() {
-		return clusterConfig;
-	}
-
-	public String getProject() {
-		return project;
-	}
-
-	public void setProject(String project) {
-		this.project = project;
-	}
-
-	public String getEndpoint() {
-		return endpoint;
-	}
-
-	public void setEndpoint(String endpoint) {
-		this.endpoint = endpoint;
-	}
-
-	public String getExploratoryTag() {
-		return exploratoryTag;
-	}
-
-	@Override
-	public String toString() {
-		return MoreObjects.toStringHelper(this)
-				.add("name", name)
-				.add("templateName", templateName)
-				.add("shape", shape)
-				.add("version", version)
-				.add("image", image)
-				.add("imageName", imageName)
-				.toString();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryCreatePopUp.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryCreatePopUp.java
deleted file mode 100644
index d061204..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryCreatePopUp.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.List;
-import java.util.Map;
-
-@Data
-public class ExploratoryCreatePopUp {
-    @JsonProperty("user_projects")
-    private final List<ProjectDTO> userProjects;
-    @JsonProperty("project_exploratories")
-    private final Map<String, List<String>> projectExploratories;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryImageCreateFormDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryImageCreateFormDTO.java
deleted file mode 100644
index 14193f2..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ExploratoryImageCreateFormDTO.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.ToString;
-import org.hibernate.validator.constraints.NotBlank;
-
-@Data
-@ToString
-public class ExploratoryImageCreateFormDTO {
-    @NotBlank
-    private final String name;
-    @NotBlank
-    @JsonProperty("exploratory_name")
-    private String notebookName;
-    @NotBlank
-    @JsonProperty("project_name")
-    private String projectName;
-    private final String description;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/GroupDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/GroupDTO.java
deleted file mode 100644
index 577d9f7..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/GroupDTO.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources.dto;
-
-import lombok.Getter;
-import lombok.Setter;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import java.util.Collections;
-import java.util.Set;
-
-@Getter
-@Setter
-public class GroupDTO {
-	@NotEmpty
-	private String name;
-	@NotEmpty
-	private Set<String> roleIds;
-	private Set<String> users = Collections.emptySet();
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusDTO.java
deleted file mode 100644
index 27c6b78..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusDTO.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-/** Stores the health statuses for services.
- */
-public class HealthStatusDTO {
-    @JsonProperty("mongo_alive")
-    private boolean mongoAlive;
-    @JsonProperty("provisioning_alive")
-    private boolean provisioningAlive;
-
-    /** Returns <b>true</b> if the Mongo database is available. */
-    public boolean isMongoAlive() {
-        return mongoAlive;
-    }
-
-    /** Sets the Mongo database availability. */
-    public void setMongoAlive(boolean mongoAlive) {
-        this.mongoAlive = mongoAlive;
-    }
-
-    /** Sets the Mongo database availability. */
-    public HealthStatusDTO withMongoAlive(boolean mongoAlive) {
-        setMongoAlive(mongoAlive);
-        return this;
-    }
-
-    /** Returns <b>true</b> if the provisioning service is available. */
-    public boolean isProvisioningAlive() {
-        return provisioningAlive;
-    }
-
-    /** Sets the provisioning service availability. */
-    public void setProvisioningAlive(boolean provisioningAlive) {
-        this.provisioningAlive = provisioningAlive;
-    }
-
-    /** Sets the provisioning service availability. */
-    public HealthStatusDTO withProvisioningAlive(boolean provisioningAlive) {
-        setProvisioningAlive(provisioningAlive);
-        return this;
-    }
-    
-    @Override
-    public String toString() {
-    	return MoreObjects.toStringHelper(this)
-    			.add("mongoAlive", mongoAlive)
-    			.add("provisioningAlive", provisioningAlive)
-    	        .toString();
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusEnum.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusEnum.java
deleted file mode 100644
index 3919532..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusEnum.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources.dto;
-
-/** Statuses for the environment resource. */
-public enum HealthStatusEnum {
-    ERROR,
-    WARNING,
-    OK;
-
-    @Override
-    public String toString() {
-        return super.toString().toLowerCase();
-    }
-
-    public static HealthStatusEnum of(String status) {
-        if (status != null) {
-            for (HealthStatusEnum uis : HealthStatusEnum.values()) {
-                if (status.equalsIgnoreCase(uis.toString())) {
-                    return uis;
-                }
-            }
-        }
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusPageDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusPageDTO.java
deleted file mode 100644
index 17e7b91..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusPageDTO.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * Stores the health statuses for environment resources.
- */
-@Data
-@Builder
-public class HealthStatusPageDTO {
-	@JsonProperty
-	private String status;
-	@JsonProperty("list_resources")
-	private List<HealthStatusResource> listResources;
-	@JsonProperty
-	private boolean billingEnabled;
-	@JsonProperty
-	private boolean admin;
-	@JsonProperty
-	private boolean projectAdmin;
-	@JsonProperty
-	private int billingQuoteUsed;
-	@JsonProperty
-	private int billingUserQuoteUsed;
-	@JsonProperty
-	private boolean projectAssigned;
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusResource.java
deleted file mode 100644
index 039a31e..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/HealthStatusResource.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.common.base.MoreObjects;
-
-/** Stores the health status for user environment.
- */
-public class HealthStatusResource {
-    @JsonProperty("type")
-    private String type;
-    @JsonProperty("resource_id")
-    private String resourceId;
-    @JsonProperty("status")
-    private String status;
-
-    /** Return the type of resource. */
-    public String getType() {
-        return type;
-    }
-
-    /** Set the type of resource. */
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    /** Set the type of resource. */
-    public HealthStatusResource withType(String type) {
-        setType(type);
-        return this;
-    }
-
-    /** Return the id of resource (ip address, path, etc). */
-    public String getResourceId() {
-        return resourceId;
-    }
-
-    /** Set the id of resource (ip address, path, etc). */
-    public void setResourceId(String resourceId) {
-        this.resourceId = resourceId;
-    }
-
-    /** Set the id of resource (ip address, path, etc). */
-    public HealthStatusResource withResourceId(String resourceId) {
-        setResourceId(resourceId);
-        return this;
-    }
-
-    /** Return the status of resource. */
-    public String getStatus() {
-        return status;
-    }
-    
-    /** Set the status of resource. */
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    /** Set the status of resource. */
-	public HealthStatusResource withStatus(String status) {
-		setStatus(status);
-        return this;
-    }
-
-    @Override
-    public String toString() {
-    	return MoreObjects.toStringHelper(this)
-    			.add("type", type)
-    			.add("resourceId", resourceId)
-                .add("status",status)
-    	        .toString();
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ImageInfoRecord.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ImageInfoRecord.java
deleted file mode 100644
index ed722ee..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ImageInfoRecord.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.dto.exploratory.ImageStatus;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.Data;
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class ImageInfoRecord {
-	private final String name;
-	private final String description;
-	private final String project;
-	private final String endpoint;
-	private final String user;
-	private final String application;
-	private final String fullName;
-	private final ImageStatus status;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/KeysDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/KeysDTO.java
deleted file mode 100644
index 5bfbb0c..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/KeysDTO.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@AllArgsConstructor
-@Data
-public class KeysDTO {
-    private String publicKey;
-    private String privateKey;
-    private String username;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibInfoRecord.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibInfoRecord.java
deleted file mode 100644
index 4ddd6ad..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibInfoRecord.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonUnwrapped;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-@JsonInclude(JsonInclude.Include.NON_EMPTY)
-public class LibInfoRecord {
-    @JsonProperty
-    @JsonUnwrapped
-    private LibKey libKey;
-    
-    @JsonProperty
-    private List<LibraryStatus> status;
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibInstallFormDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibInstallFormDTO.java
deleted file mode 100644
index c2b8d1a..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibInstallFormDTO.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import org.hibernate.validator.constraints.NotBlank;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import java.util.List;
-
-/**
- * Stores info about the installation of libraries.
- */
-@Data
-public class LibInstallFormDTO {
-    @NotBlank
-    @JsonProperty("exploratory_name")
-    private String notebookName;
-
-    @JsonProperty("computational_name")
-    private String computationalName;
-
-    @JsonProperty("project_name")
-    private String project;
-
-    @NotEmpty
-    @JsonProperty
-    private List<LibInstallDTO> libs;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibKey.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibKey.java
deleted file mode 100644
index 81d1d43..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibKey.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@JsonInclude(JsonInclude.Include.NON_EMPTY)
-public class LibKey {
-    @JsonProperty
-    private String name;
-    @JsonProperty
-    private String version;
-    @JsonProperty
-    private String group;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibraryDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibraryDTO.java
deleted file mode 100644
index 9a2535e..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibraryDTO.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-
-@Getter
-@AllArgsConstructor
-@NoArgsConstructor
-public class LibraryDTO {
-	private String name;
-	private String version;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibraryStatus.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibraryStatus.java
deleted file mode 100644
index cec0306..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/LibraryStatus.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@JsonInclude(JsonInclude.Include.NON_EMPTY)
-public class LibraryStatus {
-    @JsonProperty
-    private String resource;
-    @JsonProperty
-    private String resourceType;
-    @JsonProperty
-    private String status;
-    @JsonProperty
-    private String error;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectActionFormDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectActionFormDTO.java
deleted file mode 100644
index ccdd3c4..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectActionFormDTO.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-import java.util.List;
-
-@Data
-public class ProjectActionFormDTO {
-	@NotNull
-	@JsonProperty("project_name")
-	private final String projectName;
-	@NotNull
-	@JsonProperty("endpoint")
-	private final List<String> endpoints;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectInfrastructureInfo.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectInfrastructureInfo.java
deleted file mode 100644
index b9dfd89..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/ProjectInfrastructureInfo.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.backendapi.domain.BillingReport;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.ToString;
-import org.bson.Document;
-
-import java.util.List;
-import java.util.Map;
-
-@AllArgsConstructor
-@ToString
-public class ProjectInfrastructureInfo {
-	@JsonProperty
-	private String project;
-	@JsonProperty
-	private int billingQuoteUsed;
-	@JsonProperty
-	private Map<String, Map<String, String>> shared;
-	@JsonProperty
-	private Iterable<Document> exploratory;
-	@JsonProperty
-	private List<BillingReport> exploratoryBilling;
-	@JsonProperty
-	private List<EndpointDTO> endpoints;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SearchLibsFormDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SearchLibsFormDTO.java
deleted file mode 100644
index ff6edb6..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SearchLibsFormDTO.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import org.hibernate.validator.constraints.NotBlank;
-
-@Data
-public class SearchLibsFormDTO {
-    @NotBlank
-    @JsonProperty("exploratory_name")
-    private String notebookName;
-
-    @NotBlank
-    @JsonProperty("project_name")
-    private String projectName;
-
-    @NotBlank
-    @JsonProperty
-    private String group;
-
-    @NotBlank
-    @JsonProperty("start_with")
-    private String startWith;
-
-    @JsonProperty("computational_name")
-    private String computationalName;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SparkStandaloneClusterCreateForm.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SparkStandaloneClusterCreateForm.java
deleted file mode 100644
index 92b6270..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SparkStandaloneClusterCreateForm.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import org.hibernate.validator.constraints.NotBlank;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class SparkStandaloneClusterCreateForm extends ComputationalCreateFormDTO {
-
-	@NotBlank
-	@JsonProperty("dataengine_instance_count")
-	private String dataEngineInstanceCount;
-
-	@NotBlank
-	@JsonProperty("dataengine_instance_shape")
-	private String dataEngineInstanceShape;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SparkStandaloneConfiguration.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SparkStandaloneConfiguration.java
deleted file mode 100644
index 9cc358d..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SparkStandaloneConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Data;
-
-@Data
-@Builder
-public class SparkStandaloneConfiguration {
-    @JsonProperty("min_spark_instance_count")
-    private int minSparkInstanceCount;
-    @JsonProperty("max_spark_instance_count")
-    private int maxSparkInstanceCount;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SystemInfoDto.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SystemInfoDto.java
deleted file mode 100644
index 6d0d1fa..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/SystemInfoDto.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.model.systeminfo.DiskInfo;
-import com.epam.dlab.model.systeminfo.MemoryInfo;
-import com.epam.dlab.model.systeminfo.OsInfo;
-import com.epam.dlab.model.systeminfo.ProcessorInfo;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.List;
-
-@AllArgsConstructor
-@Getter
-public class SystemInfoDto {
-
-	@JsonProperty
-	private OsInfo osInfo;
-	@JsonProperty
-	private ProcessorInfo processorInfo;
-	@JsonProperty
-	private MemoryInfo memoryInfo;
-	@JsonProperty
-	private List<DiskInfo> disksInfo;
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UpdateRoleGroupDto.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UpdateRoleGroupDto.java
deleted file mode 100644
index 2913712..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UpdateRoleGroupDto.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import java.util.Set;
-
-@AllArgsConstructor
-@Getter
-public class UpdateRoleGroupDto {
-
-	@NotEmpty
-	private final Set<String> roleIds;
-	@NotEmpty
-	private final String group;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UpdateUserGroupDto.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UpdateUserGroupDto.java
deleted file mode 100644
index 8e3bb5f..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UpdateUserGroupDto.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import java.util.Set;
-
-@AllArgsConstructor
-@Getter
-public class UpdateUserGroupDto {
-
-	@NotEmpty
-	private final String group;
-	@NotEmpty
-	private final Set<String> users;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserDTO.java
deleted file mode 100644
index 7f46612..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserDTO.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
-
-@Data
-@AllArgsConstructor
-public class UserDTO {
-	@NotNull
-	private final String name;
-	@Min(1)
-	private final Integer budget;
-	private Status status;
-
-	public enum Status {
-		ACTIVE, NOT_ACTIVE
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserGroupDto.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserGroupDto.java
deleted file mode 100644
index 8154892..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserGroupDto.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.List;
-import java.util.Set;
-
-@AllArgsConstructor
-@Getter
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class UserGroupDto {
-	private final String group;
-	private final List<UserRoleDto> roles;
-	private final Set<String> users;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserResourceInfo.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserResourceInfo.java
deleted file mode 100644
index ea1198e..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserResourceInfo.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.model.ResourceEnum;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-import java.util.Collections;
-import java.util.List;
-
-@Data
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class UserResourceInfo {
-
-	@JsonProperty("resource_type")
-	private ResourceEnum resourceType;
-
-	@JsonProperty("resource_name")
-	private String resourceName;
-
-	@JsonProperty("shape")
-	private String resourceShape;
-
-	@JsonProperty("status")
-	private String resourceStatus;
-
-	@JsonProperty("computational_resources")
-	private List<UserComputationalResource> computationalResources = Collections.emptyList();
-
-	@JsonProperty
-	private String user;
-	@JsonProperty
-	private String project;
-
-	@JsonProperty("public_ip")
-	private String ip;
-
-	@JsonProperty("cloud_provider")
-	private String cloudProvider;
-
-
-	public UserResourceInfo withResourceType(ResourceEnum resourceType) {
-		setResourceType(resourceType);
-		return this;
-	}
-
-	public UserResourceInfo withResourceName(String resourceName) {
-		setResourceName(resourceName);
-		return this;
-	}
-
-	public UserResourceInfo withResourceShape(String resourceShape) {
-		setResourceShape(resourceShape);
-		return this;
-	}
-
-	public UserResourceInfo withResourceStatus(String resourceStatus) {
-		setResourceStatus(resourceStatus);
-		return this;
-	}
-
-	public UserResourceInfo withCompResources(List<UserComputationalResource> compResources) {
-		setComputationalResources(compResources);
-		return this;
-	}
-
-	public UserResourceInfo withUser(String user) {
-		setUser(user);
-		return this;
-	}
-
-	public UserResourceInfo withIp(String ip) {
-		setIp(ip);
-		return this;
-	}
-
-	public UserResourceInfo withProject(String project) {
-		setProject(project);
-		return this;
-	}
-
-	public UserResourceInfo withCloudProvider(String cloudProvider) {
-		setCloudProvider(cloudProvider);
-		return this;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserRoleDto.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserRoleDto.java
deleted file mode 100644
index 5c90602..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserRoleDto.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources.dto;
-
-import com.epam.dlab.cloud.CloudProvider;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-
-import java.util.Set;
-
-@Getter
-@Setter
-@ToString
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class UserRoleDto {
-	@JsonProperty("_id")
-	private String id;
-	private String description;
-	private Type type;
-	private CloudProvider cloud;
-	private Set<String> pages;
-	private Set<String> computationals;
-	private Set<String> exploratories;
-	@JsonProperty("exploratory_shapes")
-	private Set<String> exploratoryShapes;
-	private Set<String> groups;
-
-	private enum Type {
-		NOTEBOOK,
-		COMPUTATIONAL,
-		NOTEBOOK_SHAPE,
-		COMPUTATIONAL_SHAPE,
-		BILLING,
-		ADMINISTRATION
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/aws/AwsComputationalCreateForm.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/aws/AwsComputationalCreateForm.java
deleted file mode 100644
index 869b89d..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/aws/AwsComputationalCreateForm.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto.aws;
-
-import com.epam.dlab.backendapi.resources.dto.ComputationalCreateFormDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import org.hibernate.validator.constraints.NotBlank;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class AwsComputationalCreateForm extends ComputationalCreateFormDTO {
-
-	@NotBlank
-	@JsonProperty("emr_instance_count")
-	private String instanceCount;
-
-	@NotBlank
-	@JsonProperty("emr_master_instance_type")
-	private String masterInstanceType;
-
-	@NotBlank
-	@JsonProperty("emr_slave_instance_type")
-	private String slaveInstanceType;
-
-	@JsonProperty("emr_slave_instance_spot")
-	private Boolean slaveInstanceSpot = false;
-
-	@JsonProperty("emr_slave_instance_spot_pct_price")
-	private Integer slaveInstanceSpotPctPrice;
-
-	@NotBlank
-	@JsonProperty("emr_version")
-	private String version;
-
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/aws/AwsEmrConfiguration.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/aws/AwsEmrConfiguration.java
deleted file mode 100644
index 3aadfd8..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/aws/AwsEmrConfiguration.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-package com.epam.dlab.backendapi.resources.dto.aws;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Data;
-import org.hibernate.validator.constraints.NotBlank;
-
-/**
- * Stores limits for creation of the computational resources for EMR cluster
- */
-@Data
-@Builder
-public class AwsEmrConfiguration {
-    @NotBlank
-    @JsonProperty("min_emr_instance_count")
-    private int minEmrInstanceCount;
-
-    @NotBlank
-    @JsonProperty("max_emr_instance_count")
-    private int maxEmrInstanceCount;
-
-    @NotBlank
-    @JsonProperty("min_emr_spot_instance_bid_pct")
-    private int minEmrSpotInstanceBidPct;
-
-    @NotBlank
-    @JsonProperty("max_emr_spot_instance_bid_pct")
-    private int maxEmrSpotInstanceBidPct;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/gcp/GcpComputationalCreateForm.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/gcp/GcpComputationalCreateForm.java
deleted file mode 100644
index 8b7a041..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/gcp/GcpComputationalCreateForm.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto.gcp;
-
-import com.epam.dlab.backendapi.resources.dto.ComputationalCreateFormDTO;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-import lombok.ToString;
-import org.hibernate.validator.constraints.NotBlank;
-
-@Data
-@ToString(callSuper = true)
-public class GcpComputationalCreateForm extends ComputationalCreateFormDTO {
-
-	@NotBlank
-	@JsonProperty("dataproc_master_count")
-	private String masterInstanceCount;
-
-	@NotBlank
-	@JsonProperty("dataproc_slave_count")
-	private String slaveInstanceCount;
-
-	@NotBlank
-	@JsonProperty("dataproc_preemptible_count")
-	private String preemptibleCount;
-
-	@JsonProperty("dataproc_master_instance_type")
-	private String masterInstanceType;
-
-	@JsonProperty("dataproc_slave_instance_type")
-	private String slaveInstanceType;
-
-	@NotBlank
-	@JsonProperty("dataproc_version")
-	private String version;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/gcp/GcpDataprocConfiguration.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/gcp/GcpDataprocConfiguration.java
deleted file mode 100644
index fee6694..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/gcp/GcpDataprocConfiguration.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.dto.gcp;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Builder;
-import lombok.Data;
-import org.hibernate.validator.constraints.NotBlank;
-
-/**
- * Stores limits for creation of the computational resources for Dataproc cluster
- */
-@Data
-@Builder
-public class GcpDataprocConfiguration {
-	@NotBlank
-	@JsonProperty("min_instance_count")
-	private int minInstanceCount;
-	@NotBlank
-	@JsonProperty("max_instance_count")
-	private int maxInstanceCount;
-	@NotBlank
-	@JsonProperty("min_dataproc_preemptible_instance_count")
-	private int minDataprocPreemptibleInstanceCount;
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java
deleted file mode 100644
index 087330a..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/ComputationalResourceGcp.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.gcp;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
-import com.epam.dlab.backendapi.resources.dto.gcp.GcpComputationalCreateForm;
-import com.epam.dlab.backendapi.roles.RoleType;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.ComputationalService;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.gcp.computational.GcpComputationalResource;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.contracts.ComputationalAPI;
-import com.google.inject.Inject;
-import io.dropwizard.auth.Auth;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
-
-
-/**
- * Provides the REST API for the computational resource on GCP.
- */
-@Path("/gcp/infrastructure_provision/computational_resources")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-@Slf4j
-public class ComputationalResourceGcp implements ComputationalAPI {
-	private final SelfServiceApplicationConfiguration configuration;
-	private final ComputationalService computationalService;
-
-	@Inject
-	public ComputationalResourceGcp(SelfServiceApplicationConfiguration configuration, ComputationalService computationalService) {
-		this.configuration = configuration;
-		this.computationalService = computationalService;
-	}
-
-
-	@GET
-	@Path("/{project}/{endpoint}/templates")
-	public Response getTemplates(@Auth @Parameter(hidden = true) UserInfo userInfo, @PathParam("project") String project,
-								 @PathParam("endpoint") String endpoint) {
-		return Response.ok(computationalService.getComputationalNamesAndTemplates(userInfo, project, endpoint)).build();
-	}
-
-	/**
-	 * Asynchronously creates Dataproc cluster
-	 *
-	 * @param userInfo user info.
-	 * @param formDTO  DTO info about creation of the computational resource.
-	 * @return 200 OK - if request success, 302 Found - for duplicates.
-	 * @throws IllegalArgumentException if docker image name is malformed
-	 */
-	@PUT
-	@Path("dataengine-service")
-	@Operation(tags = "computational", summary = "Create dataproc cluster")
-	public Response createDataEngineService(@Auth @Parameter(hidden = true) UserInfo userInfo,
-											@Valid @NotNull @Parameter GcpComputationalCreateForm formDTO) {
-
-		log.debug("Create computational resources for {} | form is {}", userInfo.getName(), formDTO);
-
-		if (DataEngineType.CLOUD_SERVICE == DataEngineType.fromDockerImageName(formDTO.getImage())) {
-			validate(userInfo, formDTO);
-			GcpComputationalResource gcpComputationalResource = GcpComputationalResource.builder().computationalName
-					(formDTO.getName())
-					.imageName(formDTO.getImage())
-					.templateName(formDTO.getTemplateName())
-					.status(CREATING.toString())
-					.masterShape(formDTO.getMasterInstanceType())
-					.slaveShape(formDTO.getSlaveInstanceType())
-					.slaveNumber(formDTO.getSlaveInstanceCount())
-					.masterNumber(formDTO.getMasterInstanceCount())
-					.preemptibleNumber(formDTO.getPreemptibleCount())
-					.version(formDTO.getVersion())
-					.build();
-			boolean resourceAdded = computationalService.createDataEngineService(userInfo, formDTO,
-					gcpComputationalResource, formDTO.getProject());
-			return resourceAdded ? Response.ok().build() : Response.status(Response.Status.FOUND).build();
-		}
-
-		throw new IllegalArgumentException("Malformed image " + formDTO.getImage());
-	}
-
-
-	/**
-	 * Asynchronously triggers creation of Spark cluster
-	 *
-	 * @param userInfo user info.
-	 * @param form     DTO info about creation of the computational resource.
-	 * @return 200 OK - if request success, 302 Found - for duplicates.
-	 */
-	@PUT
-	@Path("dataengine")
-	public Response createDataEngine(@Auth UserInfo userInfo,
-									 @Valid @NotNull SparkStandaloneClusterCreateForm form) {
-		log.debug("Create computational resources for {} | form is {}", userInfo.getName(), form);
-
-		if (!UserRoles.checkAccess(userInfo, RoleType.COMPUTATIONAL, form.getImage(), userInfo.getRoles())) {
-			log.warn("Unauthorized attempt to create a {} by user {}", form.getImage(), userInfo.getName());
-			throw new DlabException("You do not have the privileges to create a " + form.getTemplateName());
-		}
-
-		return computationalService.createSparkCluster(userInfo, form, form.getProject())
-				? Response.ok().build()
-				: Response.status(Response.Status.FOUND).build();
-	}
-
-
-	/**
-	 * Sends request to provisioning service for termination the computational resource for user.
-	 *
-	 * @param userInfo          user info.
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @return 200 OK if operation is successfully triggered
-	 */
-	@DELETE
-	@Path("/{projectName}/{exploratoryName}/{computationalName}/terminate")
-	public Response terminate(@Auth UserInfo userInfo,
-							  @PathParam("projectName") String projectName,
-							  @PathParam("exploratoryName") String exploratoryName,
-							  @PathParam("computationalName") String computationalName) {
-		log.debug("Terminating computational resource {} for user {}", computationalName, userInfo.getName());
-
-		computationalService.terminateComputational(userInfo, projectName, exploratoryName, computationalName);
-
-		return Response.ok().build();
-	}
-
-	/**
-	 * Sends request to provisioning service for stopping the computational resource for user.
-	 *
-	 * @param userInfo          user info.
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @return 200 OK if operation is successfully triggered
-	 */
-	@DELETE
-	@Path("/{project}/{exploratoryName}/{computationalName}/stop")
-	public Response stop(@Auth UserInfo userInfo,
-						 @PathParam("project") String project,
-						 @PathParam("exploratoryName") String exploratoryName,
-						 @PathParam("computationalName") String computationalName) {
-		log.debug("Stopping computational resource {} for user {}", computationalName, userInfo.getName());
-
-		computationalService.stopSparkCluster(userInfo, project, exploratoryName, computationalName);
-
-		return Response.ok().build();
-    }
-
-	/**
-	 * Sends request to provisioning service for starting the computational resource for user.
-	 *
-	 * @param userInfo          user info.
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @return 200 OK if operation is successfully triggered
-	 */
-	@PUT
-	@Path("/{project}/{exploratoryName}/{computationalName}/start")
-	public Response start(@Auth UserInfo userInfo,
-						  @PathParam("exploratoryName") String exploratoryName,
-						  @PathParam("computationalName") String computationalName,
-						  @PathParam("project") String project) {
-		log.debug("Starting computational resource {} for user {}", computationalName, userInfo.getName());
-
-		computationalService.startSparkCluster(userInfo, exploratoryName, computationalName, project);
-
-		return Response.ok().build();
-	}
-
-	@PUT
-	@Path("dataengine/{projectName}/{exploratoryName}/{computationalName}/config")
-	public Response updateDataEngineConfig(@Auth UserInfo userInfo,
-										   @PathParam("projectName") String projectName,
-										   @PathParam("exploratoryName") String exploratoryName,
-										   @PathParam("computationalName") String computationalName,
-										   @Valid @NotNull List<ClusterConfig> config) {
-
-		computationalService.updateSparkClusterConfig(userInfo, projectName, exploratoryName, computationalName, config);
-		return Response.ok().build();
-	}
-
-	@GET
-	@Path("/{projectName}/{exploratoryName}/{computationalName}/config")
-	public Response getClusterConfig(@Auth UserInfo userInfo,
-									 @PathParam("projectName") String projectName,
-									 @PathParam("exploratoryName") String exploratoryName,
-									 @PathParam("computationalName") String computationalName) {
-		return Response.ok(computationalService.getClusterConfig(userInfo, projectName, exploratoryName, computationalName)).build();
-	}
-
-	private void validate(@Auth UserInfo userInfo, GcpComputationalCreateForm formDTO) {
-		if (!UserRoles.checkAccess(userInfo, RoleType.COMPUTATIONAL, formDTO.getImage(), userInfo.getRoles())) {
-			log.warn("Unauthorized attempt to create a {} by user {}", formDTO.getImage(), userInfo.getName());
-			throw new DlabException("You do not have the privileges to create a " + formDTO.getTemplateName());
-		}
-
-		int slaveInstanceCount = Integer.parseInt(formDTO.getSlaveInstanceCount());
-		int masterInstanceCount = Integer.parseInt(formDTO.getMasterInstanceCount());
-		final int total = slaveInstanceCount + masterInstanceCount;
-		if (total < configuration.getMinInstanceCount()
-				|| total > configuration.getMaxInstanceCount()) {
-			log.debug("Creating computational resource {} for user {} fail: Limit exceeded to creation total " +
-							"instances. Minimum is {}, maximum is {}", formDTO.getName(), userInfo.getName(),
-					configuration.getMinInstanceCount(), configuration.getMaxInstanceCount());
-			throw new DlabException("Limit exceeded to creation slave instances. Minimum is " + configuration
-					.getMinInstanceCount() + ", maximum is " + configuration.getMaxInstanceCount());
-		}
-
-		final int preemptibleInstanceCount = Integer.parseInt(formDTO.getPreemptibleCount());
-		if (preemptibleInstanceCount < configuration.getMinDataprocPreemptibleCount()) {
-			log.debug("Creating computational resource {} for user {} fail: Limit exceeded to creation preemptible " +
-							"instances. Minimum is {}",
-					formDTO.getName(), userInfo.getName(), configuration.getMinDataprocPreemptibleCount());
-			throw new DlabException("Limit exceeded to creation preemptible instances. " +
-					"Minimum is " + configuration.getMinDataprocPreemptibleCount());
-
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/GcpOauthResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/GcpOauthResource.java
deleted file mode 100644
index 426633d..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/gcp/GcpOauthResource.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources.gcp;
-
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.gcp.auth.GcpOauth2AuthorizationCodeResponse;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.auth.contract.SecurityAPI;
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
-
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.net.URI;
-
-@Path("/user/gcp")
-@Consumes(MediaType.APPLICATION_JSON)
-@Produces(MediaType.APPLICATION_JSON)
-public class GcpOauthResource {
-
-	@Inject
-	@Named(ServiceConsts.SECURITY_SERVICE_NAME)
-	private RESTService securityService;
-
-
-	@GET
-	@Path("/init")
-	public Response redirectedUrl() {
-		return Response
-				.seeOther(URI.create(securityService.get(SecurityAPI.INIT_LOGIN_OAUTH_GCP, String.class)))
-				.build();
-	}
-
-	@GET
-	@Path("/oauth")
-	public Response login(@QueryParam("code") String code, @QueryParam("state") String state,
-						  @QueryParam("error") String error) {
-		return securityService.post(SecurityAPI.LOGIN_OAUTH,
-				new GcpOauth2AuthorizationCodeResponse(code, state, error),
-				Response.class);
-	}
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/RoleType.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/RoleType.java
deleted file mode 100644
index 4ec40d2..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/RoleType.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.roles;
-
-/**
- * Types of roles.
- */
-public enum RoleType {
-	COMPUTATIONAL("computationals"),
-	EXPLORATORY("exploratories"),
-	EXPLORATORY_SHAPES("exploratory_shapes"),
-	COMPUTATIONAL_SHAPES("computational_shapes"),
-	PAGE("pages");
-
-	private String nodeName;
-
-	RoleType(String nodeName) {
-		this.nodeName = nodeName;
-	}
-
-	public static RoleType of(String name) {
-		if (name != null) {
-			for (RoleType value : RoleType.values()) {
-				if (name.equalsIgnoreCase(value.toString())) {
-					return value;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Return name of node in JSON for type.
-	 */
-	public String getNodeName() {
-		return nodeName;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRole.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRole.java
deleted file mode 100644
index e5343dd..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRole.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.roles;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-
-import javax.annotation.Nonnull;
-import java.util.Comparator;
-import java.util.Objects;
-import java.util.Set;
-
-/**
- * Describe role.
- */
-public class UserRole implements Comparable<UserRole> {
-
-	private final String id;
-	/**
-	 * Type of role.
-	 */
-	private final RoleType type;
-
-	/**
-	 * Name of role.
-	 */
-	private final String name;
-
-	/**
-	 * Names of external groups.
-	 */
-	private final Set<String> groups;
-
-	/**
-	 * Name of DLab's users.
-	 */
-	private final Set<String> users;
-
-	/**
-	 * Instantiate the role.
-	 *
-	 * @param id
-	 * @param type   type of role.
-	 * @param name   the name of role.
-	 * @param groups the names of external groups.
-	 * @param users  the name of DLab's users.
-	 */
-	UserRole(String id, RoleType type, String name, Set<String> groups, Set<String> users) {
-		this.id = id;
-		this.type = type;
-		this.name = name;
-		this.groups = groups;
-		this.users = users;
-	}
-
-	/**
-	 * Return the type of role.
-	 */
-	public RoleType getType() {
-		return type;
-	}
-
-	/**
-	 * Return the name of role.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Return the names of external groups.
-	 */
-	public Set<String> getGroups() {
-		return groups;
-	}
-
-	/**
-	 * Return the name of DLab's users.
-	 */
-	public Set<String> getUsers() {
-		return users;
-	}
-
-	public String getId() {
-		return id;
-	}
-
-	@Override
-	public int compareTo(@Nonnull UserRole o) {
-		return Comparator.comparing(UserRole::getType)
-				.thenComparing(UserRole::getName)
-				.thenComparing(UserRole::getId, Comparator.nullsLast(String::compareToIgnoreCase))
-				.compare(this, o);
-	}
-
-	private ToStringHelper toStringHelper(Object self) {
-		return MoreObjects.toStringHelper(self)
-				.add("type", type)
-				.add("name", name)
-				.add("groups", groups)
-				.add("users", users);
-	}
-
-	@Override
-	public boolean equals(Object o) {
-		if (this == o) return true;
-		if (o == null || getClass() != o.getClass()) return false;
-		UserRole userRole = (UserRole) o;
-		return this.id.equals(userRole.getId()) && this.type.equals(userRole.getType()) && this.name.equals(userRole.getName());
-	}
-
-	@Override
-	public int hashCode() {
-		return Objects.hash(type, name);
-	}
-
-	@Override
-	public String toString() {
-		return toStringHelper(this).toString();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRoles.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRoles.java
deleted file mode 100644
index 9be9578..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/roles/UserRoles.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.roles;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.SecurityDAO;
-import com.epam.dlab.exceptions.DlabException;
-import com.google.common.base.MoreObjects;
-import com.mongodb.client.FindIterable;
-import org.bson.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Provides user roles access to features.
- */
-public class UserRoles {
-	private static final Logger LOGGER = LoggerFactory.getLogger(UserRoles.class);
-
-	private static final String ANY_USER = "$anyuser";
-	/**
-	 * Node name of groups.
-	 */
-	private static final String GROUPS = "groups";
-	/**
-	 * Node name of user.
-	 */
-	private static final String USERS = "users";
-	private static final String PROJECT_ADMIN_ROLE_NAME = "projectAdmin";
-	private static final String ADMIN_ROLE_NAME = "admin";
-	/**
-	 * Single instance of the user roles.
-	 */
-	private static UserRoles userRoles = null;
-	/**
-	 * List of roles.
-	 */
-	private List<UserRole> roles = null;
-	private Map<String, Set<String>> userGroups;
-
-	/**
-	 * Default access to features if the role is not defined.
-	 */
-	private boolean defaultAccess = false;
-
-	/**
-	 * Initialize user roles for all users.
-	 *
-	 * @param dao security DAO.
-	 */
-	public static void initialize(SecurityDAO dao, boolean defaultAccess) {
-		LOGGER.trace("Loading roles from database...");
-		if (userRoles == null) {
-			userRoles = new UserRoles();
-		}
-		userRoles.load(dao, defaultAccess);
-		LOGGER.trace("New roles are	: {}", getRoles());
-	}
-
-	/**
-	 * Return the list of roles for all users.
-	 */
-	public static List<UserRole> getRoles() {
-		return (userRoles == null ? null : userRoles.roles());
-	}
-
-	/**
-	 * Check access for user to the role.
-	 *
-	 * @param userInfo user info.
-	 * @param type     the type of role.
-	 * @param name     the name of role.
-	 * @param roles
-	 * @return boolean value
-	 */
-	public static boolean checkAccess(UserInfo userInfo, RoleType type, String name, Collection<String> roles) {
-		return checkAccess(userInfo, type, name, true, roles);
-	}
-
-	public static boolean isProjectAdmin(UserInfo userInfo) {
-		final List<UserRole> roles = UserRoles.getRoles();
-		return roles == null || roles.stream().anyMatch(r -> PROJECT_ADMIN_ROLE_NAME.equalsIgnoreCase(r.getId()) &&
-				(userRoles.hasAccessByGroup(userInfo, userInfo.getRoles(), r.getGroups()) || userRoles.hasAccessByUserName(userInfo, r)));
-	}
-
-	public static boolean isProjectAdmin(UserInfo userInfo, Set<String> groups) {
-		final List<UserRole> roles = UserRoles.getRoles();
-		return roles == null || roles.stream().anyMatch(r -> PROJECT_ADMIN_ROLE_NAME.equalsIgnoreCase(r.getId()) &&
-				(userRoles.hasAccessByGroup(userInfo, userInfo.getRoles(), retainGroups(r.getGroups(), groups)) || userRoles.hasAccessByUserName(userInfo, r)));
-	}
-
-	public static boolean isAdmin(UserInfo userInfo) {
-		final List<UserRole> roles = UserRoles.getRoles();
-		return roles == null || roles.stream().anyMatch(r -> ADMIN_ROLE_NAME.equalsIgnoreCase(r.getId()) &&
-				(userRoles.hasAccessByGroup(userInfo, userInfo.getRoles(), r.getGroups()) || userRoles.hasAccessByUserName(userInfo, r)));
-	}
-
-	/**
-	 * Check access for user to the role.
-	 *
-	 * @param roles
-	 * @param userInfo user info.
-	 * @param type     the type of role.
-	 * @param name     the name of role.
-	 * @return boolean value
-	 */
-	public static boolean checkAccess(UserInfo userInfo, RoleType type, String name, boolean useDefault,
-									  Collection<String> roles) {
-		return (userRoles == null || userRoles.hasAccess(userInfo, type, name, useDefault, roles));
-	}
-
-	/**
-	 * Loading the user roles for all users from Mongo database.
-	 *
-	 * @param dao security DAO.
-	 */
-	private synchronized void load(SecurityDAO dao, boolean defaultAccess) {
-		this.defaultAccess = defaultAccess;
-		try {
-			FindIterable<Document> docs = dao.getRoles();
-			roles = new ArrayList<>();
-			for (Document d : docs) {
-				Set<String> groups = getAndRemoveSet(d, GROUPS);
-				Set<String> users = getAndRemoveSet(d, USERS);
-				String id = d.getString("_id");
-				for (RoleType type : RoleType.values()) {
-					@SuppressWarnings("unchecked")
-					List<String> names = d.get(type.getNodeName(), ArrayList.class);
-					if (names != null) {
-						for (String name : names) {
-							append(type, name, groups, users, id);
-						}
-					}
-				}
-			}
-			userGroups = dao.getGroups();
-		} catch (Exception e) {
-			throw new DlabException("Cannot load roles from database. " + e.getLocalizedMessage(), e);
-		}
-	}
-
-	private synchronized List<UserRole> roles() {
-		return roles;
-	}
-
-	/**
-	 * Append new role to the list if role not exists in list an return it, otherwise return
-	 * existence role.
-	 *
-	 * @param type   type of role.
-	 * @param name   the name of role.
-	 * @param groups the names of external groups.
-	 * @param users  the name of DLab's users.
-	 * @param id
-	 * @return role.
-	 */
-	private UserRole append(RoleType type, String name, Set<String> groups, Set<String> users, String id) {
-		UserRole item = new UserRole(id, type, name, groups, users);
-		synchronized (roles) {
-			int index = Collections.binarySearch(roles, item);
-			if (index < 0) {
-				index = -index;
-				if (index > roles.size()) {
-					roles.add(item);
-				} else {
-					roles.add(index - 1, item);
-				}
-			}
-		}
-		return item;
-	}
-
-	/**
-	 * Find and return role by type and name.
-	 *
-	 * @param type type of role.
-	 * @param name the name of role.
-	 * @return list of UserRole
-	 */
-	private Set<String> getGroups(RoleType type, String name) {
-		synchronized (roles) {
-			return roles
-					.stream()
-					.filter(r -> type == r.getType() && name.equalsIgnoreCase(r.getName()))
-					.map(UserRole::getGroups)
-					.flatMap(Collection::stream)
-					.collect(Collectors.toSet());
-		}
-	}
-
-	/**
-	 * Find and return a list by key from JSON document, otherwise return <b>null</b>.
-	 *
-	 * @param document the document.
-	 * @param key      the name of node.
-	 */
-	private Set<String> getAndRemoveSet(Document document, String key) {
-		Object o = document.get(key);
-		if (!(o instanceof ArrayList)) {
-			return Collections.emptySet();
-		}
-
-		@SuppressWarnings("unchecked")
-		List<String> list = (List<String>) o;
-		if (list.isEmpty()) {
-			return Collections.emptySet();
-		}
-
-		Set<String> set = new HashSet<>();
-		for (String value : list) {
-			set.add(value.toLowerCase());
-		}
-		document.remove(key);
-		return set;
-	}
-
-	/**
-	 * Check access for user to the role.
-	 *
-	 * @param userInfo   user info.
-	 * @param type       the type of role.
-	 * @param name       the name of role.
-	 * @param useDefault true/false
-	 * @param roles
-	 * @return boolean value
-	 */
-	private boolean hasAccess(UserInfo userInfo, RoleType type, String name, boolean useDefault,
-							  Collection<String> roles) {
-		if (userRoles == null) {
-			return true;
-		}
-		LOGGER.trace("Check access for user {} with groups {} to {}/{}", userInfo.getName(), userInfo.getRoles(),
-				type, name);
-		Set<String> groups = getGroups(type, name);
-		if (groups == null || groups.isEmpty()) {
-			return checkDefault(useDefault);
-		}
-		if (hasAccessByGroup(userInfo, roles, groups)) {
-			return true;
-		}
-		LOGGER.trace("Access denied for user {} to {}/{}", userInfo.getName(), type, name);
-		return false;
-	}
-
-	private boolean hasAccessByGroup(UserInfo userInfo, Collection<String> userRoles, Collection<String> groups) {
-		if (groups != null) {
-			if (groups.contains(ANY_USER)) {
-				return true;
-			}
-			for (String group : userRoles) {
-				if (group != null && groups.contains(group.toLowerCase())) {
-					LOGGER.trace("Got access by group {}", group);
-					return true;
-				}
-			}
-
-			final Optional<String> group = groups
-					.stream()
-					.filter(g -> userGroups.getOrDefault(g, Collections.emptySet()).contains(userInfo.getName().toLowerCase()))
-					.findAny();
-			if (group.isPresent()) {
-				LOGGER.trace("Got access by local group {}", group.get());
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean hasAccessByUserName(UserInfo userInfo, UserRole role) {
-		if (role.getUsers() != null &&
-				userInfo.getName() != null &&
-				(role.getUsers().contains(ANY_USER) ||
-						role.getUsers().contains(userInfo.getName().toLowerCase()))) {
-			LOGGER.trace("Got access by name");
-			return true;
-		}
-		return false;
-	}
-
-	private boolean checkDefault(boolean useDefault) {
-		if (useDefault) {
-			LOGGER.trace("Got default access {}", defaultAccess);
-			return defaultAccess;
-		} else {
-			return false;
-		}
-	}
-
-	private static Set<String> retainGroups(Set<String> groups1, Set<String> groups2) {
-		Set<String> result = groups2
-				.stream()
-				.map(String::toLowerCase)
-				.collect(Collectors.toSet());
-		result.retainAll(groups1);
-
-		return result;
-	}
-
-	@Override
-	public String toString() {
-		return MoreObjects.toStringHelper(roles)
-				.addValue(roles)
-				.toString();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckApplicationQuoteScheduler.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckApplicationQuoteScheduler.java
deleted file mode 100644
index bca047c..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckApplicationQuoteScheduler.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers;
-
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.schedulers.internal.Scheduled;
-import com.epam.dlab.backendapi.service.EnvironmentService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-
-@Scheduled("checkQuoteScheduler")
-@Slf4j
-public class CheckApplicationQuoteScheduler implements Job {
-	@Inject
-	private BillingDAO billingDAO;
-	@Inject
-	private EnvironmentService environmentService;
-
-	@Override
-	public void execute(JobExecutionContext context) {
-		if (billingDAO.isBillingQuoteReached()) {
-			log.warn("Stopping all environments because of reaching budget quote");
-			environmentService.stopAll();
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckInactivityScheduledJob.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckInactivityScheduledJob.java
deleted file mode 100644
index 482576a..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckInactivityScheduledJob.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.schedulers;
-
-import com.epam.dlab.backendapi.schedulers.internal.Scheduled;
-import com.epam.dlab.backendapi.service.InactivityService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-
-/**
- * There realized integration with Quartz scheduler framework and defined check cluster inactivity scheduler job which
- * executes every time specified. If in 'self-service.yml' option 'clusterInactivityCheckerEnabled' equals 'true' then
- * this job we be executing every time predefined in option 'clusterInactivityCheckingTimeout'. Otherwise, it will
- * never execute.
- */
-@Slf4j
-@Scheduled("inactivity")
-public class CheckInactivityScheduledJob implements Job {
-
-	@Inject
-	private InactivityService inactivityService;
-
-	@Override
-	public void execute(JobExecutionContext context) {
-		log.trace("Starting check inactivity job");
-		inactivityService.updateRunningResourcesLastActivity();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckProjectQuoteScheduler.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckProjectQuoteScheduler.java
deleted file mode 100644
index 030c10d..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckProjectQuoteScheduler.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers;
-
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.schedulers.internal.Scheduled;
-import com.epam.dlab.backendapi.service.EnvironmentService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-
-@Scheduled("checkProjectQuoteScheduler")
-@Slf4j
-public class CheckProjectQuoteScheduler implements Job {
-
-	@Inject
-	private BillingDAO billingDAO;
-	@Inject
-	private EnvironmentService environmentService;
-	@Inject
-	private ProjectService projectService;
-
-	@Override
-	public void execute(JobExecutionContext context) {
-		projectService.getProjects()
-				.stream()
-				.map(ProjectDTO::getName)
-				.filter(billingDAO::isProjectQuoteReached)
-				.peek(p -> log.debug("Stopping {} project env because of reaching user billing quote", p))
-				.forEach(environmentService::stopProjectEnvironment);
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckUserQuoteScheduler.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckUserQuoteScheduler.java
deleted file mode 100644
index 1e2e7f4..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/CheckUserQuoteScheduler.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers;
-
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.resources.dto.UserDTO;
-import com.epam.dlab.backendapi.schedulers.internal.Scheduled;
-import com.epam.dlab.backendapi.service.EnvironmentService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-
-@Scheduled("checkUserQuoteScheduler")
-@Slf4j
-public class CheckUserQuoteScheduler implements Job {
-
-	@Inject
-	private BillingDAO billingDAO;
-	@Inject
-	private EnvironmentService environmentService;
-
-	@Override
-	public void execute(JobExecutionContext context) {
-		environmentService.getUsers()
-				.stream()
-				.map(UserDTO::getName)
-				.filter(billingDAO::isUserQuoteReached)
-				.peek(u -> log.warn("Stopping {} user env because of reaching user billing quote", u))
-				.forEach(environmentService::stopEnvironmentWithServiceAccount);
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/billing/BillingScheduler.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/billing/BillingScheduler.java
deleted file mode 100644
index 45563a2..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/billing/BillingScheduler.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers.billing;
-
-import com.epam.dlab.backendapi.schedulers.internal.Scheduled;
-import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-
-@Scheduled("billingScheduler")
-@Slf4j
-public class BillingScheduler implements Job {
-
-    private final BillingService billingService;
-    private final SecurityService securityService;
-
-    @Inject
-    public BillingScheduler(BillingService billingService, SecurityService securityService) {
-        this.billingService = billingService;
-        this.securityService = securityService;
-    }
-
-    @Override
-    public void execute(JobExecutionContext jobExecutionContext) {
-        log.info("Trying to update billing");
-        try {
-            billingService.updateRemoteBillingData(securityService.getServiceAccountInfo("admin"));
-        } catch (Exception e) {
-            log.error("Something went wrong {}", e.getMessage());
-        }
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/computational/StartComputationalJob.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/computational/StartComputationalJob.java
deleted file mode 100644
index 5a6eb11..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/computational/StartComputationalJob.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers.computational;
-
-import com.epam.dlab.backendapi.schedulers.internal.Scheduled;
-import com.epam.dlab.backendapi.service.SchedulerJobService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-
-/**
- * There realized integration with Quartz scheduler framework and defined start computational resource scheduler job
- * which executes every time specified.
- */
-@Slf4j
-@Scheduled("startComputationalScheduler")
-public class StartComputationalJob implements Job {
-
-	@Inject
-	private SchedulerJobService schedulerJobService;
-
-	@Override
-	public void execute(JobExecutionContext jobExecutionContext) {
-		schedulerJobService.startComputationalByScheduler();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/computational/StopComputationalJob.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/computational/StopComputationalJob.java
deleted file mode 100644
index 3825d08..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/computational/StopComputationalJob.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers.computational;
-
-import com.epam.dlab.backendapi.schedulers.internal.Scheduled;
-import com.epam.dlab.backendapi.service.SchedulerJobService;
-import com.google.inject.Inject;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-
-/**
- * There realized integration with Quartz scheduler framework and defined stop computational resource scheduler job
- * which executes every time specified.
- */
-@Scheduled("stopComputationalScheduler")
-public class StopComputationalJob implements Job {
-
-	@Inject
-	private SchedulerJobService schedulerJobService;
-
-	@Override
-	public void execute(JobExecutionContext jobExecutionContext) {
-		schedulerJobService.stopComputationalByScheduler();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/computational/TerminateComputationalJob.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/computational/TerminateComputationalJob.java
deleted file mode 100644
index 765a6e8..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/computational/TerminateComputationalJob.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers.computational;
-
-import com.epam.dlab.backendapi.schedulers.internal.Scheduled;
-import com.epam.dlab.backendapi.service.SchedulerJobService;
-import com.google.inject.Inject;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-
-@Scheduled("terminateComputationalScheduler")
-public class TerminateComputationalJob implements Job {
-	private final SchedulerJobService schedulerJobService;
-
-	@Inject
-	public TerminateComputationalJob(SchedulerJobService schedulerJobService) {
-		this.schedulerJobService = schedulerJobService;
-	}
-
-	@Override
-	public void execute(JobExecutionContext context) {
-		schedulerJobService.terminateComputationalByScheduler();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java
deleted file mode 100644
index 5707553..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/endpoint/CheckEndpointStatusScheduler.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers.endpoint;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.schedulers.internal.Scheduled;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-
-@Scheduled("checkEndpointStatusScheduler")
-@Slf4j
-public class CheckEndpointStatusScheduler implements Job {
-
-    @Inject
-    private EndpointService endpointService;
-    @Inject
-    private SecurityService securityService;
-
-    @Override
-    public void execute(JobExecutionContext jobExecutionContext) {
-        UserInfo serviceUser = securityService.getServiceAccountInfo("admin");
-        endpointService.getEndpoints().stream()
-                .filter(endpoint -> checkUrlWithStatus(serviceUser, endpoint))
-                .forEach(this::changeStatusToOpposite);
-    }
-
-    private boolean checkUrlWithStatus(UserInfo serviceUser, EndpointDTO endpoint) {
-        try {
-            endpointService.checkUrl(serviceUser, endpoint.getUrl());
-        } catch (Exception e) {
-            log.warn("Failed connecting to endpoint {}, url: '{}'. {}", endpoint.getName(), endpoint.getUrl(), e.getMessage());
-            return endpoint.getStatus() == EndpointDTO.EndpointStatus.ACTIVE;
-        }
-        return endpoint.getStatus() == EndpointDTO.EndpointStatus.INACTIVE;
-    }
-
-    private void changeStatusToOpposite(EndpointDTO endpoint) {
-        if (endpoint.getStatus() == EndpointDTO.EndpointStatus.ACTIVE) {
-            endpointService.updateEndpointStatus(endpoint.getName(), EndpointDTO.EndpointStatus.INACTIVE);
-        } else {
-            endpointService.updateEndpointStatus(endpoint.getName(), EndpointDTO.EndpointStatus.ACTIVE);
-        }
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/exploratory/StartExploratoryJob.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/exploratory/StartExploratoryJob.java
deleted file mode 100644
index 63fbee3..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/exploratory/StartExploratoryJob.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers.exploratory;
-
-import com.epam.dlab.backendapi.schedulers.internal.Scheduled;
-import com.epam.dlab.backendapi.service.SchedulerJobService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-
-/**
- * There realized integration with Quartz scheduler framework and defined start exploratory scheduler job which
- * executes every time specified.
- */
-@Slf4j
-@Scheduled("startExploratoryScheduler")
-public class StartExploratoryJob implements Job {
-
-	@Inject
-	private SchedulerJobService schedulerJobService;
-
-	@Override
-	public void execute(JobExecutionContext jobExecutionContext) {
-		schedulerJobService.startExploratoryByScheduler();
-	}
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/exploratory/StopExploratoryJob.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/exploratory/StopExploratoryJob.java
deleted file mode 100644
index 576a85e..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/exploratory/StopExploratoryJob.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers.exploratory;
-
-import com.epam.dlab.backendapi.schedulers.internal.Scheduled;
-import com.epam.dlab.backendapi.service.SchedulerJobService;
-import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-
-/**
- * There realized integration with Quartz scheduler framework and defined stop exploratory scheduler job which
- * executes every time specified.
- */
-@Slf4j
-@Scheduled("stopExploratoryScheduler")
-public class StopExploratoryJob implements Job {
-
-	@Inject
-	private SchedulerJobService schedulerJobService;
-
-	@Override
-	public void execute(JobExecutionContext jobExecutionContext) {
-		schedulerJobService.stopExploratoryByScheduler();
-	}
-
-}
-
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/internal/ManagedScheduler.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/internal/ManagedScheduler.java
deleted file mode 100644
index c7eddd8..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/internal/ManagedScheduler.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers.internal;
-
-import com.epam.dlab.backendapi.SelfServiceApplication;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.domain.SchedulerConfigurationData;
-import com.epam.dlab.exceptions.DlabException;
-import com.fiestacabin.dropwizard.quartz.GuiceJobFactory;
-import com.google.inject.Inject;
-import io.dropwizard.lifecycle.Managed;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.*;
-import org.reflections.Reflections;
-import org.reflections.scanners.SubTypesScanner;
-
-import java.util.Optional;
-
-import static org.quartz.JobBuilder.newJob;
-import static org.quartz.TriggerBuilder.newTrigger;
-
-@Slf4j
-public class ManagedScheduler implements Managed {
-	private final Scheduler scheduler;
-	private final GuiceJobFactory jobFactory;
-	private final SelfServiceApplicationConfiguration config;
-
-	@Inject
-	public ManagedScheduler(Scheduler scheduler, GuiceJobFactory jobFactory,
-							SelfServiceApplicationConfiguration config) {
-		this.scheduler = scheduler;
-		this.jobFactory = jobFactory;
-		this.config = config;
-	}
-
-	@Override
-	public void start() throws Exception {
-		scheduler.setJobFactory(jobFactory);
-		scheduler.start();
-
-		new Reflections(SelfServiceApplication.class.getPackage().getName(), new SubTypesScanner())
-				.getSubTypesOf(Job.class)
-				.forEach(scheduledClass ->
-						Optional.ofNullable(scheduledClass.getAnnotation(Scheduled.class))
-								.filter(this::triggerNotExist)
-								.ifPresent(scheduleAnn -> schedule(scheduledClass, scheduleAnn)));
-
-	}
-
-	@Override
-	public void stop() throws Exception {
-		scheduler.shutdown();
-	}
-
-	private Trigger getTrigger(SchedulerConfigurationData schedulerConfig, String schedulerName) {
-		return newTrigger()
-				.withIdentity(schedulerName)
-				.withSchedule(CronScheduleBuilder.cronSchedule(schedulerConfig.getCron()))
-				.startNow()
-				.build();
-	}
-
-	private void schedule(Class<? extends Job> scheduledClass, Scheduled scheduleAnn) {
-		final String schedulerName = scheduleAnn.value();
-		final SchedulerConfigurationData schedulerConfig =
-				Optional.ofNullable(config.getSchedulers().get(schedulerName)).orElseThrow(() -> new IllegalStateException(
-						"There is no configuration provided for scheduler with name " + schedulerName));
-		if (schedulerConfig.isEnabled()) {
-			scheduleJob(newJob(scheduledClass).build(), schedulerConfig, scheduleAnn.value());
-		}
-	}
-
-	private void scheduleJob(JobDetail job, SchedulerConfigurationData schedulerConfig, String schedulerName) {
-		try {
-			final Trigger trigger = getTrigger(schedulerConfig, schedulerName);
-			scheduler.scheduleJob(job, trigger);
-			log.info("Scheduled job {} with trigger {}", job, trigger);
-		} catch (SchedulerException e) {
-			log.error("Can't schedule job due to: {}", e.getMessage());
-			throw new DlabException("Can't schedule job due to: " + e.getMessage(), e);
-		}
-	}
-
-	private boolean triggerNotExist(Scheduled scheduled) {
-		try {
-			return !scheduler.checkExists(new TriggerKey(scheduled.value()));
-		} catch (SchedulerException e) {
-			log.error("Can not check if trigger exist due to: {}", e.getMessage());
-			throw new DlabException("Can not check if trigger exist due to: {}" + e.getMessage(), e);
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/internal/Scheduled.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/internal/Scheduled.java
deleted file mode 100644
index 50fca1c..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/schedulers/internal/Scheduled.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers.internal;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation is used as alternative to {@link com.fiestacabin.dropwizard.quartz.Scheduled}
- * and allow to use scheduler configuration from application config
- * }
- */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Scheduled {
-	/**
-	 * @return scheduler name
-	 */
-	String value();
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/AccessKeyService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/AccessKeyService.java
deleted file mode 100644
index c037285..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/AccessKeyService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.KeysDTO;
-
-public interface AccessKeyService {
-
-	KeysDTO generateKeys(UserInfo userInfo);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ApplicationSettingService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ApplicationSettingService.java
deleted file mode 100644
index 5a434b5..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ApplicationSettingService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import java.util.Map;
-
-public interface ApplicationSettingService {
-
-	void removeMaxBudget();
-
-	void setMaxBudget(Long maxBudget);
-
-	Map<String, Object> getSettings();
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ApplicationSettingServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ApplicationSettingServiceImpl.java
deleted file mode 100644
index fcdd28a..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ApplicationSettingServiceImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-import com.epam.dlab.backendapi.dao.MongoSetting;
-import com.epam.dlab.backendapi.dao.SettingsDAO;
-import com.google.inject.Inject;
-
-import java.util.Map;
-
-public class ApplicationSettingServiceImpl implements ApplicationSettingService {
-	@Inject
-	private SettingsDAO settingsDAO;
-
-	@Override
-	public void removeMaxBudget() {
-		settingsDAO.removeSetting(MongoSetting.CONF_MAX_BUDGET);
-	}
-
-	@Override
-	public void setMaxBudget(Long maxBudget) {
-		settingsDAO.setMaxBudget(maxBudget);
-	}
-
-	@Override
-	public Map<String, Object> getSettings() {
-		return settingsDAO.getSettings();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BackupService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BackupService.java
deleted file mode 100644
index af8f0c1..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BackupService.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.BackupInfoRecord;
-import com.epam.dlab.dto.backup.EnvBackupDTO;
-import com.epam.dlab.dto.backup.EnvBackupStatus;
-
-import java.util.List;
-
-public interface BackupService {
-	String createBackup(EnvBackupDTO dto, UserInfo userInfo);
-
-	void updateStatus(EnvBackupDTO dto, String user, EnvBackupStatus status);
-
-	List<BackupInfoRecord> getBackups(String userName);
-
-	BackupInfoRecord getBackup(String userName, String id);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BillingService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BillingService.java
deleted file mode 100644
index b76b141..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BillingService.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.BillingReport;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-
-import java.util.List;
-
-public interface BillingService {
-    BillingReport getBillingReport(UserInfo userInfo, BillingFilter filter);
-
-    String downloadReport(UserInfo userInfo, BillingFilter filter);
-
-    BillingReport getExploratoryBillingData(String project, String endpoint, String exploratoryName, List<String> compNames);
-
-    void updateRemoteBillingData(UserInfo userInfo);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ComputationalService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ComputationalService.java
deleted file mode 100644
index 4a6f392..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ComputationalService.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.ComputationalCreateFormDTO;
-import com.epam.dlab.backendapi.resources.dto.ComputationalTemplatesDTO;
-import com.epam.dlab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-
-import java.util.List;
-import java.util.Optional;
-
-public interface ComputationalService {
-	ComputationalTemplatesDTO getComputationalNamesAndTemplates(UserInfo user, String project, String endpoint);
-
-	/**
-	 * Asynchronously triggers creation of Spark cluster
-	 *
-	 * @param userInfo user authentication info
-	 * @param form     input cluster parameters
-	 * @return <code>true</code> if action is successfully triggered, <code>false</code>false if cluster with the same
-	 * name already exists
-	 * @throws IllegalArgumentException if input parameters exceed limits or docker image name is malformed
-	 */
-	boolean createSparkCluster(UserInfo userInfo, SparkStandaloneClusterCreateForm form, String project);
-
-	/**
-	 * Asynchronously triggers termination of computational resources
-	 *
-	 * @param userInfo          user info of authenticated user
-	 * @param project           project name
-	 * @param exploratoryName   name of exploratory where to terminate computational resources with
-	 *                          <code>computationalName</code>
-	 * @param computationalName computational name
-	 */
-	void terminateComputational(UserInfo userInfo, String project, String exploratoryName, String computationalName);
-
-	boolean createDataEngineService(UserInfo userInfo, ComputationalCreateFormDTO formDTO, UserComputationalResource
-			computationalResource, String project);
-
-	void stopSparkCluster(UserInfo userInfo, String project, String exploratoryName, String computationalName);
-
-	void startSparkCluster(UserInfo userInfo, String exploratoryName, String computationalName, String project);
-
-	void updateSparkClusterConfig(UserInfo userInfo, String project, String exploratoryName, String computationalName,
-								  List<ClusterConfig> config);
-
-	Optional<UserComputationalResource> getComputationalResource(String user, String project, String exploratoryName,
-																 String computationalName);
-
-	List<ClusterConfig> getClusterConfig(UserInfo userInfo, String project, String exploratoryName, String computationalName);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
deleted file mode 100644
index abd28d6..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EndpointService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.EndpointResourcesDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.cloud.CloudProvider;
-
-import java.util.List;
-
-public interface EndpointService {
-	List<EndpointDTO> getEndpoints();
-
-	List<EndpointDTO> getEndpointsWithStatus(EndpointDTO.EndpointStatus status);
-
-	EndpointResourcesDTO getEndpointResources(String endpoint);
-
-	EndpointDTO get(String name);
-
-	void create(UserInfo userInfo, EndpointDTO endpointDTO);
-
-	void updateEndpointStatus(String name, EndpointDTO.EndpointStatus status);
-
-	void remove(UserInfo userInfo, String name, boolean withResources);
-
-	void removeEndpointInAllProjects(UserInfo userInfo, String endpointName, List<ProjectDTO> projects);
-
-    CloudProvider checkUrl(UserInfo userInfo, String url);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EnvironmentService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EnvironmentService.java
deleted file mode 100644
index 8abfdd3..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/EnvironmentService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.UserDTO;
-import com.epam.dlab.backendapi.resources.dto.UserResourceInfo;
-
-import java.util.List;
-
-public interface EnvironmentService {
-	List<UserDTO> getUsers();
-
-	List<UserResourceInfo> getAllEnv(UserInfo user);
-
-	void stopAll();
-
-	void stopEnvironmentWithServiceAccount(String user);
-
-	void stopEnvironmentWithServiceAccount(String user);
-
-	void stopProjectEnvironment(String project);
-
-	void stopExploratory(UserInfo userInfo, String user, String project, String exploratoryName);
-
-	void stopComputational(UserInfo userInfo, String user, String project, String exploratoryName, String computationalName);
-
-	void terminateExploratory(UserInfo userInfo, String user, String project, String exploratoryName);
-
-	void terminateComputational(UserInfo userInfo, String user, String project, String exploratoryName, String computationalName);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ExploratoryService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ExploratoryService.java
deleted file mode 100644
index 807df17..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ExploratoryService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.resources.dto.ExploratoryCreatePopUp;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.model.exploratory.Exploratory;
-
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-
-public interface ExploratoryService {
-
-    String start(UserInfo userInfo, String exploratoryName, String project);
-
-    String stop(UserInfo userInfo, String project, String exploratoryName);
-
-    String terminate(UserInfo userInfo, String project, String exploratoryName);
-
-    String create(UserInfo userInfo, Exploratory exploratory, String project);
-
-    void updateProjectExploratoryStatuses(String project, String endpoint, UserInstanceStatus status);
-
-    void updateClusterConfig(UserInfo userInfo, String project, String exploratoryName, List<ClusterConfig> config);
-
-    Optional<UserInstanceDTO> getUserInstance(String user, String project, String exploratoryName);
-
-    Optional<UserInstanceDTO> getUserInstance(String user, String project, String exploratoryName, boolean includeCompResources);
-
-    List<UserInstanceDTO> findAll();
-
-    List<UserInstanceDTO> findAll(Set<ProjectDTO> projects);
-
-    List<ClusterConfig> getClusterConfig(UserInfo user, String project, String exploratoryName);
-
-    ExploratoryCreatePopUp getUserInstances(UserInfo user);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ExternalLibraryService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ExternalLibraryService.java
deleted file mode 100644
index 9298c5c..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ExternalLibraryService.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
-
-public interface ExternalLibraryService {
-
-	LibraryDTO getLibrary(String groupId, String artifactId, String version);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/GitCredentialService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/GitCredentialService.java
deleted file mode 100644
index 2df8ee4..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/GitCredentialService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsDTO;
-
-public interface GitCredentialService {
-	void updateGitCredentials(UserInfo userInfo, ExploratoryGitCredsDTO dto);
-
-	ExploratoryGitCredsDTO getGitCredentials(String user);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/GuacamoleService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/GuacamoleService.java
deleted file mode 100644
index 776e409..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/GuacamoleService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import org.apache.guacamole.net.GuacamoleTunnel;
-
-public interface GuacamoleService {
-
-	GuacamoleTunnel getTunnel(UserInfo userInfo, String host, String endpoint);
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ImageExploratoryService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ImageExploratoryService.java
deleted file mode 100644
index 604bdcf..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ImageExploratoryService.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.ImageInfoRecord;
-import com.epam.dlab.model.exploratory.Image;
-
-import java.util.List;
-
-public interface ImageExploratoryService {
-
-    String createImage(UserInfo user, String project, String exploratoryName, String imageName, String imageDescription);
-
-    void finishImageCreate(Image image, String exploratoryName, String newNotebookIp);
-
-    List<ImageInfoRecord> getNotFailedImages(String user, String dockerImage, String project, String endpoint);
-
-    ImageInfoRecord getImage(String user, String name, String project, String endpoint);
-
-    List<ImageInfoRecord> getImagesForProject(String project);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InactivityService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InactivityService.java
deleted file mode 100644
index 038a7b6..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InactivityService.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-
-import java.time.LocalDateTime;
-
-public interface InactivityService {
-
-    void updateRunningResourcesLastActivity();
-
-    void updateLastActivityForExploratory(UserInfo userInfo, String exploratoryName, LocalDateTime lastActivity);
-
-    void updateLastActivityForComputational(UserInfo userInfo, String project, String exploratoryName,
-                                            String computationalName, LocalDateTime lastActivity);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java
deleted file mode 100644
index ffb3531..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureInfoService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
-import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
-import com.epam.dlab.dto.InfrastructureMetaInfoDTO;
-
-import java.util.List;
-
-public interface InfrastructureInfoService {
-	List<ProjectInfrastructureInfo> getUserResources(UserInfo user);
-
-	HealthStatusPageDTO getHeathStatus(UserInfo user, boolean fullReport);
-
-	InfrastructureMetaInfoDTO getInfrastructureMetaInfo();
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureTemplateService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureTemplateService.java
deleted file mode 100644
index c5219ee..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/InfrastructureTemplateService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.dto.base.computational.FullComputationalTemplate;
-import com.epam.dlab.dto.imagemetadata.ExploratoryMetadataDTO;
-
-import java.util.List;
-
-public interface InfrastructureTemplateService {
-	List<ExploratoryMetadataDTO> getExploratoryTemplates(UserInfo user, String project, String endpoint);
-
-	List<FullComputationalTemplate> getComputationalTemplates(UserInfo user, String project, String endpoint);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/KeycloakService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/KeycloakService.java
deleted file mode 100644
index 2259426..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/KeycloakService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import org.keycloak.representations.AccessTokenResponse;
-
-public interface KeycloakService {
-	AccessTokenResponse getToken(String code);
-	AccessTokenResponse refreshToken(String refreshToken);
-	AccessTokenResponse generateAccessToken(String refreshToken);
-	AccessTokenResponse generateServiceAccountToken();
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/KeycloakServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/KeycloakServiceImpl.java
deleted file mode 100644
index 04cf8d9..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/KeycloakServiceImpl.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.SecurityDAO;
-import com.epam.dlab.backendapi.util.KeycloakUtil;
-import com.epam.dlab.exceptions.DlabException;
-import com.google.inject.Inject;
-import de.ahus1.keycloak.dropwizard.KeycloakConfiguration;
-import lombok.extern.slf4j.Slf4j;
-import org.glassfish.jersey.internal.util.Base64;
-import org.keycloak.representations.AccessTokenResponse;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Response;
-
-@Slf4j
-public class KeycloakServiceImpl implements KeycloakService {
-
-	private static final String URI = "/realms/%s/protocol/openid-connect/token";
-	private final Client httpClient;
-	private final KeycloakConfiguration conf;
-	private final SecurityDAO securityDAO;
-	private final String redirectUri;
-
-	@Inject
-	public KeycloakServiceImpl(Client httpClient, SelfServiceApplicationConfiguration conf, SecurityDAO securityDAO) {
-		this.httpClient = httpClient;
-		this.conf = conf.getKeycloakConfiguration();
-		this.securityDAO = securityDAO;
-		this.redirectUri = conf.getKeycloakConfiguration().getRedirectUri();
-	}
-
-	@Override
-	public AccessTokenResponse getToken(String code) {
-		return requestToken(accessTokenRequestForm(code));
-	}
-
-	@Override
-	public AccessTokenResponse refreshToken(String refreshToken) {
-		return requestToken(refreshTokenRequestForm(refreshToken));
-	}
-
-	@Override
-	public AccessTokenResponse generateAccessToken(String refreshToken) {
-		AccessTokenResponse tokenResponse = refreshToken(refreshToken);
-		final String username = KeycloakUtil.parseToken(tokenResponse.getToken()).getPreferredUsername();
-		securityDAO.updateUser(username, tokenResponse);
-		return tokenResponse;
-	}
-
-	@Override
-	public AccessTokenResponse generateServiceAccountToken() {
-		return requestToken(serviceAccountRequestForm());
-	}
-
-	private AccessTokenResponse requestToken(Form requestForm) {
-		final String credentials = Base64.encodeAsString(String.join(":", conf.getResource(),
-				String.valueOf(conf.getCredentials().get("secret"))));
-		final Response response =
-				httpClient.target(conf.getAuthServerUrl() + String.format(URI, conf.getRealm())).request()
-				.header(HttpHeaders.AUTHORIZATION, "Basic " + credentials)
-				.post(Entity.form(requestForm));
-		if (response.getStatusInfo().getFamily() != Response.Status.Family.SUCCESSFUL) {
-
-			log.error("Error getting token:code {}, body {}", response.getStatus(), response.readEntity(String.class));
-			throw new DlabException("can not get token");
-		}
-		return response.readEntity(AccessTokenResponse.class);
-	}
-
-	private Form accessTokenRequestForm(String code) {
-		return new Form()
-				.param("grant_type", "authorization_code")
-				.param("code", code)
-				.param("redirect_uri", redirectUri);
-	}
-
-	private Form refreshTokenRequestForm(String refreshToken) {
-		return new Form()
-				.param("grant_type", "refresh_token")
-				.param("refresh_token", refreshToken);
-	}
-
-	private Form serviceAccountRequestForm() {
-		return new Form()
-				.param("grant_type", "client_credentials");
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java
deleted file mode 100644
index bdd22f1..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/LibraryService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.LibInfoRecord;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import org.bson.Document;
-
-import java.util.List;
-
-public interface LibraryService {
-    List<Document> getLibs(String user, String project, String exploratoryName, String computationalName);
-
-    List<LibInfoRecord> getLibInfo(String user, String project, String exploratoryName);
-
-    String installComputationalLibs(UserInfo userInfo, String project, String exploratoryName, String computationalName,
-                                    List<LibInstallDTO> libs);
-
-    String installExploratoryLibs(UserInfo userInfo, String project, String exploratoryName, List<LibInstallDTO> libs);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java
deleted file mode 100644
index 5362dfc..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ProjectService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.domain.UpdateProjectDTO;
-
-import java.util.List;
-
-public interface ProjectService {
-	List<ProjectDTO> getProjects();
-
-	List<ProjectDTO> getProjects(UserInfo user);
-
-	List<ProjectDTO> getUserProjects(UserInfo userInfo, boolean active);
-
-	List<ProjectDTO> getProjectsByEndpoint(String endpointName);
-
-	void create(UserInfo userInfo, ProjectDTO projectDTO);
-
-	ProjectDTO get(String name);
-
-	void terminateEndpoint(UserInfo userInfo, String endpoint, String name);
-
-	void terminateEndpoint(UserInfo userInfo, List<String> endpoints, String name);
-
-	void start(UserInfo userInfo, String endpoint, String name);
-
-	void start(UserInfo userInfo, List<String> endpoints, String name);
-
-	void stop(UserInfo userInfo, String endpoint, String name);
-
-	void stopWithResources(UserInfo userInfo, List<String> endpoints, String projectName);
-
-	void update(UserInfo userInfo, UpdateProjectDTO projectDTO, String projectName);
-
-	void updateBudget(List<ProjectDTO> projects);
-
-	boolean isAnyProjectAssigned(UserInfo userInfo);
-
-	boolean checkExploratoriesAndComputationalProgress(String projectName, List<String> endpoints);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ReuploadKeyService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ReuploadKeyService.java
deleted file mode 100644
index 0c2b199..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ReuploadKeyService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyStatusDTO;
-import com.epam.dlab.model.ResourceData;
-
-public interface ReuploadKeyService {
-
-	void updateResourceData(ReuploadKeyStatusDTO dto);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SchedulerJobService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SchedulerJobService.java
deleted file mode 100644
index 7702601..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SchedulerJobService.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.model.scheduler.SchedulerJobData;
-
-import java.util.List;
-
-public interface SchedulerJobService {
-    /**
-     * Pulls out scheduler job data for user <code>user<code/> and his exploratory <code>exploratoryName<code/>
-     *
-     * @param user            user's name
-     * @param project         project name
-     * @param exploratoryName name of exploratory resource
-     * @return dto object
-     */
-    SchedulerJobDTO fetchSchedulerJobForUserAndExploratory(String user, String project, String exploratoryName);
-
-    /**
-     * Pulls out scheduler job data for computational resource <code>computationalName<code/> affiliated with
-     * user <code>user<code/> and his exploratory <code>exploratoryName<code/>
-     *
-     * @param user              user's name
-     * @param project           project name
-     * @param exploratoryName   name of exploratory resource
-     * @param computationalName name of computational resource
-     * @return dto object
-     */
-    SchedulerJobDTO fetchSchedulerJobForComputationalResource(String user, String project, String exploratoryName,
-                                                              String computationalName);
-
-    /**
-     * Updates scheduler job data for user <code>user<code/> and his exploratory <code>exploratoryName<code/>
-     *
-     * @param user            user's name
-     * @param project         project name
-     * @param exploratoryName name of exploratory resource
-     * @param dto             scheduler job data
-     */
-    void updateExploratorySchedulerData(String user, String project, String exploratoryName, SchedulerJobDTO dto);
-
-    /**
-     * Updates scheduler job data for computational resource <code>computationalName<code/> affiliated with
-     * user <code>user<code/> and his exploratory <code>exploratoryName<code/>
-     *
-     * @param user              user's name
-     * @param project           project name
-     * @param exploratoryName   name of exploratory resource
-     * @param computationalName name of computational resource
-     * @param dto               scheduler job data
-     */
-    void updateComputationalSchedulerData(String user, String project, String exploratoryName,
-                                          String computationalName, SchedulerJobDTO dto);
-
-    void stopComputationalByScheduler();
-
-    void stopExploratoryByScheduler();
-
-    void startExploratoryByScheduler();
-
-    void startComputationalByScheduler();
-
-    void terminateExploratoryByScheduler();
-
-	void terminateComputationalByScheduler();
-
-	void removeScheduler(String user, String exploratoryName);
-
-	void removeScheduler(String user, String exploratoryName, String computationalName);
-
-	List<SchedulerJobData> getActiveSchedulers(String user, long timeOffset);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SecurityService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SecurityService.java
deleted file mode 100644
index c30a670..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SecurityService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-
-public interface SecurityService {
-	UserInfo getUserInfo(String code);
-
-	UserInfo getUserInfoOffline(String username);
-
-	UserInfo getServiceAccountInfo(String username);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SecurityServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SecurityServiceImpl.java
deleted file mode 100644
index db41a13..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SecurityServiceImpl.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.SecurityDAO;
-import com.epam.dlab.backendapi.util.KeycloakUtil;
-import com.epam.dlab.exceptions.DlabException;
-import com.google.inject.Inject;
-import org.keycloak.representations.AccessTokenResponse;
-
-public class SecurityServiceImpl implements SecurityService {
-	private final KeycloakService keycloakService;
-	private final SecurityDAO securityDAO;
-
-	@Inject
-	public SecurityServiceImpl(KeycloakService keycloakService, SecurityDAO securityDAO) {
-		this.keycloakService = keycloakService;
-		this.securityDAO = securityDAO;
-	}
-
-	@Override
-	public UserInfo getUserInfo(String code) {
-		final AccessTokenResponse token = keycloakService.getToken(code);
-		final String username = KeycloakUtil.parseToken(token.getToken()).getPreferredUsername();
-		securityDAO.saveUser(username, token);
-		UserInfo userInfo = new UserInfo(username, token.getToken());
-		userInfo.setRefreshToken(token.getRefreshToken());
-		return userInfo;
-	}
-
-	@Override
-	public UserInfo getUserInfoOffline(String username) {
-		return securityDAO.getTokenResponse(username)
-				.map(AccessTokenResponse::getRefreshToken)
-				.map(keycloakService::refreshToken)
-				.map(accessTokenResponse -> new UserInfo(KeycloakUtil.parseToken(accessTokenResponse.getToken()).getPreferredUsername(),
-						accessTokenResponse.getToken()))
-				.orElseThrow(() -> new DlabException("Can not find token for user " + username));
-	}
-
-	@Override
-	public UserInfo getServiceAccountInfo(String username) {
-		AccessTokenResponse accessTokenResponse = keycloakService.generateServiceAccountToken();
-		return new UserInfo(username, accessTokenResponse.getToken());
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SystemInfoService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SystemInfoService.java
deleted file mode 100644
index b3802ce..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/SystemInfoService.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.backendapi.resources.dto.SystemInfoDto;
-
-public interface SystemInfoService {
-
-	SystemInfoDto getSystemInfo();
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagService.java
deleted file mode 100644
index a095fbc..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-
-import java.util.Map;
-
-public interface TagService {
-	Map<String, String> getResourceTags(UserInfo userInfo, String endpoint, String project, String customTag);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagServiceImpl.java
deleted file mode 100644
index 64b3383..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/TagServiceImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.google.inject.Singleton;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-
-@Singleton
-public class TagServiceImpl implements TagService {
-
-	@Override
-	public Map<String, String> getResourceTags(UserInfo userInfo, String endpoint, String project,
-											   String customTag) {
-		Map<String, String> tags = new HashMap<>();
-		tags.put("user_tag", userInfo.getName());
-		tags.put("endpoint_tag", endpoint);
-		tags.put("project_tag", project);
-		Optional.ofNullable(customTag).ifPresent(t -> tags.put("custom_tag", t));
-		return tags;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserGroupService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserGroupService.java
deleted file mode 100644
index 94e89e3..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserGroupService.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.UserGroupDto;
-
-import java.util.List;
-import java.util.Set;
-
-public interface UserGroupService {
-
-	void createGroup(String group, Set<String> roleIds, Set<String> users);
-
-	void updateGroup(UserInfo user, String group, Set<String> roleIds, Set<String> users);
-
-	void removeGroup(String groupId);
-
-	List<UserGroupDto> getAggregatedRolesByGroup(UserInfo user);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserRoleService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserRoleService.java
deleted file mode 100644
index 0b22b1d..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserRoleService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.backendapi.resources.dto.UserRoleDto;
-
-import java.util.List;
-
-public interface UserRoleService {
-
-	List<UserRoleDto> getUserRoles();
-
-	void createRole(UserRoleDto dto);
-
-	void updateRole(UserRoleDto dto);
-
-	void removeRole(String roleId);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserRoleServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserRoleServiceImpl.java
deleted file mode 100644
index 92e0afb..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserRoleServiceImpl.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.backendapi.dao.UserRoleDao;
-import com.epam.dlab.backendapi.resources.dto.UserRoleDto;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-@Singleton
-public class UserRoleServiceImpl implements UserRoleService {
-	private static final String ROLE_NOT_FOUND_MSG = "Any of role : %s were not found";
-
-	@Inject
-	private UserRoleDao userRoleDao;
-
-	@Override
-	public List<UserRoleDto> getUserRoles() {
-		return userRoleDao.findAll();
-	}
-
-	@Override
-	public void createRole(UserRoleDto dto) {
-		userRoleDao.insert(dto);
-	}
-
-	@Override
-	public void updateRole(UserRoleDto dto) {
-		checkAnyRoleFound(Collections.singleton(dto.getId()), userRoleDao.update(dto));
-	}
-
-	@Override
-	public void removeRole(String roleId) {
-		userRoleDao.remove(roleId);
-	}
-
-	private void checkAnyRoleFound(Set<String> roleIds, boolean anyRoleFound) {
-		if (!anyRoleFound) {
-			throw new ResourceNotFoundException(String.format(ROLE_NOT_FOUND_MSG, roleIds));
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserSettingService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserSettingService.java
deleted file mode 100644
index 5aae379..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserSettingService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.UserDTO;
-
-import java.util.List;
-
-public interface UserSettingService {
-
-	void saveUISettings(UserInfo userInfo, String settings);
-
-	String getUISettings(UserInfo userInfo);
-
-	void updateUsersBudget(List<UserDTO> budgets);
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserSettingServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserSettingServiceImpl.java
deleted file mode 100644
index 296cd17..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/UserSettingServiceImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.UserSettingsDAO;
-import com.epam.dlab.backendapi.resources.dto.UserDTO;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-import java.util.List;
-
-@Singleton
-public class UserSettingServiceImpl implements UserSettingService {
-	@Inject
-	private UserSettingsDAO settingsDAO;
-
-	@Override
-	public void saveUISettings(UserInfo userInfo, String settings) {
-		settingsDAO.setUISettings(userInfo, settings);
-	}
-
-	@Override
-	public String getUISettings(UserInfo userInfo) {
-		return settingsDAO.getUISettings(userInfo);
-	}
-
-	@Override
-	public void updateUsersBudget(List<UserDTO> budgets) {
-		budgets.forEach(settingsDAO::updateBudget);
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/AccessKeyServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/AccessKeyServiceImpl.java
deleted file mode 100644
index 11c8ef4..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/AccessKeyServiceImpl.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.resources.dto.KeysDTO;
-import com.epam.dlab.backendapi.service.AccessKeyService;
-import com.epam.dlab.exceptions.DlabException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.jcraft.jsch.JSch;
-import com.jcraft.jsch.JSchException;
-import com.jcraft.jsch.KeyPair;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-@Singleton
-@Slf4j
-public class AccessKeyServiceImpl implements AccessKeyService {
-	@Inject
-	private SelfServiceApplicationConfiguration configuration;
-
-
-	@Override
-	public KeysDTO generateKeys(UserInfo userInfo) {
-		log.debug("Generating new key pair for user {}", userInfo.getName());
-		try (ByteArrayOutputStream publicKeyOut = new ByteArrayOutputStream();
-			 ByteArrayOutputStream privateKeyOut = new ByteArrayOutputStream()) {
-			KeyPair pair = KeyPair.genKeyPair(new JSch(), KeyPair.RSA, configuration.getPrivateKeySize());
-			pair.writePublicKey(publicKeyOut, userInfo.getName());
-			pair.writePrivateKey(privateKeyOut);
-			return new KeysDTO(new String(publicKeyOut.toByteArray()),
-					new String(privateKeyOut.toByteArray()), userInfo.getName());
-		} catch (JSchException | IOException e) {
-			log.error("Can not generate private/public key pair due to: {}", e.getMessage());
-			throw new DlabException("Can not generate private/public key pair due to: " + e.getMessage(), e);
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BackupServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BackupServiceImpl.java
deleted file mode 100644
index b50b0ae..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BackupServiceImpl.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.BackupDao;
-import com.epam.dlab.backendapi.resources.dto.BackupInfoRecord;
-import com.epam.dlab.backendapi.service.BackupService;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.backup.EnvBackupDTO;
-import com.epam.dlab.dto.backup.EnvBackupStatus;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.BackupAPI;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-
-import java.util.List;
-
-@Singleton
-public class BackupServiceImpl implements BackupService {
-
-	@Inject
-	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-
-	@Inject
-	private BackupDao backupDao;
-
-	@Override
-	public String createBackup(EnvBackupDTO dto, UserInfo user) {
-		updateStatus(dto, user.getName(), EnvBackupStatus.CREATING);
-		return provisioningService.post(BackupAPI.BACKUP, user.getAccessToken(), dto, String.class);
-	}
-
-	@Override
-	public void updateStatus(EnvBackupDTO dto, String user, EnvBackupStatus status) {
-		backupDao.createOrUpdate(dto, user, status);
-	}
-
-	@Override
-	public List<BackupInfoRecord> getBackups(String userName) {
-		return backupDao.getBackups(userName);
-	}
-
-	@Override
-	public BackupInfoRecord getBackup(String userName, String id) {
-		return backupDao.getBackup(userName, id).orElseThrow(() -> new ResourceNotFoundException(
-				String.format("Backup with id %s was not found for user %s", id, userName)));
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
deleted file mode 100644
index 8eae49b..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.dao.ImageExploratoryDao;
-import com.epam.dlab.backendapi.domain.BillingReport;
-import com.epam.dlab.backendapi.domain.BillingReportLine;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.backendapi.roles.RoleType;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.util.BillingUtils;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.billing.BillingData;
-import com.epam.dlab.dto.billing.BillingResourceType;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.http.client.utils.URIBuilder;
-
-import javax.ws.rs.core.GenericType;
-import java.math.BigDecimal;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-@Slf4j
-public class BillingServiceImpl implements BillingService {
-    private static final String BILLING_PATH = "/api/billing";
-    private static final String USAGE_DATE_FORMAT = "yyyy-MM";
-
-    private final ProjectService projectService;
-    private final EndpointService endpointService;
-    private final ExploratoryService exploratoryService;
-    private final SelfServiceApplicationConfiguration configuration;
-    private final RESTService provisioningService;
-    private final ImageExploratoryDao imageExploratoryDao;
-    private final BillingDAO billingDAO;
-    private final String sbn;
-
-    @Inject
-    public BillingServiceImpl(ProjectService projectService, EndpointService endpointService,
-                              ExploratoryService exploratoryService, SelfServiceApplicationConfiguration configuration,
-                              @Named(ServiceConsts.BILLING_SERVICE_NAME) RESTService provisioningService, ImageExploratoryDao imageExploratoryDao,
-                              BillingDAO billingDAO) {
-        this.projectService = projectService;
-        this.endpointService = endpointService;
-        this.exploratoryService = exploratoryService;
-        this.configuration = configuration;
-        this.provisioningService = provisioningService;
-        this.imageExploratoryDao = imageExploratoryDao;
-        this.billingDAO = billingDAO;
-        sbn = configuration.getServiceBaseName();
-    }
-
-    @Override
-    public BillingReport getBillingReport(UserInfo user, BillingFilter filter) {
-        setUserFilter(user, filter);
-        List<BillingReportLine> billingReportLines = billingDAO.aggregateBillingData(filter)
-                .stream()
-                .peek(this::appendStatuses)
-                .filter(bd -> CollectionUtils.isEmpty(filter.getStatuses()) || filter.getStatuses().contains(bd.getStatus()))
-                .collect(Collectors.toList());
-        final LocalDate min = billingReportLines.stream().min(Comparator.comparing(BillingReportLine::getUsageDateFrom)).map(BillingReportLine::getUsageDateFrom).orElse(null);
-        final LocalDate max = billingReportLines.stream().max(Comparator.comparing(BillingReportLine::getUsageDateTo)).map(BillingReportLine::getUsageDateTo).orElse(null);
-        final double sum = billingReportLines.stream().mapToDouble(BillingReportLine::getCost).sum();
-        final String currency = billingReportLines.stream().map(BillingReportLine::getCurrency).distinct().count() == 1 ? billingReportLines.get(0).getCurrency() : null;
-        return BillingReport.builder()
-                .name("Billing report")
-                .sbn(sbn)
-                .reportLines(billingReportLines)
-                .usageDateFrom(min)
-                .usageDateTo(max)
-                .totalCost(new BigDecimal(sum).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())
-                .currency(currency)
-                .isFull(isFullReport(user))
-                .build();
-    }
-
-    @Override
-    public String downloadReport(UserInfo user, BillingFilter filter) {
-        boolean isFull = isFullReport(user);
-        BillingReport report = getBillingReport(user, filter);
-        StringBuilder builder = new StringBuilder(BillingUtils.getFirstLine(report.getSbn(), report.getUsageDateFrom(), report.getUsageDateTo()));
-        builder.append(BillingUtils.getHeader(isFull));
-        try {
-            report.getReportLines().forEach(r -> builder.append(BillingUtils.printLine(r, isFull)));
-            builder.append(BillingUtils.getTotal(report.getTotalCost(), report.getCurrency()));
-            return builder.toString();
-        } catch (Exception e) {
-            log.error("Cannot write billing data ", e);
-            throw new DlabException("Cannot write billing file ", e);
-        }
-    }
-
-    public BillingReport getExploratoryBillingData(String project, String endpoint, String exploratoryName, List<String> compNames) {
-        List<String> resourceNames = new ArrayList<>(compNames);
-        resourceNames.add(exploratoryName);
-        List<BillingReportLine> billingData = billingDAO.findBillingData(project, endpoint, resourceNames)
-                .stream()
-                .peek(bd -> bd.setCost(BigDecimal.valueOf(bd.getCost()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()))
-                .collect(Collectors.toList());
-        final double sum = billingData.stream().mapToDouble(BillingReportLine::getCost).sum();
-        final String currency = billingData.stream().map(BillingReportLine::getCurrency).distinct().count() == 1 ? billingData.get(0).getCurrency() : null;
-        return BillingReport.builder()
-                .name(exploratoryName)
-                .reportLines(billingData)
-                .totalCost(new BigDecimal(sum).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())
-                .currency(currency)
-                .build();
-    }
-
-    public void updateRemoteBillingData(UserInfo userInfo) {
-        List<EndpointDTO> endpoints = endpointService.getEndpoints();
-        if (CollectionUtils.isEmpty(endpoints)) {
-            log.error("Cannot update billing info. There are no endpoints");
-            throw new DlabException("Cannot update billing info. There are no endpoints");
-        }
-
-        Map<EndpointDTO, List<BillingData>> billingDataMap = endpoints
-                .stream()
-                .collect(Collectors.toMap(e -> e, e -> getBillingData(userInfo, e)));
-
-        billingDataMap.forEach((endpointDTO, billingData) -> {
-            log.info("Updating billing information for endpoint {}. Billing data {}", endpointDTO.getName(), billingData);
-            try {
-                updateBillingData(endpointDTO, billingData);
-            } catch (Exception e) {
-                log.error("Something went wrong while trying to update billing for {}. {}", endpointDTO.getName(), e.getMessage());
-            }
-        });
-    }
-
-    private Map<String, BillingReportLine> getBillableResources() {
-        Set<ProjectDTO> projects = new HashSet<>(projectService.getProjects());
-        final Stream<BillingReportLine> ssnBillingDataStream = BillingUtils.ssnBillingDataStream(sbn);
-        final Stream<BillingReportLine> billableEdges = projects
-                .stream()
-                .collect(Collectors.toMap(ProjectDTO::getName, ProjectDTO::getEndpoints))
-                .entrySet()
-                .stream()
-                .flatMap(e -> projectEdges(sbn, e.getKey(), e.getValue()));
-        final Stream<BillingReportLine> billableSharedEndpoints = endpointService.getEndpoints()
-                .stream()
-                .flatMap(endpoint -> BillingUtils.sharedEndpointBillingDataStream(endpoint.getName(), sbn));
-        final Stream<BillingReportLine> billableUserInstances = exploratoryService.findAll(projects)
-                .stream()
-                .filter(userInstance -> Objects.nonNull(userInstance.getExploratoryId()))
-                .flatMap(ui -> BillingUtils.exploratoryBillingDataStream(ui, configuration.getMaxSparkInstanceCount()));
-        final Stream<BillingReportLine> customImages = projects
-                .stream()
-                .map(p -> imageExploratoryDao.getImagesForProject(p.getName()))
-                .flatMap(Collection::stream)
-                .flatMap(i -> BillingUtils.customImageBillingDataStream(i, sbn));
-
-        final Map<String, BillingReportLine> billableResources = Stream.of(ssnBillingDataStream, billableEdges, billableSharedEndpoints, billableUserInstances, customImages)
-                .flatMap(s -> s)
-                .collect(Collectors.toMap(BillingReportLine::getDlabId, b -> b));
-        log.debug("Billable resources are: {}", billableResources);
-
-        return billableResources;
-    }
-
-    private Stream<BillingReportLine> projectEdges(String serviceBaseName, String projectName, List<ProjectEndpointDTO> endpoints) {
-        return endpoints
-                .stream()
-                .flatMap(endpoint -> BillingUtils.edgeBillingDataStream(projectName, serviceBaseName, endpoint.getName()));
-    }
-
-    private void updateBillingData(EndpointDTO endpointDTO, List<BillingData> billingData) {
-        final String endpointName = endpointDTO.getName();
-        final CloudProvider cloudProvider = endpointDTO.getCloudProvider();
-        final Map<String, BillingReportLine> billableResources = getBillableResources();
-        final Stream<BillingReportLine> billingReportLineStream = billingData
-                .stream()
-                .peek(bd -> bd.setApplication(endpointName))
-                .map(bd -> toBillingReport(bd, getOrDefault(billableResources, bd.getTag())));
-
-        if (cloudProvider == CloudProvider.GCP) {
-            final Map<String, List<BillingReportLine>> gcpBillingData = billingReportLineStream
-                    .collect(Collectors.groupingBy(bd -> bd.getUsageDate().substring(0, USAGE_DATE_FORMAT.length())));
-            updateGcpBillingData(endpointName, gcpBillingData);
-        } else if (cloudProvider == CloudProvider.AWS) {
-            final Map<String, List<BillingReportLine>> awsBillingData = billingReportLineStream
-                    .collect(Collectors.groupingBy(BillingReportLine::getUsageDate));
-            updateAwsBillingData(endpointName, awsBillingData);
-        } else if (cloudProvider == CloudProvider.AZURE) {
-            final List<BillingReportLine> billingReportLines = billingReportLineStream
-                    .collect(Collectors.toList());
-            updateAzureBillingData(billingReportLines);
-        }
-    }
-
-    private BillingReportLine getOrDefault(Map<String, BillingReportLine> billableResources, String tag) {
-        return billableResources.getOrDefault(tag, BillingReportLine.builder().dlabId(tag).build());
-    }
-
-    private void updateGcpBillingData(String endpointName, Map<String, List<BillingReportLine>> billingData) {
-        billingData.forEach((usageDate, billingReportLines) -> {
-            billingDAO.deleteByUsageDateRegex(endpointName, usageDate);
-            billingDAO.save(billingReportLines);
-        });
-    }
-
-    private void updateAwsBillingData(String endpointName, Map<String, List<BillingReportLine>> billingData) {
-        billingData.forEach((usageDate, billingReportLines) -> {
-            billingDAO.deleteByUsageDate(endpointName, usageDate);
-            billingDAO.save(billingReportLines);
-        });
-    }
-
-    private void updateAzureBillingData(List<BillingReportLine> billingReportLines) {
-        billingDAO.save(billingReportLines);
-    }
-
-    private List<BillingData> getBillingData(UserInfo userInfo, EndpointDTO e) {
-        try {
-            return provisioningService.get(getBillingUrl(e.getUrl(), BILLING_PATH), userInfo.getAccessToken(),
-                    new GenericType<List<BillingData>>() {
-                    });
-        } catch (Exception ex) {
-            log.error("Cannot retrieve billing information for {}. {}", e.getName(), ex.getMessage());
-            return Collections.emptyList();
-        }
-    }
-
-    private String getBillingUrl(String endpointUrl, String path) {
-        URI uri;
-        try {
-            uri = new URI(endpointUrl);
-        } catch (URISyntaxException e) {
-            log.error("Wrong URI syntax {}", e.getMessage(), e);
-            throw new DlabException("Wrong URI syntax");
-        }
-        return new URIBuilder()
-                .setScheme(uri.getScheme())
-                .setHost(uri.getHost())
-                .setPort(8088)
-                .setPath(path)
-                .toString();
-    }
-
-    private void appendStatuses(BillingReportLine br) {
-        BillingResourceType resourceType = br.getResourceType();
-        if (BillingResourceType.EDGE == resourceType) {
-            projectService.get(br.getProject()).getEndpoints()
-                    .stream()
-                    .filter(e -> e.getName().equals(br.getResourceName()))
-                    .findAny()
-                    .ifPresent(e -> br.setStatus(e.getStatus()));
-        } else if (BillingResourceType.EXPLORATORY == resourceType) {
-            exploratoryService.getUserInstance(br.getUser(), br.getProject(), br.getResourceName())
-                    .ifPresent(ui -> br.setStatus(UserInstanceStatus.of(ui.getStatus())));
-        } else if (BillingResourceType.COMPUTATIONAL == resourceType) {
-            exploratoryService.getUserInstance(br.getUser(), br.getProject(), br.getExploratoryName(), true)
-                    .flatMap(ui -> ui.getResources()
-                            .stream()
-                            .filter(cr -> cr.getComputationalName().equals(br.getResourceName()))
-                            .findAny())
-                    .ifPresent(cr -> br.setStatus(UserInstanceStatus.of(cr.getStatus())));
-        }
-    }
-
-    private boolean isFullReport(UserInfo userInfo) {
-        return UserRoles.checkAccess(userInfo, RoleType.PAGE, "/api/infrastructure_provision/billing",
-                userInfo.getRoles());
-    }
-
-    private void setUserFilter(UserInfo userInfo, BillingFilter filter) {
-        if (!isFullReport(userInfo)) {
-            filter.setUsers(Lists.newArrayList(userInfo.getName()));
-        }
-    }
-
-    private BillingReportLine toBillingReport(BillingData billingData, BillingReportLine billingReportLine) {
-        return BillingReportLine.builder()
-                .application(billingData.getApplication())
-                .cost(billingData.getCost())
-                .currency(billingData.getCurrency())
-                .product(billingData.getProduct())
-                .project(billingReportLine.getProject())
-                .endpoint(billingReportLine.getEndpoint())
-                .usageDateFrom(billingData.getUsageDateFrom())
-                .usageDateTo(billingData.getUsageDateTo())
-                .usageDate(billingData.getUsageDate())
-                .usageType(billingData.getUsageType())
-                .user(billingReportLine.getUser())
-                .dlabId(billingData.getTag())
-                .resourceType(billingReportLine.getResourceType())
-                .resourceName(billingReportLine.getResourceName())
-                .shape(billingReportLine.getShape())
-                .exploratoryName(billingReportLine.getExploratoryName())
-                .build();
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java
deleted file mode 100644
index 722ee4d..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImpl.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.annotation.BudgetLimited;
-import com.epam.dlab.backendapi.annotation.Project;
-import com.epam.dlab.backendapi.dao.ComputationalDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.resources.dto.ComputationalCreateFormDTO;
-import com.epam.dlab.backendapi.resources.dto.ComputationalTemplatesDTO;
-import com.epam.dlab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
-import com.epam.dlab.backendapi.service.ComputationalService;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.InfrastructureTemplateService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.TagService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.epam.dlab.dto.base.computational.FullComputationalTemplate;
-import com.epam.dlab.dto.computational.ComputationalClusterConfigDTO;
-import com.epam.dlab.dto.computational.ComputationalStatusDTO;
-import com.epam.dlab.dto.computational.ComputationalTerminateDTO;
-import com.epam.dlab.dto.computational.SparkStandaloneClusterResource;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ComputationalAPI;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Collection;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
-import static com.epam.dlab.dto.UserInstanceStatus.FAILED;
-import static com.epam.dlab.dto.UserInstanceStatus.RECONFIGURING;
-import static com.epam.dlab.dto.UserInstanceStatus.STARTING;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPING;
-import static com.epam.dlab.dto.UserInstanceStatus.TERMINATING;
-import static com.epam.dlab.dto.base.DataEngineType.CLOUD_SERVICE;
-import static com.epam.dlab.dto.base.DataEngineType.SPARK_STANDALONE;
-import static com.epam.dlab.rest.contracts.ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC;
-
-@Singleton
-@Slf4j
-public class ComputationalServiceImpl implements ComputationalService {
-
-	private static final String COULD_NOT_UPDATE_THE_STATUS_MSG_FORMAT = "Could not update the status of " +
-			"computational resource {} for user {}";
-	private static final EnumMap<DataEngineType, String> DATA_ENGINE_TYPE_TERMINATE_URLS;
-	private static final String DATAENGINE_NOT_PRESENT_FORMAT = "There is no %s dataengine %s for exploratory %s";
-	private static final String RUNNING_COMP_RES_NOT_FOUND = "Running computational resource with " +
-			"name %s for exploratory %s not found";
-
-	static {
-		DATA_ENGINE_TYPE_TERMINATE_URLS = new EnumMap<>(DataEngineType.class);
-		DATA_ENGINE_TYPE_TERMINATE_URLS.put(SPARK_STANDALONE, ComputationalAPI.COMPUTATIONAL_TERMINATE_SPARK);
-		DATA_ENGINE_TYPE_TERMINATE_URLS.put(CLOUD_SERVICE, ComputationalAPI.COMPUTATIONAL_TERMINATE_CLOUD_SPECIFIC);
-	}
-
-	private final ProjectService projectService;
-	private final ExploratoryDAO exploratoryDAO;
-	private final ComputationalDAO computationalDAO;
-	private final RESTService provisioningService;
-	private final RequestBuilder requestBuilder;
-	private final RequestId requestId;
-	private final TagService tagService;
-	private final EndpointService endpointService;
-	private final InfrastructureTemplateService templateService;
-
-	@Inject
-	public ComputationalServiceImpl(ProjectService projectService, ExploratoryDAO exploratoryDAO, ComputationalDAO computationalDAO,
-									@Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
-									RequestBuilder requestBuilder, RequestId requestId, TagService tagService,
-									EndpointService endpointService, InfrastructureTemplateService templateService) {
-		this.projectService = projectService;
-		this.exploratoryDAO = exploratoryDAO;
-		this.computationalDAO = computationalDAO;
-		this.provisioningService = provisioningService;
-		this.requestBuilder = requestBuilder;
-		this.requestId = requestId;
-		this.tagService = tagService;
-		this.endpointService = endpointService;
-		this.templateService = templateService;
-	}
-
-
-	@Override
-	public ComputationalTemplatesDTO getComputationalNamesAndTemplates(UserInfo user, String project, String endpoint) {
-		List<FullComputationalTemplate> computationalTemplates = templateService.getComputationalTemplates(user, project, endpoint);
-		List<UserInstanceDTO> userInstances = exploratoryDAO.fetchExploratoryFieldsForProjectWithComp(project);
-
-		List<String> projectComputations = userInstances
-				.stream()
-				.map(UserInstanceDTO::getResources)
-				.flatMap(Collection::stream)
-				.map(UserComputationalResource::getComputationalName)
-				.collect(Collectors.toList());
-		List<String> userComputations = userInstances
-				.stream()
-				.filter(instance -> instance.getUser().equalsIgnoreCase(user.getName()))
-				.map(UserInstanceDTO::getResources)
-				.flatMap(Collection::stream)
-				.map(UserComputationalResource::getComputationalName)
-				.collect(Collectors.toList());
-
-		return new ComputationalTemplatesDTO(computationalTemplates, userComputations, projectComputations);
-	}
-
-	@BudgetLimited
-	@Override
-	public boolean createSparkCluster(UserInfo userInfo, SparkStandaloneClusterCreateForm form, @Project String project) {
-
-		final ProjectDTO projectDTO = projectService.get(project);
-		final UserInstanceDTO instance =
-				exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, form.getNotebookName());
-		final SparkStandaloneClusterResource compResource = createInitialComputationalResource(form);
-		compResource.setTags(tagService.getResourceTags(userInfo, instance.getEndpoint(), project,
-				form.getCustomTag()));
-		if (computationalDAO.addComputational(userInfo.getName(), form.getNotebookName(), project, compResource)) {
-			try {
-				EndpointDTO endpointDTO = endpointService.get(instance.getEndpoint());
-				ComputationalBase<?> dto = requestBuilder.newComputationalCreate(userInfo, projectDTO, instance, form, endpointDTO);
-
-				String uuid =
-						provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_CREATE_SPARK,
-								userInfo.getAccessToken(), dto, String.class);
-				requestId.put(userInfo.getName(), uuid);
-				return true;
-			} catch (RuntimeException e) {
-				try {
-					updateComputationalStatus(userInfo.getName(), project, form.getNotebookName(), form.getName(), FAILED);
-				} catch (DlabException d) {
-					log.error(COULD_NOT_UPDATE_THE_STATUS_MSG_FORMAT, form.getName(), userInfo.getName(), d);
-				}
-				throw e;
-			}
-		} else {
-			log.debug("Computational with name {} is already existing for user {}", form.getName(),
-					userInfo.getName());
-			return false;
-		}
-	}
-
-	@Override
-	public void terminateComputational(UserInfo userInfo, String project, String exploratoryName, String computationalName) {
-		try {
-
-			updateComputationalStatus(userInfo.getName(), project, exploratoryName, computationalName, TERMINATING);
-
-			final UserInstanceDTO userInstanceDTO = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project,
-					exploratoryName);
-			UserComputationalResource compResource = computationalDAO.fetchComputationalFields(userInfo.getName(), project,
-					exploratoryName, computationalName);
-
-			final DataEngineType dataEngineType = compResource.getDataEngineType();
-			EndpointDTO endpointDTO = endpointService.get(userInstanceDTO.getEndpoint());
-			ComputationalTerminateDTO dto = requestBuilder.newComputationalTerminate(userInfo, userInstanceDTO, compResource, endpointDTO);
-
-			final String provisioningUrl = Optional.ofNullable(DATA_ENGINE_TYPE_TERMINATE_URLS.get(dataEngineType))
-					.orElseThrow(UnsupportedOperationException::new);
-			String uuid =
-					provisioningService.post(endpointDTO.getUrl() + provisioningUrl,
-							userInfo.getAccessToken(), dto, String.class);
-			requestId.put(userInfo.getName(), uuid);
-		} catch (RuntimeException re) {
-
-			try {
-				updateComputationalStatus(userInfo.getName(), project, exploratoryName, computationalName, FAILED);
-			} catch (DlabException e) {
-				log.error(COULD_NOT_UPDATE_THE_STATUS_MSG_FORMAT, computationalName, userInfo.getName(), e);
-			}
-
-			throw re;
-		}
-	}
-
-	@BudgetLimited
-	@Override
-	public boolean createDataEngineService(UserInfo userInfo, ComputationalCreateFormDTO formDTO,
-										   UserComputationalResource computationalResource, @Project String project) {
-
-		final ProjectDTO projectDTO = projectService.get(project);
-		final UserInstanceDTO instance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, formDTO
-				.getNotebookName());
-		final Map<String, String> tags = tagService.getResourceTags(userInfo, instance.getEndpoint(), project,
-				formDTO.getCustomTag());
-		computationalResource.setTags(tags);
-		boolean isAdded = computationalDAO.addComputational(userInfo.getName(), formDTO.getNotebookName(), project,
-				computationalResource);
-
-		if (isAdded) {
-			try {
-				EndpointDTO endpointDTO = endpointService.get(instance.getEndpoint());
-				String uuid =
-						provisioningService.post(endpointDTO.getUrl() + COMPUTATIONAL_CREATE_CLOUD_SPECIFIC,
-								userInfo.getAccessToken(),
-								requestBuilder.newComputationalCreate(userInfo, projectDTO, instance, formDTO, endpointDTO),
-								String.class);
-				requestId.put(userInfo.getName(), uuid);
-				return true;
-			} catch (Exception t) {
-				try {
-					updateComputationalStatus(userInfo.getName(), project, formDTO.getNotebookName(),
-							formDTO.getName(), FAILED);
-				} catch (DlabException e) {
-					log.error(COULD_NOT_UPDATE_THE_STATUS_MSG_FORMAT, formDTO.getName(), userInfo.getName(), e);
-				}
-				throw new DlabException("Could not send request for creation the computational resource " + formDTO
-						.getName() + ": " + t.getLocalizedMessage(), t);
-			}
-		} else {
-			log.debug("Used existing computational resource {} for user {}", formDTO.getName(), userInfo.getName());
-			return false;
-		}
-	}
-
-	@Override
-	public void stopSparkCluster(UserInfo userInfo, String project, String expName, String compName) {
-		final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, expName, true);
-		final UserInstanceStatus requiredStatus = UserInstanceStatus.RUNNING;
-		if (computationalWithStatusResourceExist(compName, userInstance, requiredStatus)) {
-			log.debug("{} spark cluster {} for userInstance {}", STOPPING.toString(), compName, expName);
-			updateComputationalStatus(userInfo.getName(), project, expName, compName, STOPPING);
-			EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-			final String uuid =
-					provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_STOP_SPARK,
-							userInfo.getAccessToken(),
-							requestBuilder.newComputationalStop(userInfo, userInstance, compName, endpointDTO),
-							String.class);
-			requestId.put(userInfo.getName(), uuid);
-		} else {
-			throw new IllegalStateException(String.format(DATAENGINE_NOT_PRESENT_FORMAT,
-					requiredStatus.toString(), compName, expName));
-		}
-
-	}
-
-	@BudgetLimited
-	@Override
-	public void startSparkCluster(UserInfo userInfo, String expName, String compName, @Project String project) {
-		final UserInstanceDTO userInstance =
-				exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, expName, true);
-		final UserInstanceStatus requiredStatus = UserInstanceStatus.STOPPED;
-		if (computationalWithStatusResourceExist(compName, userInstance, requiredStatus)) {
-			log.debug("{} spark cluster {} for userInstance {}", STARTING.toString(), compName, expName);
-			updateComputationalStatus(userInfo.getName(), project, expName, compName, STARTING);
-			EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-			final String uuid =
-					provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_START_SPARK,
-							userInfo.getAccessToken(),
-							requestBuilder.newComputationalStart(userInfo, userInstance, compName, endpointDTO),
-							String.class);
-			requestId.put(userInfo.getName(), uuid);
-		} else {
-			throw new IllegalStateException(String.format(DATAENGINE_NOT_PRESENT_FORMAT,
-					requiredStatus.toString(), compName, expName));
-		}
-	}
-
-	@Override
-	public void updateSparkClusterConfig(UserInfo userInfo, String project, String exploratoryName, String computationalName,
-										 List<ClusterConfig> config) {
-		final String userName = userInfo.getName();
-		final String token = userInfo.getAccessToken();
-		final UserInstanceDTO userInstanceDTO = exploratoryDAO
-				.fetchExploratoryFields(userName, project, exploratoryName, true);
-		final UserComputationalResource compResource = userInstanceDTO
-				.getResources()
-				.stream()
-				.filter(cr -> cr.getComputationalName().equals(computationalName) && cr.getStatus().equals(UserInstanceStatus.RUNNING.toString()))
-				.findAny()
-				.orElseThrow(() -> new ResourceNotFoundException(String.format(RUNNING_COMP_RES_NOT_FOUND,
-						computationalName, exploratoryName)));
-		EndpointDTO endpointDTO = endpointService.get(userInstanceDTO.getEndpoint());
-		final ComputationalClusterConfigDTO clusterConfigDto = requestBuilder.newClusterConfigUpdate(userInfo,
-				userInstanceDTO, compResource, config, endpointDTO);
-		final String uuid =
-				provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_RECONFIGURE_SPARK,
-						token, clusterConfigDto, String.class);
-		computationalDAO.updateComputationalFields(new ComputationalStatusDTO()
-				.withProject(userInstanceDTO.getProject())
-				.withComputationalName(computationalName)
-				.withExploratoryName(exploratoryName)
-				.withConfig(config)
-				.withStatus(RECONFIGURING.toString())
-				.withUser(userName));
-		requestId.put(userName, uuid);
-
-	}
-
-	/**
-	 * Returns computational resource's data by name for user's exploratory.
-	 *
-	 * @param user              user
-	 * @param project           name of project
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @return corresponding computational resource's data or empty data if resource doesn't exist.
-	 */
-	@Override
-	public Optional<UserComputationalResource> getComputationalResource(String user, String project, String exploratoryName,
-																		String computationalName) {
-		try {
-			return Optional.of(computationalDAO.fetchComputationalFields(user, project, exploratoryName, computationalName));
-		} catch (DlabException e) {
-			log.warn("Computational resource {} affiliated with exploratory {} for user {} not found.",
-					computationalName, exploratoryName, user);
-		}
-		return Optional.empty();
-	}
-
-	@Override
-	public List<ClusterConfig> getClusterConfig(UserInfo userInfo, String project, String exploratoryName, String computationalName) {
-		return computationalDAO.getClusterConfig(userInfo.getName(), project, exploratoryName, computationalName);
-	}
-
-	/**
-	 * Updates the status of computational resource in database.
-	 *
-	 * @param user              user name.
-	 * @param project           project name
-	 * @param exploratoryName   name of exploratory.
-	 * @param computationalName name of computational resource.
-	 * @param status            status
-	 */
-	private void updateComputationalStatus(String user, String project, String exploratoryName, String computationalName,
-										   UserInstanceStatus status) {
-		ComputationalStatusDTO computationalStatus = new ComputationalStatusDTO()
-				.withUser(user)
-				.withProject(project)
-				.withExploratoryName(exploratoryName)
-				.withComputationalName(computationalName)
-				.withStatus(status);
-
-		computationalDAO.updateComputationalStatus(computationalStatus);
-	}
-
-	private SparkStandaloneClusterResource createInitialComputationalResource(SparkStandaloneClusterCreateForm form) {
-
-		return SparkStandaloneClusterResource.builder()
-				.computationalName(form.getName())
-				.imageName(form.getImage())
-				.templateName(form.getTemplateName())
-				.status(CREATING.toString())
-				.dataEngineInstanceCount(form.getDataEngineInstanceCount())
-				.dataEngineInstanceShape(form.getDataEngineInstanceShape())
-				.config(form.getConfig())
-				.build();
-	}
-
-	private boolean computationalWithStatusResourceExist(String compName,
-														 UserInstanceDTO ui, UserInstanceStatus status) {
-		return ui.getResources()
-				.stream()
-				.anyMatch(c -> computationalWithNameAndStatus(compName, c, status));
-	}
-
-	private boolean computationalWithNameAndStatus(String computationalName, UserComputationalResource compResource,
-												   UserInstanceStatus status) {
-		return compResource.getStatus().equals(status.toString()) &&
-				compResource.getDataEngineType() == SPARK_STANDALONE &&
-				compResource.getComputationalName().equals(computationalName);
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
deleted file mode 100644
index 57c6549..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EndpointServiceImpl.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.EndpointDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.UserRoleDao;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.EndpointResourcesDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.exceptions.ResourceConflictException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.ws.rs.core.Response;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-
-@Slf4j
-public class EndpointServiceImpl implements EndpointService {
-	private static final String HEALTH_CHECK = "healthcheck";
-	private final EndpointDAO endpointDAO;
-	private final ProjectService projectService;
-	private final ExploratoryDAO exploratoryDAO;
-	private final RESTService provisioningService;
-	private final UserRoleDao userRoleDao;
-
-	@Inject
-	public EndpointServiceImpl(EndpointDAO endpointDAO, ProjectService projectService, ExploratoryDAO exploratoryDAO,
-							   @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
-							   UserRoleDao userRoleDao) {
-
-		this.endpointDAO = endpointDAO;
-		this.projectService = projectService;
-		this.exploratoryDAO = exploratoryDAO;
-		this.provisioningService = provisioningService;
-		this.userRoleDao = userRoleDao;
-	}
-
-	@Override
-	public List<EndpointDTO> getEndpoints() {
-		return endpointDAO.getEndpoints();
-	}
-
-	@Override
-	public List<EndpointDTO> getEndpointsWithStatus(EndpointDTO.EndpointStatus status) {
-		return endpointDAO.getEndpointsWithStatus(status.name());
-	}
-
-	@Override
-	public EndpointResourcesDTO getEndpointResources(String endpoint) {
-		List<UserInstanceDTO> exploratories = exploratoryDAO.fetchExploratoriesByEndpointWhereStatusNotIn(endpoint,
-				Arrays.asList(UserInstanceStatus.TERMINATED, UserInstanceStatus.FAILED));
-
-		List<ProjectDTO> projects = projectService.getProjectsByEndpoint(endpoint);
-
-		return new EndpointResourcesDTO(exploratories, projects);
-	}
-
-	@Override
-	public EndpointDTO get(String name) {
-		return endpointDAO.get(name)
-				.orElseThrow(() -> new ResourceNotFoundException("Endpoint with name " + name + " not found"));
-	}
-
-	/**
-	 * Create new endpoint object in the System.
-	 * The Endpoint objects should contain Unique values of the 'url' and 'name' fields,
-	 * i.e two objects with same URLs should not be created in the system.
-	 * @param userInfo user properties
-	 * @param endpointDTO object with endpoint fields
-	 */
-	@Override
-	public void create(UserInfo userInfo, EndpointDTO endpointDTO) {
-		if (endpointDAO.get(endpointDTO.getName()).isPresent()) {
-			throw new ResourceConflictException("The Endpoint with this name exists in system");
-		}
-		if(endpointDAO.getEndpointWithUrl(endpointDTO.getUrl()).isPresent()) {
-		    throw new ResourceConflictException("The Endpoint URL with this address exists in system");
-		}
-		CloudProvider cloudProvider = checkUrl(userInfo, endpointDTO.getUrl());
-		if (Objects.isNull(cloudProvider)) {
-			throw new DlabException("CloudProvider cannot be null");
-		}
-		endpointDAO.create(new EndpointDTO(endpointDTO.getName(), endpointDTO.getUrl(), endpointDTO.getAccount(),
-				endpointDTO.getTag(), EndpointDTO.EndpointStatus.ACTIVE, cloudProvider));
-		userRoleDao.updateMissingRoles(cloudProvider);
-	}
-
-	@Override
-	public void updateEndpointStatus(String name, EndpointDTO.EndpointStatus status) {
-		endpointDAO.updateEndpointStatus(name, status.name());
-	}
-
-	@Override
-	public void remove(UserInfo userInfo, String name, boolean withResources) {
-		Optional<EndpointDTO> endpointDTO = endpointDAO.get(name);
-		endpointDTO.orElseThrow(() -> new ResourceNotFoundException(String.format("Endpoint %s does not exist", name)));
-		List<ProjectDTO> projects = projectService.getProjectsByEndpoint(name);
-		checkProjectEndpointResourcesStatuses(projects, name);
-
-		if (withResources) {
-			removeEndpointInAllProjects(userInfo, name, projects);
-		}
-		CloudProvider cloudProvider = endpointDTO.get().getCloudProvider();
-		endpointDAO.remove(name);
-		List<CloudProvider> remainingProviders = endpointDAO.getEndpoints().stream()
-				.map(EndpointDTO::getCloudProvider)
-				.collect(Collectors.toList());
-		userRoleDao.removeUnnecessaryRoles(cloudProvider, remainingProviders);
-	}
-
-	@Override
-	public void removeEndpointInAllProjects(UserInfo userInfo, String endpointName, List<ProjectDTO> projects) {
-		projects.forEach(project -> projectService.terminateEndpoint(userInfo, endpointName, project.getName()));
-	}
-
-	@Override
-	public CloudProvider checkUrl(UserInfo userInfo, String url) {
-		Response response;
-		CloudProvider cloudProvider;
-		try {
-			response = provisioningService.get(url + HEALTH_CHECK, userInfo.getAccessToken(), Response.class);
-			cloudProvider = response.readEntity(CloudProvider.class);
-		} catch (Exception e) {
-			log.error("Cannot connect to url '{}'. {}", url, e.getMessage());
-			throw new DlabException(String.format("Cannot connect to url '%s'. %s", url, e.getMessage()));
-		}
-		if (response.getStatus() != 200) {
-			log.warn("Endpoint url {} is not valid", url);
-			throw new ResourceNotFoundException(String.format("Endpoint url '%s' is not valid", url));
-		}
-		return cloudProvider;
-	}
-
-	private void checkProjectEndpointResourcesStatuses(List<ProjectDTO> projects, String endpoint) {
-		boolean isTerminationEnabled = projects.stream().anyMatch(p ->
-				!projectService.checkExploratoriesAndComputationalProgress(p.getName(), Collections.singletonList(endpoint)) ||
-						p.getEndpoints().stream().anyMatch(e -> e.getName().equals(endpoint) &&
-								Arrays.asList(UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.STOPPING,
-										UserInstanceStatus.TERMINATING).contains(e.getStatus())));
-
-		if (isTerminationEnabled) {
-			throw new ResourceConflictException(("Can not terminate resources of endpoint because one of project " +
-					"resource is in processing stage"));
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImpl.java
deleted file mode 100644
index 8b2806b..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImpl.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.annotation.Project;
-import com.epam.dlab.backendapi.annotation.ProjectAdmin;
-import com.epam.dlab.backendapi.annotation.User;
-import com.epam.dlab.backendapi.dao.EnvDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.UserSettingsDAO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.resources.dto.UserDTO;
-import com.epam.dlab.backendapi.resources.dto.UserResourceInfo;
-import com.epam.dlab.backendapi.service.ComputationalService;
-import com.epam.dlab.backendapi.service.EnvironmentService;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.exceptions.ResourceConflictException;
-import com.epam.dlab.model.ResourceEnum;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Stream;
-
-import static com.epam.dlab.backendapi.resources.dto.UserDTO.Status.ACTIVE;
-import static com.epam.dlab.backendapi.resources.dto.UserDTO.Status.NOT_ACTIVE;
-import static java.util.stream.Collectors.toList;
-
-@Singleton
-@Slf4j
-public class EnvironmentServiceImpl implements EnvironmentService {
-	private static final String ERROR_MSG_FORMAT = "Can not %s environment because on of user resource is in status " +
-			"CREATING or STARTING";
-
-	private final EnvDAO envDAO;
-	private final UserSettingsDAO settingsDAO;
-	private final ExploratoryDAO exploratoryDAO;
-	private final ExploratoryService exploratoryService;
-	private final ComputationalService computationalService;
-	private final SecurityService securityService;
-	private final ProjectService projectService;
-
-	@Inject
-	public EnvironmentServiceImpl(EnvDAO envDAO, UserSettingsDAO settingsDAO, ExploratoryDAO exploratoryDAO,
-								  ExploratoryService exploratoryService, ComputationalService computationalService,
-								  SecurityService securityService, ProjectService projectService) {
-		this.envDAO = envDAO;
-		this.settingsDAO = settingsDAO;
-		this.exploratoryDAO = exploratoryDAO;
-		this.exploratoryService = exploratoryService;
-		this.computationalService = computationalService;
-		this.securityService = securityService;
-		this.projectService = projectService;
-	}
-
-	@Override
-	public List<UserDTO> getUsers() {
-		final Set<String> activeUsers = envDAO.fetchActiveEnvUsers();
-		log.trace("Active users: {}", activeUsers);
-		final Set<String> notActiveUsers = envDAO.fetchUsersNotIn(activeUsers);
-		log.trace("Not active users: {}", notActiveUsers);
-		final Stream<UserDTO> activeUsersStream = activeUsers
-				.stream()
-				.map(u -> toUserDTO(u, ACTIVE));
-		final Stream<UserDTO> notActiveUsersStream = notActiveUsers
-				.stream()
-				.map(u -> toUserDTO(u, NOT_ACTIVE));
-		return Stream.concat(activeUsersStream, notActiveUsersStream)
-				.collect(toList());
-	}
-
-	@Override
-	public List<UserResourceInfo> getAllEnv(UserInfo user) {
-		log.debug("Getting all user's environment...");
-		List<UserInstanceDTO> expList = exploratoryDAO.getInstances();
-		return projectService.getProjects(user)
-				.stream()
-				.map(projectDTO -> getProjectEnv(projectDTO, expList))
-				.flatMap(Collection::stream)
-				.collect(toList());
-	}
-
-	@Override
-	public void stopAll() {
-		log.debug("Stopping environment for all users...");
-		projectService.getProjects()
-				.stream()
-				.map(ProjectDTO::getName)
-				.forEach(this::stopProjectEnvironment);
-	}
-
-	@Override
-	public void stopEnvironmentWithServiceAccount(String user) {
-		log.debug("Stopping environment for user {} by scheduler", user);
-		checkState(user, "stop");
-		exploratoryDAO.fetchRunningExploratoryFields(user)
-				.forEach(this::stopNotebookWithServiceAccount);
-	}
-
-	@Override
-	public void stopProjectEnvironment(String project) {
-		log.debug("Stopping environment for project {}", project);
-		checkProjectResourceConditions(project, "stop");
-		exploratoryDAO.fetchRunningExploratoryFieldsForProject(project)
-				.forEach(this::stopNotebookWithServiceAccount);
-
-		projectService.get(project).getEndpoints().stream()
-				.filter(e -> UserInstanceStatus.RUNNING == e.getStatus())
-				.forEach(endpoint -> projectService.stop(securityService.getServiceAccountInfo("admin"),
-						endpoint.getName(), project));
-	}
-
-	@ProjectAdmin
-	@Override
-	public void stopExploratory(@User UserInfo userInfo, String user, @Project String project, String exploratoryName) {
-		exploratoryService.stop(new UserInfo(user, userInfo.getAccessToken()), project, exploratoryName);
-	}
-
-	@ProjectAdmin
-	@Override
-	public void stopComputational(@User UserInfo userInfo, String user, @Project String project, String exploratoryName,
-								  String computationalName) {
-		computationalService.stopSparkCluster(new UserInfo(user, userInfo.getAccessToken()), project, exploratoryName,
-				computationalName);
-	}
-
-	@ProjectAdmin
-	@Override
-	public void terminateExploratory(@User UserInfo userInfo, String user, @Project String project, String exploratoryName) {
-		exploratoryService.terminate(new UserInfo(user, userInfo.getAccessToken()), project, exploratoryName);
-	}
-
-	@ProjectAdmin
-	@Override
-	public void terminateComputational(@User UserInfo userInfo, String user, @Project String project,
-									   String exploratoryName, String computationalName) {
-		computationalService.terminateComputational(new UserInfo(user, userInfo.getAccessToken()), project, exploratoryName,
-				computationalName);
-	}
-
-	private UserDTO toUserDTO(String u, UserDTO.Status status) {
-		return new UserDTO(u, settingsDAO.getAllowedBudget(u).orElse(null), status);
-	}
-
-	private void checkState(String user, String action) {
-		final List<UserInstanceDTO> userInstances = exploratoryDAO
-				.fetchUserExploratoriesWhereStatusIn(user,
-						Arrays.asList(UserInstanceStatus.CREATING,
-								UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE),
-						UserInstanceStatus.CREATING,
-						UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE);
-		if (!userInstances.isEmpty()) {
-			log.error(String.format(ERROR_MSG_FORMAT, action));
-			throw new ResourceConflictException(String.format(ERROR_MSG_FORMAT, action));
-		}
-	}
-
-	private void stopNotebookWithServiceAccount(UserInstanceDTO instance) {
-		final UserInfo userInfo = securityService.getServiceAccountInfo(instance.getUser());
-		exploratoryService.stop(userInfo, instance.getProject(), instance.getExploratoryName());
-	}
-
-	private List<UserResourceInfo> getProjectEnv(ProjectDTO projectDTO, List<UserInstanceDTO> allInstances) {
-		final Stream<UserResourceInfo> userResources = allInstances
-				.stream()
-				.filter(instance -> instance.getProject().equals(projectDTO.getName()))
-				.map(this::toUserResourceInfo);
-		if (projectDTO.getEndpoints() != null) {
-			final Stream<UserResourceInfo> edges = projectDTO.getEndpoints()
-					.stream()
-					.map(e -> new UserResourceInfo().withResourceType(ResourceEnum.EDGE_NODE)
-							.withResourceStatus(e.getStatus().toString())
-							.withProject(projectDTO.getName())
-							.withIp(e.getEdgeInfo() != null ? e.getEdgeInfo().getPublicIp() : null));
-			return Stream.concat(edges, userResources).collect(toList());
-		} else {
-			return userResources.collect(toList());
-		}
-	}
-
-	private UserResourceInfo toUserResourceInfo(UserInstanceDTO userInstance) {
-		return new UserResourceInfo().withResourceType(ResourceEnum.NOTEBOOK)
-				.withResourceName(userInstance.getExploratoryName())
-				.withResourceShape(userInstance.getShape())
-				.withResourceStatus(userInstance.getStatus())
-				.withCompResources(userInstance.getResources())
-				.withUser(userInstance.getUser())
-				.withProject(userInstance.getProject())
-				.withCloudProvider(userInstance.getCloudProvider());
-	}
-
-	private void checkProjectResourceConditions(String project, String action) {
-		final List<UserInstanceDTO> userInstances = exploratoryDAO
-				.fetchProjectExploratoriesWhereStatusIn(project,
-						Arrays.asList(UserInstanceStatus.CREATING, UserInstanceStatus.STARTING,
-								UserInstanceStatus.CREATING_IMAGE),
-						UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE);
-		if (!userInstances.isEmpty()) {
-			log.error(String.format(ERROR_MSG_FORMAT, action));
-			throw new ResourceConflictException(String.format(ERROR_MSG_FORMAT, action));
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java
deleted file mode 100644
index 9f6be91..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImpl.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.annotation.BudgetLimited;
-import com.epam.dlab.backendapi.annotation.Project;
-import com.epam.dlab.backendapi.dao.ComputationalDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.GitCredsDAO;
-import com.epam.dlab.backendapi.dao.ImageExploratoryDao;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.resources.dto.ExploratoryCreatePopUp;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.TagService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.StatusEnvBaseDTO;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryReconfigureSparkClusterActionDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryStatusDTO;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import com.epam.dlab.dto.exploratory.LibStatus;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.model.exploratory.Exploratory;
-import com.epam.dlab.model.library.Library;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
-import static com.epam.dlab.dto.UserInstanceStatus.FAILED;
-import static com.epam.dlab.dto.UserInstanceStatus.STARTING;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPED;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPING;
-import static com.epam.dlab.dto.UserInstanceStatus.TERMINATED;
-import static com.epam.dlab.dto.UserInstanceStatus.TERMINATING;
-import static com.epam.dlab.rest.contracts.ExploratoryAPI.EXPLORATORY_CREATE;
-import static com.epam.dlab.rest.contracts.ExploratoryAPI.EXPLORATORY_RECONFIGURE_SPARK;
-import static com.epam.dlab.rest.contracts.ExploratoryAPI.EXPLORATORY_START;
-import static com.epam.dlab.rest.contracts.ExploratoryAPI.EXPLORATORY_STOP;
-import static com.epam.dlab.rest.contracts.ExploratoryAPI.EXPLORATORY_TERMINATE;
-
-@Slf4j
-@Singleton
-public class ExploratoryServiceImpl implements ExploratoryService {
-
-	@Inject
-	private ProjectService projectService;
-	@Inject
-	private ExploratoryDAO exploratoryDAO;
-	@Inject
-	private ComputationalDAO computationalDAO;
-	@Inject
-	private GitCredsDAO gitCredsDAO;
-	@Inject
-	private ImageExploratoryDao imageExploratoryDao;
-	@Inject
-	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-	@Inject
-	private RequestBuilder requestBuilder;
-	@Inject
-	private RequestId requestId;
-	@Inject
-	private TagService tagService;
-	@Inject
-	private EndpointService endpointService;
-
-	@BudgetLimited
-	@Override
-	public String start(UserInfo userInfo, String exploratoryName, @Project String project) {
-		return action(userInfo, project, exploratoryName, EXPLORATORY_START, STARTING);
-	}
-
-	@Override
-	public String stop(UserInfo userInfo, String project, String exploratoryName) {
-		return action(userInfo, project, exploratoryName, EXPLORATORY_STOP, STOPPING);
-	}
-
-	@Override
-	public String terminate(UserInfo userInfo, String project, String exploratoryName) {
-		return action(userInfo, project, exploratoryName, EXPLORATORY_TERMINATE, TERMINATING);
-	}
-
-	@BudgetLimited
-	@Override
-	public String create(UserInfo userInfo, Exploratory exploratory, @Project String project) {
-		boolean isAdded = false;
-		try {
-			final ProjectDTO projectDTO = projectService.get(project);
-			final EndpointDTO endpointDTO = endpointService.get(exploratory.getEndpoint());
-			final UserInstanceDTO userInstanceDTO = getUserInstanceDTO(userInfo, exploratory, project, endpointDTO.getCloudProvider());
-			exploratoryDAO.insertExploratory(userInstanceDTO);
-			isAdded = true;
-			final ExploratoryGitCredsDTO gitCreds = gitCredsDAO.findGitCreds(userInfo.getName());
-			log.debug("Created exploratory environment {} for user {}", exploratory.getName(), userInfo.getName());
-			final String uuid =
-					provisioningService.post(endpointDTO.getUrl() + EXPLORATORY_CREATE,
-							userInfo.getAccessToken(),
-							requestBuilder.newExploratoryCreate(projectDTO, endpointDTO, exploratory, userInfo,
-									gitCreds, userInstanceDTO.getTags()),
-							String.class);
-			requestId.put(userInfo.getName(), uuid);
-			return uuid;
-		} catch (Exception t) {
-			log.error("Could not update the status of exploratory environment {} with name {} for user {}",
-					exploratory.getDockerImage(), exploratory.getName(), userInfo.getName(), t);
-			if (isAdded) {
-				updateExploratoryStatusSilent(userInfo.getName(), project, exploratory.getName(), FAILED);
-			}
-			throw new DlabException("Could not create exploratory environment " + exploratory.getName() + " for user "
-					+ userInfo.getName() + ": " + Optional.ofNullable(t.getCause()).map(Throwable::getMessage).orElse(t.getMessage()), t);
-		}
-	}
-
-	@Override
-	public void updateProjectExploratoryStatuses(String project, String endpoint, UserInstanceStatus status) {
-		exploratoryDAO.fetchProjectExploratoriesWhereStatusNotIn(project, endpoint, TERMINATED, FAILED)
-				.forEach(ui -> updateExploratoryStatus(project, ui.getExploratoryName(), status, ui.getUser()));
-	}
-
-	@Override
-	public void updateClusterConfig(UserInfo userInfo, String project, String exploratoryName, List<ClusterConfig> config) {
-		final String userName = userInfo.getName();
-		final String token = userInfo.getAccessToken();
-		final UserInstanceDTO userInstanceDTO = exploratoryDAO.fetchRunningExploratoryFields(userName, project, exploratoryName);
-		EndpointDTO endpointDTO = endpointService.get(userInstanceDTO.getEndpoint());
-		final ExploratoryReconfigureSparkClusterActionDTO updateClusterConfigDTO =
-				requestBuilder.newClusterConfigUpdate(userInfo, userInstanceDTO, config, endpointDTO);
-		final String uuid = provisioningService.post(endpointDTO.getUrl() + EXPLORATORY_RECONFIGURE_SPARK,
-				token, updateClusterConfigDTO,
-				String.class);
-		requestId.put(userName, uuid);
-		exploratoryDAO.updateExploratoryFields(new ExploratoryStatusDTO()
-				.withUser(userName)
-				.withProject(project)
-				.withExploratoryName(exploratoryName)
-				.withConfig(config)
-				.withStatus(UserInstanceStatus.RECONFIGURING.toString()));
-	}
-
-	/**
-	 * Returns user instance's data by it's name.
-	 *
-	 * @param user            user.
-	 * @param project
-	 * @param exploratoryName name of exploratory.
-	 * @return corresponding user instance's data or empty data if resource doesn't exist.
-	 */
-	@Override
-	public Optional<UserInstanceDTO> getUserInstance(String user, String project, String exploratoryName) {
-		try {
-			return Optional.of(exploratoryDAO.fetchExploratoryFields(user, project, exploratoryName));
-		} catch (DlabException e) {
-			log.warn("User instance with exploratory {}, project {} for user {} not found.", exploratoryName, project, user);
-		}
-		return Optional.empty();
-	}
-
-	@Override
-	public Optional<UserInstanceDTO> getUserInstance(String user, String project, String exploratoryName, boolean includeCompResources) {
-		try {
-			return Optional.of(exploratoryDAO.fetchExploratoryFields(user, project, exploratoryName, includeCompResources));
-		} catch (DlabException e) {
-			log.warn("User instance with exploratory {}, project {} for user {} not found.", exploratoryName, project, user);
-		}
-		return Optional.empty();
-	}
-
-	@Override
-	public List<UserInstanceDTO> findAll() {
-		return exploratoryDAO.getInstances();
-	}
-
-	@Override
-	public List<UserInstanceDTO> findAll(Set<ProjectDTO> projects) {
-		List<String> projectNames = projects
-				.stream()
-				.map(ProjectDTO::getName)
-				.collect(Collectors.toList());
-		return exploratoryDAO.fetchExploratoryFieldsForProjectWithComp(projectNames);
-	}
-
-	@Override
-	public List<ClusterConfig> getClusterConfig(UserInfo user, String project, String exploratoryName) {
-		return exploratoryDAO.getClusterConfig(user.getName(), project, exploratoryName);
-	}
-
-	@Override
-	public ExploratoryCreatePopUp getUserInstances(UserInfo user) {
-		List<ProjectDTO> userProjects = projectService.getUserProjects(user, false);
-		Map<String, List<String>> collect = userProjects.stream()
-				.collect(Collectors.toMap(ProjectDTO::getName, this::getProjectExploratoryNames));
-		return new ExploratoryCreatePopUp(userProjects, collect);
-	}
-
-	private List<String> getProjectExploratoryNames(ProjectDTO project) {
-		return exploratoryDAO.fetchExploratoryFieldsForProject(project.getName()).stream()
-				.map(UserInstanceDTO::getExploratoryName)
-				.collect(Collectors.toList());
-	}
-
-
-	private List<UserComputationalResource> computationalResourcesWithStatus(UserInstanceDTO userInstance,
-																			 UserInstanceStatus computationalStatus) {
-		return userInstance.getResources().stream()
-				.filter(resource -> resource.getStatus().equals(computationalStatus.toString()))
-				.collect(Collectors.toList());
-	}
-
-	/**
-	 * Sends the post request to the provisioning service and update the status of exploratory environment.
-	 *
-	 * @param userInfo        user info.
-	 * @param project         name of project
-	 * @param exploratoryName name of exploratory environment.
-	 * @param action          action for exploratory environment.
-	 * @param status          status for exploratory environment.
-	 * @return Invocation request as JSON string.
-	 */
-	private String action(UserInfo userInfo, String project, String exploratoryName, String action, UserInstanceStatus status) {
-		try {
-			updateExploratoryStatus(project, exploratoryName, status, userInfo.getName());
-
-			UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(userInfo.getName(), project, exploratoryName);
-			EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-			final String uuid =
-					provisioningService.post(endpointDTO.getUrl() + action, userInfo.getAccessToken(),
-							getExploratoryActionDto(userInfo, status, userInstance, endpointDTO), String.class);
-			requestId.put(userInfo.getName(), uuid);
-			return uuid;
-		} catch (Exception t) {
-			log.error("Could not {} exploratory environment {} for user {}",
-					StringUtils.substringAfter(action, "/"), exploratoryName, userInfo.getName(), t);
-			updateExploratoryStatusSilent(userInfo.getName(), project, exploratoryName, FAILED);
-			final String errorMsg = String.format("Could not %s exploratory environment %s: %s",
-					StringUtils.substringAfter(action, "/"), exploratoryName,
-					Optional.ofNullable(t.getCause()).map(Throwable::getMessage).orElse(t.getMessage()));
-			throw new DlabException(errorMsg, t);
-		}
-	}
-
-	private void updateExploratoryStatus(String project, String exploratoryName, UserInstanceStatus status, String user) {
-		updateExploratoryStatus(user, project, exploratoryName, status);
-
-		if (status == STOPPING) {
-			updateComputationalStatuses(user, project, exploratoryName, STOPPING, TERMINATING, FAILED, TERMINATED, STOPPED);
-		} else if (status == TERMINATING) {
-			updateComputationalStatuses(user, project, exploratoryName, TERMINATING, TERMINATING, TERMINATED, FAILED);
-		} else if (status == TERMINATED) {
-			updateComputationalStatuses(user, project, exploratoryName, TERMINATED, TERMINATED, TERMINATED, FAILED);
-		}
-	}
-
-	private ExploratoryActionDTO<?> getExploratoryActionDto(UserInfo userInfo, UserInstanceStatus status,
-															UserInstanceDTO userInstance, EndpointDTO endpointDTO) {
-		ExploratoryActionDTO<?> dto;
-		if (status != UserInstanceStatus.STARTING) {
-			dto = requestBuilder.newExploratoryStop(userInfo, userInstance, endpointDTO);
-		} else {
-			dto = requestBuilder.newExploratoryStart(
-					userInfo, userInstance, endpointDTO, gitCredsDAO.findGitCreds(userInfo.getName()));
-
-		}
-		return dto;
-	}
-
-
-	/**
-	 * Updates the status of exploratory environment.
-	 *
-	 * @param user            user name
-	 * @param project         project name
-	 * @param exploratoryName name of exploratory environment.
-	 * @param status          status for exploratory environment.
-	 */
-	private void updateExploratoryStatus(String user, String project, String exploratoryName, UserInstanceStatus status) {
-		StatusEnvBaseDTO<?> exploratoryStatus = createStatusDTO(user, project, exploratoryName, status);
-		exploratoryDAO.updateExploratoryStatus(exploratoryStatus);
-	}
-
-	/**
-	 * Updates the status of exploratory environment without exceptions. If exception occurred then logging it.
-	 *
-	 * @param user            user name
-	 * @param project         project name
-	 * @param exploratoryName name of exploratory environment.
-	 * @param status          status for exploratory environment.
-	 */
-	private void updateExploratoryStatusSilent(String user, String project, String exploratoryName, UserInstanceStatus status) {
-		try {
-			updateExploratoryStatus(user, project, exploratoryName, status);
-		} catch (DlabException e) {
-			log.error("Could not update the status of exploratory environment {} for user {} to {}",
-					exploratoryName, user, status, e);
-		}
-	}
-
-	private void updateComputationalStatuses(String user, String project, String exploratoryName, UserInstanceStatus
-			dataEngineStatus, UserInstanceStatus dataEngineServiceStatus, UserInstanceStatus... excludedStatuses) {
-		log.debug("updating status for all computational resources of {} for user {}: DataEngine {}, " +
-				"dataengine-service {}", exploratoryName, user, dataEngineStatus, dataEngineServiceStatus);
-		computationalDAO.updateComputationalStatusesForExploratory(user, project, exploratoryName,
-				dataEngineStatus, dataEngineServiceStatus, excludedStatuses);
-	}
-
-	/**
-	 * Instantiates and returns the descriptor of exploratory environment status.
-	 *
-	 * @param user            user name
-	 * @param project         project
-	 * @param exploratoryName name of exploratory environment.
-	 * @param status          status for exploratory environment.
-	 */
-	private StatusEnvBaseDTO<?> createStatusDTO(String user, String project, String exploratoryName, UserInstanceStatus status) {
-		return new ExploratoryStatusDTO()
-				.withUser(user)
-				.withProject(project)
-				.withExploratoryName(exploratoryName)
-				.withStatus(status);
-	}
-
-	private UserInstanceDTO getUserInstanceDTO(UserInfo userInfo, Exploratory exploratory, String project, CloudProvider cloudProvider) {
-		final UserInstanceDTO userInstance = new UserInstanceDTO()
-				.withUser(userInfo.getName())
-				.withExploratoryName(exploratory.getName())
-				.withStatus(CREATING.toString())
-				.withImageName(exploratory.getDockerImage())
-				.withImageVersion(exploratory.getVersion())
-				.withTemplateName(exploratory.getTemplateName())
-				.withClusterConfig(exploratory.getClusterConfig())
-				.withShape(exploratory.getShape())
-				.withProject(project)
-				.withEndpoint(exploratory.getEndpoint())
-				.withCloudProvider(cloudProvider.toString())
-				.withTags(tagService.getResourceTags(userInfo, exploratory.getEndpoint(), project,
-						exploratory.getExploratoryTag()));
-		if (StringUtils.isNotBlank(exploratory.getImageName())) {
-			final List<LibInstallDTO> libInstallDtoList = getImageRelatedLibraries(userInfo, exploratory.getImageName(),
-					project, exploratory.getEndpoint());
-			userInstance.withLibs(libInstallDtoList);
-		}
-		return userInstance;
-	}
-
-	private List<LibInstallDTO> getImageRelatedLibraries(UserInfo userInfo, String imageFullName, String project,
-														 String endpoint) {
-		final List<Library> libraries = imageExploratoryDao.getLibraries(userInfo.getName(), imageFullName, project,
-				endpoint, LibStatus.INSTALLED);
-		return toLibInstallDtoList(libraries);
-	}
-
-	private List<LibInstallDTO> toLibInstallDtoList(List<Library> libraries) {
-		return libraries
-				.stream()
-				.map(this::toLibInstallDto)
-				.collect(Collectors.toList());
-	}
-
-	private LibInstallDTO toLibInstallDto(Library l) {
-		return new LibInstallDTO(l.getGroup(), l.getName(), l.getVersion())
-				.withStatus(l.getStatus().toString())
-				.withErrorMessage(l.getErrorMessage());
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/GitCredentialServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/GitCredentialServiceImpl.java
deleted file mode 100644
index 6d94a0b..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/GitCredentialServiceImpl.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.GitCredsDAO;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.GitCredentialService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.stream.Collectors;
-
-import static com.epam.dlab.rest.contracts.ExploratoryAPI.EXPLORATORY_GIT_CREDS;
-
-@Slf4j
-@Singleton
-public class GitCredentialServiceImpl implements GitCredentialService {
-
-	private static final boolean CLEAR_USER_PASSWORD = true;
-	@Inject
-	private GitCredsDAO gitCredsDAO;
-	@Inject
-	private ExploratoryDAO exploratoryDAO;
-	@Inject
-	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-	@Inject
-	private RequestBuilder requestBuilder;
-	@Inject
-	private RequestId requestId;
-	@Inject
-	private EndpointService endpointService;
-
-	@Override
-	public void updateGitCredentials(UserInfo userInfo, ExploratoryGitCredsDTO formDTO) {
-		log.debug("Updating GIT creds for user {} to {}", userInfo.getName(), formDTO);
-		try {
-			gitCredsDAO.updateGitCreds(userInfo.getName(), formDTO);
-			final String failedNotebooks = exploratoryDAO.fetchRunningExploratoryFields(userInfo.getName())
-					.stream()
-					.filter(ui -> !updateNotebookGitCredentials(userInfo, formDTO, ui))
-					.map(UserInstanceDTO::getExploratoryName)
-					.collect(Collectors.joining(","));
-			if (StringUtils.isNotEmpty(failedNotebooks)) {
-				throw new DlabException("Requests for notebooks failed: " + failedNotebooks);
-			}
-		} catch (Exception t) {
-			log.error("Cannot update the GIT creds for user {}", userInfo.getName(), t);
-			throw new DlabException("Cannot update the GIT credentials: " + t.getLocalizedMessage(), t);
-		}
-	}
-
-	@Override
-	public ExploratoryGitCredsDTO getGitCredentials(String user) {
-		log.debug("Loading GIT creds for user {}", user);
-		try {
-			return gitCredsDAO.findGitCreds(user, CLEAR_USER_PASSWORD);
-		} catch (Exception t) {
-			log.error("Cannot load list of GIT creds for user: {}", user, t);
-			throw new DlabException(String.format("Cannot load GIT credentials for user %s: %s",
-					user, t.getLocalizedMessage()), t);
-		}
-	}
-
-	private boolean updateNotebookGitCredentials(UserInfo userInfo, ExploratoryGitCredsDTO formDTO,
-												 UserInstanceDTO instance) {
-		boolean gitCredentialsUpdated = true;
-		try {
-			log.debug("Updating GIT creds for user {} on exploratory {}",
-					userInfo.getName(), instance.getExploratoryName());
-			EndpointDTO endpointDTO = endpointService.get(instance.getEndpoint());
-			ExploratoryGitCredsUpdateDTO dto = requestBuilder.newGitCredentialsUpdate(userInfo, instance, endpointDTO, formDTO);
-			final String uuid = provisioningService.post(endpointDTO.getUrl() + EXPLORATORY_GIT_CREDS,
-							userInfo.getAccessToken(), dto, String.class);
-			requestId.put(userInfo.getName(), uuid);
-		} catch (Exception t) {
-			log.error("Cannot update the GIT creds for user {} on exploratory {}", userInfo.getName(),
-					instance.getExploratoryName(), t);
-			gitCredentialsUpdated = false;
-		}
-		return gitCredentialsUpdated;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/GuacamoleServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/GuacamoleServiceImpl.java
deleted file mode 100644
index 555479b..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/GuacamoleServiceImpl.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.GuacamoleService;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.KeyAPI;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.guacamole.net.GuacamoleTunnel;
-import org.apache.guacamole.net.InetGuacamoleSocket;
-import org.apache.guacamole.net.SimpleGuacamoleTunnel;
-import org.apache.guacamole.protocol.ConfiguredGuacamoleSocket;
-import org.apache.guacamole.protocol.GuacamoleConfiguration;
-
-import javax.inject.Named;
-import java.net.URI;
-import java.util.Map;
-
-@Slf4j
-@Singleton
-public class GuacamoleServiceImpl implements GuacamoleService {
-
-	private static final String PRIVATE_KEY_PARAM_NAME = "private-key";
-	private static final String HOSTNAME_PARAM = "hostname";
-	private static final String CONNECTION_PROTOCOL_PARAM = "connectionProtocol";
-	private static final String SERVER_HOST_PARAM = "serverHost";
-	private final SelfServiceApplicationConfiguration conf;
-	private final RESTService provisioningService;
-	private final EndpointService endpointService;
-
-	@Inject
-	public GuacamoleServiceImpl(SelfServiceApplicationConfiguration conf,
-								@Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
-								EndpointService endpointService) {
-		this.conf = conf;
-		this.provisioningService = provisioningService;
-		this.endpointService = endpointService;
-	}
-
-	@Override
-	public GuacamoleTunnel getTunnel(UserInfo userInfo, String host, String endpoint) {
-		try {
-			final String url = endpointService.get(endpoint).getUrl();
-			String key = provisioningService.get(url + KeyAPI.GET_ADMIN_KEY,
-					userInfo.getAccessToken(), String.class);
-			final String guacamoleServerHost = new URI(url).getHost();
-			InetGuacamoleSocket socket = new InetGuacamoleSocket(guacamoleServerHost, conf.getGuacamolePort());
-			final Map<String, String> guacamoleConf = conf.getGuacamole();
-			guacamoleConf.put(SERVER_HOST_PARAM, guacamoleServerHost);
-			GuacamoleConfiguration guacamoleConfig = getGuacamoleConfig(key, guacamoleConf, host);
-			return new SimpleGuacamoleTunnel(new ConfiguredGuacamoleSocket(socket, guacamoleConfig));
-		} catch (Exception e) {
-			log.error("Can not create guacamole tunnel due to: " + e.getMessage());
-			throw new DlabException("Can not create guacamole tunnel due to: " + e.getMessage(), e);
-		}
-	}
-
-	private GuacamoleConfiguration getGuacamoleConfig(String privateKeyContent, Map<String, String> guacamoleParams,
-													  String host) {
-		GuacamoleConfiguration guacamoleConfiguration = new GuacamoleConfiguration();
-		guacamoleConfiguration.setProtocol(guacamoleParams.get(CONNECTION_PROTOCOL_PARAM));
-		guacamoleConfiguration.setParameters(guacamoleParams);
-		guacamoleConfiguration.setParameter(HOSTNAME_PARAM, host);
-		guacamoleConfiguration.setParameter(PRIVATE_KEY_PARAM_NAME, privateKeyContent);
-		return guacamoleConfiguration;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImpl.java
deleted file mode 100644
index 5cb3a64..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImpl.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryLibDAO;
-import com.epam.dlab.backendapi.dao.ImageExploratoryDao;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.resources.dto.ImageInfoRecord;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.ImageExploratoryService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.exploratory.ExploratoryStatusDTO;
-import com.epam.dlab.dto.exploratory.ImageStatus;
-import com.epam.dlab.exceptions.ResourceAlreadyExistException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.model.ResourceType;
-import com.epam.dlab.model.exploratory.Image;
-import com.epam.dlab.model.library.Library;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ExploratoryAPI;
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.List;
-import java.util.Map;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-@Singleton
-@Slf4j
-public class ImageExploratoryServiceImpl implements ImageExploratoryService {
-
-	private static final String IMAGE_EXISTS_MSG = "Image with name %s is already exist in project %s";
-	private static final String IMAGE_NOT_FOUND_MSG = "Image with name %s was not found for user %s";
-
-	@Inject
-	private ExploratoryDAO exploratoryDAO;
-	@Inject
-	private ImageExploratoryDao imageExploratoryDao;
-	@Inject
-	private ExploratoryLibDAO libDAO;
-	@Inject
-	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-	@Inject
-	private RequestBuilder requestBuilder;
-	@Inject
-	private EndpointService endpointService;
-	@Inject
-	private ProjectService projectService;
-
-	@Override
-	public String createImage(UserInfo user, String project, String exploratoryName, String imageName, String imageDescription) {
-		ProjectDTO projectDTO = projectService.get(project);
-		UserInstanceDTO userInstance = exploratoryDAO.fetchRunningExploratoryFields(user.getName(), project, exploratoryName);
-
-		if (imageExploratoryDao.exist(imageName, userInstance.getProject())) {
-			log.error(String.format(IMAGE_EXISTS_MSG, imageName, userInstance.getProject()));
-			throw new ResourceAlreadyExistException(String.format(IMAGE_EXISTS_MSG, imageName, userInstance.getProject()));
-		}
-		final List<Library> libraries = libDAO.getLibraries(user.getName(), project, exploratoryName);
-
-		imageExploratoryDao.save(Image.builder()
-				.name(imageName)
-				.description(imageDescription)
-				.status(ImageStatus.CREATING)
-				.user(user.getName())
-				.libraries(fetchExploratoryLibs(libraries))
-				.computationalLibraries(fetchComputationalLibs(libraries))
-				.dockerImage(userInstance.getImageName())
-				.exploratoryId(userInstance.getId())
-				.project(userInstance.getProject())
-				.endpoint(userInstance.getEndpoint())
-				.build());
-
-		exploratoryDAO.updateExploratoryStatus(new ExploratoryStatusDTO()
-				.withUser(user.getName())
-				.withProject(project)
-				.withExploratoryName(exploratoryName)
-				.withStatus(UserInstanceStatus.CREATING_IMAGE));
-
-		EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-		return provisioningService.post(endpointDTO.getUrl() + ExploratoryAPI.EXPLORATORY_IMAGE,
-				user.getAccessToken(),
-				requestBuilder.newExploratoryImageCreate(user, userInstance, imageName, endpointDTO, projectDTO), String.class);
-	}
-
-	@Override
-	public void finishImageCreate(Image image, String exploratoryName, String newNotebookIp) {
-		log.debug("Returning exploratory status with name {} to RUNNING for user {}",
-				exploratoryName, image.getUser());
-		exploratoryDAO.updateExploratoryStatus(new ExploratoryStatusDTO()
-				.withUser(image.getUser())
-				.withProject(image.getProject())
-				.withExploratoryName(exploratoryName)
-				.withStatus(UserInstanceStatus.RUNNING));
-		imageExploratoryDao.updateImageFields(image);
-		if (newNotebookIp != null) {
-			log.debug("Changing exploratory ip with name {} for user {} to {}", exploratoryName, image.getUser(),
-					newNotebookIp);
-			exploratoryDAO.updateExploratoryIp(image.getUser(), image.getProject(), newNotebookIp, exploratoryName);
-		}
-
-	}
-
-	@Override
-	public List<ImageInfoRecord> getNotFailedImages(String user, String dockerImage, String project, String endpoint) {
-		return imageExploratoryDao.getImages(user, dockerImage, project, endpoint, ImageStatus.CREATED, ImageStatus.CREATING);
-	}
-
-	@Override
-	public ImageInfoRecord getImage(String user, String name, String project, String endpoint) {
-		return imageExploratoryDao.getImage(user, name, project, endpoint).orElseThrow(() ->
-				new ResourceNotFoundException(String.format(IMAGE_NOT_FOUND_MSG, name, user)));
-	}
-
-	@Override
-	public List<ImageInfoRecord> getImagesForProject(String project) {
-		return imageExploratoryDao.getImagesForProject(project);
-	}
-
-	private Map<String, List<Library>> fetchComputationalLibs(List<Library> libraries) {
-		return libraries.stream()
-				.filter(resourceTypePredicate(ResourceType.COMPUTATIONAL))
-				.collect(Collectors.toMap(Library::getResourceName, Lists::newArrayList, this::merge));
-	}
-
-	private List<Library> merge(List<Library> oldValue, List<Library> newValue) {
-		oldValue.addAll(newValue);
-		return oldValue;
-	}
-
-	private List<Library> fetchExploratoryLibs(List<Library> libraries) {
-		return libraries.stream()
-				.filter(resourceTypePredicate(ResourceType.EXPLORATORY))
-				.collect(Collectors.toList());
-	}
-
-	private Predicate<Library> resourceTypePredicate(ResourceType resourceType) {
-		return l -> resourceType == l.getType();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InactivityServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InactivityServiceImpl.java
deleted file mode 100644
index dd370dd..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InactivityServiceImpl.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ComputationalDAO;
-import com.epam.dlab.backendapi.dao.EnvDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.InactivityService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.computational.ComputationalCheckInactivityDTO;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.dto.exploratory.ExploratoryCheckInactivityAction;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.InfrasctructureAPI;
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-
-import java.time.LocalDateTime;
-
-@Slf4j
-public class InactivityServiceImpl implements InactivityService {
-	@Inject
-	private ExploratoryDAO exploratoryDAO;
-	@Inject
-	private ComputationalDAO computationalDAO;
-	@Inject
-	private EnvDAO envDAO;
-	@Inject
-	private RequestBuilder requestBuilder;
-	@Inject
-	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-	@Inject
-	private RequestId requestId;
-	@Inject
-	private SecurityService securityService;
-	@Inject
-	private EndpointService endpointService;
-
-	@Override
-	public void updateRunningResourcesLastActivity() {
-		envDAO.findRunningResourcesForCheckInactivity()
-				.forEach(this::updateLastActivity);
-	}
-
-	@Override
-	public void updateLastActivityForExploratory(UserInfo userInfo, String exploratoryName,
-												 LocalDateTime lastActivity) {
-		exploratoryDAO.updateLastActivity(userInfo.getName(), exploratoryName, lastActivity);
-	}
-
-	@Override
-	public void updateLastActivityForComputational(UserInfo userInfo, String project, String exploratoryName,
-												   String computationalName, LocalDateTime lastActivity) {
-		computationalDAO.updateLastActivity(userInfo.getName(), project, exploratoryName, computationalName, lastActivity);
-	}
-
-	private void updateLastActivity(UserInstanceDTO ui) {
-		if (UserInstanceStatus.RUNNING.toString().equals(ui.getStatus())) {
-			updateExploratoryLastActivity(securityService.getUserInfoOffline(ui.getUser()), ui);
-		}
-		ui.getResources()
-				.stream()
-				.filter(comp -> UserInstanceStatus.RUNNING.toString().equals(comp.getStatus()))
-				.forEach(cr -> updateComputationalLastActivity(securityService.getUserInfoOffline(ui.getUser()), ui, cr));
-	}
-
-	private void updateComputationalLastActivity(UserInfo userInfo, UserInstanceDTO ui, UserComputationalResource cr) {
-		EndpointDTO endpointDTO = endpointService.get(ui.getEndpoint());
-		final ComputationalCheckInactivityDTO dto = requestBuilder.newComputationalCheckInactivity(userInfo, ui, cr, endpointDTO);
-		final String uuid =
-				provisioningService.post(endpointDTO.getUrl() + InfrasctructureAPI.COMPUTATIONAL_CHECK_INACTIVITY,
-						userInfo.getAccessToken(), dto, String.class);
-		requestId.put(userInfo.getName(), uuid);
-	}
-
-	private void updateExploratoryLastActivity(UserInfo userInfo, UserInstanceDTO ui) {
-		EndpointDTO endpointDTO = endpointService.get(ui.getEndpoint());
-		final ExploratoryCheckInactivityAction dto =
-				requestBuilder.newExploratoryCheckInactivityAction(userInfo, ui, endpointDTO);
-		final String uuid =
-				provisioningService.post(endpointDTO.getUrl() + InfrasctructureAPI.EXPLORATORY_CHECK_INACTIVITY,
-						userInfo.getAccessToken(), dto, String.class);
-		requestId.put(userInfo.getName(), uuid);
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
deleted file mode 100644
index b1eac51..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.domain.BillingReport;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
-import com.epam.dlab.backendapi.resources.dto.HealthStatusEnum;
-import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
-import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.InfrastructureInfoService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.dto.InfrastructureMetaInfoDTO;
-import com.epam.dlab.dto.aws.edge.EdgeInfoAws;
-import com.epam.dlab.dto.azure.edge.EdgeInfoAzure;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.epam.dlab.dto.gcp.edge.EdgeInfoGcp;
-import com.epam.dlab.exceptions.DlabException;
-import com.google.inject.Inject;
-import com.jcabi.manifests.Manifests;
-import lombok.extern.slf4j.Slf4j;
-import org.bson.Document;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
-
-@Slf4j
-public class InfrastructureInfoServiceImpl implements InfrastructureInfoService {
-
-	private static final String RELEASE_NOTES_FORMAT = "https://github.com/apache/incubator-dlab/blob/%s" +
-			"/RELEASE_NOTES.md";
-	private final ExploratoryDAO expDAO;
-	private final SelfServiceApplicationConfiguration configuration;
-	private final BillingDAO billingDAO;
-	private final ProjectService projectService;
-	private final EndpointService endpointService;
-	private final BillingService billingService;
-
-	@Inject
-	public InfrastructureInfoServiceImpl(ExploratoryDAO expDAO, SelfServiceApplicationConfiguration configuration,
-										 BillingDAO billingDAO, ProjectService projectService, EndpointService endpointService,
-										 BillingService billingService) {
-		this.expDAO = expDAO;
-		this.configuration = configuration;
-		this.billingDAO = billingDAO;
-		this.projectService = projectService;
-		this.endpointService = endpointService;
-		this.billingService = billingService;
-	}
-
-	@Override
-	public List<ProjectInfrastructureInfo> getUserResources(UserInfo user) {
-		log.debug("Loading list of provisioned resources for user {}", user);
-		try {
-			Iterable<Document> documents = expDAO.findExploratory(user.getName());
-			List<EndpointDTO> allEndpoints = endpointService.getEndpoints();
-			return StreamSupport.stream(documents.spliterator(), false)
-					.collect(Collectors.groupingBy(d -> d.getString("project")))
-					.entrySet()
-					.stream()
-					.map(e -> {
-						List<ProjectEndpointDTO> endpoints = projectService.get(e.getKey()).getEndpoints();
-						List<EndpointDTO> endpointResult = allEndpoints.stream()
-								.filter(endpoint -> endpoints.stream()
-										.anyMatch(endpoint1 -> endpoint1.getName().equals(endpoint.getName())))
-								.collect(Collectors.toList());
-
-						List<BillingReport> billingData = e.getValue()
-								.stream()
-								.map(exp ->
-										billingService.getExploratoryBillingData(exp.getString("project"), exp.getString("endpoint"),
-												exp.getString("exploratory_name"),
-												Optional.ofNullable(exp.get("computational_resources")).map(cr -> (List<Document>) cr).get()
-														.stream()
-														.map(cr -> cr.getString("computational_name"))
-														.collect(Collectors.toList()))
-								)
-								.collect(Collectors.toList());
-
-						final Map<String, Map<String, String>> projectEdges =
-								endpoints
-										.stream()
-										.collect(Collectors.toMap(ProjectEndpointDTO::getName, this::getSharedInfo));
-						return new ProjectInfrastructureInfo(e.getKey(), billingDAO.getBillingProjectQuoteUsed(e.getKey()),
-								projectEdges, e.getValue(), billingData, endpointResult);
-					})
-					.collect(Collectors.toList());
-		} catch (Exception e) {
-			log.error("Could not load list of provisioned resources for user: {}", user, e);
-			throw new DlabException("Could not load list of provisioned resources for user: ");
-		}
-	}
-
-	@Override
-	public HealthStatusPageDTO getHeathStatus(UserInfo userInfo, boolean fullReport) {
-		final String user = userInfo.getName();
-		log.debug("Request the status of resources for user {}, report type {}", user, fullReport);
-		try {
-			return HealthStatusPageDTO.builder()
-					.status(HealthStatusEnum.OK.toString())
-					.listResources(Collections.emptyList())
-					.billingEnabled(configuration.isBillingSchedulerEnabled())
-					.projectAdmin(UserRoles.isProjectAdmin(userInfo))
-					.admin(UserRoles.isAdmin(userInfo))
-					.projectAssigned(projectService.isAnyProjectAssigned(userInfo))
-					.billingQuoteUsed(billingDAO.getBillingQuoteUsed())
-					.billingUserQuoteUsed(billingDAO.getBillingUserQuoteUsed(user))
-					.build();
-		} catch (Exception e) {
-			log.warn("Could not return status of resources for user {}: {}", user, e.getLocalizedMessage(), e);
-			throw new DlabException(e.getMessage(), e);
-		}
-	}
-
-	@Override
-	public InfrastructureMetaInfoDTO getInfrastructureMetaInfo() {
-		final String branch = Manifests.read("GIT-Branch");
-		return InfrastructureMetaInfoDTO.builder()
-				.branch(branch)
-				.commit(Manifests.read("GIT-Commit"))
-				.version(Manifests.read("DLab-Version"))
-				.releaseNotes(String.format(RELEASE_NOTES_FORMAT, branch))
-				.build();
-	}
-
-	private Map<String, String> getSharedInfo(ProjectEndpointDTO endpointDTO) {
-		Optional<EdgeInfo> edgeInfo = Optional.ofNullable(endpointDTO.getEdgeInfo());
-		if (!edgeInfo.isPresent()) {
-			return Collections.emptyMap();
-		}
-		EdgeInfo edge = edgeInfo.get();
-		Map<String, String> shared = new HashMap<>();
-
-		shared.put("status", endpointDTO.getStatus().toString());
-		shared.put("edge_node_ip", edge.getPublicIp());
-		if (edge instanceof EdgeInfoAws) {
-			EdgeInfoAws edgeInfoAws = (EdgeInfoAws) edge;
-			shared.put("user_own_bicket_name", edgeInfoAws.getUserOwnBucketName());
-			shared.put("shared_bucket_name", edgeInfoAws.getSharedBucketName());
-		} else if (edge instanceof EdgeInfoAzure) {
-			EdgeInfoAzure edgeInfoAzure = (EdgeInfoAzure) edge;
-			shared.put("user_container_name", edgeInfoAzure.getUserContainerName());
-			shared.put("shared_container_name", edgeInfoAzure.getSharedContainerName());
-			shared.put("user_storage_account_name", edgeInfoAzure.getUserStorageAccountName());
-			shared.put("shared_storage_account_name", edgeInfoAzure.getSharedStorageAccountName());
-			shared.put("datalake_name", edgeInfoAzure.getDataLakeName());
-			shared.put("datalake_user_directory_name", edgeInfoAzure.getDataLakeDirectoryName());
-			shared.put("datalake_shared_directory_name", edgeInfoAzure.getDataLakeSharedDirectoryName());
-		} else if (edge instanceof EdgeInfoGcp) {
-			EdgeInfoGcp edgeInfoGcp = (EdgeInfoGcp) edge;
-			shared.put("user_own_bucket_name", edgeInfoGcp.getUserOwnBucketName());
-			shared.put("shared_bucket_name", edgeInfoGcp.getSharedBucketName());
-		}
-
-		return shared;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceImpl.java
deleted file mode 100644
index 31f73f3..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceImpl.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.ProjectDAO;
-import com.epam.dlab.backendapi.dao.SettingsDAO;
-import com.epam.dlab.backendapi.dao.UserGroupDao;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.resources.dto.SparkStandaloneConfiguration;
-import com.epam.dlab.backendapi.resources.dto.aws.AwsEmrConfiguration;
-import com.epam.dlab.backendapi.resources.dto.gcp.GcpDataprocConfiguration;
-import com.epam.dlab.backendapi.roles.RoleType;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.InfrastructureTemplateService;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.base.computational.FullComputationalTemplate;
-import com.epam.dlab.dto.imagemetadata.ComputationalMetadataDTO;
-import com.epam.dlab.dto.imagemetadata.ComputationalResourceShapeDto;
-import com.epam.dlab.dto.imagemetadata.ExploratoryMetadataDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static com.epam.dlab.rest.contracts.DockerAPI.DOCKER_COMPUTATIONAL;
-import static com.epam.dlab.rest.contracts.DockerAPI.DOCKER_EXPLORATORY;
-
-@Slf4j
-public class InfrastructureTemplateServiceImpl implements InfrastructureTemplateService {
-
-	@Inject
-	private SelfServiceApplicationConfiguration configuration;
-	@Inject
-	private SettingsDAO settingsDAO;
-	@Inject
-	private ProjectDAO projectDAO;
-	@Inject
-	private EndpointService endpointService;
-	@Inject
-	private UserGroupDao userGroupDao;
-
-
-	@Inject
-	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-
-	@Override
-	public List<ExploratoryMetadataDTO> getExploratoryTemplates(UserInfo user, String project, String endpoint) {
-
-		log.debug("Loading list of exploratory templates for user {} for project {}", user.getName(), project);
-		try {
-			EndpointDTO endpointDTO = endpointService.get(endpoint);
-			ExploratoryMetadataDTO[] array =
-					provisioningService.get(endpointDTO.getUrl() + DOCKER_EXPLORATORY,
-							user.getAccessToken(),
-							ExploratoryMetadataDTO[].class);
-
-			final Set<String> roles = userGroupDao.getUserGroups(user.getName());
-			return Arrays.stream(array)
-					.peek(e -> e.setImage(getSimpleImageName(e.getImage())))
-					.filter(e -> exploratoryGpuIssuesAzureFilter(e, endpointDTO.getCloudProvider()) &&
-							UserRoles.checkAccess(user, RoleType.EXPLORATORY, e.getImage(), roles))
-					.peek(e -> filterShapes(user, e.getExploratoryEnvironmentShapes(), RoleType.EXPLORATORY_SHAPES,
-							roles))
-					.collect(Collectors.toList());
-
-		} catch (DlabException e) {
-			log.error("Could not load list of exploratory templates for user: {}", user.getName(), e);
-			throw e;
-		}
-	}
-
-	/**
-	 * Removes shapes for which user does not have an access
-	 *
-	 * @param user              user
-	 * @param environmentShapes shape types
-	 * @param roleType
-	 * @param roles
-	 */
-	private void filterShapes(UserInfo user, Map<String, List<ComputationalResourceShapeDto>> environmentShapes,
-							  RoleType roleType, Set<String> roles) {
-		environmentShapes.forEach((k, v) -> v.removeIf(compResShapeDto ->
-				!UserRoles.checkAccess(user, roleType, compResShapeDto.getType(), roles)));
-	}
-
-	@Override
-	public List<FullComputationalTemplate> getComputationalTemplates(UserInfo user, String project, String endpoint) {
-
-		log.debug("Loading list of computational templates for user {}", user.getName());
-		try {
-			EndpointDTO endpointDTO = endpointService.get(endpoint);
-			ComputationalMetadataDTO[] array =
-					provisioningService.get(endpointDTO.getUrl() + DOCKER_COMPUTATIONAL,
-							user.getAccessToken(), ComputationalMetadataDTO[]
-									.class);
-
-			final Set<String> roles = userGroupDao.getUserGroups(user.getName());
-
-			return Arrays.stream(array)
-					.peek(e -> e.setImage(getSimpleImageName(e.getImage())))
-					.peek(e -> filterShapes(user, e.getComputationResourceShapes(), RoleType.COMPUTATIONAL_SHAPES,
-							user.getRoles()))
-					.filter(e -> UserRoles.checkAccess(user, RoleType.COMPUTATIONAL, e.getImage(), roles))
-					.map(comp -> fullComputationalTemplate(comp, endpointDTO.getCloudProvider()))
-					.collect(Collectors.toList());
-
-		} catch (DlabException e) {
-			log.error("Could not load list of computational templates for user: {}", user.getName(), e);
-			throw e;
-		}
-	}
-
-	/**
-	 * Temporary filter for creation of exploratory env due to Azure issues
-	 */
-	private boolean exploratoryGpuIssuesAzureFilter(ExploratoryMetadataDTO e, CloudProvider cloudProvider) {
-		return (!"redhat".equals(settingsDAO.getConfOsFamily()) || cloudProvider != CloudProvider.AZURE) ||
-				!(e.getImage().endsWith("deeplearning") || e.getImage().endsWith("tensor"));
-	}
-
-	/**
-	 * Return the image name without suffix version.
-	 *
-	 * @param imageName the name of image.
-	 */
-	private String getSimpleImageName(String imageName) {
-		int separatorIndex = imageName.indexOf(':');
-		return (separatorIndex > 0 ? imageName.substring(0, separatorIndex) : imageName);
-	}
-
-	/**
-	 * Wraps metadata with limits
-	 *
-	 * @param metadataDTO   metadata
-	 * @param cloudProvider cloudProvider
-	 * @return wrapped object
-	 */
-
-	private FullComputationalTemplate fullComputationalTemplate(ComputationalMetadataDTO metadataDTO,
-																CloudProvider cloudProvider) {
-
-		DataEngineType dataEngineType = DataEngineType.fromDockerImageName(metadataDTO.getImage());
-
-		if (dataEngineType == DataEngineType.CLOUD_SERVICE) {
-			return getCloudFullComputationalTemplate(metadataDTO, cloudProvider);
-		} else if (dataEngineType == DataEngineType.SPARK_STANDALONE) {
-			return new SparkFullComputationalTemplate(metadataDTO,
-					SparkStandaloneConfiguration.builder()
-							.maxSparkInstanceCount(configuration.getMaxSparkInstanceCount())
-							.minSparkInstanceCount(configuration.getMinSparkInstanceCount())
-							.build());
-		} else {
-			throw new IllegalArgumentException("Unknown data engine " + dataEngineType);
-		}
-	}
-
-	protected FullComputationalTemplate getCloudFullComputationalTemplate(ComputationalMetadataDTO metadataDTO,
-																		CloudProvider cloudProvider) {
-		switch (cloudProvider) {
-			case AWS:
-				return new AwsFullComputationalTemplate(metadataDTO,
-						AwsEmrConfiguration.builder()
-								.minEmrInstanceCount(configuration.getMinEmrInstanceCount())
-								.maxEmrInstanceCount(configuration.getMaxEmrInstanceCount())
-								.maxEmrSpotInstanceBidPct(configuration.getMaxEmrSpotInstanceBidPct())
-								.minEmrSpotInstanceBidPct(configuration.getMinEmrSpotInstanceBidPct())
-								.build());
-			case GCP:
-				return new GcpFullComputationalTemplate(metadataDTO,
-						GcpDataprocConfiguration.builder()
-								.minInstanceCount(configuration.getMinInstanceCount())
-								.maxInstanceCount(configuration.getMaxInstanceCount())
-								.minDataprocPreemptibleInstanceCount(configuration.getMinDataprocPreemptibleCount())
-								.build());
-			case AZURE:
-				log.error("Dataengine service is not supported currently for {}", cloudProvider);
-			default:
-				throw new UnsupportedOperationException("Dataengine service is not supported currently for " + cloudProvider);
-		}
-	}
-
-	private class AwsFullComputationalTemplate extends FullComputationalTemplate {
-		@JsonProperty("limits")
-		private AwsEmrConfiguration awsEmrConfiguration;
-
-		AwsFullComputationalTemplate(ComputationalMetadataDTO metadataDTO,
-									 AwsEmrConfiguration awsEmrConfiguration) {
-			super(metadataDTO);
-			this.awsEmrConfiguration = awsEmrConfiguration;
-		}
-	}
-
-	private class GcpFullComputationalTemplate extends FullComputationalTemplate {
-		@JsonProperty("limits")
-		private GcpDataprocConfiguration gcpDataprocConfiguration;
-
-		GcpFullComputationalTemplate(ComputationalMetadataDTO metadataDTO,
-									 GcpDataprocConfiguration gcpDataprocConfiguration) {
-			super(metadataDTO);
-			this.gcpDataprocConfiguration = gcpDataprocConfiguration;
-		}
-	}
-
-	private class SparkFullComputationalTemplate extends FullComputationalTemplate {
-		@JsonProperty("limits")
-		private SparkStandaloneConfiguration sparkStandaloneConfiguration;
-
-		SparkFullComputationalTemplate(ComputationalMetadataDTO metadataDTO,
-									   SparkStandaloneConfiguration sparkStandaloneConfiguration) {
-			super(metadataDTO);
-			this.sparkStandaloneConfiguration = sparkStandaloneConfiguration;
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImpl.java
deleted file mode 100644
index 3fbb170..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImpl.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.BaseDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryLibDAO;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.resources.dto.LibInfoRecord;
-import com.epam.dlab.backendapi.resources.dto.LibKey;
-import com.epam.dlab.backendapi.resources.dto.LibraryStatus;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.LibraryService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import com.epam.dlab.dto.exploratory.LibStatus;
-import com.epam.dlab.dto.exploratory.LibraryInstallDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.model.library.Library;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ComputationalAPI;
-import com.epam.dlab.rest.contracts.ExploratoryAPI;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.bson.Document;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.stream.Collectors;
-
-@Slf4j
-@Singleton
-public class LibraryServiceImpl implements LibraryService {
-
-	private static final String COMPUTATIONAL_NOT_FOUND_MSG = "Computational with name %s was not found";
-	private static final String LIB_ALREADY_INSTALLED = "Library %s is already installing";
-	@Inject
-	private ExploratoryDAO exploratoryDAO;
-
-	@Inject
-	private ExploratoryLibDAO libraryDAO;
-
-	@Inject
-	private RequestBuilder requestBuilder;
-
-	@Named(ServiceConsts.PROVISIONING_SERVICE_NAME)
-	@Inject
-	private RESTService provisioningService;
-
-	@Inject
-	private RequestId requestId;
-	@Inject
-	private EndpointService endpointService;
-
-
-	@Override
-	@SuppressWarnings("unchecked")
-	public List<Document> getLibs(String user, String project, String exploratoryName, String computationalName) {
-		if (StringUtils.isEmpty(computationalName)) {
-			return (List<Document>) libraryDAO.findExploratoryLibraries(user, project, exploratoryName)
-					.getOrDefault(ExploratoryLibDAO.EXPLORATORY_LIBS, new ArrayList<>());
-		} else {
-			Document document = (Document) libraryDAO.findComputationalLibraries(user, project,
-					exploratoryName, computationalName)
-					.getOrDefault(ExploratoryLibDAO.COMPUTATIONAL_LIBS, new Document());
-
-			return (List<Document>) document.getOrDefault(computationalName, new ArrayList<>());
-		}
-	}
-
-	@Override
-	@SuppressWarnings("unchecked")
-	public List<LibInfoRecord> getLibInfo(String user, String project, String exploratoryName) {
-		Document document = libraryDAO.findAllLibraries(user, project, exploratoryName);
-
-		Map<LibKey, List<LibraryStatus>> model = new TreeMap<>(Comparator.comparing(LibKey::getName)
-				.thenComparing(LibKey::getVersion)
-				.thenComparing(LibKey::getGroup));
-
-		if (document.get(ExploratoryLibDAO.EXPLORATORY_LIBS) != null) {
-			List<Document> exploratoryLibs = (List<Document>) document.get(ExploratoryLibDAO.EXPLORATORY_LIBS);
-			exploratoryLibs.forEach(e -> populateModel(exploratoryName, e, model, "notebook"));
-
-		}
-
-		if (document.get(ExploratoryLibDAO.COMPUTATIONAL_LIBS) != null) {
-			Document computationalLibs = getLibsOfActiveComputationalResources(document);
-			populateComputational(computationalLibs, model, "cluster");
-		}
-
-		List<LibInfoRecord> libInfoRecords = new ArrayList<>();
-
-		for (Map.Entry<LibKey, List<LibraryStatus>> entry : model.entrySet()) {
-			libInfoRecords.add(new LibInfoRecord(entry.getKey(), entry.getValue()));
-
-		}
-
-		return libInfoRecords;
-	}
-
-	@Override
-	public String installComputationalLibs(UserInfo ui, String project, String expName, String compName,
-										   List<LibInstallDTO> libs) {
-
-		final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(ui.getName(), project, expName, compName);
-		EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-		final String uuid =
-				provisioningService.post(endpointDTO.getUrl() + ComputationalAPI.COMPUTATIONAL_LIB_INSTALL,
-						ui.getAccessToken(),
-						toComputationalLibraryInstallDto(ui, project, expName, compName, libs, userInstance, endpointDTO),
-						String.class);
-		requestId.put(ui.getName(), uuid);
-		return uuid;
-	}
-
-	@Override
-	public String installExploratoryLibs(UserInfo ui, String project, String expName, List<LibInstallDTO> libs) {
-		final UserInstanceDTO userInstance = exploratoryDAO.fetchRunningExploratoryFields(ui.getName(), project, expName);
-		EndpointDTO endpointDTO = endpointService.get(userInstance.getEndpoint());
-		final String uuid =
-				provisioningService.post(endpointDTO.getUrl() + ExploratoryAPI.EXPLORATORY_LIB_INSTALL,
-						ui.getAccessToken(), toExploratoryLibraryInstallDto(ui, project, expName, libs, userInstance, endpointDTO),
-						String.class);
-		requestId.put(ui.getName(), uuid);
-		return uuid;
-	}
-
-	private LibraryInstallDTO toExploratoryLibraryInstallDto(UserInfo userInfo, String project, String exploratoryName,
-															 List<LibInstallDTO> libs, UserInstanceDTO userInstance, EndpointDTO endpointDTO) {
-		final List<LibInstallDTO> libsToInstall = libs.stream()
-				.map(lib -> toLibInstallDto(lib, libraryDAO.getLibrary(userInfo.getName(), project, exploratoryName,
-						lib.getGroup(), lib.getName())))
-				.peek(l -> libraryDAO.addLibrary(userInfo.getName(), project, exploratoryName, l, l.isOverride()))
-				.collect(Collectors.toList());
-		return requestBuilder.newLibInstall(userInfo, userInstance, endpointDTO, libsToInstall);
-	}
-
-	private LibraryInstallDTO toComputationalLibraryInstallDto(UserInfo userInfo, String project, String expName,
-															   String compName, List<LibInstallDTO> libs,
-															   UserInstanceDTO userInstance, EndpointDTO endpointDTO) {
-
-		final UserComputationalResource computationalResource = getComputationalResource(compName, userInstance);
-		final List<LibInstallDTO> libsToInstall = libs.stream()
-				.map(lib -> toLibInstallDto(lib, libraryDAO.getLibrary(userInfo.getName(), project,
-						expName, compName, lib.getGroup(), lib.getName())))
-				.peek(l -> libraryDAO.addLibrary(userInfo.getName(), project, expName, compName,
-						l, l.isOverride()))
-				.collect(Collectors.toList());
-		return requestBuilder.newLibInstall(userInfo, userInstance, computationalResource, libsToInstall, endpointDTO);
-	}
-
-	private UserComputationalResource getComputationalResource(String computationalName,
-															   UserInstanceDTO userInstance) {
-		return userInstance.getResources()
-				.stream()
-				.filter(computational -> computational.getComputationalName().equals(computationalName))
-				.findAny()
-				.orElseThrow(() -> new DlabException(String.format(COMPUTATIONAL_NOT_FOUND_MSG, computationalName)));
-	}
-
-	private LibInstallDTO toLibInstallDto(LibInstallDTO lib, Library existingLibrary) {
-		final LibInstallDTO l = new LibInstallDTO(lib.getGroup(), lib.getName(), lib.getVersion());
-		l.setStatus(LibStatus.INSTALLING.toString());
-		l.setOverride(shouldOverride(existingLibrary));
-		return l;
-	}
-
-	private boolean shouldOverride(Library library) {
-		if (Objects.nonNull(library) && library.getStatus() == LibStatus.INSTALLING) {
-			throw new DlabException(String.format(LIB_ALREADY_INSTALLED, library.getName()));
-		} else {
-			return Objects.nonNull(library);
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	private Document getLibsOfActiveComputationalResources(Document document) {
-		Document computationalLibs = (Document) document.get(ExploratoryLibDAO.COMPUTATIONAL_LIBS);
-
-		if (document.get(ExploratoryDAO.COMPUTATIONAL_RESOURCES) != null) {
-			List<Document> computationalResources = (List<Document>) document.get(ExploratoryDAO
-					.COMPUTATIONAL_RESOURCES);
-
-			Set<String> terminated = computationalResources.stream()
-					.filter(doc -> doc.getString(BaseDAO.STATUS).equalsIgnoreCase(UserInstanceStatus.TERMINATED
-							.toString()))
-					.map(doc -> doc.getString("computational_name")).collect(Collectors.toSet());
-
-			terminated.forEach(computationalLibs::remove);
-		}
-
-		return computationalLibs;
-	}
-
-
-	private void populateModel(String exploratoryName, Document document, Map<LibKey, List<LibraryStatus>> model,
-							   String resourceType) {
-		String name = document.getString(ExploratoryLibDAO.LIB_NAME);
-		String version = document.getString(ExploratoryLibDAO.LIB_VERSION);
-		String group = document.getString(ExploratoryLibDAO.LIB_GROUP);
-		String status = document.getString(ExploratoryLibDAO.STATUS);
-		String error = document.getString(ExploratoryLibDAO.ERROR_MESSAGE);
-
-		LibKey libKey = new LibKey(name, version, group);
-		List<LibraryStatus> statuses = model.getOrDefault(libKey, new ArrayList<>());
-
-		if (statuses.isEmpty()) {
-			model.put(libKey, statuses);
-		}
-
-		statuses.add(new LibraryStatus(exploratoryName, resourceType, status, error));
-	}
-
-	@SuppressWarnings("unchecked")
-	private void populateComputational(Document computationalLibs, Map<LibKey, List<LibraryStatus>> model, String
-			resourceType) {
-		for (Map.Entry<String, Object> entry : computationalLibs.entrySet()) {
-			if (entry.getValue() != null) {
-				List<Document> docs = (List<Document>) entry.getValue();
-				docs.forEach(e -> populateModel(entry.getKey(), e, model, resourceType));
-			}
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/MavenCentralLibraryService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/MavenCentralLibraryService.java
deleted file mode 100644
index b7cbce8..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/MavenCentralLibraryService.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.backendapi.domain.MavenSearchArtifactResponse;
-import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
-import com.epam.dlab.backendapi.service.ExternalLibraryService;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.inject.Inject;
-import java.net.URI;
-
-import static java.lang.String.format;
-import static java.lang.String.join;
-
-@Singleton
-@Slf4j
-public class MavenCentralLibraryService implements ExternalLibraryService {
-
-	private static final String QUOTE_ENCODED = "%22";
-	private static final String SEARCH_API_QUERY_FORMAT = "/solrsearch/select?q=%s&rows=20&wt=json&core=gav&p=jar";
-	private static final String LIB_NOT_FOUND_MSG = "Artifact with id=%s, groupId=%s and version %s not found";
-	private final RESTService restClient;
-
-	@Inject
-	public MavenCentralLibraryService(@Named(ServiceConsts.MAVEN_SEARCH_API) RESTService restClient) {
-		this.restClient = restClient;
-	}
-
-	@Override
-	public LibraryDTO getLibrary(String groupId, String artifactId, String version) {
-		return getMavenLibrary(groupId, artifactId, version);
-
-	}
-
-	private LibraryDTO getMavenLibrary(String groupId, String artifactId, String version) {
-		final String query = and(artifactQuery(artifactId), groupQuery(groupId), versionQuery(version), jarOrBundlePackage());
-		return restClient.get(URI.create(String.format(SEARCH_API_QUERY_FORMAT, query)),
-				MavenSearchArtifactResponse.class)
-				.getArtifacts()
-				.stream()
-				.findFirst()
-				.map(artifact -> new LibraryDTO(join(":", groupId, artifactId), version))
-				.orElseThrow(() -> new ResourceNotFoundException(format(LIB_NOT_FOUND_MSG, artifactId, groupId,
-						version)));
-	}
-
-	private String groupQuery(String groupId) {
-		return "g:" + QUOTE_ENCODED + groupId + QUOTE_ENCODED;
-	}
-
-	private String artifactQuery(String artifactId) {
-		return "a:" + QUOTE_ENCODED + artifactId + QUOTE_ENCODED;
-	}
-
-	private String versionQuery(String version) {
-		return "v:" + QUOTE_ENCODED + version + QUOTE_ENCODED;
-	}
-
-	private String jarOrBundlePackage() {
-		return "(p:" + QUOTE_ENCODED + "jar" + QUOTE_ENCODED + "%20OR%20p:" + QUOTE_ENCODED + "bundle" + QUOTE_ENCODED + ")";
-	}
-
-	private String and(String... strings) {
-		return join("+AND+", strings);
-	}
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
deleted file mode 100644
index 11d4b62..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ProjectServiceImpl.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.annotation.BudgetLimited;
-import com.epam.dlab.backendapi.annotation.Project;
-import com.epam.dlab.backendapi.annotation.ProjectAdmin;
-import com.epam.dlab.backendapi.annotation.User;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.ProjectDAO;
-import com.epam.dlab.backendapi.dao.UserGroupDao;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.domain.UpdateProjectDTO;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.constants.ServiceConsts;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.exceptions.ResourceConflictException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
-import static java.util.stream.Collectors.toSet;
-import static java.util.stream.Stream.concat;
-
-@Slf4j
-public class ProjectServiceImpl implements ProjectService {
-
-	private static final String CREATE_PRJ_API = "infrastructure/project/create";
-	private static final String TERMINATE_PRJ_API = "infrastructure/project/terminate";
-	private static final String START_PRJ_API = "infrastructure/project/start";
-	private static final String STOP_PRJ_API = "infrastructure/project/stop";
-	private static final String STOP_ACTION = "stop";
-	private static final String TERMINATE_ACTION = "terminate";
-
-	private final ProjectDAO projectDAO;
-	private final ExploratoryService exploratoryService;
-	private final UserGroupDao userGroupDao;
-	private final RESTService provisioningService;
-	private final RequestId requestId;
-	private final RequestBuilder requestBuilder;
-	private final EndpointService endpointService;
-	private final ExploratoryDAO exploratoryDAO;
-	private final SecurityService securityService;
-
-	@Inject
-	public ProjectServiceImpl(ProjectDAO projectDAO, ExploratoryService exploratoryService,
-							  UserGroupDao userGroupDao,
-							  @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService,
-							  RequestId requestId, RequestBuilder requestBuilder, EndpointService endpointService,
-							  ExploratoryDAO exploratoryDAO, SecurityService securityService) {
-		this.projectDAO = projectDAO;
-		this.exploratoryService = exploratoryService;
-		this.userGroupDao = userGroupDao;
-		this.provisioningService = provisioningService;
-		this.requestId = requestId;
-		this.requestBuilder = requestBuilder;
-		this.endpointService = endpointService;
-		this.exploratoryDAO = exploratoryDAO;
-		this.securityService = securityService;
-	}
-
-	@Override
-	public List<ProjectDTO> getProjects() {
-		return projectDAO.getProjects();
-	}
-
-	@Override
-	public List<ProjectDTO> getProjects(UserInfo user) {
-		return projectDAO.getProjects()
-				.stream()
-				.filter(project -> UserRoles.isProjectAdmin(user, project.getGroups()) || UserRoles.isAdmin(user))
-				.collect(Collectors.toList());
-	}
-
-	@Override
-	public List<ProjectDTO> getUserProjects(UserInfo userInfo, boolean active) {
-		return projectDAO.getUserProjects(userInfo, active);
-	}
-
-	@Override
-	public List<ProjectDTO> getProjectsByEndpoint(String endpointName) {
-		return projectDAO.getProjectsByEndpoint(endpointName);
-	}
-
-	@BudgetLimited
-	@Override
-	public void create(UserInfo user, ProjectDTO projectDTO) {
-		if (!projectDAO.get(projectDTO.getName()).isPresent()) {
-			projectDAO.create(projectDTO);
-			createProjectOnCloud(user, projectDTO);
-		} else {
-			throw new ResourceConflictException("Project with passed name already exist in system");
-		}
-	}
-
-	@Override
-	public ProjectDTO get(String name) {
-		return projectDAO.get(name)
-				.orElseThrow(projectNotFound());
-	}
-
-	@Override
-	public void terminateEndpoint(UserInfo userInfo, String endpoint, String name) {
-		projectActionOnCloud(userInfo, name, TERMINATE_PRJ_API, endpoint);
-		projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.TERMINATING);
-		exploratoryService.updateProjectExploratoryStatuses(name, endpoint, UserInstanceStatus.TERMINATING);
-	}
-
-	@ProjectAdmin
-	@Override
-	public void terminateEndpoint(@User UserInfo userInfo, List<String> endpoints, @Project String name) {
-		System.out.println("sd");
-		endpoints.forEach(endpoint -> terminateEndpoint(userInfo, endpoint, name));
-	}
-
-	@BudgetLimited
-	@Override
-	public void start(UserInfo userInfo, String endpoint, @Project String name) {
-		projectActionOnCloud(userInfo, name, START_PRJ_API, endpoint);
-		projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.STARTING);
-	}
-
-	@ProjectAdmin
-	@Override
-	public void start(@User UserInfo userInfo, List<String> endpoints, @Project String name) {
-		endpoints.forEach(endpoint -> start(userInfo, endpoint, name));
-	}
-
-	@Override
-	public void stop(UserInfo userInfo, String endpoint, String name) {
-		projectActionOnCloud(userInfo, name, STOP_PRJ_API, endpoint);
-		projectDAO.updateEdgeStatus(name, endpoint, UserInstanceStatus.STOPPING);
-	}
-
-	@ProjectAdmin
-	@Override
-	public void stopWithResources(@User UserInfo userInfo, List<String> endpoints, @Project String projectName) {
-		List<ProjectEndpointDTO> endpointDTOs = get(projectName)
-				.getEndpoints()
-				.stream()
-				.filter(projectEndpointDTO -> endpoints.contains(projectEndpointDTO.getName()))
-				.collect(Collectors.toList());
-		checkProjectRelatedResourcesInProgress(projectName, endpointDTOs, STOP_ACTION);
-
-		exploratoryDAO.fetchRunningExploratoryFieldsForProject(projectName,
-				endpointDTOs
-						.stream()
-						.map(ProjectEndpointDTO::getName)
-						.collect(Collectors.toList()))
-				.forEach(e -> exploratoryService.stop(new UserInfo(e.getUser(), userInfo.getAccessToken()), projectName, e.getExploratoryName()));
-
-		endpointDTOs.stream().filter(e -> !Arrays.asList(UserInstanceStatus.TERMINATED,
-				UserInstanceStatus.TERMINATING, UserInstanceStatus.STOPPED, UserInstanceStatus.FAILED).contains(e.getStatus()))
-				.forEach(e -> stop(userInfo, e.getName(), projectName));
-	}
-
-	@ProjectAdmin
-	@Override
-	public void update(@User UserInfo userInfo, UpdateProjectDTO projectDTO, @Project String projectName) {
-		final ProjectDTO project = projectDAO.get(projectDTO.getName()).orElseThrow(projectNotFound());
-		final Set<String> endpoints = project.getEndpoints()
-				.stream()
-				.map(ProjectEndpointDTO::getName)
-				.collect(toSet());
-		final HashSet<String> newEndpoints = new HashSet<>(projectDTO.getEndpoints());
-		newEndpoints.removeAll(endpoints);
-		final List<ProjectEndpointDTO> endpointsToBeCreated = newEndpoints.stream()
-				.map(e -> new ProjectEndpointDTO(e, UserInstanceStatus.CREATING, null))
-				.collect(Collectors.toList());
-		project.getEndpoints().addAll(endpointsToBeCreated);
-		projectDAO.update(new ProjectDTO(project.getName(), projectDTO.getGroups(), project.getKey(),
-				project.getTag(), project.getBudget(), project.getEndpoints(), projectDTO.isSharedImageEnabled()));
-		endpointsToBeCreated.forEach(e -> createEndpoint(userInfo, project, e.getName()));
-	}
-
-	@Override
-	public void updateBudget(List<ProjectDTO> projects) {
-		projects.forEach(p -> projectDAO.updateBudget(p.getName(), p.getBudget()));
-	}
-
-	@Override
-	public boolean isAnyProjectAssigned(UserInfo userInfo) {
-		final Set<String> userGroups = concat(userInfo.getRoles().stream(),
-				userGroupDao.getUserGroups(userInfo.getName()).stream())
-				.collect(toSet());
-		return projectDAO.isAnyProjectAssigned(userGroups);
-	}
-
-	@Override
-	public boolean checkExploratoriesAndComputationalProgress(String projectName, List<String> endpoints) {
-		return exploratoryDAO.fetchProjectEndpointExploratoriesWhereStatusIn(projectName, endpoints, Arrays.asList(
-				UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE,
-				UserInstanceStatus.CONFIGURING, UserInstanceStatus.RECONFIGURING, UserInstanceStatus.STOPPING,
-				UserInstanceStatus.TERMINATING),
-				UserInstanceStatus.CREATING, UserInstanceStatus.CONFIGURING, UserInstanceStatus.STARTING,
-				UserInstanceStatus.RECONFIGURING, UserInstanceStatus.CREATING_IMAGE, UserInstanceStatus.STOPPING,
-				UserInstanceStatus.TERMINATING).isEmpty();
-	}
-
-	private void createProjectOnCloud(UserInfo user, ProjectDTO projectDTO) {
-		try {
-			projectDTO.getEndpoints().forEach(endpoint -> createEndpoint(user, projectDTO,
-					endpoint.getName()));
-		} catch (Exception e) {
-			log.error("Can not create project due to: {}", e.getMessage());
-			projectDAO.updateStatus(projectDTO.getName(), ProjectDTO.Status.FAILED);
-		}
-	}
-
-	private void createEndpoint(UserInfo user, ProjectDTO projectDTO, String endpointName) {
-		EndpointDTO endpointDTO = endpointService.get(endpointName);
-		String uuid = provisioningService.post(endpointDTO.getUrl() + CREATE_PRJ_API, user.getAccessToken(),
-						requestBuilder.newProjectCreate(user, projectDTO, endpointDTO), String.class);
-		requestId.put(user.getName(), uuid);
-	}
-
-	private void projectActionOnCloud(UserInfo user, String projectName, String provisioningApiUri, String endpoint) {
-		try {
-			EndpointDTO endpointDTO = endpointService.get(endpoint);
-			String uuid = provisioningService.post(endpointDTO.getUrl() + provisioningApiUri, user.getAccessToken(),
-					requestBuilder.newProjectAction(user, projectName, endpointDTO), String.class);
-			requestId.put(user.getName(), uuid);
-		} catch (Exception e) {
-			log.error("Can not terminate project due to: {}", e.getMessage());
-			projectDAO.updateStatus(projectName, ProjectDTO.Status.FAILED);
-		}
-	}
-
-	private void checkProjectRelatedResourcesInProgress(String projectName, List<ProjectEndpointDTO> endpoints, String action) {
-        boolean edgeProgress = endpoints.stream().anyMatch(e ->
-                Arrays.asList(UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.STOPPING,
-                        UserInstanceStatus.TERMINATING).contains(e.getStatus()));
-
-		List<String> endpointsName = endpoints.stream().map(ProjectEndpointDTO::getName).collect(Collectors.toList());
-		if (edgeProgress || !checkExploratoriesAndComputationalProgress(projectName, endpointsName)) {
-			throw new ResourceConflictException((String.format("Can not %s environment because one of project " +
-					"resource is in processing stage", action)));
-		}
-	}
-
-	private Supplier<ResourceNotFoundException> projectNotFound() {
-		return () -> new ResourceNotFoundException("Project with passed name not found");
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ReuploadKeyServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ReuploadKeyServiceImpl.java
deleted file mode 100644
index e75d9df..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/ReuploadKeyServiceImpl.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.backendapi.dao.ComputationalDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.service.ReuploadKeyService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyStatus;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyStatusDTO;
-import com.epam.dlab.model.ResourceData;
-import com.epam.dlab.model.ResourceType;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-
-import static com.epam.dlab.constants.ServiceConsts.PROVISIONING_SERVICE_NAME;
-import static com.epam.dlab.dto.UserInstanceStatus.RUNNING;
-
-@Singleton
-@Slf4j
-public class ReuploadKeyServiceImpl implements ReuploadKeyService {
-
-	@Inject
-	@Named(PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-	@Inject
-	private RequestBuilder requestBuilder;
-	@Inject
-	private RequestId requestId;
-	@Inject
-	private ExploratoryService exploratoryService;
-	@Inject
-	private ComputationalDAO computationalDAO;
-	@Inject
-	private ExploratoryDAO exploratoryDAO;
-
-	private static final String REUPLOAD_KEY_UPDATE_MSG = "Reuploading key process is successfully finished. " +
-			"Updating 'reupload_key_required' flag to 'false' for {}.";
-	private static final String REUPLOAD_KEY_ERROR_MSG = "Reuploading key process is failed for {}. The next attempt" +
-			"starts after resource restarting.";
-
-	@Override
-	public void updateResourceData(ReuploadKeyStatusDTO dto) {
-        String user = dto.getUser();
-        ResourceData resource = dto.getReuploadKeyCallbackDTO().getResource();
-        log.debug("Updating resource {} to status RUNNING...", resource.toString());
-        updateResourceStatus(user, null, resource, RUNNING);
-        if (dto.getReuploadKeyStatus() == ReuploadKeyStatus.COMPLETED) {
-            log.debug(REUPLOAD_KEY_UPDATE_MSG, resource.toString());
-            updateResourceReuploadKeyFlag(user, null, resource, false);
-        } else {
-            log.error(REUPLOAD_KEY_ERROR_MSG, resource.toString());
-        }
-    }
-
-    private void updateResourceStatus(String user, String project, ResourceData resourceData, UserInstanceStatus newStatus) {
-        if (resourceData.getResourceType() == ResourceType.EXPLORATORY) {
-            exploratoryDAO.updateStatusForExploratory(user, project, resourceData.getExploratoryName(), newStatus);
-        } else if (resourceData.getResourceType() == ResourceType.COMPUTATIONAL) {
-            computationalDAO.updateStatusForComputationalResource(user, project,
-                    resourceData.getExploratoryName(), resourceData.getComputationalName(), newStatus);
-        }
-    }
-
-    private void updateResourceReuploadKeyFlag(String user, String project, ResourceData resourceData, boolean reuploadKeyRequired) {
-        if (resourceData.getResourceType() == ResourceType.EXPLORATORY) {
-            exploratoryDAO.updateReuploadKeyForExploratory(user, project, resourceData.getExploratoryName(), reuploadKeyRequired);
-        } else if (resourceData.getResourceType() == ResourceType.COMPUTATIONAL) {
-            computationalDAO.updateReuploadKeyFlagForComputationalResource(user, project,
-                    resourceData.getExploratoryName(), resourceData.getComputationalName(), reuploadKeyRequired);
-        }
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImpl.java
deleted file mode 100644
index cb7b1c1..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImpl.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ComputationalDAO;
-import com.epam.dlab.backendapi.dao.EnvDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.SchedulerJobDAO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.ComputationalService;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.service.SchedulerJobService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.exceptions.ResourceInappropriateStateException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.model.scheduler.SchedulerJobData;
-import com.epam.dlab.rest.client.RESTService;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-
-import java.time.DayOfWeek;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.OffsetDateTime;
-import java.time.ZoneOffset;
-import java.time.temporal.ChronoUnit;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static com.epam.dlab.constants.ServiceConsts.PROVISIONING_SERVICE_NAME;
-import static com.epam.dlab.dto.UserInstanceStatus.CONFIGURING;
-import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
-import static com.epam.dlab.dto.UserInstanceStatus.RUNNING;
-import static com.epam.dlab.dto.UserInstanceStatus.STARTING;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPED;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPING;
-import static com.epam.dlab.dto.UserInstanceStatus.TERMINATING;
-import static com.epam.dlab.dto.base.DataEngineType.getDockerImageName;
-import static java.time.ZoneId.systemDefault;
-import static java.util.Collections.singletonList;
-import static java.util.Date.from;
-
-@Slf4j
-@Singleton
-public class SchedulerJobServiceImpl implements SchedulerJobService {
-
-	private static final String SCHEDULER_NOT_FOUND_MSG =
-			"Scheduler job data not found for user %s with exploratory %s";
-	private static final long ALLOWED_INACTIVITY_MINUTES = 1L;
-
-	@Inject
-	private SchedulerJobDAO schedulerJobDAO;
-
-	@Inject
-	private ExploratoryDAO exploratoryDAO;
-
-	@Inject
-	private ComputationalDAO computationalDAO;
-
-	@Inject
-	private ExploratoryService exploratoryService;
-
-	@Inject
-	private ComputationalService computationalService;
-
-	@Inject
-	private SecurityService securityService;
-
-	@Inject
-	private EnvDAO envDAO;
-
-	@Inject
-	private RequestId requestId;
-
-	@Inject
-	@Named(PROVISIONING_SERVICE_NAME)
-	private RESTService provisioningService;
-
-	@Override
-	public SchedulerJobDTO fetchSchedulerJobForUserAndExploratory(String user, String project, String exploratoryName) {
-		return schedulerJobDAO.fetchSingleSchedulerJobByUserAndExploratory(user, project, exploratoryName)
-				.orElseThrow(() -> new ResourceNotFoundException(String.format(SCHEDULER_NOT_FOUND_MSG, user,
-						exploratoryName)));
-	}
-
-	@Override
-	public SchedulerJobDTO fetchSchedulerJobForComputationalResource(String user, String project, String exploratoryName,
-																	 String computationalName) {
-		return schedulerJobDAO.fetchSingleSchedulerJobForCluster(user, project, exploratoryName, computationalName)
-				.orElseThrow(() -> new ResourceNotFoundException(String.format(SCHEDULER_NOT_FOUND_MSG, user,
-						exploratoryName) + " with computational resource " + computationalName));
-	}
-
-	@Override
-	public void updateExploratorySchedulerData(String user, String project, String exploratoryName, SchedulerJobDTO dto) {
-		validateExploratoryStatus(user, project, exploratoryName);
-		populateDefaultSchedulerValues(dto);
-		log.debug("Updating exploratory {} for user {} with new scheduler job data: {}...", exploratoryName, user,
-				dto);
-		exploratoryDAO.updateSchedulerDataForUserAndExploratory(user, project, exploratoryName, dto);
-
-		if (!dto.inactivityScheduler() && dto.isSyncStartRequired()) {
-			shareSchedulerJobDataToSparkClusters(user, project, exploratoryName, dto);
-		} else if (!dto.inactivityScheduler()) {
-			computationalDAO.updateSchedulerSyncFlag(user, project, exploratoryName, dto.isSyncStartRequired());
-		}
-	}
-
-	@Override
-	public void updateComputationalSchedulerData(String user, String project, String exploratoryName, String computationalName,
-												 SchedulerJobDTO dto) {
-		validateExploratoryStatus(user, project, exploratoryName);
-		validateComputationalStatus(user, project, exploratoryName, computationalName);
-		populateDefaultSchedulerValues(dto);
-		log.debug("Updating computational resource {} affiliated with exploratory {} for user {} with new scheduler " +
-				"job data {}...", computationalName, exploratoryName, user, dto);
-		computationalDAO.updateSchedulerDataForComputationalResource(user, project, exploratoryName, computationalName, dto);
-	}
-
-	@Override
-	public void stopComputationalByScheduler() {
-		getComputationalSchedulersForStopping(OffsetDateTime.now(), true)
-				.forEach(this::stopComputational);
-	}
-
-	@Override
-	public void stopExploratoryByScheduler() {
-		getExploratorySchedulersForStopping(OffsetDateTime.now(), true)
-				.forEach(this::stopExploratory);
-	}
-
-	@Override
-	public void startExploratoryByScheduler() {
-		getExploratorySchedulersForStarting(OffsetDateTime.now())
-				.forEach(this::startExploratory);
-	}
-
-	@Override
-	public void startComputationalByScheduler() {
-		getComputationalSchedulersForStarting(OffsetDateTime.now())
-				.forEach(job -> startSpark(job.getUser(), job.getExploratoryName(), job.getComputationalName(),
-						job.getProject()));
-	}
-
-	@Override
-	public void terminateExploratoryByScheduler() {
-		getExploratorySchedulersForTerminating(OffsetDateTime.now())
-				.forEach(this::terminateExploratory);
-
-	}
-
-	@Override
-	public void terminateComputationalByScheduler() {
-		getComputationalSchedulersForTerminating(OffsetDateTime.now()).forEach(this::terminateComputational);
-
-	}
-
-	@Override
-	public void removeScheduler(String user, String exploratoryName) {
-		schedulerJobDAO.removeScheduler(user, exploratoryName);
-	}
-
-	@Override
-	public void removeScheduler(String user, String exploratoryName, String computationalName) {
-		schedulerJobDAO.removeScheduler(user, exploratoryName, computationalName);
-	}
-
-	@Override
-	public List<SchedulerJobData> getActiveSchedulers(String user, long minutesOffset) {
-		final OffsetDateTime desiredDateTime = OffsetDateTime.now().plusMinutes(minutesOffset);
-		final Predicate<SchedulerJobData> userPredicate = s -> user.equals(s.getUser());
-		final Stream<SchedulerJobData> computationalSchedulersStream =
-				getComputationalSchedulersForStopping(desiredDateTime, false)
-						.stream()
-						.filter(userPredicate);
-		final Stream<SchedulerJobData> exploratorySchedulersStream =
-				getExploratorySchedulersForStopping(desiredDateTime, false)
-						.stream()
-						.filter(userPredicate);
-		return Stream.concat(computationalSchedulersStream, exploratorySchedulersStream)
-				.collect(Collectors.toList());
-	}
-
-	private void stopComputational(SchedulerJobData job) {
-		final String project = job.getProject();
-		final String expName = job.getExploratoryName();
-		final String compName = job.getComputationalName();
-		final String user = job.getUser();
-		log.debug("Stopping exploratory {} computational {} for user {} by scheduler", expName, compName, user);
-		computationalService.stopSparkCluster(securityService.getServiceAccountInfo(user), project, expName, compName);
-	}
-
-	private void terminateComputational(SchedulerJobData job) {
-		final String user = job.getUser();
-		final String expName = job.getExploratoryName();
-		final String compName = job.getComputationalName();
-		final UserInfo userInfo = securityService.getServiceAccountInfo(user);
-		log.debug("Terminating exploratory {} computational {} for user {} by scheduler", expName, compName, user);
-		computationalService.terminateComputational(userInfo, job.getProject(), expName, compName);
-	}
-
-	private void stopExploratory(SchedulerJobData job) {
-		final String expName = job.getExploratoryName();
-		final String user = job.getUser();
-		final String project = job.getProject();
-		log.debug("Stopping exploratory {} for user {} by scheduler", expName, user);
-		exploratoryService.stop(securityService.getServiceAccountInfo(user), project, expName);
-	}
-
-	private List<SchedulerJobData> getExploratorySchedulersForTerminating(OffsetDateTime now) {
-		return schedulerJobDAO.getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED)
-				.stream()
-				.filter(canSchedulerForTerminatingBeApplied(now))
-				.collect(Collectors.toList());
-	}
-
-	private List<SchedulerJobData> getComputationalSchedulersForTerminating(OffsetDateTime now) {
-		return schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING)
-				.stream()
-				.filter(canSchedulerForTerminatingBeApplied(now))
-				.collect(Collectors.toList());
-	}
-
-	private void startExploratory(SchedulerJobData schedulerJobData) {
-		final String user = schedulerJobData.getUser();
-		final String exploratoryName = schedulerJobData.getExploratoryName();
-		final String project = schedulerJobData.getProject();
-		log.debug("Starting exploratory {} for user {} by scheduler", exploratoryName, user);
-		exploratoryService.start(securityService.getServiceAccountInfo(user), exploratoryName, project);
-		if (schedulerJobData.getJobDTO().isSyncStartRequired()) {
-			log.trace("Starting computational for exploratory {} for user {} by scheduler", exploratoryName, user);
-			final DataEngineType sparkCluster = DataEngineType.SPARK_STANDALONE;
-			final List<UserComputationalResource> compToBeStarted =
-					computationalDAO.findComputationalResourcesWithStatus(user, project, exploratoryName, STOPPED);
-
-			compToBeStarted
-					.stream()
-					.filter(compResource -> shouldClusterBeStarted(sparkCluster, compResource))
-					.forEach(comp -> startSpark(user, exploratoryName, comp.getComputationalName(), project));
-		}
-	}
-
-	private void terminateExploratory(SchedulerJobData job) {
-		final String user = job.getUser();
-		final String project = job.getProject();
-		final String expName = job.getExploratoryName();
-		log.debug("Terminating exploratory {} for user {} by scheduler", expName, user);
-		exploratoryService.terminate(securityService.getUserInfoOffline(user), project, expName);
-	}
-
-	private void startSpark(String user, String expName, String compName, String project) {
-		log.debug("Starting exploratory {} computational {} for user {} by scheduler", expName, compName, user);
-		computationalService.startSparkCluster(securityService.getServiceAccountInfo(user), expName, compName, project);
-	}
-
-	private boolean shouldClusterBeStarted(DataEngineType sparkCluster, UserComputationalResource compResource) {
-		return Objects.nonNull(compResource.getSchedulerData()) && compResource.getSchedulerData().isSyncStartRequired()
-				&& compResource.getImageName().equals(getDockerImageName(sparkCluster));
-	}
-
-	/**
-	 * Performs bulk updating operation with scheduler data for corresponding to exploratory Spark clusters.
-	 * All these resources will obtain data which is equal to exploratory's except 'stopping' operation (it will be
-	 * performed automatically with notebook stopping since Spark resources have such feature).
-	 *
-	 * @param user            user's name
-	 * @param project         project name
-	 * @param exploratoryName name of exploratory resource
-	 * @param dto             scheduler job data.
-	 */
-	private void shareSchedulerJobDataToSparkClusters(String user, String project, String exploratoryName, SchedulerJobDTO dto) {
-		List<String> correspondingSparkClusters = computationalDAO.getComputationalResourcesWhereStatusIn(user, project,
-				singletonList(DataEngineType.SPARK_STANDALONE),
-				exploratoryName, STARTING, RUNNING, STOPPING, STOPPED);
-		SchedulerJobDTO dtoWithoutStopData = getSchedulerJobWithoutStopData(dto);
-		for (String sparkName : correspondingSparkClusters) {
-			log.debug("Updating computational resource {} affiliated with exploratory {} for user {} with new " +
-					"scheduler job data {}...", sparkName, exploratoryName, user, dtoWithoutStopData);
-			computationalDAO.updateSchedulerDataForComputationalResource(user, project, exploratoryName,
-					sparkName, dtoWithoutStopData);
-		}
-	}
-
-	private List<SchedulerJobData> getExploratorySchedulersForStopping(OffsetDateTime currentDateTime,
-																	   boolean checkInactivity) {
-
-		final Date clusterMaxInactivityAllowedDate =
-				from(LocalDateTime.now().minusMinutes(ALLOWED_INACTIVITY_MINUTES).atZone(systemDefault()).toInstant());
-		return schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(RUNNING,
-				clusterMaxInactivityAllowedDate)
-				.stream()
-				.filter(canSchedulerForStoppingBeApplied(currentDateTime)
-						.or(schedulerJobData -> checkInactivity && exploratoryInactivityCondition(schedulerJobData)))
-				.collect(Collectors.toList());
-	}
-
-	private List<SchedulerJobData> getExploratorySchedulersForStarting(OffsetDateTime currentDateTime) {
-		return schedulerJobDAO.getExploratorySchedulerDataWithStatus(STOPPED)
-				.stream()
-				.filter(canSchedulerForStartingBeApplied(currentDateTime))
-				.collect(Collectors.toList());
-	}
-
-	private List<SchedulerJobData> getComputationalSchedulersForStarting(OffsetDateTime currentDateTime) {
-		return schedulerJobDAO
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, STOPPED)
-				.stream()
-				.filter(canSchedulerForStartingBeApplied(currentDateTime))
-				.collect(Collectors.toList());
-	}
-
-	private Predicate<SchedulerJobData> canSchedulerForStoppingBeApplied(OffsetDateTime currentDateTime) {
-		return schedulerJobData -> shouldSchedulerBeExecuted(schedulerJobData.getJobDTO(),
-				currentDateTime, schedulerJobData.getJobDTO().getStopDaysRepeat(),
-				schedulerJobData.getJobDTO().getEndTime());
-	}
-
-	private Predicate<SchedulerJobData> canSchedulerForStartingBeApplied(OffsetDateTime currentDateTime) {
-		return schedulerJobData -> shouldSchedulerBeExecuted(schedulerJobData.getJobDTO(),
-				currentDateTime, schedulerJobData.getJobDTO().getStartDaysRepeat(),
-				schedulerJobData.getJobDTO().getStartTime());
-	}
-
-	private Predicate<SchedulerJobData> canSchedulerForTerminatingBeApplied(OffsetDateTime currentDateTime) {
-		return schedulerJobData -> shouldBeTerminated(currentDateTime, schedulerJobData);
-	}
-
-	private boolean shouldBeTerminated(OffsetDateTime currentDateTime, SchedulerJobData schedulerJobData) {
-		final SchedulerJobDTO jobDTO = schedulerJobData.getJobDTO();
-		final ZoneOffset timeZoneOffset = jobDTO.getTimeZoneOffset();
-		final LocalDateTime convertedCurrentTime = localDateTimeAtZone(currentDateTime, timeZoneOffset);
-		final LocalDateTime terminateDateTime = jobDTO.getTerminateDateTime();
-		return Objects.nonNull(terminateDateTime) && isSchedulerActive(jobDTO, convertedCurrentTime) &&
-				convertedCurrentTime.equals(terminateDateTime.atOffset(timeZoneOffset).toLocalDateTime());
-	}
-
-	private List<SchedulerJobData> getComputationalSchedulersForStopping(OffsetDateTime currentDateTime,
-																		 boolean checkInactivity) {
-		return schedulerJobDAO
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING)
-				.stream()
-				.filter(canSchedulerForStoppingBeApplied(currentDateTime)
-						.or(schedulerJobData -> checkInactivity && computationalInactivityCondition(schedulerJobData)))
-				.collect(Collectors.toList());
-	}
-
-	private boolean computationalInactivityCondition(SchedulerJobData jobData) {
-		final SchedulerJobDTO schedulerData = jobData.getJobDTO();
-		return schedulerData.isCheckInactivityRequired() && computationalInactivityExceed(jobData, schedulerData);
-	}
-
-	private boolean computationalInactivityExceed(SchedulerJobData schedulerJobData, SchedulerJobDTO schedulerData) {
-		final String projectName = schedulerJobData.getProject();
-		final String explName = schedulerJobData.getExploratoryName();
-		final String compName = schedulerJobData.getComputationalName();
-		final String user = schedulerJobData.getUser();
-		final UserComputationalResource c = computationalDAO.fetchComputationalFields(user, projectName, explName, compName);
-		final Long maxInactivity = schedulerData.getMaxInactivity();
-		return inactivityCondition(maxInactivity, c.getStatus(), c.getLastActivity());
-	}
-
-	private boolean exploratoryInactivityCondition(SchedulerJobData jobData) {
-		final SchedulerJobDTO schedulerData = jobData.getJobDTO();
-		return schedulerData.isCheckInactivityRequired() && exploratoryInactivityExceed(jobData, schedulerData);
-	}
-
-	private boolean exploratoryInactivityExceed(SchedulerJobData schedulerJobData, SchedulerJobDTO schedulerData) {
-		final String project = schedulerJobData.getProject();
-		final String expName = schedulerJobData.getExploratoryName();
-		final String user = schedulerJobData.getUser();
-		final UserInstanceDTO userInstanceDTO = exploratoryDAO.fetchExploratoryFields(user, project, expName, true);
-		final boolean canBeStopped = userInstanceDTO.getResources()
-				.stream()
-				.map(UserComputationalResource::getStatus)
-				.map(UserInstanceStatus::of)
-				.noneMatch(status -> status.in(TERMINATING, CONFIGURING, CREATING, CREATING));
-		return canBeStopped && inactivityCondition(schedulerData.getMaxInactivity(), userInstanceDTO.getStatus(),
-				userInstanceDTO.getLastActivity());
-	}
-
-	private boolean inactivityCondition(Long maxInactivity, String status, LocalDateTime lastActivity) {
-		return UserInstanceStatus.RUNNING.toString().equals(status) &&
-				Optional.ofNullable(lastActivity)
-						.map(la -> la.plusMinutes(maxInactivity).isBefore(LocalDateTime.now()))
-						.orElse(Boolean.FALSE);
-	}
-
-	private void populateDefaultSchedulerValues(SchedulerJobDTO dto) {
-		if (Objects.isNull(dto.getBeginDate()) || StringUtils.isBlank(dto.getBeginDate().toString())) {
-			dto.setBeginDate(LocalDate.now());
-		}
-		if (Objects.isNull(dto.getTimeZoneOffset()) || StringUtils.isBlank(dto.getTimeZoneOffset().toString())) {
-			dto.setTimeZoneOffset(OffsetDateTime.now(systemDefault()).getOffset());
-		}
-	}
-
-	private void validateExploratoryStatus(String user, String project, String exploratoryName) {
-		final UserInstanceDTO userInstance = exploratoryDAO.fetchExploratoryFields(user, project, exploratoryName);
-		validateResourceStatus(userInstance.getStatus());
-	}
-
-	private void validateComputationalStatus(String user, String project, String exploratoryName, String computationalName) {
-		final UserComputationalResource computationalResource =
-				computationalDAO.fetchComputationalFields(user, project, exploratoryName, computationalName);
-		final String computationalStatus = computationalResource.getStatus();
-		validateResourceStatus(computationalStatus);
-	}
-
-	private void validateResourceStatus(String resourceStatus) {
-		final UserInstanceStatus status = UserInstanceStatus.of(resourceStatus);
-		if (Objects.isNull(status) || status.in(UserInstanceStatus.TERMINATED, TERMINATING,
-				UserInstanceStatus.FAILED)) {
-			throw new ResourceInappropriateStateException(String.format("Can not create/update scheduler for user " +
-					"instance with status: %s", status));
-		}
-	}
-
-	private boolean shouldSchedulerBeExecuted(SchedulerJobDTO dto, OffsetDateTime dateTime, List<DayOfWeek> daysRepeat,
-											  LocalTime time) {
-		LocalDateTime convertedDateTime = localDateTimeAtZone(dateTime, dto.getTimeZoneOffset());
-
-		return isSchedulerActive(dto, convertedDateTime)
-				&& daysRepeat.contains(convertedDateTime.toLocalDate().getDayOfWeek())
-				&& convertedDateTime.toLocalTime().equals(time);
-	}
-
-	private boolean isSchedulerActive(SchedulerJobDTO dto, LocalDateTime convertedDateTime) {
-		return !convertedDateTime.toLocalDate().isBefore(dto.getBeginDate())
-				&& finishDateAfterCurrentDate(dto, convertedDateTime);
-	}
-
-	private LocalDateTime localDateTimeAtZone(OffsetDateTime dateTime, ZoneOffset timeZoneOffset) {
-		return dateTime.atZoneSameInstant(ZoneOffset.UTC)
-				.truncatedTo(ChronoUnit.MINUTES)
-				.withZoneSameInstant(timeZoneOffset)
-				.toLocalDateTime();
-	}
-
-	private boolean finishDateAfterCurrentDate(SchedulerJobDTO dto, LocalDateTime currentDateTime) {
-		return Objects.isNull(dto.getFinishDate()) || !currentDateTime.toLocalDate().isAfter(dto.getFinishDate());
-	}
-
-	private SchedulerJobDTO getSchedulerJobWithoutStopData(SchedulerJobDTO dto) {
-		SchedulerJobDTO convertedDto = new SchedulerJobDTO();
-		convertedDto.setBeginDate(dto.getBeginDate());
-		convertedDto.setFinishDate(dto.getFinishDate());
-		convertedDto.setStartTime(dto.getStartTime());
-		convertedDto.setStartDaysRepeat(dto.getStartDaysRepeat());
-		convertedDto.setTerminateDateTime(dto.getTerminateDateTime());
-		convertedDto.setTimeZoneOffset(dto.getTimeZoneOffset());
-		convertedDto.setSyncStartRequired(dto.isSyncStartRequired());
-		return convertedDto;
-	}
-
-}
-
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/SystemInfoServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/SystemInfoServiceImpl.java
deleted file mode 100644
index 14ba483..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/SystemInfoServiceImpl.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.backendapi.resources.dto.SystemInfoDto;
-import com.epam.dlab.backendapi.service.SystemInfoService;
-import com.epam.dlab.model.systeminfo.DiskInfo;
-import com.epam.dlab.model.systeminfo.MemoryInfo;
-import com.epam.dlab.model.systeminfo.OsInfo;
-import com.epam.dlab.model.systeminfo.ProcessorInfo;
-import com.google.inject.Inject;
-import oshi.SystemInfo;
-import oshi.hardware.CentralProcessor;
-import oshi.hardware.GlobalMemory;
-import oshi.hardware.HardwareAbstractionLayer;
-import oshi.software.os.OperatingSystem;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class SystemInfoServiceImpl implements SystemInfoService {
-
-	@Inject
-	private SystemInfo si;
-
-	@Override
-	public SystemInfoDto getSystemInfo() {
-		HardwareAbstractionLayer hal = si.getHardware();
-		final OperatingSystem operatingSystem = si.getOperatingSystem();
-		return new SystemInfoDto(getOsInfo(operatingSystem), getProcessorInfo(hal), getMemoryInfo(hal),
-				getDiskInfoList(File.listRoots()));
-	}
-
-	private OsInfo getOsInfo(OperatingSystem os) {
-		return OsInfo.builder()
-				.manufacturer(os.getManufacturer())
-				.family(os.getFamily())
-				.version(os.getVersion().getVersion())
-				.buildNumber(os.getVersion().getBuildNumber())
-				.build();
-	}
-
-	private ProcessorInfo getProcessorInfo(HardwareAbstractionLayer hal) {
-		CentralProcessor cp = hal.getProcessor();
-		return ProcessorInfo.builder()
-				.model(cp.getModel())
-				.family(cp.getFamily())
-				.name(cp.getName())
-				.id(cp.getProcessorID())
-				.vendor(cp.getVendor())
-				.logicalCoreCount(cp.getLogicalProcessorCount())
-				.physicalCoreCount(cp.getPhysicalProcessorCount())
-				.isCpu64Bit(cp.isCpu64bit())
-				.currentSystemLoad(cp.getSystemCpuLoad())
-				.systemLoadAverage(cp.getSystemLoadAverage())
-				.build();
-	}
-
-	private MemoryInfo getMemoryInfo(HardwareAbstractionLayer hal) {
-		GlobalMemory memory = hal.getMemory();
-		return MemoryInfo.builder()
-				.availableMemory(memory.getAvailable())
-				.totalMemory(memory.getTotal())
-				.swapTotal(memory.getSwapTotal())
-				.swapUsed(memory.getSwapUsed())
-				.pagesPageIn(memory.getSwapPagesIn())
-				.pagesPageOut(memory.getSwapPagesOut())
-				.build();
-	}
-
-	private List<DiskInfo> getDiskInfoList(File[] roots) {
-		return Arrays.stream(roots).map(this::getDiskInfo).collect(Collectors.toList());
-	}
-
-	private DiskInfo getDiskInfo(File fileStore) {
-		return DiskInfo.builder()
-				.serialNumber(fileStore.getName())
-				.usedByteSpace(fileStore.getTotalSpace() - fileStore.getFreeSpace())
-				.totalByteSpace(fileStore.getTotalSpace())
-				.build();
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImpl.java
deleted file mode 100644
index 9eb25c3..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImpl.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ProjectDAO;
-import com.epam.dlab.backendapi.dao.UserGroupDao;
-import com.epam.dlab.backendapi.dao.UserRoleDao;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.resources.dto.UserGroupDto;
-import com.epam.dlab.backendapi.resources.dto.UserRoleDto;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.UserGroupService;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.exceptions.ResourceConflictException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-@Singleton
-@Slf4j
-public class UserGroupServiceImpl implements UserGroupService {
-	private static final String ROLE_NOT_FOUND_MSG = "Any of role : %s were not found";
-	private static final String ADMIN = "admin";
-	private static final String PROJECT_ADMIN = "projectAdmin";
-
-	@Inject
-	private UserGroupDao userGroupDao;
-	@Inject
-	private UserRoleDao userRoleDao;
-	@Inject
-	private ProjectDAO projectDAO;
-	@Inject
-	private ProjectService projectService;
-
-	@Override
-	public void createGroup(String group, Set<String> roleIds, Set<String> users) {
-		checkAnyRoleFound(roleIds, userRoleDao.addGroupToRole(Collections.singleton(group), roleIds));
-		log.debug("Adding users {} to group {}", users, group);
-		userGroupDao.addUsers(group, users);
-	}
-
-	@Override
-	public void updateGroup(UserInfo user, String group, Set<String> roleIds, Set<String> users) {
-		if (UserRoles.isAdmin(user)) {
-			updateGroup(group, roleIds, users);
-		} else if (UserRoles.isProjectAdmin(user)) {
-			projectService.getProjects(user)
-					.stream()
-					.map(ProjectDTO::getGroups)
-					.flatMap(Collection::stream)
-					.filter(g -> g.equalsIgnoreCase(group))
-					.findAny()
-					.orElseThrow(() -> new DlabException(String.format("User %s doesn't have appropriate permission", user.getName())));
-			updateGroup(group, roleIds, users);
-		} else {
-			throw new DlabException(String.format("User %s doesn't have appropriate permission", user.getName()));
-		}
-	}
-
-	@Override
-	public void removeGroup(String groupId) {
-		if (projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
-				UserInstanceStatus.TERMINATING)
-				.stream()
-				.map(ProjectDTO::getGroups)
-				.noneMatch(groups -> groups.contains(groupId))) {
-			userRoleDao.removeGroup(groupId);
-			userGroupDao.removeGroup(groupId);
-		} else {
-			throw new ResourceConflictException("Group can not be removed because it is used in some project");
-		}
-	}
-
-	@Override
-	public List<UserGroupDto> getAggregatedRolesByGroup(UserInfo user) {
-		if (UserRoles.isAdmin(user)) {
-			return userRoleDao.aggregateRolesByGroup();
-		} else if (UserRoles.isProjectAdmin(user)) {
-			Set<String> groups = projectService.getProjects(user)
-					.stream()
-					.map(ProjectDTO::getGroups)
-					.flatMap(Collection::stream)
-					.collect(Collectors.toSet());
-			return userRoleDao.aggregateRolesByGroup()
-					.stream()
-					.filter(userGroup -> groups.contains(userGroup.getGroup()) && !containsAdministrationPermissions(userGroup))
-					.collect(Collectors.toList());
-		} else {
-			throw new DlabException(String.format("User %s doesn't have appropriate permission", user.getName()));
-		}
-	}
-
-	private boolean containsAdministrationPermissions(UserGroupDto userGroup) {
-		List<String> ids = userGroup.getRoles()
-				.stream()
-				.map(UserRoleDto::getId)
-				.collect(Collectors.toList());
-		return ids.contains(ADMIN) || ids.contains(PROJECT_ADMIN);
-	}
-
-	private void updateGroup(String group, Set<String> roleIds, Set<String> users) {
-		log.debug("Updating users for group {}: {}", group, users);
-		userGroupDao.updateUsers(group, users);
-		log.debug("Removing group {} from existing roles", group);
-		userRoleDao.removeGroupWhenRoleNotIn(group, roleIds);
-		log.debug("Adding group {} to roles {}", group, roleIds);
-		userRoleDao.addGroupToRole(Collections.singleton(group), roleIds);
-	}
-
-	private void checkAnyRoleFound(Set<String> roleIds, boolean anyRoleFound) {
-		if (!anyRoleFound) {
-			throw new ResourceNotFoundException(String.format(ROLE_NOT_FOUND_MSG, roleIds));
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/servlet/guacamole/GuacamoleServlet.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/servlet/guacamole/GuacamoleServlet.java
deleted file mode 100644
index 9c79bfa..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/servlet/guacamole/GuacamoleServlet.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.servlet.guacamole;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.SecurityDAO;
-import com.epam.dlab.backendapi.service.GuacamoleService;
-import com.epam.dlab.exceptions.DlabAuthenticationException;
-import com.epam.dlab.exceptions.DlabException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.inject.Inject;
-import lombok.Data;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.guacamole.net.GuacamoleTunnel;
-import org.apache.guacamole.servlet.GuacamoleHTTPTunnelServlet;
-import org.apache.http.HttpStatus;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.HttpHeaders;
-import java.io.IOException;
-
-public class GuacamoleServlet extends GuacamoleHTTPTunnelServlet {
-	private static final String UNAUTHORIZED_MSG = "User is not authenticated";
-	private static final String DLAB_PREFIX = "DLab-";
-	private final GuacamoleService guacamoleService;
-	private final ObjectMapper mapper;
-	private final SecurityDAO securityDAO;
-	private static final String AUTH_HEADER_PREFIX = "Bearer ";
-
-	@Inject
-	public GuacamoleServlet(GuacamoleService guacamoleService, ObjectMapper mapper, SecurityDAO securityDAO) {
-		this.mapper = mapper;
-		this.guacamoleService = guacamoleService;
-		this.securityDAO = securityDAO;
-	}
-
-	@Override
-	protected GuacamoleTunnel doConnect(HttpServletRequest request) {
-		try {
-			final String authorization = request.getHeader(DLAB_PREFIX + HttpHeaders.AUTHORIZATION);
-			final String credentials = StringUtils.substringAfter(authorization, AUTH_HEADER_PREFIX);
-			final UserInfo userInfo =
-					securityDAO.getUser(credentials)
-							.orElseThrow(() -> new DlabAuthenticationException(UNAUTHORIZED_MSG));
-			final CreateTerminalDTO createTerminalDTO = mapper.readValue(request.getReader(), CreateTerminalDTO.class);
-			return guacamoleService.getTunnel(userInfo, createTerminalDTO.getHost(), createTerminalDTO.getEndpoint());
-		} catch (IOException e) {
-			throw new DlabException("Can not read request body: " + e.getMessage(), e);
-		}
-	}
-
-	@Override
-	protected void handleTunnelRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException {
-		try {
-			super.handleTunnelRequest(request, response);
-		} catch (DlabAuthenticationException e) {
-			sendError(response, HttpStatus.SC_UNAUTHORIZED, HttpStatus.SC_UNAUTHORIZED, UNAUTHORIZED_MSG);
-		}
-	}
-
-	@Data
-	private static class CreateTerminalDTO {
-		private String host;
-		private String endpoint;
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/BillingUtils.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/BillingUtils.java
deleted file mode 100644
index 7e46a09..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/BillingUtils.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.util;
-
-import com.epam.dlab.backendapi.domain.BillingReportLine;
-import com.epam.dlab.backendapi.resources.dto.ImageInfoRecord;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import jersey.repackaged.com.google.common.collect.Lists;
-import org.apache.commons.lang3.StringUtils;
-
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.stream.Stream;
-
-import static com.epam.dlab.dto.billing.BillingResourceType.BUCKET;
-import static com.epam.dlab.dto.billing.BillingResourceType.COMPUTATIONAL;
-import static com.epam.dlab.dto.billing.BillingResourceType.EDGE;
-import static com.epam.dlab.dto.billing.BillingResourceType.ENDPOINT;
-import static com.epam.dlab.dto.billing.BillingResourceType.EXPLORATORY;
-import static com.epam.dlab.dto.billing.BillingResourceType.IMAGE;
-import static com.epam.dlab.dto.billing.BillingResourceType.SSN;
-import static com.epam.dlab.dto.billing.BillingResourceType.VOLUME;
-
-public class BillingUtils {
-    private static final String[] AVAILABLE_NOTEBOOKS = {"zeppelin", "tensor-rstudio", "rstudio", "tensor", "superset", "jupyterlab", "jupyter", "deeplearning"};
-    private static final String[] REPORT_HEADERS = {"DLab ID", "User", "Project", "DLab Resource Type", "Status", "Shape", "Product", "Cost"};
-    private static final String REPORT_FIRST_LINE = "Service base name: %s. Available reporting period from: %s to: %s";
-    private static final String TOTAL_LINE = "Total: %s %s";
-    private static final String SSN_FORMAT = "%s-ssn";
-    private static final String ENDPOINT_FORMAT = "%s-%s-endpoint";
-    private static final String EDGE_FORMAT = "%s-%s-%s-edge";
-    private static final String EDGE_VOLUME_FORMAT = "%s-%s-%s-edge-volume-primary";
-    private static final String PROJECT_ENDPOINT_BUCKET_FORMAT = "%s-%s-%s-bucket";
-    private static final String ENDPOINT_SHARED_BUCKET_FORMAT = "%s-%s-shared-bucket";
-    private static final String VOLUME_PRIMARY_FORMAT = "%s-volume-primary";
-    private static final String VOLUME_PRIMARY_COMPUTATIONAL_FORMAT = "%s-%s-volume-primary";
-    private static final String VOLUME_SECONDARY_FORMAT = "%s-volume-secondary";
-    private static final String VOLUME_SECONDARY_COMPUTATIONAL_FORMAT = "%s-%s-volume-secondary";
-    private static final String IMAGE_STANDARD_FORMAT1 = "%s-%s-%s-%s-notebook-image";
-    private static final String IMAGE_STANDARD_FORMAT2 = "%s-%s-%s-notebook-image";
-    private static final String IMAGE_CUSTOM_FORMAT = "%s-%s-%s-%s-%s";
-
-    private static final String SHARED_RESOURCE = "Shared resource";
-    private static final String IMAGE_NAME = "Image";
-
-    private static final String DATAENGINE_NAME_FORMAT = "%d x %s";
-    private static final String DATAENGINE_SERVICE_NAME_FORMAT = "Master: %sSlave: %s";
-
-    public static Stream<BillingReportLine> edgeBillingDataStream(String project, String sbn, String endpoint) {
-        final String userEdgeId = String.format(EDGE_FORMAT, sbn, project, endpoint).toLowerCase();
-        final String edgeVolumeId = String.format(EDGE_VOLUME_FORMAT, sbn, project, endpoint).toLowerCase();
-        final String endpointBucketId = String.format(PROJECT_ENDPOINT_BUCKET_FORMAT, sbn, project, endpoint).toLowerCase();
-
-        return Stream.concat(Stream.of(
-                BillingReportLine.builder().resourceName(endpoint).user(SHARED_RESOURCE).project(project).dlabId(userEdgeId).resourceType(EDGE).build(),
-                BillingReportLine.builder().resourceName("EDGE volume").user(SHARED_RESOURCE).project(project).dlabId(edgeVolumeId).resourceType(VOLUME).build(),
-                BillingReportLine.builder().resourceName("Project endpoint shared bucket").user(SHARED_RESOURCE).project(project).dlabId(endpointBucketId).resourceType(BUCKET).build()
-                ),
-                standardImageBillingDataStream(sbn, project, endpoint)
-        );
-    }
-
-    public static Stream<BillingReportLine> ssnBillingDataStream(String sbn) {
-        final String ssnId = String.format(SSN_FORMAT, sbn);
-        return Stream.of(
-                BillingReportLine.builder().user(SHARED_RESOURCE).project(SHARED_RESOURCE).resourceName("SSN").dlabId(ssnId).resourceType(SSN).build(),
-                BillingReportLine.builder().user(SHARED_RESOURCE).project(SHARED_RESOURCE).resourceName("SSN Volume").dlabId(String.format(VOLUME_PRIMARY_FORMAT, ssnId)).resourceType(VOLUME).build()
-        );
-    }
-
-    public static Stream<BillingReportLine> sharedEndpointBillingDataStream(String endpoint, String sbn) {
-        final String projectEndpointBucketId = String.format(ENDPOINT_SHARED_BUCKET_FORMAT, sbn, endpoint).toLowerCase();
-        final String endpointId = String.format(ENDPOINT_FORMAT, sbn, endpoint).toLowerCase();
-        return Stream.concat(Stream.of(
-                BillingReportLine.builder().resourceName("Endpoint shared bucket").user(SHARED_RESOURCE).project(SHARED_RESOURCE).dlabId(projectEndpointBucketId).resourceType(BUCKET).build(),
-                BillingReportLine.builder().resourceName("Endpoint").user(SHARED_RESOURCE).project(SHARED_RESOURCE).dlabId(endpointId).resourceType(ENDPOINT).build()
-                ),
-                standardImageBillingDataStream(sbn, endpoint));
-    }
-
-    public static Stream<BillingReportLine> exploratoryBillingDataStream(UserInstanceDTO userInstance, Integer maxSparkInstanceCount) {
-        final Stream<BillingReportLine> computationalStream = userInstance.getResources()
-                .stream()
-                .filter(cr -> cr.getComputationalId() != null)
-                .flatMap(cr -> {
-                    final String computationalId = cr.getComputationalId().toLowerCase();
-                    return Stream.concat(Stream.of(
-                            withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).dlabId(computationalId).resourceType(COMPUTATIONAL).shape(getComputationalShape(cr))
-                                    .exploratoryName(userInstance.getExploratoryName()).build(),
-                            withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).dlabId(String.format(VOLUME_PRIMARY_FORMAT, computationalId)).resourceType(VOLUME).build(),
-                            withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).dlabId(String.format(VOLUME_SECONDARY_FORMAT, computationalId)).resourceType(VOLUME).build(),
-                            withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).dlabId(String.format(VOLUME_PRIMARY_COMPUTATIONAL_FORMAT, computationalId, "m"))
-                                    .resourceType(VOLUME).build(),
-                            withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).dlabId(String.format(VOLUME_SECONDARY_COMPUTATIONAL_FORMAT, computationalId, "m"))
-                                    .resourceType(VOLUME).build()
-                            ),
-                            getSlaveVolumes(userInstance, cr, maxSparkInstanceCount)
-                    );
-                });
-        final String exploratoryName = userInstance.getExploratoryName();
-        final String exploratoryId = userInstance.getExploratoryId().toLowerCase();
-        final String primaryVolumeId = String.format(VOLUME_PRIMARY_FORMAT, exploratoryId);
-        final String secondaryVolumeId = String.format(VOLUME_SECONDARY_FORMAT, exploratoryId);
-        final Stream<BillingReportLine> exploratoryStream = Stream.of(
-                withUserProjectEndpoint(userInstance).resourceName(exploratoryName).dlabId(exploratoryId).resourceType(EXPLORATORY).shape(userInstance.getShape()).build(),
-                withUserProjectEndpoint(userInstance).resourceName(exploratoryName).dlabId(primaryVolumeId).resourceType(VOLUME).build(),
-                withUserProjectEndpoint(userInstance).resourceName(exploratoryName).dlabId(secondaryVolumeId).resourceType(VOLUME).build());
-
-        return Stream.concat(computationalStream, exploratoryStream);
-    }
-
-    public static Stream<BillingReportLine> customImageBillingDataStream(ImageInfoRecord image, String sbn) {
-        String imageId = String.format(IMAGE_CUSTOM_FORMAT, sbn, image.getProject(), image.getEndpoint(), image.getApplication(), image.getName()).toLowerCase();
-        return Stream.of(
-                BillingReportLine.builder().resourceName(image.getName()).project(image.getProject()).dlabId(imageId).user(image.getUser()).resourceType(IMAGE).build()
-        );
-    }
-
-    private static Stream<BillingReportLine> getSlaveVolumes(UserInstanceDTO userInstance, UserComputationalResource cr, Integer maxSparkInstanceCount) {
-        List<BillingReportLine> list = new ArrayList<>();
-        for (int i = 1; i <= maxSparkInstanceCount; i++) {
-            list.add(withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).dlabId(String.format(VOLUME_PRIMARY_COMPUTATIONAL_FORMAT, cr.getComputationalId().toLowerCase(), "s" + i))
-                    .resourceType(VOLUME).build());
-            list.add(withUserProjectEndpoint(userInstance).resourceName(cr.getComputationalName()).dlabId(String.format(VOLUME_SECONDARY_COMPUTATIONAL_FORMAT, cr.getComputationalId().toLowerCase(), "s" + i))
-                    .resourceType(VOLUME).build());
-        }
-        return list.stream();
-    }
-
-    private static BillingReportLine.BillingReportLineBuilder withUserProjectEndpoint(UserInstanceDTO userInstance) {
-        return BillingReportLine.builder().user(userInstance.getUser()).project(userInstance.getProject()).endpoint(userInstance.getEndpoint());
-    }
-
-    public static String getComputationalShape(UserComputationalResource resource) {
-        return DataEngineType.fromDockerImageName(resource.getImageName()) == DataEngineType.SPARK_STANDALONE ?
-                String.format(DATAENGINE_NAME_FORMAT, resource.getDataengineInstanceCount(), resource.getDataengineShape()) :
-                String.format(DATAENGINE_SERVICE_NAME_FORMAT, resource.getMasterNodeShape(), resource.getSlaveNodeShape());
-    }
-
-    private static Stream<BillingReportLine> standardImageBillingDataStream(String sbn, String endpoint) {
-        List<BillingReportLine> list = new ArrayList<>();
-        for (String notebook : AVAILABLE_NOTEBOOKS) {
-            list.add(BillingReportLine.builder().resourceName(IMAGE_NAME).dlabId(String.format(IMAGE_STANDARD_FORMAT2, sbn, endpoint, notebook).toLowerCase())
-                    .user(SHARED_RESOURCE).project(SHARED_RESOURCE).resourceType(IMAGE).build());
-        }
-
-        return list.stream();
-    }
-
-    private static Stream<BillingReportLine> standardImageBillingDataStream(String sbn, String project, String endpoint) {
-        List<BillingReportLine> list = new ArrayList<>();
-        for (String notebook : AVAILABLE_NOTEBOOKS) {
-            list.add(BillingReportLine.builder().resourceName(IMAGE_NAME).dlabId(String.format(IMAGE_STANDARD_FORMAT1, sbn, project, endpoint, notebook).toLowerCase())
-                    .project(project).user(SHARED_RESOURCE).resourceType(IMAGE).build());
-        }
-
-        return list.stream();
-    }
-
-    public static String getFirstLine(String sbn, LocalDate from, LocalDate to) {
-        return CSVFormatter.formatLine(Lists.newArrayList(String.format(REPORT_FIRST_LINE, sbn,
-                Optional.ofNullable(from).map(date -> date.format(DateTimeFormatter.ISO_DATE)).orElse(StringUtils.EMPTY),
-                Optional.ofNullable(to).map(date -> date.format(DateTimeFormatter.ISO_DATE)).orElse(StringUtils.EMPTY))),
-                CSVFormatter.SEPARATOR, '\"');
-    }
-
-    public static String getHeader(boolean isFull) {
-        List<String> headers = new ArrayList<>(Arrays.asList(BillingUtils.REPORT_HEADERS));
-        if (!isFull) {
-            headers.remove(1);
-        }
-        return CSVFormatter.formatLine(headers, CSVFormatter.SEPARATOR);
-    }
-
-    public static String printLine(BillingReportLine line, boolean isFull) {
-        List<String> lines = new ArrayList<>();
-        lines.add(getOrEmpty(line.getDlabId()));
-        if (isFull) {
-            lines.add(getOrEmpty(line.getUser()));
-        }
-        lines.add(getOrEmpty(line.getProject()));
-        lines.add(getOrEmpty(Optional.ofNullable(line.getResourceType()).map(r -> StringUtils.capitalize(r.toString().toLowerCase())).orElse(null)));
-        lines.add(getOrEmpty(Optional.ofNullable(line.getStatus()).map(UserInstanceStatus::toString).orElse(null)));
-        lines.add(getOrEmpty(line.getShape()));
-        lines.add(getOrEmpty(line.getProduct()));
-        lines.add(getOrEmpty(Optional.ofNullable(line.getCost()).map(String::valueOf).orElse(null)));
-        return CSVFormatter.formatLine(lines, CSVFormatter.SEPARATOR);
-    }
-
-    public static String getTotal(Double total, String currency) {
-        List<String> totalLine = new ArrayList<>();
-        for (int i = 0; i < REPORT_HEADERS.length - 1; i++) {
-            totalLine.add(StringUtils.EMPTY);
-        }
-        totalLine.add(REPORT_HEADERS.length - 1, String.format(TOTAL_LINE, getOrEmpty(String.valueOf(total)), getOrEmpty(currency)));
-        return CSVFormatter.formatLine(totalLine, CSVFormatter.SEPARATOR);
-
-    }
-
-    private static String getOrEmpty(String s) {
-        return Objects.nonNull(s) ? s : StringUtils.EMPTY;
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/CSVFormatter.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/CSVFormatter.java
deleted file mode 100644
index 7f0bbf7..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/CSVFormatter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.util;
-
-import java.util.List;
-
-public class CSVFormatter {
-
-    private CSVFormatter() {
-    }
-
-    public static final char SEPARATOR = ',';
-
-    public static String formatLine(List<String> values, char separator) {
-        boolean first = true;
-        StringBuilder builder = new StringBuilder();
-        for (String value : values) {
-            if (!first) {
-                builder.append(separator);
-            }
-            builder.append(followCsvStandard(value));
-            first = false;
-        }
-        return builder.append(System.lineSeparator()).toString();
-    }
-
-    public static String formatLine(List<String> values, char separator, char customQuote) {
-        boolean first = true;
-        StringBuilder builder = new StringBuilder();
-        for (String value : values) {
-            if (!first) {
-                builder.append(separator);
-            }
-            builder.append(customQuote).append(followCsvStandard(value)).append(customQuote);
-            first = false;
-        }
-        return builder.append(System.lineSeparator()).toString();
-    }
-
-    private static String followCsvStandard(String value) {
-
-        String result = value;
-        if (result.contains("\"")) {
-            result = result.replace("\"", "\"\"");
-        }
-        return result;
-
-    }
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/DateRemoverUtil.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/DateRemoverUtil.java
deleted file mode 100644
index 12bf3e6..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/DateRemoverUtil.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.util;
-
-/**
- * Created on 3/15/2017.
- */
-public class DateRemoverUtil {
-
-	private static final String ERROR_DATE_FORMAT = "\\[Error-\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\]:";
-	private static final String ERROR_WITHOUT_DATE_FORMAT = "\\[Error\\]:";
-
-	private DateRemoverUtil() {
-	}
-
-    public static String removeDateFormErrorMessage(String errorMessage, String errorDateFormat, String replaceWith) {
-        return errorMessage.replaceAll(errorDateFormat, replaceWith);
-    }
-
-    public static String removeDateFormErrorMessage(String errorMessage) {
-        return errorMessage.replaceAll(ERROR_DATE_FORMAT, ERROR_WITHOUT_DATE_FORMAT);
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/KeycloakUtil.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/KeycloakUtil.java
deleted file mode 100644
index 072b963..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/KeycloakUtil.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.util;
-
-import com.epam.dlab.exceptions.DlabException;
-import org.keycloak.common.util.Base64Url;
-import org.keycloak.representations.IDToken;
-import org.keycloak.util.JsonSerialization;
-
-public class KeycloakUtil {
-
-    public static IDToken parseToken(String encoded) {
-        try {
-            String[] parts = encoded.split("\\.");
-            if (parts.length < 2 || parts.length > 3) {
-                throw new IllegalArgumentException("Parsing error");
-            }
-            byte[] bytes = Base64Url.decode(parts[1]);
-            return JsonSerialization.readValue(bytes, IDToken.class);
-        } catch (Exception e) {
-            throw new DlabException("Can not parse token due to: " + e.getMessage());
-        }
-    }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
deleted file mode 100644
index afe06cd..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/util/RequestBuilder.java
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.util;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.SettingsDAO;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ExploratoryLibCache;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.resources.dto.BackupFormDTO;
-import com.epam.dlab.backendapi.resources.dto.ComputationalCreateFormDTO;
-import com.epam.dlab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
-import com.epam.dlab.backendapi.resources.dto.aws.AwsComputationalCreateForm;
-import com.epam.dlab.backendapi.resources.dto.gcp.GcpComputationalCreateForm;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.LibListComputationalDTO;
-import com.epam.dlab.dto.ResourceBaseDTO;
-import com.epam.dlab.dto.ResourceSysBaseDTO;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.aws.AwsCloudSettings;
-import com.epam.dlab.dto.aws.computational.AwsComputationalTerminateDTO;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.aws.computational.ComputationalCreateAws;
-import com.epam.dlab.dto.aws.computational.SparkComputationalCreateAws;
-import com.epam.dlab.dto.aws.exploratory.ExploratoryCreateAws;
-import com.epam.dlab.dto.azure.AzureCloudSettings;
-import com.epam.dlab.dto.azure.computational.SparkComputationalCreateAzure;
-import com.epam.dlab.dto.azure.exploratory.ExploratoryActionStartAzure;
-import com.epam.dlab.dto.azure.exploratory.ExploratoryActionStopAzure;
-import com.epam.dlab.dto.azure.exploratory.ExploratoryCreateAzure;
-import com.epam.dlab.dto.backup.EnvBackupDTO;
-import com.epam.dlab.dto.base.CloudSettings;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.epam.dlab.dto.computational.ComputationalCheckInactivityDTO;
-import com.epam.dlab.dto.computational.ComputationalClusterConfigDTO;
-import com.epam.dlab.dto.computational.ComputationalStartDTO;
-import com.epam.dlab.dto.computational.ComputationalStopDTO;
-import com.epam.dlab.dto.computational.ComputationalTerminateDTO;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryCheckInactivityAction;
-import com.epam.dlab.dto.exploratory.ExploratoryCreateDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryImageDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryReconfigureSparkClusterActionDTO;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import com.epam.dlab.dto.exploratory.LibraryInstallDTO;
-import com.epam.dlab.dto.gcp.GcpCloudSettings;
-import com.epam.dlab.dto.gcp.computational.ComputationalCreateGcp;
-import com.epam.dlab.dto.gcp.computational.GcpComputationalTerminateDTO;
-import com.epam.dlab.dto.gcp.computational.SparkComputationalCreateGcp;
-import com.epam.dlab.dto.gcp.exploratory.ExploratoryCreateGcp;
-import com.epam.dlab.dto.project.ProjectActionDTO;
-import com.epam.dlab.dto.project.ProjectCreateDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.model.exploratory.Exploratory;
-import com.epam.dlab.util.UsernameUtils;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import static com.epam.dlab.cloud.CloudProvider.AWS;
-import static com.epam.dlab.cloud.CloudProvider.AZURE;
-import static com.epam.dlab.cloud.CloudProvider.GCP;
-
-@Singleton
-public class RequestBuilder {
-	private static final String UNSUPPORTED_CLOUD_PROVIDER_MESSAGE = "Unsupported cloud provider ";
-	private static final String AZURE_REFRESH_TOKEN_KEY = "refresh_token";
-
-	@Inject
-	private SelfServiceApplicationConfiguration configuration;
-	@Inject
-	private SettingsDAO settingsDAO;
-
-	private CloudSettings cloudSettings(UserInfo userInfo, CloudProvider cloudProvider) {
-		switch (cloudProvider) {
-			case AWS:
-				return AwsCloudSettings.builder()
-						.awsIamUser(userInfo.getName())
-						.build();
-			case AZURE:
-				return AzureCloudSettings.builder()
-						.azureIamUser(userInfo.getName()).build();
-			case GCP:
-				return GcpCloudSettings.builder()
-						.gcpIamUser(userInfo.getName()).build();
-			default:
-				throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	private <T extends ResourceBaseDTO<?>> T newResourceBaseDTO(UserInfo userInfo, CloudProvider cloudProvider,
-																Class<T> resourceClass) {
-		try {
-			return (T) resourceClass.newInstance()
-					.withEdgeUserName(getEdgeUserName(userInfo, cloudProvider))
-					.withCloudSettings(cloudSettings(userInfo, cloudProvider));
-		} catch (Exception e) {
-			throw new DlabException("Cannot create instance of resource class " + resourceClass.getName() + ". " +
-					e.getLocalizedMessage(), e);
-		}
-	}
-
-	private String getEdgeUserName(UserInfo userInfo, CloudProvider cloudProvider) {
-		String edgeUser = UsernameUtils.replaceWhitespaces(userInfo.getSimpleName());
-		switch (cloudProvider) {
-			case GCP:
-				return adjustUserName(configuration.getMaxUserNameLength(), edgeUser);
-			case AWS:
-			case AZURE:
-				return edgeUser;
-			default:
-				throw new DlabException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
-		}
-	}
-
-	private String adjustUserName(int maxLength, String userName) {
-		return userName.length() > maxLength ?
-				UUID.nameUUIDFromBytes(userName.getBytes()).toString().substring(0, maxLength) : userName;
-	}
-
-	@SuppressWarnings("unchecked")
-	private <T extends ResourceSysBaseDTO<?>> T newResourceSysBaseDTO(UserInfo userInfo, CloudProvider cloudProvider,
-																	  Class<T> resourceClass) {
-		return newResourceBaseDTO(userInfo, cloudProvider, resourceClass);
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends ExploratoryCreateDTO<T>> T newExploratoryCreate(ProjectDTO projectDTO, EndpointDTO endpointDTO, Exploratory exploratory,
-																	  UserInfo userInfo,
-																	  ExploratoryGitCredsDTO exploratoryGitCredsDTO,
-																	  Map<String, String> tags) {
-
-		T exploratoryCreate;
-		CloudProvider cloudProvider = endpointDTO.getCloudProvider();
-		switch (cloudProvider) {
-			case AWS:
-				exploratoryCreate = (T) newResourceSysBaseDTO(userInfo, cloudProvider, ExploratoryCreateAws.class)
-						.withNotebookInstanceType(exploratory.getShape());
-				break;
-			case AZURE:
-				exploratoryCreate = (T) newResourceSysBaseDTO(userInfo, cloudProvider, ExploratoryCreateAzure.class)
-						.withNotebookInstanceSize(exploratory.getShape());
-				if (settingsDAO.isAzureDataLakeEnabled()) {
-					((ExploratoryCreateAzure) exploratoryCreate)
-							.withAzureUserRefreshToken(userInfo.getKeys().get(AZURE_REFRESH_TOKEN_KEY));
-				}
-
-				((ExploratoryCreateAzure) exploratoryCreate)
-						.withAzureDataLakeEnabled(Boolean.toString(settingsDAO.isAzureDataLakeEnabled()));
-				break;
-			case GCP:
-				exploratoryCreate = (T) newResourceSysBaseDTO(userInfo, cloudProvider, ExploratoryCreateGcp.class)
-						.withNotebookInstanceType(exploratory.getShape());
-				break;
-			default:
-				throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
-		}
-
-		return exploratoryCreate.withExploratoryName(exploratory.getName())
-				.withNotebookImage(exploratory.getDockerImage())
-				.withApplicationName(getApplicationNameFromImage(exploratory.getDockerImage()))
-				.withGitCreds(exploratoryGitCredsDTO.getGitCreds())
-				.withImageName(exploratory.getImageName())
-				.withClusterConfig(exploratory.getClusterConfig())
-				.withProject(exploratory.getProject())
-				.withEndpoint(exploratory.getEndpoint())
-				.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()))
-				.withTags(tags);
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends ExploratoryGitCredsUpdateDTO> T newExploratoryStart(UserInfo userInfo,
-																		  UserInstanceDTO userInstance,
-																		  EndpointDTO endpointDTO,
-																		  ExploratoryGitCredsDTO
-																				  exploratoryGitCredsDTO) {
-		CloudProvider cloudProvider = endpointDTO.getCloudProvider();
-		switch (cloudProvider) {
-			case AWS:
-			case GCP:
-				return (T) newResourceSysBaseDTO(userInfo, cloudProvider, ExploratoryGitCredsUpdateDTO.class)
-						.withNotebookInstanceName(userInstance.getExploratoryId())
-						.withGitCreds(exploratoryGitCredsDTO.getGitCreds())
-						.withNotebookImage(userInstance.getImageName())
-						.withExploratoryName(userInstance.getExploratoryName())
-						.withReuploadKeyRequired(userInstance.isReuploadKeyRequired())
-						.withProject(userInstance.getProject())
-						.withEndpoint(userInstance.getEndpoint());
-			case AZURE:
-				T exploratoryStart = (T) newResourceSysBaseDTO(userInfo, cloudProvider, ExploratoryActionStartAzure.class)
-						.withNotebookInstanceName(userInstance.getExploratoryId())
-						.withGitCreds(exploratoryGitCredsDTO.getGitCreds())
-						.withNotebookImage(userInstance.getImageName())
-						.withExploratoryName(userInstance.getExploratoryName())
-						.withReuploadKeyRequired(userInstance.isReuploadKeyRequired())
-						.withProject(userInstance.getProject())
-						.withEndpoint(userInstance.getEndpoint());
-
-				if (settingsDAO.isAzureDataLakeEnabled()) {
-					((ExploratoryActionStartAzure) exploratoryStart)
-							.withAzureUserRefreshToken(userInfo.getKeys().get(AZURE_REFRESH_TOKEN_KEY));
-				}
-
-				((ExploratoryActionStartAzure) exploratoryStart)
-						.withAzureDataLakeEnabled(Boolean.toString(settingsDAO.isAzureDataLakeEnabled()));
-
-				return exploratoryStart;
-			default:
-				throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends ExploratoryActionDTO<T>> T newExploratoryStop(UserInfo userInfo, UserInstanceDTO userInstance, EndpointDTO endpointDTO) {
-
-		T exploratoryStop;
-		CloudProvider cloudProvider = endpointDTO.getCloudProvider();
-
-		switch (cloudProvider) {
-			case AWS:
-			case GCP:
-				exploratoryStop = (T) newResourceSysBaseDTO(userInfo, cloudProvider, ExploratoryActionDTO.class);
-				break;
-			case AZURE:
-				exploratoryStop = (T) newResourceSysBaseDTO(userInfo, cloudProvider, ExploratoryActionStopAzure.class);
-				break;
-			default:
-				throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
-		}
-
-		return exploratoryStop
-				.withNotebookInstanceName(userInstance.getExploratoryId())
-				.withNotebookImage(userInstance.getImageName())
-				.withExploratoryName(userInstance.getExploratoryName())
-				.withNotebookImage(userInstance.getImageName())
-				.withReuploadKeyRequired(userInstance.isReuploadKeyRequired())
-				.withProject(userInstance.getProject())
-				.withEndpoint(userInstance.getEndpoint());
-	}
-
-	public ExploratoryGitCredsUpdateDTO newGitCredentialsUpdate(UserInfo userInfo, UserInstanceDTO instanceDTO,
-																EndpointDTO endpointDTO,
-																ExploratoryGitCredsDTO exploratoryGitCredsDTO) {
-		checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
-		return newResourceSysBaseDTO(userInfo, endpointDTO.getCloudProvider(), ExploratoryGitCredsUpdateDTO.class)
-				.withNotebookImage(instanceDTO.getImageName())
-				.withApplicationName(getApplicationNameFromImage(instanceDTO.getImageName()))
-				.withProject(instanceDTO.getProject())
-				.withEndpoint(instanceDTO.getEndpoint())
-				.withNotebookInstanceName(instanceDTO.getExploratoryId())
-				.withExploratoryName(instanceDTO.getExploratoryName())
-				.withGitCreds(exploratoryGitCredsDTO.getGitCreds());
-	}
-
-	public LibraryInstallDTO newLibInstall(UserInfo userInfo, UserInstanceDTO userInstance,
-										   EndpointDTO endpointDTO, List<LibInstallDTO> libs) {
-		checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
-		return newResourceSysBaseDTO(userInfo, endpointDTO.getCloudProvider(), LibraryInstallDTO.class)
-				.withNotebookImage(userInstance.getImageName())
-				.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
-				.withNotebookInstanceName(userInstance.getExploratoryId())
-				.withExploratoryName(userInstance.getExploratoryName())
-				.withProject(userInstance.getProject())
-				.withEndpoint(endpointDTO.getName())
-				.withLibs(libs);
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends ExploratoryActionDTO<T>> T newLibExploratoryList(UserInfo userInfo,
-																	   UserInstanceDTO userInstance,
-																	   EndpointDTO endpointDTO) {
-		checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
-		return (T) newResourceSysBaseDTO(userInfo, endpointDTO.getCloudProvider(), ExploratoryActionDTO.class)
-				.withNotebookInstanceName(userInstance.getExploratoryId())
-				.withProject(userInstance.getProject())
-				.withEndpoint(endpointDTO.getName())
-				.withNotebookImage(userInstance.getImageName())
-				.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
-				.withExploratoryName(userInstance.getExploratoryName());
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends LibraryInstallDTO> T newLibInstall(UserInfo userInfo, UserInstanceDTO userInstance,
-														 UserComputationalResource computationalResource,
-														 List<LibInstallDTO> libs, EndpointDTO endpointDTO) {
-		checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
-		return (T) newResourceSysBaseDTO(userInfo, endpointDTO.getCloudProvider(), LibraryInstallDTO.class)
-				.withComputationalId(computationalResource.getComputationalId())
-				.withComputationalName(computationalResource.getComputationalName())
-				.withExploratoryName(userInstance.getExploratoryName())
-				.withProject(userInstance.getProject())
-				.withEndpoint(endpointDTO.getName())
-				.withComputationalImage(computationalResource.getImageName())
-				.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
-				.withLibs(libs);
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends LibListComputationalDTO> T newLibComputationalList(UserInfo userInfo,
-																		 UserInstanceDTO userInstance,
-																		 UserComputationalResource
-																				 computationalResource,
-																		 EndpointDTO endpointDTO) {
-
-		checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
-		return (T) newResourceSysBaseDTO(userInfo, endpointDTO.getCloudProvider(), LibListComputationalDTO.class)
-				.withComputationalId(computationalResource.getComputationalId())
-				.withProject(userInstance.getProject())
-				.withEndpoint(endpointDTO.getName())
-				.withComputationalImage(computationalResource.getImageName())
-				.withLibCacheKey(ExploratoryLibCache.libraryCacheKey(userInstance))
-				.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()));
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends ComputationalBase<T>> T newComputationalCreate(UserInfo userInfo, ProjectDTO projectDTO,
-																	 UserInstanceDTO userInstance,
-																	 ComputationalCreateFormDTO form,
-																	 EndpointDTO endpointDTO) {
-		T computationalCreate;
-		CloudProvider cloudProvider = endpointDTO.getCloudProvider();
-		switch (cloudProvider) {
-			case AZURE:
-				throw new UnsupportedOperationException("Creating dataengine service is not supported yet");
-			case AWS:
-				AwsComputationalCreateForm awsForm = (AwsComputationalCreateForm) form;
-				computationalCreate = (T) newResourceSysBaseDTO(userInfo, cloudProvider, ComputationalCreateAws.class)
-						.withInstanceCount(awsForm.getInstanceCount())
-						.withMasterInstanceType(awsForm.getMasterInstanceType())
-						.withSlaveInstanceType(awsForm.getSlaveInstanceType())
-						.withSlaveInstanceSpot(awsForm.getSlaveInstanceSpot())
-						.withSlaveInstanceSpotPctPrice(awsForm.getSlaveInstanceSpotPctPrice())
-						.withVersion(awsForm.getVersion())
-						.withConfig((awsForm.getConfig()))
-						.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
-				break;
-			case GCP:
-				GcpComputationalCreateForm gcpForm = (GcpComputationalCreateForm) form;
-				computationalCreate = (T) newResourceSysBaseDTO(userInfo, cloudProvider, ComputationalCreateGcp.class)
-						.withMasterInstanceCount(gcpForm.getMasterInstanceCount())
-						.withSlaveInstanceCount(gcpForm.getSlaveInstanceCount())
-						.withPreemptibleCount(gcpForm.getPreemptibleCount())
-						.withMasterInstanceType(gcpForm.getMasterInstanceType())
-						.withSlaveInstanceType(gcpForm.getSlaveInstanceType())
-						.withVersion(gcpForm.getVersion())
-						.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
-				break;
-
-			default:
-				throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
-		}
-
-		return computationalCreate
-				.withExploratoryName(form.getNotebookName())
-				.withComputationalName(form.getName())
-				.withNotebookTemplateName(userInstance.getTemplateName())
-				.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
-				.withNotebookInstanceName(userInstance.getExploratoryId())
-				.withProject(userInstance.getProject())
-				.withTags(userInstance.getTags())
-				.withEndpoint(userInstance.getEndpoint());
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends ComputationalBase<T>> T newComputationalCreate(UserInfo userInfo, ProjectDTO projectDTO,
-																	 UserInstanceDTO userInstance,
-																	 SparkStandaloneClusterCreateForm form,
-																	 EndpointDTO endpointDTO) {
-
-		T computationalCreate;
-		CloudProvider cloudProvider = endpointDTO.getCloudProvider();
-		switch (cloudProvider) {
-			case AWS:
-				computationalCreate = (T) newResourceSysBaseDTO(userInfo, cloudProvider, SparkComputationalCreateAws.class)
-						.withDataEngineInstanceCount(form.getDataEngineInstanceCount())
-						.withDataEngineMasterShape(form.getDataEngineInstanceShape())
-						.withDataEngineSlaveShape(form.getDataEngineInstanceShape())
-						.withConfig(form.getConfig())
-						.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
-				break;
-			case AZURE:
-				computationalCreate = (T) newResourceSysBaseDTO(userInfo, cloudProvider, SparkComputationalCreateAzure.class)
-						.withDataEngineInstanceCount(form.getDataEngineInstanceCount())
-						.withDataEngineMasterSize(form.getDataEngineInstanceShape())
-						.withDataEngineSlaveSize(form.getDataEngineInstanceShape())
-						.withConfig(form.getConfig())
-						.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
-				if (settingsDAO.isAzureDataLakeEnabled()) {
-					((SparkComputationalCreateAzure) computationalCreate)
-							.withAzureUserRefreshToken(userInfo.getKeys().get(AZURE_REFRESH_TOKEN_KEY));
-				}
-
-				((SparkComputationalCreateAzure) computationalCreate)
-						.withAzureDataLakeEnabled(Boolean.toString(settingsDAO.isAzureDataLakeEnabled()));
-
-				break;
-			case GCP:
-				computationalCreate = (T) newResourceSysBaseDTO(userInfo, cloudProvider, SparkComputationalCreateGcp.class)
-						.withDataEngineInstanceCount(form.getDataEngineInstanceCount())
-						.withDataEngineMasterSize(form.getDataEngineInstanceShape())
-						.withDataEngineSlaveSize(form.getDataEngineInstanceShape())
-						.withConfig(form.getConfig())
-						.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
-				break;
-			default:
-				throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
-		}
-
-		return computationalCreate
-				.withExploratoryName(form.getNotebookName())
-				.withComputationalName(form.getName())
-				.withNotebookTemplateName(userInstance.getTemplateName())
-				.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
-				.withNotebookInstanceName(userInstance.getExploratoryId())
-				.withProject(userInstance.getProject())
-				.withTags(userInstance.getTags())
-				.withEndpoint(userInstance.getEndpoint());
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends ComputationalBase<T>> T newComputationalTerminate(UserInfo userInfo,
-																		UserInstanceDTO userInstanceDTO,
-																		UserComputationalResource computationalResource,
-																		EndpointDTO endpointDTO) {
-		T computationalTerminate;
-		CloudProvider cloudProvider = endpointDTO.getCloudProvider();
-		switch (cloudProvider) {
-			case AWS:
-				AwsComputationalTerminateDTO terminateDTO = newResourceSysBaseDTO(userInfo, cloudProvider,
-						AwsComputationalTerminateDTO.class);
-				if (computationalResource.getDataEngineType() == DataEngineType.CLOUD_SERVICE) {
-					terminateDTO.setClusterName(computationalResource.getComputationalId());
-				}
-				computationalTerminate = (T) terminateDTO;
-				break;
-			case AZURE:
-				computationalTerminate = (T) newResourceSysBaseDTO(userInfo, cloudProvider, ComputationalTerminateDTO.class);
-				break;
-			case GCP:
-				GcpComputationalTerminateDTO gcpTerminateDTO = newResourceSysBaseDTO(userInfo, cloudProvider,
-						GcpComputationalTerminateDTO.class);
-				if (computationalResource.getDataEngineType() == DataEngineType.CLOUD_SERVICE) {
-					gcpTerminateDTO.setClusterName(computationalResource.getComputationalId());
-				}
-				computationalTerminate = (T) gcpTerminateDTO;
-				break;
-
-			default:
-				throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + cloudProvider);
-		}
-
-		return computationalTerminate
-				.withExploratoryName(userInstanceDTO.getExploratoryName())
-				.withComputationalName(computationalResource.getComputationalName())
-				.withNotebookInstanceName(userInstanceDTO.getExploratoryId())
-				.withProject(userInstanceDTO.getProject())
-				.withEndpoint(userInstanceDTO.getEndpoint());
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends ComputationalBase<T>> T newComputationalStop(UserInfo userInfo, UserInstanceDTO exploratory,
-																   String computationalName, EndpointDTO endpointDTO) {
-		return (T) newResourceSysBaseDTO(userInfo, endpointDTO.getCloudProvider(), ComputationalStopDTO.class)
-				.withExploratoryName(exploratory.getExploratoryName())
-				.withComputationalName(computationalName)
-				.withNotebookInstanceName(exploratory.getExploratoryId())
-				.withApplicationName(getApplicationNameFromImage(exploratory.getImageName()))
-				.withProject(exploratory.getProject())
-				.withEndpoint(endpointDTO.getName());
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends ComputationalBase<T>> T newComputationalStart(UserInfo userInfo, UserInstanceDTO exploratory,
-																	String computationalName, EndpointDTO endpointDTO) {
-		return (T) newResourceSysBaseDTO(userInfo, endpointDTO.getCloudProvider(), ComputationalStartDTO.class)
-				.withExploratoryName(exploratory.getExploratoryName())
-				.withComputationalName(computationalName)
-				.withNotebookInstanceName(exploratory.getExploratoryId())
-				.withApplicationName(getApplicationNameFromImage(exploratory.getImageName()))
-				.withProject(exploratory.getProject())
-				.withEndpoint(endpointDTO.getName());
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends ExploratoryImageDTO> T newExploratoryImageCreate(UserInfo userInfo, UserInstanceDTO userInstance,
-																	   String imageName, EndpointDTO endpointDTO, ProjectDTO projectDTO) {
-		checkInappropriateCloudProviderOrElseThrowException(endpointDTO.getCloudProvider());
-		return (T) newResourceSysBaseDTO(userInfo, endpointDTO.getCloudProvider(), ExploratoryImageDTO.class)
-				.withProject(userInstance.getProject())
-				.withNotebookInstanceName(userInstance.getExploratoryId())
-				.withExploratoryName(userInstance.getExploratoryName())
-				.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
-				.withNotebookImage(userInstance.getImageName())
-				.withImageName(imageName)
-				.withEndpoint(userInstance.getEndpoint())
-				.withTags(userInstance.getTags())
-				.withSharedImageEnabled(String.valueOf(projectDTO.isSharedImageEnabled()));
-	}
-
-	@SuppressWarnings("unchecked")
-	public <T extends ComputationalBase<T>> T newComputationalCheckInactivity(UserInfo userInfo,
-																			  UserInstanceDTO exploratory,
-																			  UserComputationalResource cr, EndpointDTO endpointDTO) {
-		return (T) newResourceSysBaseDTO(userInfo, endpointDTO.getCloudProvider(), ComputationalCheckInactivityDTO.class)
-				.withExploratoryName(exploratory.getExploratoryName())
-				.withComputationalName(cr.getComputationalName())
-				.withNotebookInstanceName(exploratory.getExploratoryId())
-				.withApplicationName(getApplicationNameFromImage(exploratory.getImageName()))
-				.withNotebookImageName(exploratory.getImageName())
-				.withImage(cr.getImageName())
-				.withComputationalId(cr.getComputationalId())
-				.withProject(exploratory.getProject())
-				.withEndpoint(endpointDTO.getName());
-	}
-
-
-	@SuppressWarnings("unchecked")
-	public <T extends EnvBackupDTO> T newBackupCreate(BackupFormDTO backupFormDTO, String id) {
-
-		return (T) EnvBackupDTO.builder()
-				.configFiles(backupFormDTO.getConfigFiles())
-				.certificates(backupFormDTO.getCertificates())
-				.keys(backupFormDTO.getKeys())
-				.jars(backupFormDTO.getJars())
-				.databaseBackup(backupFormDTO.isDatabaseBackup())
-				.logsBackup(backupFormDTO.isLogsBackup())
-				.id(id)
-				.build();
-	}
-
-	public ComputationalClusterConfigDTO newClusterConfigUpdate(UserInfo userInfo, UserInstanceDTO userInstanceDTO,
-																UserComputationalResource compRes,
-																List<ClusterConfig> config, EndpointDTO endpointDTO) {
-		CloudProvider cloudProvider = endpointDTO.getCloudProvider();
-		final ComputationalClusterConfigDTO clusterConfigDTO = newResourceSysBaseDTO(userInfo, cloudProvider,
-				ComputationalClusterConfigDTO.class)
-				.withExploratoryName(userInstanceDTO.getExploratoryName())
-				.withNotebookInstanceName(userInstanceDTO.getExploratoryId())
-				.withComputationalName(compRes.getComputationalName())
-				.withApplicationName(compRes.getImageName())
-				.withProject(userInstanceDTO.getProject())
-				.withEndpoint(userInstanceDTO.getEndpoint());
-		clusterConfigDTO.setCopmutationalId(compRes.getComputationalId());
-		clusterConfigDTO.setConfig(config);
-		if (cloudProvider == AZURE && settingsDAO.isAzureDataLakeEnabled()) {
-			clusterConfigDTO.setAzureUserRefreshToken(userInfo.getKeys().get(AZURE_REFRESH_TOKEN_KEY));
-		}
-
-		return clusterConfigDTO;
-	}
-
-	public ExploratoryReconfigureSparkClusterActionDTO newClusterConfigUpdate(UserInfo userInfo,
-																			  UserInstanceDTO userInstance,
-																			  List<ClusterConfig> config,
-																			  EndpointDTO endpointDTO) {
-
-		CloudProvider cloudProvider = endpointDTO.getCloudProvider();
-		final ExploratoryReconfigureSparkClusterActionDTO dto =
-				newResourceSysBaseDTO(userInfo, cloudProvider, ExploratoryReconfigureSparkClusterActionDTO.class)
-						.withNotebookInstanceName(userInstance.getExploratoryId())
-						.withExploratoryName(userInstance.getExploratoryName())
-						.withApplicationName(getApplicationNameFromImage(userInstance.getImageName()))
-						.withNotebookImage(userInstance.getImageName())
-						.withConfig(config)
-						.withProject(userInstance.getProject())
-						.withEndpoint(userInstance.getEndpoint());
-		if (cloudProvider == AZURE && settingsDAO.isAzureDataLakeEnabled()) {
-			dto.withAzureUserRefreshToken(userInfo.getKeys().get(AZURE_REFRESH_TOKEN_KEY));
-		}
-
-		return dto;
-	}
-
-	public ExploratoryCheckInactivityAction newExploratoryCheckInactivityAction(UserInfo userInfo,
-																				UserInstanceDTO userInstance,
-																				EndpointDTO endpointDTO) {
-		final ExploratoryCheckInactivityAction dto = newResourceSysBaseDTO(userInfo, endpointDTO.getCloudProvider(),
-				ExploratoryCheckInactivityAction.class);
-		dto.withNotebookInstanceName(userInstance.getExploratoryId())
-				.withNotebookImage(userInstance.getImageName())
-				.withExploratoryName(userInstance.getExploratoryName())
-				.withReuploadKeyRequired(userInstance.isReuploadKeyRequired())
-				.withProject(userInstance.getProject())
-				.withEndpoint(endpointDTO.getName());
-		return dto;
-	}
-
-	public ProjectCreateDTO newProjectCreate(UserInfo userInfo, ProjectDTO projectDTO, EndpointDTO endpointDTO) {
-		return ProjectCreateDTO.builder()
-				.key(projectDTO.getKey().replace("\n", ""))
-				.name(projectDTO.getName())
-				.tag(projectDTO.getTag())
-				.endpoint(endpointDTO.getName())
-				.build()
-				.withCloudSettings(cloudSettings(userInfo, endpointDTO.getCloudProvider()));
-	}
-
-	public ProjectActionDTO newProjectAction(UserInfo userInfo, String project, EndpointDTO endpointDTO) {
-		return new ProjectActionDTO(project, endpointDTO.getName())
-				.withCloudSettings(cloudSettings(userInfo, endpointDTO.getCloudProvider()));
-	}
-
-	/**
-	 * Returns application name basing on docker image
-	 *
-	 * @param imageName docker image name
-	 * @return application name
-	 */
-	private String getApplicationNameFromImage(String imageName) {
-		if (imageName != null) {
-			int pos = imageName.indexOf('-');
-			if (pos > 0) {
-				return imageName.substring(pos + 1);
-			}
-		}
-		return "";
-	}
-
-	private void checkInappropriateCloudProviderOrElseThrowException(CloudProvider provider) {
-		if (provider != AWS && provider != AZURE && provider != GCP) {
-			throw new IllegalArgumentException(UNSUPPORTED_CLOUD_PROVIDER_MESSAGE + provider);
-		}
-	}
-}
-
-
-
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/MavenLibraryNameValidator.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/MavenLibraryNameValidator.java
deleted file mode 100644
index 7a40005..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/MavenLibraryNameValidator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.validation;
-
-import com.epam.dlab.backendapi.validation.annotation.LibNameValid;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
-
-@Slf4j
-public class MavenLibraryNameValidator implements ConstraintValidator<LibNameValid, String> {
-	@Override
-	public void initialize(LibNameValid libNameValid) {
-		log.trace("MavenLibraryNameValidator initialized");
-	}
-
-	@Override
-	public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
-		return StringUtils.isNotEmpty(s) && s.split(":").length == 3;
-
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/SchedulerJobDTOValidator.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/SchedulerJobDTOValidator.java
deleted file mode 100644
index 87dc55e..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/SchedulerJobDTOValidator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.validation;
-
-import com.epam.dlab.backendapi.validation.annotation.SchedulerJobDTOValid;
-import com.epam.dlab.dto.SchedulerJobDTO;
-
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
-import java.util.Objects;
-
-public class SchedulerJobDTOValidator implements ConstraintValidator<SchedulerJobDTOValid, SchedulerJobDTO> {
-	@Override
-	public void initialize(SchedulerJobDTOValid schedulerJobDTOValid) {
-		//do nothing
-	}
-
-	@Override
-	public boolean isValid(SchedulerJobDTO schedulerJobDTO, ConstraintValidatorContext constraintValidatorContext) {
-		if (!schedulerJobDTO.isCheckInactivityRequired() && Objects.isNull(schedulerJobDTO.getTerminateDateTime())) {
-			return !schedulerJobDTO.getStartDaysRepeat().isEmpty() || !schedulerJobDTO.getStopDaysRepeat().isEmpty();
-		} else if (schedulerJobDTO.isCheckInactivityRequired() && Objects.isNull(schedulerJobDTO.getMaxInactivity())) {
-			constraintValidatorContext.disableDefaultConstraintViolation();
-			constraintValidatorContext.buildConstraintViolationWithTemplate("Max inactivity time should be set").addConstraintViolation();
-			return false;
-		} else {
-			return true;
-		}
-	}
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/annotation/LibNameValid.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/annotation/LibNameValid.java
deleted file mode 100644
index 1e8be9b..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/annotation/LibNameValid.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.validation.annotation;
-
-import com.epam.dlab.backendapi.validation.MavenLibraryNameValidator;
-
-import javax.validation.Constraint;
-import javax.validation.Payload;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Constraint(validatedBy = {MavenLibraryNameValidator.class})
-@Target({ElementType.FIELD, ElementType.PARAMETER})
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface LibNameValid {
-
-
-	String message() default "Wrong library name format. Should be <groupId>:<artifactId>:<versionId>. E.g. io" +
-			".dropwizard:dropwizard-core:1.3.5";
-
-	Class<?>[] groups() default {};
-
-	Class<? extends Payload>[] payload() default {};
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/annotation/SchedulerJobDTOValid.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/annotation/SchedulerJobDTOValid.java
deleted file mode 100644
index 127803c..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/validation/annotation/SchedulerJobDTOValid.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.validation.annotation;
-
-import com.epam.dlab.backendapi.validation.SchedulerJobDTOValidator;
-
-import javax.validation.Constraint;
-import javax.validation.Payload;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Constraint(validatedBy = {SchedulerJobDTOValidator.class})
-@Target({ElementType.FIELD, ElementType.PARAMETER})
-@Retention(value = RetentionPolicy.RUNTIME)
-public @interface SchedulerJobDTOValid {
-
-
-	String message() default "Start/stop days or termination date is required for scheduler";
-
-	Class<?>[] groups() default {};
-
-	Class<? extends Payload>[] payload() default {};
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/resources/mongo/aws/mongo_roles.json b/services/self-service/src/main/resources/mongo/aws/mongo_roles.json
index 6a8fd29..4750fae 100644
--- a/services/self-service/src/main/resources/mongo/aws/mongo_roles.json
+++ b/services/self-service/src/main/resources/mongo/aws/mongo_roles.json
@@ -113,7 +113,7 @@
     "type": "NOTEBOOK",
     "cloud": "AWS",
     "exploratories": [
-      "docker.dlab-deeplearning"
+      "docker.datalab-deeplearning"
     ],
     "groups": [
       "$anyuser"
@@ -125,7 +125,7 @@
     "type": "NOTEBOOK",
     "cloud": "AWS",
     "exploratories": [
-      "docker.dlab-jupyter"
+      "docker.datalab-jupyter"
     ],
     "groups": [
       "$anyuser"
@@ -137,7 +137,7 @@
     "type": "NOTEBOOK",
     "cloud": "AWS",
     "exploratories": [
-      "docker.dlab-jupyterlab"
+      "docker.datalab-jupyterlab"
     ],
     "groups": [
       "$anyuser"
@@ -149,7 +149,7 @@
     "type": "NOTEBOOK",
     "cloud": "AWS",
     "exploratories": [
-      "docker.dlab-rstudio"
+      "docker.datalab-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -161,7 +161,7 @@
     "type": "NOTEBOOK",
     "cloud": "AWS",
     "exploratories": [
-      "docker.dlab-tensor"
+      "docker.datalab-tensor"
     ],
     "groups": [
       "$anyuser"
@@ -173,7 +173,7 @@
     "type": "NOTEBOOK",
     "cloud": "AWS",
     "exploratories": [
-      "docker.dlab-zeppelin"
+      "docker.datalab-zeppelin"
     ],
     "groups": [
       "$anyuser"
@@ -185,7 +185,7 @@
     "type": "NOTEBOOK",
     "cloud": "AWS",
     "exploratories": [
-      "docker.dlab-tensor-rstudio"
+      "docker.datalab-tensor-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -197,7 +197,7 @@
     "type": "COMPUTATIONAL",
     "cloud": "AWS",
     "computationals": [
-      "docker.dlab-dataengine"
+      "docker.datalab-dataengine"
     ],
     "groups": [
       "$anyuser"
@@ -209,7 +209,7 @@
     "type": "COMPUTATIONAL",
     "cloud": "AWS",
     "computationals": [
-      "docker.dlab-dataengine-service"
+      "docker.datalab-dataengine-service"
     ],
     "groups": [
       "$anyuser"
@@ -310,54 +310,5 @@
     "groups": [
       "$anyuser"
     ]
-  },
-  {
-    "_id": "nbBillingReportFull",
-    "description": "View full billing report for all users",
-    "type": "BILLING",
-    "cloud": "AWS",
-    "pages": [
-      "/api/infrastructure_provision/billing"
-    ],
-    "groups": [
-      "$anyuser"
-    ]
-  },
-  {
-    "_id": "projectAdmin",
-    "description": "Allow to execute administration operation per project",
-    "type": "ADMINISTRATION",
-    "cloud": "AWS",
-    "pages": [
-      "environment/*",
-      "/roleManagement",
-      "/api/settings",
-      "/user/settings",
-      "/api/project",
-      "/api/endpoint"
-    ],
-    "groups": [
-      "$anyuser"
-    ]
-  },
-  {
-    "_id": "admin",
-    "description": "Allow to execute administration operation",
-    "type": "ADMINISTRATION",
-    "cloud": "AWS",
-    "pages": [
-      "environment/*",
-      "/api/infrastructure/backup",
-      "/roleManagement",
-      "/roleManagement/create",
-      "/roleManagement/delete",
-      "/api/settings",
-      "/user/settings",
-      "/api/project",
-      "/api/endpoint"
-    ],
-    "groups": [
-      "$anyuser"
-    ]
   }
 ]
diff --git a/services/self-service/src/main/resources/mongo/azure/mongo_roles.json b/services/self-service/src/main/resources/mongo/azure/mongo_roles.json
index 86eadff..49758fd 100644
--- a/services/self-service/src/main/resources/mongo/azure/mongo_roles.json
+++ b/services/self-service/src/main/resources/mongo/azure/mongo_roles.json
@@ -101,7 +101,7 @@
     "type": "NOTEBOOK",
     "cloud": "AZURE",
     "exploratories": [
-      "docker.dlab-deeplearning"
+      "docker.datalab-deeplearning"
     ],
     "groups": [
       "$anyuser"
@@ -113,7 +113,7 @@
     "type": "NOTEBOOK",
     "cloud": "AZURE",
     "exploratories": [
-      "docker.dlab-jupyter"
+      "docker.datalab-jupyter"
     ],
     "groups": [
       "$anyuser"
@@ -125,7 +125,7 @@
     "type": "NOTEBOOK",
     "cloud": "AZURE",
     "exploratories": [
-      "docker.dlab-rstudio"
+      "docker.datalab-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -137,7 +137,7 @@
     "type": "NOTEBOOK",
     "cloud": "AZURE",
     "exploratories": [
-      "docker.dlab-tensor"
+      "docker.datalab-tensor"
     ],
     "groups": [
       "$anyuser"
@@ -149,7 +149,7 @@
     "type": "NOTEBOOK",
     "cloud": "AZURE",
     "exploratories": [
-      "docker.dlab-zeppelin"
+      "docker.datalab-zeppelin"
     ],
     "groups": [
       "$anyuser"
@@ -161,7 +161,7 @@
     "type": "COMPUTATIONAL",
     "cloud": "AZURE",
     "computationals": [
-      "docker.dlab-dataengine"
+      "docker.datalab-dataengine"
     ],
     "groups": [
       "$anyuser"
@@ -250,54 +250,5 @@
     "groups": [
       "$anyuser"
     ]
-  },
-  {
-    "_id": "nbBillingReportFull",
-    "description": "View full billing report for all users",
-    "type": "BILLING",
-    "cloud": "AZURE",
-    "pages": [
-      "/api/infrastructure_provision/billing"
-    ],
-    "groups": [
-      "$anyuser"
-    ]
-  },
-  {
-    "_id": "projectAdmin",
-    "description": "Allow to execute administration operation per project",
-    "type": "ADMINISTRATION",
-    "cloud": "AZURE",
-    "pages": [
-      "environment/*",
-      "/roleManagement",
-      "/api/settings",
-      "/user/settings",
-      "/api/project",
-      "/api/endpoint"
-    ],
-    "groups": [
-      "$anyuser"
-    ]
-  },
-  {
-    "_id": "admin",
-    "description": "Allow to execute administration operation",
-    "type": "ADMINISTRATION",
-    "cloud": "AZURE",
-    "pages": [
-      "environment/*",
-      "/api/infrastructure/backup",
-      "/roleManagement",
-      "/roleManagement/create",
-      "/roleManagement/delete",
-      "/api/settings",
-      "/user/settings",
-      "/api/project",
-      "/api/endpoint"
-    ],
-    "groups": [
-      "$anyuser"
-    ]
   }
 ]
diff --git a/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json b/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json
index d2ef6dd..e75c29c 100644
--- a/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json
+++ b/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json
@@ -89,7 +89,7 @@
     "type": "NOTEBOOK",
     "cloud": "GCP",
     "exploratories": [
-      "docker.dlab-deeplearning"
+      "docker.datalab-deeplearning"
     ],
     "groups": [
       "$anyuser"
@@ -101,7 +101,7 @@
     "type": "NOTEBOOK",
     "cloud": "GCP",
     "exploratories": [
-      "docker.dlab-jupyter"
+      "docker.datalab-jupyter"
     ],
     "groups": [
       "$anyuser"
@@ -113,7 +113,7 @@
     "type": "NOTEBOOK",
     "cloud": "GCP",
     "exploratories": [
-      "docker.dlab-jupyterlab"
+      "docker.datalab-jupyterlab"
     ],
     "groups": [
       "$anyuser"
@@ -125,7 +125,7 @@
     "type": "NOTEBOOK",
     "cloud": "GCP",
     "exploratories": [
-      "docker.dlab-superset"
+      "docker.datalab-superset"
     ],
     "groups": [
       "$anyuser"
@@ -137,7 +137,7 @@
     "type": "NOTEBOOK",
     "cloud": "GCP",
     "exploratories": [
-      "docker.dlab-rstudio"
+      "docker.datalab-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -149,7 +149,7 @@
     "type": "NOTEBOOK",
     "cloud": "GCP",
     "exploratories": [
-      "docker.dlab-tensor"
+      "docker.datalab-tensor"
     ],
     "groups": [
       "$anyuser"
@@ -161,7 +161,7 @@
     "type": "NOTEBOOK",
     "cloud": "GCP",
     "exploratories": [
-      "docker.dlab-tensor-rstudio"
+      "docker.datalab-tensor-rstudio"
     ],
     "groups": [
       "$anyuser"
@@ -173,7 +173,7 @@
     "type": "NOTEBOOK",
     "cloud": "GCP",
     "exploratories": [
-      "docker.dlab-zeppelin"
+      "docker.datalab-zeppelin"
     ],
     "groups": [
       "$anyuser"
@@ -185,7 +185,7 @@
     "type": "COMPUTATIONAL",
     "cloud": "GCP",
     "computationals": [
-      "docker.dlab-dataengine"
+      "docker.datalab-dataengine"
     ],
     "groups": [
       "$anyuser"
@@ -197,7 +197,7 @@
     "type": "COMPUTATIONAL",
     "cloud": "GCP",
     "computationals": [
-      "docker.dlab-dataengine-service"
+      "docker.datalab-dataengine-service"
     ],
     "groups": [
       "$anyuser"
@@ -286,55 +286,5 @@
     "groups": [
       "$anyuser"
     ]
-  },
-  {
-    "_id": "nbBillingReportFull",
-    "description": "View full billing report for all users",
-    "type": "BILLING",
-    "cloud": "GCP",
-    "pages": [
-      "/api/infrastructure_provision/billing"
-    ],
-    "groups": [
-      "$anyuser"
-    ]
-  },
-  {
-    "_id": "projectAdmin",
-    "description": "Allow to execute administration operation per project",
-    "type": "ADMINISTRATION",
-    "cloud": "GCP",
-    "pages": [
-      "environment/*",
-      "/roleManagement",
-      "/api/settings",
-      "/user/settings",
-      "/api/project",
-      "/api/endpoint"
-    ],
-    "groups": [
-      "$anyuser"
-    ]
-  },
-  {
-    "_id": "admin",
-    "description": "Allow to execute administration operation",
-    "type": "ADMINISTRATION",
-    "cloud": "GCP",
-    "pages": [
-      "environment/*",
-      "/api/infrastructure/backup",
-      "/roleManagement",
-      "/roleManagement/create",
-      "/roleManagement/delete",
-      "/api/settings",
-      "/user/settings",
-      "/api/project",
-      "/api/project/create",
-      "/api/endpoint"
-    ],
-    "groups": [
-      "$anyuser"
-    ]
   }
 ]
diff --git a/services/self-service/src/main/resources/mongo/general/mongo_roles.json b/services/self-service/src/main/resources/mongo/general/mongo_roles.json
new file mode 100644
index 0000000..5ce782b
--- /dev/null
+++ b/services/self-service/src/main/resources/mongo/general/mongo_roles.json
@@ -0,0 +1,100 @@
+[
+  {
+    "_id": "nbBillingReportFull",
+    "description": "View full billing report for all users",
+    "type": "BILLING",
+    "cloud": "GENERAL",
+    "pages": [
+      "/api/infrastructure_provision/billing"
+    ],
+    "groups": [
+      "$anyuser"
+    ]
+  },
+  {
+    "_id": "bucketBrowserView",
+    "description": "Allow to view object via bucket browser",
+    "type": "BUCKET_BROWSER",
+    "cloud": "GENERAL",
+    "pages": [
+      "/api/bucket/view"
+    ],
+    "groups": [
+      "$anyuser"
+    ]
+  },
+  {
+    "_id": "bucketBrowserUpload",
+    "description": "Allow to upload object via bucket browser",
+    "type": "BUCKET_BROWSER",
+    "cloud": "GENERAL",
+    "pages": [
+      "/api/bucket/upload"
+    ],
+    "groups": [
+      "$anyuser"
+    ]
+  },
+  {
+    "_id": "bucketBrowserDownload",
+    "description": "Allow to download object via bucket browser",
+    "type": "BUCKET_BROWSER",
+    "cloud": "GENERAL",
+    "pages": [
+      "/api/bucket/download"
+    ],
+    "groups": [
+      "$anyuser"
+    ]
+  },
+  {
+    "_id": "bucketBrowserDelete",
+    "description": "Allow to delete object via bucket browser",
+    "type": "BUCKET_BROWSER",
+    "cloud": "GENERAL",
+    "pages": [
+      "/api/bucket/delete"
+    ],
+    "groups": [
+      "$anyuser"
+    ]
+  },
+  {
+    "_id": "projectAdmin",
+    "description": "Allow to execute administration operation per project",
+    "type": "ADMINISTRATION",
+    "cloud": "GENERAL",
+    "pages": [
+      "environment/*",
+      "/roleManagement",
+      "/api/settings",
+      "/user/settings",
+      "/api/project",
+      "/api/endpoint"
+    ],
+    "groups": [
+      "$anyuser"
+    ]
+  },
+  {
+    "_id": "admin",
+    "description": "Allow to execute administration operation",
+    "type": "ADMINISTRATION",
+    "cloud": "GENERAL",
+    "pages": [
+      "environment/*",
+      "/api/infrastructure/backup",
+      "/roleManagement",
+      "/roleManagement/create",
+      "/roleManagement/delete",
+      "/api/settings",
+      "/user/settings",
+      "/api/project",
+      "/api/project/create",
+      "/api/endpoint"
+    ],
+    "groups": [
+      "$anyuser"
+    ]
+  }
+]
diff --git a/services/self-service/src/main/resources/quartz.properties b/services/self-service/src/main/resources/quartz.properties
index ff0fc59..7c2f67a 100644
--- a/services/self-service/src/main/resources/quartz.properties
+++ b/services/self-service/src/main/resources/quartz.properties
@@ -16,9 +16,10 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-org.quartz.jobStore.class=com.novemberain.quartz.mongodb.MongoDBJobStore
+#org.quartz.jobStore.class=com.novemberain.quartz.mongodb.MongoDBJobStore
+org.quartz.jobStore.class=com.novemberain.quartz.mongodb.DynamicMongoDBJobStore
 org.quartz.jobStore.collectionPrefix=scheduler
 org.quartz.jobStore.isClustered=true
 org.quartz.scheduler.instanceId=AUTO
-org.quartz.scheduler.instanceName=dlab
+org.quartz.scheduler.instanceName=datalab
 org.quartz.threadPool.threadCount=1
\ No newline at end of file
diff --git a/services/self-service/src/main/resources/webapp/.browserslistrc b/services/self-service/src/main/resources/webapp/.browserslistrc
new file mode 100644
index 0000000..1747815
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/.browserslistrc
@@ -0,0 +1,33 @@
+  # *****************************************************************************
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+# ******************************************************************************
+
+# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
+# For additional information regarding the format and rule options, please see:
+# https://github.com/browserslist/browserslist#queries
+
+# You can see what browsers were selected by your queries by running:
+#   npx browserslist
+
+> 0.5%
+last 2 versions
+Firefox ESR
+not dead
+not IE 9-11 # For IE 9-11 support, remove 'not'.
diff --git a/services/self-service/src/main/resources/webapp/angular.json b/services/self-service/src/main/resources/webapp/angular.json
index 32b79b3..8dd6228 100644
--- a/services/self-service/src/main/resources/webapp/angular.json
+++ b/services/self-service/src/main/resources/webapp/angular.json
@@ -11,6 +11,8 @@
         "build": {
           "builder": "@angular-devkit/build-angular:browser",
           "options": {
+            "allowedCommonJsDependencies": ["chart.js", "ng-daterangepicker", "moment-timezone"],
+            "aot": true,
             "outputPath": "dist",
             "index": "src/index.html",
             "main": "src/main.ts",
@@ -41,6 +43,12 @@
           },
           "configurations": {
             "production": {
+              "budgets": [
+                {
+                  "type": "anyComponentStyle",
+                  "maximumWarning": "6kb"
+                }
+              ],
               "optimization": true,
               "outputHashing": "all",
               "sourceMap": false,
@@ -110,11 +118,11 @@
   "defaultProject": "webapp",
   "schematics": {
     "@schematics/angular:component": {
-      "prefix": "dlab",
-      "styleext": "scss"
+      "prefix": "datalab",
+      "style": "scss"
     },
     "@schematics/angular:directive": {
-      "prefix": "dlab"
+      "prefix": "datalab"
     }
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/browserslist b/services/self-service/src/main/resources/webapp/browserslist
deleted file mode 100644
index ae0116f..0000000
--- a/services/self-service/src/main/resources/webapp/browserslist
+++ /dev/null
@@ -1,33 +0,0 @@
-# *****************************************************************************
-#
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#  http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing,
-#  software distributed under the License is distributed on an
-#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-#  specific language governing permissions and limitations
-#  under the License.
-#
-# ******************************************************************************
-
-# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
-# For additional information regarding the format and rule options, please see:
-# https://github.com/browserslist/browserslist#queries
-
-# You can see what browsers were selected by your queries by running:
-#   npx browserslist
-
-> 0.5%
-last 2 versions
-Firefox ESR
-not dead
-not IE 9-11 # For IE 9-11 support, remove 'not'.
diff --git a/services/self-service/src/main/resources/webapp/package-lock.json b/services/self-service/src/main/resources/webapp/package-lock.json
index f8cfcc8..89cca19 100644
--- a/services/self-service/src/main/resources/webapp/package-lock.json
+++ b/services/self-service/src/main/resources/webapp/package-lock.json
@@ -5,19 +5,19 @@
   "requires": true,
   "dependencies": {
     "@angular-devkit/architect": {
-      "version": "0.803.5",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.5.tgz",
-      "integrity": "sha512-hOcYF5fG3oieTc/C1QZqXsON8m8cpdtfdWhY7F7tmqqZ4JBR7igH4SSFQOoQwTj77rsqtkOLI9isVLpoSGX0DQ==",
+      "version": "0.1002.0",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.0.tgz",
+      "integrity": "sha512-twM8V03ujBIGVpgV1PBlSDodUdxtUb7WakutfWafAvEHUsgwzfvQz2VtKWvjNZ9AiYjnCuwkQaclqVv0VHNo9w==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "8.3.5",
-        "rxjs": "6.4.0"
+        "@angular-devkit/core": "10.2.0",
+        "rxjs": "6.6.2"
       },
       "dependencies": {
         "rxjs": {
-          "version": "6.4.0",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
-          "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
@@ -26,73 +26,145 @@
       }
     },
     "@angular-devkit/build-angular": {
-      "version": "0.803.5",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.803.5.tgz",
-      "integrity": "sha512-wzS+XxI238JuEMTdNIdqJRuAN820Pg0CX3FFoRTNck7BoMDGv8sOtyrowpg6+6722bePgKfIuQuABxJ2NQs4kQ==",
+      "version": "0.1002.0",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1002.0.tgz",
+      "integrity": "sha512-cPkdp1GceokGHc79Wg0hACMqqmnJ4W3H9kY4c9qp1Xz18b3vk1aq09JNawOpfUN09S9vBCnn4glg22lRyqmJNA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.803.5",
-        "@angular-devkit/build-optimizer": "0.803.5",
-        "@angular-devkit/build-webpack": "0.803.5",
-        "@angular-devkit/core": "8.3.5",
-        "@babel/core": "7.5.5",
-        "@babel/preset-env": "7.5.5",
-        "@ngtools/webpack": "8.3.5",
-        "ajv": "6.10.2",
-        "autoprefixer": "9.6.1",
-        "browserslist": "4.6.6",
-        "cacache": "12.0.2",
-        "caniuse-lite": "1.0.30000989",
+        "@angular-devkit/architect": "0.1002.0",
+        "@angular-devkit/build-optimizer": "0.1002.0",
+        "@angular-devkit/build-webpack": "0.1002.0",
+        "@angular-devkit/core": "10.2.0",
+        "@babel/core": "7.11.1",
+        "@babel/generator": "7.11.0",
+        "@babel/plugin-transform-runtime": "7.11.0",
+        "@babel/preset-env": "7.11.0",
+        "@babel/runtime": "7.11.2",
+        "@babel/template": "7.10.4",
+        "@jsdevtools/coverage-istanbul-loader": "3.0.5",
+        "@ngtools/webpack": "10.2.0",
+        "autoprefixer": "9.8.6",
+        "babel-loader": "8.1.0",
+        "browserslist": "^4.9.1",
+        "cacache": "15.0.5",
+        "caniuse-lite": "^1.0.30001032",
         "circular-dependency-plugin": "5.2.0",
-        "clean-css": "4.2.1",
-        "copy-webpack-plugin": "5.0.4",
-        "core-js": "3.2.1",
-        "file-loader": "4.2.0",
-        "find-cache-dir": "3.0.0",
-        "glob": "7.1.4",
-        "istanbul-instrumenter-loader": "3.0.1",
+        "copy-webpack-plugin": "6.0.3",
+        "core-js": "3.6.4",
+        "css-loader": "4.2.2",
+        "cssnano": "4.1.10",
+        "file-loader": "6.0.0",
+        "find-cache-dir": "3.3.1",
+        "glob": "7.1.6",
+        "jest-worker": "26.3.0",
         "karma-source-map-support": "1.4.0",
-        "less": "3.9.0",
-        "less-loader": "5.0.0",
-        "license-webpack-plugin": "2.1.2",
-        "loader-utils": "1.2.3",
-        "mini-css-extract-plugin": "0.8.0",
+        "less-loader": "6.2.0",
+        "license-webpack-plugin": "2.3.0",
+        "loader-utils": "2.0.0",
+        "mini-css-extract-plugin": "0.10.0",
         "minimatch": "3.0.4",
-        "open": "6.4.0",
-        "parse5": "4.0.0",
-        "postcss": "7.0.17",
+        "open": "7.2.0",
+        "parse5": "6.0.1",
+        "parse5-htmlparser2-tree-adapter": "6.0.1",
+        "pnp-webpack-plugin": "1.6.4",
+        "postcss": "7.0.32",
         "postcss-import": "12.0.1",
         "postcss-loader": "3.0.0",
-        "raw-loader": "3.1.0",
-        "regenerator-runtime": "0.13.3",
-        "rxjs": "6.4.0",
-        "sass": "1.22.9",
-        "sass-loader": "7.2.0",
-        "semver": "6.3.0",
+        "raw-loader": "4.0.1",
+        "regenerator-runtime": "0.13.7",
+        "resolve-url-loader": "3.1.2",
+        "rimraf": "3.0.2",
+        "rollup": "2.26.5",
+        "rxjs": "6.6.2",
+        "sass": "1.26.10",
+        "sass-loader": "10.0.1",
+        "semver": "7.3.2",
         "source-map": "0.7.3",
-        "source-map-loader": "0.2.4",
-        "source-map-support": "0.5.13",
-        "speed-measure-webpack-plugin": "1.3.1",
-        "style-loader": "1.0.0",
-        "stylus": "0.54.5",
+        "source-map-loader": "1.0.2",
+        "source-map-support": "0.5.19",
+        "speed-measure-webpack-plugin": "1.3.3",
+        "style-loader": "1.2.1",
+        "stylus": "0.54.8",
         "stylus-loader": "3.0.2",
-        "terser": "4.1.4",
-        "terser-webpack-plugin": "1.4.1",
-        "tree-kill": "1.2.1",
-        "webpack": "4.39.2",
-        "webpack-dev-middleware": "3.7.0",
-        "webpack-dev-server": "3.8.0",
-        "webpack-merge": "4.2.1",
+        "terser": "5.3.0",
+        "terser-webpack-plugin": "4.1.0",
+        "tree-kill": "1.2.2",
+        "webpack": "4.44.1",
+        "webpack-dev-middleware": "3.7.2",
+        "webpack-dev-server": "3.11.0",
+        "webpack-merge": "4.2.2",
         "webpack-sources": "1.4.3",
-        "webpack-subresource-integrity": "1.1.0-rc.6",
-        "worker-farm": "1.7.0",
-        "worker-plugin": "3.2.0"
+        "webpack-subresource-integrity": "1.4.1",
+        "worker-plugin": "5.0.0"
       },
       "dependencies": {
+        "@babel/core": {
+          "version": "7.11.1",
+          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz",
+          "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/generator": "^7.11.0",
+            "@babel/helper-module-transforms": "^7.11.0",
+            "@babel/helpers": "^7.10.4",
+            "@babel/parser": "^7.11.1",
+            "@babel/template": "^7.10.4",
+            "@babel/traverse": "^7.11.0",
+            "@babel/types": "^7.11.0",
+            "convert-source-map": "^1.7.0",
+            "debug": "^4.1.0",
+            "gensync": "^1.0.0-beta.1",
+            "json5": "^2.1.2",
+            "lodash": "^4.17.19",
+            "resolve": "^1.3.2",
+            "semver": "^5.4.1",
+            "source-map": "^0.5.0"
+          },
+          "dependencies": {
+            "semver": {
+              "version": "5.7.1",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+              "dev": true
+            },
+            "source-map": {
+              "version": "0.5.7",
+              "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true
+            }
+          }
+        },
+        "@babel/generator": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz",
+          "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.11.0",
+            "jsesc": "^2.5.1",
+            "source-map": "^0.5.0"
+          },
+          "dependencies": {
+            "source-map": {
+              "version": "0.5.7",
+              "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true
+            }
+          }
+        },
+        "core-js": {
+          "version": "3.6.4",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
+          "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==",
+          "dev": true
+        },
         "glob": {
-          "version": "7.1.4",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
-          "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -103,19 +175,25 @@
             "path-is-absolute": "^1.0.0"
           }
         },
+        "parse5": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+          "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+          "dev": true
+        },
         "rxjs": {
-          "version": "6.4.0",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
-          "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
           }
         },
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
         },
         "source-map": {
@@ -127,15 +205,15 @@
       }
     },
     "@angular-devkit/build-optimizer": {
-      "version": "0.803.5",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.803.5.tgz",
-      "integrity": "sha512-IDlUfXPKgGkoDCoSBOz2EThZp6+a5LJug2FSE7DexhseIXRQ59PtoV4UwoLzqqDzxLu8w6K0xZUub+G/jLoPZA==",
+      "version": "0.1002.0",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1002.0.tgz",
+      "integrity": "sha512-ACnm9doPMbRtSy1UZN5ir7smeLMx0g0oW7jX3jyPepeQKZ+9U1Bn09t10NLZQH+Z509jWZgvNJH/aOh85P6euw==",
       "dev": true,
       "requires": {
-        "loader-utils": "1.2.3",
+        "loader-utils": "2.0.0",
         "source-map": "0.7.3",
-        "tslib": "1.10.0",
-        "typescript": "3.5.3",
+        "tslib": "2.0.1",
+        "typescript": "4.0.2",
         "webpack-sources": "1.4.3"
       },
       "dependencies": {
@@ -145,30 +223,35 @@
           "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
           "dev": true
         },
+        "tslib": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
+          "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==",
+          "dev": true
+        },
         "typescript": {
-          "version": "3.5.3",
-          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz",
-          "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==",
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz",
+          "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==",
           "dev": true
         }
       }
     },
     "@angular-devkit/build-webpack": {
-      "version": "0.803.5",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.803.5.tgz",
-      "integrity": "sha512-25oiZgat2D0BFcbZESLI18L5tReJahfvsedMLPMWf1P9OnghUhC7VMaAuVdxWm6g3hH0NU9X1K8XtThTJkd9fQ==",
+      "version": "0.1002.0",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1002.0.tgz",
+      "integrity": "sha512-TLBBQ6ANOLKXOPxpCOnxAtoknwHA7XhsLuueN06w5qqF+QNNbWUMPoieKFGs2TnotfCgbiq6x57IDEZTyT6V0w==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.803.5",
-        "@angular-devkit/core": "8.3.5",
-        "rxjs": "6.4.0",
-        "webpack-merge": "4.2.1"
+        "@angular-devkit/architect": "0.1002.0",
+        "@angular-devkit/core": "10.2.0",
+        "rxjs": "6.6.2"
       },
       "dependencies": {
         "rxjs": {
-          "version": "6.4.0",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
-          "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
@@ -177,22 +260,22 @@
       }
     },
     "@angular-devkit/core": {
-      "version": "8.3.5",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.5.tgz",
-      "integrity": "sha512-ag7Nr94wQUqCFtZjw+rMET+djGBmLk989Id5lLWViW99g4XFeS+e45mJv3JYRzF218+6EdicZz0DGQRYHekVeg==",
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz",
+      "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==",
       "dev": true,
       "requires": {
-        "ajv": "6.10.2",
-        "fast-json-stable-stringify": "2.0.0",
-        "magic-string": "0.25.3",
-        "rxjs": "6.4.0",
+        "ajv": "6.12.4",
+        "fast-json-stable-stringify": "2.1.0",
+        "magic-string": "0.25.7",
+        "rxjs": "6.6.2",
         "source-map": "0.7.3"
       },
       "dependencies": {
         "rxjs": {
-          "version": "6.4.0",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
-          "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
@@ -207,19 +290,20 @@
       }
     },
     "@angular-devkit/schematics": {
-      "version": "8.3.5",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.5.tgz",
-      "integrity": "sha512-RMtM10kS+Docg90jzFMa4HQ+UzX95Gi5rCT/kSydEkBhp+Jeu/B0K2y67Fm2/qTdVNRCujrCpEmtiRcp1qsOQg==",
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.2.0.tgz",
+      "integrity": "sha512-TQI5NnE6iM3ChF5gZQ9qb+lZgMWa7aLoF5ksOyT3zrmOuICiQYJhA6SsjV95q7J4M55qYymwBib8KTqU/xuQww==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "8.3.5",
-        "rxjs": "6.4.0"
+        "@angular-devkit/core": "10.2.0",
+        "ora": "5.0.0",
+        "rxjs": "6.6.2"
       },
       "dependencies": {
         "rxjs": {
-          "version": "6.4.0",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
-          "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
+          "version": "6.6.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+          "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
           "dev": true,
           "requires": {
             "tslib": "^1.9.0"
@@ -228,54 +312,62 @@
       }
     },
     "@angular/animations": {
-      "version": "8.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.7.tgz",
-      "integrity": "sha512-Q17WadeM0WnL97Qt2xGB4LonQrVEsefjC9kUYDOIzEY9Z70eBGfH2ak6rBzlWpDmxCpIFOxEDQy/Dd3z7/nr6g==",
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.2.2.tgz",
+      "integrity": "sha512-vxDbDeGggYeK5YXuBrzeZEO4nrZoQlJfgdUBGPNJmz97ZgX0sgjbmt3y/S7qupHNwdV4QExkaXRlGk0wcYuEqQ==",
       "requires": {
-        "tslib": "^1.9.0"
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
       }
     },
     "@angular/cdk": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.2.0.tgz",
-      "integrity": "sha512-vsjKiUirICP9fTxnBT3jjqW14ipZLJPkyT3dKZQETKcml1fTY1L9QVXclvLTeUliuPSl490anuBvpQpfMeJDhQ==",
+      "version": "10.2.7",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-10.2.7.tgz",
+      "integrity": "sha512-ZQjDfTRTn7JuAKsf3jiIdU2XBaxxGBi/ZWYv5Pb3HCl6B4PISsIE5VWRhkoUogoAB0MiFHpjnWeIqknJEm11YQ==",
       "requires": {
         "parse5": "^5.0.0",
-        "tslib": "^1.7.1"
+        "tslib": "^2.0.0"
       },
       "dependencies": {
-        "parse5": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
-          "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==",
-          "optional": true
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
         }
       }
     },
     "@angular/cli": {
-      "version": "8.3.5",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.5.tgz",
-      "integrity": "sha512-gKzYV5YhypXKpt4vH/YJ/T7a72EqxTJynJ8dtoVsZw5YTdCzqa6APvObNs4lZaZ3pYxUOQr36W4Rz8Lv8CSBWA==",
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.2.0.tgz",
+      "integrity": "sha512-YBzwkFBmG6CdUJk8onsPXxHX/ByU5MERBQgYhLC873e2nZlXMUu+Ttq2Wai6apyskGvsXKxZNPOQSFZTGKXzXg==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.803.5",
-        "@angular-devkit/core": "8.3.5",
-        "@angular-devkit/schematics": "8.3.5",
-        "@schematics/angular": "8.3.5",
-        "@schematics/update": "0.803.5",
+        "@angular-devkit/architect": "0.1002.0",
+        "@angular-devkit/core": "10.2.0",
+        "@angular-devkit/schematics": "10.2.0",
+        "@schematics/angular": "10.2.0",
+        "@schematics/update": "0.1002.0",
         "@yarnpkg/lockfile": "1.1.0",
         "ansi-colors": "4.1.1",
-        "debug": "^4.1.1",
+        "debug": "4.1.1",
         "ini": "1.3.5",
-        "inquirer": "6.5.1",
-        "npm-package-arg": "6.1.0",
-        "open": "6.4.0",
-        "pacote": "9.5.5",
+        "inquirer": "7.3.3",
+        "npm-package-arg": "8.0.1",
+        "npm-pick-manifest": "6.1.0",
+        "open": "7.2.0",
+        "pacote": "9.5.12",
         "read-package-tree": "5.3.1",
-        "semver": "6.3.0",
+        "rimraf": "3.0.2",
+        "semver": "7.3.2",
         "symbol-observable": "1.2.0",
-        "universal-analytics": "^0.4.20",
-        "uuid": "^3.3.2"
+        "universal-analytics": "0.4.23",
+        "uuid": "8.3.0"
       },
       "dependencies": {
         "ansi-colors": {
@@ -293,245 +385,75 @@
             "ms": "^2.1.1"
           }
         },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
         },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+        "uuid": {
+          "version": "8.3.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz",
+          "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==",
           "dev": true
         }
       }
     },
     "@angular/common": {
-      "version": "8.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.7.tgz",
-      "integrity": "sha512-Hopy7Mepx7S7oGsXfxOsC3/MkeQRlaeQtJxd+Gh/KFyN4o52cqJOWTQOKKKzHRkaotCTHHblebOpR64h7k5YJg==",
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.2.2.tgz",
+      "integrity": "sha512-iV5kTGg7Xe79iih0RzulNFgDhyCgqpf0GC9MsWm663sYfeKaGmO0++O4FKCahE4N/++7thRMFgXy9PpSYDrFfg==",
       "requires": {
-        "tslib": "^1.9.0"
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
       }
     },
     "@angular/compiler": {
-      "version": "8.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.7.tgz",
-      "integrity": "sha512-RLXJMe+YW5a6mOj1Cxx4AkjaZX0JuerPQs4KgKx2mQXRP0LtI4+6qg2+Kds6gIJxUd1Fx9oqAflRGDPchyJaxA==",
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.2.2.tgz",
+      "integrity": "sha512-62wb/aj8ORaUyVcI6cxf07gBc3/hb+bVGl9Yni51e8//G2W7gleyQAXtIeZsT9NHi0KX1nKdXvUVwAoq4u7eHw==",
       "requires": {
-        "tslib": "^1.9.0"
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
       }
     },
     "@angular/compiler-cli": {
-      "version": "8.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.7.tgz",
-      "integrity": "sha512-TOc3zGOnocDH8idM8TUkg4Vc0HzcBR86Vs+mLfHFrlVoF/TsKKTSTyOTUHiO6y0f2jflyo8i03KBcjSBT5mS7Q==",
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.2.2.tgz",
+      "integrity": "sha512-Erbb7Rs5fo+7/gG1WPwtO5UfSq8qtBBucGu9da/HQLJdw5AO/5pKRl4PLQlxjSopsb8eRC+yVpt9OlCYaY2Chg==",
       "dev": true,
       "requires": {
         "canonical-path": "1.0.0",
-        "chokidar": "^2.1.1",
+        "chokidar": "^3.0.0",
         "convert-source-map": "^1.5.1",
         "dependency-graph": "^0.7.2",
+        "fs-extra": "4.0.2",
         "magic-string": "^0.25.0",
         "minimist": "^1.2.0",
         "reflect-metadata": "^0.1.2",
+        "semver": "^6.3.0",
         "source-map": "^0.6.1",
-        "tslib": "^1.9.0",
-        "yargs": "13.1.0"
+        "sourcemap-codec": "^1.4.8",
+        "tslib": "^2.0.0",
+        "yargs": "15.3.0"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-          "dev": true
-        },
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-          "dev": true
-        },
-        "chokidar": {
-          "version": "2.1.8",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
-          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
-          "dev": true,
-          "requires": {
-            "anymatch": "^2.0.0",
-            "async-each": "^1.0.1",
-            "braces": "^2.3.2",
-            "fsevents": "^1.2.7",
-            "glob-parent": "^3.1.0",
-            "inherits": "^2.0.3",
-            "is-binary-path": "^1.0.0",
-            "is-glob": "^4.0.0",
-            "normalize-path": "^3.0.0",
-            "path-is-absolute": "^1.0.0",
-            "readdirp": "^2.2.1",
-            "upath": "^1.1.1"
-          }
-        },
-        "cliui": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
-          "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
-          "dev": true,
-          "requires": {
-            "string-width": "^2.1.1",
-            "strip-ansi": "^4.0.0",
-            "wrap-ansi": "^2.0.0"
-          },
-          "dependencies": {
-            "string-width": {
-              "version": "2.1.1",
-              "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-              "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
-              "dev": true,
-              "requires": {
-                "is-fullwidth-code-point": "^2.0.0",
-                "strip-ansi": "^4.0.0"
-              }
-            }
-          }
-        },
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-          "dev": true,
-          "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          }
-        },
-        "execa": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-          "dev": true,
-          "requires": {
-            "cross-spawn": "^6.0.0",
-            "get-stream": "^4.0.0",
-            "is-stream": "^1.1.0",
-            "npm-run-path": "^2.0.0",
-            "p-finally": "^1.0.0",
-            "signal-exit": "^3.0.0",
-            "strip-eof": "^1.0.0"
-          }
-        },
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "get-caller-file": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-          "dev": true
-        },
-        "invert-kv": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
-          "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
-          "dev": true
-        },
-        "lcid": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
-          "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
-          "dev": true,
-          "requires": {
-            "invert-kv": "^2.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "normalize-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-          "dev": true
-        },
-        "os-locale": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
-          "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
-          "dev": true,
-          "requires": {
-            "execa": "^1.0.0",
-            "lcid": "^2.0.0",
-            "mem": "^4.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
-          "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-          "dev": true
-        },
-        "readdirp": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
-          "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.1.11",
-            "micromatch": "^3.1.10",
-            "readable-stream": "^2.0.2"
-          }
-        },
-        "require-main-filename": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-          "dev": true
-        },
         "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         },
         "source-map": {
@@ -540,1112 +462,1275 @@
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          },
-          "dependencies": {
-            "ansi-regex": {
-              "version": "4.1.0",
-              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-              "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-              "dev": true
-            },
-            "strip-ansi": {
-              "version": "5.2.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^4.1.0"
-              }
-            }
-          }
-        },
-        "strip-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^3.0.0"
-          }
-        },
-        "upath": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
-          "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==",
           "dev": true
-        },
-        "which-module": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-          "dev": true
-        },
-        "y18n": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-          "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
-          "dev": true
-        },
-        "yargs": {
-          "version": "13.1.0",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz",
-          "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==",
-          "dev": true,
-          "requires": {
-            "cliui": "^4.0.0",
-            "find-up": "^3.0.0",
-            "get-caller-file": "^2.0.1",
-            "os-locale": "^3.1.0",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^2.0.0",
-            "set-blocking": "^2.0.0",
-            "string-width": "^3.0.0",
-            "which-module": "^2.0.0",
-            "y18n": "^4.0.0",
-            "yargs-parser": "^13.0.0"
-          }
-        },
-        "yargs-parser": {
-          "version": "13.1.1",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
-          "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
-          "dev": true,
-          "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
-          }
         }
       }
     },
     "@angular/core": {
-      "version": "8.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.7.tgz",
-      "integrity": "sha512-TRGnrxRMM6JyFqgw6EFBTlZKRrZ/MkIMgnAAdk7d0ftGdsi0fao9y+hBO/oVOJjCqeEt0tkHtHhIoXEkZSs84g==",
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.2.2.tgz",
+      "integrity": "sha512-9IHZF4/zcCKCLGzsbaUeNE8V+R9kcCu0ZNXvqkxd1+vTPdcf00185KzD6CAm+OiskLwvmrudh4vh0CQ+JHSTtQ==",
       "requires": {
-        "tslib": "^1.9.0"
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
       }
     },
     "@angular/forms": {
-      "version": "8.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.7.tgz",
-      "integrity": "sha512-9RN4xVlZTPm7bJvz3g7VUJ1WK2SPdvr4SHrbxYK/H87KlB9RY3DSETEgmWMgt8d4q9u+IRIKv4EfRs3qkZzvyQ==",
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.2.2.tgz",
+      "integrity": "sha512-ATPMEvM1I/oEXn24qyHpgihYsXrXqnBXJkIGMFb4Tty2ay9xWDtV9aDknvd/7In1/SbHwcSdwhfJJ43apDB6yg==",
       "requires": {
-        "tslib": "^1.9.0"
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
+      }
+    },
+    "@angular/localize": {
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-10.2.2.tgz",
+      "integrity": "sha512-QZSr0CNurtZYcmm15sIIcTiX2x3eewEQHyYv8+wxB8sw4qtTPR3OiQM/99ndyfNrhhQKWeq2qFxcp5sgUCFW5g==",
+      "requires": {
+        "@babel/core": "7.8.3",
+        "glob": "7.1.2",
+        "yargs": "15.3.0"
       }
     },
     "@angular/material": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.2.0.tgz",
-      "integrity": "sha512-4EY3QilEXS09+10WYwkunEltReuPDByb2ulWw2FLG3wpmMpCp4p6AKY9v9xS3sGvb708S0b9vlfLG4FbepmBbA==",
+      "version": "10.2.7",
+      "resolved": "https://registry.npmjs.org/@angular/material/-/material-10.2.7.tgz",
+      "integrity": "sha512-uk6JkRrKHaM9VFMzX7pWC83YNLVgXPB3D8U1yjSOafCdWwrRZgUHGr8MPlSILCr3o2nxgg5SsKdWcWwHuXXUZA==",
       "requires": {
-        "tslib": "^1.7.1"
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
       }
     },
     "@angular/material-moment-adapter": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-8.2.0.tgz",
-      "integrity": "sha512-mz8kvag/r/2S7mZS5gS9jcs0aMQpRTIGGi+CFuNZSqPQMFb0o5zeALpgcu2R7hpqjvJfFHBHDhCxcZx23/2EFg==",
+      "version": "10.2.7",
+      "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-10.2.7.tgz",
+      "integrity": "sha512-VaigAiBCz10AvpzgZvdR4SCGnMRxXKx8ukUdeowuoqAFONEPpRdCJmwZ+8bpi9Q/jXlrZJicCMhklj4bBQw6tg==",
       "requires": {
-        "tslib": "^1.7.1"
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
       }
     },
     "@angular/platform-browser": {
-      "version": "8.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.7.tgz",
-      "integrity": "sha512-NJTv/02xOWHuLIdrdt+UWb4qRNyd7FqR/ADC4TZQWS1zPxQyEVOsdXfwtDdC01UEDsKeVwp/CV4nmNdPIFynAw==",
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.2.2.tgz",
+      "integrity": "sha512-vxUKppRS5rIytzp8rV7pcqobopqBqSpXd5Rv/C5yVU9fTqg/hxbMPF8fRDITRqhArtuT7iT3Vv3TK+whqXTyNQ==",
       "requires": {
-        "tslib": "^1.9.0"
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
       }
     },
     "@angular/platform-browser-dynamic": {
-      "version": "8.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.7.tgz",
-      "integrity": "sha512-h1uhP4C+uuc5dAugerO5/tnXc4r1KcQf1lTqicv+qTBg53mxTsiya50QhO60A3sNuAGp9kVCO5PIrE6VhmRnSQ==",
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.2.2.tgz",
+      "integrity": "sha512-+Py/UhIOjsGvOozUFrCS/roAXLwSoE+moiJIxZkMrVVaRx/72P91bF3Zd17kYiXUGyEe7Im5NpXzWeK6y16oRg==",
       "requires": {
-        "tslib": "^1.9.0"
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
       }
     },
     "@angular/platform-server": {
-      "version": "8.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-8.2.7.tgz",
-      "integrity": "sha512-F0Dqdb6Z+BC/3ZZz05xtXAgs+9KLA7WTnndrQSrVJKPpUEbMyTa1sWQYY8MHykFNUx75qdma7s7i9052gYiqkg==",
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-10.2.2.tgz",
+      "integrity": "sha512-k8rHF7+jP2anICYoGRX/PGL++/1mNQBmG/kFprtYX6KGqLLoDGrfOp+atHtZIWtFclTuVKq9Xip1uiBwoGz64Q==",
       "requires": {
         "domino": "^2.1.2",
-        "tslib": "^1.9.0",
-        "xhr2": "^0.1.4"
+        "tslib": "^2.0.0",
+        "xhr2": "^0.2.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
       }
     },
     "@angular/router": {
-      "version": "8.2.7",
-      "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.7.tgz",
-      "integrity": "sha512-nqTr7N0eomlcV9epX5M8J6Q1pUYR+E/MRYRbme/HgUwfVHd1dawgwVWktKJz3cf16OJJxPMFroN8p4XGS669Ew==",
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.2.2.tgz",
+      "integrity": "sha512-jskLB4B3ccJS9YUFGgrR8JC6Ae31U1iw6gefh/S0xP742IxhgexxrxDUu/NAZkLV51sQ++snpnUK9DZU1kpXmA==",
       "requires": {
-        "tslib": "^1.9.0"
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
       }
     },
     "@babel/code-frame": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
-      "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
-      "dev": true,
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+      "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
       "requires": {
-        "@babel/highlight": "^7.0.0"
+        "@babel/highlight": "^7.10.4"
       }
     },
+    "@babel/compat-data": {
+      "version": "7.12.5",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.5.tgz",
+      "integrity": "sha512-DTsS7cxrsH3by8nqQSpFSyjSfSYl57D6Cf4q8dW3LK83tBKBDCkfcay1nYkXq1nIHXnpX8WMMb/O25HOy3h1zg==",
+      "dev": true
+    },
     "@babel/core": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz",
-      "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==",
-      "dev": true,
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz",
+      "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==",
       "requires": {
-        "@babel/code-frame": "^7.5.5",
-        "@babel/generator": "^7.5.5",
-        "@babel/helpers": "^7.5.5",
-        "@babel/parser": "^7.5.5",
-        "@babel/template": "^7.4.4",
-        "@babel/traverse": "^7.5.5",
-        "@babel/types": "^7.5.5",
-        "convert-source-map": "^1.1.0",
+        "@babel/code-frame": "^7.8.3",
+        "@babel/generator": "^7.8.3",
+        "@babel/helpers": "^7.8.3",
+        "@babel/parser": "^7.8.3",
+        "@babel/template": "^7.8.3",
+        "@babel/traverse": "^7.8.3",
+        "@babel/types": "^7.8.3",
+        "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.1",
         "json5": "^2.1.0",
         "lodash": "^4.17.13",
         "resolve": "^1.3.2",
         "semver": "^5.4.1",
         "source-map": "^0.5.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "json5": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
-          "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
       }
     },
     "@babel/generator": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz",
-      "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==",
-      "dev": true,
+      "version": "7.12.5",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz",
+      "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==",
       "requires": {
-        "@babel/types": "^7.6.0",
+        "@babel/types": "^7.12.5",
         "jsesc": "^2.5.1",
-        "lodash": "^4.17.13",
-        "source-map": "^0.5.0",
-        "trim-right": "^1.0.1"
+        "source-map": "^0.5.0"
       }
     },
     "@babel/helper-annotate-as-pure": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
-      "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
+      "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.0.0"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
-      "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
+      "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
       "dev": true,
       "requires": {
-        "@babel/helper-explode-assignable-expression": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/helper-explode-assignable-expression": "^7.10.4",
+        "@babel/types": "^7.10.4"
       }
     },
-    "@babel/helper-call-delegate": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz",
-      "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==",
+    "@babel/helper-compilation-targets": {
+      "version": "7.12.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz",
+      "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==",
       "dev": true,
       "requires": {
-        "@babel/helper-hoist-variables": "^7.4.4",
-        "@babel/traverse": "^7.4.4",
-        "@babel/types": "^7.4.4"
+        "@babel/compat-data": "^7.12.5",
+        "@babel/helper-validator-option": "^7.12.1",
+        "browserslist": "^4.14.5",
+        "semver": "^5.5.0"
+      }
+    },
+    "@babel/helper-create-class-features-plugin": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz",
+      "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-member-expression-to-functions": "^7.12.1",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.12.1",
+        "@babel/helper-split-export-declaration": "^7.10.4"
+      }
+    },
+    "@babel/helper-create-regexp-features-plugin": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz",
+      "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-regex": "^7.10.4",
+        "regexpu-core": "^4.7.1"
       }
     },
     "@babel/helper-define-map": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz",
-      "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==",
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
+      "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/types": "^7.5.5",
-        "lodash": "^4.17.13"
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/types": "^7.10.5",
+        "lodash": "^4.17.19"
       }
     },
     "@babel/helper-explode-assignable-expression": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
-      "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz",
+      "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==",
       "dev": true,
       "requires": {
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/types": "^7.12.1"
       }
     },
     "@babel/helper-function-name": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
-      "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
-      "dev": true,
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+      "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
       "requires": {
-        "@babel/helper-get-function-arity": "^7.0.0",
-        "@babel/template": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/helper-get-function-arity": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-get-function-arity": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
-      "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
-      "dev": true,
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+      "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
       "requires": {
-        "@babel/types": "^7.0.0"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-hoist-variables": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz",
-      "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
+      "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.4.4"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-member-expression-to-functions": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz",
-      "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz",
+      "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.5.5"
+        "@babel/types": "^7.12.1"
       }
     },
     "@babel/helper-module-imports": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
-      "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
+      "version": "7.12.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz",
+      "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.0.0"
+        "@babel/types": "^7.12.5"
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz",
-      "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+      "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-simple-access": "^7.1.0",
-        "@babel/helper-split-export-declaration": "^7.4.4",
-        "@babel/template": "^7.4.4",
-        "@babel/types": "^7.5.5",
-        "lodash": "^4.17.13"
+        "@babel/helper-module-imports": "^7.12.1",
+        "@babel/helper-replace-supers": "^7.12.1",
+        "@babel/helper-simple-access": "^7.12.1",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.12.1",
+        "@babel/types": "^7.12.1",
+        "lodash": "^4.17.19"
       }
     },
     "@babel/helper-optimise-call-expression": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
-      "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+      "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.0.0"
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helper-plugin-utils": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
-      "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==",
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
       "dev": true
     },
     "@babel/helper-regex": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz",
-      "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==",
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
+      "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
       "dev": true,
       "requires": {
-        "lodash": "^4.17.13"
+        "lodash": "^4.17.19"
       }
     },
     "@babel/helper-remap-async-to-generator": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
-      "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz",
+      "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-wrap-function": "^7.1.0",
-        "@babel/template": "^7.1.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-wrap-function": "^7.10.4",
+        "@babel/types": "^7.12.1"
       }
     },
     "@babel/helper-replace-supers": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz",
-      "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==",
+      "version": "7.12.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz",
+      "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==",
       "dev": true,
       "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.5.5",
-        "@babel/helper-optimise-call-expression": "^7.0.0",
-        "@babel/traverse": "^7.5.5",
-        "@babel/types": "^7.5.5"
+        "@babel/helper-member-expression-to-functions": "^7.12.1",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/traverse": "^7.12.5",
+        "@babel/types": "^7.12.5"
       }
     },
     "@babel/helper-simple-access": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
-      "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+      "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.1.0",
-        "@babel/types": "^7.0.0"
+        "@babel/types": "^7.12.1"
+      }
+    },
+    "@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz",
+      "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.12.1"
       }
     },
     "@babel/helper-split-export-declaration": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
-      "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
-      "dev": true,
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+      "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
       "requires": {
-        "@babel/types": "^7.4.4"
+        "@babel/types": "^7.11.0"
       }
     },
+    "@babel/helper-validator-identifier": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
+    },
+    "@babel/helper-validator-option": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz",
+      "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==",
+      "dev": true
+    },
     "@babel/helper-wrap-function": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
-      "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==",
+      "version": "7.12.3",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz",
+      "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/template": "^7.1.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.2.0"
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/helpers": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.0.tgz",
-      "integrity": "sha512-W9kao7OBleOjfXtFGgArGRX6eCP0UEcA2ZWEWNkJdRZnHhW4eEbeswbG3EwaRsnQUAEGWYgMq1HsIXuNNNy2eQ==",
-      "dev": true,
+      "version": "7.12.5",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz",
+      "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==",
       "requires": {
-        "@babel/template": "^7.6.0",
-        "@babel/traverse": "^7.6.0",
-        "@babel/types": "^7.6.0"
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.12.5",
+        "@babel/types": "^7.12.5"
       }
     },
     "@babel/highlight": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
-      "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
-      "dev": true,
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
       "requires": {
+        "@babel/helper-validator-identifier": "^7.10.4",
         "chalk": "^2.0.0",
-        "esutils": "^2.0.2",
         "js-tokens": "^4.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "js-tokens": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
       }
     },
     "@babel/parser": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz",
-      "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==",
-      "dev": true
+      "version": "7.12.5",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz",
+      "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ=="
     },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz",
-      "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz",
+      "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-remap-async-to-generator": "^7.1.0",
-        "@babel/plugin-syntax-async-generators": "^7.2.0"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-remap-async-to-generator": "^7.12.1",
+        "@babel/plugin-syntax-async-generators": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-class-properties": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz",
+      "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.12.1",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-proposal-dynamic-import": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz",
-      "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz",
+      "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-dynamic-import": "^7.2.0"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-export-namespace-from": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz",
+      "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
       }
     },
     "@babel/plugin-proposal-json-strings": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
-      "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz",
+      "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-json-strings": "^7.2.0"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-json-strings": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-logical-assignment-operators": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz",
+      "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-nullish-coalescing-operator": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz",
+      "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-numeric-separator": {
+      "version": "7.12.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.5.tgz",
+      "integrity": "sha512-UiAnkKuOrCyjZ3sYNHlRlfuZJbBHknMQ9VMwVeX97Ofwx7RpD6gS2HfqTCh8KNUQgcOm8IKt103oR4KIjh7Q8g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       }
     },
     "@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz",
-      "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
+      "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+        "@babel/plugin-transform-parameters": "^7.12.1"
       }
     },
     "@babel/plugin-proposal-optional-catch-binding": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz",
-      "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz",
+      "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.2.0"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-optional-chaining": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz",
+      "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-private-methods": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz",
+      "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.12.1",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-proposal-unicode-property-regex": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz",
-      "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz",
+      "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.5.4"
+        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-syntax-async-generators": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz",
-      "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==",
+      "version": "7.8.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-class-properties": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz",
+      "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-syntax-dynamic-import": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz",
-      "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-export-namespace-from": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.3"
       }
     },
     "@babel/plugin-syntax-json-strings": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
-      "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-syntax-object-rest-spread": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz",
-      "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
       }
     },
     "@babel/plugin-syntax-optional-catch-binding": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz",
-      "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-top-level-await": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz",
+      "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-arrow-functions": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz",
-      "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz",
+      "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-async-to-generator": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz",
-      "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz",
+      "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-remap-async-to-generator": "^7.1.0"
+        "@babel/helper-module-imports": "^7.12.1",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-remap-async-to-generator": "^7.12.1"
       }
     },
     "@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz",
-      "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz",
+      "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-block-scoping": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz",
-      "integrity": "sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz",
+      "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "lodash": "^4.17.13"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-classes": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz",
-      "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz",
+      "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-define-map": "^7.5.5",
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-optimise-call-expression": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-replace-supers": "^7.5.5",
-        "@babel/helper-split-export-declaration": "^7.4.4",
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-define-map": "^7.10.4",
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.12.1",
+        "@babel/helper-split-export-declaration": "^7.10.4",
         "globals": "^11.1.0"
       }
     },
     "@babel/plugin-transform-computed-properties": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz",
-      "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz",
+      "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-destructuring": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz",
-      "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz",
+      "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-dotall-regex": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz",
-      "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz",
+      "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.5.4"
+        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-duplicate-keys": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz",
-      "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz",
+      "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz",
-      "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz",
+      "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==",
       "dev": true,
       "requires": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-for-of": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz",
-      "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz",
+      "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-function-name": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz",
-      "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz",
+      "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-literals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz",
-      "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz",
+      "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-member-expression-literals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz",
-      "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz",
+      "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-modules-amd": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz",
-      "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz",
+      "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "babel-plugin-dynamic-import-node": "^2.3.0"
+        "@babel/helper-module-transforms": "^7.12.1",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
       }
     },
     "@babel/plugin-transform-modules-commonjs": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz",
-      "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz",
+      "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.4.4",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-simple-access": "^7.1.0",
-        "babel-plugin-dynamic-import-node": "^2.3.0"
+        "@babel/helper-module-transforms": "^7.12.1",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-simple-access": "^7.12.1",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
       }
     },
     "@babel/plugin-transform-modules-systemjs": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz",
-      "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz",
+      "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-hoist-variables": "^7.4.4",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "babel-plugin-dynamic-import-node": "^2.3.0"
+        "@babel/helper-hoist-variables": "^7.10.4",
+        "@babel/helper-module-transforms": "^7.12.1",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
       }
     },
     "@babel/plugin-transform-modules-umd": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz",
-      "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz",
+      "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-module-transforms": "^7.12.1",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.0.tgz",
-      "integrity": "sha512-jem7uytlmrRl3iCAuQyw8BpB4c4LWvSpvIeXKpMb+7j84lkx4m4mYr5ErAcmN5KM7B6BqrAvRGjBIbbzqCczew==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz",
+      "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==",
       "dev": true,
       "requires": {
-        "regexp-tree": "^0.1.13"
+        "@babel/helper-create-regexp-features-plugin": "^7.12.1"
       }
     },
     "@babel/plugin-transform-new-target": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz",
-      "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz",
+      "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-object-super": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz",
-      "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz",
+      "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-replace-supers": "^7.5.5"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.12.1"
       }
     },
     "@babel/plugin-transform-parameters": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz",
-      "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz",
+      "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==",
       "dev": true,
       "requires": {
-        "@babel/helper-call-delegate": "^7.4.4",
-        "@babel/helper-get-function-arity": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-property-literals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz",
-      "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz",
+      "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-regenerator": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz",
-      "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz",
+      "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==",
       "dev": true,
       "requires": {
-        "regenerator-transform": "^0.14.0"
+        "regenerator-transform": "^0.14.2"
       }
     },
     "@babel/plugin-transform-reserved-words": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz",
-      "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz",
+      "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-runtime": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz",
+      "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "resolve": "^1.8.1",
+        "semver": "^5.5.1"
       }
     },
     "@babel/plugin-transform-shorthand-properties": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz",
-      "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz",
+      "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-spread": {
-      "version": "7.2.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz",
-      "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz",
+      "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1"
       }
     },
     "@babel/plugin-transform-sticky-regex": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz",
-      "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz",
+      "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-regex": "^7.10.4"
       }
     },
     "@babel/plugin-transform-template-literals": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz",
-      "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz",
+      "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-typeof-symbol": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz",
-      "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz",
+      "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-unicode-escapes": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz",
+      "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/plugin-transform-unicode-regex": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz",
-      "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==",
+      "version": "7.12.1",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz",
+      "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.5.4"
+        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+        "@babel/helper-plugin-utils": "^7.10.4"
       }
     },
     "@babel/preset-env": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz",
-      "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==",
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz",
+      "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
-        "@babel/plugin-proposal-dynamic-import": "^7.5.0",
-        "@babel/plugin-proposal-json-strings": "^7.2.0",
-        "@babel/plugin-proposal-object-rest-spread": "^7.5.5",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
-        "@babel/plugin-syntax-async-generators": "^7.2.0",
-        "@babel/plugin-syntax-dynamic-import": "^7.2.0",
-        "@babel/plugin-syntax-json-strings": "^7.2.0",
-        "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
-        "@babel/plugin-transform-arrow-functions": "^7.2.0",
-        "@babel/plugin-transform-async-to-generator": "^7.5.0",
-        "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
-        "@babel/plugin-transform-block-scoping": "^7.5.5",
-        "@babel/plugin-transform-classes": "^7.5.5",
-        "@babel/plugin-transform-computed-properties": "^7.2.0",
-        "@babel/plugin-transform-destructuring": "^7.5.0",
-        "@babel/plugin-transform-dotall-regex": "^7.4.4",
-        "@babel/plugin-transform-duplicate-keys": "^7.5.0",
-        "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
-        "@babel/plugin-transform-for-of": "^7.4.4",
-        "@babel/plugin-transform-function-name": "^7.4.4",
-        "@babel/plugin-transform-literals": "^7.2.0",
-        "@babel/plugin-transform-member-expression-literals": "^7.2.0",
-        "@babel/plugin-transform-modules-amd": "^7.5.0",
-        "@babel/plugin-transform-modules-commonjs": "^7.5.0",
-        "@babel/plugin-transform-modules-systemjs": "^7.5.0",
-        "@babel/plugin-transform-modules-umd": "^7.2.0",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5",
-        "@babel/plugin-transform-new-target": "^7.4.4",
-        "@babel/plugin-transform-object-super": "^7.5.5",
-        "@babel/plugin-transform-parameters": "^7.4.4",
-        "@babel/plugin-transform-property-literals": "^7.2.0",
-        "@babel/plugin-transform-regenerator": "^7.4.5",
-        "@babel/plugin-transform-reserved-words": "^7.2.0",
-        "@babel/plugin-transform-shorthand-properties": "^7.2.0",
-        "@babel/plugin-transform-spread": "^7.2.0",
-        "@babel/plugin-transform-sticky-regex": "^7.2.0",
-        "@babel/plugin-transform-template-literals": "^7.4.4",
-        "@babel/plugin-transform-typeof-symbol": "^7.2.0",
-        "@babel/plugin-transform-unicode-regex": "^7.4.4",
-        "@babel/types": "^7.5.5",
-        "browserslist": "^4.6.0",
-        "core-js-compat": "^3.1.1",
+        "@babel/compat-data": "^7.11.0",
+        "@babel/helper-compilation-targets": "^7.10.4",
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-proposal-async-generator-functions": "^7.10.4",
+        "@babel/plugin-proposal-class-properties": "^7.10.4",
+        "@babel/plugin-proposal-dynamic-import": "^7.10.4",
+        "@babel/plugin-proposal-export-namespace-from": "^7.10.4",
+        "@babel/plugin-proposal-json-strings": "^7.10.4",
+        "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
+        "@babel/plugin-proposal-numeric-separator": "^7.10.4",
+        "@babel/plugin-proposal-object-rest-spread": "^7.11.0",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.10.4",
+        "@babel/plugin-proposal-optional-chaining": "^7.11.0",
+        "@babel/plugin-proposal-private-methods": "^7.10.4",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.10.4",
+        "@babel/plugin-syntax-async-generators": "^7.8.0",
+        "@babel/plugin-syntax-class-properties": "^7.10.4",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.0",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.0",
+        "@babel/plugin-syntax-top-level-await": "^7.10.4",
+        "@babel/plugin-transform-arrow-functions": "^7.10.4",
+        "@babel/plugin-transform-async-to-generator": "^7.10.4",
+        "@babel/plugin-transform-block-scoped-functions": "^7.10.4",
+        "@babel/plugin-transform-block-scoping": "^7.10.4",
+        "@babel/plugin-transform-classes": "^7.10.4",
+        "@babel/plugin-transform-computed-properties": "^7.10.4",
+        "@babel/plugin-transform-destructuring": "^7.10.4",
+        "@babel/plugin-transform-dotall-regex": "^7.10.4",
+        "@babel/plugin-transform-duplicate-keys": "^7.10.4",
+        "@babel/plugin-transform-exponentiation-operator": "^7.10.4",
+        "@babel/plugin-transform-for-of": "^7.10.4",
+        "@babel/plugin-transform-function-name": "^7.10.4",
+        "@babel/plugin-transform-literals": "^7.10.4",
+        "@babel/plugin-transform-member-expression-literals": "^7.10.4",
+        "@babel/plugin-transform-modules-amd": "^7.10.4",
+        "@babel/plugin-transform-modules-commonjs": "^7.10.4",
+        "@babel/plugin-transform-modules-systemjs": "^7.10.4",
+        "@babel/plugin-transform-modules-umd": "^7.10.4",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4",
+        "@babel/plugin-transform-new-target": "^7.10.4",
+        "@babel/plugin-transform-object-super": "^7.10.4",
+        "@babel/plugin-transform-parameters": "^7.10.4",
+        "@babel/plugin-transform-property-literals": "^7.10.4",
+        "@babel/plugin-transform-regenerator": "^7.10.4",
+        "@babel/plugin-transform-reserved-words": "^7.10.4",
+        "@babel/plugin-transform-shorthand-properties": "^7.10.4",
+        "@babel/plugin-transform-spread": "^7.11.0",
+        "@babel/plugin-transform-sticky-regex": "^7.10.4",
+        "@babel/plugin-transform-template-literals": "^7.10.4",
+        "@babel/plugin-transform-typeof-symbol": "^7.10.4",
+        "@babel/plugin-transform-unicode-escapes": "^7.10.4",
+        "@babel/plugin-transform-unicode-regex": "^7.10.4",
+        "@babel/preset-modules": "^0.1.3",
+        "@babel/types": "^7.11.0",
+        "browserslist": "^4.12.0",
+        "core-js-compat": "^3.6.2",
         "invariant": "^2.2.2",
-        "js-levenshtein": "^1.1.3",
+        "levenary": "^1.1.1",
         "semver": "^5.5.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
-        }
+      }
+    },
+    "@babel/preset-modules": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+      "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+        "@babel/plugin-transform-dotall-regex": "^7.4.4",
+        "@babel/types": "^7.4.4",
+        "esutils": "^2.0.2"
+      }
+    },
+    "@babel/runtime": {
+      "version": "7.11.2",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
+      "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
+      "dev": true,
+      "requires": {
+        "regenerator-runtime": "^0.13.4"
       }
     },
     "@babel/template": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz",
-      "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==",
-      "dev": true,
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+      "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
       "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.6.0",
-        "@babel/types": "^7.6.0"
+        "@babel/code-frame": "^7.10.4",
+        "@babel/parser": "^7.10.4",
+        "@babel/types": "^7.10.4"
       }
     },
     "@babel/traverse": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz",
-      "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==",
-      "dev": true,
+      "version": "7.12.5",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz",
+      "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==",
       "requires": {
-        "@babel/code-frame": "^7.5.5",
-        "@babel/generator": "^7.6.0",
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-split-export-declaration": "^7.4.4",
-        "@babel/parser": "^7.6.0",
-        "@babel/types": "^7.6.0",
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.12.5",
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/parser": "^7.12.5",
+        "@babel/types": "^7.12.5",
         "debug": "^4.1.0",
         "globals": "^11.1.0",
-        "lodash": "^4.17.13"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
+        "lodash": "^4.17.19"
       }
     },
     "@babel/types": {
-      "version": "7.6.1",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
-      "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
-      "dev": true,
+      "version": "7.12.6",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz",
+      "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==",
       "requires": {
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.13",
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "lodash": "^4.17.19",
         "to-fast-properties": "^2.0.0"
       }
     },
-    "@ngtools/webpack": {
-      "version": "8.3.5",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.5.tgz",
-      "integrity": "sha512-RmzLgu12VD9waKmw8RD6I/aKH82lGZQzVW9oTAFcYUxD/sZdos+DmFxk1F/kYQLM+GeUGy6c2emW/2vlVcdyUg==",
+    "@istanbuljs/schema": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
+      "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
+      "dev": true
+    },
+    "@jsdevtools/coverage-istanbul-loader": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz",
+      "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "8.3.5",
-        "enhanced-resolve": "4.1.0",
-        "rxjs": "6.4.0",
-        "tree-kill": "1.2.1",
+        "convert-source-map": "^1.7.0",
+        "istanbul-lib-instrument": "^4.0.3",
+        "loader-utils": "^2.0.0",
+        "merge-source-map": "^1.1.0",
+        "schema-utils": "^2.7.0"
+      }
+    },
+    "@ngtools/webpack": {
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.2.0.tgz",
+      "integrity": "sha512-W4SSFNQhIiC8JRhIn3c4mb1+fsFKiHp+THVMAUNo+wRZEt/rgzsCdnqv0EmQJJojZhnilUIyB/wVYJu2+S/Bxg==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "10.2.0",
+        "enhanced-resolve": "4.3.0",
         "webpack-sources": "1.4.3"
+      }
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
+      "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.3",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
+      "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
+      "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.3",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@npmcli/move-file": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz",
+      "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^1.0.4"
       },
       "dependencies": {
-        "rxjs": {
-          "version": "6.4.0",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
-          "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
-          "dev": true,
-          "requires": {
-            "tslib": "^1.9.0"
-          }
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
         }
       }
     },
     "@schematics/angular": {
-      "version": "8.3.5",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.5.tgz",
-      "integrity": "sha512-3YKurSNqUfjVrbENVlnTBNGYBWjdyjrWzJRlwWbCq+owQLhkZ/N5qVirt/SDw5T9hK2AEMOKjLkQYtpE+aOCgg==",
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.2.0.tgz",
+      "integrity": "sha512-rJRTTTL8CMMFb3ebCvAVHKHxuNzRqy/HtbXhJ82l5Xo/jXcm74eV2Q0RBUrNo1yBKWFIR+FIwiXLJaGcC/R9Pw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "8.3.5",
-        "@angular-devkit/schematics": "8.3.5"
+        "@angular-devkit/core": "10.2.0",
+        "@angular-devkit/schematics": "10.2.0",
+        "jsonc-parser": "2.3.0"
       }
     },
     "@schematics/update": {
-      "version": "0.803.5",
-      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.5.tgz",
-      "integrity": "sha512-v2qU0ATb1jND8GIGQFnI1QLWoquUjJ2fJ37HoDSO3rmttZ/NvoV4sNDGhk/pPUcmeXa+prURfJCCCSeHZ/yKkw==",
+      "version": "0.1002.0",
+      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1002.0.tgz",
+      "integrity": "sha512-g2bfJSAj3x/YL0GNhnHsDSQmO6DoxSnLxoFLqNN5+ukxK5jq7OZNDwMJGxZ3X6RcSMWKEkIKL/wlq9yhj2T/kw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "8.3.5",
-        "@angular-devkit/schematics": "8.3.5",
+        "@angular-devkit/core": "10.2.0",
+        "@angular-devkit/schematics": "10.2.0",
         "@yarnpkg/lockfile": "1.1.0",
         "ini": "1.3.5",
-        "pacote": "9.5.5",
-        "rxjs": "6.4.0",
-        "semver": "6.3.0",
+        "npm-package-arg": "^8.0.0",
+        "pacote": "9.5.12",
+        "semver": "7.3.2",
         "semver-intersect": "1.4.0"
       },
       "dependencies": {
-        "rxjs": {
-          "version": "6.4.0",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
-          "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
-          "dev": true,
-          "requires": {
-            "tslib": "^1.9.0"
-          }
-        },
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
         }
       }
     },
-    "@types/events": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
-      "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
-      "dev": true
-    },
     "@types/glob": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
-      "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
       "dev": true,
       "requires": {
-        "@types/events": "*",
         "@types/minimatch": "*",
         "@types/node": "*"
       }
     },
+    "@types/json-schema": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+      "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+      "dev": true
+    },
     "@types/minimatch": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
@@ -1653,18 +1738,24 @@
       "dev": true
     },
     "@types/moment-timezone": {
-      "version": "0.5.12",
-      "resolved": "https://registry.npmjs.org/@types/moment-timezone/-/moment-timezone-0.5.12.tgz",
-      "integrity": "sha512-hnHH2+Efg2vExr/dSz+IX860nSiyk9Sk4pJF2EmS11lRpMcNXeB4KBW5xcgw2QPsb9amTXdsVNEe5IoJXiT0uw==",
+      "version": "0.5.30",
+      "resolved": "https://registry.npmjs.org/@types/moment-timezone/-/moment-timezone-0.5.30.tgz",
+      "integrity": "sha512-aDVfCsjYnAQaV/E9Qc24C5Njx1CoDjXsEgkxtp9NyXDpYu4CCbmclb6QhWloS9UTU/8YROUEEdEkWI0D7DxnKg==",
       "dev": true,
       "requires": {
-        "moment": ">=2.14.0"
+        "moment-timezone": "*"
       }
     },
     "@types/node": {
-      "version": "12.7.5",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz",
-      "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==",
+      "version": "12.19.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.3.tgz",
+      "integrity": "sha512-8Jduo8wvvwDzEVJCOvS/G6sgilOLvvhn1eMmK3TW8/T217O7u1jdrK6ImKLv80tVryaPSVeKu6sjDEiFjd4/eg==",
+      "dev": true
+    },
+    "@types/q": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
+      "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==",
       "dev": true
     },
     "@types/source-list-map": {
@@ -1674,9 +1765,9 @@
       "dev": true
     },
     "@types/webpack-sources": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz",
-      "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==",
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz",
+      "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==",
       "dev": true,
       "requires": {
         "@types/node": "*",
@@ -1693,178 +1784,177 @@
       }
     },
     "@webassemblyjs/ast": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz",
-      "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/helper-module-context": "1.8.5",
-        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
-        "@webassemblyjs/wast-parser": "1.8.5"
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0"
       }
     },
     "@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz",
-      "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+      "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
       "dev": true
     },
     "@webassemblyjs/helper-api-error": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz",
-      "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
       "dev": true
     },
     "@webassemblyjs/helper-buffer": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz",
-      "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+      "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
       "dev": true
     },
     "@webassemblyjs/helper-code-frame": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz",
-      "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/wast-printer": "1.8.5"
+        "@webassemblyjs/wast-printer": "1.9.0"
       }
     },
     "@webassemblyjs/helper-fsm": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz",
-      "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
       "dev": true
     },
     "@webassemblyjs/helper-module-context": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz",
-      "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "mamacro": "^0.0.3"
+        "@webassemblyjs/ast": "1.9.0"
       }
     },
     "@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz",
-      "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
       "dev": true
     },
     "@webassemblyjs/helper-wasm-section": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz",
-      "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+      "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-buffer": "1.8.5",
-        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
-        "@webassemblyjs/wasm-gen": "1.8.5"
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0"
       }
     },
     "@webassemblyjs/ieee754": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz",
-      "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+      "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
       "dev": true,
       "requires": {
         "@xtuc/ieee754": "^1.2.0"
       }
     },
     "@webassemblyjs/leb128": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz",
-      "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+      "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
       "dev": true,
       "requires": {
         "@xtuc/long": "4.2.2"
       }
     },
     "@webassemblyjs/utf8": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz",
-      "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+      "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
       "dev": true
     },
     "@webassemblyjs/wasm-edit": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz",
-      "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+      "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-buffer": "1.8.5",
-        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
-        "@webassemblyjs/helper-wasm-section": "1.8.5",
-        "@webassemblyjs/wasm-gen": "1.8.5",
-        "@webassemblyjs/wasm-opt": "1.8.5",
-        "@webassemblyjs/wasm-parser": "1.8.5",
-        "@webassemblyjs/wast-printer": "1.8.5"
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/helper-wasm-section": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-opt": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "@webassemblyjs/wast-printer": "1.9.0"
       }
     },
     "@webassemblyjs/wasm-gen": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz",
-      "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+      "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
-        "@webassemblyjs/ieee754": "1.8.5",
-        "@webassemblyjs/leb128": "1.8.5",
-        "@webassemblyjs/utf8": "1.8.5"
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
       }
     },
     "@webassemblyjs/wasm-opt": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz",
-      "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+      "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-buffer": "1.8.5",
-        "@webassemblyjs/wasm-gen": "1.8.5",
-        "@webassemblyjs/wasm-parser": "1.8.5"
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0"
       }
     },
     "@webassemblyjs/wasm-parser": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz",
-      "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+      "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-api-error": "1.8.5",
-        "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
-        "@webassemblyjs/ieee754": "1.8.5",
-        "@webassemblyjs/leb128": "1.8.5",
-        "@webassemblyjs/utf8": "1.8.5"
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
       }
     },
     "@webassemblyjs/wast-parser": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz",
-      "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/floating-point-hex-parser": "1.8.5",
-        "@webassemblyjs/helper-api-error": "1.8.5",
-        "@webassemblyjs/helper-code-frame": "1.8.5",
-        "@webassemblyjs/helper-fsm": "1.8.5",
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-code-frame": "1.9.0",
+        "@webassemblyjs/helper-fsm": "1.9.0",
         "@xtuc/long": "4.2.2"
       }
     },
     "@webassemblyjs/wast-printer": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz",
-      "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/wast-parser": "1.8.5",
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0",
         "@xtuc/long": "4.2.2"
       }
     },
@@ -1896,45 +1986,49 @@
         "through": ">=2.2.7 <3"
       }
     },
+    "abab": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
+      "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
+      "dev": true
+    },
     "accepts": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
-      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
       "dev": true,
       "requires": {
-        "mime-types": "~2.1.18",
-        "negotiator": "0.6.1"
-      },
-      "dependencies": {
-        "mime-db": {
-          "version": "1.37.0",
-          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
-          "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
-          "dev": true
-        },
-        "mime-types": {
-          "version": "2.1.21",
-          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
-          "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
-          "dev": true,
-          "requires": {
-            "mime-db": "~1.37.0"
-          }
-        }
+        "mime-types": "~2.1.24",
+        "negotiator": "0.6.2"
       }
     },
+    "ace-builds": {
+      "version": "1.4.12",
+      "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.4.12.tgz",
+      "integrity": "sha512-G+chJctFPiiLGvs3+/Mly3apXTcfgE45dT5yp12BcWZ1kUs+gm0qd3/fv4gsz6fVag4mM0moHVpjHDIgph6Psg=="
+    },
     "acorn": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.7.tgz",
-      "integrity": "sha512-HNJNgE60C9eOTgn974Tlp3dpLZdUr+SoxxDwPaY9J/kDNOLQTkaDgwBUXAF4SSsrAwD9RpdxuHK/EbuF+W9Ahw==",
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+      "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
       "dev": true
     },
     "acorn-walk": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
-      "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
       "dev": true
     },
+    "adjust-sourcemap-loader": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz",
+      "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^2.0.0",
+        "regex-parser": "^2.2.11"
+      }
+    },
     "agent-base": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
@@ -1953,13 +2047,23 @@
         "humanize-ms": "^1.2.1"
       }
     },
-    "ajv": {
-      "version": "6.10.2",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
-      "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+    "aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
       "dev": true,
       "requires": {
-        "fast-deep-equal": "^2.0.1",
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      }
+    },
+    "ajv": {
+      "version": "6.12.4",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+      "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+      "dev": true,
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
         "json-schema-traverse": "^0.4.1",
         "uri-js": "^4.2.2"
@@ -1972,15 +2076,15 @@
       "dev": true
     },
     "ajv-keywords": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
-      "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
       "dev": true
     },
-    "amdefine": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
-      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
       "dev": true
     },
     "ansi-colors": {
@@ -1990,12 +2094,12 @@
       "dev": true
     },
     "ansi-escapes": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz",
-      "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==",
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+      "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
       "dev": true,
       "requires": {
-        "type-fest": "^0.5.2"
+        "type-fest": "^0.11.0"
       }
     },
     "ansi-html": {
@@ -2005,34 +2109,32 @@
       "dev": true
     },
     "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
     },
     "ansi-styles": {
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
       "requires": {
         "color-convert": "^1.9.0"
       }
     },
     "anymatch": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
       "dev": true,
       "requires": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
       }
     },
     "app-root-path": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz",
-      "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz",
+      "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==",
       "dev": true
     },
     "aproba": {
@@ -2042,15 +2144,15 @@
       "dev": true
     },
     "arg": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz",
-      "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==",
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
       "dev": true
     },
     "argparse": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
-      "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
       "dev": true,
       "requires": {
         "sprintf-js": "~1.0.2"
@@ -2066,6 +2168,12 @@
         "commander": "^2.11.0"
       }
     },
+    "arity-n": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz",
+      "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=",
+      "dev": true
+    },
     "arr-diff": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
@@ -2091,13 +2199,10 @@
       "dev": true
     },
     "array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dev": true,
-      "requires": {
-        "array-uniq": "^1.0.1"
-      }
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "dev": true
     },
     "array-uniq": {
       "version": "1.0.3",
@@ -2127,14 +2232,23 @@
       }
     },
     "asn1.js": {
-      "version": "4.10.1",
-      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
-      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
       "dev": true,
       "requires": {
         "bn.js": "^4.0.0",
         "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
+        "minimalistic-assert": "^1.0.0",
+        "safer-buffer": "^2.1.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "assert": {
@@ -2192,9 +2306,9 @@
       }
     },
     "async-each": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
-      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
       "dev": true
     },
     "async-limiter": {
@@ -2216,18 +2330,18 @@
       "dev": true
     },
     "autoprefixer": {
-      "version": "9.6.1",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz",
-      "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==",
+      "version": "9.8.6",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
+      "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.6.3",
-        "caniuse-lite": "^1.0.30000980",
-        "chalk": "^2.4.2",
+        "browserslist": "^4.12.0",
+        "caniuse-lite": "^1.0.30001109",
+        "colorette": "^1.2.1",
         "normalize-range": "^0.1.2",
         "num2fraction": "^1.2.2",
-        "postcss": "^7.0.17",
-        "postcss-value-parser": "^4.0.0"
+        "postcss": "^7.0.32",
+        "postcss-value-parser": "^4.1.0"
       }
     },
     "aws-sign2": {
@@ -2237,9 +2351,9 @@
       "dev": true
     },
     "aws4": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
-      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+      "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
       "dev": true
     },
     "axobject-query": {
@@ -2251,179 +2365,65 @@
         "ast-types-flow": "0.0.7"
       }
     },
-    "babel-code-frame": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
-      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+    "babel-loader": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
+      "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
       "dev": true,
       "requires": {
-        "chalk": "^1.1.3",
-        "esutils": "^2.0.2",
-        "js-tokens": "^3.0.2"
+        "find-cache-dir": "^2.1.0",
+        "loader-utils": "^1.4.0",
+        "mkdirp": "^0.5.3",
+        "pify": "^4.0.1",
+        "schema-utils": "^2.6.5"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+        "find-cache-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+          "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
           "dev": true,
           "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
+            "commondir": "^1.0.1",
+            "make-dir": "^2.0.0",
+            "pkg-dir": "^3.0.0"
           }
         },
-        "js-tokens": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
-          "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
-          "dev": true
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
         },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
         }
       }
     },
-    "babel-generator": {
-      "version": "6.26.1",
-      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
-      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
-      "dev": true,
-      "requires": {
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "detect-indent": "^4.0.0",
-        "jsesc": "^1.3.0",
-        "lodash": "^4.17.4",
-        "source-map": "^0.5.7",
-        "trim-right": "^1.0.1"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
-          "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
-          "dev": true
-        }
-      }
-    },
-    "babel-messages": {
-      "version": "6.23.0",
-      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
-      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
     "babel-plugin-dynamic-import-node": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
-      "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
       "dev": true,
       "requires": {
         "object.assign": "^4.1.0"
       }
     },
-    "babel-runtime": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
-      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-      "dev": true,
-      "requires": {
-        "core-js": "^2.4.0",
-        "regenerator-runtime": "^0.11.0"
-      },
-      "dependencies": {
-        "core-js": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
-          "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==",
-          "dev": true
-        },
-        "regenerator-runtime": {
-          "version": "0.11.1",
-          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-          "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
-          "dev": true
-        }
-      }
-    },
-    "babel-template": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
-      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "lodash": "^4.17.4"
-      }
-    },
-    "babel-traverse": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
-      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "^6.26.0",
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "debug": "^2.6.8",
-        "globals": "^9.18.0",
-        "invariant": "^2.2.2",
-        "lodash": "^4.17.4"
-      },
-      "dependencies": {
-        "globals": {
-          "version": "9.18.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
-          "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
-          "dev": true
-        }
-      }
-    },
-    "babel-types": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
-      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.4",
-        "to-fast-properties": "^1.0.3"
-      },
-      "dependencies": {
-        "to-fast-properties": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
-          "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
-          "dev": true
-        }
-      }
-    },
-    "babylon": {
-      "version": "6.18.0",
-      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
-      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
-      "dev": true
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
     },
     "base": {
       "version": "0.11.2",
@@ -2440,12 +2440,6 @@
         "pascalcase": "^0.1.1"
       },
       "dependencies": {
-        "component-emitter": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
-          "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
-          "dev": true
-        },
         "define-property": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
@@ -2483,18 +2477,6 @@
             "is-data-descriptor": "^1.0.0",
             "kind-of": "^6.0.2"
           }
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
-        },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
-          "dev": true
         }
       }
     },
@@ -2529,14 +2511,6 @@
         "check-types": "^8.0.3",
         "hoopy": "^0.1.4",
         "tryer": "^1.0.1"
-      },
-      "dependencies": {
-        "bluebird": {
-          "version": "3.5.5",
-          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
-          "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
-          "dev": true
-        }
       }
     },
     "big.js": {
@@ -2546,21 +2520,21 @@
       "dev": true
     },
     "binary-extensions": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz",
-      "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
       "dev": true
     },
     "bluebird": {
-      "version": "3.5.5",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
-      "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
       "dev": true
     },
     "bn.js": {
-      "version": "4.11.8",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
-      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz",
+      "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==",
       "dev": true
     },
     "body-parser": {
@@ -2587,41 +2561,28 @@
           "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
           "dev": true
         },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-          "dev": true
-        },
-        "http-errors": {
-          "version": "1.7.2",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
-          "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
           "dev": true,
           "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.3",
-            "setprototypeof": "1.1.1",
-            "statuses": ">= 1.5.0 < 2",
-            "toidentifier": "1.0.0"
+            "ms": "2.0.0"
           }
         },
-        "qs": {
-          "version": "6.7.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
-          "dev": true
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
         },
-        "setprototypeof": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
-          "dev": true
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
           "dev": true
         }
       }
@@ -2640,51 +2601,33 @@
         "multicast-dns-service-types": "^1.1.0"
       }
     },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "dev": true
+    },
+    "brace": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/brace/-/brace-0.11.1.tgz",
+      "integrity": "sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg="
+    },
     "brace-expansion": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
-      "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
-      "dev": true,
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "requires": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
-      },
-      "dependencies": {
-        "balanced-match": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-          "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-          "dev": true
-        }
       }
     },
     "braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
       "dev": true,
       "requires": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
+        "fill-range": "^7.0.1"
       }
     },
     "brorand": {
@@ -2728,14 +2671,6 @@
         "des.js": "^1.0.0",
         "inherits": "^2.0.1",
         "safe-buffer": "^5.1.2"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
-          "dev": true
-        }
       }
     },
     "browserify-rsa": {
@@ -2746,21 +2681,50 @@
       "requires": {
         "bn.js": "^4.1.0",
         "randombytes": "^2.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "browserify-sign": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
-      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+      "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
       "dev": true,
       "requires": {
-        "bn.js": "^4.1.1",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.2",
-        "elliptic": "^6.0.0",
-        "inherits": "^2.0.1",
-        "parse-asn1": "^5.0.0"
+        "bn.js": "^5.1.1",
+        "browserify-rsa": "^4.0.1",
+        "create-hash": "^1.2.0",
+        "create-hmac": "^1.1.7",
+        "elliptic": "^6.5.3",
+        "inherits": "^2.0.4",
+        "parse-asn1": "^5.1.5",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        }
       }
     },
     "browserify-zlib": {
@@ -2773,20 +2737,21 @@
       }
     },
     "browserslist": {
-      "version": "4.6.6",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz",
-      "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==",
+      "version": "4.14.6",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.6.tgz",
+      "integrity": "sha512-zeFYcUo85ENhc/zxHbiIp0LGzzTrE2Pv2JhxvS7kpUb9Q9D38kUX6Bie7pGutJ/5iF5rOxE7CepAuWD56xJ33A==",
       "dev": true,
       "requires": {
-        "caniuse-lite": "^1.0.30000984",
-        "electron-to-chromium": "^1.3.191",
-        "node-releases": "^1.1.25"
+        "caniuse-lite": "^1.0.30001154",
+        "electron-to-chromium": "^1.3.585",
+        "escalade": "^3.1.1",
+        "node-releases": "^1.1.65"
       }
     },
     "buffer": {
-      "version": "4.9.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
-      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+      "version": "4.9.2",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
+      "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
       "dev": true,
       "requires": {
         "base64-js": "^1.0.2",
@@ -2837,32 +2802,34 @@
       "dev": true
     },
     "cacache": {
-      "version": "12.0.2",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz",
-      "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==",
+      "version": "15.0.5",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz",
+      "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
       "dev": true,
       "requires": {
-        "bluebird": "^3.5.5",
-        "chownr": "^1.1.1",
-        "figgy-pudding": "^3.5.1",
+        "@npmcli/move-file": "^1.0.1",
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
         "glob": "^7.1.4",
-        "graceful-fs": "^4.1.15",
-        "infer-owner": "^1.0.3",
-        "lru-cache": "^5.1.1",
-        "mississippi": "^3.0.0",
-        "mkdirp": "^0.5.1",
-        "move-concurrently": "^1.0.1",
+        "infer-owner": "^1.0.4",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.1",
+        "minipass-collect": "^1.0.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.2",
+        "mkdirp": "^1.0.3",
+        "p-map": "^4.0.0",
         "promise-inflight": "^1.0.1",
-        "rimraf": "^2.6.3",
-        "ssri": "^6.0.1",
-        "unique-filename": "^1.1.1",
-        "y18n": "^4.0.0"
+        "rimraf": "^3.0.2",
+        "ssri": "^8.0.0",
+        "tar": "^6.0.2",
+        "unique-filename": "^1.1.1"
       },
       "dependencies": {
         "glob": {
-          "version": "7.1.4",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
-          "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -2873,10 +2840,10 @@
             "path-is-absolute": "^1.0.0"
           }
         },
-        "graceful-fs": {
-          "version": "4.2.2",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
-          "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
           "dev": true
         }
       }
@@ -2896,20 +2863,16 @@
         "to-object-path": "^0.3.0",
         "union-value": "^1.0.0",
         "unset-value": "^1.0.0"
-      },
-      "dependencies": {
-        "component-emitter": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
-          "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
-          "dev": true
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
-        }
+      }
+    },
+    "call-bind": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz",
+      "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.0"
       }
     },
     "caller-callsite": {
@@ -2939,13 +2902,24 @@
     "camelcase": {
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+    },
+    "caniuse-api": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+      "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-lite": "^1.0.0",
+        "lodash.memoize": "^4.1.2",
+        "lodash.uniq": "^4.5.0"
+      }
     },
     "caniuse-lite": {
-      "version": "1.0.30000989",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz",
-      "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==",
+      "version": "1.0.30001156",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001156.tgz",
+      "integrity": "sha512-z7qztybA2eFZTB6Z3yvaQBIoJpQtsewRD74adw2UbRWwsRq3jIPvgrQGawBMbfafekQaD21FWuXNcywtTDGGCw==",
       "dev": true
     },
     "canonical-path": {
@@ -2964,7 +2938,6 @@
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
       "requires": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -2984,107 +2957,25 @@
       "dev": true
     },
     "chokidar": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.1.1.tgz",
-      "integrity": "sha512-df4o16uZmMHzVQwECZRHwfguOt5ixpuQVaZHjYMvYisgKhE+JXwcj/Tcr3+3bu/XeOJQ9ycYmzu7Mv8XrGxJDQ==",
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
+      "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
       "dev": true,
       "requires": {
-        "anymatch": "^3.1.0",
-        "braces": "^3.0.2",
-        "fsevents": "^2.0.6",
-        "glob-parent": "^5.0.0",
-        "is-binary-path": "^2.1.0",
-        "is-glob": "^4.0.1",
-        "normalize-path": "^3.0.0",
-        "readdirp": "^3.1.1"
-      },
-      "dependencies": {
-        "anymatch": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.0.tgz",
-          "integrity": "sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA==",
-          "dev": true,
-          "requires": {
-            "normalize-path": "^3.0.0",
-            "picomatch": "^2.0.4"
-          }
-        },
-        "binary-extensions": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
-          "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
-          "dev": true
-        },
-        "braces": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-          "dev": true,
-          "requires": {
-            "fill-range": "^7.0.1"
-          }
-        },
-        "fill-range": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-          "dev": true,
-          "requires": {
-            "to-regex-range": "^5.0.1"
-          }
-        },
-        "fsevents": {
-          "version": "2.0.7",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz",
-          "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==",
-          "dev": true,
-          "optional": true
-        },
-        "glob-parent": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
-          "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        },
-        "is-binary-path": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-          "dev": true,
-          "requires": {
-            "binary-extensions": "^2.0.0"
-          }
-        },
-        "is-number": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-          "dev": true
-        },
-        "normalize-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-          "dev": true
-        },
-        "to-regex-range": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-          "dev": true,
-          "requires": {
-            "is-number": "^7.0.0"
-          }
-        }
+        "anymatch": "~3.1.1",
+        "braces": "~3.0.2",
+        "fsevents": "~2.1.2",
+        "glob-parent": "~5.1.0",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.5.0"
       }
     },
     "chownr": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz",
-      "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
       "dev": true
     },
     "chrome-trace-event": {
@@ -3132,31 +3023,14 @@
           "requires": {
             "is-descriptor": "^0.1.0"
           }
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
         }
       }
     },
-    "clean-css": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
-      "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
-      "dev": true,
-      "requires": {
-        "source-map": "~0.6.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
+    "clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "dev": true
     },
     "cli-cursor": {
       "version": "3.1.0",
@@ -3167,38 +3041,26 @@
         "restore-cursor": "^3.1.0"
       }
     },
+    "cli-spinners": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz",
+      "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==",
+      "dev": true
+    },
     "cli-width": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
-      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+      "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
       "dev": true
     },
     "cliui": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
-      "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
-      "dev": true,
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
       "requires": {
-        "string-width": "^2.1.1",
-        "strip-ansi": "^4.0.0",
-        "wrap-ansi": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^3.0.0"
-          }
-        }
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^6.2.0"
       }
     },
     "clone": {
@@ -3207,54 +3069,51 @@
       "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
       "dev": true
     },
-    "clone-deep": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
-      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+    "coa": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+      "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
       "dev": true,
       "requires": {
-        "is-plain-object": "^2.0.4",
-        "kind-of": "^6.0.2",
-        "shallow-clone": "^3.0.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
-          "dev": true
-        }
+        "@types/q": "^1.5.1",
+        "chalk": "^2.4.1",
+        "q": "^1.1.2"
       }
     },
-    "co": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
-      "dev": true
-    },
-    "code-point-at": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
-      "dev": true
-    },
     "codelyzer": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.1.1.tgz",
-      "integrity": "sha512-t8ZLSZBUjVFOJVk4jASLgmTdKWK/0ZsQCnPXy6PXw1LWOOormQOVnyy4OYoiZ6rAWTrz60Obx+zA2t8xY53QzQ==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.1.tgz",
+      "integrity": "sha512-cOyGQgMdhnRYtW2xrJUNrNYDjEgwQ+BrE2y93Bwz3h4DJ6vJRLfupemU5N3pbYsUlBHJf0u1j1UGk+NLW4d97g==",
       "dev": true,
       "requires": {
-        "app-root-path": "^2.2.1",
+        "@angular/compiler": "9.0.0",
+        "@angular/core": "9.0.0",
+        "app-root-path": "^3.0.0",
         "aria-query": "^3.0.0",
-        "axobject-query": "^2.0.2",
+        "axobject-query": "2.0.2",
         "css-selector-tokenizer": "^0.7.1",
         "cssauron": "^1.4.0",
         "damerau-levenshtein": "^1.0.4",
+        "rxjs": "^6.5.3",
         "semver-dsl": "^1.0.1",
         "source-map": "^0.5.7",
-        "sprintf-js": "^1.1.2"
+        "sprintf-js": "^1.1.2",
+        "tslib": "^1.10.0",
+        "zone.js": "~0.10.3"
       },
       "dependencies": {
+        "@angular/compiler": {
+          "version": "9.0.0",
+          "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz",
+          "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==",
+          "dev": true
+        },
+        "@angular/core": {
+          "version": "9.0.0",
+          "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz",
+          "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==",
+          "dev": true
+        },
         "sprintf-js": {
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
@@ -3273,11 +3132,20 @@
         "object-visit": "^1.0.0"
       }
     },
+    "color": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz",
+      "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.1",
+        "color-string": "^1.5.4"
+      }
+    },
     "color-convert": {
       "version": "1.9.3",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
       "requires": {
         "color-name": "1.1.3"
       }
@@ -3285,7 +3153,22 @@
     "color-name": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+    },
+    "color-string": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz",
+      "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==",
+      "dev": true,
+      "requires": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "colorette": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+      "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
       "dev": true
     },
     "combined-stream": {
@@ -3298,9 +3181,9 @@
       }
     },
     "commander": {
-      "version": "2.17.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
-      "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
       "dev": true
     },
     "commondir": {
@@ -3309,13 +3192,28 @@
       "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
       "dev": true
     },
-    "compressible": {
-      "version": "2.0.17",
-      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz",
-      "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==",
+    "component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+      "dev": true
+    },
+    "compose-function": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz",
+      "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=",
       "dev": true,
       "requires": {
-        "mime-db": ">= 1.40.0 < 2"
+        "arity-n": "^1.0.4"
+      }
+    },
+    "compressible": {
+      "version": "2.0.18",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+      "dev": true,
+      "requires": {
+        "mime-db": ">= 1.43.0 < 2"
       }
     },
     "compression": {
@@ -3333,10 +3231,19 @@
         "vary": "~1.1.2"
       },
       "dependencies": {
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
           "dev": true
         }
       }
@@ -3344,8 +3251,7 @@
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
     },
     "concat-stream": {
       "version": "1.6.2",
@@ -3366,13 +3272,10 @@
       "dev": true
     },
     "console-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
-      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
-      "dev": true,
-      "requires": {
-        "date-now": "^0.1.4"
-      }
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+      "dev": true
     },
     "constants-browserify": {
       "version": "1.0.0",
@@ -3381,10 +3284,13 @@
       "dev": true
     },
     "content-disposition": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
-      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
-      "dev": true
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
     },
     "content-type": {
       "version": "1.0.4",
@@ -3393,18 +3299,17 @@
       "dev": true
     },
     "convert-source-map": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
-      "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
-      "dev": true,
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
       "requires": {
         "safe-buffer": "~5.1.1"
       }
     },
     "cookie": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
-      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
       "dev": true
     },
     "cookie-signature": {
@@ -3425,71 +3330,12 @@
         "mkdirp": "^0.5.1",
         "rimraf": "^2.5.4",
         "run-queue": "^1.0.0"
-      }
-    },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true
-    },
-    "copy-webpack-plugin": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.4.tgz",
-      "integrity": "sha512-YBuYGpSzoCHSSDGyHy6VJ7SHojKp6WHT4D7ItcQFNAYx2hrwkMe56e97xfVR0/ovDuMTrMffXUiltvQljtAGeg==",
-      "dev": true,
-      "requires": {
-        "cacache": "^11.3.3",
-        "find-cache-dir": "^2.1.0",
-        "glob-parent": "^3.1.0",
-        "globby": "^7.1.1",
-        "is-glob": "^4.0.1",
-        "loader-utils": "^1.2.3",
-        "minimatch": "^3.0.4",
-        "normalize-path": "^3.0.0",
-        "p-limit": "^2.2.0",
-        "schema-utils": "^1.0.0",
-        "serialize-javascript": "^1.7.0",
-        "webpack-log": "^2.0.0"
       },
       "dependencies": {
-        "cacache": {
-          "version": "11.3.3",
-          "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz",
-          "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==",
-          "dev": true,
-          "requires": {
-            "bluebird": "^3.5.5",
-            "chownr": "^1.1.1",
-            "figgy-pudding": "^3.5.1",
-            "glob": "^7.1.4",
-            "graceful-fs": "^4.1.15",
-            "lru-cache": "^5.1.1",
-            "mississippi": "^3.0.0",
-            "mkdirp": "^0.5.1",
-            "move-concurrently": "^1.0.1",
-            "promise-inflight": "^1.0.1",
-            "rimraf": "^2.6.3",
-            "ssri": "^6.0.1",
-            "unique-filename": "^1.1.1",
-            "y18n": "^4.0.0"
-          }
-        },
-        "find-cache-dir": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
-          "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
-          "dev": true,
-          "requires": {
-            "commondir": "^1.0.1",
-            "make-dir": "^2.0.0",
-            "pkg-dir": "^3.0.0"
-          }
-        },
         "glob": {
-          "version": "7.1.4",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
-          "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -3500,39 +3346,72 @@
             "path-is-absolute": "^1.0.0"
           }
         },
-        "graceful-fs": {
-          "version": "4.2.2",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
-          "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
-          "dev": true
-        },
-        "normalize-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-          "dev": true
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
+    "copy-webpack-plugin": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz",
+      "integrity": "sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA==",
+      "dev": true,
+      "requires": {
+        "cacache": "^15.0.4",
+        "fast-glob": "^3.2.4",
+        "find-cache-dir": "^3.3.1",
+        "glob-parent": "^5.1.1",
+        "globby": "^11.0.1",
+        "loader-utils": "^2.0.0",
+        "normalize-path": "^3.0.0",
+        "p-limit": "^3.0.1",
+        "schema-utils": "^2.7.0",
+        "serialize-javascript": "^4.0.0",
+        "webpack-sources": "^1.4.3"
+      },
+      "dependencies": {
+        "p-limit": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
+          "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
+          "dev": true,
+          "requires": {
+            "p-try": "^2.0.0"
+          }
         }
       }
     },
     "core-js": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz",
-      "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw=="
+      "version": "3.6.5",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
+      "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
     },
     "core-js-compat": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz",
-      "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==",
+      "version": "3.6.5",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
+      "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.6.6",
-        "semver": "^6.3.0"
+        "browserslist": "^4.8.5",
+        "semver": "7.0.0"
       },
       "dependencies": {
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
           "dev": true
         }
       }
@@ -3556,13 +3435,21 @@
       }
     },
     "create-ecdh": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
-      "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
       "dev": true,
       "requires": {
         "bn.js": "^4.1.0",
-        "elliptic": "^6.0.0"
+        "elliptic": "^6.5.3"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "create-hash": {
@@ -3603,14 +3490,6 @@
         "semver": "^5.5.0",
         "shebang-command": "^1.2.0",
         "which": "^1.2.9"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
-        }
       }
     },
     "crypto-browserify": {
@@ -3632,57 +3511,137 @@
         "randomfill": "^1.0.3"
       }
     },
+    "css": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
+      "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "source-map": "^0.6.1",
+        "source-map-resolve": "^0.5.2",
+        "urix": "^0.1.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "css-color-names": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+      "dev": true
+    },
+    "css-declaration-sorter": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
+      "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.1",
+        "timsort": "^0.3.0"
+      }
+    },
+    "css-loader": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.2.2.tgz",
+      "integrity": "sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^6.0.0",
+        "cssesc": "^3.0.0",
+        "icss-utils": "^4.1.1",
+        "loader-utils": "^2.0.0",
+        "postcss": "^7.0.32",
+        "postcss-modules-extract-imports": "^2.0.0",
+        "postcss-modules-local-by-default": "^3.0.3",
+        "postcss-modules-scope": "^2.2.0",
+        "postcss-modules-values": "^3.0.0",
+        "postcss-value-parser": "^4.1.0",
+        "schema-utils": "^2.7.0",
+        "semver": "^7.3.2"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+          "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+          "dev": true
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        }
+      }
+    },
     "css-parse": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz",
-      "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz",
+      "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=",
+      "dev": true,
+      "requires": {
+        "css": "^2.0.0"
+      }
+    },
+    "css-select": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+      "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+      "dev": true,
+      "requires": {
+        "boolbase": "^1.0.0",
+        "css-what": "^3.2.1",
+        "domutils": "^1.7.0",
+        "nth-check": "^1.0.2"
+      }
+    },
+    "css-select-base-adapter": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+      "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
       "dev": true
     },
     "css-selector-tokenizer": {
-      "version": "0.7.1",
-      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz",
-      "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==",
+      "version": "0.7.3",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz",
+      "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==",
       "dev": true,
       "requires": {
-        "cssesc": "^0.1.0",
-        "fastparse": "^1.1.1",
-        "regexpu-core": "^1.0.0"
+        "cssesc": "^3.0.0",
+        "fastparse": "^1.1.2"
+      }
+    },
+    "css-tree": {
+      "version": "1.0.0-alpha.37",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+      "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+      "dev": true,
+      "requires": {
+        "mdn-data": "2.0.4",
+        "source-map": "^0.6.1"
       },
       "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
-        },
-        "regexpu-core": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
-          "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
-          "dev": true,
-          "requires": {
-            "regenerate": "^1.2.1",
-            "regjsgen": "^0.2.0",
-            "regjsparser": "^0.1.4"
-          }
-        },
-        "regjsgen": {
-          "version": "0.2.0",
-          "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
-          "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
-          "dev": true
-        },
-        "regjsparser": {
-          "version": "0.1.5",
-          "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
-          "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
-          "dev": true,
-          "requires": {
-            "jsesc": "~0.5.0"
-          }
         }
       }
     },
+    "css-what": {
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+      "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
+      "dev": true
+    },
     "cssauron": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
@@ -3693,21 +3652,141 @@
       }
     },
     "cssesc": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
-      "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
       "dev": true
     },
+    "cssnano": {
+      "version": "4.1.10",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
+      "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.0",
+        "cssnano-preset-default": "^4.0.7",
+        "is-resolvable": "^1.0.0",
+        "postcss": "^7.0.0"
+      }
+    },
+    "cssnano-preset-default": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
+      "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
+      "dev": true,
+      "requires": {
+        "css-declaration-sorter": "^4.0.1",
+        "cssnano-util-raw-cache": "^4.0.1",
+        "postcss": "^7.0.0",
+        "postcss-calc": "^7.0.1",
+        "postcss-colormin": "^4.0.3",
+        "postcss-convert-values": "^4.0.1",
+        "postcss-discard-comments": "^4.0.2",
+        "postcss-discard-duplicates": "^4.0.2",
+        "postcss-discard-empty": "^4.0.1",
+        "postcss-discard-overridden": "^4.0.1",
+        "postcss-merge-longhand": "^4.0.11",
+        "postcss-merge-rules": "^4.0.3",
+        "postcss-minify-font-values": "^4.0.2",
+        "postcss-minify-gradients": "^4.0.2",
+        "postcss-minify-params": "^4.0.2",
+        "postcss-minify-selectors": "^4.0.2",
+        "postcss-normalize-charset": "^4.0.1",
+        "postcss-normalize-display-values": "^4.0.2",
+        "postcss-normalize-positions": "^4.0.2",
+        "postcss-normalize-repeat-style": "^4.0.2",
+        "postcss-normalize-string": "^4.0.2",
+        "postcss-normalize-timing-functions": "^4.0.2",
+        "postcss-normalize-unicode": "^4.0.1",
+        "postcss-normalize-url": "^4.0.1",
+        "postcss-normalize-whitespace": "^4.0.2",
+        "postcss-ordered-values": "^4.1.2",
+        "postcss-reduce-initial": "^4.0.3",
+        "postcss-reduce-transforms": "^4.0.2",
+        "postcss-svgo": "^4.0.2",
+        "postcss-unique-selectors": "^4.0.1"
+      }
+    },
+    "cssnano-util-get-arguments": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
+      "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
+      "dev": true
+    },
+    "cssnano-util-get-match": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
+      "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
+      "dev": true
+    },
+    "cssnano-util-raw-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
+      "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "cssnano-util-same-parent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
+      "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
+      "dev": true
+    },
+    "csso": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-4.1.0.tgz",
+      "integrity": "sha512-h+6w/W1WqXaJA4tb1dk7r5tVbOm97MsKxzwnvOR04UQ6GILroryjMWu3pmCCtL2mLaEStQ0fZgeGiy99mo7iyg==",
+      "dev": true,
+      "requires": {
+        "css-tree": "^1.0.0"
+      },
+      "dependencies": {
+        "css-tree": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0.tgz",
+          "integrity": "sha512-CdVYz/Yuqw0VdKhXPBIgi8DO3NicJVYZNWeX9XcIuSp9ZoFT5IcleVRW07O5rMjdcx1mb+MEJPknTTEW7DdsYw==",
+          "dev": true,
+          "requires": {
+            "mdn-data": "2.0.12",
+            "source-map": "^0.6.1"
+          }
+        },
+        "mdn-data": {
+          "version": "2.0.12",
+          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.12.tgz",
+          "integrity": "sha512-ULbAlgzVb8IqZ0Hsxm6hHSlQl3Jckst2YEQS7fODu9ilNWy2LvcoSY7TRFIktABP2mdppBioc66va90T+NUs8Q==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
     "cyclist": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
       "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
       "dev": true
     },
+    "d": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+      "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+      "dev": true,
+      "requires": {
+        "es5-ext": "^0.10.50",
+        "type": "^1.0.1"
+      }
+    },
     "damerau-levenshtein": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz",
-      "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
+      "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==",
       "dev": true
     },
     "dashdash": {
@@ -3719,24 +3798,28 @@
         "assert-plus": "^1.0.0"
       }
     },
+    "data-urls": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+      "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.3",
+        "whatwg-mimetype": "^2.3.0",
+        "whatwg-url": "^8.0.0"
+      }
+    },
     "date-fns": {
       "version": "1.30.1",
       "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz",
       "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw=="
     },
-    "date-now": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
-      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
-      "dev": true
-    },
     "debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+      "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
       "requires": {
-        "ms": "2.0.0"
+        "ms": "2.1.2"
       }
     },
     "debuglog": {
@@ -3748,8 +3831,7 @@
     "decamelize": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
     },
     "decode-uri-component": {
       "version": "0.2.0",
@@ -3758,9 +3840,9 @@
       "dev": true
     },
     "deep-equal": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz",
-      "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+      "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
       "dev": true,
       "requires": {
         "is-arguments": "^1.0.4",
@@ -3781,6 +3863,23 @@
         "ip-regex": "^2.1.0"
       }
     },
+    "defaults": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+      "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+      "dev": true,
+      "requires": {
+        "clone": "^1.0.2"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+          "dev": true
+        }
+      }
+    },
     "define-properties": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -3828,18 +3927,6 @@
             "is-data-descriptor": "^1.0.0",
             "kind-of": "^6.0.2"
           }
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
-        },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
-          "dev": true
         }
       }
     },
@@ -3858,6 +3945,15 @@
         "rimraf": "^2.6.3"
       },
       "dependencies": {
+        "array-union": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+          "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+          "dev": true,
+          "requires": {
+            "array-uniq": "^1.0.1"
+          }
+        },
         "globby": {
           "version": "6.1.0",
           "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
@@ -3878,6 +3974,37 @@
               "dev": true
             }
           }
+        },
+        "p-map": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+          "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          },
+          "dependencies": {
+            "glob": {
+              "version": "7.1.6",
+              "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+              "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+              "dev": true,
+              "requires": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.0.4",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+              }
+            }
+          }
         }
       }
     },
@@ -3888,9 +4015,9 @@
       "dev": true
     },
     "depd": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
-      "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
       "dev": true
     },
     "dependency-graph": {
@@ -3900,9 +4027,9 @@
       "dev": true
     },
     "des.js": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
-      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
       "dev": true,
       "requires": {
         "inherits": "^2.0.1",
@@ -3915,15 +4042,6 @@
       "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
       "dev": true
     },
-    "detect-indent": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
-      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
-      "dev": true,
-      "requires": {
-        "repeating": "^2.0.0"
-      }
-    },
     "detect-node": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
@@ -3941,9 +4059,9 @@
       }
     },
     "diff": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
-      "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
       "dev": true
     },
     "diffie-hellman": {
@@ -3955,15 +4073,23 @@
         "bn.js": "^4.1.0",
         "miller-rabin": "^4.0.0",
         "randombytes": "^2.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "dir-glob": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
-      "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
       "dev": true,
       "requires": {
-        "path-type": "^3.0.0"
+        "path-type": "^4.0.0"
       }
     },
     "dns-equal": {
@@ -3991,21 +4117,64 @@
         "buffer-indexof": "^1.0.0"
       }
     },
+    "dom-serializer": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "entities": "^2.0.0"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz",
+          "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==",
+          "dev": true
+        }
+      }
+    },
     "domain-browser": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
       "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
       "dev": true
     },
+    "domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "dev": true
+    },
     "domino": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.3.tgz",
-      "integrity": "sha512-EwjTbUv1Q/RLQOdn9k7ClHutrQcWGsfXaRQNOnM/KgK4xDBoLFEcIRFuBSxAx13Vfa63X029gXYrNFrSy+DOSg=="
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz",
+      "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ=="
+    },
+    "domutils": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "dot-prop": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+      "dev": true,
+      "requires": {
+        "is-obj": "^2.0.0"
+      }
     },
     "duplexer": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
-      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
       "dev": true
     },
     "duplexify": {
@@ -4037,21 +4206,21 @@
       "dev": true
     },
     "ejs": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz",
-      "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==",
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
+      "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==",
       "dev": true
     },
     "electron-to-chromium": {
-      "version": "1.3.264",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.264.tgz",
-      "integrity": "sha512-z8E7WkrrquCuGYv+kKyybuZIbdms+4PeHp7Zm2uIgEhAigP0bOwqXILItwj0YO73o+QyHY/7XtEfP5DsHOWQgQ==",
+      "version": "1.3.588",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.588.tgz",
+      "integrity": "sha512-0zr+ZfytnLeJZxGgmEpPTcItu5Mm4A5zHPZXLfHcGp0mdsk95rmD7ePNewYtK1yIdLbk8Z1U2oTRRfOtR4gbYg==",
       "dev": true
     },
     "elliptic": {
-      "version": "6.5.1",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz",
-      "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==",
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
+      "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
       "dev": true,
       "requires": {
         "bn.js": "^4.4.0",
@@ -4061,18 +4230,25 @@
         "inherits": "^2.0.1",
         "minimalistic-assert": "^1.0.0",
         "minimalistic-crypto-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-      "dev": true
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
     },
     "emojis-list": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
-      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
       "dev": true
     },
     "encodeurl": {
@@ -4082,34 +4258,40 @@
       "dev": true
     },
     "encoding": {
-      "version": "0.1.12",
-      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
-      "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
       "dev": true,
       "requires": {
-        "iconv-lite": "~0.4.13"
+        "iconv-lite": "^0.6.2"
       }
     },
     "end-of-stream": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
-      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
       "dev": true,
       "requires": {
         "once": "^1.4.0"
       }
     },
     "enhanced-resolve": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
-      "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
+      "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==",
       "dev": true,
       "requires": {
         "graceful-fs": "^4.1.2",
-        "memory-fs": "^0.4.0",
+        "memory-fs": "^0.5.0",
         "tapable": "^1.0.0"
       }
     },
+    "entities": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+      "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+      "dev": true
+    },
     "err-code": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz",
@@ -4135,27 +4317,28 @@
       }
     },
     "es-abstract": {
-      "version": "1.14.2",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz",
-      "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==",
+      "version": "1.17.7",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+      "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
       "dev": true,
       "requires": {
-        "es-to-primitive": "^1.2.0",
+        "es-to-primitive": "^1.2.1",
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
-        "has-symbols": "^1.0.0",
-        "is-callable": "^1.1.4",
-        "is-regex": "^1.0.4",
-        "object-inspect": "^1.6.0",
+        "has-symbols": "^1.0.1",
+        "is-callable": "^1.2.2",
+        "is-regex": "^1.1.1",
+        "object-inspect": "^1.8.0",
         "object-keys": "^1.1.1",
-        "string.prototype.trimleft": "^2.0.0",
-        "string.prototype.trimright": "^2.0.0"
+        "object.assign": "^4.1.1",
+        "string.prototype.trimend": "^1.0.1",
+        "string.prototype.trimstart": "^1.0.1"
       }
     },
     "es-to-primitive": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
-      "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
       "dev": true,
       "requires": {
         "is-callable": "^1.1.4",
@@ -4163,6 +4346,28 @@
         "is-symbol": "^1.0.2"
       }
     },
+    "es5-ext": {
+      "version": "0.10.53",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
+      "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
+      "dev": true,
+      "requires": {
+        "es6-iterator": "~2.0.3",
+        "es6-symbol": "~3.1.3",
+        "next-tick": "~1.0.0"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+      "dev": true,
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
     "es6-promise": {
       "version": "4.2.8",
       "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
@@ -4178,6 +4383,22 @@
         "es6-promise": "^4.0.3"
       }
     },
+    "es6-symbol": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+      "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+      "dev": true,
+      "requires": {
+        "d": "^1.0.1",
+        "ext": "^1.1.2"
+      }
+    },
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "dev": true
+    },
     "escape-html": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -4187,8 +4408,7 @@
     "escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
     },
     "eslint-scope": {
       "version": "4.0.3",
@@ -4207,12 +4427,20 @@
       "dev": true
     },
     "esrecurse": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
       "dev": true,
       "requires": {
-        "estraverse": "^4.1.0"
+        "estraverse": "^5.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+          "dev": true
+        }
       }
     },
     "estraverse": {
@@ -4222,9 +4450,9 @@
       "dev": true
     },
     "esutils": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
       "dev": true
     },
     "etag": {
@@ -4234,15 +4462,15 @@
       "dev": true
     },
     "eventemitter3": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz",
-      "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==",
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
       "dev": true
     },
     "events": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz",
-      "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+      "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
       "dev": true
     },
     "eventsource": {
@@ -4294,6 +4522,15 @@
         "to-regex": "^3.0.1"
       },
       "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
         "define-property": {
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
@@ -4311,43 +4548,49 @@
           "requires": {
             "is-extendable": "^0.1.0"
           }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
         }
       }
     },
     "express": {
-      "version": "4.16.4",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
-      "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
+      "version": "4.17.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
       "dev": true,
       "requires": {
-        "accepts": "~1.3.5",
+        "accepts": "~1.3.7",
         "array-flatten": "1.1.1",
-        "body-parser": "1.18.3",
-        "content-disposition": "0.5.2",
+        "body-parser": "1.19.0",
+        "content-disposition": "0.5.3",
         "content-type": "~1.0.4",
-        "cookie": "0.3.1",
+        "cookie": "0.4.0",
         "cookie-signature": "1.0.6",
         "debug": "2.6.9",
         "depd": "~1.1.2",
         "encodeurl": "~1.0.2",
         "escape-html": "~1.0.3",
         "etag": "~1.8.1",
-        "finalhandler": "1.1.1",
+        "finalhandler": "~1.1.2",
         "fresh": "0.5.2",
         "merge-descriptors": "1.0.1",
         "methods": "~1.1.2",
         "on-finished": "~2.3.0",
-        "parseurl": "~1.3.2",
+        "parseurl": "~1.3.3",
         "path-to-regexp": "0.1.7",
-        "proxy-addr": "~2.0.4",
-        "qs": "6.5.2",
-        "range-parser": "~1.2.0",
+        "proxy-addr": "~2.0.5",
+        "qs": "6.7.0",
+        "range-parser": "~1.2.1",
         "safe-buffer": "5.1.2",
-        "send": "0.16.2",
-        "serve-static": "1.13.2",
-        "setprototypeof": "1.1.0",
-        "statuses": "~1.4.0",
-        "type-is": "~1.6.16",
+        "send": "0.17.1",
+        "serve-static": "1.14.1",
+        "setprototypeof": "1.1.1",
+        "statuses": "~1.5.0",
+        "type-is": "~1.6.18",
         "utils-merge": "1.0.1",
         "vary": "~1.1.2"
       },
@@ -4358,111 +4601,37 @@
           "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
           "dev": true
         },
-        "body-parser": {
-          "version": "1.18.3",
-          "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
-          "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
           "dev": true,
           "requires": {
-            "bytes": "3.0.0",
-            "content-type": "~1.0.4",
-            "debug": "2.6.9",
-            "depd": "~1.1.2",
-            "http-errors": "~1.6.3",
-            "iconv-lite": "0.4.23",
-            "on-finished": "~2.3.0",
-            "qs": "6.5.2",
-            "raw-body": "2.3.3",
-            "type-is": "~1.6.16"
+            "ms": "2.0.0"
           }
         },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
           "dev": true
-        },
-        "encodeurl": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-          "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+        }
+      }
+    },
+    "ext": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
+      "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
+      "dev": true,
+      "requires": {
+        "type": "^2.0.0"
+      },
+      "dependencies": {
+        "type": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz",
+          "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==",
           "dev": true
-        },
-        "http-errors": {
-          "version": "1.6.3",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
-          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
-          "dev": true,
-          "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.3",
-            "setprototypeof": "1.1.0",
-            "statuses": ">= 1.4.0 < 2"
-          }
-        },
-        "iconv-lite": {
-          "version": "0.4.23",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
-          "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
-          "dev": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "mime-db": {
-          "version": "1.37.0",
-          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
-          "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
-          "dev": true
-        },
-        "mime-types": {
-          "version": "2.1.21",
-          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
-          "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
-          "dev": true,
-          "requires": {
-            "mime-db": "~1.37.0"
-          }
-        },
-        "qs": {
-          "version": "6.5.2",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
-          "dev": true
-        },
-        "raw-body": {
-          "version": "2.3.3",
-          "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
-          "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
-          "dev": true,
-          "requires": {
-            "bytes": "3.0.0",
-            "http-errors": "1.6.3",
-            "iconv-lite": "0.4.23",
-            "unpipe": "1.0.0"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
-        },
-        "statuses": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-          "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
-          "dev": true
-        },
-        "type-is": {
-          "version": "1.6.16",
-          "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
-          "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
-          "dev": true,
-          "requires": {
-            "media-typer": "0.3.0",
-            "mime-types": "~2.1.18"
-          }
         }
       }
     },
@@ -4502,6 +4671,17 @@
         "chardet": "^0.7.0",
         "iconv-lite": "^0.4.24",
         "tmp": "^0.0.33"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        }
       }
     },
     "extglob": {
@@ -4566,12 +4746,6 @@
             "is-data-descriptor": "^1.0.0",
             "kind-of": "^6.0.2"
           }
-        },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
-          "dev": true
         }
       }
     },
@@ -4582,15 +4756,29 @@
       "dev": true
     },
     "fast-deep-equal": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
       "dev": true
     },
+    "fast-glob": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+      "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.0",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.2",
+        "picomatch": "^2.2.1"
+      }
+    },
     "fast-json-stable-stringify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
       "dev": true
     },
     "fastparse": {
@@ -4599,6 +4787,15 @@
       "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
       "dev": true
     },
+    "fastq": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz",
+      "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.4"
+      }
+    },
     "faye-websocket": {
       "version": "0.10.0",
       "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
@@ -4609,40 +4806,28 @@
       }
     },
     "figgy-pudding": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
-      "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==",
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
       "dev": true
     },
     "figures": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz",
-      "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
       "dev": true,
       "requires": {
         "escape-string-regexp": "^1.0.5"
       }
     },
     "file-loader": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz",
-      "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz",
+      "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==",
       "dev": true,
       "requires": {
-        "loader-utils": "^1.2.3",
-        "schema-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "schema-utils": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.2.0.tgz",
-          "integrity": "sha512-5EwsCNhfFTZvUreQhx/4vVQpJ/lnCAkgoIHLhSpp4ZirE+4hzFvdJi0FMub6hxbFVBJYSpeVVmon+2e7uEGRrA==",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.10.2",
-            "ajv-keywords": "^3.4.1"
-          }
-        }
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^2.6.5"
       }
     },
     "filesize": {
@@ -4652,111 +4837,66 @@
       "dev": true
     },
     "fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
       "dev": true,
       "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
+        "to-regex-range": "^5.0.1"
       }
     },
     "finalhandler": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
-      "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
       "dev": true,
       "requires": {
         "debug": "2.6.9",
         "encodeurl": "~1.0.2",
         "escape-html": "~1.0.3",
         "on-finished": "~2.3.0",
-        "parseurl": "~1.3.2",
-        "statuses": "~1.4.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
         "unpipe": "~1.0.0"
       },
       "dependencies": {
-        "encodeurl": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-          "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
-          "dev": true
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
         },
-        "statuses": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-          "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
           "dev": true
         }
       }
     },
     "find-cache-dir": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz",
-      "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
+      "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
       "dev": true,
       "requires": {
         "commondir": "^1.0.1",
-        "make-dir": "^3.0.0",
+        "make-dir": "^3.0.2",
         "pkg-dir": "^4.1.0"
       },
       "dependencies": {
-        "find-up": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^5.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^4.1.0"
-          }
-        },
         "make-dir": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz",
-          "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==",
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
           "dev": true,
           "requires": {
             "semver": "^6.0.0"
           }
         },
-        "p-locate": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.2.0"
-          }
-        },
-        "path-exists": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-          "dev": true
-        },
         "pkg-dir": {
           "version": "4.2.0",
           "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -4775,12 +4915,12 @@
       }
     },
     "find-up": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-      "dev": true,
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
       "requires": {
-        "locate-path": "^3.0.0"
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
       }
     },
     "flush-write-stream": {
@@ -4791,65 +4931,13 @@
       "requires": {
         "inherits": "^2.0.3",
         "readable-stream": "^2.3.6"
-      },
-      "dependencies": {
-        "process-nextick-args": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-          "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-          "dev": true
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
       }
     },
     "follow-redirects": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz",
-      "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==",
-      "dev": true,
-      "requires": {
-        "debug": "^3.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
-      }
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
+      "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==",
+      "dev": true
     },
     "for-in": {
       "version": "1.0.2",
@@ -4905,13 +4993,24 @@
         "readable-stream": "^2.0.0"
       }
     },
-    "fs-minipass": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
-      "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+    "fs-extra": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz",
+      "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=",
       "dev": true,
       "requires": {
-        "minipass": "^2.6.0"
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      }
+    },
+    "fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
       }
     },
     "fs-write-stream-atomic": {
@@ -4929,628 +5028,19 @@
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
     },
     "fsevents": {
-      "version": "1.2.9",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
-      "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
       "dev": true,
-      "optional": true,
-      "requires": {
-        "nan": "^2.12.1",
-        "node-pre-gyp": "^0.12.0"
-      },
-      "dependencies": {
-        "abbrev": {
-          "version": "1.1.1",
-          "resolved": false,
-          "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-          "dev": true,
-          "optional": true
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "resolved": false,
-          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-          "dev": true,
-          "optional": true
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "resolved": false,
-          "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
-          "dev": true,
-          "optional": true
-        },
-        "are-we-there-yet": {
-          "version": "1.1.5",
-          "resolved": false,
-          "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "delegates": "^1.0.0",
-            "readable-stream": "^2.0.6"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.0",
-          "resolved": false,
-          "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-          "dev": true,
-          "optional": true
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "resolved": false,
-          "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "chownr": {
-          "version": "1.1.1",
-          "resolved": false,
-          "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
-          "dev": true,
-          "optional": true
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "resolved": false,
-          "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
-          "dev": true,
-          "optional": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "resolved": false,
-          "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-          "dev": true,
-          "optional": true
-        },
-        "console-control-strings": {
-          "version": "1.1.0",
-          "resolved": false,
-          "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
-          "dev": true,
-          "optional": true
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "resolved": false,
-          "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-          "dev": true,
-          "optional": true
-        },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": false,
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "deep-extend": {
-          "version": "0.6.0",
-          "resolved": false,
-          "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
-          "dev": true,
-          "optional": true
-        },
-        "delegates": {
-          "version": "1.0.0",
-          "resolved": false,
-          "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
-          "dev": true,
-          "optional": true
-        },
-        "detect-libc": {
-          "version": "1.0.3",
-          "resolved": false,
-          "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
-          "dev": true,
-          "optional": true
-        },
-        "fs-minipass": {
-          "version": "1.2.5",
-          "resolved": false,
-          "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "resolved": false,
-          "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-          "dev": true,
-          "optional": true
-        },
-        "gauge": {
-          "version": "2.7.4",
-          "resolved": false,
-          "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "aproba": "^1.0.3",
-            "console-control-strings": "^1.0.0",
-            "has-unicode": "^2.0.0",
-            "object-assign": "^4.1.0",
-            "signal-exit": "^3.0.0",
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wide-align": "^1.1.0"
-          }
-        },
-        "glob": {
-          "version": "7.1.3",
-          "resolved": false,
-          "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "has-unicode": {
-          "version": "2.0.1",
-          "resolved": false,
-          "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
-          "dev": true,
-          "optional": true
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "resolved": false,
-          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "ignore-walk": {
-          "version": "3.0.1",
-          "resolved": false,
-          "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimatch": "^3.0.4"
-          }
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "resolved": false,
-          "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "once": "^1.3.0",
-            "wrappy": "1"
-          }
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": false,
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-          "dev": true,
-          "optional": true
-        },
-        "ini": {
-          "version": "1.3.5",
-          "resolved": false,
-          "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
-          "dev": true,
-          "optional": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "resolved": false,
-          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": false,
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-          "dev": true,
-          "optional": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "resolved": false,
-          "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "0.0.8",
-          "resolved": false,
-          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
-          "dev": true,
-          "optional": true
-        },
-        "minipass": {
-          "version": "2.3.5",
-          "resolved": false,
-          "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.0"
-          }
-        },
-        "minizlib": {
-          "version": "1.2.1",
-          "resolved": false,
-          "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.1",
-          "resolved": false,
-          "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimist": "0.0.8"
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "resolved": false,
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
-          "dev": true,
-          "optional": true
-        },
-        "needle": {
-          "version": "2.3.0",
-          "resolved": false,
-          "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "debug": "^4.1.0",
-            "iconv-lite": "^0.4.4",
-            "sax": "^1.2.4"
-          }
-        },
-        "node-pre-gyp": {
-          "version": "0.12.0",
-          "resolved": false,
-          "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "detect-libc": "^1.0.2",
-            "mkdirp": "^0.5.1",
-            "needle": "^2.2.1",
-            "nopt": "^4.0.1",
-            "npm-packlist": "^1.1.6",
-            "npmlog": "^4.0.2",
-            "rc": "^1.2.7",
-            "rimraf": "^2.6.1",
-            "semver": "^5.3.0",
-            "tar": "^4"
-          }
-        },
-        "nopt": {
-          "version": "4.0.1",
-          "resolved": false,
-          "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "abbrev": "1",
-            "osenv": "^0.1.4"
-          }
-        },
-        "npm-bundled": {
-          "version": "1.0.6",
-          "resolved": false,
-          "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==",
-          "dev": true,
-          "optional": true
-        },
-        "npm-packlist": {
-          "version": "1.4.1",
-          "resolved": false,
-          "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ignore-walk": "^3.0.1",
-            "npm-bundled": "^1.0.1"
-          }
-        },
-        "npmlog": {
-          "version": "4.1.2",
-          "resolved": false,
-          "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "are-we-there-yet": "~1.1.2",
-            "console-control-strings": "~1.1.0",
-            "gauge": "~2.7.3",
-            "set-blocking": "~2.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "resolved": false,
-          "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-          "dev": true,
-          "optional": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "resolved": false,
-          "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-          "dev": true,
-          "optional": true
-        },
-        "once": {
-          "version": "1.4.0",
-          "resolved": false,
-          "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "wrappy": "1"
-          }
-        },
-        "os-homedir": {
-          "version": "1.0.2",
-          "resolved": false,
-          "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-          "dev": true,
-          "optional": true
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "resolved": false,
-          "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-          "dev": true,
-          "optional": true
-        },
-        "osenv": {
-          "version": "0.1.5",
-          "resolved": false,
-          "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "os-homedir": "^1.0.0",
-            "os-tmpdir": "^1.0.0"
-          }
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "resolved": false,
-          "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-          "dev": true,
-          "optional": true
-        },
-        "process-nextick-args": {
-          "version": "2.0.0",
-          "resolved": false,
-          "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
-          "dev": true,
-          "optional": true
-        },
-        "rc": {
-          "version": "1.2.8",
-          "resolved": false,
-          "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "deep-extend": "^0.6.0",
-            "ini": "~1.3.0",
-            "minimist": "^1.2.0",
-            "strip-json-comments": "~2.0.1"
-          },
-          "dependencies": {
-            "minimist": {
-              "version": "1.2.0",
-              "resolved": false,
-              "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-              "dev": true,
-              "optional": true
-            }
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": false,
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.3",
-          "resolved": false,
-          "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": false,
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true,
-          "optional": true
-        },
-        "safer-buffer": {
-          "version": "2.1.2",
-          "resolved": false,
-          "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-          "dev": true,
-          "optional": true
-        },
-        "sax": {
-          "version": "1.2.4",
-          "resolved": false,
-          "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
-          "dev": true,
-          "optional": true
-        },
-        "semver": {
-          "version": "5.7.0",
-          "resolved": false,
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
-          "dev": true,
-          "optional": true
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "resolved": false,
-          "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-          "dev": true,
-          "optional": true
-        },
-        "signal-exit": {
-          "version": "3.0.2",
-          "resolved": false,
-          "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
-          "dev": true,
-          "optional": true
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "resolved": false,
-          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": false,
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": false,
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "resolved": false,
-          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
-          "dev": true,
-          "optional": true
-        },
-        "tar": {
-          "version": "4.4.8",
-          "resolved": false,
-          "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chownr": "^1.1.1",
-            "fs-minipass": "^1.2.5",
-            "minipass": "^2.3.4",
-            "minizlib": "^1.1.1",
-            "mkdirp": "^0.5.0",
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.2"
-          }
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "resolved": false,
-          "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-          "dev": true,
-          "optional": true
-        },
-        "wide-align": {
-          "version": "1.1.3",
-          "resolved": false,
-          "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "string-width": "^1.0.2 || 2"
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "resolved": false,
-          "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-          "dev": true,
-          "optional": true
-        },
-        "yallist": {
-          "version": "3.0.3",
-          "resolved": false,
-          "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
-          "dev": true,
-          "optional": true
-        }
-      }
+      "optional": true
     },
     "function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
     },
     "genfun": {
       "version": "5.0.0",
@@ -5558,11 +5048,26 @@
       "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==",
       "dev": true
     },
+    "gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
+    },
     "get-caller-file": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
-      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
-      "dev": true
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+    },
+    "get-intrinsic": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz",
+      "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1"
+      }
     },
     "get-stream": {
       "version": "4.1.0",
@@ -5592,7 +5097,6 @@
       "version": "7.1.2",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
       "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
-      "dev": true,
       "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -5603,64 +5107,43 @@
       }
     },
     "glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+      "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
       "dev": true,
       "requires": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      },
-      "dependencies": {
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
+        "is-glob": "^4.0.1"
       }
     },
     "globals": {
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
     },
     "globby": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
-      "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
+      "version": "11.0.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+      "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
       "dev": true,
       "requires": {
-        "array-union": "^1.0.1",
-        "dir-glob": "^2.0.0",
-        "glob": "^7.1.2",
-        "ignore": "^3.3.5",
-        "pify": "^3.0.0",
-        "slash": "^1.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-          "dev": true
-        }
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.1.1",
+        "ignore": "^5.1.4",
+        "merge2": "^1.3.0",
+        "slash": "^3.0.0"
       }
     },
     "graceful-fs": {
-      "version": "4.1.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
       "dev": true
     },
     "guacamole-common-js": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/guacamole-common-js/-/guacamole-common-js-1.1.0.tgz",
-      "integrity": "sha512-X0BOOGL5DWirKk0Q+2tpr1r3yvoRlF4A76T6CfKMNWSWz3goD2/aSCQcY3I07XSop0SCjOZRNCmPPETmV/6ayg=="
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/guacamole-common-js/-/guacamole-common-js-1.2.0.tgz",
+      "integrity": "sha512-QshVHQq3t4KAdf6PpOEBZNLwl+uMA9e8jNfTrudxpmxZPPJ+1b7QiYbVV1t9cZrmvDLy4I/tga+xHkWgNaEerw=="
     },
     "gzip-size": {
       "version": "5.1.1",
@@ -5670,25 +5153,12 @@
       "requires": {
         "duplexer": "^0.1.1",
         "pify": "^4.0.1"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-          "dev": true
-        }
       }
     },
-    "hammerjs": {
-      "version": "2.0.8",
-      "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz",
-      "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE="
-    },
     "handle-thing": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz",
-      "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+      "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
       "dev": true
     },
     "har-schema": {
@@ -5698,12 +5168,12 @@
       "dev": true
     },
     "har-validator": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
-      "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
       "dev": true,
       "requires": {
-        "ajv": "^6.5.5",
+        "ajv": "^6.12.3",
         "har-schema": "^2.0.0"
       }
     },
@@ -5711,30 +5181,19 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
       "requires": {
         "function-bind": "^1.1.1"
       }
     },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
     "has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
     },
     "has-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
-      "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
       "dev": true
     },
     "has-value": {
@@ -5746,14 +5205,6 @@
         "get-value": "^2.0.6",
         "has-values": "^1.0.0",
         "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
-        }
       }
     },
     "has-values": {
@@ -5798,13 +5249,33 @@
       }
     },
     "hash-base": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
-      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
       "dev": true,
       "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        }
       }
     },
     "hash.js": {
@@ -5817,6 +5288,12 @@
         "minimalistic-assert": "^1.0.1"
       }
     },
+    "hex-color-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
+      "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
+      "dev": true
+    },
     "hmac-drbg": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@@ -5835,10 +5312,13 @@
       "dev": true
     },
     "hosted-git-info": {
-      "version": "2.8.4",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz",
-      "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==",
-      "dev": true
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz",
+      "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^6.0.0"
+      }
     },
     "hpack.js": {
       "version": "2.1.6",
@@ -5852,10 +5332,28 @@
         "wbuf": "^1.1.0"
       }
     },
+    "hsl-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
+      "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
+      "dev": true
+    },
+    "hsla-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
+      "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
+      "dev": true
+    },
+    "html-comment-regex": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
+      "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
+      "dev": true
+    },
     "html-entities": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
-      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz",
+      "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==",
       "dev": true
     },
     "http-cache-semantics": {
@@ -5871,35 +5369,30 @@
       "dev": true
     },
     "http-errors": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
-      "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
       "dev": true,
       "requires": {
-        "depd": "1.1.1",
+        "depd": "~1.1.2",
         "inherits": "2.0.3",
-        "setprototypeof": "1.0.3",
-        "statuses": ">= 1.3.1 < 2"
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
       },
       "dependencies": {
-        "setprototypeof": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
-          "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
           "dev": true
         }
       }
     },
-    "http-parser-js": {
-      "version": "0.4.10",
-      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
-      "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
-      "dev": true
-    },
     "http-proxy": {
-      "version": "1.18.0",
-      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz",
-      "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==",
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
       "dev": true,
       "requires": {
         "eventemitter3": "^4.0.0",
@@ -5925,6 +5418,12 @@
           "requires": {
             "ms": "2.0.0"
           }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
         }
       }
     },
@@ -5938,6 +5437,111 @@
         "is-glob": "^4.0.0",
         "lodash": "^4.17.11",
         "micromatch": "^3.1.10"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        }
       }
     },
     "http-signature": {
@@ -5958,9 +5562,9 @@
       "dev": true
     },
     "https-proxy-agent": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz",
-      "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==",
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
+      "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
       "dev": true,
       "requires": {
         "agent-base": "^4.3.0",
@@ -5975,12 +5579,6 @@
           "requires": {
             "ms": "^2.1.1"
           }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
         }
       }
     },
@@ -5994,18 +5592,27 @@
       }
     },
     "iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
+      "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
       "dev": true,
       "requires": {
-        "safer-buffer": ">= 2.1.2 < 3"
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      }
+    },
+    "icss-utils": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
+      "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.14"
       }
     },
     "ieee754": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
-      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
       "dev": true
     },
     "iferr": {
@@ -6015,15 +5622,15 @@
       "dev": true
     },
     "ignore": {
-      "version": "3.3.10",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
-      "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+      "version": "5.1.8",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
       "dev": true
     },
     "ignore-walk": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.2.tgz",
-      "integrity": "sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
+      "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
       "dev": true,
       "requires": {
         "minimatch": "^3.0.4"
@@ -6080,6 +5687,18 @@
       "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
       "dev": true
     },
+    "indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "dev": true
+    },
+    "indexes-of": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+      "dev": true
+    },
     "infer-owner": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
@@ -6090,17 +5709,15 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
       "requires": {
         "once": "^1.3.0",
         "wrappy": "1"
       }
     },
     "inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-      "dev": true
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "ini": {
       "version": "1.3.5",
@@ -6109,62 +5726,73 @@
       "dev": true
     },
     "inquirer": {
-      "version": "6.5.1",
-      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz",
-      "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==",
+      "version": "7.3.3",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
       "dev": true,
       "requires": {
         "ansi-escapes": "^4.2.1",
-        "chalk": "^2.4.2",
+        "chalk": "^4.1.0",
         "cli-cursor": "^3.1.0",
-        "cli-width": "^2.0.0",
+        "cli-width": "^3.0.0",
         "external-editor": "^3.0.3",
         "figures": "^3.0.0",
-        "lodash": "^4.17.15",
+        "lodash": "^4.17.19",
         "mute-stream": "0.0.8",
-        "run-async": "^2.2.0",
-        "rxjs": "^6.4.0",
+        "run-async": "^2.4.0",
+        "rxjs": "^6.6.0",
         "string-width": "^4.1.0",
-        "strip-ansi": "^5.1.0",
+        "strip-ansi": "^6.0.0",
         "through": "^2.3.6"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz",
-          "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==",
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "requires": {
-            "emoji-regex": "^8.0.0",
-            "is-fullwidth-code-point": "^3.0.0",
-            "strip-ansi": "^5.2.0"
+            "color-convert": "^2.0.1"
           }
         },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
           "dev": true,
           "requires": {
-            "ansi-regex": "^4.1.0"
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
           }
         }
       }
@@ -6177,14 +5805,6 @@
       "requires": {
         "default-gateway": "^4.2.0",
         "ipaddr.js": "^1.9.0"
-      },
-      "dependencies": {
-        "ipaddr.js": {
-          "version": "1.9.1",
-          "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-          "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
-          "dev": true
-        }
       }
     },
     "invariant": {
@@ -6196,12 +5816,6 @@
         "loose-envify": "^1.0.0"
       }
     },
-    "invert-kv": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
-      "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
-      "dev": true
-    },
     "ip": {
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
@@ -6215,15 +5829,15 @@
       "dev": true
     },
     "ipaddr.js": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
-      "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
       "dev": true
     },
     "is-absolute-url": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.2.tgz",
-      "integrity": "sha512-+5g/wLlcm1AcxSP7014m6GvbPHswDx980vD/3bZaap8aGV9Yfs7Q6y6tfaupgZ5O74Byzc8dGrSCJ+bFXx0KdA==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
       "dev": true
     },
     "is-accessor-descriptor": {
@@ -6233,6 +5847,17 @@
       "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
       }
     },
     "is-arguments": {
@@ -6248,26 +5873,48 @@
       "dev": true
     },
     "is-binary-path": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
-      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dev": true,
       "requires": {
-        "binary-extensions": "^1.0.0"
+        "binary-extensions": "^2.0.0"
       }
     },
     "is-buffer": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
-      "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
       "dev": true
     },
     "is-callable": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
-      "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+      "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
       "dev": true
     },
+    "is-color-stop": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
+      "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
+      "dev": true,
+      "requires": {
+        "css-color-names": "^0.0.4",
+        "hex-color-regex": "^1.1.0",
+        "hsl-regex": "^1.0.0",
+        "hsla-regex": "^1.0.0",
+        "rgb-regex": "^1.0.1",
+        "rgba-regex": "^1.0.0"
+      }
+    },
+    "is-core-module": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
+      "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
     "is-data-descriptor": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
@@ -6275,12 +5922,23 @@
       "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
       }
     },
     "is-date-object": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
-      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
       "dev": true
     },
     "is-descriptor": {
@@ -6308,6 +5966,12 @@
       "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
       "dev": true
     },
+    "is-docker": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
+      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
+      "dev": true
+    },
     "is-extendable": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
@@ -6320,20 +5984,10 @@
       "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
       "dev": true
     },
-    "is-finite": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
-      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
-      "dev": true,
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
-    },
     "is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "dev": true
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
     },
     "is-glob": {
       "version": "4.0.1",
@@ -6344,14 +5998,29 @@
         "is-extglob": "^2.1.1"
       }
     },
+    "is-interactive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+      "dev": true
+    },
+    "is-negative-zero": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
+      "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=",
+      "dev": true
+    },
     "is-number": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.0.2"
-      }
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true
+    },
+    "is-obj": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+      "dev": true
     },
     "is-path-cwd": {
       "version": "2.2.0",
@@ -6390,44 +6059,45 @@
       "dev": true,
       "requires": {
         "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
-        }
       }
     },
-    "is-promise": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
-      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
-      "dev": true
-    },
     "is-regex": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
-      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+      "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
       "dev": true,
       "requires": {
-        "has": "^1.0.1"
+        "has-symbols": "^1.0.1"
       }
     },
+    "is-resolvable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+      "dev": true
+    },
     "is-stream": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
       "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
       "dev": true
     },
-    "is-symbol": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
-      "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+    "is-svg": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
+      "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
       "dev": true,
       "requires": {
-        "has-symbols": "^1.0.0"
+        "html-comment-regex": "^1.1.0"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.1"
       }
     },
     "is-typedarray": {
@@ -6443,10 +6113,13 @@
       "dev": true
     },
     "is-wsl": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
-      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
-      "dev": true
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "dev": true,
+      "requires": {
+        "is-docker": "^2.0.0"
+      }
     },
     "isarray": {
       "version": "1.0.0",
@@ -6472,90 +6145,69 @@
       "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
       "dev": true
     },
-    "istanbul-instrumenter-loader": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz",
-      "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==",
+    "istanbul-lib-coverage": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
+      "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
+      "dev": true
+    },
+    "istanbul-lib-instrument": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+      "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
       "dev": true,
       "requires": {
-        "convert-source-map": "^1.5.0",
-        "istanbul-lib-instrument": "^1.7.3",
-        "loader-utils": "^1.1.0",
-        "schema-utils": "^0.3.0"
+        "@babel/core": "^7.7.5",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-coverage": "^3.0.0",
+        "semver": "^6.3.0"
       },
       "dependencies": {
-        "ajv": {
-          "version": "5.5.2",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
-          "dev": true,
-          "requires": {
-            "co": "^4.6.0",
-            "fast-deep-equal": "^1.0.0",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.3.0"
-          }
-        },
-        "fast-deep-equal": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
-          "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "jest-worker": {
+      "version": "26.3.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz",
+      "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "json-schema-traverse": {
-          "version": "0.3.1",
-          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
-          "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
-          "dev": true
-        },
-        "schema-utils": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
-          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
-            "ajv": "^5.0.0"
+            "has-flag": "^4.0.0"
           }
         }
       }
     },
-    "istanbul-lib-coverage": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz",
-      "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==",
-      "dev": true
-    },
-    "istanbul-lib-instrument": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz",
-      "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==",
-      "dev": true,
-      "requires": {
-        "babel-generator": "^6.18.0",
-        "babel-template": "^6.16.0",
-        "babel-traverse": "^6.18.0",
-        "babel-types": "^6.18.0",
-        "babylon": "^6.18.0",
-        "istanbul-lib-coverage": "^1.2.1",
-        "semver": "^5.3.0"
-      }
-    },
-    "js-levenshtein": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
-      "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
-      "dev": true
-    },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     },
     "js-yaml": {
-      "version": "3.13.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+      "version": "3.14.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+      "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
       "dev": true,
       "requires": {
         "argparse": "^1.0.7",
@@ -6571,8 +6223,7 @@
     "jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
     },
     "json-parse-better-errors": {
       "version": "1.0.2",
@@ -6580,6 +6231,12 @@
       "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
       "dev": true
     },
+    "json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "dev": true
+    },
     "json-schema": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
@@ -6605,12 +6262,26 @@
       "dev": true
     },
     "json5": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
-      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+      "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "jsonc-parser": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
+      "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==",
+      "dev": true
+    },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
       "dev": true,
       "requires": {
-        "minimist": "^1.2.0"
+        "graceful-fs": "^4.1.6"
       }
     },
     "jsonparse": {
@@ -6647,38 +6318,31 @@
       "dev": true
     },
     "kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "dev": true,
-      "requires": {
-        "is-buffer": "^1.1.5"
-      }
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true
     },
-    "lcid": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
-      "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
-      "dev": true,
-      "requires": {
-        "invert-kv": "^2.0.0"
-      }
+    "klona": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz",
+      "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==",
+      "dev": true
     },
     "less": {
-      "version": "3.9.0",
-      "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz",
-      "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==",
+      "version": "3.12.2",
+      "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz",
+      "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==",
       "dev": true,
       "requires": {
-        "clone": "^2.1.2",
         "errno": "^0.1.1",
         "graceful-fs": "^4.1.2",
         "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
         "mime": "^1.4.1",
-        "mkdirp": "^0.5.0",
-        "promise": "^7.1.1",
-        "request": "^2.83.0",
-        "source-map": "~0.6.0"
+        "native-request": "^1.0.5",
+        "source-map": "~0.6.0",
+        "tslib": "^1.10.0"
       },
       "dependencies": {
         "source-map": {
@@ -6691,20 +6355,36 @@
       }
     },
     "less-loader": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz",
-      "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==",
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.2.0.tgz",
+      "integrity": "sha512-Cl5h95/Pz/PWub/tCBgT1oNMFeH1WTD33piG80jn5jr12T4XbxZcjThwNXDQ7AG649WEynuIzO4b0+2Tn9Qolg==",
       "dev": true,
       "requires": {
-        "clone": "^2.1.1",
-        "loader-utils": "^1.1.0",
-        "pify": "^4.0.1"
+        "clone": "^2.1.2",
+        "less": "^3.11.3",
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^2.7.0"
+      }
+    },
+    "leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "dev": true
+    },
+    "levenary": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
+      "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
+      "dev": true,
+      "requires": {
+        "leven": "^3.1.0"
       }
     },
     "license-webpack-plugin": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.2.tgz",
-      "integrity": "sha512-7poZHRla+ae0eEButlwMrPpkXyhNVBf2EHePYWT0jyLnI6311/OXJkTI2sOIRungRpQgU2oDMpro5bSFPT5F0A==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.0.tgz",
+      "integrity": "sha512-JK/DXrtN6UeYQSgkg5q1+pgJ8aiKPL9tnz9Wzw+Ikkf+8mJxG56x6t8O+OH/tAeF/5NREnelTEMyFtbJNkjH4w==",
       "dev": true,
       "requires": {
         "@types/webpack-sources": "^0.1.5",
@@ -6718,31 +6398,28 @@
       "dev": true
     },
     "loader-utils": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-      "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
       "dev": true,
       "requires": {
         "big.js": "^5.2.2",
-        "emojis-list": "^2.0.0",
-        "json5": "^1.0.1"
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
       }
     },
     "locate-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-      "dev": true,
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
       "requires": {
-        "p-locate": "^3.0.0",
-        "path-exists": "^3.0.0"
+        "p-locate": "^4.1.0"
       }
     },
     "lodash": {
-      "version": "4.17.15",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
-      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
-      "dev": true
+      "version": "4.17.20",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+      "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
     },
     "lodash.clonedeep": {
       "version": "4.5.0",
@@ -6750,10 +6427,88 @@
       "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
       "dev": true
     },
+    "lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+      "dev": true
+    },
+    "lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+      "dev": true
+    },
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+      "dev": true
+    },
+    "log-symbols": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+      "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
     "loglevel": {
-      "version": "1.6.4",
-      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz",
-      "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==",
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz",
+      "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==",
       "dev": true
     },
     "loose-envify": {
@@ -6766,18 +6521,18 @@
       }
     },
     "lru-cache": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
       "dev": true,
       "requires": {
-        "yallist": "^3.0.2"
+        "yallist": "^4.0.0"
       }
     },
     "magic-string": {
-      "version": "0.25.3",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz",
-      "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==",
+      "version": "0.25.7",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
       "dev": true,
       "requires": {
         "sourcemap-codec": "^1.4.4"
@@ -6791,54 +6546,109 @@
       "requires": {
         "pify": "^4.0.1",
         "semver": "^5.6.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
-        }
       }
     },
     "make-error": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
-      "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
       "dev": true
     },
     "make-fetch-happen": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.0.tgz",
-      "integrity": "sha512-nFr/vpL1Jc60etMVKeaLOqfGjMMb3tAHFVJWxHOFCFS04Zmd7kGlMxo0l1tzfhoQje0/UPnd0X8OeGUiXXnfPA==",
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz",
+      "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==",
       "dev": true,
       "requires": {
         "agentkeepalive": "^3.4.1",
         "cacache": "^12.0.0",
         "http-cache-semantics": "^3.8.1",
         "http-proxy-agent": "^2.1.0",
-        "https-proxy-agent": "^2.2.1",
+        "https-proxy-agent": "^2.2.3",
         "lru-cache": "^5.1.1",
         "mississippi": "^3.0.0",
         "node-fetch-npm": "^2.0.2",
         "promise-retry": "^1.1.1",
         "socks-proxy-agent": "^4.0.0",
         "ssri": "^6.0.0"
-      }
-    },
-    "mamacro": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz",
-      "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==",
-      "dev": true
-    },
-    "map-age-cleaner": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
-      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
-      "dev": true,
-      "requires": {
-        "p-defer": "^1.0.0"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "infer-owner": "^1.0.3",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+          "dev": true
+        },
+        "glob": {
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
       }
     },
     "map-cache": {
@@ -6865,37 +6675,24 @@
         "hash-base": "^3.0.0",
         "inherits": "^2.0.1",
         "safe-buffer": "^5.1.2"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
-          "dev": true
-        }
       }
     },
+    "mdn-data": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+      "dev": true
+    },
     "media-typer": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
       "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
       "dev": true
     },
-    "mem": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz",
-      "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==",
-      "dev": true,
-      "requires": {
-        "map-age-cleaner": "^0.1.1",
-        "mimic-fn": "^1.0.0",
-        "p-is-promise": "^2.0.0"
-      }
-    },
     "memory-fs": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
-      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+      "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
       "dev": true,
       "requires": {
         "errno": "^0.1.3",
@@ -6908,6 +6705,35 @@
       "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
       "dev": true
     },
+    "merge-source-map": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
+      "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true
+    },
     "methods": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
@@ -6915,32 +6741,13 @@
       "dev": true
     },
     "micromatch": {
-      "version": "3.1.10",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+      "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
       "dev": true,
       "requires": {
-        "arr-diff": "^4.0.0",
-        "array-unique": "^0.3.2",
-        "braces": "^2.3.1",
-        "define-property": "^2.0.2",
-        "extend-shallow": "^3.0.2",
-        "extglob": "^2.0.4",
-        "fragment-cache": "^0.2.1",
-        "kind-of": "^6.0.2",
-        "nanomatch": "^1.2.9",
-        "object.pick": "^1.3.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
-          "dev": true
-        }
+        "braces": "^3.0.1",
+        "picomatch": "^2.0.5"
       }
     },
     "miller-rabin": {
@@ -6951,45 +6758,98 @@
       "requires": {
         "bn.js": "^4.0.0",
         "brorand": "^1.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
       }
     },
     "mime": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
-      "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
       "dev": true
     },
     "mime-db": {
-      "version": "1.40.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
-      "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
+      "version": "1.44.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
       "dev": true
     },
     "mime-types": {
-      "version": "2.1.24",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
-      "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+      "version": "2.1.27",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+      "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
       "dev": true,
       "requires": {
-        "mime-db": "1.40.0"
+        "mime-db": "1.44.0"
       }
     },
     "mimic-fn": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
-      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
       "dev": true
     },
     "mini-css-extract-plugin": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz",
-      "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==",
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.10.0.tgz",
+      "integrity": "sha512-QgKgJBjaJhxVPwrLNqqwNS0AGkuQQ31Hp4xGXEK/P7wehEg6qmNtReHKai3zRXqY60wGVWLYcOMJK2b98aGc3A==",
       "dev": true,
       "requires": {
         "loader-utils": "^1.1.0",
         "normalize-url": "1.9.1",
         "schema-utils": "^1.0.0",
         "webpack-sources": "^1.1.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "normalize-url": {
+          "version": "1.9.1",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
+          "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+          "dev": true,
+          "requires": {
+            "object-assign": "^4.0.1",
+            "prepend-http": "^1.0.0",
+            "query-string": "^4.1.0",
+            "sort-keys": "^1.0.0"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
       }
     },
     "minimalistic-assert": {
@@ -7008,42 +6868,59 @@
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
       "requires": {
         "brace-expansion": "^1.1.7"
       }
     },
     "minimist": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-      "dev": true
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
     },
     "minipass": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.8.1.tgz",
-      "integrity": "sha512-QCG523ParRcE2+9A6wYh9UI3uy2FFLw4DQaVYQrY5HPfszc5M6VDD+j0QCwHm19LI2imes4RB+NBD8cOJccyCg==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
+      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
       "dev": true,
       "requires": {
-        "safe-buffer": "^5.1.2",
-        "yallist": "^3.0.0"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
-          "dev": true
-        }
+        "yallist": "^4.0.0"
+      }
+    },
+    "minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-pipeline": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+      "dev": true,
+      "requires": {
+        "minipass": "^3.0.0"
       }
     },
     "minizlib": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.2.tgz",
-      "integrity": "sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ==",
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
       "dev": true,
       "requires": {
-        "minipass": "^2.2.1"
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
       }
     },
     "mississippi": {
@@ -7065,9 +6942,9 @@
       }
     },
     "mixin-deep": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
-      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
       "dev": true,
       "requires": {
         "for-in": "^1.0.2",
@@ -7086,31 +6963,23 @@
       }
     },
     "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
       "dev": true,
       "requires": {
-        "minimist": "0.0.8"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "0.0.8",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
-          "dev": true
-        }
+        "minimist": "^1.2.5"
       }
     },
     "moment": {
-      "version": "2.24.0",
-      "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
-      "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+      "version": "2.29.1",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
+      "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
     },
     "moment-timezone": {
-      "version": "0.5.26",
-      "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.26.tgz",
-      "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==",
+      "version": "0.5.31",
+      "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz",
+      "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==",
       "requires": {
         "moment": ">= 2.9.0"
       }
@@ -7127,13 +6996,37 @@
         "mkdirp": "^0.5.1",
         "rimraf": "^2.5.4",
         "run-queue": "^1.0.3"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
       }
     },
     "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
     "multicast-dns": {
       "version": "6.2.3",
@@ -7157,13 +7050,6 @@
       "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
       "dev": true
     },
-    "nan": {
-      "version": "2.14.0",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
-      "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
-      "dev": true,
-      "optional": true
-    },
     "nanomatch": {
       "version": "1.2.13",
       "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@@ -7181,38 +7067,31 @@
         "regex-not": "^1.0.0",
         "snapdragon": "^0.8.1",
         "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "arr-diff": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-          "dev": true
-        },
-        "array-unique": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-          "dev": true
-        },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
-          "dev": true
-        }
       }
     },
+    "native-request": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz",
+      "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==",
+      "dev": true,
+      "optional": true
+    },
     "negotiator": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
-      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
       "dev": true
     },
     "neo-async": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
-      "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
+    },
+    "next-tick": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
       "dev": true
     },
     "ng-daterangepicker": {
@@ -7223,12 +7102,21 @@
         "date-fns": "^1.29.0"
       }
     },
-    "ngx-toastr": {
-      "version": "10.2.0",
-      "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-10.2.0.tgz",
-      "integrity": "sha512-6ASr5bcvQmtNKb4D2VEsQjCXyROq6GwberBWO0bVt+xcBYPUea4aRTgX8in9apX9buaTafzG+h3HlnIraspoPg==",
+    "ng2-ace-editor": {
+      "version": "0.3.9",
+      "resolved": "https://registry.npmjs.org/ng2-ace-editor/-/ng2-ace-editor-0.3.9.tgz",
+      "integrity": "sha512-e8Q4YCirlL/OEiekewmzupG+zV3prYsiYmQnRzQzd0wNgsPjOLOdb0it7cCbzFfIXKGyIIHKTW5584WxPr2LnQ==",
       "requires": {
-        "tslib": "^1.9.0"
+        "ace-builds": "^1.4.2",
+        "brace": "^0.11.1"
+      }
+    },
+    "ngx-toastr": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-12.1.0.tgz",
+      "integrity": "sha512-rytCRBhvuudj614Kfj9GoIVQDrFuLvHSMP1YrMwTmR1SNkNJZOpGKmaSDCCBrNDkSrGouzMWBlFbl1UDBBsiqw==",
+      "requires": {
+        "tslib": "^1.10.0"
       }
     },
     "nice-try": {
@@ -7238,9 +7126,9 @@
       "dev": true
     },
     "node-fetch-npm": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz",
-      "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==",
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz",
+      "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==",
       "dev": true,
       "requires": {
         "encoding": "^0.1.11",
@@ -7249,9 +7137,9 @@
       }
     },
     "node-forge": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.2.tgz",
-      "integrity": "sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg==",
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
+      "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
       "dev": true
     },
     "node-libs-browser": {
@@ -7294,13 +7182,10 @@
       }
     },
     "node-releases": {
-      "version": "1.1.32",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.32.tgz",
-      "integrity": "sha512-VhVknkitq8dqtWoluagsGPn3dxTvN9fwgR59fV3D7sLBHe0JfDramsMI8n8mY//ccq/Kkrf8ZRHRpsyVZ3qw1A==",
-      "dev": true,
-      "requires": {
-        "semver": "^5.3.0"
-      }
+      "version": "1.1.65",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.65.tgz",
+      "integrity": "sha512-YpzJOe2WFIW0V4ZkJQd/DGR/zdVwc/pI4Nl1CZrBO19FdRcSTmsuhdttw9rsTzzJLrNcSloLiBbEYx1C4f6gpA==",
+      "dev": true
     },
     "normalize-package-data": {
       "version": "2.5.0",
@@ -7314,31 +7199,19 @@
         "validate-npm-package-license": "^3.0.1"
       },
       "dependencies": {
-        "path-parse": {
-          "version": "1.0.6",
-          "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-          "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
           "dev": true
-        },
-        "resolve": {
-          "version": "1.12.0",
-          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
-          "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
-          "dev": true,
-          "requires": {
-            "path-parse": "^1.0.6"
-          }
         }
       }
     },
     "normalize-path": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
-      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-      "dev": true,
-      "requires": {
-        "remove-trailing-separator": "^1.0.1"
-      }
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true
     },
     "normalize-range": {
       "version": "0.1.2",
@@ -7347,68 +7220,96 @@
       "dev": true
     },
     "normalize-url": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
-      "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
-      "dev": true,
-      "requires": {
-        "object-assign": "^4.0.1",
-        "prepend-http": "^1.0.0",
-        "query-string": "^4.1.0",
-        "sort-keys": "^1.0.0"
-      }
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
+      "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
+      "dev": true
     },
     "npm-bundled": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz",
-      "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
+      "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
+      "dev": true,
+      "requires": {
+        "npm-normalize-package-bin": "^1.0.1"
+      }
+    },
+    "npm-install-checks": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz",
+      "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==",
+      "dev": true,
+      "requires": {
+        "semver": "^7.1.1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        }
+      }
+    },
+    "npm-normalize-package-bin": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
+      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
       "dev": true
     },
     "npm-package-arg": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz",
-      "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==",
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz",
+      "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==",
       "dev": true,
       "requires": {
-        "hosted-git-info": "^2.6.0",
-        "osenv": "^0.1.5",
-        "semver": "^5.5.0",
+        "hosted-git-info": "^3.0.2",
+        "semver": "^7.0.0",
         "validate-npm-package-name": "^3.0.0"
       },
       "dependencies": {
         "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
         }
       }
     },
     "npm-packlist": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz",
-      "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==",
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
+      "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
       "dev": true,
       "requires": {
         "ignore-walk": "^3.0.1",
-        "npm-bundled": "^1.0.1"
+        "npm-bundled": "^1.0.1",
+        "npm-normalize-package-bin": "^1.0.1"
       }
     },
     "npm-pick-manifest": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz",
-      "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz",
+      "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==",
       "dev": true,
       "requires": {
-        "figgy-pudding": "^3.5.1",
-        "npm-package-arg": "^6.0.0",
-        "semver": "^5.4.1"
+        "npm-install-checks": "^4.0.0",
+        "npm-package-arg": "^8.0.0",
+        "semver": "^7.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        }
       }
     },
     "npm-registry-fetch": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.1.tgz",
-      "integrity": "sha512-1ZQ+yjnxc698R5h9Yje9CASapzAZr7aYDkJDdERg9xg2hOEY0vRJwskOaJAXq8N/eLavzvW4g564YAfq6zMn/A==",
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz",
+      "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==",
       "dev": true,
       "requires": {
         "JSONStream": "^1.3.4",
@@ -7420,10 +7321,43 @@
         "safe-buffer": "^5.2.0"
       },
       "dependencies": {
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "npm-package-arg": {
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz",
+          "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^2.7.1",
+            "osenv": "^0.1.5",
+            "semver": "^5.6.0",
+            "validate-npm-package-name": "^3.0.0"
+          }
+        },
         "safe-buffer": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
           "dev": true
         }
       }
@@ -7437,18 +7371,21 @@
         "path-key": "^2.0.0"
       }
     },
+    "nth-check": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+      "dev": true,
+      "requires": {
+        "boolbase": "~1.0.0"
+      }
+    },
     "num2fraction": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
       "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
       "dev": true
     },
-    "number-is-nan": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
-      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
-      "dev": true
-    },
     "oauth-sign": {
       "version": "0.9.0",
       "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@@ -7480,20 +7417,55 @@
           "requires": {
             "is-descriptor": "^0.1.0"
           }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
         }
       }
     },
     "object-inspect": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
-      "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+      "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
       "dev": true
     },
     "object-is": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz",
-      "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=",
-      "dev": true
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz",
+      "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.0-next.1"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.18.0-next.1",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+          "dev": true,
+          "requires": {
+            "es-to-primitive": "^1.2.1",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.1",
+            "is-callable": "^1.2.2",
+            "is-negative-zero": "^2.0.0",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
+      }
     },
     "object-keys": {
       "version": "1.1.1",
@@ -7508,36 +7480,28 @@
       "dev": true,
       "requires": {
         "isobject": "^3.0.0"
-      },
-      "dependencies": {
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
-        }
       }
     },
     "object.assign": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
-      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
       "dev": true,
       "requires": {
-        "define-properties": "^1.1.2",
-        "function-bind": "^1.1.1",
-        "has-symbols": "^1.0.0",
-        "object-keys": "^1.0.11"
+        "call-bind": "^1.0.0",
+        "define-properties": "^1.1.3",
+        "has-symbols": "^1.0.1",
+        "object-keys": "^1.1.1"
       }
     },
     "object.getownpropertydescriptors": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
-      "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
+      "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
       "dev": true,
       "requires": {
-        "define-properties": "^1.1.2",
-        "es-abstract": "^1.5.1"
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
       }
     },
     "object.pick": {
@@ -7547,14 +7511,18 @@
       "dev": true,
       "requires": {
         "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
-        }
+      }
+    },
+    "object.values": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+      "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3"
       }
     },
     "obuf": {
@@ -7582,41 +7550,33 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
       "requires": {
         "wrappy": "1"
       }
     },
     "onetime": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
-      "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
       "dev": true,
       "requires": {
         "mimic-fn": "^2.1.0"
-      },
-      "dependencies": {
-        "mimic-fn": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-          "dev": true
-        }
       }
     },
     "open": {
-      "version": "6.4.0",
-      "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
-      "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz",
+      "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==",
       "dev": true,
       "requires": {
-        "is-wsl": "^1.1.0"
+        "is-docker": "^2.0.0",
+        "is-wsl": "^2.1.1"
       }
     },
     "opener": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz",
-      "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==",
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
+      "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
       "dev": true
     },
     "opn": {
@@ -7626,6 +7586,81 @@
       "dev": true,
       "requires": {
         "is-wsl": "^1.1.0"
+      },
+      "dependencies": {
+        "is-wsl": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+          "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+          "dev": true
+        }
+      }
+    },
+    "ora": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz",
+      "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-spinners": "^2.4.0",
+        "is-interactive": "^1.0.0",
+        "log-symbols": "^4.0.0",
+        "mute-stream": "0.0.8",
+        "strip-ansi": "^6.0.0",
+        "wcwidth": "^1.0.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
       }
     },
     "original": {
@@ -7649,17 +7684,6 @@
       "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
       "dev": true
     },
-    "os-locale": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
-      "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
-      "dev": true,
-      "requires": {
-        "execa": "^1.0.0",
-        "lcid": "^2.0.0",
-        "mem": "^4.0.0"
-      }
-    },
     "os-tmpdir": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
@@ -7676,47 +7700,36 @@
         "os-tmpdir": "^1.0.0"
       }
     },
-    "p-defer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
-      "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
-      "dev": true
-    },
     "p-finally": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
       "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
       "dev": true
     },
-    "p-is-promise": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz",
-      "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==",
-      "dev": true
-    },
     "p-limit": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
-      "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
-      "dev": true,
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
       "requires": {
         "p-try": "^2.0.0"
       }
     },
     "p-locate": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-      "dev": true,
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
       "requires": {
-        "p-limit": "^2.0.0"
+        "p-limit": "^2.2.0"
       }
     },
     "p-map": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
-      "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
-      "dev": true
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "dev": true,
+      "requires": {
+        "aggregate-error": "^3.0.0"
+      }
     },
     "p-retry": {
       "version": "3.0.1",
@@ -7730,17 +7743,17 @@
     "p-try": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
     },
     "pacote": {
-      "version": "9.5.5",
-      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz",
-      "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==",
+      "version": "9.5.12",
+      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz",
+      "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==",
       "dev": true,
       "requires": {
         "bluebird": "^3.5.3",
         "cacache": "^12.0.2",
+        "chownr": "^1.1.2",
         "figgy-pudding": "^3.5.1",
         "get-stream": "^4.1.0",
         "glob": "^7.1.3",
@@ -7752,9 +7765,10 @@
         "mississippi": "^3.0.0",
         "mkdirp": "^0.5.1",
         "normalize-package-data": "^2.4.0",
+        "npm-normalize-package-bin": "^1.0.0",
         "npm-package-arg": "^6.1.0",
         "npm-packlist": "^1.1.12",
-        "npm-pick-manifest": "^2.2.3",
+        "npm-pick-manifest": "^3.0.0",
         "npm-registry-fetch": "^4.0.0",
         "osenv": "^0.1.5",
         "promise-inflight": "^1.0.1",
@@ -7764,15 +7778,53 @@
         "safe-buffer": "^5.1.2",
         "semver": "^5.6.0",
         "ssri": "^6.0.1",
-        "tar": "^4.4.8",
+        "tar": "^4.4.10",
         "unique-filename": "^1.1.1",
         "which": "^1.3.1"
       },
       "dependencies": {
+        "cacache": {
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "infer-owner": "^1.0.3",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+          "dev": true
+        },
+        "fs-minipass": {
+          "version": "1.2.7",
+          "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
+          "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+          "dev": true,
+          "requires": {
+            "minipass": "^2.6.0"
+          }
+        },
         "glob": {
-          "version": "7.1.4",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
-          "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -7783,33 +7835,108 @@
             "path-is-absolute": "^1.0.0"
           }
         },
-        "safe-buffer": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
           "dev": true
         },
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
-        },
-        "which": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
           "dev": true,
           "requires": {
-            "isexe": "^2.0.0"
+            "yallist": "^3.0.2"
           }
+        },
+        "minipass": {
+          "version": "2.9.0",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+          "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+          "dev": true,
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "1.3.3",
+          "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
+          "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+          "dev": true,
+          "requires": {
+            "minipass": "^2.9.0"
+          }
+        },
+        "npm-package-arg": {
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz",
+          "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^2.7.1",
+            "osenv": "^0.1.5",
+            "semver": "^5.6.0",
+            "validate-npm-package-name": "^3.0.0"
+          }
+        },
+        "npm-pick-manifest": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz",
+          "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1",
+            "npm-package-arg": "^6.0.0",
+            "semver": "^5.4.1"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "tar": {
+          "version": "4.4.13",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
+          "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
+          "dev": true,
+          "requires": {
+            "chownr": "^1.1.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.8.6",
+            "minizlib": "^1.2.1",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.3"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
         }
       }
     },
     "pako": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz",
-      "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==",
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
       "dev": true
     },
     "parallel-transform": {
@@ -7824,14 +7951,13 @@
       }
     },
     "parse-asn1": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
-      "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+      "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
       "dev": true,
       "requires": {
-        "asn1.js": "^4.0.0",
+        "asn1.js": "^5.2.0",
         "browserify-aes": "^1.0.0",
-        "create-hash": "^1.1.0",
         "evp_bytestokey": "^1.0.0",
         "pbkdf2": "^3.0.3",
         "safe-buffer": "^5.1.1"
@@ -7848,15 +7974,32 @@
       }
     },
     "parse5": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
-      "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
-      "dev": true
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
+      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+      "optional": true
+    },
+    "parse5-htmlparser2-tree-adapter": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+      "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
+      "dev": true,
+      "requires": {
+        "parse5": "^6.0.1"
+      },
+      "dependencies": {
+        "parse5": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+          "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+          "dev": true
+        }
+      }
     },
     "parseurl": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
-      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
       "dev": true
     },
     "pascalcase": {
@@ -7878,16 +8021,14 @@
       "dev": true
     },
     "path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-      "dev": true
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
     },
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
     },
     "path-is-inside": {
       "version": "1.0.2",
@@ -7902,10 +8043,9 @@
       "dev": true
     },
     "path-parse": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
-      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
-      "dev": true
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
     },
     "path-to-regexp": {
       "version": "0.1.7",
@@ -7914,26 +8054,15 @@
       "dev": true
     },
     "path-type": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
-      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
-      "dev": true,
-      "requires": {
-        "pify": "^3.0.0"
-      },
-      "dependencies": {
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
-          "dev": true
-        }
-      }
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true
     },
     "pbkdf2": {
-      "version": "3.0.17",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
-      "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
+      "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
       "dev": true,
       "requires": {
         "create-hash": "^1.1.2",
@@ -7950,9 +8079,9 @@
       "dev": true
     },
     "picomatch": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz",
-      "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==",
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
       "dev": true
     },
     "pify": {
@@ -7983,24 +8112,72 @@
       "dev": true,
       "requires": {
         "find-up": "^3.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        }
+      }
+    },
+    "pnp-webpack-plugin": {
+      "version": "1.6.4",
+      "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz",
+      "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==",
+      "dev": true,
+      "requires": {
+        "ts-pnp": "^1.1.6"
       }
     },
     "portfinder": {
-      "version": "1.0.24",
-      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.24.tgz",
-      "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==",
+      "version": "1.0.28",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
       "dev": true,
       "requires": {
-        "async": "^1.5.2",
-        "debug": "^2.2.0",
-        "mkdirp": "0.5.x"
+        "async": "^2.6.2",
+        "debug": "^3.1.1",
+        "mkdirp": "^0.5.5"
       },
       "dependencies": {
-        "async": {
-          "version": "1.5.2",
-          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
-          "dev": true
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
         }
       }
     },
@@ -8011,9 +8188,9 @@
       "dev": true
     },
     "postcss": {
-      "version": "7.0.17",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz",
-      "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==",
+      "version": "7.0.32",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+      "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
       "dev": true,
       "requires": {
         "chalk": "^2.4.2",
@@ -8038,6 +8215,92 @@
         }
       }
     },
+    "postcss-calc": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz",
+      "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.27",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.0.2"
+      }
+    },
+    "postcss-colormin": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
+      "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "color": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-convert-values": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
+      "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-discard-comments": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
+      "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-duplicates": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
+      "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-empty": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
+      "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-overridden": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
+      "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
     "postcss-import": {
       "version": "12.0.1",
       "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz",
@@ -8059,9 +8322,9 @@
       }
     },
     "postcss-load-config": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz",
-      "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==",
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz",
+      "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==",
       "dev": true,
       "requires": {
         "cosmiconfig": "^5.0.0",
@@ -8078,12 +8341,475 @@
         "postcss": "^7.0.0",
         "postcss-load-config": "^2.0.0",
         "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "postcss-merge-longhand": {
+      "version": "4.0.11",
+      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
+      "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
+      "dev": true,
+      "requires": {
+        "css-color-names": "0.0.4",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "stylehacks": "^4.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-merge-rules": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
+      "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "cssnano-util-same-parent": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0",
+        "vendors": "^1.0.0"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-minify-font-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
+      "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
+      "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "is-color-stop": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-minify-params": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
+      "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "browserslist": "^4.0.0",
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "uniqs": "^2.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-minify-selectors": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
+      "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-modules-extract-imports": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
+      "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.5"
+      }
+    },
+    "postcss-modules-local-by-default": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz",
+      "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==",
+      "dev": true,
+      "requires": {
+        "icss-utils": "^4.1.1",
+        "postcss": "^7.0.32",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
+      }
+    },
+    "postcss-modules-scope": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
+      "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.6",
+        "postcss-selector-parser": "^6.0.0"
+      }
+    },
+    "postcss-modules-values": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
+      "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
+      "dev": true,
+      "requires": {
+        "icss-utils": "^4.0.0",
+        "postcss": "^7.0.6"
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
+      "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-normalize-display-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
+      "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-positions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
+      "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-repeat-style": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
+      "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-string": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
+      "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-timing-functions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
+      "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-unicode": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
+      "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-url": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
+      "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+      "dev": true,
+      "requires": {
+        "is-absolute-url": "^2.0.0",
+        "normalize-url": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-normalize-whitespace": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
+      "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
+      "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-reduce-initial": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
+      "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-reduce-transforms": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
+      "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+      "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+      "dev": true,
+      "requires": {
+        "cssesc": "^3.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1",
+        "util-deprecate": "^1.0.2"
+      }
+    },
+    "postcss-svgo": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
+      "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
+      "dev": true,
+      "requires": {
+        "is-svg": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "svgo": "^1.0.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-unique-selectors": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
+      "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
       }
     },
     "postcss-value-parser": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz",
-      "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
       "dev": true
     },
     "prepend-http": {
@@ -8092,12 +8818,6 @@
       "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
       "dev": true
     },
-    "private": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
-      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
-      "dev": true
-    },
     "process": {
       "version": "0.11.10",
       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@@ -8105,21 +8825,11 @@
       "dev": true
     },
     "process-nextick-args": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
-      "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
       "dev": true
     },
-    "promise": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
-      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "asap": "~2.0.3"
-      }
-    },
     "promise-inflight": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
@@ -8154,13 +8864,13 @@
       }
     },
     "proxy-addr": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
-      "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+      "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
       "dev": true,
       "requires": {
         "forwarded": "~0.1.2",
-        "ipaddr.js": "1.8.0"
+        "ipaddr.js": "1.9.1"
       }
     },
     "prr": {
@@ -8170,9 +8880,9 @@
       "dev": true
     },
     "psl": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz",
-      "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==",
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
       "dev": true
     },
     "public-encrypt": {
@@ -8189,10 +8899,10 @@
         "safe-buffer": "^5.1.2"
       },
       "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
           "dev": true
         }
       }
@@ -8236,10 +8946,16 @@
       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
       "dev": true
     },
+    "q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+      "dev": true
+    },
     "qs": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+      "version": "6.7.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
       "dev": true
     },
     "query-string": {
@@ -8265,9 +8981,9 @@
       "dev": true
     },
     "querystringify": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
-      "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
       "dev": true
     },
     "randombytes": {
@@ -8290,9 +9006,9 @@
       }
     },
     "range-parser": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
-      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
       "dev": true
     },
     "raw-body": {
@@ -8313,59 +9029,25 @@
           "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
           "dev": true
         },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-          "dev": true
-        },
-        "http-errors": {
-          "version": "1.7.2",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
-          "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
           "dev": true,
           "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.3",
-            "setprototypeof": "1.1.1",
-            "statuses": ">= 1.5.0 < 2",
-            "toidentifier": "1.0.0"
+            "safer-buffer": ">= 2.1.2 < 3"
           }
-        },
-        "setprototypeof": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
-          "dev": true
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
-          "dev": true
         }
       }
     },
     "raw-loader": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz",
-      "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.1.tgz",
+      "integrity": "sha512-baolhQBSi3iNh1cglJjA0mYzga+wePk7vdEX//1dTFd+v4TsQlQE0jitJSNF1OIP82rdYulH7otaVmdlDaJ64A==",
       "dev": true,
       "requires": {
-        "loader-utils": "^1.1.0",
-        "schema-utils": "^2.0.1"
-      },
-      "dependencies": {
-        "schema-utils": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.2.0.tgz",
-          "integrity": "sha512-5EwsCNhfFTZvUreQhx/4vVQpJ/lnCAkgoIHLhSpp4ZirE+4hzFvdJi0FMub6hxbFVBJYSpeVVmon+2e7uEGRrA==",
-          "dev": true,
-          "requires": {
-            "ajv": "^6.10.2",
-            "ajv-keywords": "^3.4.1"
-          }
-        }
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^2.6.5"
       }
     },
     "read-cache": {
@@ -8386,16 +9068,15 @@
       }
     },
     "read-package-json": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.0.tgz",
-      "integrity": "sha512-KLhu8M1ZZNkMcrq1+0UJbR8Dii8KZUqB0Sha4mOx/bknfKI/fyrQVrG/YIt2UOtG667sD8+ee4EXMM91W9dC+A==",
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz",
+      "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==",
       "dev": true,
       "requires": {
         "glob": "^7.1.1",
-        "graceful-fs": "^4.1.2",
-        "json-parse-better-errors": "^1.0.1",
+        "json-parse-even-better-errors": "^2.3.0",
         "normalize-package-data": "^2.0.0",
-        "slash": "^1.0.0"
+        "npm-normalize-package-bin": "^1.0.0"
       }
     },
     "read-package-tree": {
@@ -8410,17 +9091,17 @@
       }
     },
     "readable-stream": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
-      "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
       "dev": true,
       "requires": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
         "isarray": "~1.0.0",
-        "process-nextick-args": "~1.0.6",
+        "process-nextick-args": "~2.0.0",
         "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.0.3",
+        "string_decoder": "~1.1.1",
         "util-deprecate": "~1.0.1"
       }
     },
@@ -8437,12 +9118,12 @@
       }
     },
     "readdirp": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz",
-      "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==",
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
       "dev": true,
       "requires": {
-        "picomatch": "^2.0.4"
+        "picomatch": "^2.2.1"
       }
     },
     "reflect-metadata": {
@@ -8452,33 +9133,33 @@
       "dev": true
     },
     "regenerate": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
-      "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
       "dev": true
     },
     "regenerate-unicode-properties": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz",
-      "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==",
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+      "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
       "dev": true,
       "requires": {
         "regenerate": "^1.4.0"
       }
     },
     "regenerator-runtime": {
-      "version": "0.13.3",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
-      "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
+      "version": "0.13.7",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
       "dev": true
     },
     "regenerator-transform": {
-      "version": "0.14.1",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz",
-      "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==",
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
       "dev": true,
       "requires": {
-        "private": "^0.1.6"
+        "@babel/runtime": "^7.8.4"
       }
     },
     "regex-not": {
@@ -8491,45 +9172,46 @@
         "safe-regex": "^1.1.0"
       }
     },
-    "regexp-tree": {
-      "version": "0.1.13",
-      "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.13.tgz",
-      "integrity": "sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw==",
+    "regex-parser": {
+      "version": "2.2.11",
+      "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz",
+      "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==",
       "dev": true
     },
     "regexp.prototype.flags": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz",
-      "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+      "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
       "dev": true,
       "requires": {
-        "define-properties": "^1.1.2"
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
       }
     },
     "regexpu-core": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz",
-      "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==",
+      "version": "4.7.1",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
+      "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
       "dev": true,
       "requires": {
         "regenerate": "^1.4.0",
-        "regenerate-unicode-properties": "^8.1.0",
-        "regjsgen": "^0.5.0",
-        "regjsparser": "^0.6.0",
+        "regenerate-unicode-properties": "^8.2.0",
+        "regjsgen": "^0.5.1",
+        "regjsparser": "^0.6.4",
         "unicode-match-property-ecmascript": "^1.0.4",
-        "unicode-match-property-value-ecmascript": "^1.1.0"
+        "unicode-match-property-value-ecmascript": "^1.2.0"
       }
     },
     "regjsgen": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
-      "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
       "dev": true
     },
     "regjsparser": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
-      "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
+      "version": "0.6.4",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
+      "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
       "dev": true,
       "requires": {
         "jsesc": "~0.5.0"
@@ -8550,9 +9232,9 @@
       "dev": true
     },
     "repeat-element": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
-      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
       "dev": true
     },
     "repeat-string": {
@@ -8561,19 +9243,10 @@
       "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
       "dev": true
     },
-    "repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
-      "dev": true,
-      "requires": {
-        "is-finite": "^1.0.0"
-      }
-    },
     "request": {
-      "version": "2.88.0",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
-      "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
       "dev": true,
       "requires": {
         "aws-sign2": "~0.7.0",
@@ -8583,7 +9256,7 @@
         "extend": "~3.0.2",
         "forever-agent": "~0.6.1",
         "form-data": "~2.3.2",
-        "har-validator": "~5.1.0",
+        "har-validator": "~5.1.3",
         "http-signature": "~1.2.0",
         "is-typedarray": "~1.0.0",
         "isstream": "~0.1.2",
@@ -8593,15 +9266,15 @@
         "performance-now": "^2.1.0",
         "qs": "~6.5.2",
         "safe-buffer": "^5.1.2",
-        "tough-cookie": "~2.4.3",
+        "tough-cookie": "~2.5.0",
         "tunnel-agent": "^0.6.0",
         "uuid": "^3.3.2"
       },
       "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
           "dev": true
         }
       }
@@ -8609,14 +9282,12 @@
     "require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
     },
     "require-main-filename": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
-      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
-      "dev": true
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
     },
     "requires-port": {
       "version": "1.0.0",
@@ -8625,12 +9296,12 @@
       "dev": true
     },
     "resolve": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz",
-      "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==",
-      "dev": true,
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
+      "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
       "requires": {
-        "path-parse": "^1.0.5"
+        "is-core-module": "^2.0.0",
+        "path-parse": "^1.0.6"
       }
     },
     "resolve-cwd": {
@@ -8654,6 +9325,78 @@
       "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
       "dev": true
     },
+    "resolve-url-loader": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz",
+      "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==",
+      "dev": true,
+      "requires": {
+        "adjust-sourcemap-loader": "3.0.0",
+        "camelcase": "5.3.1",
+        "compose-function": "3.0.3",
+        "convert-source-map": "1.7.0",
+        "es6-iterator": "2.0.3",
+        "loader-utils": "1.2.3",
+        "postcss": "7.0.21",
+        "rework": "1.0.1",
+        "rework-visit": "1.0.0",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "emojis-list": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+          "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+          "dev": true
+        },
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^2.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "postcss": {
+          "version": "7.0.21",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz",
+          "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
     "restore-cursor": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -8676,19 +9419,61 @@
       "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
       "dev": true
     },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true
+    },
+    "rework": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz",
+      "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=",
+      "dev": true,
+      "requires": {
+        "convert-source-map": "^0.3.3",
+        "css": "^2.0.0"
+      },
+      "dependencies": {
+        "convert-source-map": {
+          "version": "0.3.5",
+          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz",
+          "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=",
+          "dev": true
+        }
+      }
+    },
+    "rework-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz",
+      "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=",
+      "dev": true
+    },
+    "rgb-regex": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
+      "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
+      "dev": true
+    },
+    "rgba-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
+      "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
+      "dev": true
+    },
     "rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
       "dev": true,
       "requires": {
         "glob": "^7.1.3"
       },
       "dependencies": {
         "glob": {
-          "version": "7.1.4",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
-          "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -8711,15 +9496,27 @@
         "inherits": "^2.0.1"
       }
     },
-    "run-async": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
-      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+    "rollup": {
+      "version": "2.26.5",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.5.tgz",
+      "integrity": "sha512-rCyFG3ZtQdnn9YwfuAVH0l/Om34BdO5lwCA0W6Hq+bNB21dVEBbCRxhaHOmu1G7OBFDWytbzAC104u7rxHwGjA==",
       "dev": true,
       "requires": {
-        "is-promise": "^2.1.0"
+        "fsevents": "~2.1.2"
       }
     },
+    "run-async": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+      "dev": true
+    },
+    "run-parallel": {
+      "version": "1.1.10",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
+      "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
+      "dev": true
+    },
     "run-queue": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
@@ -8730,9 +9527,9 @@
       }
     },
     "rxjs": {
-      "version": "6.5.3",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
-      "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
+      "version": "6.6.3",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
+      "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
       "requires": {
         "tslib": "^1.9.0"
       }
@@ -8743,10 +9540,9 @@
       "integrity": "sha512-BIJX2yovz3TBpjJoAZyls2QYuU6ZiCaZ+U96SmxQpuSP/qDUfiXPKOVLbThBB2WZijNHkdTTJXKRwvv5Y48H7g=="
     },
     "safe-buffer": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
-      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
-      "dev": true
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
     },
     "safe-regex": {
       "version": "1.1.0",
@@ -8764,50 +9560,50 @@
       "dev": true
     },
     "sass": {
-      "version": "1.22.9",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.9.tgz",
-      "integrity": "sha512-FzU1X2V8DlnqabrL4u7OBwD2vcOzNMongEJEx3xMEhWY/v26FFR3aG0hyeu2T965sfR0E9ufJwmG+Qjz78vFPQ==",
+      "version": "1.26.10",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz",
+      "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==",
       "dev": true,
       "requires": {
         "chokidar": ">=2.0.0 <4.0.0"
       }
     },
     "sass-loader": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.2.0.tgz",
-      "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==",
+      "version": "10.0.1",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.0.1.tgz",
+      "integrity": "sha512-b2PSldKVTS3JcFPHSrEXh3BeAfR7XknGiGCAO5aHruR3Pf3kqLP3Gb2ypXLglRrAzgZkloNxLZ7GXEGDX0hBUQ==",
       "dev": true,
       "requires": {
-        "clone-deep": "^4.0.1",
-        "loader-utils": "^1.0.1",
-        "neo-async": "^2.5.0",
-        "pify": "^4.0.1",
-        "semver": "^5.5.0"
+        "klona": "^2.0.3",
+        "loader-utils": "^2.0.0",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^2.7.0",
+        "semver": "^7.3.2"
       },
       "dependencies": {
         "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
           "dev": true
         }
       }
     },
     "sax": {
-      "version": "0.5.8",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
-      "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=",
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
       "dev": true
     },
     "schema-utils": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-      "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
       "dev": true,
       "requires": {
-        "ajv": "^6.1.0",
-        "ajv-errors": "^1.0.0",
-        "ajv-keywords": "^3.1.0"
+        "@types/json-schema": "^7.0.5",
+        "ajv": "^6.12.4",
+        "ajv-keywords": "^3.5.2"
       }
     },
     "select-hose": {
@@ -8817,19 +9613,18 @@
       "dev": true
     },
     "selfsigned": {
-      "version": "1.10.6",
-      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.6.tgz",
-      "integrity": "sha512-i3+CeqxL7DpAazgVpAGdKMwHuL63B5nhJMh9NQ7xmChGkA3jNFflq6Jyo1LLJYcr3idWiNOPWHCrm4zMayLG4w==",
+      "version": "1.10.8",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz",
+      "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==",
       "dev": true,
       "requires": {
-        "node-forge": "0.8.2"
+        "node-forge": "^0.10.0"
       }
     },
     "semver": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
-      "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
-      "dev": true
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
     },
     "semver-dsl": {
       "version": "1.0.1",
@@ -8850,9 +9645,9 @@
       }
     },
     "send": {
-      "version": "0.16.2",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
-      "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+      "version": "0.17.1",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
       "dev": true,
       "requires": {
         "debug": "2.6.9",
@@ -8862,39 +9657,47 @@
         "escape-html": "~1.0.3",
         "etag": "~1.8.1",
         "fresh": "0.5.2",
-        "http-errors": "~1.6.2",
-        "mime": "1.4.1",
-        "ms": "2.0.0",
+        "http-errors": "~1.7.2",
+        "mime": "1.6.0",
+        "ms": "2.1.1",
         "on-finished": "~2.3.0",
-        "range-parser": "~1.2.0",
-        "statuses": "~1.4.0"
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
       },
       "dependencies": {
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-          "dev": true
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+              "dev": true
+            }
+          }
         },
-        "encodeurl": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-          "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
-          "dev": true
-        },
-        "statuses": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
-          "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
           "dev": true
         }
       }
     },
     "serialize-javascript": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz",
-      "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==",
-      "dev": true
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
     },
     "serve-index": {
       "version": "1.9.1",
@@ -8909,38 +9712,70 @@
         "http-errors": "~1.6.2",
         "mime-types": "~2.1.17",
         "parseurl": "~1.3.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+          "dev": true
+        }
       }
     },
     "serve-static": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
-      "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
       "dev": true,
       "requires": {
         "encodeurl": "~1.0.2",
         "escape-html": "~1.0.3",
-        "parseurl": "~1.3.2",
-        "send": "0.16.2"
-      },
-      "dependencies": {
-        "encodeurl": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-          "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
-          "dev": true
-        }
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
       }
     },
     "set-blocking": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
     },
     "set-value": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
-      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
       "dev": true,
       "requires": {
         "extend-shallow": "^2.0.1",
@@ -8967,9 +9802,9 @@
       "dev": true
     },
     "setprototypeof": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
-      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
       "dev": true
     },
     "sha.js": {
@@ -8982,23 +9817,6 @@
         "safe-buffer": "^5.0.1"
       }
     },
-    "shallow-clone": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
-      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^6.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
-          "dev": true
-        }
-      }
-    },
     "shebang-command": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
@@ -9015,21 +9833,38 @@
       "dev": true
     },
     "signal-exit": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
       "dev": true
     },
+    "simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.3.1"
+      },
+      "dependencies": {
+        "is-arrayish": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+          "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+          "dev": true
+        }
+      }
+    },
     "slash": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
-      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
       "dev": true
     },
     "smart-buffer": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz",
-      "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz",
+      "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==",
       "dev": true
     },
     "snapdragon": {
@@ -9048,6 +9883,15 @@
         "use": "^3.1.0"
       },
       "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
         "define-property": {
           "version": "0.2.5",
           "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
@@ -9065,6 +9909,12 @@
           "requires": {
             "is-extendable": "^0.1.0"
           }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
         }
       }
     },
@@ -9116,18 +9966,6 @@
             "is-data-descriptor": "^1.0.0",
             "kind-of": "^6.0.2"
           }
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
-        },
-        "kind-of": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
-          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
-          "dev": true
         }
       }
     },
@@ -9138,22 +9976,34 @@
       "dev": true,
       "requires": {
         "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
       }
     },
     "sockjs": {
-      "version": "0.3.19",
-      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
-      "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
+      "version": "0.3.20",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz",
+      "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==",
       "dev": true,
       "requires": {
         "faye-websocket": "^0.10.0",
-        "uuid": "^3.0.1"
+        "uuid": "^3.4.0",
+        "websocket-driver": "0.6.5"
       }
     },
     "sockjs-client": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
-      "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz",
+      "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==",
       "dev": true,
       "requires": {
         "debug": "^3.2.5",
@@ -9181,23 +10031,17 @@
           "requires": {
             "websocket-driver": ">=0.5.1"
           }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
         }
       }
     },
     "socks": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz",
-      "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz",
+      "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==",
       "dev": true,
       "requires": {
-        "ip": "^1.1.5",
-        "smart-buffer": "4.0.2"
+        "ip": "1.1.5",
+        "smart-buffer": "^4.1.0"
       }
     },
     "socks-proxy-agent": {
@@ -9239,26 +10083,36 @@
     "source-map": {
       "version": "0.5.7",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
     },
     "source-map-loader": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz",
-      "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.0.2.tgz",
+      "integrity": "sha512-oX8d6ndRjN+tVyjj6PlXSyFPhDdVAPsZA30nD3/II8g4uOv8fCz0DMn5sy8KtVbDfKQxOpGwGJnK3xIW3tauDw==",
       "dev": true,
       "requires": {
-        "async": "^2.5.0",
-        "loader-utils": "^1.1.0"
+        "data-urls": "^2.0.0",
+        "iconv-lite": "^0.6.2",
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^2.7.0",
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
       }
     },
     "source-map-resolve": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
-      "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
       "dev": true,
       "requires": {
-        "atob": "^2.1.1",
+        "atob": "^2.1.2",
         "decode-uri-component": "^0.2.0",
         "resolve-url": "^0.2.1",
         "source-map-url": "^0.4.0",
@@ -9266,9 +10120,9 @@
       }
     },
     "source-map-support": {
-      "version": "0.5.13",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
-      "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+      "version": "0.5.19",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
       "dev": true,
       "requires": {
         "buffer-from": "^1.0.0",
@@ -9290,15 +10144,15 @@
       "dev": true
     },
     "sourcemap-codec": {
-      "version": "1.4.6",
-      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz",
-      "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==",
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
       "dev": true
     },
     "spdx-correct": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
-      "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
       "dev": true,
       "requires": {
         "spdx-expression-parse": "^3.0.0",
@@ -9306,15 +10160,15 @@
       }
     },
     "spdx-exceptions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
-      "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
       "dev": true
     },
     "spdx-expression-parse": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
-      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
       "dev": true,
       "requires": {
         "spdx-exceptions": "^2.1.0",
@@ -9322,15 +10176,15 @@
       }
     },
     "spdx-license-ids": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
-      "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
+      "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==",
       "dev": true
     },
     "spdy": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz",
-      "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
       "dev": true,
       "requires": {
         "debug": "^4.1.0",
@@ -9338,23 +10192,6 @@
         "http-deceiver": "^1.2.7",
         "select-hose": "^2.0.0",
         "spdy-transport": "^3.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
       }
     },
     "spdy-transport": {
@@ -9371,53 +10208,23 @@
         "wbuf": "^1.7.3"
       },
       "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
         "readable-stream": {
-          "version": "3.4.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
-          "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
           "dev": true,
           "requires": {
             "inherits": "^2.0.3",
             "string_decoder": "^1.1.1",
             "util-deprecate": "^1.0.1"
           }
-        },
-        "safe-buffer": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
-          "dev": true
-        },
-        "string_decoder": {
-          "version": "1.3.0",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-          "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.2.0"
-          }
         }
       }
     },
     "speed-measure-webpack-plugin": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz",
-      "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz",
+      "integrity": "sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ==",
       "dev": true,
       "requires": {
         "chalk": "^2.0.1"
@@ -9456,14 +10263,20 @@
       }
     },
     "ssri": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
-      "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz",
+      "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==",
       "dev": true,
       "requires": {
-        "figgy-pudding": "^3.5.1"
+        "minipass": "^3.1.1"
       }
     },
+    "stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+      "dev": true
+    },
     "static-extend": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
@@ -9486,9 +10299,9 @@
       }
     },
     "statuses": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
-      "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
       "dev": true
     },
     "stream-browserify": {
@@ -9522,44 +10335,12 @@
         "readable-stream": "^2.3.6",
         "to-arraybuffer": "^1.0.0",
         "xtend": "^4.0.0"
-      },
-      "dependencies": {
-        "process-nextick-args": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-          "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-          "dev": true
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
       }
     },
     "stream-shift": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
-      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+      "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
       "dev": true
     },
     "strict-uri-encode": {
@@ -9569,68 +10350,94 @@
       "dev": true
     },
     "string-width": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+      "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+      "requires": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      }
+    },
+    "string.prototype.trimend": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz",
+      "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==",
       "dev": true,
       "requires": {
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^4.0.0"
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.0-next.1"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+        "es-abstract": {
+          "version": "1.18.0-next.1",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
           "dev": true,
           "requires": {
-            "ansi-regex": "^3.0.0"
+            "es-to-primitive": "^1.2.1",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.1",
+            "is-callable": "^1.2.2",
+            "is-negative-zero": "^2.0.0",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
           }
         }
       }
     },
-    "string.prototype.trimleft": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
-      "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
+    "string.prototype.trimstart": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz",
+      "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==",
       "dev": true,
       "requires": {
         "define-properties": "^1.1.3",
-        "function-bind": "^1.1.1"
-      }
-    },
-    "string.prototype.trimright": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
-      "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.3",
-        "function-bind": "^1.1.1"
+        "es-abstract": "^1.18.0-next.1"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.18.0-next.1",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+          "dev": true,
+          "requires": {
+            "es-to-primitive": "^1.2.1",
+            "function-bind": "^1.1.1",
+            "has": "^1.0.3",
+            "has-symbols": "^1.0.1",
+            "is-callable": "^1.2.2",
+            "is-negative-zero": "^2.0.0",
+            "is-regex": "^1.1.1",
+            "object-inspect": "^1.8.0",
+            "object-keys": "^1.1.1",
+            "object.assign": "^4.1.1",
+            "string.prototype.trimend": "^1.0.1",
+            "string.prototype.trimstart": "^1.0.1"
+          }
+        }
       }
     },
     "string_decoder": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
-      "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
       "dev": true,
       "requires": {
         "safe-buffer": "~5.1.0"
       }
     },
     "strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "dev": true,
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
       "requires": {
-        "ansi-regex": "^2.0.0"
+        "ansi-regex": "^5.0.0"
       }
     },
     "strip-eof": {
@@ -9640,63 +10447,101 @@
       "dev": true
     },
     "style-loader": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz",
-      "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz",
+      "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==",
       "dev": true,
       "requires": {
-        "loader-utils": "^1.2.3",
-        "schema-utils": "^2.0.1"
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^2.6.6"
+      }
+    },
+    "stylehacks": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
+      "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
       },
       "dependencies": {
-        "schema-utils": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.2.0.tgz",
-          "integrity": "sha512-5EwsCNhfFTZvUreQhx/4vVQpJ/lnCAkgoIHLhSpp4ZirE+4hzFvdJi0FMub6hxbFVBJYSpeVVmon+2e7uEGRrA==",
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
           "dev": true,
           "requires": {
-            "ajv": "^6.10.2",
-            "ajv-keywords": "^3.4.1"
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
           }
         }
       }
     },
     "stylus": {
-      "version": "0.54.5",
-      "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz",
-      "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=",
+      "version": "0.54.8",
+      "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz",
+      "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==",
       "dev": true,
       "requires": {
-        "css-parse": "1.7.x",
-        "debug": "*",
-        "glob": "7.0.x",
-        "mkdirp": "0.5.x",
-        "sax": "0.5.x",
-        "source-map": "0.1.x"
+        "css-parse": "~2.0.0",
+        "debug": "~3.1.0",
+        "glob": "^7.1.6",
+        "mkdirp": "~1.0.4",
+        "safer-buffer": "^2.1.2",
+        "sax": "~1.2.4",
+        "semver": "^6.3.0",
+        "source-map": "^0.7.3"
       },
       "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
         "glob": {
-          "version": "7.0.6",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
-          "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
             "inherits": "2",
-            "minimatch": "^3.0.2",
+            "minimatch": "^3.0.4",
             "once": "^1.3.0",
             "path-is-absolute": "^1.0.0"
           }
         },
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
         "source-map": {
-          "version": "0.1.43",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
-          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
-          "dev": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "dev": true
         }
       }
     },
@@ -9709,21 +10554,63 @@
         "loader-utils": "^1.0.2",
         "lodash.clonedeep": "^4.5.0",
         "when": "~3.6.x"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
       }
     },
     "supports-color": {
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
       "requires": {
         "has-flag": "^3.0.0"
       }
     },
+    "svgo": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+      "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "coa": "^2.0.2",
+        "css-select": "^2.0.0",
+        "css-select-base-adapter": "^0.1.1",
+        "css-tree": "1.0.0-alpha.37",
+        "csso": "^4.0.2",
+        "js-yaml": "^3.13.1",
+        "mkdirp": "~0.5.1",
+        "object.values": "^1.1.0",
+        "sax": "~1.2.4",
+        "stable": "^0.1.8",
+        "unquote": "~1.1.1",
+        "util.promisify": "~1.0.0"
+      }
+    },
     "swagger-ui-dist": {
-      "version": "3.24.3",
-      "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.24.3.tgz",
-      "integrity": "sha512-kB8qobP42Xazaym7sD9g5mZuRL4416VIIYZMqPEIskkzKqbPLQGEiHA3ga31bdzyzFLgr6Z797+6X1Am6zYpbg=="
+      "version": "3.36.1",
+      "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.36.1.tgz",
+      "integrity": "sha512-p7lx/OubaaCzOfSYDuMbkRvf/a+rTnQAOySN/NhL+k6D5o9WXEEeKZwj/6fRHRoLSHKZq28jc1xQcz8HuYcgwQ=="
     },
     "symbol-observable": {
       "version": "1.2.0",
@@ -9738,32 +10625,31 @@
       "dev": true
     },
     "tar": {
-      "version": "4.4.11",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.11.tgz",
-      "integrity": "sha512-iI4zh3ktLJKaDNZKZc+fUONiQrSn9HkCFzamtb7k8FFmVilHVob7QsLX/VySAW8lAviMzMbFw4QtFb4errwgYA==",
+      "version": "6.0.5",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz",
+      "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==",
       "dev": true,
       "requires": {
-        "chownr": "^1.1.1",
-        "fs-minipass": "^1.2.5",
-        "minipass": "^2.6.4",
-        "minizlib": "^1.2.1",
-        "mkdirp": "^0.5.0",
-        "safe-buffer": "^5.1.2",
-        "yallist": "^3.0.3"
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^3.0.0",
+        "minizlib": "^2.1.1",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
       },
       "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
           "dev": true
         }
       }
     },
     "terser": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.4.tgz",
-      "integrity": "sha512-+ZwXJvdSwbd60jG0Illav0F06GDJF0R4ydZ21Q3wGAFKoBGyJGo34F63vzJHgvYxc1ukOtIjvwEvl9MkjzM6Pg==",
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.0.tgz",
+      "integrity": "sha512-XTT3D3AwxC54KywJijmY2mxZ8nJiEjBHVYzq8l9OaYuRFWeQNBwvipuzzYEP4e+/AVcd1hqG/CqgsdIRyT45Fg==",
       "dev": true,
       "requires": {
         "commander": "^2.20.0",
@@ -9771,12 +10657,6 @@
         "source-map-support": "~0.5.12"
       },
       "dependencies": {
-        "commander": {
-          "version": "2.20.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
-          "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
-          "dev": true
-        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -9786,31 +10666,29 @@
       }
     },
     "terser-webpack-plugin": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz",
-      "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.1.0.tgz",
+      "integrity": "sha512-0ZWDPIP8BtEDZdChbufcXUigOYk6dOX/P/X0hWxqDDcVAQLb8Yy/0FAaemSfax3PAA67+DJR778oz8qVbmy4hA==",
       "dev": true,
       "requires": {
-        "cacache": "^12.0.2",
-        "find-cache-dir": "^2.1.0",
-        "is-wsl": "^1.1.0",
-        "schema-utils": "^1.0.0",
-        "serialize-javascript": "^1.7.0",
+        "cacache": "^15.0.5",
+        "find-cache-dir": "^3.3.1",
+        "jest-worker": "^26.3.0",
+        "p-limit": "^3.0.2",
+        "schema-utils": "^2.6.6",
+        "serialize-javascript": "^4.0.0",
         "source-map": "^0.6.1",
-        "terser": "^4.1.2",
-        "webpack-sources": "^1.4.0",
-        "worker-farm": "^1.7.0"
+        "terser": "^5.0.0",
+        "webpack-sources": "^1.4.3"
       },
       "dependencies": {
-        "find-cache-dir": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
-          "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+        "p-limit": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
+          "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
           "dev": true,
           "requires": {
-            "commondir": "^1.0.1",
-            "make-dir": "^2.0.0",
-            "pkg-dir": "^3.0.0"
+            "p-try": "^2.0.0"
           }
         },
         "source-map": {
@@ -9835,55 +10713,29 @@
       "requires": {
         "readable-stream": "~2.3.6",
         "xtend": "~4.0.1"
-      },
-      "dependencies": {
-        "process-nextick-args": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-          "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-          "dev": true
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "dev": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
       }
     },
     "thunky": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
-      "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
       "dev": true
     },
     "timers-browserify": {
-      "version": "2.0.11",
-      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
-      "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
+      "version": "2.0.12",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
+      "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
       "dev": true,
       "requires": {
         "setimmediate": "^1.0.4"
       }
     },
+    "timsort": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
+      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
+      "dev": true
+    },
     "tmp": {
       "version": "0.0.33",
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -9902,8 +10754,7 @@
     "to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
-      "dev": true
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
     },
     "to-object-path": {
       "version": "0.3.0",
@@ -9912,6 +10763,17 @@
       "dev": true,
       "requires": {
         "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
       }
     },
     "to-regex": {
@@ -9927,24 +10789,12 @@
       }
     },
     "to-regex-range": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
       "requires": {
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "^3.0.2"
-          }
-        }
+        "is-number": "^7.0.0"
       }
     },
     "toidentifier": {
@@ -9954,33 +10804,28 @@
       "dev": true
     },
     "tough-cookie": {
-      "version": "2.4.3",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
-      "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
       "dev": true,
       "requires": {
-        "psl": "^1.1.24",
-        "punycode": "^1.4.1"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true
-        }
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      }
+    },
+    "tr46": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
+      "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.1"
       }
     },
     "tree-kill": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz",
-      "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==",
-      "dev": true
-    },
-    "trim-right": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
-      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
       "dev": true
     },
     "tryer": {
@@ -10002,15 +10847,21 @@
         "yn": "^3.0.0"
       }
     },
+    "ts-pnp": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz",
+      "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==",
+      "dev": true
+    },
     "tslib": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
-      "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
     },
     "tslint": {
-      "version": "5.20.0",
-      "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.0.tgz",
-      "integrity": "sha512-2vqIvkMHbnx8acMogAERQ/IuINOq6DFqgF8/VDvhEkBqQh/x6SP0Y+OHnKth9/ZcHQSroOZwUQSN18v8KKF0/g==",
+      "version": "5.20.1",
+      "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz",
+      "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
@@ -10026,65 +10877,6 @@
         "semver": "^5.3.0",
         "tslib": "^1.8.0",
         "tsutils": "^2.29.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "diff": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
-          "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
-          "dev": true
-        },
-        "esprima": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-          "dev": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "js-yaml": {
-          "version": "3.13.1",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-          "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
-          "dev": true,
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
       }
     },
     "tsutils": {
@@ -10117,10 +10909,16 @@
       "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
       "dev": true
     },
+    "type": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+      "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
+      "dev": true
+    },
     "type-fest": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz",
-      "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==",
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+      "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
       "dev": true
     },
     "type-is": {
@@ -10140,9 +10938,9 @@
       "dev": true
     },
     "typescript": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz",
-      "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==",
+      "version": "3.9.7",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
+      "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
       "dev": true
     },
     "unicode-canonical-property-names-ecmascript": {
@@ -10162,52 +10960,41 @@
       }
     },
     "unicode-match-property-value-ecmascript": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz",
-      "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+      "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
       "dev": true
     },
     "unicode-property-aliases-ecmascript": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz",
-      "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+      "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
       "dev": true
     },
     "union-value": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
-      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
       "dev": true,
       "requires": {
         "arr-union": "^3.1.0",
         "get-value": "^2.0.6",
         "is-extendable": "^0.1.1",
-        "set-value": "^0.4.3"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "set-value": {
-          "version": "0.4.3",
-          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
-          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
-          "dev": true,
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-extendable": "^0.1.1",
-            "is-plain-object": "^2.0.1",
-            "to-object-path": "^0.3.0"
-          }
-        }
+        "set-value": "^2.0.1"
       }
     },
+    "uniq": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+      "dev": true
+    },
+    "uniqs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
+      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
+      "dev": true
+    },
     "unique-filename": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
@@ -10227,39 +11014,34 @@
       }
     },
     "universal-analytics": {
-      "version": "0.4.20",
-      "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz",
-      "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==",
+      "version": "0.4.23",
+      "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz",
+      "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==",
       "dev": true,
       "requires": {
-        "debug": "^3.0.0",
-        "request": "^2.88.0",
+        "debug": "^4.1.1",
+        "request": "^2.88.2",
         "uuid": "^3.0.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
       }
     },
+    "universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "dev": true
+    },
     "unpipe": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
       "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
       "dev": true
     },
+    "unquote": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
+      "dev": true
+    },
     "unset-value": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
@@ -10297,12 +11079,6 @@
           "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
           "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
           "dev": true
-        },
-        "isobject": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
-          "dev": true
         }
       }
     },
@@ -10313,9 +11089,9 @@
       "dev": true
     },
     "uri-js": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
-      "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
+      "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
       "dev": true,
       "requires": {
         "punycode": "^2.1.0"
@@ -10368,6 +11144,14 @@
       "dev": true,
       "requires": {
         "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        }
       }
     },
     "util-deprecate": {
@@ -10385,6 +11169,18 @@
         "object.getownpropertydescriptors": "^2.0.3"
       }
     },
+    "util.promisify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
+      "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.2",
+        "has-symbols": "^1.0.1",
+        "object.getownpropertydescriptors": "^2.1.0"
+      }
+    },
     "utils-merge": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -10392,9 +11188,9 @@
       "dev": true
     },
     "uuid": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
-      "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
       "dev": true
     },
     "validate-npm-package-license": {
@@ -10422,6 +11218,12 @@
       "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
       "dev": true
     },
+    "vendors": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
+      "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
+      "dev": true
+    },
     "verror": {
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
@@ -10434,27 +11236,100 @@
       }
     },
     "vm-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
-      "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
       "dev": true
     },
     "watchpack": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
-      "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
+      "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
       "dev": true,
       "requires": {
-        "chokidar": "^2.0.2",
+        "chokidar": "^3.4.1",
         "graceful-fs": "^4.1.2",
-        "neo-async": "^2.5.0"
+        "neo-async": "^2.5.0",
+        "watchpack-chokidar2": "^2.0.0"
+      }
+    },
+    "watchpack-chokidar2": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
+      "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "chokidar": "^2.1.8"
       },
       "dependencies": {
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          },
+          "dependencies": {
+            "normalize-path": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "remove-trailing-separator": "^1.0.1"
+              }
+            }
+          }
+        },
+        "binary-extensions": {
+          "version": "1.13.1",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+          "dev": true,
+          "optional": true
+        },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
         "chokidar": {
           "version": "2.1.8",
           "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
           "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
           "dev": true,
+          "optional": true,
           "requires": {
             "anymatch": "^2.0.0",
             "async-each": "^1.0.1",
@@ -10470,22 +11345,137 @@
             "upath": "^1.1.1"
           }
         },
-        "normalize-path": {
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fsevents": {
+          "version": "1.2.13",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+          "dev": true,
+          "optional": true
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-extglob": "^2.1.0"
+              }
+            }
+          }
+        },
+        "is-binary-path": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "binary-extensions": "^1.0.0"
+          }
+        },
+        "is-number": {
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-          "dev": true
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
         },
         "readdirp": {
           "version": "2.2.1",
           "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
           "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
           "dev": true,
+          "optional": true,
           "requires": {
             "graceful-fs": "^4.1.11",
             "micromatch": "^3.1.10",
             "readable-stream": "^2.0.2"
           }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
         }
       }
     },
@@ -10498,58 +11488,338 @@
         "minimalistic-assert": "^1.0.0"
       }
     },
+    "wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+      "dev": true,
+      "requires": {
+        "defaults": "^1.0.3"
+      }
+    },
     "web-animations-js": {
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.2.tgz",
       "integrity": "sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA=="
     },
+    "webidl-conversions": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+      "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+      "dev": true
+    },
     "webpack": {
-      "version": "4.39.2",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz",
-      "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==",
+      "version": "4.44.1",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz",
+      "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==",
       "dev": true,
       "requires": {
-        "@webassemblyjs/ast": "1.8.5",
-        "@webassemblyjs/helper-module-context": "1.8.5",
-        "@webassemblyjs/wasm-edit": "1.8.5",
-        "@webassemblyjs/wasm-parser": "1.8.5",
-        "acorn": "^6.2.1",
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/wasm-edit": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "acorn": "^6.4.1",
         "ajv": "^6.10.2",
         "ajv-keywords": "^3.4.1",
         "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^4.1.0",
+        "enhanced-resolve": "^4.3.0",
         "eslint-scope": "^4.0.3",
         "json-parse-better-errors": "^1.0.2",
         "loader-runner": "^2.4.0",
         "loader-utils": "^1.2.3",
         "memory-fs": "^0.4.1",
         "micromatch": "^3.1.10",
-        "mkdirp": "^0.5.1",
+        "mkdirp": "^0.5.3",
         "neo-async": "^2.6.1",
         "node-libs-browser": "^2.2.1",
         "schema-utils": "^1.0.0",
         "tapable": "^1.1.3",
-        "terser-webpack-plugin": "^1.4.1",
-        "watchpack": "^1.6.0",
+        "terser-webpack-plugin": "^1.4.3",
+        "watchpack": "^1.7.4",
         "webpack-sources": "^1.4.1"
       },
       "dependencies": {
-        "acorn": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz",
-          "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==",
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "cacache": {
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "infer-owner": "^1.0.3",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "find-cache-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+          "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^2.0.0",
+            "pkg-dir": "^3.0.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+          "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "is-wsl": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+          "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+          "dev": true
+        },
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "memory-fs": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+          "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+          "dev": true,
+          "requires": {
+            "errno": "^0.1.3",
+            "readable-stream": "^2.0.1"
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "terser": {
+          "version": "4.8.0",
+          "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+          "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+          "dev": true,
+          "requires": {
+            "commander": "^2.20.0",
+            "source-map": "~0.6.1",
+            "source-map-support": "~0.5.12"
+          }
+        },
+        "terser-webpack-plugin": {
+          "version": "1.4.5",
+          "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+          "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
+          "dev": true,
+          "requires": {
+            "cacache": "^12.0.2",
+            "find-cache-dir": "^2.1.0",
+            "is-wsl": "^1.1.0",
+            "schema-utils": "^1.0.0",
+            "serialize-javascript": "^4.0.0",
+            "source-map": "^0.6.1",
+            "terser": "^4.1.2",
+            "webpack-sources": "^1.4.0",
+            "worker-farm": "^1.7.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
           "dev": true
         }
       }
     },
     "webpack-bundle-analyzer": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.5.1.tgz",
-      "integrity": "sha512-CDdaT3TTu4F9X3tcDq6PNJOiNGgREOM0WdN2vVAoUUn+M6NLB5kJ543HImCWbrDwOpbpGARSwU8r+u0Pl367kA==",
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz",
+      "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==",
       "dev": true,
       "requires": {
-        "acorn": "^6.0.7",
-        "acorn-walk": "^6.1.1",
+        "acorn": "^7.1.1",
+        "acorn-walk": "^7.1.1",
         "bfj": "^6.1.1",
         "chalk": "^2.4.1",
         "commander": "^2.18.0",
@@ -10557,171 +11827,154 @@
         "express": "^4.16.3",
         "filesize": "^3.6.1",
         "gzip-size": "^5.0.0",
-        "lodash": "^4.17.15",
+        "lodash": "^4.17.19",
         "mkdirp": "^0.5.1",
         "opener": "^1.5.1",
         "ws": "^6.0.0"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "commander": {
-          "version": "2.20.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
-          "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
           "dev": true
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-          "dev": true
-        },
-        "lodash": {
-          "version": "4.17.15",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
-          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "webpack-core": {
-      "version": "0.6.9",
-      "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz",
-      "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=",
-      "dev": true,
-      "requires": {
-        "source-list-map": "~0.1.7",
-        "source-map": "~0.4.1"
-      },
-      "dependencies": {
-        "source-list-map": {
-          "version": "0.1.8",
-          "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz",
-          "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
-          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
-          "dev": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
         }
       }
     },
     "webpack-dev-middleware": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz",
-      "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==",
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
+      "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
       "dev": true,
       "requires": {
         "memory-fs": "^0.4.1",
-        "mime": "^2.4.2",
+        "mime": "^2.4.4",
+        "mkdirp": "^0.5.1",
         "range-parser": "^1.2.1",
         "webpack-log": "^2.0.0"
       },
       "dependencies": {
-        "mime": {
-          "version": "2.4.4",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
-          "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
-          "dev": true
+        "memory-fs": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+          "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+          "dev": true,
+          "requires": {
+            "errno": "^0.1.3",
+            "readable-stream": "^2.0.1"
+          }
         },
-        "range-parser": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-          "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+        "mime": {
+          "version": "2.4.6",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+          "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
           "dev": true
         }
       }
     },
     "webpack-dev-server": {
-      "version": "3.8.0",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz",
-      "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==",
+      "version": "3.11.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz",
+      "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==",
       "dev": true,
       "requires": {
         "ansi-html": "0.0.7",
         "bonjour": "^3.5.0",
-        "chokidar": "^2.1.6",
+        "chokidar": "^2.1.8",
         "compression": "^1.7.4",
         "connect-history-api-fallback": "^1.6.0",
         "debug": "^4.1.1",
         "del": "^4.1.1",
         "express": "^4.17.1",
-        "html-entities": "^1.2.1",
-        "http-proxy-middleware": "^0.19.1",
+        "html-entities": "^1.3.1",
+        "http-proxy-middleware": "0.19.1",
         "import-local": "^2.0.0",
         "internal-ip": "^4.3.0",
         "ip": "^1.1.5",
-        "is-absolute-url": "^3.0.0",
+        "is-absolute-url": "^3.0.3",
         "killable": "^1.0.1",
-        "loglevel": "^1.6.3",
+        "loglevel": "^1.6.8",
         "opn": "^5.5.0",
         "p-retry": "^3.0.1",
-        "portfinder": "^1.0.21",
+        "portfinder": "^1.0.26",
         "schema-utils": "^1.0.0",
-        "selfsigned": "^1.10.4",
+        "selfsigned": "^1.10.7",
         "semver": "^6.3.0",
         "serve-index": "^1.9.1",
-        "sockjs": "0.3.19",
-        "sockjs-client": "1.3.0",
-        "spdy": "^4.0.1",
+        "sockjs": "0.3.20",
+        "sockjs-client": "1.4.0",
+        "spdy": "^4.0.2",
         "strip-ansi": "^3.0.1",
         "supports-color": "^6.1.0",
         "url": "^0.11.0",
-        "webpack-dev-middleware": "^3.7.0",
+        "webpack-dev-middleware": "^3.7.2",
         "webpack-log": "^2.0.0",
         "ws": "^6.2.1",
-        "yargs": "12.0.5"
+        "yargs": "^13.3.2"
       },
       "dependencies": {
-        "accepts": {
-          "version": "1.3.7",
-          "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
-          "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
           "dev": true,
           "requires": {
-            "mime-types": "~2.1.24",
-            "negotiator": "0.6.2"
+            "micromatch": "^3.1.4",
+            "normalize-path": "^2.1.1"
+          },
+          "dependencies": {
+            "normalize-path": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+              "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+              "dev": true,
+              "requires": {
+                "remove-trailing-separator": "^1.0.1"
+              }
+            }
           }
         },
-        "array-flatten": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+        "binary-extensions": {
+          "version": "1.13.1",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+          "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
           "dev": true
         },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
         "chokidar": {
           "version": "2.1.8",
           "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
@@ -10742,200 +11995,185 @@
             "upath": "^1.1.1"
           }
         },
-        "content-disposition": {
-          "version": "0.5.3",
-          "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
-          "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
           "dev": true,
           "requires": {
-            "safe-buffer": "5.1.2"
-          }
-        },
-        "cookie": {
-          "version": "0.4.0",
-          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
-          "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
-          "dev": true
-        },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-          "dev": true
-        },
-        "express": {
-          "version": "4.17.1",
-          "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
-          "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
-          "dev": true,
-          "requires": {
-            "accepts": "~1.3.7",
-            "array-flatten": "1.1.1",
-            "body-parser": "1.19.0",
-            "content-disposition": "0.5.3",
-            "content-type": "~1.0.4",
-            "cookie": "0.4.0",
-            "cookie-signature": "1.0.6",
-            "debug": "2.6.9",
-            "depd": "~1.1.2",
-            "encodeurl": "~1.0.2",
-            "escape-html": "~1.0.3",
-            "etag": "~1.8.1",
-            "finalhandler": "~1.1.2",
-            "fresh": "0.5.2",
-            "merge-descriptors": "1.0.1",
-            "methods": "~1.1.2",
-            "on-finished": "~2.3.0",
-            "parseurl": "~1.3.3",
-            "path-to-regexp": "0.1.7",
-            "proxy-addr": "~2.0.5",
-            "qs": "6.7.0",
-            "range-parser": "~1.2.1",
-            "safe-buffer": "5.1.2",
-            "send": "0.17.1",
-            "serve-static": "1.14.1",
-            "setprototypeof": "1.1.1",
-            "statuses": "~1.5.0",
-            "type-is": "~1.6.18",
-            "utils-merge": "1.0.1",
-            "vary": "~1.1.2"
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
           },
           "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-              "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "ansi-regex": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+              "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
               "dev": true,
               "requires": {
-                "ms": "2.0.0"
+                "ansi-regex": "^4.1.0"
               }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-              "dev": true
             }
           }
         },
-        "finalhandler": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
-          "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
           "dev": true,
           "requires": {
-            "debug": "2.6.9",
-            "encodeurl": "~1.0.2",
-            "escape-html": "~1.0.3",
-            "on-finished": "~2.3.0",
-            "parseurl": "~1.3.3",
-            "statuses": "~1.5.0",
-            "unpipe": "~1.0.0"
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
           },
           "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-              "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
               "dev": true,
               "requires": {
-                "ms": "2.0.0"
+                "is-extendable": "^0.1.0"
               }
-            },
-            "ms": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-              "dev": true
             }
           }
         },
-        "http-errors": {
-          "version": "1.7.3",
-          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
-          "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
-          "dev": true,
-          "requires": {
-            "depd": "~1.1.2",
-            "inherits": "2.0.4",
-            "setprototypeof": "1.1.1",
-            "statuses": ">= 1.5.0 < 2",
-            "toidentifier": "1.0.0"
-          },
-          "dependencies": {
-            "inherits": {
-              "version": "2.0.4",
-              "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-              "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-              "dev": true
-            }
-          }
-        },
-        "ipaddr.js": {
-          "version": "1.9.0",
-          "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
-          "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==",
-          "dev": true
-        },
-        "mime": {
-          "version": "1.6.0",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-          "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
-        "negotiator": {
-          "version": "0.6.2",
-          "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
-          "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
-          "dev": true
-        },
-        "normalize-path": {
+        "find-up": {
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-          "dev": true
-        },
-        "parseurl": {
-          "version": "1.3.3",
-          "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-          "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
-          "dev": true
-        },
-        "proxy-addr": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
-          "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
           "dev": true,
           "requires": {
-            "forwarded": "~0.1.2",
-            "ipaddr.js": "1.9.0"
+            "locate-path": "^3.0.0"
           }
         },
-        "qs": {
-          "version": "6.7.0",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
-          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+        "fsevents": {
+          "version": "1.2.13",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+          "dev": true,
+          "optional": true
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "dev": true,
+              "requires": {
+                "is-extglob": "^2.1.0"
+              }
+            }
+          }
+        },
+        "is-absolute-url": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+          "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
           "dev": true
         },
-        "range-parser": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-          "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+        "is-binary-path": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+          "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+          "dev": true,
+          "requires": {
+            "binary-extensions": "^1.0.0"
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+          "dev": true
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
           "dev": true
         },
         "readdirp": {
@@ -10949,11 +12187,16 @@
             "readable-stream": "^2.0.2"
           }
         },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-          "dev": true
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
         },
         "semver": {
           "version": "6.3.0",
@@ -10961,76 +12204,43 @@
           "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         },
-        "send": {
-          "version": "0.17.1",
-          "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
-          "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
           "dev": true,
           "requires": {
-            "debug": "2.6.9",
-            "depd": "~1.1.2",
-            "destroy": "~1.0.4",
-            "encodeurl": "~1.0.2",
-            "escape-html": "~1.0.3",
-            "etag": "~1.8.1",
-            "fresh": "0.5.2",
-            "http-errors": "~1.7.2",
-            "mime": "1.6.0",
-            "ms": "2.1.1",
-            "on-finished": "~2.3.0",
-            "range-parser": "~1.2.1",
-            "statuses": "~1.5.0"
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
           },
           "dependencies": {
-            "debug": {
-              "version": "2.6.9",
-              "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-              "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "ansi-regex": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+              "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
               "dev": true,
               "requires": {
-                "ms": "2.0.0"
-              },
-              "dependencies": {
-                "ms": {
-                  "version": "2.0.0",
-                  "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-                  "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-                  "dev": true
-                }
+                "ansi-regex": "^4.1.0"
               }
-            },
-            "ms": {
-              "version": "2.1.1",
-              "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-              "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
-              "dev": true
             }
           }
         },
-        "serve-static": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
-          "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
           "dev": true,
           "requires": {
-            "encodeurl": "~1.0.2",
-            "escape-html": "~1.0.3",
-            "parseurl": "~1.3.3",
-            "send": "0.17.1"
+            "ansi-regex": "^2.0.0"
           }
         },
-        "setprototypeof": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
-          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
-          "dev": true
-        },
-        "statuses": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
-          "dev": true
-        },
         "supports-color": {
           "version": "6.1.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
@@ -11039,6 +12249,72 @@
           "requires": {
             "has-flag": "^3.0.0"
           }
+        },
+        "to-regex-range": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+          "dev": true,
+          "requires": {
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+              "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.1.0"
+              }
+            }
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "13.1.2",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
         }
       }
     },
@@ -11053,12 +12329,12 @@
       }
     },
     "webpack-merge": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz",
-      "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==",
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+      "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
       "dev": true,
       "requires": {
-        "lodash": "^4.17.5"
+        "lodash": "^4.17.15"
       }
     },
     "webpack-sources": {
@@ -11080,31 +12356,46 @@
       }
     },
     "webpack-subresource-integrity": {
-      "version": "1.1.0-rc.6",
-      "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz",
-      "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==",
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.1.tgz",
+      "integrity": "sha512-XMLFInbGbB1HV7K4vHWANzc1CN0t/c4bBvnlvGxGwV45yE/S/feAXIm8dJsCkzqWtSKnmaEgTp/meyeThxG4Iw==",
       "dev": true,
       "requires": {
-        "webpack-core": "^0.6.8"
+        "webpack-sources": "^1.3.0"
       }
     },
     "websocket-driver": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
-      "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
+      "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=",
       "dev": true,
       "requires": {
-        "http-parser-js": ">=0.4.0 <0.4.11",
-        "safe-buffer": ">=5.1.0",
         "websocket-extensions": ">=0.1.1"
       }
     },
     "websocket-extensions": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
-      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
       "dev": true
     },
+    "whatwg-mimetype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+      "dev": true
+    },
+    "whatwg-url": {
+      "version": "8.4.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz",
+      "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==",
+      "dev": true,
+      "requires": {
+        "lodash.sortby": "^4.7.0",
+        "tr46": "^2.0.2",
+        "webidl-conversions": "^6.1.0"
+      }
+    },
     "when": {
       "version": "3.6.4",
       "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz",
@@ -11112,9 +12403,9 @@
       "dev": true
     },
     "which": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
-      "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
       "requires": {
         "isexe": "^2.0.0"
@@ -11123,8 +12414,7 @@
     "which-module": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
     },
     "worker-farm": {
       "version": "1.7.0",
@@ -11136,51 +12426,73 @@
       }
     },
     "worker-plugin": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.2.0.tgz",
-      "integrity": "sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-5.0.0.tgz",
+      "integrity": "sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ==",
       "dev": true,
       "requires": {
         "loader-utils": "^1.1.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "dev": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
       }
     },
     "wrap-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
-      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
-      "dev": true,
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
       "requires": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1"
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
       },
       "dependencies": {
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-          "dev": true,
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "requires": {
-            "number-is-nan": "^1.0.0"
+            "color-convert": "^2.0.1"
           }
         },
-        "string-width": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
-          "dev": true,
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
           "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
+            "color-name": "~1.1.4"
           }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         }
       }
     },
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
     },
     "ws": {
       "version": "6.2.1",
@@ -11192,9 +12504,9 @@
       }
     },
     "xhr2": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz",
-      "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8="
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.0.tgz",
+      "integrity": "sha512-BDtiD0i2iKPK/S8OAZfpk6tyzEDnKKSjxWHcMBVmh+LuqJ8A32qXTyOx+TVOg2dKvq6zGBq2sgKPkEeRs1qTRA=="
     },
     "xtend": {
       "version": "4.0.2",
@@ -11205,40 +12517,36 @@
     "y18n": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
-      "dev": true
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
     },
     "yallist": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
-      "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
     },
     "yargs": {
-      "version": "12.0.5",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
-      "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
-      "dev": true,
+      "version": "15.3.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz",
+      "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==",
       "requires": {
-        "cliui": "^4.0.0",
+        "cliui": "^6.0.0",
         "decamelize": "^1.2.0",
-        "find-up": "^3.0.0",
-        "get-caller-file": "^1.0.1",
-        "os-locale": "^3.0.0",
+        "find-up": "^4.1.0",
+        "get-caller-file": "^2.0.1",
         "require-directory": "^2.1.1",
-        "require-main-filename": "^1.0.1",
+        "require-main-filename": "^2.0.0",
         "set-blocking": "^2.0.0",
-        "string-width": "^2.0.0",
+        "string-width": "^4.2.0",
         "which-module": "^2.0.0",
-        "y18n": "^3.2.1 || ^4.0.0",
-        "yargs-parser": "^11.1.1"
+        "y18n": "^4.0.0",
+        "yargs-parser": "^18.1.0"
       }
     },
     "yargs-parser": {
-      "version": "11.1.1",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
-      "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
-      "dev": true,
+      "version": "18.1.3",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
       "requires": {
         "camelcase": "^5.0.0",
         "decamelize": "^1.2.0"
@@ -11251,9 +12559,9 @@
       "dev": true
     },
     "zone.js": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz",
-      "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag=="
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz",
+      "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg=="
     }
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/package.json b/services/self-service/src/main/resources/webapp/package.json
index 1284d50..bd320b3 100644
--- a/services/self-service/src/main/resources/webapp/package.json
+++ b/services/self-service/src/main/resources/webapp/package.json
@@ -15,42 +15,43 @@
   },
   "private": true,
   "dependencies": {
-    "@angular/animations": "^8.2.7",
-    "@angular/cdk": "^8.2.0",
-    "@angular/common": "^8.2.6",
-    "@angular/compiler": "^8.2.6",
-    "@angular/core": "^8.2.6",
-    "@angular/forms": "^8.2.6",
-    "@angular/material": "^8.2.0",
-    "@angular/material-moment-adapter": "^8.2.0",
-    "@angular/platform-browser": "^8.2.6",
-    "@angular/platform-browser-dynamic": "^8.2.6",
-    "@angular/platform-server": "^8.2.6",
-    "@angular/router": "^8.2.6",
-    "core-js": "3.2.1",
-    "guacamole-common-js": "^1.1.0",
-    "hammerjs": "^2.0.8",
+    "@angular/animations": "^10.2.1",
+    "@angular/cdk": "^10.2.6",
+    "@angular/common": "^10.2.1",
+    "@angular/compiler": "^10.2.1",
+    "@angular/core": "^10.2.1",
+    "@angular/forms": "^10.2.1",
+    "@angular/localize": "^10.2.1",
+    "@angular/material": "^10.2.6",
+    "@angular/material-moment-adapter": "^10.2.6",
+    "@angular/platform-browser": "^10.2.1",
+    "@angular/platform-browser-dynamic": "^10.2.1",
+    "@angular/platform-server": "^10.2.1",
+    "@angular/router": "^10.2.1",
+    "core-js": "^3.6.5",
+    "guacamole-common-js": "^1.2.0",
     "moment": "^2.24.0",
-    "moment-timezone": "^0.5.26",
+    "moment-timezone": "^0.5.31",
     "ng-daterangepicker": "^1.1.0",
-    "ngx-toastr": "^10.2.0",
-    "rxjs": "6.5.3",
+    "ng2-ace-editor": "^0.3.9",
+    "ngx-toastr": "^12.1.0",
+    "rxjs": "^6.6.3",
     "rxjs-compat": "6.5.3",
-    "swagger-ui-dist": "^3.24.3",
-    "tslib": "^1.10.0",
+    "swagger-ui-dist": "^3.36.1",
+    "tslib": "^1.14.1",
     "web-animations-js": "^2.3.2",
-    "zone.js": "~0.9.1"
+    "zone.js": "^0.10.3"
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "~0.803.5",
-    "@angular/cli": "^8.3.5",
-    "@angular/compiler-cli": "^8.2.1",
-    "@types/moment-timezone": "^0.5.12",
-    "@types/node": "^12.7.5",
-    "codelyzer": "^5.0.1",
+    "@angular-devkit/build-angular": "^0.1002.0",
+    "@angular/cli": "^10.2.0",
+    "@angular/compiler-cli": "^10.2.1",
+    "@types/moment-timezone": "^0.5.30",
+    "@types/node": "^12.11.1",
+    "codelyzer": "^6.0.0",
     "ts-node": "~8.4.1",
-    "tslint": "^5.20.0",
-    "typescript": "^3.5.3",
-    "webpack-bundle-analyzer": "^3.5.0"
+    "tslint": "^5.20.1",
+    "typescript": "^3.9.2",
+    "webpack-bundle-analyzer": "^3.9.0"
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/administration.module.ts b/services/self-service/src/main/resources/webapp/src/app/administration/administration.module.ts
index e535bda..dfbbbf7 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/administration.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/administration.module.ts
@@ -23,10 +23,12 @@
 import { ManagenementModule } from './management';
 import { ProjectModule } from './project';
 import { RolesModule } from './roles';
+import {ConfigurationModule} from './configuration';
+import {OdahuModule} from './odahu';
 
 @NgModule({
-  imports: [CommonModule, ManagenementModule, ProjectModule, RolesModule],
+  imports: [CommonModule, ManagenementModule, ProjectModule, RolesModule, ConfigurationModule, OdahuModule],
   declarations: [],
-  exports: [ManagenementModule, ProjectModule, RolesModule]
+  exports: [ManagenementModule, ProjectModule, RolesModule, ConfigurationModule, OdahuModule]
 })
 export class AdministrationModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/configuration/configuration.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/configuration/configuration.component.html
new file mode 100644
index 0000000..faab5da
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/configuration/configuration.component.html
@@ -0,0 +1,148 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<div class="base-retreat configuration">
+  <div class="sub-nav">
+    <div class="selection">
+      <ng-template [ngIf]="endpoints?.length > 1">
+        <label class="label">Selected endpoint </label>
+        <div class="mat-reset">
+          <div class="control selector-wrapper">
+            <mat-form-field [ngClass]="{ 'not-active' : services['provisioning'].isConfigChanged || services['self-service'].isConfigChanged || services['billing'].isConfigChanged }">
+              <mat-label>Select endpoint</mat-label>
+                <mat-select 
+                  disableOptionCentering 
+                  [(value)]="activeEndpoint" 
+                  panelClass="top-select scrolling" 
+                  [disabled]="services['provisioning'].isConfigChanged || services['self-service'].isConfigChanged || services['billing'].isConfigChanged">
+                  <mat-option 
+                    *ngFor="let endpoint of endpoints" 
+                    [value]="endpoint.name" 
+                    [disabled]="endpoint.status !== 'ACTIVE'"
+                    (click)="setActiveEndpoint(endpoint.name)">
+                    {{ endpoint.name === 'local' ? endpoint.name : endpoint.name + ' (external endpoint)'}}{{endpoint.status !== 'ACTIVE' ? ', inactive' : ''}}
+                  </mat-option>
+                </mat-select>
+              <button class="caret">
+                <i class="material-icons">keyboard_arrow_down</i>
+              </button>
+            </mat-form-field>
+          </div>
+        </div>
+      </ng-template>
+    </div>
+    <div>
+      <ng-template [ngIf]="activeTab.index !== 0">
+        <button mat-raised-button class="butt"
+                (click)="action('save')"
+                [disabled]="!services['provisioning'].isConfigChanged && !services['self-service'].isConfigChanged && !services['billing'].isConfigChanged"
+        >
+          Save
+        </button>
+        <button mat-raised-button class="butt"
+                (click)="action('discard')"
+                [disabled]="!services['provisioning'].isConfigChanged && !services['self-service'].isConfigChanged && !services['billing'].isConfigChanged"
+        >
+          Discard changes
+        </button>
+      </ng-template>
+      <button
+        mat-raised-button type="button"
+        class="butt action"
+        (click)="restartServices()"
+        [disabled]="isServiceSelected()"
+      >
+        Restart
+      </button>
+      <button mat-raised-button class="butt" (click)="refreshConfig()">
+        <i class="material-icons refresh-icon">autorenew</i>Refresh
+      </button>
+    </div>
+  </div>
+  <mat-divider></mat-divider>
+  <div class="configuration-wrapper">
+    <mat-tab-group animationDuration="0.5ms" (selectedTabChange)="tabChanged($event)" [selectedIndex]=activeTab.index>
+      <mat-tab label="Main"
+               [disabled]="!(!services['provisioning'].isConfigChanged && !services['self-service'].isConfigChanged && !services['billing'].isConfigChanged) && activeTab.index !== 0"
+      >
+        <h4>Main settings</h4>
+        <div class="main-wrapper">
+          <section class="section">
+            <p class="section-title">Restart services</p>
+            <div class="section-content">
+              <ul class="list-menu selection-list">
+                <li *ngFor="let service of services | keys">
+                  <p 
+                    class="list-item" 
+                    role="menuitem" 
+                    *ngIf="(activeEndpoint !== 'local' && (service.key === 'provisioning' || service.key === 'billing') || activeEndpoint === 'local')">
+                    <span (click)="toggleSettings(service.key);$event.stopPropagation()" class="d-flex">
+                      <div class="checkbox-wrap">
+                        <datalab-checkbox
+                          [checked]="services[service.key].selected"
+                          (toggleSelection)="toggleSettings(service.key)"
+                        >
+                        </datalab-checkbox>
+                      </div>
+                      {{service.value.label}}
+                    </span>
+                  </p>
+                </li>
+              </ul>
+            </div>
+          </section>
+        </div>
+      </mat-tab>
+
+      <mat-tab label="Self-service"
+              *ngIf="activeEndpoint === 'local'"
+               [disabled]="!(!services['provisioning'].isConfigChanged && !services['self-service'].isConfigChanged && !services['billing'].isConfigChanged) && activeTab.index !== 1"
+
+      >
+        <h4>Edit self-service.yml</h4>
+        <div class="editor-wrap">
+          <div #selfEditor ace-editor mode="yaml" [(text)]="services['self-service'].config" [autoUpdateContent]="true" (textChange)="configUpdate('self-service')"></div>
+        </div>
+      </mat-tab>
+
+      <mat-tab label="Provisioning"
+               [disabled]="!(!services['provisioning'].isConfigChanged
+               && !services['self-service'].isConfigChanged
+               && !services['billing'].isConfigChanged)
+               && activeTab.index !== 2">
+
+        <h4>Edit provisioning.yml</h4>
+        <div class="editor-wrap">
+          <div #provEditor ace-editor [(text)]="services['provisioning'].config" [autoUpdateContent]="true" mode="yaml" (textChange)="configUpdate('provisioning')"></div>
+        </div>
+      </mat-tab>
+
+      <mat-tab label="Billing"
+               [disabled]="!(!services['provisioning'].isConfigChanged && !services['self-service'].isConfigChanged && !services['billing'].isConfigChanged) && activeTab.index !== 3"
+      >
+        <h4>Edit billing.yml</h4>
+        <div class="editor-wrap">
+          <div #billingEditor ace-editor mode="yaml" [(text)]="services['billing'].config" [autoUpdateContent]="true" (textChange)="configUpdate('billing')"></div>
+
+        </div>
+      </mat-tab>
+    </mat-tab-group>
+  </div>
+</div>
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/configuration/configuration.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/configuration/configuration.component.scss
new file mode 100644
index 0000000..2df3042
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/configuration/configuration.component.scss
@@ -0,0 +1,112 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.configuration-wrapper{
+  box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
+  padding-top: 0;
+  height: calc(100vh - 130px);
+
+  .sub-nav{
+    justify-content: flex-end;
+    padding: 0 30px;
+  }
+
+  h4{
+    padding: 10px 30px;
+    color: rgba(0,0,0,.87);
+    font-family: 'Open Sans', sans-serif;
+  }
+
+  .editor-wrap{
+    height: calc(100% - 60px);
+    box-shadow: 0 2px 24px 0 rgba(73,93,112,0.3);
+    margin: 0 30px;
+  }
+
+  .main-wrapper{
+    padding: 10px 30px;
+    font-family: 'Open Sans', sans-serif;
+
+    .section{
+
+      &-title{
+        font-size: 15px;
+      }
+
+      &-content {
+
+        .list-menu {
+          width: 100%;
+          max-height: 450px;
+          left: 0;
+          padding: 10px 0;
+          margin: 0;
+          overflow-y: auto;
+          overflow-x: hidden;
+          font-size: 14px;
+
+          li {
+            padding: 0;
+            margin: 0;
+          }
+
+          .list-item{
+            padding: 5px 10px;
+            display: flex;
+
+            span{
+              cursor: pointer;
+            }
+
+            .checkbox-wrap{
+              display: flex;
+              align-items: center;
+              margin-right: 5px;
+              margin-top: 0;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+.sub-nav{
+  justify-content: space-between;
+
+  .label{
+    display: flex;
+    align-items: center;
+    margin-right: 10px;
+    color: #718ba6;
+    font-size: 15px;
+    font-weight: 600;
+    text-align: left;
+    font-family: "Open Sans", sans-serif;
+  }
+
+  .butt{
+    margin-left: 10px;
+  }
+
+}
+
+.mat-option-disabled {
+  opacity: 0.38;
+  pointer-events: none;
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/configuration/configuration.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/configuration/configuration.component.ts
new file mode 100644
index 0000000..919799f
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/configuration/configuration.component.ts
@@ -0,0 +1,422 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import {Component, OnInit, Inject, HostListener, OnDestroy, ViewChild, ElementRef} from '@angular/core';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import {HealthStatusService, AppRoutingService, EndpointService} from '../../core/services';
+import {MatTabChangeEvent} from '@angular/material/tabs';
+import {Router} from '@angular/router';
+import {ConfigurationService} from '../../core/services/configutration.service';
+import 'brace';
+import 'brace/mode/yaml';
+import {ToastrService} from 'ngx-toastr';
+import {Observable, Subject} from 'rxjs';
+import {takeUntil} from 'rxjs/operators';
+import { EnvironmentsDataService } from '../management/management-data.service';
+import { EnvironmentModel } from '../management/management.model';
+
+@Component({
+  selector: 'datalab-configuration',
+  templateUrl: './configuration.component.html',
+  styleUrls: ['./configuration.component.scss']
+})
+export class ConfigurationComponent implements OnInit, OnDestroy {
+  @ViewChild('selfEditor') selfEditor: ElementRef<HTMLElement>;
+  @ViewChild('provEditor') provEditor: ElementRef<HTMLElement>;
+  @ViewChild('billingEditor') billingEditor: ElementRef<HTMLElement>;
+  private unsubscribe$ = new Subject();
+  private healthStatus: any;
+  public activeTab = {index: 0};
+  public activeService: string;
+  public services = {
+    'self-service': {label: 'Self-service', selected: false, config: '', serverConfig: '', isConfigChanged: false},
+    'provisioning': {label: 'Provisioning', selected: false, config: '', serverConfig: '', isConfigChanged: false},
+    'billing': {label: 'Billing', selected: false, config: '', serverConfig: '', isConfigChanged: false},
+  };
+
+  public messagesStatus = {
+    success: [],
+    error: [],
+    counter: 0
+  };
+  
+  public environmentStatuses = {};
+  public environments = [];
+  public ingStatuses = ['creating', 'configuring', 'reconfiguring', 'creating image', 'stopping', 'starting', 'terminating'];
+
+  private confirmMessages = {
+    restartService: 'Restarting services will make DataLab unavailable for some time.',
+    discardChanges: 'Discard all unsaved changes.',
+    saveChanges: 'After you save changes you need to restart service.',
+  };
+  public activeEndpoint: string;
+  public endpoints: Array<string> | any;
+
+  @HostListener('window:keydown', ['$event'])
+  onKeyDown(event: KeyboardEvent) {
+    if ((event.metaKey || event.ctrlKey) &&
+      event.key === 's' &&
+      this.activeTab.index !== 0 &&
+      this.router.url === '/configuration' &&
+      this.services[this.activeService].config !== this.services[this.activeService].serverConfig
+    ) {
+      this.action('save');
+      event.preventDefault();
+    }
+  }
+
+  constructor(
+    private healthStatusService: HealthStatusService,
+    private appRoutingService: AppRoutingService,
+    private endpointService: EndpointService,
+    private configurationService: ConfigurationService,
+    private environmentsDataService: EnvironmentsDataService,
+    private router: Router,
+    public dialog: MatDialog,
+    public toastr: ToastrService,
+  ) { }
+
+  ngOnInit() {
+    this.getEnvironmentHealthStatus();
+    this.getEndpoints()
+      .subscribe(endpoints => {
+      this.endpoints = endpoints;
+      
+      this.endpoints = this.endpoints.map(endpoint => ({name: endpoint.name, status: endpoint.status }));
+
+      this.activeEndpoint = this.endpoints[0].name;
+      this.getServicesConfig(this.activeEndpoint);
+    });
+
+    this.environmentsDataService.getEnvironmentDataDirect().subscribe((data: any) => {
+      this.environments = EnvironmentModel.loadEnvironments(data);
+      this.environments.map(env => {
+        this.checkResource(env.status, env.endpoint);
+        if(env.resources?.length > 0) {
+          env.resources.map(resource => {
+            this.checkResource(resource.status, env.endpoint);
+          })
+        }
+      });
+    });
+  }
+
+  ngOnDestroy() {
+    this.unsubscribe$.next();
+    this.unsubscribe$.complete();
+  }
+
+  public checkResource(resourceStatus: string, endpoint: string) {
+    if( this.ingStatuses.includes(resourceStatus) ) {
+      if(!this.environmentStatuses[endpoint]) {
+        this.environmentStatuses[endpoint] = [];
+        this.environmentStatuses[endpoint].push(resourceStatus);
+      } else {
+        this.environmentStatuses[endpoint].push(resourceStatus);
+      }
+    }
+  }
+
+  private getEnvironmentHealthStatus(): void {
+    this.healthStatusService.getEnvironmentHealthStatus()
+      .pipe(
+        takeUntil(this.unsubscribe$)
+      )
+      .subscribe((result: any) => {
+          this.healthStatus = result;
+          !this.healthStatus.admin && !this.healthStatus.projectAdmin && this.appRoutingService.redirectToHomePage();
+          }
+      );
+  }
+
+  private getEndpoints(): Observable<{}> {
+    return this.endpointService.getEndpointsData();
+  }
+
+  public refreshConfig(): void {
+    this.getServicesConfig(this.activeEndpoint);
+  }
+
+  public action(action: string): void {
+    this.dialog.open(SettingsConfirmationDialogComponent, { data: {
+        action: action, 
+        message: action === 'discard' ? this.confirmMessages.discardChanges : this.confirmMessages.saveChanges,
+        environmentStatuses: this.environmentStatuses,
+        activeEndpoint: this.activeEndpoint
+      }, panelClass: 'modal-sm' })
+      .afterClosed().subscribe(result => {
+      if (result && action === 'save') this.setServiceConfig(this.activeService, this.services[this.activeService].config);
+      if (result && action === 'discard') this.services[this.activeService].config = this.services[this.activeService].serverConfig;
+      this.configUpdate(this.activeService);
+    });
+  }
+
+  private getServicesConfig(endpoint): void {
+      this.configurationService.getServiceSettings(endpoint)
+        .pipe(
+          takeUntil(this.unsubscribe$)
+        )
+        .subscribe(config => {
+          for (const service in this.services) {
+            const file = `${service}.yml`;
+            this.services[service].config = config[file];
+            this.services[service].serverConfig = config[file];
+            this.configUpdate(service);
+          }
+        }
+      );
+
+    this.clearSelectedServices();
+  }
+
+  private setServiceConfig(service: string, config: string): void {
+    this.configurationService.setServiceConfig(service, config, this.activeEndpoint)
+      .pipe(
+        takeUntil(this.unsubscribe$)
+      )
+      .subscribe(res => {
+      this.getServicesConfig(this.activeEndpoint);
+      this.toastr.success('Service configuration saved!', 'Success!');
+      },
+      error => this.toastr.error( error.message || 'Service configuration is not saved', 'Oops!')
+    );
+  }
+
+  refreshServiceEditor(editor: ElementRef<HTMLElement>) {
+    if(editor) {
+      editor.nativeElement.children[3].scrollTop = 100;
+      editor.nativeElement.children[3].scrollTop = 0;
+    }
+  }
+
+  public tabChanged(tabChangeEvent: MatTabChangeEvent): void {
+    this.activeTab = tabChangeEvent;
+    
+    if (this.activeTab.index === 1 && this.activeEndpoint === 'local') {
+      this.activeService = 'self-service';
+      this.refreshServiceEditor(this.selfEditor);
+    } else if ((this.activeEndpoint !== 'local' && this.activeTab.index === 1) || 
+            (this.activeTab.index === 2 && this.activeEndpoint === 'local')) {
+      this.activeService = 'provisioning';
+      this.refreshServiceEditor(this.provEditor);
+    } else if ((this.activeEndpoint !== 'local' && this.activeTab.index === 2) || 
+            (this.activeTab.index === 3 && this.activeEndpoint === 'local')) {
+      this.activeService = 'billing';
+      this.refreshServiceEditor(this.billingEditor);
+    } else {
+      this.activeService = '';
+    }
+
+    if (!!this.activeService) {
+      if (this.services[this.activeService].config !== this.services[this.activeService].serverConfig) {
+        this.dialog.open(SettingsConfirmationDialogComponent, { data: {
+            action: 'Was changed',
+            environmentStatuses: this.environmentStatuses,
+            activeEndpoint: this.activeEndpoint
+          }, panelClass: 'modal-sm' })
+          .afterClosed().subscribe(result => {
+          if (result) {
+            this.services[this.activeService].serverConfig = this.services[this.activeService].config;
+          } else {
+            this.services[this.activeService].config = this.services[this.activeService].serverConfig;
+          }
+        });
+      }
+    }
+    this.clearSelectedServices();
+  }
+
+  private clearSelectedServices(): void {
+    Object.keys(this.services).forEach(service => this.services[service].selected = false);
+  }
+
+  public toggleSettings(service): void {
+    this.services[service].selected = !this.services[service].selected;
+  }
+
+  public restartSingleService(ui: boolean, prov: boolean, billing: boolean, serviceName) {
+    this.configurationService.restartServices(ui, prov, billing, this.activeEndpoint)
+      .pipe(
+        takeUntil(this.unsubscribe$),
+      )
+      .subscribe(
+        res => {
+          this.messagesStatus.success.push(serviceName);
+          this.messagesStatus.counter -= 1;
+        },
+        error => {
+          if (serviceName === 'Self-service') {
+            this.messagesStatus.success.push(serviceName);
+          } else {
+            this.messagesStatus.error.push(serviceName);
+          }
+          this.messagesStatus.counter -= 1;
+        }
+      );
+  }
+
+  public restartServices(): void  {
+    const selectedServices = [];
+    for (const service in this.services) {
+      if (this.services[service].selected) {
+        selectedServices.push(service);
+      }
+    }
+
+    this.dialog.open(
+      SettingsConfirmationDialogComponent, 
+      { 
+        data: {
+          action: 'restart', 
+          services: selectedServices,
+          environmentStatuses: this.environmentStatuses,
+          activeEndpoint: this.activeEndpoint 
+        }, 
+        panelClass: 'modal-sm' 
+      })
+      .afterClosed().subscribe(result => {
+        if (result) {
+          this.messagesStatus.error = [];
+          this.messagesStatus.success = [];
+          
+          if(this.environmentStatuses[this.activeEndpoint] && this.services['provisioning'].selected) {
+            this.services['provisioning'].selected = false;
+          }
+
+          if(this.services['self-service'].selected) {
+            this.messagesStatus.counter += 1;
+            this.restartSingleService(true, false, false, 'Self-service')
+          } 
+          if(this.services['provisioning'].selected) {
+            this.messagesStatus.counter += 1;
+            this.restartSingleService(false, true, false, 'Provisioning service')
+          } 
+          if(this.services['billing'].selected) {
+            this.messagesStatus.counter += 1;
+            this.restartSingleService(false, false, true, 'Billing service')
+          }
+
+          let timer = setInterval(() => {
+            
+            if(this.messagesStatus.counter === 0) {
+              for(let key in this.messagesStatus) {
+                if(key === 'error' && this.messagesStatus[key].length > 0) {
+                  this.toastr.error(`${this.messagesStatus[key].join(', ')} restarting failed`, 'Oops!');
+                } else if(key === 'success' && this.messagesStatus[key].length > 0) {
+                  this.toastr.success(`${this.messagesStatus[key].join(', ')} restarting started!`, 'Success!');
+                }
+              }
+              clearInterval(timer);
+            } 
+          }, 200);
+          this.clearSelectedServices();
+        } else {
+          this.clearSelectedServices();
+        }
+    });
+  }
+
+  public configUpdate(service: string): void {
+    this.services[service].isConfigChanged = this.services[service].config !== this.services[service].serverConfig;
+  }
+
+  public isServiceSelected(): boolean {
+    return Object.keys(this.services).every(service => !this.services[service].selected);
+  }
+
+
+  public setActiveEndpoint(endpoint) {
+    this.activeEndpoint = endpoint;
+    this.getServicesConfig(this.activeEndpoint);
+    this.activeTab.index = 0;
+  }
+}
+
+@Component({
+  selector: 'confirm-dialog',
+  template: `
+  <div id="dialog-box">
+    <div class="dialog-header">
+      <h4 class="modal-title"><span class="capitalize">{{ data.action }}</span> <span *ngIf="data.action === 'save' || data.action === 'discard'"> changes</span><span *ngIf="data.action === 'restart'">
+        service<span *ngIf="data.services.length > 1">s</span>
+      </span></h4>
+      <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
+    </div>
+
+    <div mat-dialog-content class="content">
+      <ng-template [ngIf]="data.action === 'restart' && !data.environmentStatuses[data.activeEndpoint]?.length" ]>
+        <span class="strong">{{data.services.join(', ') | titlecase}}</span> 
+        <span class="strong" *ngIf="data.services.length > 1 || (data.services.length === 1 && data.services[0] !== 'self-service')"> service</span>
+        <span class="strong" [hidden]="(data.services.length < 2) || data.services.length === 2 && data.services[0] === 'self-service'">s</span>: restarting will make DataLab unavailable for some time.
+      </ng-template>
+
+      <ng-template [ngIf]="data.action === 'restart' && data.environmentStatuses[data.activeEndpoint]?.length && filterProvisioning.length" ]>
+        <span class="strong" >{{filterProvisioning.join(', ') | titlecase}}</span> 
+        <span class="strong" *ngIf="filterProvisioning.length > 1 || (filterProvisioning.length === 1 && filterProvisioning[0] !== 'self-service')"> service</span>
+        <span [hidden]="(filterProvisioning.length < 2) || filterProvisioning.length === 2 && filterProvisioning[0] === 'self-service'">s</span>: restarting will make DataLab unavailable for some time.
+      </ng-template>
+
+      <ng-template [ngIf]="data.action === 'restart' && data.environmentStatuses[data.activeEndpoint]?.length && (data?.services?.includes('provisioning') || !filterProvisioning.length)">
+        <div class="warning" [ngStyle]="data?.services?.includes('provisioning') && data.services?.length > 1 && {'margin-top': '10px'}">
+        <span>Provisioning service: </span>can not be restarted because one of resources is in processing stage. Please try again later.
+        </div>
+      </ng-template>
+
+      <ng-template [ngIf]="data.action === 'discard'" ]>Discard all unsaved changes.</ng-template>
+      <ng-template [ngIf]="data.action === 'save'" ]>After you save changes you need to restart service.</ng-template>
+    </div>
+    <div class="text-center " *ngIf="!data.environmentStatuses[data.activeEndpoint]?.length || (data.environmentStatuses[data.activeEndpoint]?.length && (!data?.services?.includes('provisioning') || filterProvisioning?.length))">
+      <p class="strong">Do you want to proceed?</p>
+    </div>
+    <div class="text-center m-top-20 pb-25" *ngIf="!data.environmentStatuses[data.activeEndpoint]?.length || (data.environmentStatuses[data.activeEndpoint]?.length && (!data?.services?.includes('provisioning') || filterProvisioning.length))">
+      <button type="button" class="butt" mat-raised-button (click)="dialogRef.close()">No</button>
+      <button type="button" class="butt butt-success" mat-raised-button (click)="dialogRef.close(true)">Yes</button>
+    </div>
+    <div class="text-center m-top-20 pb-25" *ngIf="data.action === 'restart' && data.environmentStatuses[data.activeEndpoint]?.length && data?.services?.includes('provisioning') && data.services.length === 1">
+      <button type="button" class="butt" mat-raised-button (click)="dialogRef.close()">Close</button>
+    </div>
+  </div>
+  `,
+  styles: [
+    `
+      .content { color: #718ba6; padding: 20px 50px; font-size: 14px; font-weight: 400; margin: 0; }
+      header { display: flex; justify-content: space-between; color: #607D8B; }
+      header h4 i { vertical-align: bottom; }
+      header a i { font-size: 20px; }
+      header a:hover i { color: #35afd5; cursor: pointer; }
+      .content{padding: 35px 30px 30px 30px; text-align: center;}
+      label{cursor: pointer;}
+      .warning{color: #EF5C4B;}
+      .warning span {font-weight: 600;}`
+  ]
+})
+
+export class SettingsConfirmationDialogComponent implements OnInit {
+  filterProvisioning = [];
+  constructor(
+    public dialogRef: MatDialogRef<SettingsConfirmationDialogComponent>,
+    @Inject(MAT_DIALOG_DATA) public data: any
+  ) {
+  }
+  ngOnInit() {
+    this.filterProvisioning = this.data?.services?.filter(service => service !== 'provisioning');
+  }
+}
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/configuration/index.ts b/services/self-service/src/main/resources/webapp/src/app/administration/configuration/index.ts
new file mode 100644
index 0000000..7f03084
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/configuration/index.ts
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { MaterialModule } from '../../shared/material.module';
+import { FormControlsModule } from '../../shared/form-controls';
+import {InformMessageModule} from '../../shared/inform-message';
+import {ConfigurationComponent, SettingsConfirmationDialogComponent} from './configuration.component';
+import {AceEditorModule} from 'ng2-ace-editor';
+import {ConvertActionPipeModule} from '../../core/pipes/convert-action-pipe';
+import {KeysPipeModule} from '../../core/pipes/keys-pipe';
+import {CheckboxModule} from '../../shared/checkbox';
+
+@NgModule({
+    imports: [
+        CommonModule,
+        FormsModule,
+        ReactiveFormsModule,
+        MaterialModule,
+        FormControlsModule,
+        InformMessageModule,
+        AceEditorModule,
+        ConvertActionPipeModule,
+        KeysPipeModule,
+        CheckboxModule
+    ],
+  declarations: [ConfigurationComponent, SettingsConfirmationDialogComponent],
+  entryComponents: [SettingsConfirmationDialogComponent],
+  exports: [ConfigurationComponent]
+})
+export class ConfigurationModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/backup-dilog/backup-dilog.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/backup-dilog/backup-dilog.component.ts
index 9bd3a25..fd7b4bd 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/backup-dilog/backup-dilog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/backup-dilog/backup-dilog.component.ts
@@ -26,7 +26,7 @@
 import { BackupService } from '../../../core/services';
 
 @Component({
-  selector: 'dlab-backup-dilog',
+  selector: 'datalab-backup-dilog',
   templateUrl: './backup-dilog.component.html',
   styleUrls: ['./backup-dilog.component.scss']
 })
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.html
index 08b030f..2181f9b 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.html
@@ -35,14 +35,22 @@
                   <input type="text" formControlName="name" placeholder="Enter endpoint name"
                     (blur)="generateEndpointTag($event)">
                   <span class="error"
-                    *ngIf="!createEndpointForm?.controls.name.valid && createEndpointForm?.controls.name.touched && !createEndpointForm?.controls['name'].hasError('isDuplicate')">
+                    *ngIf="!createEndpointForm?.controls.name.valid
+                    && createEndpointForm?.controls.name.touched
+                    && !createEndpointForm?.controls['name'].hasError('isDuplicate')
+                    && !createEndpointForm?.controls['name'].hasError('limit')"
+                  >
                     Endpoint name can only contain letters, numbers, hyphens and '_' but can not end with special
-                    characters
+                    characters.
                   </span>
                   <span class="error"
                         *ngIf="createEndpointForm?.controls['name'].hasError('isDuplicate')">
                     This endpoint name already exists.
                   </span>
+                  <span class="error"
+                        *ngIf="createEndpointForm?.controls['name'].hasError('limit')">
+                     Endpoint name cannot be longer than {{ maxEndpointNameLength }} characters.
+                  </span>
                 </div>
               </div>
               <div class="control-group">
@@ -75,7 +83,7 @@
                   <span class="error"
                     *ngIf="!createEndpointForm?.controls.endpoint_tag.valid && createEndpointForm.controls.endpoint_tag.touched">
                     Endpoint tag can only contain letters, numbers, hyphens and '_' but can not end with special
-                    characters
+                    characters.
                   </span>
                 </div>
               </div>
@@ -98,7 +106,7 @@
           </div>
         </mat-tab>
         <mat-tab label="ENDPOINTS LIST">
-          <div class="endpoints">
+          <div class="endpoints scrolling">
             <table mat-table [dataSource]="endpoints" class="endpoints-table" *ngIf="endpoints?.length; else empty">
               <ng-container matColumnDef="name">
                 <th mat-header-cell *matHeaderCellDef class="name"> Endpoint name </th>
@@ -145,8 +153,7 @@
                 <div class="content">
                   <p>Looks like you don't have any endpoints</p>
 
-                  <button mat-raised-button class="butt" (click)="tabGroup.selectedIndex = 0"
-                    [disabled]="creatingBackup">
+                  <button mat-raised-button class="butt" (click)="tabGroup.selectedIndex = 0">
                     <i class="material-icons">settings_system_daydream</i>New endpoint
                   </button>
                 </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.scss
index a23554f..53eaaf6 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.scss
@@ -50,7 +50,9 @@
     }
 
     .endpoints {
-      height: 265px;
+      height: 310px;
+      padding-right: 5px;
+      overflow: auto;
 
       table.mat-table {
         width: 100%;
@@ -66,6 +68,10 @@
             max-width: 150px;
             overflow: hidden;
             text-overflow: ellipsis;
+            &::after{
+              content: '';
+              display: block;
+            }
           }
         }
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.ts
index 45c6a23..5f13786 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/endpoints/endpoints.component.ts
@@ -40,6 +40,7 @@
 })
 export class EndpointsComponent implements OnInit {
   public createEndpointForm: FormGroup;
+  public maxEndpointNameLength: number = 6;
   endpoints: Endpoint[] = [];
   displayedColumns: string[] = ['name', 'url', 'account', 'endpoint_tag', 'actions'];
 
@@ -85,8 +86,7 @@
            type: 'confirmation', item: data, list:  resource
            }, panelClass: 'modal-sm' })
          .afterClosed().subscribe(result => {
-         result === 'noTerminate' && this.deleteEndpointOption(data, false);
-         result === 'terminate' && this.deleteEndpointOption(data, true);
+         result && this.deleteEndpointOption(data);
        });
     });
   }
@@ -102,16 +102,18 @@
 
   private initFormModel(): void {
     this.createEndpointForm = this._fb.group({
-      name: ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.namePattern), this.validateName.bind(this)])],
+      name: ['', Validators.compose([
+        Validators.required, Validators.pattern(PATTERNS.namePattern), this.validateName.bind(this), this.providerMaxLength.bind(this)
+      ])],
       url: ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.fullUrl), this.validateUrl.bind(this)])],
       account: ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.namePattern)])],
       endpoint_tag: ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.namePattern)])]
     });
   }
 
-  private deleteEndpointOption(data, option): void {
-    this.endpointService.deleteEndpoint(`${data.name}?with-resources=${option}`).subscribe(() => {
-      this.toastr.success(option ? 'Endpoint successfully disconnected. All related resources are terminating!' : 'Endpoint successfully disconnected!' , 'Success!');
+  private deleteEndpointOption(data): void {
+    this.endpointService.deleteEndpoint(`${data.name}`).subscribe(() => {
+      this.toastr.success( 'Endpoint successfully disconnected. All related resources are terminating!', 'Success!');
       this.getEndpointList();
     }, error => this.toastr.error(error.message || 'Endpoint creation failed!', 'Oops!'));
   }
@@ -133,6 +135,10 @@
       return isDublicat ? { isDuplicate: true } : null;
     }
   }
+
+  private providerMaxLength(control) {
+    return control.value.length <= this.maxEndpointNameLength ? null : { limit: true };
+  }
 }
 
 @Component({
@@ -223,7 +229,7 @@
         return;
       });
   }
-  private cutToLongUrl(url) {
+  public cutToLongUrl(url) {
     return url.length > 25 ? url.slice(0, 25) + '...' : url;
   }
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/index.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/index.ts
index 28c47a6..ca34114 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/index.ts
@@ -38,22 +38,24 @@
 import { SsnMonitorComponent } from './ssn-monitor/ssn-monitor.component';
 import {EndpointsComponent, EndpointTestResultDialogComponent} from './endpoints/endpoints.component';
 import { ProjectModule } from '../project';
+import {CheckboxModule} from '../../shared/checkbox';
 
 export * from './management.component';
 
 @NgModule({
-  imports: [
-    CommonModule,
-    FormsModule,
-    ReactiveFormsModule,
-    ProjectModule,
-    BubbleModule,
-    ConfirmationDialogModule,
-    ComputationalResourcesModule,
-    FormControlsModule,
-    DirectivesModule,
-    MaterialModule
-  ],
+    imports: [
+        CommonModule,
+        FormsModule,
+        ReactiveFormsModule,
+        ProjectModule,
+        BubbleModule,
+        ConfirmationDialogModule,
+        ComputationalResourcesModule,
+        FormControlsModule,
+        DirectivesModule,
+        MaterialModule,
+        CheckboxModule
+    ],
   declarations: [
     ManagementComponent,
     ManagementGridComponent,
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.html
index 74ff5af..8c879af 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.html
@@ -19,7 +19,7 @@
 
 <div id="dialog-box" class="manage-env-dialog">
   <header class="dialog-header">
-    <h4 class="modal-title">Manage DLab quotas</h4>
+    <h4 class="modal-title">Manage DataLab quotas</h4>
     <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
   </header>
   <div class="dialog-content">
@@ -29,8 +29,8 @@
           <mat-list>
             <mat-list-item class="list-header">
               <div class="username">Project</div>
+              <div class="period">Set per month</div>
               <div class="quotes">Limit</div>
-<!--              <div class="action">Actions</div>-->
             </mat-list-item>
             <div class="scrolling-content" id="scrolling" formArrayName="projects">
               <mat-list-item *ngFor="let item of usersEnvironments.controls; let i=index" [formGroupName]="i"
@@ -41,39 +41,22 @@
                   matTooltipPosition="above">{{ manageUsersForm.controls['projects']['controls'][i].value['project'] }}
                     </span>
                 </div>
+                <div class="period">
+                  <mat-slide-toggle formControlName="monthlyBudget">
+                  </mat-slide-toggle>
+                </div>
                 <div class="quotes">
                   <input type="number" (keypress)="CheckUtils.numberOnly($event)" min="0"
                     placeholder="Enter limit, in USD" formControlName="budget">
                   <span class="error"
-                    *ngIf="manageUsersForm?.controls['projects']['controls'][i].controls['budget'].hasError('overrun')">Per-user
-                    quotes cannot be greater than total budget</span>
+                    *ngIf="manageUsersForm?.controls['projects']['controls'][i].controls['budget'].hasError('overrun') &&
+                     !manageUsersForm?.controls['projects']['controls'][i].controls['budget'].hasError('max')"
+                  >
+                    Projects budget cannot be higher than total budget.
+                  </span>
+                  <span class="error"
+                        *ngIf="manageUsersForm?.controls['projects']['controls'][i].controls['budget'].hasError('max')">Project budget cannot be higher than 1000000000.</span>
                 </div>
-<!--                <div class="action">-->
-<!--                  <span-->
-<!--                    *ngIf="manageUsersForm?.controls['projects']['controls'][i].controls['canBeStopped'].value; else not_allowed_stop"-->
-<!--                    matTooltip="Stop" matTooltipPosition="above" (click)="applyAction('stop', item)">-->
-<!--                    <i class="material-icons">pause_circle_outline</i>-->
-<!--                  </span>-->
-<!--                  <ng-template #not_allowed_stop>-->
-<!--                    <span matTooltip="Unable to stop project because all resources are already stopped'"-->
-<!--                      matTooltipPosition="above" class="not-active">-->
-<!--                      <i class="material-icons">pause_circle_outline</i>-->
-<!--                    </span>-->
-<!--                  </ng-template>-->
-
-<!--                  <span-->
-<!--                    *ngIf="manageUsersForm?.controls['projects']['controls'][i].controls['canBeTerminated'].value; else not_allowed_terminate"-->
-<!--                    matTooltip="Terminate" matTooltipPosition="above" (click)="applyAction('terminate', item)">-->
-<!--                    <i class="material-icons">phonelink_off</i>-->
-<!--                  </span>-->
-<!--                  <ng-template #not_allowed_terminate>-->
-<!--                    <span matTooltip="Unable to terminate project because all resources are already terminated"-->
-<!--                      matTooltipPosition="above" class="not-active">-->
-<!--                      <i class="material-icons">phonelink_off</i>-->
-<!--                    </span>-->
-<!--                  </ng-template>-->
-
-<!--                </div>-->
               </mat-list-item>
             </div>
             <div class="control-group total-budget">
@@ -82,22 +65,21 @@
                 <div class="username ellipsis">
                   <span class="ellipsis">Total budget</span>
                 </div>
+                <div class="period">
+                </div>
                 <div class="quotes">
                   <input type="number" (keypress)="CheckUtils.numberOnly($event)" formControlName="total"
                          placeholder="Enter total budget, in USD">
-                  <span class="error" *ngIf="manageUsersForm?.controls['total'].hasError('overrun')">Total budget cannot be lower than a sum of users quotes</span>
+                  <span class="error" *ngIf="manageUsersForm?.controls['total'].hasError('overrun')
+                  && !manageUsersForm?.controls['total'].hasError('max')">Total budget cannot be lower than a sum of project quotes.</span>
+                  <span class="error"
+                        *ngIf="manageUsersForm?.controls['total'].hasError('max')">Total budget cannot be higher than 1000000000.</span>
                 </div>
-<!--              <label class="username">Total budget</label>-->
-<!--              <div class="quotes">-->
-<!--                <input type="number" (keypress)="CheckUtils.numberOnly($event)" formControlName="total"-->
-<!--                  placeholder="Enter total budget, in USD">-->
-<!--                <span class="error" *ngIf="manageUsersForm?.controls['total'].hasError('overrun')">Total budget cannot be lower than a sum of users quotes</span>-->
-<!--              </div>-->
               </mat-list-item>
             </div>
             <div class="text-center m-top-30">
               <button mat-raised-button type="button" (click)="dialogRef.close()" class="butt action">Cancel</button>
-              <button mat-raised-button type="submit" [disabled]="!manageUsersForm.valid" class="butt butt-success"
+              <button mat-raised-button type="submit" [disabled]="!manageUsersForm.valid || isFormChanged" class="butt butt-success"
                 [ngClass]="{'not-allowed': !manageUsersForm.valid}">Apply</button>
             </div>
           </mat-list>
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.scss
index 0245506..1cea435 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.scss
@@ -39,22 +39,27 @@
   }
 
   .username {
-    width: 45%;
+    width: 30%;
   }
 
   .quotes {
-    width: 55%;
+    width: 45%;
     margin-right: 10px;
     position: relative;
 
     .error {
       position: absolute;
       left: 0;
-      top: 34px;
+      top: 37px;
       font-family: 'Open Sans', sans-serif;
+      font-size: 11px;
     }
   }
 
+  .period{
+    width: 25%;
+  }
+
   .total-budget {
     border-top: 1px solid #edf1f5;
     padding-top: 15px;
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.ts
index f99944f..6fd04c9 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/manage-environment/manage-environment-dilog.component.ts
@@ -24,7 +24,7 @@
 import { CheckUtils } from '../../../core/util';
 
 @Component({
-  selector: 'dlab-manage-env-dilog',
+  selector: 'datalab-manage-env-dilog',
   templateUrl: './manage-environment-dilog.component.html',
   styleUrls: ['./manage-environment-dilog.component.scss'],
   encapsulation: ViewEncapsulation.None
@@ -37,6 +37,8 @@
   public manageTotalsForm: FormGroup;
 
   @Output() manageEnv: EventEmitter<{}> = new EventEmitter();
+  private initialFormState: any;
+  public isFormChanged: boolean = true;
 
   constructor(
     @Inject(MAT_DIALOG_DATA) public data: any,
@@ -50,16 +52,26 @@
     this.setProjectsControl();
     this.manageUsersForm.controls['total'].setValue(this.data.total.conf_max_budget || '');
     this.onFormChange();
+    this.manageUsersForm.value.total = +this.manageUsersForm.value.total;
+    if (this.manageUsersForm.value.total === 0) this.manageUsersForm.value.total = null;
+    this.initialFormState = this.manageUsersForm.value;
   }
 
   public onFormChange() {
     this.manageUsersForm.valueChanges.subscribe(value => {
-      if ((this.getCurrentTotalValue() && this.getCurrentTotalValue() >= this.getCurrentUsersTotal())) {
-        this.manageUsersForm.controls['projects']['controls'].forEach(v => {
-            v.controls['budget'].setErrors(null);
+      this.isFormChanged = JSON.stringify(this.initialFormState) === JSON.stringify(this.manageUsersForm.value);
+      if (this.getCurrentTotalValue()) {
+        if (this.getCurrentTotalValue() >= this.getCurrentUsersTotal()) {
+          this.manageUsersForm.controls['total'].setErrors(null);
+          if (this.manageUsersForm.controls['total'].value > 1000000000) this.manageUsersForm.controls['total'].setErrors({max: true});
+          this.manageUsersForm.controls['projects']['controls'].forEach(v => {
+              v.controls['budget'].errors &&
+              'max' in v.controls['budget'].errors ? null : v.controls['budget'].setErrors(null);
+            }
+          );
+        } else {
+          this.manageUsersForm.controls['total'].setErrors({ overrun: true });
         }
-        );
-        this.manageUsersForm.controls['total'].setErrors(null);
       }
     });
   }
@@ -70,34 +82,28 @@
 
   public setBudgetLimits(value) {
     if (this.getCurrentTotalValue() >= this.getCurrentUsersTotal() || !this.getCurrentTotalValue()) {
-      this.dialogRef.close(value);
+      value.projects = value.projects.filter((v, i) =>
+        this.initialFormState.projects[i].budget !== v.budget ||
+        this.initialFormState.projects[i].monthlyBudget !== v.monthlyBudget);
+        value.isTotalChanged = this.initialFormState.total !== value.total;
+        this.dialogRef.close(value);
     } else {
       this.manageUsersForm.controls['total'].setErrors({ overrun: true });
     }
   }
 
-  public applyAction(action, project) {
-    const dialogRef: MatDialogRef<ConfirmActionDialogComponent> = this.dialog.open(
-      ConfirmActionDialogComponent, { data: { action, project: project.value.project }, width: '550px', panelClass: 'error-modalbox' });
-
-    dialogRef.afterClosed().subscribe(result => {
-      if (result) this.manageEnv.emit({ action, project: { project_name: project.value.project } });
-    });
-  }
-
   public setProjectsControl() {
     this.manageUsersForm.setControl('projects',
-      this._fb.array((this.data.projectsList || []).map((x: any) => this._fb.group({
+      this._fb.array((this.data.projectsList || []).map((x: any, index: number) => this._fb.group({
         project: x.name,
-        budget: [x.budget, [ this.userValidityCheck.bind(this)]],
-        canBeStopped: x.canBeStopped,
-        canBeTerminated: x.canBeTerminated
+        budget: [x.budget.value, [ Validators.max(1000000000), this.userValidityCheck.bind(this)]],
+        monthlyBudget: x.budget.monthlyBudget,
       }))));
   }
 
   private initForm(): void {
     this.manageUsersForm = this._fb.group({
-      total: [null, [Validators.min(0), this.totalValidityCheck.bind(this)]],
+      total: [null, [Validators.min(0), this.totalValidityCheck.bind(this),  Validators.max(1000000000) ]],
       projects: this._fb.array([this._fb.group({ project: '', budget: null, status: '' })])
     });
   }
@@ -118,6 +124,7 @@
 
   private userValidityCheck(control) {
     if (control && control.value) {
+      if (control.parent)this.manageUsersForm.value.projects.find(v => v.project === control.parent.value.project).budget = control.value;
       return (this.getCurrentTotalValue() && this.getCurrentTotalValue() < this.getCurrentUsersTotal()) ? { overrun: true } : null;
     }
   }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/management-data.service.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/management-data.service.ts
index 3078ad9..a3aa218 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/management-data.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/management-data.service.ts
@@ -36,7 +36,7 @@
   }
 
   public getEnvironmentDataDirect() {
-    return this.manageEnvironmentsService.getAllEnvironmentData().subscribe(response => response);
+    return this.manageEnvironmentsService.getAllEnvironmentData();
   }
 
   private getAllEnvironmentData() {
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.html
index 9947516..8686e4b 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.html
@@ -16,224 +16,331 @@
   ~ specific language governing permissions and limitations
   ~ under the License.
   -->
+<div class="managment-wrapper scrolling" #pageWrapper (scroll)="scrollTable($event)" (resize)="onResize($event)">
+  <div class="ani scrolling scroll-wrapper" #wrapper (scroll)="scrollTable($event)">
+    <div class="wrapper" #tableWrapper >
+      <table mat-table [dataSource]="allFilteredEnvironmentData" class="data-grid management mat-elevation-z6" #table >
+      <ng-container matColumnDef="checkbox">
+        <th mat-header-cell *matHeaderCellDef class="checkbox label-header">
+          <datalab-checkbox
+            class="header-checkbox"
+            *ngIf="allActiveNotebooks?.length"
+            [checked]="selected?.length === allActiveNotebooks?.length"
+            (toggleSelection)="toggleSelectionAll()"
+          >
+          </datalab-checkbox>
+          <button mat-icon-button aria-label="More" class="ar checkbox-border" (click)="toggleFilterRow()">
+            <i class="material-icons">
+  <!--            <span *ngIf="filtering && filterForm.users.length > 0 && !collapsedFilterRow">filter_list</span>-->
+              <span>more_vert</span>
+            </i>
+          </button>
+        </th>
+        <td mat-cell *matCellDef="let element">
+          <ng-template [ngIf]="element.type !== 'odahu' && element.type !== 'edge node' && (element.status==='running' || element.status==='stopped') && !clustersInProgress(element.resources)">
+            <datalab-checkbox
+              [checked]="element.isSelected"
+              (toggleSelection)="toggleActionForAll(element)"
+            >
+            </datalab-checkbox>
+          </ng-template>
+        </td>
+      </ng-container>
 
-<div class="ani">
-  <table mat-table [dataSource]="allFilteredEnvironmentData" class="data-grid management mat-elevation-z6">
-    <ng-container matColumnDef="user">
-      <th mat-header-cell *matHeaderCellDef class="user label-header">
-        <span class="label">User</span>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filtering && filterForm.users.length > 0 && !collapsedFilterRow">filter_list</span>
-            <span [hidden]="filtering && filterForm.users.length > 0 && !collapsedFilterRow">more_vert</span>
-          </i>
-        </button> </th>
-      <td mat-cell *matCellDef="let element">{{ element.user }}</td>
-    </ng-container>
+      <ng-container matColumnDef="user">
+        <th mat-header-cell *matHeaderCellDef class="user label-header">
+          <span class="label">User</span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm.users.length > 0 && !collapsedFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm.users.length > 0 && !collapsedFilterRow">more_vert</span>
+            </i>
+          </button> </th>
+        <td
+          mat-cell *matCellDef="let element"
+          class="user-name ellipsis"
+          matTooltip="{{element.user}}"
+          matTooltipPosition="above"
+          [matTooltipDisabled]="element.user?.length<30"
+        >
+          <span >{{ element.user }}</span>
+        </td>
+      </ng-container>
 
-    <ng-container matColumnDef="project">
-      <th mat-header-cell *matHeaderCellDef class="project label-header">
-        <span class="label">Project</span>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filtering && filterForm.projects.length > 0 && !collapsedFilterRow">filter_list</span>
-            <span [hidden]="filtering && filterForm.projects.length > 0 && !collapsedFilterRow">more_vert</span>
-          </i>
-        </button> </th>
-      <td mat-cell *matCellDef="let element">{{ element.project }}</td>
-    </ng-container>
+      <ng-container matColumnDef="project">
+        <th mat-header-cell *matHeaderCellDef class="project label-header">
+          <span class="label">Project</span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm.projects.length > 0 && !collapsedFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm.projects.length > 0 && !collapsedFilterRow">more_vert</span>
+            </i>
+          </button> </th>
+        <td mat-cell *matCellDef="let element">{{ element.project }}</td>
+      </ng-container>
 
-    <ng-container matColumnDef="type">
-      <th mat-header-cell *matHeaderCellDef class="type label-header">
-        <span class="label">Type</span>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filtering && filterForm.type.length > 0 && !collapsedFilterRow">filter_list</span>
-            <span [hidden]="filtering && filterForm.type.length > 0 && !collapsedFilterRow">more_vert</span>
-          </i>
-        </button> </th>
-      <td mat-cell *matCellDef="let element">{{ element.name || element.type }}</td>
-    </ng-container>
+      <ng-container matColumnDef="endpoint">
+        <th mat-header-cell *matHeaderCellDef class="endpoint label-header">
+          <span class="label">Endpoint</span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm.endpoints.length > 0 && !collapsedFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm.endpoints.length > 0 && !collapsedFilterRow">more_vert</span>
+            </i>
+          </button> </th>
+        <td mat-cell *matCellDef="let element">{{ element.endpoint }}</td>
+      </ng-container>
 
-    <ng-container matColumnDef="shape">
-      <th mat-header-cell *matHeaderCellDef class="shape label-header">
-        <span class="label">Shape / Resource id</span>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filtering && filterForm.shapes.length > 0 && !collapsedFilterRow">filter_list</span>
-            <span [hidden]="filtering && filterForm.shapes.length > 0 && !collapsedFilterRow">more_vert</span>
-          </i>
-        </button> </th>
-      <td mat-cell *matCellDef="let element" class="shape">{{ element.shape || element.ip }}</td>
-    </ng-container>
+      <ng-container matColumnDef="type">
+        <th mat-header-cell *matHeaderCellDef class="type label-header">
+          <span class="label">Name</span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm.type.length > 0 && !collapsedFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm.type.length > 0 && !collapsedFilterRow">more_vert</span>
+            </i>
+          </button> </th>
+        <td type mat-cell *matCellDef="let element">
+          <span
+            *ngIf="element.name"
+            [ngClass]="{'computation': element.exploratory_urls?.length}"
+            (click)="openNotebookDetails(element)"
+          >
+            {{element.name}}
+          </span>
+          <span *ngIf="!element.name">{{element.type}}</span>
+        </td>
+      </ng-container>
 
-    <ng-container matColumnDef="status">
-      <th mat-header-cell *matHeaderCellDef class="status label-header">
-        <span class="label">Status</span>
+      <ng-container matColumnDef="shape">
+        <th mat-header-cell *matHeaderCellDef class="shape label-header">
+          <span class="label">Shape / Resource id</span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm.shapes.length > 0 && !collapsedFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm.shapes.length > 0 && !collapsedFilterRow">more_vert</span>
+            </i>
+          </button> </th>
+        <td mat-cell *matCellDef="let element" class="shape">
+          <div>{{ element.shape || element.ip }}</div>
+          <div *ngIf="element.gpu_type">{{ element.gpu_type }}</div>
+          <div *ngIf="element.gpu_count">GPU count: {{ element.gpu_count }}</div>
+        </td>
+      </ng-container>
 
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filtering && filterForm.statuses.length > 0 && !collapsedFilterRow">filter_list</span>
-            <span [hidden]="filtering && filterForm.statuses.length > 0 && !collapsedFilterRow">more_vert</span>
-          </i>
-        </button> </th>
-      <td mat-cell *matCellDef="let element" class="ani status label-header" >
-        <span ngClass="{{element.status || ''}}">{{ element.status }}</span>
-      </td>
-    </ng-container>
+      <ng-container matColumnDef="status">
+        <th mat-header-cell *matHeaderCellDef class="status label-header">
+          <span class="label">Status</span>
 
-    <ng-container matColumnDef="resources">
-      <th mat-header-cell *matHeaderCellDef class="resources label-header">
-        <span class="label">Computational resources</span>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filtering && filterForm.resources.length > 0 && !collapsedFilterRow">filter_list</span>
-            <span [hidden]="filtering && filterForm.resources.length > 0 && !collapsedFilterRow">more_vert</span>
-          </i>
-        </button> </th>
-      <td mat-cell *matCellDef="let element" class="ani resources">
-        <div class="source" *ngIf="element.resources">
-          <div *ngIf="!element.resources?.length">
-            <span *ngIf="!element.resources.length" class="no-details">no details</span>
-          </div>
-          <div *ngIf="element.resources?.length">
-            <div *ngFor="let resource of element.resources" class="resource-wrap">
-              <div class="resource-name">
-                <a class="detailed-link">
-                  {{ resource.computational_name }}
-                </a>
-              </div>
-              <span ngClass="{{resource.status || ''}}" class="resource-status">{{ resource.status }}</span>
-              <div class="resource-actions">
-                <a class="start-stop-action" *ngIf="resource.image === 'docker.dlab-dataengine'">
-                  <i class="material-icons" (click)="toggleResourceAction(element, 'stop', resource)"
-                    [ngClass]="{'not-allowed' : resource.status !== 'running' }">pause_circle_outline</i>
-                </a>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm.statuses.length > 0 && !collapsedFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm.statuses.length > 0 && !collapsedFilterRow">more_vert</span>
+            </i>
+          </button> </th>
+        <td mat-cell *matCellDef="let element" class="ani status" >
+          <span ngClass="{{element.status || ''}}">{{ element.status }}</span>
+        </td>
+      </ng-container>
 
-                <a class="remove_butt" (click)="toggleResourceAction(element, 'terminate', resource)"
-                  [ngClass]="{ 'disabled' : element.status !== 'running' || resource.status !== 'running' && resource.status !== 'stopped' }">
-                  <i class="material-icons">highlight_off</i>
-                </a>
+      <ng-container matColumnDef="resources">
+        <th mat-header-cell *matHeaderCellDef class="resources label-header">
+          <span class="label">Compute</span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm.resources.length > 0 && !collapsedFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm.resources.length > 0 && !collapsedFilterRow">more_vert</span>
+            </i>
+          </button> </th>
+        <td mat-cell *matCellDef="let element" class="ani resources">
+          <div class="source" *ngIf="element.resources">
+            <div *ngIf="!element.resources?.length">
+              <span *ngIf="!element.resources.length" class="no-details">no details</span>
+            </div>
+            <div *ngIf="element.resources?.length">
+              <div *ngFor="let resource of element.resources" class="resource-wrap">
+                <div class="resource-name">
+                  <a>
+                    {{ resource.computational_name }}
+                  </a>
+                </div>
+                <span ngClass="{{resource.status || ''}}" class="resource-status">{{ resource.status }}</span>
+                <div class="resource-actions">
+                  <span class="not-allow">
+                    <a class="start-stop-action" *ngIf="resource.image === 'docker.datalab-dataengine'">
+                      <i class="material-icons" (click)="toggleResourceAction(element, 'stop', resource)"
+                         [ngClass]="{'not-allowed' : resource.status !== 'running' || selected?.length }">pause_circle_outline</i>
+                    </a>
+                  </span>
+                  <span class="not-allow">
+                    <a class="remove_butt" (click)="toggleResourceAction(element, 'terminate', resource)"
+                      [ngClass]="{ 'disabled' : element.status !== 'running' || (resource.status !== 'running' && resource.status !== 'stopped') || selected?.length }">
+                      <i class="material-icons">highlight_off</i>
+                    </a>
+                  </span>
+                </div>
               </div>
             </div>
           </div>
-        </div>
-      </td>
-    </ng-container>
+        </td>
+      </ng-container>
 
-    <ng-container matColumnDef="actions">
-      <th mat-header-cell *matHeaderCellDef class="actions label-header">
-        <span class="label"> Actions </span>
-      </th>
-      <td mat-cell *matCellDef="let element" class="settings actions-col">
-        <span #settings class="actions" (click)="actions.toggle($event, settings)" *ngIf="element.type !== 'edge node'"
-          [ngClass]="{
-            'disabled' : isActiveResources(element),
-            'disabled' : element.status !== 'running' && element.status !== 'stopped' && element.status !== 'stopping' && element.status !== 'failed' }"></span>
-        <bubble-up #actions class="list-menu" position="bottom-left" alternative="top-left">
-          <ul class="list-unstyled">
-            <li
-              matTooltip="{{ element.type !== 'edge node' ? 'Unable to stop notebook because at least one computational resource is in progress' : 'Unable to stop edge node because at least one resource of this user is in progress' }}"
-              matTooltipPosition="above" [matTooltipDisabled]="!isResourcesInProgress(element)"
-              [hidden]="element.name === 'edge node' && element.status === 'stopped'">
-              <div (click)="toggleResourceAction(element, 'stop')"
-                [ngClass]="{'not-allowed' : element.status === 'stopped' || element.status === 'stopping' || element.status === 'starting' || element.status === 'creating image' || element.status === 'failed' || isResourcesInProgress(element)}">
-                <i class="material-icons">pause_circle_outline</i>
-                <span>Stop</span>
-              </div>
-            </li>
-            <li *ngIf="element.name !== 'edge node'"
-              matTooltip="Unable to terminate notebook because at least one computational resource is in progress"
-              matTooltipPosition="above" [matTooltipDisabled]="!isResourcesInProgress(element)">
-              <div (click)="toggleResourceAction(element, 'terminate')"
-                [ngClass]="{'not-allowed' : element.status !== 'running' && element.status !== 'stopped' || isResourcesInProgress(element)}">
-                <i class="material-icons">phonelink_off</i>
-                <span>Terminate</span>
-              </div>
-            </li>
+      <ng-container matColumnDef="actions">
+        <th mat-header-cell *matHeaderCellDef class="actions label-header">
+          <span class="label"> Actions </span>
+        </th>
+        <td mat-cell *matCellDef="let element" class="settings actions-col">
+          <span [ngClass]="{'not-allow' : selected?.length}">
+            <span #settings class="actions" (click)="actions.toggle($event, settings)" *ngIf="element.type !== 'edge node' && element.type !== 'odahu'"
+              [ngClass]="{
+                'disabled' : (element.status !== 'running' && element.status !== 'stopped')
+                 || selected?.length || inProgress(element.resources)}">
 
-            <div *ngIf="element.name === 'edge node' && element.status === 'stopped'">
-              <li (click)="toggleResourceAction(element, 'run')">
-                <i class="material-icons">play_circle_outline</i>
-                <span>Start</span>
+            </span>
+          </span>
+          <bubble-up #actions class="list-menu" position="bottom-left" alternative="top-left">
+            <ul class="list-unstyled">
+              <li
+                matTooltip="{{ element.type !== 'edge node' ? 'Unable to stop notebook because at least one computational resource is in progress' : 'Unable to stop edge node because at least one resource of this user is in progress' }}"
+                matTooltipPosition="above" [matTooltipDisabled]="!isResourcesInProgress(element)"
+                [hidden]="element.name === 'edge node' && element.status === 'stopped'">
+                <div (click)="toggleResourceAction(element, 'stop')"
+                  [ngClass]="{'not-allowed' : element.status === 'stopped' || element.status === 'stopping' || element.status === 'starting' || element.status === 'creating image' || element.status === 'failed' || isResourcesInProgress(element)}">
+                  <i class="material-icons">pause_circle_outline</i>
+                  <span>Stop</span>
+                </div>
               </li>
+              <li *ngIf="element.name !== 'edge node'"
+                matTooltip="Unable to terminate notebook because at least one compute is in progress"
+                matTooltipPosition="above" [matTooltipDisabled]="!isResourcesInProgress(element)">
+                <div (click)="toggleResourceAction(element, 'terminate')"
+                  [ngClass]="{'not-allowed' : element.status !== 'running' && element.status !== 'stopped' || isResourcesInProgress(element)}">
+                  <i class="material-icons">phonelink_off</i>
+                  <span>Terminate</span>
+                </div>
+              </li>
+
+              <div *ngIf="element.name === 'edge node' && element.status === 'stopped'">
+                <li (click)="toggleResourceAction(element, 'run')">
+                  <i class="material-icons">play_circle_outline</i>
+                  <span>Start</span>
+                </li>
+              </div>
+            </ul>
+          </bubble-up>
+        </td>
+      </ng-container>
+
+
+      <!-- FILTERING -->
+      <ng-container matColumnDef="checkbox-filter" sticky>
+        <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+
+        </th>
+      </ng-container>
+
+      <ng-container matColumnDef="user-filter" sticky>
+        <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+          <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'users'" [items]="filterConfiguration.users"
+            [model]="filterForm.users"></multi-select-dropdown>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="type-filter" sticky>
+        <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+          <input placeholder="Filter by name" type="text" class="form-control filter-field"
+            [value]="filterForm.type" (input)="onFilterNameUpdate($event.target['value'])"/>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="project-filter" sticky>
+        <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+          <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'projects'"
+            [items]="filterConfiguration.projects" [model]="filterForm.projects"></multi-select-dropdown>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="endpoint-filter" sticky>
+        <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+          <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'endpoints'"
+                                 [items]="filterConfiguration.endpoints" [model]="filterForm.endpoints"></multi-select-dropdown>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="shape-filter" sticky>
+        <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+          <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'shapes'"
+            [items]="filterConfiguration.shapes" [model]="filterForm.shapes"></multi-select-dropdown>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="status-filter" sticky>
+        <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+          <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'statuses'"
+            [items]="filterConfiguration.statuses" [model]="filterForm.statuses"></multi-select-dropdown>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="resource-filter" sticky>
+        <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+          <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'resources'"
+            [items]="filterConfiguration.resources" [model]="filterForm.resources"></multi-select-dropdown>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="actions-filter" sticky>
+        <th mat-header-cell *matHeaderCellDef  class="actions-col filter-row-item">
+          <div class="actions">
+            <button mat-icon-button class="btn reset" (click)="resetFilterConfigurations()" [disabled]="!isFilterSelected">
+              <i class="material-icons">close</i>
+            </button>
+
+            <button mat-icon-button class="btn apply" (click)="applyFilter(filterForm)"
+              [disabled]="isFilterChanged">
+              <i class="material-icons"
+                [ngClass]="{'not-allowed': allFilteredEnvironmentData?.length == 0 && !filtering}">done</i>
+            </button>
+          </div>
+        </th>
+      </ng-container>
+
+
+      <ng-container matColumnDef="placeholder">
+        <td mat-footer-cell *matFooterCellDef colspan="8">
+          <div class="info"
+            *ngIf="(!allFilteredEnvironmentData) && !filtering || (allFilteredEnvironmentData?.length == 0) && !filtering">
+            To start working, please, create new environment</div>
+          <div *ngIf="(allFilteredEnvironmentData?.length == 0) && filtering" class="info">No matches found</div>
+        </td>
+      </ng-container>
+
+      <ng-container matColumnDef="scrollButtons">
+          <td mat-footer-cell *matFooterCellDef colspan="9" class="buttons-wrap">
+            <div class="buttons" [ngStyle]="{'width.px': tableWrapperWidth }" [hidden]="!tableWrapperWidth">
+              <div class="button-container">
+                <button mat-mini-fab aria-label="Scroll left"
+                        (click)="sctollTo('left')"
+                        [ngClass]="{'not-allowed': wrapper.scrollLeft === 0 }"
+                >
+                  <mat-icon [ngClass]="{'highlight': wrapper.scrollLeft !== 0 }">keyboard_arrow_left</mat-icon>
+                </button>
+              </div>
+              <div class="button-container" [ngClass]="{'not-allowed': checkMaxRight()}">
+                <button mat-mini-fab aria-label="Scroll right"
+                        (click)="sctollTo('right')"
+
+                        [ngClass]="{'not-allowed': !(isMaxRight | async)}"
+                >
+                  <mat-icon [ngClass]="{'highlight': (isMaxRight | async) || false}">keyboard_arrow_right</mat-icon>
+                </button>
+              </div>
             </div>
-          </ul>
-        </bubble-up>
-      </td>
-    </ng-container>
+          </td>
+        </ng-container>
+
+      <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true" class="header-row"></tr>
+      <tr [hidden]="!collapsedFilterRow" mat-header-row *matHeaderRowDef="displayedFilterColumns; sticky: true"
+        class="filter-row"></tr>
+      <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
 
 
-    <!-- FILTERING -->
-    <ng-container matColumnDef="user-filter" sticky>
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'users'" [items]="filterConfiguration.users"
-          [model]="filterForm.users"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="type-filter" sticky>
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <input placeholder="Filter by environment type" type="text" class="form-control filter-field"
-          [value]="filterForm.type" (input)="filterForm.type = $event.target.value" />
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="project-filter" sticky>
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'projects'"
-          [items]="filterConfiguration.projects" [model]="filterForm.projects"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="shape-filter" sticky>
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'shapes'"
-          [items]="filterConfiguration.shapes" [model]="filterForm.shapes"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="status-filter" sticky>
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'statuses'"
-          [items]="filterConfiguration.statuses" [model]="filterForm.statuses"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="resource-filter" sticky>
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'resources'"
-          [items]="filterConfiguration.resources" [model]="filterForm.resources"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="actions-filter" sticky>
-      <th mat-header-cell *matHeaderCellDef  class="actions-col filter-row-item">
-        <div class="actions">
-          <button mat-icon-button class="btn reset" (click)="resetFilterConfigurations()">
-            <i class="material-icons">close</i>
-          </button>
+      <tr [hidden]="allFilteredEnvironmentData?.length" mat-footer-row *matFooterRowDef="['placeholder']" class="info"></tr>
+      <tr [hidden]="!tableEl || !tableEl['offsetWidth'] || tableWrapper.offsetWidth - tableEl['offsetWidth'] > -16 || !allFilteredEnvironmentData?.length" mat-footer-row *matFooterRowDef="['scrollButtons']; sticky: true" class="info"></tr>
+    </table>
 
-          <button mat-icon-button class="btn apply" (click)="applyFilter(filterForm)"
-            [disabled]="allFilteredEnvironmentData?.length == 0 && !filtering">
-            <i class="material-icons"
-              [ngClass]="{'not-allowed': allFilteredEnvironmentData?.length == 0 && !filtering}">done</i>
-          </button>
-        </div>
-      </th>
-    </ng-container>
-
-
-    <ng-container matColumnDef="placeholder">
-      <td mat-footer-cell *matFooterCellDef colspan="6" class="info">
-        <span
-          *ngIf="(!allFilteredEnvironmentData) && !filtering || (allFilteredEnvironmentData?.length == 0) && !filtering">
-          To start working, please, create new environment</span>
-        <span *ngIf="(allFilteredEnvironmentData?.length == 0) && filtering">No matches found</span>
-      </td>
-    </ng-container>
-
-    <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true" class="header-row"></tr>
-    <tr [hidden]="!collapsedFilterRow" mat-header-row *matHeaderRowDef="displayedFilterColumns; sticky: true"
-      class="filter-row"></tr>
-    <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
-
-
-    <tr [hidden]="allFilteredEnvironmentData?.length" mat-footer-row *matFooterRowDef="['placeholder']"></tr>
-  </table>
-
+    </div>
+  </div>
 </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.scss
index 6c52559..59d5254 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.scss
@@ -17,34 +17,100 @@
  * under the License.
  */
 
-.data-grid {
-  &.management {
+.managment-wrapper{
+  position: relative;
+  height: calc(100vh - 130px);
+  scroll-behavior: smooth;
+  margin-left: -15px;
+  margin-right: -15px;
+  padding-left: 15px;
+  padding-right: 15px;
+  overflow: auto;
 
-    .user,
+  .scroll-wrapper {
+    overflow: auto;
+    scroll-behavior: smooth;
+    box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
+  }
+
+  .ani{
+    max-height: calc(100vh - 130px);
+    position: relative;
+    .wrapper{
+      width: 100%;
+      display: block;
+      max-height: calc(100vh - 130px);
+      overflow: unset;
+      position: relative;
+      scroll-behavior: smooth;
+    }
+  }
+}
+
+.data-grid {
+
+  &.management {
+    .filter-row-item{
+      padding: 5px;
+    }
+
+    .settings{
+      min-width: 7%;
+    }
+
+    .mat-column-checkbox{
+      padding-left: 10px;
+      padding-right: 0px;
+      min-width: 38px;
+
+      &.label-header{
+         .empty-checkbox{
+           z-index: 1011
+         }
+      }
+    }
+
+    .user{
+      width: 15%;
+      min-width: 180px;
+    }
+
     .name,
     .project {
-      width: 12%;
-
+      width: 9%;
+      min-width: 140px;
       .list-menu li {
         text-transform: inherit;
       }
     }
 
     .shape {
-      width: 19% !important;
+      width: 15% !important;
+
+      .label{
+        position: absolute;
+      }
+      min-width: 150px;
+    }
+
+    .endpoint{
+      width: 10% !important;
+      min-width: 140px;
     }
 
     .status {
-      width: 13% !important;
+      width: 10% !important;
+      min-width: 125px;
     }
 
     .type {
-      width: 14%;
+      width: 10%;
+      min-width: 110px;
     }
 
     .resources {
-      width: 22%;
-      padding: 5px;
+      width: 27%;
+      min-width: 240px;
     }
 
     .settings {
@@ -52,27 +118,127 @@
 
 
     }
+
     .actions {
       margin-top: 0px;
+      padding-right: 10px;
+      position: sticky;
       .label{
         padding-right: 5px;
       }
     }
+
     .actions-col {
       width: 6%;
+    }
 
+    .label-header{
+      padding-left: 15px;
+      height: 56px;
+
+      .ar{
+        left: 21px;
+        top: 2px;
+        &.checkbox-border
+        {
+          left: 19px;
+        }
+      }
+
+      .settings{
+        min-width: 7%;
+      }
+
+      &.mat-column-checkbox{
+        z-index: 12 !important;
+        padding-left: 10px;
+
+        .ar{
+          position: absolute;
+          top: 10px;
+        }
+      }
+
+      &.user{
+        z-index: 11 !important;
+
+      }
+
+      &.type{
+        z-index: 10 !important;
+      }
+
+      &.project {
+        z-index: 9 !important;
+
+        .label {
+          position: absolute;
+        }
+      }
+
+      &.endpoint {
+        z-index: 8 !important;
+
+        .label {
+          position: absolute;
+        }
+      }
+
+      &.shape {
+        z-index: 7 !important;
+      }
+
+      &.status {
+        z-index: 6 !important;
+      }
+
+      &.resources {
+        z-index: 5 !important;
+      }
+
+      &.actions {
+        z-index: 4 !important;
+        min-width: 100px !important;
+      }
     }
 
     .dashboard_table_body {
+
       td:first-child {
         cursor: default;
       }
     }
-  }
-}
 
-.source .resource-wrap .resource-name .detailed-link {
-  cursor: default !important;
+    .user-name{
+      padding-right: 22px;
+      overflow: hidden;
+      word-break: break-all;
+      white-space: nowrap;
+      max-width: 250px;
+    }
+
+    .buttons-wrap{
+      padding: 0;
+      border-top: 1px solid rgba(0,0,0,.12);
+      transform: translateY(-1px);
+    }
+
+    .buttons{
+      position: sticky;
+      left: 0;
+    }
+
+    button{
+      background-color: #fff;
+      box-shadow: none;
+      mat-icon{
+        color: lightgrey;
+        &.highlight{
+          color: #35afd5;
+        }
+      }
+    }
+  }
 }
 
 table.management {
@@ -82,8 +248,9 @@
     background: transparent !important;
   }
 
-  td {
+  td:not(.info) {
     padding: 5px;
+    padding-left: 20px;
   }
 
   .header-row {
@@ -93,7 +260,6 @@
       padding-top: 14px;
       vertical-align: super !important;
       padding-left: 5px;
-      font-size: 12px;
     }
     .actions {
       text-align: right;
@@ -106,5 +272,70 @@
 
   .filter-row {
     background: inherit;
+
+    .filter-row-item{
+      left: auto !important;
+       &.actions-col{
+         right: -15px;
+       }
+    }
+
+    .filter-field{
+      font-size: 13px;
+      padding-left: 15px;
+    }
+  }
+
+  .info{
+    padding: 40px;
+    text-align: center;
+  }
+
+  .source .resource-wrap {
+    .resource-actions{
+      padding-right: 0;
+    }
+    .resource-name .detailed-link {
+      cursor: default !important;
+    }
   }
 }
+
+.computation{
+  cursor: pointer;
+  color: #35afd5;
+}
+
+.table-footer{
+  height: 48px;
+}
+
+.header-checkbox{
+  margin-top: 7px;
+  float: left;
+}
+
+
+
+@media screen and (max-width: 1550px) {
+  .managment-wrapper{
+    .source {
+      .resource-wrap {
+        .resource-name {
+          width: 40%;
+        }
+
+        .resource-status {
+          width: 40%;
+        }
+
+        .resource-actions {
+          width: 20%;
+
+        }
+      }
+    }
+  }
+}
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.ts
index d0ab9dc..2321183 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/management-grid/management-grid.component.ts
@@ -17,17 +17,31 @@
  * under the License.
  */
 
-import { Component, OnInit, ViewChild, Input, Output, EventEmitter, Inject } from '@angular/core';
+import {
+  Component,
+  OnInit,
+  ViewChild,
+  Input,
+  Output,
+  EventEmitter,
+  Inject,
+  HostListener,
+  AfterViewInit,
+  AfterViewChecked,
+  ApplicationRef
+} from '@angular/core';
 import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { ToastrService } from 'ngx-toastr';
 
 import { HealthStatusService } from '../../../core/services';
 import { SortUtils } from '../../../core/util';
-import { ConfirmationDialogType } from '../../../shared';
-import { ConfirmationDialogComponent } from '../../../shared/modal-dialog/confirmation-dialog';
 import { EnvironmentsDataService } from '../management-data.service';
 import { EnvironmentModel, ManagementConfigModel } from '../management.model';
 import {ProgressBarService} from '../../../core/services/progress-bar.service';
+import {DetailDialogComponent} from '../../../resources/exploratory/detail-dialog';
+import {BehaviorSubject, Subject, timer} from 'rxjs';
+import { ChangeDetectorRef } from '@angular/core';
+import {CompareUtils} from '../../../core/util/compareUtils';
 
 export interface ManageAction {
   action: string;
@@ -44,14 +58,17 @@
     '../../../resources/computational/computational-resources-list/computational-resources-list.component.scss'
   ]
 })
-export class ManagementGridComponent implements OnInit {
+export class ManagementGridComponent implements OnInit, AfterViewInit, AfterViewChecked {
   allEnvironmentData: Array<any>;
   allFilteredEnvironmentData: Array<any>;
   loading: boolean = false;
-  filterConfiguration: ManagementConfigModel = new ManagementConfigModel([], '', [], [], [], []);
-  filterForm: ManagementConfigModel = new ManagementConfigModel([], '', [], [], [], []);
+  filterConfiguration: ManagementConfigModel = new ManagementConfigModel([], '', [], [], [], [], []);
+  filterForm: ManagementConfigModel = new ManagementConfigModel([], '', [], [], [], [], []);
   filtering: boolean = false;
   collapsedFilterRow: boolean = false;
+  isMaxRight: Subject<boolean> = new BehaviorSubject(false);
+  private tableWrapperWidth: number;
+  tableEl = {};
 
   @Input() environmentsHealthStatuses: Array<any>;
   @Input() resources: Array<any>;
@@ -59,9 +76,30 @@
   @Input() currentUser: string = '';
   @Output() refreshGrid: EventEmitter<{}> = new EventEmitter();
   @Output() actionToggle: EventEmitter<ManageAction> = new EventEmitter();
+  @Output() emitSelectedList: EventEmitter<ManageAction> = new EventEmitter();
 
-  displayedColumns: string[] = ['user', 'type', 'project', 'shape', 'status', 'resources', 'actions'];
-  displayedFilterColumns: string[] = ['user-filter', 'type-filter', 'project-filter', 'shape-filter', 'status-filter', 'resource-filter', 'actions-filter'];
+  @ViewChild('tableWrapper') tableWrapper;
+  @ViewChild('wrapper') wrapper;
+  @ViewChild('pageWrapper') pageWrapper;
+  @ViewChild('table') table;
+
+  @HostListener('window:resize', ['$event'])
+  onResize(event) {
+    this.checkMaxRight();
+  }
+
+  @HostListener('scroll', ['$event'])
+  scrollTable($event: Event) {
+    this.checkMaxRight();
+  }
+
+  displayedColumns: string[] = [ 'checkbox', 'user', 'type', 'project', 'endpoint', 'shape', 'status', 'resources', 'actions'];
+  displayedFilterColumns: string[] = ['checkbox-filter', 'user-filter', 'type-filter', 'project-filter', 'endpoint-filter', 'shape-filter', 'status-filter', 'resource-filter', 'actions-filter'];
+  public selected;
+  public allActiveNotebooks: any;
+  private cashedFilterForm: ManagementConfigModel = new ManagementConfigModel([], '', [], [], [], [], []);
+  public isFilterSelected: boolean;
+  public isFilterChanged: boolean;
 
   constructor(
     private healthStatusService: HealthStatusService,
@@ -69,19 +107,38 @@
     public toastr: ToastrService,
     public dialog: MatDialog,
     private progressBarService: ProgressBarService,
+    private cdRef: ChangeDetectorRef,
+    private applicationRef: ApplicationRef,
   ) { }
 
   ngOnInit() {
-  this.getEnvironmentData();
+    this.getEnvironmentData();
+  }
+
+
+  ngAfterViewInit() {
+    this.progressBarService.startProgressBar();
+    this.tableEl = this.table._elementRef.nativeElement;
+    this.checkMaxRight();
+  }
+
+  ngAfterViewChecked() {
+    if (this.tableWrapperWidth !== this.wrapper.nativeElement.offsetWidth) {
+      this.tableWrapperWidth = this.wrapper.nativeElement.offsetWidth;
+      timer(100).subscribe(_ => {
+        this.applicationRef.tick();
+      });
+    }
+    this.cdRef.detectChanges();
   }
 
   getEnvironmentData() {
-    setTimeout(() => {this.progressBarService.startProgressBar(); } , 0);
+    this.progressBarService.startProgressBar();
     this.environmentsDataService._data.subscribe(data => {
       if (data) {
         this.allEnvironmentData = EnvironmentModel.loadEnvironments(data);
         this.getDefaultFilterConfiguration(data);
-        this.applyFilter(this.filterForm);
+        this.applyFilter(this.cashedFilterForm || this.filterForm);
       }
       this.progressBarService.stopProgressBar();
     }, () => {
@@ -96,6 +153,12 @@
 
   public onUpdate($event): void {
     this.filterForm[$event.type] = $event.model;
+    this.checkFilters();
+  }
+
+  private checkFilters() {
+    this.isFilterChanged = CompareUtils.compareFilters(this.filterForm, this.cashedFilterForm);
+    this.isFilterSelected = Object.keys(this.filterForm).some(v => this.filterForm[v].length > 0);
   }
 
   public toggleFilterRow(): void {
@@ -109,38 +172,51 @@
   }
 
   public applyFilter(config) {
+    if (config) {
+      this.filterForm = JSON.parse(JSON.stringify(config));
+      Object.setPrototypeOf(this.filterForm, Object.getPrototypeOf(config));
+      this.cashedFilterForm = JSON.parse(JSON.stringify(config));
+      Object.setPrototypeOf(this.cashedFilterForm, Object.getPrototypeOf(config));
+    }
+
     let filteredData = this.getEnvironmentDataCopy();
 
     const containsStatus = (list, selectedItems) => {
-      return list.filter((item: any) => { if (selectedItems.indexOf(item.status) !== -1) return item; });
+      if (list) {
+        return list.filter((item: any) => { if (selectedItems.indexOf(item.status) !== -1) return item; });
+      }
     };
 
     if (filteredData.length) this.filtering = true;
     if (config) {
       filteredData = filteredData.filter(item => {
-
         const isUser = config.users.length > 0 ? (config.users.indexOf(item.user) !== -1) : true;
-        const isTypeName = item.name ?
-          item.name.toLowerCase().indexOf(config.type.toLowerCase()) !== -1 : item.type.toLowerCase().indexOf(config.type.toLowerCase()) !== -1;
+        const isTypeName = item.name ? item.name.toLowerCase()
+          .indexOf(config.type.toLowerCase()) !== -1 : item.type.toLowerCase().indexOf(config.type.toLowerCase()) !== -1;
         const isStatus = config.statuses.length > 0 ? (config.statuses.indexOf(item.status) !== -1) : (config.type !== 'active');
         const isShape = config.shapes.length > 0 ? (config.shapes.indexOf(item.shape) !== -1) : true;
         const isProject = config.projects.length > 0 ? (config.projects.indexOf(item.project) !== -1) : true;
+        const isEndpoint = config.endpoints.length > 0 ? (config.endpoints.indexOf(item.endpoint) !== -1) : true;
 
         const modifiedResources = containsStatus(item.resources, config.resources);
-        let isResources = config.resources.length > 0 ? (modifiedResources.length > 0) : true;
+        let isResources = config.resources.length > 0 ? (modifiedResources && modifiedResources.length > 0) : true;
+        if (config.resources.length > 0 && modifiedResources && modifiedResources.length > 0) { item.resources = modifiedResources; }
 
-        if (config.resources.length > 0 && modifiedResources.length > 0) { item.resources = modifiedResources; }
-
-        if (config.resources.length === 0 && config.type === 'active' ||
-          modifiedResources.length >= 0 && config.resources.length > 0 && config.type === 'active') {
+        if (config.resources && config.resources.length === 0 && config.type === 'active' ||
+          modifiedResources && modifiedResources.length >= 0 && config.resources.length > 0 && config.type === 'active') {
           item.resources = modifiedResources;
           isResources = true;
         }
 
-        return isUser && isTypeName && isStatus && isShape && isProject && isResources;
+        return isUser && isTypeName && isStatus && isShape && isProject && isResources && isEndpoint;
       });
     }
     this.allFilteredEnvironmentData = filteredData;
+    this.allActiveNotebooks = this.allFilteredEnvironmentData
+      .filter(v => v.name &&
+      (v.status === 'running' || v.status === 'stopped') &&
+      !this.clustersInProgress(v.resources || []));
+    this.checkFilters();
   }
 
   getEnvironmentDataCopy() {
@@ -148,38 +224,7 @@
   }
 
   toggleResourceAction(environment: any, action: string, resource?): void {
-    if (resource) {
-      const resource_name = resource ? resource.computational_name : environment.name;
-      this.dialog.open(ReconfirmationDialogComponent, {
-        data: { action, resource_name, user: environment.user },
-        width: '550px', panelClass: 'error-modalbox'
-      }).afterClosed().subscribe(result => {
-        result && this.actionToggle.emit({ action, environment, resource });
-      });
-    } else {
-      const type = (environment.type.toLowerCase() === 'edge node')
-        ? ConfirmationDialogType.StopEdgeNode : ConfirmationDialogType.StopExploratory;
-
-      if (action === 'stop') {
-        this.dialog.open(ConfirmationDialogComponent, {
-          data: { notebook: environment, type: type, manageAction: true }, panelClass: 'modal-md'
-        }).afterClosed().subscribe(() => this.buildGrid());
-      } else if (action === 'terminate') {
-        this.dialog.open(ConfirmationDialogComponent, {
-          data: { notebook: environment, type: ConfirmationDialogType.TerminateExploratory, manageAction: true }, panelClass: 'modal-md'
-        }).afterClosed().subscribe(() => this.buildGrid());
-      } else if (action === 'run') {
-        this.healthStatusService.runEdgeNode().subscribe(() => {
-          this.buildGrid();
-          this.toastr.success('Edge node is starting!', 'Processing!');
-        }, () => this.toastr.error('Edge Node running failed!', 'Oops!'));
-      } else if (action === 'recreate') {
-        this.healthStatusService.recreateEdgeNode().subscribe(() => {
-          this.buildGrid();
-          this.toastr.success('Edge Node recreation is processing!', 'Processing!');
-        }, () => this.toastr.error('Edge Node recreation failed!', 'Oops!'));
-      }
-    }
+    this.actionToggle.emit({ environment, action, resource });
   }
 
   isResourcesInProgress(notebook) {
@@ -196,38 +241,89 @@
   }
 
   public inProgress(resources) {
-    return resources.filter(resource => (
+    return resources.some(resource => (
       resource.status !== 'failed'
       && resource.status !== 'terminated'
       && resource.status !== 'running'
-      && resource.status !== 'stopped')).length > 0;
+      && resource.status !== 'stopped'));
   }
 
-  public isActiveResources(item) {
-    if (item.resources.length) return item.resources.some(e => e.status !== 'terminated');
-  }
-
-
   private getDefaultFilterConfiguration(data): void {
-    const users = [], projects = [], shapes = [], statuses = [], resources = [];
+    const users = [], projects = [], shapes = [], statuses = [], resources = [], endpoints = [];
 
     data && data.forEach((item: any) => {
       if (item.user && users.indexOf(item.user) === -1) users.push(item.user);
+      if (item.endpoint && endpoints.indexOf(item.endpoint) === -1) endpoints.push(item.endpoint);
       if (item.status && statuses.indexOf(item.status.toLowerCase()) === -1) statuses.push(item.status.toLowerCase());
       if (item.project && projects.indexOf(item.project) === -1) projects.push(item.project);
       if (item.shape && shapes.indexOf(item.shape) === -1) shapes.push(item.shape);
-
-      item.computational_resources.map((resource: any) => {
-        if (resources.indexOf(resource.status) === -1) resources.push(resource.status);
-        resources.sort(SortUtils.statusSort);
-      });
+      if (item.computational_resources) {
+         item.computational_resources.map((resource: any) => {
+              if (resources.indexOf(resource.status) === -1) resources.push(resource.status);
+              resources.sort(SortUtils.statusSort);
+            });
+      }
     });
 
-    this.filterConfiguration = new ManagementConfigModel(users, '', projects, shapes, statuses, resources);
+    this.filterConfiguration = new ManagementConfigModel(users, '', projects, shapes, statuses, resources, endpoints);
+  }
+
+  public openNotebookDetails(data) {
+    if (!data.exploratory_urls || !data.exploratory_urls.length) {
+      return;
+    }
+    this.dialog.open(DetailDialogComponent, { data:
+        {notebook: data, buckets: [], type: 'environment'},
+      panelClass: 'modal-lg'
+    })
+      .afterClosed().subscribe(() => {});
+  }
+
+  public toggleActionForAll(element) {
+    element.isSelected = !element.isSelected;
+    this.selected = this.allFilteredEnvironmentData.filter(item => !!item.isSelected);
+    this.emitSelectedList.emit(this.selected);
+  }
+
+  public toggleSelectionAll() {
+    if (this.selected && this.selected.length === this.allActiveNotebooks.length) {
+      this.allActiveNotebooks.forEach(notebook => notebook.isSelected = false);
+    } else {
+      this.allActiveNotebooks.forEach(notebook => notebook.isSelected = true);
+    }
+    this.selected = this.allFilteredEnvironmentData.filter(item => !!item.isSelected);
+    this.emitSelectedList.emit(this.selected);
+  }
+
+  public clustersInProgress(resources: any) {
+    const statuses = ['terminating', 'stopping', 'starting', 'creating', 'configuring', 'reconfiguring'];
+    return resources.filter(resource => statuses.includes(resource.status)).length;
+  }
+
+  public onFilterNameUpdate(targetElement: any) {
+    this.filterForm.type = targetElement;
+    this.checkFilters();
+  }
+
+  public sctollTo(direction: string) {
+    if (direction === 'left') {
+      this.wrapper.nativeElement.scrollLeft = 0;
+    } else {
+      this.wrapper.nativeElement.scrollLeft = this.wrapper.nativeElement.offsetWidth;
+    }
+  }
+
+  public checkMaxRight() {
+    let arg;
+      if (this.wrapper && this.table) {
+        arg = this.wrapper.nativeElement.offsetWidth +
+          this.wrapper.nativeElement.scrollLeft + 2 <= this.table._elementRef.nativeElement.offsetWidth;
+      }
+      
+      return this.isMaxRight.next(arg);
   }
 }
 
-
 @Component({
   selector: 'confirm-dialog',
   template: `
@@ -236,23 +332,106 @@
     <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
   </div>
   <div mat-dialog-content class="content">
+    <div *ngIf="data.type === 'cluster'">
       <p>Resource <span class="strong"> {{ data.resource_name }}</span> of user <span class="strong"> {{ data.user }} </span> will be
       <span *ngIf="data.action === 'terminate'"> decommissioned.</span>
       <span *ngIf="data.action === 'stop'">stopped.</span>
     </p>
-    <p class="m-top-20"><span class="strong">Do you want to proceed?</span></p>
+    </div>
+    <div class="resource-list" *ngIf="data.type === 'notebook'">
+      <div class="resource-list-header">
+        <div class="resource-name">Notebook</div>
+        <div class="clusters-list">
+          <div class="clusters-list-item">
+            <div class="cluster"><span *ngIf="isClusterLength">Compute</span></div>
+            <div class="status">Further status</div>
+          </div>
+        </div>
+
+      </div>
+      <div class="scrolling-content resource-heigth">
+        <div class="resource-list-row sans node" *ngFor="let notebook of notebooks">
+          <div class="resource-name ellipsis">
+            {{notebook.name}}
+          </div>
+
+          <div class="clusters-list">
+            <div class="clusters-list-item">
+              <div class="cluster"></div>
+              <div class="status"
+                   [ngClass]="{
+                   'stopped': data.action==='stop', 'terminated': data.action === 'terminate'
+                    }"
+              >
+                {{data.action  === 'stop' ? 'Stopped' : 'Terminated'}}
+              </div>
+            </div>
+            <div class="clusters-list-item" *ngFor="let cluster of notebook?.resources">
+              <div class="cluster">{{cluster.computational_name}}</div>
+              <div class="status" [ngClass]="{
+              'stopped': (data.action==='stop' && cluster.image==='docker.datalab-dataengine'), 'terminated': data.action === 'terminate' || (data.action==='stop' && cluster.image!=='docker.datalab-dataengine')
+              }">{{data.action  === 'stop' && cluster.image === "docker.datalab-dataengine" ? 'Stopped' : 'Terminated'}}</div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
   </div>
-  <div class="text-center">
+  <div class="text-center ">
+    <p class="strong">Do you want to proceed?</p>
+  </div>
+  <div class="text-center m-top-20">
     <button type="button" class="butt" mat-raised-button (click)="dialogRef.close()">No</button>
     <button type="button" class="butt butt-success" mat-raised-button (click)="dialogRef.close(true)">Yes</button>
   </div>
   `,
   styles: [
+    `
+      .content { color: #718ba6; padding: 20px 50px; font-size: 14px; font-weight: 400; margin: 0; }
+      .info { color: #35afd5; }
+      .info .confirm-dialog { color: #607D8B; }
+      header { display: flex; justify-content: space-between; color: #607D8B; }
+      header h4 i { vertical-align: bottom; }
+      header a i { font-size: 20px; }
+      header a:hover i { color: #35afd5; cursor: pointer; }
+      .plur { font-style: normal; }
+      .scrolling-content{overflow-y: auto; max-height: 200px; }
+      .cluster { width: 50%; text-align: left;}
+      .status { width: 50%;text-align: left;}
+      .label { font-size: 15px; font-weight: 500; font-family: "Open Sans",sans-serif;}
+      .node { font-weight: 300;}
+      .resource-name { width: 40%;text-align: left; padding: 10px 0;line-height: 26px;}
+      .clusters-list { width: 60%;text-align: left; padding: 10px 0;line-height: 26px;}
+      .clusters-list-item { width: 100%;text-align: left;display: flex}
+      .resource-list{max-width: 100%; margin: 0 auto;margin-top: 20px; }
+      .resource-list-header{display: flex; font-weight: 600; font-size: 16px;height: 48px; border-top: 1px solid #edf1f5; border-bottom: 1px solid #edf1f5; padding: 0 20px;}
+      .resource-list-row{display: flex; border-bottom: 1px solid #edf1f5;padding: 0 20px;}
+      .confirm-resource-terminating{text-align: left; padding: 10px 20px;}
+      .confirm-message{color: #ef5c4b;font-size: 13px;min-height: 18px; text-align: center; padding-top: 20px}
+      .checkbox{margin-right: 5px;vertical-align: middle; margin-bottom: 3px;}
+      label{cursor: pointer}
+      .bottom-message{padding-top: 15px;}
+      .table-header{padding-bottom: 10px;}`
   ]
 })
+
 export class ReconfirmationDialogComponent {
+  public notebooks;
+  public isClusterLength;
   constructor(
     public dialogRef: MatDialogRef<ReconfirmationDialogComponent>,
     @Inject(MAT_DIALOG_DATA) public data: any
-  ) { }
+  ) {
+    if (data.notebooks && data.notebooks.length) {
+      this.notebooks = JSON.parse(JSON.stringify(data.notebooks));
+      this.notebooks = this.notebooks.map(notebook => {
+        notebook.resources = notebook.resources.filter(res => res.status !== 'failed' &&
+          res.status !== 'terminated' && res.status.slice(0, 4) !== data.action);
+        if (notebook.resources.length) {
+          this.isClusterLength = true;
+        }
+          return notebook;
+      });
+    }
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.html
index 4c4bdae..240a9e0 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.html
@@ -20,6 +20,39 @@
 <div class="base-retreat">
   <div class="sub-nav">
     <div *ngIf="healthStatus?.admin" class="admin-group">
+      <div class="action-select-wrapper admin-group" >
+        <span class="action-button-wrapper">
+          <button
+            type="button" class="butt actions-btn"
+            mat-raised-button
+            [disabled]="!selected.length"
+            (click)="toogleActions();$event.stopPropagation()"
+          >
+            Actions
+            <i class="material-icons" >{{ !isActionsOpen ?  'expand_more' : 'expand_less' }}</i>
+          </button>
+          </span>
+        <div class="action-menu" *ngIf="isActionsOpen">
+          <span>
+          <button
+           type="button" class="butt action-menu-item"
+            [ngClass]="{'disabled': selectedRunning.length === 0  || selectedStopped.length !== 0 }"
+            mat-raised-button
+            [disabled]="selectedRunning.length === 0"
+            (click)="resourseAction('stop');$event.stopPropagation()"
+          >
+            Stop
+          </button>
+            </span>
+          <button
+            type="button" class="butt action-menu-item"
+            mat-raised-button
+            (click)="resourseAction('terminate');$event.stopPropagation()"
+          >
+            Terminate
+          </button>
+        </div>
+      </div>
       <button mat-raised-button class="butt ssn" (click)="showEndpointsDialog()">
         <i class="material-icons"></i>Endpoints
       </button>
@@ -27,19 +60,19 @@
         <i class="material-icons"></i>SSN Monitor
       </button> -->
       <button mat-raised-button class="butt env" (click)="openManageEnvironmentDialog()">
-        <i class="material-icons"></i>Manage DLab quotas
+          Manage DataLab quotas
       </button>
       <!-- <button mat-raised-button class="butt" (click)="showBackupDialog()" [disabled]="creatingBackup">
         <i class="material-icons">backup</i>Backup
       </button> -->
     </div>
-    <button mat-raised-button class="butt" (click)="buildGrid()">
-      <i class="material-icons">autorenew</i>Refresh
+    <button mat-raised-button class="butt" (click)="refreshGrid()">
+      <i class="material-icons refresh-icon">autorenew</i>Refresh
     </button>
   </div>
   <mat-divider></mat-divider>
   <management-grid [currentUser]="user.toLowerCase()" [isAdmin]="healthStatus?.admin"
     [environmentsHealthStatuses]="healthStatus?.list_resources" (refreshGrid)="buildGrid()"
-    (actionToggle)="manageEnvironmentAction($event)">
+    (actionToggle)="toggleResourceAction($event)" (emitSelectedList)="selectedList($event)">
   </management-grid>
 </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.scss
index 78497c6..b0e0c3f 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.scss
@@ -28,6 +28,8 @@
       margin-right: 0;
     }
     &.env {
+      display: flex;
+      justify-content: center;
       width: 210px;
     }
     &.ssn {
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.ts
index 87e554d..38779fc 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/management.component.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { Component, OnInit } from '@angular/core';
+import {Component, OnInit, ViewChild} from '@angular/core';
 import { MatDialog } from '@angular/material/dialog';
 import { ToastrService } from 'ngx-toastr';
 
@@ -39,6 +39,9 @@
 
 import { EnvironmentsDataService } from './management-data.service';
 import { ProjectService } from '../../core/services';
+import {ConfirmationDialogComponent, ConfirmationDialogType} from '../../shared/modal-dialog/confirmation-dialog';
+import {ManagementGridComponent, ReconfirmationDialogComponent} from './management-grid/management-grid.component';
+import {FolderTreeComponent} from '../../resources/bucket-browser/folder-tree/folder-tree.component';
 
 @Component({
   selector: 'environments-management',
@@ -50,6 +53,13 @@
   public healthStatus: GeneralEnvironmentStatus;
   // public anyEnvInProgress: boolean = false;
   public dialogRef: any;
+  public selected: any[] = [];
+  public isActionsOpen: boolean = false;
+  public selectedRunning: any[];
+  public selectedStopped: any[];
+
+  @ViewChild(ManagementGridComponent, {static: true}) managementGrid;
+
 
   constructor(
     public toastr: ToastrService,
@@ -73,6 +83,10 @@
     this.environmentsDataService.updateEnvironmentData();
   }
 
+  public refreshGrid() {
+     this.buildGrid();
+  }
+
   public manageEnvironmentAction($event) {
     this.manageEnvironmentsService
       .environmentManagement(
@@ -98,7 +112,7 @@
   openManageEnvironmentDialog() {
     this.projectService.getProjectsList().subscribe(projectsList => {
       this.getTotalBudgetData().subscribe(total => {
-        this.dialogRef = this.dialog.open(ManageEnvironmentComponent, { data: { projectsList, total }, panelClass: 'modal-sm' });
+        this.dialogRef = this.dialog.open(ManageEnvironmentComponent, { data: { projectsList, total }, panelClass: 'modal-xl-s' });
         this.dialogRef.afterClosed().subscribe(result => result && this.setBudgetLimits(result));
       }, () => this.toastr.error('Failed users list loading!', 'Oops!'));
     });
@@ -116,15 +130,30 @@
   // }
 
   setBudgetLimits($event) {
-    this.projectService.updateProjectsBudget($event.projects).subscribe((result: any) => {
+    if ($event.projects.length) {
+      this.projectService.updateProjectsBudget($event.projects).subscribe((result: any) => {
+        if ($event.isTotalChanged) {
+          this.healthStatusService.updateTotalBudgetData($event.total).subscribe((res: any) => {
+            result.status === HTTP_STATUS_CODES.OK
+            && res.status === HTTP_STATUS_CODES.NO_CONTENT
+            && this.toastr.success('Budget limits updated!', 'Success!');
+            this.buildGrid();
+          });
+        } else {
+          result.status === HTTP_STATUS_CODES.OK && this.toastr.success('Budget limits updated!', 'Success!');
+          this.buildGrid();
+        }
+
+      }, error => this.toastr.error(error.message, 'Oops!'));
+    } else {
       this.healthStatusService.updateTotalBudgetData($event.total).subscribe((res: any) => {
-        result.status === HTTP_STATUS_CODES.OK
-          && res.status === HTTP_STATUS_CODES.NO_CONTENT
-          && this.toastr.success('Budget limits updated!', 'Success!');
+        res.status === HTTP_STATUS_CODES.NO_CONTENT
+        && this.toastr.success('Budget limits updated!', 'Success!');
         this.buildGrid();
       });
-    }, error => this.toastr.error(error.message, 'Oops!'));
-  }
+    }
+    }
+
 
   // manageEnvironment(event: { action: string, project: any }) {
   //   if (event.action === 'stop')
@@ -171,4 +200,99 @@
   private getTotalBudgetData() {
     return this.healthStatusService.getTotalBudgetData();
   }
+
+  public selectedList($event) {
+    this.selected = $event;
+    if (this.selected.length === 0) {
+      this.isActionsOpen = false;
+    }
+
+    this.selectedRunning = this.selected.filter(item => item.status === 'running');
+    this.selectedStopped = this.selected.filter(item => item.status === 'stopped');
+  }
+
+  public toogleActions() {
+    this.isActionsOpen = !this.isActionsOpen;
+  }
+
+  toggleResourceAction($event): void {
+    const {environment, action, resource} = $event;
+    if (resource) {
+      const resource_name = resource ? resource.computational_name : environment.name;
+      this.dialog.open(ReconfirmationDialogComponent, {
+        data: { action, resource_name, user: environment.user, type: 'cluster'},
+        width: '550px', panelClass: 'error-modalbox'
+      }).afterClosed().subscribe(result => {
+        result && this.manageEnvironmentAction({ action, environment, resource });
+      });
+    } else {
+      let notebooks = this.selected.length ? this.selected : [environment];
+      if (action === 'stop') {
+        notebooks = notebooks.filter(note => note.status !== 'stopped');
+        this.dialog.open(ReconfirmationDialogComponent, {
+          data: { notebooks: notebooks, type: 'notebook', action },
+          width: '550px', panelClass: 'error-modalbox'
+        }).afterClosed().subscribe((res) => {
+          if (res) {
+            notebooks.forEach((env) => {
+              this.manageEnvironmentsService.environmentManagement(env.user, 'stop', env.project, env.name)
+                .subscribe(response => {
+                    this.buildGrid();
+                  },
+                  error => console.log(error)
+                );
+            });
+            this.clearSelection();
+          } else {
+            this.clearSelection();
+          }
+          this.isActionsOpen = false;
+        });
+      } else if (action === 'terminate') {
+        this.dialog.open(ReconfirmationDialogComponent, {
+          data: { notebooks: notebooks, type: 'notebook', action }, width: '550px', panelClass: 'error-modalbox'
+        }).afterClosed().subscribe((res) => {
+          if (res) {
+            notebooks.forEach((env) => {
+              this.manageEnvironmentsService.environmentManagement(env.user, 'terminate', env.project, env.name)
+                .subscribe(
+                  response => {
+                    this.buildGrid();
+                  },
+                  error => console.log(error)
+                );
+            });
+            this.clearSelection();
+          } else {
+            this.clearSelection();
+          }
+          this.isActionsOpen = false;
+        });
+      // } else if (action === 'run') {
+      //   this.healthStatusService.runEdgeNode().subscribe(() => {
+      //     this.buildGrid();
+      //     this.toastr.success('Edge node is starting!', 'Processing!');
+      //   }, () => this.toastr.error('Edge Node running failed!', 'Oops!'));
+      // } else if (action === 'recreate') {
+      //   this.healthStatusService.recreateEdgeNode().subscribe(() => {
+      //     this.buildGrid();
+      //     this.toastr.success('Edge Node recreation is processing!', 'Processing!');
+      //   }, () => this.toastr.error('Edge Node recreation failed!', 'Oops!'));
+      }
+    }
+  }
+
+  private clearSelection() {
+    this.selected = [];
+    this.isActionsOpen = false;
+    if (this.managementGrid.selected && this.managementGrid.selected.length !== 0) {
+      this.managementGrid.selected.forEach(item => item.isSelected = false);
+      this.managementGrid.selected = [];
+    }
+  }
+
+
+  public resourseAction(action) {
+      this.toggleResourceAction({environment: this.selected, action: action});
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/management.model.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/management.model.ts
index b4f0701..7e9dda2 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/management.model.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/management.model.ts
@@ -27,7 +27,11 @@
     public ip: string,
     public type?: string,
     public project?: string,
-    public cloud_provider?: string
+    public endpoint?: string,
+    public cloud_provider?: string,
+    public gpu_type?: string,
+    public gpu_count?: string,
+    public exploratory_urls?: Array<any>
   ) { }
 
   public static loadEnvironments(data: Array<any>) {
@@ -41,7 +45,11 @@
         value.public_ip,
         value.resource_type,
         value.project,
-        value.cloud_provider
+        value.endpoint,
+        value.cloud_provider,
+        value.gpu_type,
+        value.gpu_count,
+        value.exploratory_urls
       ));
     }
   }
@@ -69,19 +77,21 @@
 
 export interface GeneralEnvironmentStatus {
   admin: boolean;
+  auditEnabled: boolean;
   projectAdmin: boolean;
   billingEnabled: boolean;
   billingQuoteUsed: number;
   list_resources: any;
   status: string;
   projectAssigned: boolean;
+  bucketBrowser: object;
 }
 
 
 export class ManagementConfigModel {
 
   static getDefault(): ManagementConfigModel {
-    return new ManagementConfigModel([], '', [], [], [], []);
+    return new ManagementConfigModel([], '', [], [], [], [], []);
   }
 
   constructor(
@@ -91,6 +101,7 @@
     public shapes: Array<string>,
     public statuses: Array<string>,
     public resources: Array<string>,
+    public endpoints: Array<string>,
 
   ) { }
 
@@ -101,5 +112,6 @@
     this.shapes = [];
     this.statuses = [];
     this.resources = [];
+    this.endpoints = [];
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/ssn-monitor/ssn-monitor.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/ssn-monitor/ssn-monitor.component.ts
index 2791353..1ef7634 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/ssn-monitor/ssn-monitor.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/ssn-monitor/ssn-monitor.component.ts
@@ -20,12 +20,11 @@
 import { Component, OnInit, ViewEncapsulation } from '@angular/core';
 import { MatDialogRef } from '@angular/material/dialog';
 import { ToastrService } from 'ngx-toastr';
-
 import { DICTIONARY } from '../../../../dictionary/global.dictionary';
 import { HealthStatusService } from '../../../core/services';
 
 @Component({
-  selector: 'dlab-ssn-monitor',
+  selector: 'datalab-ssn-monitor',
   templateUrl: './ssn-monitor.component.html',
   styleUrls: ['./ssn-monitor.component.scss'],
   encapsulation: ViewEncapsulation.None
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/create-odahu-cluster.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/create-odahu-cluster.component.html
new file mode 100644
index 0000000..2aedd75
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/create-odahu-cluster.component.html
@@ -0,0 +1,112 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<div class="create-odahu-cluster" id="dialog-box">
+  <header class="dialog-header">
+    <h4 class="modal-title">Create Odahu cluster</h4>
+    <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
+  </header>
+  <div class="dialog-content selection">
+    <div id="scrolling" class="content-box mat-reset scrolling-content">
+      <form [formGroup]="createOdahuForm" *ngIf="createOdahuForm" novalidate>
+        <div class="control-group">
+          <label class="label">Select project</label>
+          <div class="control selector-wrapper">
+            <mat-form-field>
+              <mat-label>Select project</mat-label>
+              <mat-select formControlName="project" panelClass="create-resources-dialog">
+                <mat-option *ngFor="let project of projects" [value]="project.name" (click)="setEndpoints(project)">
+                  {{ project.name }}</mat-option>
+                <mat-option *ngIf="!projects.length" class="multiple-select ml-10" disabled>
+                  No projects for creating Odahu clusters
+                </mat-option>
+              </mat-select>
+              <button class="caret">
+                <i class="material-icons">keyboard_arrow_down</i>
+              </button>
+            </mat-form-field>
+          </div>
+        </div>
+
+        <div class="control-group">
+          <label class="label">Select endpoint</label>
+          <div class="control selector-wrapper" [ngClass]="{ 'not-active' : !endpoints.length }">
+            <mat-form-field>
+              <mat-label>Select endpoint</mat-label>
+              <mat-select formControlName="endpoint" disableOptionCentering [disabled]="!endpoints.length"
+                          panelClass="create-resources-dialog">
+                <mat-option *ngFor="let endpoint of endpoints" [value]="endpoint">
+                  {{ endpoint }}
+                </mat-option>
+                <mat-option *ngIf="!endpoints.length" class="multiple-select ml-10" disabled>Endpoints list is empty</mat-option>
+              </mat-select>
+              <button class="caret">
+                <i class="material-icons">keyboard_arrow_down</i>
+              </button>
+            </mat-form-field>
+          </div>
+        </div>
+
+        <div class="control-group name-control">
+          <label class="label">Name</label>
+          <div class="control">
+            <input type="text" class="form-control" placeholder="Enter Name" formControlName="name">
+            <span class="error" *ngIf="!createOdahuForm.controls.name.valid && createOdahuForm.controls.name.dirty && !createOdahuForm.controls.name.hasError('duplication')">
+              Odahu cluster name can only contain letters and numbers
+            </span>
+            <span class="error" *ngIf="createOdahuForm.controls.name.hasError('duplication')">This Odahu cluster name already exists.</span>
+          </div>
+        </div>
+
+        <div class="control-group name-control">
+          <label class="label">Custom tag</label>
+          <div class="control">
+            <input type="text" class="form-control" placeholder="Enter custom tag" formControlName="custom_tag">
+          <span class="error"
+            *ngIf="!createOdahuForm.controls.custom_tag.valid && createOdahuForm.controls.custom_tag.dirty">
+            Custom tag can only contain letters, numbers, hyphens and '_' but can not end with special characters</span>
+          </div>
+        </div>
+
+<!--        <div class="control-group">-->
+<!--          <label class="label" [ngStyle]="!createLegionClusterForm.controls.useExistingClusterUrl.value && {'width': '100%' }">-->
+<!--            <input  type="checkbox" formControlName="useExistingClusterUrl"/> Use existing k8s cluster-->
+<!--          </label>-->
+<!--          <div class="control" *ngIf="createLegionClusterForm.controls.useExistingClusterUrl.value">-->
+<!--            <input type="text" class="form-control"-->
+<!--                                   formControlName="existingClusterUrl" placeholder="Enter ODAHU k8s cluster URL"/>-->
+<!--            <span class="error url-error">-->
+<!--                  <span *ngIf="!createLegionClusterForm.controls.existingClusterUrl.valid">Please enter valid cluster URL</span>-->
+<!--                </span>-->
+<!--          </div>-->
+<!--        </div>-->
+
+        <div class="text-center m-top-30">
+          <button mat-raised-button type="button" class="butt action" (click)="dialogRef.close()">Cancel</button>
+          <button mat-raised-button type="button" class="butt butt-success action"
+                  [disabled]="!createOdahuForm.valid" (click)="createOdahuCluster(createOdahuForm.value)">
+            Create
+          </button>
+        </div>
+
+      </form>
+    </div>
+  </div>
+</div>
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/create-odahu-cluster.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/create-odahu-cluster.component.scss
new file mode 100644
index 0000000..36bc09f
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/create-odahu-cluster.component.scss
@@ -0,0 +1,26 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.create-odahu-cluster{
+  .error{
+    position: absolute;
+    left: 0;
+    top: 36px;
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/create-odahu-cluster.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/create-odahu-cluster.component.ts
new file mode 100644
index 0000000..a4f8360
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/create-odahu-cluster.component.ts
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Component, OnInit, Inject } from '@angular/core';
+import { FormGroup, FormBuilder, Validators } from '@angular/forms';
+import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { ToastrService } from 'ngx-toastr';
+
+import { Project } from '../../project/project.component';
+import { ProjectService, OdahuDeploymentService } from '../../../core/services';
+
+import { DICTIONARY } from '../../../../dictionary/global.dictionary';
+import {CheckUtils, PATTERNS} from '../../../core/util';
+
+
+@Component({
+  selector: 'create-odahu-cluster',
+  templateUrl: 'create-odahu-cluster.component.html',
+  styleUrls: ['./create-odahu-cluster.component.scss']
+})
+
+export class CreateOdahuClusterComponent implements OnInit {
+  readonly DICTIONARY = DICTIONARY;
+  public createOdahuForm: FormGroup;
+
+  projects: Project[] = [];
+  endpoints: Array<String> = [];
+
+  constructor(
+    @Inject(MAT_DIALOG_DATA) public data: any,
+    public toastr: ToastrService,
+    public dialogRef: MatDialogRef<CreateOdahuClusterComponent>,
+    private _fb: FormBuilder,
+    private projectService: ProjectService,
+    private odahuDeploymentService: OdahuDeploymentService,
+  ) {
+  }
+
+  ngOnInit() {
+    this.getUserProjects();
+    this.initFormModel();
+  }
+
+  public getUserProjects(): void {
+    this.projectService.getUserProjectsList(true).subscribe((projects: any) => {
+      this.projects = projects.filter(project => {
+        return project.endpoints.length > project.odahu.filter(od => od.status !== 'FAILED' && od.status !== 'TERMINATED').length; }
+        );
+    });
+  }
+
+  public setEndpoints(project): void {
+    this.endpoints = project.endpoints
+      .filter(e => e.status === 'RUNNING' && !this.data.some(odahu => odahu.status !== 'FAILED'
+        && odahu.status !== 'TERMINATED'
+        && odahu.endpoint === e.name
+        && odahu.project === project.name)
+      )
+      .map(e => e.name);
+  }
+
+  private initFormModel(): void {
+    this.createOdahuForm = this._fb.group({
+      name: ['', [Validators.required, Validators.pattern(PATTERNS.namePattern), this.checkDuplication.bind(this)]],
+      project: ['', Validators.required],
+      endpoint: ['', [Validators.required]],
+      custom_tag: ['', [Validators.pattern(PATTERNS.namePattern)]]
+    });
+  }
+
+  public createOdahuCluster(value): void {
+    this.dialogRef.close();
+    this.odahuDeploymentService.createOdahuNewCluster(value).subscribe(() => {
+      this.toastr.success('Odahu cluster creation is processing!', 'Success!');
+      }, error => this.toastr.error(error.message || 'Odahu cluster creation failed!', 'Oops!')
+    );
+  }
+
+  private checkDuplication(control) {
+    if (control && control.value) {
+      for (let index = 0; index < this.data.length; index++) {
+        if (CheckUtils.delimitersFiltering(control.value) === CheckUtils.delimitersFiltering(this.data[index].name))
+          return { duplication: true };
+      }
+    }
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/index.ts b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/index.ts
new file mode 100644
index 0000000..bd465fa
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/create-odahu-claster/index.ts
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+
+import { MaterialModule } from '../../../shared/material.module';
+import { FormControlsModule } from '../../../shared/form-controls';
+import { KeysPipeModule, UnderscorelessPipeModule } from '../../../core/pipes';
+import {CreateOdahuClusterComponent} from './create-odahu-cluster.component';
+
+export * from './create-odahu-cluster.component';
+
+@NgModule({
+  imports: [
+    CommonModule,
+    FormsModule,
+    ReactiveFormsModule,
+    FormControlsModule,
+    MaterialModule,
+    KeysPipeModule,
+    UnderscorelessPipeModule,
+  ],
+  declarations: [CreateOdahuClusterComponent],
+  entryComponents: [CreateOdahuClusterComponent],
+  exports: [CreateOdahuClusterComponent]
+})
+export class CreateOdahuClusterModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/index.ts b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/index.ts
new file mode 100644
index 0000000..1564326
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/index.ts
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+
+import { MaterialModule } from '../../shared/material.module';
+import { FormControlsModule } from '../../shared/form-controls';
+import { UnderscorelessPipeModule } from '../../core/pipes/underscoreless-pipe';
+
+import {BubbleModule} from '../../shared/bubble';
+import {OdahuComponent} from './odahu.component';
+import {OdahuDataService} from './odahu-data.service';
+import {OdahuGridComponent} from './odahu-grid/odahu-grid.component';
+import {CreateOdahuClusterModule} from './create-odahu-claster';
+
+@NgModule({
+  imports: [
+    CommonModule,
+    FormsModule,
+    ReactiveFormsModule,
+    MaterialModule,
+    FormControlsModule,
+    UnderscorelessPipeModule,
+    BubbleModule,
+    CreateOdahuClusterModule
+  ],
+  declarations: [OdahuComponent, OdahuGridComponent],
+  entryComponents: [],
+  providers: [OdahuDataService],
+  exports: [OdahuComponent]
+})
+export class OdahuModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-data.service.ts b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-data.service.ts
new file mode 100644
index 0000000..bb453ff
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-data.service.ts
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Injectable } from '@angular/core';
+import {BehaviorSubject, Observable} from 'rxjs';
+import {OdahuDeploymentService} from '../../core/services';
+
+
+@Injectable()
+export class OdahuDataService {
+  _odahuClasters = new BehaviorSubject<any>(null);
+
+  constructor(private odahuDeploymentService: OdahuDeploymentService) {
+    this.getClastersList();
+  }
+
+  public updateClasters(): void {
+    this.getClastersList();
+  }
+
+  private getClastersList(): void {
+   this.odahuDeploymentService.getOduhuClustersList().subscribe(
+      (response: any ) => {
+        return this._odahuClasters.next(response);
+      });
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-grid/odahu-grid.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-grid/odahu-grid.component.html
new file mode 100644
index 0000000..5d60595
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-grid/odahu-grid.component.html
@@ -0,0 +1,112 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<table mat-table [dataSource]="dataSource" class="odahu-clasters-table mat-elevation-z6 selection">
+  <ng-container matColumnDef="project">
+    <th mat-header-cell *matHeaderCellDef class="project"> Project name </th>
+    <td mat-cell *matCellDef="let element" class="project">
+      <span *ngIf="element && element.project">{{element.project}}</span>
+    </td>
+    <td mat-footer-cell *matFooterCellDef></td>
+  </ng-container>
+
+  <ng-container matColumnDef="endpoint-url">
+    <th mat-header-cell *matHeaderCellDef class="endpoint"> Endpoint </th>
+    <td mat-cell *matCellDef="let element" class="endpoint">
+      <span *ngIf="element && element.endpoint" matTooltip="{{element.endpoint}}" [matTooltipPosition]="'above'">
+        {{element.endpoint}}
+      </span>
+    </td>
+    <td mat-footer-cell *matFooterCellDef></td>
+  </ng-container>
+
+  <ng-container matColumnDef="odahu-name">
+    <th mat-header-cell *matHeaderCellDef class="odahu-name"> Odahu cluster name </th>
+    <td mat-cell *matCellDef="let element" class="odahu-name">
+      <span *ngIf="element && element.name">{{element.name}}</span>
+    </td>
+    <td mat-footer-cell *matFooterCellDef></td>
+  </ng-container>
+
+  <ng-container matColumnDef="odahu-status">
+    <th mat-header-cell *matHeaderCellDef class="odahu-status"> Odahu cluster status </th>
+    <td mat-cell *matCellDef="let element" class="odahu-status">
+      <span *ngIf="element && element.name" [ngClass]="element.status.toLowerCase()">{{ element.status | titlecase}}</span>
+    </td>
+    <td mat-footer-cell *matFooterCellDef></td>
+  </ng-container>
+
+  <ng-container matColumnDef="actions">
+    <th mat-header-cell *matHeaderCellDef class="odahu-actions"></th>
+    <td mat-cell *matCellDef="let element" class="settings">
+      <span *ngIf="element && element.name" #settings (click)="actions.toggle($event, settings)" class="actions" [ngClass]="{'disabled': element.status !== 'RUNNING' && element.status !== 'STOPPED'}"></span>
+      <bubble-up #actions class="list-menu" position="bottom-left" alternative="top-left">
+        <ul class="list-unstyled">
+          <div class="active-items"></div>
+          <li class="project-seting-item" *ngIf="element.status === 'STOPPED'" (click)="odahuAction(element, 'start')">
+            <i class="material-icons">play_circle_outline</i>
+            <a class="action">
+              Start
+            </a>
+          </li>
+          <li class="project-seting-item" *ngIf="element.status === 'RUNNING'" (click)="odahuAction(element, 'stop')">
+            <i class="material-icons">pause_circle_outline</i>
+            <a class="action" >
+              Stop
+            </a>
+          </li>
+          <li class="project-seting-item" [ngClass]="{'disabled' : element.status === 'STOPPED'}" *ngIf="element.status !== 'TERMINATED' && element.status !== 'TERMINATING'" (click)="odahuAction(element, 'terminate')">
+            <i class="material-icons">phonelink_off</i>
+            <a class="action">
+              Terminate
+            </a>
+          </li>
+          <!--<li class="project-seting-item">-->
+            <!--<i class="material-icons">arrow_downward</i>-->
+            <!--<a>-->
+              <!--Scale-down-->
+            <!--</a>-->
+          <!--</li>-->
+          <!--<li class="project-seting-item">-->
+            <!--<i class="material-icons">arrow_upward</i>-->
+            <!--<a  class="action">-->
+              <!--Scale-up-->
+            <!--</a>-->
+          <!--</li>-->
+        </ul>
+      </bubble-up>
+    </td>
+    <td mat-footer-cell *matFooterCellDef></td>
+  </ng-container>
+
+    <ng-container matColumnDef="placeholder">
+      <td mat-footer-cell *matFooterCellDef
+          [colSpan]="displayedColumns.length"
+          class="info">
+          <span>No Odahu clusters</span>
+      </td>
+      <td mat-footer-cell *matFooterCellDef></td>
+    </ng-container>
+
+  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
+  <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
+  <tr [hidden]="odahuList && odahuList.length" mat-footer-row *matFooterRowDef="['placeholder']"></tr>
+</table>
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-grid/odahu-grid.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-grid/odahu-grid.component.scss
new file mode 100644
index 0000000..07351bc
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-grid/odahu-grid.component.scss
@@ -0,0 +1,96 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.odahu-clasters-table {
+  width: 100%;
+
+  .project, .endpoint, .odahu-name, .odahu-status{
+    width: 23%;
+  }
+
+  td.settings {
+    position: relative;
+    vertical-align: middle !important;
+    text-align: right;
+  }
+
+  .list-menu {
+    min-width: 190px;
+  }
+
+  .material-icons {
+    font-size: 18px;
+    padding-top: 1px;
+  }
+
+  td.settings .actions {
+    background-image: url(../../../../assets/svg/settings_icon.svg);
+    width: 16px;
+    height: 16px;
+    display: inline-block;
+    text-align: center;
+    cursor: pointer;
+    &.disabled {
+      opacity: 0.4;
+      cursor: not-allowed;
+      pointer-events: none;
+    }
+  }
+
+  td {
+    &.info.mat-footer-cell{
+      text-align: center;
+      padding: 40px;
+    }
+    .settings {
+      position: relative;
+      vertical-align: middle !important;
+      text-align: right;
+
+      .actions {
+        background-image: url(../../../../assets/svg/settings_icon.svg);
+        width: 16px;
+        height: 16px;
+        display: inline-block;
+        text-align: center;
+        cursor: pointer;
+      }
+    }
+
+    .project-seting-item {
+      display: flex;
+      padding: 10px;
+      align-items: center;
+      border-bottom: 1px solid #edf1f5;
+      cursor: pointer;
+      color: #577289;
+
+      &:hover {
+        color: #36afd5;
+        transition: all .45s ease-in-out;
+      }
+
+      a {
+        padding-left: 5px;
+      }
+    }
+  }
+}
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-grid/odahu-grid.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-grid/odahu-grid.component.ts
new file mode 100644
index 0000000..3c781ee
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu-grid/odahu-grid.component.ts
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Component, OnInit } from '@angular/core';
+import {Subscription} from 'rxjs';
+import {OdahuDataService} from '../odahu-data.service';
+import { MatTableDataSource } from '@angular/material/table';
+
+import {ToastrService} from 'ngx-toastr';
+import {MatDialog} from '@angular/material/dialog';
+import {OdahuDeploymentService} from '../../../core/services';
+import {OdahuActionDialogComponent} from '../../../shared/modal-dialog/odahu-action-dialog';
+
+@Component({
+  selector: 'odahu-grid',
+  templateUrl: './odahu-grid.component.html',
+  styleUrls: ['./odahu-grid.component.scss']
+})
+export class OdahuGridComponent implements OnInit {
+  private odahuList: any[];
+  private subscriptions: Subscription = new Subscription();
+  public dataSource: MatTableDataSource<any>;
+  displayedColumns: string[] = [ 'odahu-name', 'project', 'endpoint-url', 'odahu-status', 'actions'];
+
+  constructor(
+    private odahuDataService: OdahuDataService,
+    private odahuDeploymentService: OdahuDeploymentService,
+    public toastr: ToastrService,
+    public dialog: MatDialog
+  ) { }
+
+  ngOnInit() {
+    this.subscriptions.add(this.odahuDataService._odahuClasters.subscribe(
+      (value) => {
+        if (value) {
+          this.odahuList = value;
+          this.dataSource = new MatTableDataSource(value);
+        }
+      }));
+  }
+
+  private odahuAction(element: any, action: string) {
+    this.dialog.open(OdahuActionDialogComponent, {data: {type: action, item: element}, panelClass: 'modal-sm'})
+      .afterClosed().subscribe(result => {
+        result && this.odahuDeploymentService.odahuAction(element,  action).subscribe(v =>
+          this.odahuDataService.updateClasters(),
+          error => this.toastr.error(`Odahu cluster ${action} failed!`, 'Oops!')
+        ) ;
+      }, error => this.toastr.error(error.message || `Odahu cluster ${action} failed!`, 'Oops!')
+    );
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu.component.html
new file mode 100644
index 0000000..a59a5d5
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu.component.html
@@ -0,0 +1,42 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+
+<div class="base-retreat">
+  <div class="sub-nav">
+    <div>
+      <button mat-raised-button class="butt butt-create" (click)="createOdahuCluster()">
+        <i class="material-icons">add</i>Create new
+      </button>
+    </div>
+    <div>
+      <button mat-raised-button class="butt" (click)="refreshGrid()">
+        <i class="material-icons">autorenew</i>Refresh
+      </button>
+    </div>
+  </div>
+
+  <mat-divider></mat-divider>
+
+  <div>
+    <odahu-grid>
+    </odahu-grid>
+  </div>
+</div>
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu.component.scss
new file mode 100644
index 0000000..3d56d22
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu.component.scss
@@ -0,0 +1,18 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu.component.ts
new file mode 100644
index 0000000..67270a4
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/odahu/odahu.component.ts
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Component, OnInit } from '@angular/core';
+import {OdahuDataService} from './odahu-data.service';
+import {Subscription} from 'rxjs';
+import {MatDialog} from '@angular/material/dialog';
+import {ToastrService} from 'ngx-toastr';
+import {CreateOdahuClusterComponent} from './create-odahu-claster';
+import {HealthStatusService, OdahuDeploymentService} from '../../core/services';
+
+export interface OdahuCluster {
+  name: string;
+  project: string;
+  endpoint: string;
+}
+
+@Component({
+  selector: 'datalab-odahu',
+  templateUrl: './odahu.component.html',
+  styleUrls: ['./odahu.component.scss']
+})
+export class OdahuComponent implements OnInit {
+
+  private odahuList: any[];
+  private subscriptions: Subscription = new Subscription();
+  private healthStatus;
+
+  constructor(
+    private odahuDataService: OdahuDataService,
+    private dialog: MatDialog,
+    public toastr: ToastrService,
+    public odahuDeploymentService: OdahuDeploymentService,
+    private healthStatusService: HealthStatusService,
+  ) { }
+
+  ngOnInit() {
+    this.getEnvironmentHealthStatus();
+    this.subscriptions.add(this.odahuDataService._odahuClasters.subscribe(
+      (value) => {
+        if (value) this.odahuList = value;
+      }));
+    this.refreshGrid();
+  }
+
+  public createOdahuCluster(): void {
+    this.dialog.open(CreateOdahuClusterComponent, {  data: this.odahuList, panelClass: 'modal-lg' })
+      .afterClosed().subscribe((result) => {
+      result && this.getEnvironmentHealthStatus();
+      this.refreshGrid();
+      });
+  }
+
+  private getEnvironmentHealthStatus(): void {
+    this.healthStatusService.getEnvironmentHealthStatus()
+      .subscribe((result: any) => this.healthStatus = result);
+  }
+
+  public refreshGrid(): void {
+    this.odahuDataService.updateClasters();
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/index.ts b/services/self-service/src/main/resources/webapp/src/app/administration/project/index.ts
index 609ea59..8e57f0f 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/index.ts
@@ -31,17 +31,19 @@
 import { ProjectComponent, EditProjectComponent } from './project.component';
 import { ProjectDataService } from './project-data.service';
 import {BubbleModule} from "../../shared/bubble";
+import {InformMessageModule} from '../../shared/inform-message';
 
 @NgModule({
-  imports: [
-    CommonModule,
-    FormsModule,
-    ReactiveFormsModule,
-    MaterialModule,
-    FormControlsModule,
-    UnderscorelessPipeModule,
-    BubbleModule
-  ],
+    imports: [
+        CommonModule,
+        FormsModule,
+        ReactiveFormsModule,
+        MaterialModule,
+        FormControlsModule,
+        UnderscorelessPipeModule,
+        BubbleModule,
+        InformMessageModule
+    ],
   declarations: [ProjectComponent, EditProjectComponent, ProjectFormComponent, ProjectListComponent],
   entryComponents: [EditProjectComponent],
   providers: [ProjectDataService],
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-data.service.ts b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-data.service.ts
index 014c89b..a461686 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-data.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-data.service.ts
@@ -47,11 +47,16 @@
             if (response && this.endpointsList.length) {
               response.forEach(project => project.endpoints.forEach(endpoint => {
                 const filtredEndpoints =  this.endpointsList.filter(v => v.name === endpoint.name);
-                if (filtredEndpoints.length) {
-                  endpoint.endpointStatus = this.endpointsList.filter(v => v.name === endpoint.name)[0].status;
-                } else {
-                  endpoint.endpointStatus = 'N/A';
+                const idx = this.endpointsList.findIndex(v => v.name === endpoint.name);
+                // console.log('IDX ', idx);
+                // if (filtredEndpoints.length) {
+                if (idx >= 0) {
+                  endpoint.endpointStatus = this.endpointsList[idx].status;
                 }
+
+                // } else {
+                //   endpoint.endpointStatus = 'N/A';
+                // }
               }));
             }
           return of(response);
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html
index 8c18309..463c344 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.html
@@ -52,7 +52,7 @@
           <div class="text-center m-bott-10">
             <button mat-raised-button type="button" class="butt" [disabled]="item" (click)="reset()">Clear</button>
             <button mat-raised-button type="button" class="butt next" matStepperNext>Next
-              <i class="material-icons">keyboard_arrow_right</i></button>
+              <i class="material-icons arrow-icon">keyboard_arrow_right</i></button>
           </div>
         </div>
       </section>
@@ -74,10 +74,10 @@
                   && !projectForm?.controls.name.hasError('duplication')
                   && !projectForm?.controls.name.hasError('limit')
                   && projectForm?.controls.name.dirty">
-                  Project name can only contain letters and numbers
+                  Project name can only contain letters and numbers.
                 </span>
                 <span class="error" *ngIf="projectForm?.controls.name.hasError('limit')">
-                  Project name cannot be longer than {{ maxProjectNameLength }} characters
+                  Project name cannot be longer than {{ maxProjectNameLength }} characters.
                 </span>
               </div>
             </div>
@@ -92,8 +92,12 @@
               <label class="label">Endpoints</label>
               <div class="control selector-wrapper">
                 <mat-form-field>
-                  <mat-select multiple formControlName="endpoints" placeholder="Select endpoints"
-                    panelClass="crete-project-dialog">
+                  <mat-select 
+                    multiple
+                    disableOptionCentering 
+                    formControlName="endpoints" 
+                    placeholder="Select endpoints"
+                    panelClass="crete-project-dialog scrolling">
                     <mat-option class="multiple-select" disabled>
                       <a class="select ani" (click)="selectOptions(endpointsList, 'endpoints', 'all')">
                         <i class="material-icons">playlist_add_check</i>&nbsp;All
@@ -104,8 +108,8 @@
                       </a>
                     </mat-option>
                     <mat-option *ngFor="let endpoint of endpointsList" [value]="endpoint.name"
-                      [disabled]="isDisabled(endpoint.name)">
-                      {{ endpoint.name }}
+                      [disabled]="isDisabled(endpoint.name) || endpoint.status !== 'ACTIVE'">
+                      {{ endpoint.name === 'local' ? endpoint.name : endpoint.name + (endpoint.status !== 'ACTIVE' ? ' (inactive)' : '')}}
                     </mat-option>
                     <mat-option *ngIf="!endpointsList.length" class="multiple-select empty ml-10" disabled>
                       Endpoints list is empty</mat-option>
@@ -121,9 +125,9 @@
           <div class="text-center m-bott-10">
             <button mat-raised-button type="button" class="butt" [disabled]="item" (click)="reset()">Clear</button>
             <button mat-raised-button matStepperPrevious class="butt"><i
-                class="material-icons">keyboard_arrow_left</i>Back</button>
+                class="material-icons arrow-icon">keyboard_arrow_left</i>Back</button>
             <button mat-raised-button type="button" class="butt next" matStepperNext>Next<i
-                class="material-icons">keyboard_arrow_right</i></button>
+                class="material-icons arrow-icon">keyboard_arrow_right</i></button>
           </div>
         </div>
 
@@ -137,8 +141,12 @@
             <label class="label">Groups</label>
             <div class="control selector-wrapper">
               <mat-form-field>
-                <mat-select multiple formControlName="groups" placeholder="Select user groups"
-                  panelClass="crete-project-dialog">
+                <mat-select 
+                  multiple
+                  disableOptionCentering 
+                  formControlName="groups" 
+                  placeholder="Select user groups"
+                  panelClass="crete-project-dialog scrolling">
                   <mat-option class="multiple-select" disabled>
                     <a class="select ani" (click)="selectOptions(groupsList, 'groups', 'all')">
                       <i class="material-icons">playlist_add_check</i>&nbsp;All
@@ -160,14 +168,14 @@
             </div>
           </div>
           <div class="text-center m-bott-10">
-            <div class="control-group">
-              <mat-slide-toggle formControlName="shared_image_enabled" labelPosition="after">
-                <span class="hold-label">Use shared image</span>
-              </mat-slide-toggle>
-            </div>
+<!--            <div class="control-group">-->
+<!--              <mat-slide-toggle formControlName="shared_image_enabled" labelPosition="after">-->
+<!--                <span class="hold-label">Use shared image</span>-->
+<!--              </mat-slide-toggle>-->
+<!--            </div>-->
             <button mat-raised-button type="button" class="butt" [disabled]="item" (click)="reset()">Clear</button>
             <button mat-raised-button matStepperPrevious class="butt"><i
-                class="material-icons">keyboard_arrow_left</i>Back</button>
+                class="material-icons arrow-icon">keyboard_arrow_left</i>Back</button>
             <button mat-raised-button type="button" class="butt butt-success" [disabled]="!projectForm.valid"
               (click)="confirm(projectForm.value)">
               <span *ngIf="item; else update">Update</span>
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.scss
index 47447a7..54a9244 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.scss
@@ -70,6 +70,12 @@
 }
 
 .mat-option-disabled:not(.multiple-select) {
-  background: #f1f1f1;
-  cursor: not-allowed;
+  opacity: 0.38;
+  pointer-events: none;
+}
+
+.mat-form-field {
+  .mat-select {
+    font-family: 'Open Sans', sans-serif;
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts
index 683e7d7..69c709d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-form/project-form.component.ts
@@ -28,8 +28,10 @@
 import { CheckUtils, FileUtils, PATTERNS } from '../../../core/util';
 import { Project } from '../project.component';
 import { DICTIONARY } from '../../../../dictionary/global.dictionary';
+import {ConfirmationDialogComponent} from '../../../shared/modal-dialog/confirmation-dialog';
+import {MatDialog} from '@angular/material/dialog';
 
-export interface GenerateKey { privateKey: string, publicKey: string };
+export interface GenerateKey { privateKey: string; publicKey: string; }
 
 @Component({
   selector: 'project-form',
@@ -62,7 +64,8 @@
     private rolesService: RolesGroupsService,
     private endpointService: EndpointService,
     private userAccessKeyService: UserAccessKeyService,
-    private cd: ChangeDetectorRef
+    private cd: ChangeDetectorRef,
+    public dialog: MatDialog,
   ) { }
 
   ngOnInit() {
@@ -79,12 +82,34 @@
     }
   }
 
+  private updateProject(data: any) {
+    this.projectService.updateProject(data).subscribe(() => {
+      this.toastr.success('Project updated successfully!', 'Success!');
+      this.update.emit();
+    }, error => this.toastr.error(error.message || 'Project update failed!', 'Oops!'));
+  }
+
   public confirm(data) {
     if (this.item) {
-      this.projectService.updateProject(data).subscribe(() => {
-        this.toastr.success('Project updated successfully!', 'Success!');
-        this.update.emit();
-      }, error => this.toastr.error(error.message || 'Project update failed!', 'Oops!'));
+      const deletedGroups = this.item.groups.filter((v) => !(this.projectForm.value.groups.includes(v)));
+      if (deletedGroups.length) {
+        this.dialog.open(ConfirmationDialogComponent, {
+          data: {notebook: deletedGroups, type: 5, manageAction: true}, panelClass: 'modal-md'
+        }).afterClosed().subscribe((res) => {
+            if (!res) {
+              this.projectForm.patchValue({
+                groups: this.item.groups
+              });
+              return;
+            } else {
+              this.updateProject(data);
+            }
+          }
+        );
+      } else {
+        this.updateProject(data);
+      }
+
     } else {
       this.projectService.createProject(data).subscribe(() => {
         this.toastr.success('Project creation is processing!', 'Success!');
@@ -138,16 +163,19 @@
     });
   }
 
+
   public selectOptions(list, key, select?) {
-    let filter = key === 'endpoints' ? list.map(el => el.name) : list;
+    const filter = key === 'endpoints' ? list.filter(el => el.status === 'ACTIVE').map(el => el.name) : list
     this.projectForm.controls[key].setValue(select ? filter : []);
   }
 
-
   private initFormModel(): void {
     this.projectForm = this._fb.group({
       'key': ['', Validators.required],
-      'name': ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.projectName), this.checkDuplication.bind(this), this.providerMaxLength.bind(this)])],
+      'name': ['', Validators.compose([Validators.required,
+        Validators.pattern(PATTERNS.projectName),
+        this.checkDuplication.bind(this),
+        this.providerMaxLength.bind(this)])],
       'endpoints': [[], Validators.required],
       'tag': ['', Validators.compose([Validators.required, Validators.pattern(PATTERNS.projectName)])],
       'groups': [[], Validators.required],
@@ -185,7 +213,9 @@
 
   private getGroupsData() {
     this.rolesService.getGroupsData().subscribe(
-      (list: any) => this.groupsList = list.map(el => el.group),
+      (list: any) => {
+        this.groupsList = list.map(el => el.group);
+      },
       error => this.toastr.error(error.message, 'Oops!'));
   }
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.html
index d8f697f..e407d30 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.html
@@ -16,19 +16,27 @@
   ~ specific language governing permissions and limitations
   ~ under the License.
   -->
-
-<table mat-table [dataSource]="dataSource" class="projects-table mat-elevation-z6 selection">
+<div class="table-wrapper scrolling">
+  <table mat-table [dataSource]="dataSource" class="projects-table mat-elevation-z6 selection">
   <ng-container matColumnDef="name">
     <th mat-header-cell *matHeaderCellDef class="name"> Project name </th>
-    <td mat-cell *matCellDef="let element" class="name"> {{element.name}} </td>
+    <td mat-cell *matCellDef="let element" class="name project-name"> {{element.name}} </td>
   </ng-container>
 
   <ng-container matColumnDef="groups">
     <th mat-header-cell *matHeaderCellDef class="groups"> Group </th>
     <td mat-cell *matCellDef="let element" class="groups">
-      <mat-chip-list>
-        <mat-chip *ngFor="let group of element.groups">{{ group }}</mat-chip>
-      </mat-chip-list>
+      <div class="mat-chip-list-wrap scrolling">
+        <mat-chip-list>
+          <mat-chip *ngFor="let group of element.groups"
+                    [matTooltip]="group"
+                    matTooltipPosition="above"
+                    class="ellipsis"
+          >
+            {{ group }}
+          </mat-chip>
+        </mat-chip-list>
+      </div>
     </td>
   </ng-container>
 
@@ -36,7 +44,7 @@
     <th mat-header-cell *matHeaderCellDef class="endpoints">
       <span class="label-endpoint"> Endpoint </span>
       <span class="label-endpoint-status"> Endpoint status </span>
-      <span class="label-status"> Edge node status </span>
+      <span class="label-status">Edge node status </span>
     </th>
     <td mat-cell *matCellDef="let element" class="source endpoints">
       <div *ngIf="!element.endpoints?.length; else list">
@@ -51,12 +59,12 @@
           </div>
           <div class="resource-status">
             <span [ngClass]="{'active' : endpoint.endpointStatus === 'ACTIVE', 'failed': endpoint.endpointStatus === 'INACTIVE'}">
-              {{ endpoint.endpointStatus | titlecase }}
+              {{ (endpoint.endpointStatus | titlecase) || 'N/A'}}
             </span>
           </div>
 
           <span class="status resource-status"
-            ngClass="{{endpoint.status.toLowerCase() || ''}}">{{ endpoint.status.toLowerCase() }}</span>
+            [ngClass]="endpoint?.status.toLowerCase() || ''">{{ endpoint?.status.toLowerCase() }}</span>
         </div>
       </ng-template>
     </td>
@@ -69,27 +77,33 @@
     <td mat-cell *matCellDef="let element" class="settings">
       <span #settings (click)="actions.toggle($event, settings)" class="actions"></span>
       <bubble-up #actions class="list-menu" position="bottom-left" alternative="top-left">
-        <ul class="list-unstyled">
+        <ul class="list-unstyled actions-list">
           <div class="active-items"></div>
-          <li class="project-seting-item" *ngIf="areStoppedEndpoints(element)" (click)="openEdgeDialog('start', element)">
+          <li class="project-seting-item" *ngIf="element.areStoppedNode" (click)="openEdgeDialog('start', element)">
             <i class="material-icons">play_circle_outline</i>
             <a class="action">
               Start edge node
             </a>
           </li>
-          <li class="project-seting-item" *ngIf="areStartedEndpoints(element)" (click)="openEdgeDialog('stop', element )">
+          <li class="project-seting-item" *ngIf="element.areRunningNode" (click)="openEdgeDialog('stop', element )">
             <i class="material-icons">pause_circle_outline</i>
             <a class="action" >
               Stop edge node
             </a>
           </li>
-          <li class="project-seting-item " *ngIf="areStoppedEndpoints(element) || areStartedEndpoints(element)" (click)="openEdgeDialog('terminate', element)">
+          <!-- <li class="project-seting-item " *ngIf="element.areTerminatedNode" (click)="openEdgeDialog('recreate', element)">
+            <i class="material-icons">refresh</i>
+            <a class="action">
+              Recreate edge node
+            </a>
+          </li> -->
+          <li class="project-seting-item " *ngIf="element.areStoppedNode || element.areRunningNode" (click)="openEdgeDialog('terminate', element)">
             <i class="material-icons">phonelink_off</i>
             <a class="action">
               Terminate edge node
             </a>
           </li>
-          <li class="project-seting-item" (click)="editProject(element)">
+          <li class="project-seting-item" (click)="editProject(element)" *ngIf="!isProjectAdmin">
             <i class="material-icons">mode_edit</i>
             <a >
               Edit project
@@ -107,3 +121,4 @@
   <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
   <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
 </table>
+</div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.scss
index efe9ba3..140feb4 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.scss
@@ -17,16 +17,41 @@
  * under the License.
  */
 
+
+.table-wrapper{
+  height: calc(100vh - 120px);
+  overflow: auto;
+  position: relative;
+  margin:  0 -15px -15px -15px;
+  padding: 0 15px 15px 15px;
+  .mat-header-cell {
+    position: sticky;
+    top: 0;
+    z-index: 999;
+    background: white;
+  }
+}
 table {
   width: 100%;
 
   td {
-    vertical-align: top;
+    vertical-align: middle;
   }
 
   .name {
     width: 25%;
-    padding: 10px 0 10px 24px;
+    padding: 20px 0 10px 24px;
+    &.project-name{
+      padding-top: 10px;
+    }
+  }
+
+  th.name{
+    padding-top: 10px;
+  }
+
+  .mat-header-row{
+    padding-top: 12px;
   }
 
   .endpoints {
@@ -34,11 +59,7 @@
     padding: 15px 0;
 
     .resource-wrap {
-      .resource-name {
-        width: 30%;
-        padding-left: 0;
-      }
-      resource-name, resource-status{
+      .resource-name, .resource-status {
         width: 30%;
         padding-left: 0;
       }
@@ -81,7 +102,6 @@
 
     &.mat-header-cell{
       padding-top: 19px;
-      padding-right: 13px;
       color: rgba(0,0,0,.54);
     }
 
@@ -106,6 +126,7 @@
   vertical-align: middle !important;
   text-align: right;
   .actions {
+    margin-top: 3px;
     background-image: url(../../../../assets/svg/settings_icon.svg);
     width: 16px;
     height: 16px;
@@ -121,6 +142,9 @@
   border-bottom: 1px solid #edf1f5;
   cursor: pointer;
   color: #577289;
+  &:last-child{
+    border-bottom: none;
+  }
   &:hover{
     color: #36afd5;
     transition: all .45s ease-in-out;
@@ -135,13 +159,23 @@
 }
 
 .list-menu{
-  min-width: 190px;
+  min-width: 205px;
 }
 
 .project-endpoint-name{
    color: #577289;
 }
 
+.actions-list{
+  padding: 10px 15px;
+}
+
+.mat-chip {
+  max-width: 200px !important;
+  white-space: nowrap;
+  display: inline-block;
+}
+
 
 
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.ts
index 9238b7f..6ee2f2a 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project-list/project-list.component.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import {Component, OnInit, Output, EventEmitter, OnDestroy, Inject} from '@angular/core';
+import {Component, OnInit, Output, EventEmitter, OnDestroy, Inject, Input} from '@angular/core';
 import { ToastrService } from 'ngx-toastr';
 import { MatTableDataSource } from '@angular/material/table';
 import { Subscription } from 'rxjs';
@@ -42,6 +42,7 @@
   dataSource: Project[] | any = [];
   projectList: Project[];
 
+  @Input() isProjectAdmin: boolean;
   @Output() editItem: EventEmitter<{}> = new EventEmitter();
   @Output() toggleStatus: EventEmitter<{}> = new EventEmitter();
   private subscriptions: Subscription = new Subscription();
@@ -66,9 +67,16 @@
   }
 
   private getProjectList() {
-    setTimeout(() => {this.progressBarService.startProgressBar(); } , 0);
+    this.progressBarService.startProgressBar();
     this.subscriptions.add(this.projectDataService._projects.subscribe((value: Project[]) => {
       this.projectList = value;
+      if (this.projectList) {
+        this.projectList.forEach(project => {
+          project.areRunningNode = this.areResoursesInStatuses(project.endpoints, ['RUNNING']);
+          project.areStoppedNode = this.areResoursesInStatuses(project.endpoints, ['STOPPED']);
+          project.areTerminatedNode = this.areResoursesInStatuses(project.endpoints, ['TERMINATED', 'FAILED']);
+        });
+      }
       if (value) this.dataSource = new MatTableDataSource(value);
       this.progressBarService.stopProgressBar();
     }, () => this.progressBarService.stopProgressBar()));
@@ -83,28 +91,10 @@
     this.dataSource = new MatTableDataSource(filteredList);
   }
 
-  public toggleEndpointAction(project, action, endpoint) {
-    this.toggleStatus.emit({project, endpoint, action});
-  }
-
   public editProject(item: Project[]) {
     this.editItem.emit(item);
   }
 
-  public isInProgress(project) {
-    if (project)
-      return project.endpoints.some(e => e.status !== 'RUNNING' && e.status !== 'STOPPED' && e.status !== 'TERMINATED' && e.status !== 'FAILED');
-  }
-
-  public isActiveEndpoint(project) {
-    if (project)
-      return project.endpoints.some(e => e.status !== 'TERMINATED' && e.status !== 'FAILED');
-  }
-
-  public toEndpointStatus(status) {
-    return CheckUtils.endpointStatus[status] || status;
-  }
-
   public openEdgeDialog(action, project) {
       const endpoints = project.endpoints.filter(endpoint => {
         if (action === 'stop') {
@@ -116,21 +106,24 @@
         if (action === 'terminate') {
           return endpoint.status === 'RUNNING' || endpoint.status === 'STOPPED';
         }
-      });
-      this.dialog.open(EdgeActionDialogComponent, {data: {type: action, item: endpoints}, panelClass: 'modal-sm'})
-        .afterClosed().subscribe(endpoint => {
-        if (endpoint && endpoint.length) {
-        this.toggleStatus.emit({project, endpoint, action});
+        if (action === 'recreate') {
+          return endpoint.status === 'TERMINATED' || endpoint.status === 'FAILED';
         }
-      }, error => this.toastr.error(error.message || `Endpoint ${action} failed!`, 'Oops!')
-      );
+      });
+      if (action === 'terminate' && endpoints.length === 1) {
+        this.toggleStatus.emit({project, endpoint: endpoints, action, oneEdge: true});
+      } else {
+        this.dialog.open(EdgeActionDialogComponent, {data: {type: action, item: endpoints}, panelClass: 'modal-sm'})
+          .afterClosed().subscribe(endpoint => {
+            if (endpoint && endpoint.length) {
+              this.toggleStatus.emit({project, endpoint, action});
+            }
+          }, error => this.toastr.error(error.message || `Endpoint ${action} failed!`, 'Oops!')
+        );
+      }
     }
 
-  public areStartedEndpoints(project) {
-    return project.endpoints.filter(endpoint => endpoint.status === 'RUNNING').length > 0;
-  }
-
-  public areStoppedEndpoints(project) {
-    return project.endpoints.filter(endpoint => endpoint.status === 'STOPPED').length > 0;
+  public areResoursesInStatuses(resources, statuses: Array<string>) {
+    return resources.some(resource => statuses.some(status => resource.status === status));
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.html
index 3be7a10..76f0be1 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.html
@@ -39,19 +39,21 @@
         </span>
       </button>
       <button mat-raised-button class="butt" (click)="refreshGrid()" [hidden]="!projectList.length">
-        <i class="material-icons">autorenew</i>Refresh
+        <i class="material-icons refresh-icon">autorenew</i>Refresh
       </button>
     </div>
   </div>
 
   <mat-divider></mat-divider>
 
-  <mat-card class="project-form" *ngIf="!projectList.length">
+  <mat-card class="project-form" *ngIf="!projectList.length && healthStatus?.admin">
     <project-form></project-form>
   </mat-card>
 
   <div [hidden]="!projectList.length">
-    <project-list (editItem)="editProject($event)" (toggleStatus)="toggleStatus($event)">
+    <project-list (editItem)="editProject($event)" (toggleStatus)="toggleStatus($event)" [isProjectAdmin]="!healthStatus?.admin && healthStatus?.projectAdmin">
     </project-list>
   </div>
+
+  <inform-message [message]="noPermissionMessage" *ngIf="!healthStatus?.admin && healthStatus?.projectAdmin && !projectList.length"></inform-message>
 </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.ts
index d1b172e..2e28831 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/project/project.component.ts
@@ -26,7 +26,7 @@
 import {HealthStatusService, ProjectService, UserResourceService} from '../../core/services';
 import { NotificationDialogComponent } from '../../shared/modal-dialog/notification-dialog';
 import { ProjectListComponent } from './project-list/project-list.component';
-import {ExploratoryModel} from '../../resources/resources-grid/resources-grid.model';
+import { EnvironmentsDataService } from '../management/management-data.service';
 
 export interface Endpoint {
   name: string;
@@ -40,10 +40,13 @@
   tag: string;
   groups: string[];
   shared_image_enabled?: boolean;
+  areStoppedNode?: boolean;
+  areTerminatedNode?: boolean;
+  areRunningNode?: boolean;
 }
 
 @Component({
-  selector: 'dlab-project',
+  selector: 'datalab-project',
   templateUrl: './project.component.html'
 })
 
@@ -52,10 +55,11 @@
   healthStatus: any;
   activeFiltering: boolean = false;
   resources: any = [];
+  noPermissionMessage: string = 'You are not assigned to any project.';
 
   private subscriptions: Subscription = new Subscription();
 
-  @ViewChild(ProjectListComponent, { static: false }) list: ProjectListComponent;
+  @ViewChild(ProjectListComponent) list: ProjectListComponent;
 
   constructor(
     public dialog: MatDialog,
@@ -63,7 +67,7 @@
     private projectService: ProjectService,
     private projectDataService: ProjectDataService,
     private healthStatusService: HealthStatusService,
-    private userResourceService: UserResourceService
+    private environmentsDataService: EnvironmentsDataService
   ) { }
 
   ngOnInit() {
@@ -81,10 +85,9 @@
   }
 
   private getResources() {
-    this.userResourceService.getUserProvisionedResources()
-      .subscribe((result: any) => {
-        this.resources = ExploratoryModel.loadEnvironments(result);
-      });
+    this.environmentsDataService.getEnvironmentDataDirect().subscribe((data: any) => {
+      this.resources = data;
+    });
   }
 
   refreshGrid() {
@@ -116,25 +119,32 @@
 
   public toggleStatus($event) {
     const data = { 'project_name': $event.project.name, endpoint: $event.endpoint.map(endpoint => endpoint.name)};
-      this.toggleStatusRequest(data, $event.action);
+    this.toggleStatusRequest(data, $event.action, $event.oneEdge);
   }
 
-  private toggleStatusRequest(data, action) {
+  private toggleStatusRequest(data, action, isOnlyOneEdge?) {
     if ( action === 'terminate') {
-      const projectsResources = this.resources.filter(resource => resource.project === data.project_name );
-      const activeProjectsResources = projectsResources.length ? projectsResources[0].exploratory
-        .filter(expl => expl.status !== 'terminated' && expl.status !== 'terminating' && expl.status !== 'failed') : [];
-      let termResources = [];
-      data.endpoint.forEach(v => {
-        termResources = [...termResources, ...activeProjectsResources.filter(resource => resource.endpoint === v)];
-      });
+      const projectsResources = this.resources
+        .filter(resource => resource.project === data.project_name && resource.resource_type !== "edge node");
 
-      this.dialog.open(NotificationDialogComponent, { data: {
-        type: 'terminateNode', item: {action: data, resources: termResources.map(resource => resource.name)}
-        }, panelClass: 'modal-sm' })
-        .afterClosed().subscribe(result => {
-        result && this.edgeNodeAction(data, action);
-      });
+      const activeProjectsResources = projectsResources?.length ? projectsResources
+        .filter(expl => expl.status !== 'terminated' && expl.status !== 'terminating' && expl.status !== 'failed') : [];
+        
+      const termResources = data.endpoint.reduce((res, endp) => {
+        res.push(...activeProjectsResources.filter(resource => resource.endpoint === endp));
+        return res;
+      }, []).map(resource => resource.resource_name);
+
+      if (termResources.length === 0 && !isOnlyOneEdge) {
+        this.edgeNodeAction(data, action);
+      } else {
+        this.dialog.open(NotificationDialogComponent, { data: {
+            type: 'terminateNode', item: {action: data, resources: termResources}
+          }, panelClass: 'modal-sm' })
+          .afterClosed().subscribe(result => {
+          result && this.edgeNodeAction(data, action);
+        });
+      }
     } else {
       this.edgeNodeAction(data, action);
     }
@@ -144,7 +154,9 @@
     this.projectService.toggleProjectStatus(data, action).subscribe(() => {
       this.refreshGrid();
       this.toastr.success(`Edge node ${this.toEndpointAction(action)} is in progress!`, 'Processing!');
-    }, error => this.toastr.error(error.message, 'Oops!'));
+    }, error => {
+      this.toastr.error(error.message, 'Oops!');
+    });
   }
 
   private getEnvironmentHealthStatus() {
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/roles/index.ts b/services/self-service/src/main/resources/webapp/src/app/administration/roles/index.ts
index d0c57cc..28c16e2 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/roles/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/roles/index.ts
@@ -25,17 +25,19 @@
 import { FormControlsModule } from '../../shared/form-controls';
 import { RolesComponent, ConfirmDeleteUserAccountDialogComponent } from './roles.component';
 import { GroupNameValidationDirective } from './group-name-validarion.directive';
+import {InformMessageModule} from '../../shared/inform-message';
 
 @NgModule({
-  imports: [
-    CommonModule,
-    FormsModule,
-    ReactiveFormsModule,
-    MaterialModule,
-    FormControlsModule
-  ],
+    imports: [
+        CommonModule,
+        FormsModule,
+        ReactiveFormsModule,
+        MaterialModule,
+        FormControlsModule,
+        InformMessageModule
+    ],
   declarations: [RolesComponent, ConfirmDeleteUserAccountDialogComponent, GroupNameValidationDirective],
   entryComponents: [ConfirmDeleteUserAccountDialogComponent],
   exports: [RolesComponent]
 })
-export class RolesModule { }
\ No newline at end of file
+export class RolesModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.html b/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.html
index 5c73329..400048c 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.html
@@ -39,14 +39,20 @@
           <input [validator]="groupValidation()" type="text" placeholder="Enter group name" [(ngModel)]="setupGroup"
             #setupGroupName="ngModel">
           <div class="error" *ngIf="setupGroupName.errors?.patterns && setupGroupName.dirty">Group name can only
-            contain letters, numbers, hyphens and '_'</div>
+            contain letters, numbers, hyphens and '_'.</div>
           <div class="error" *ngIf="setupGroupName.errors?.duplicate && setupGroupName.dirty">Group name already
-            exists</div>
+            exists.</div>
+          <div class="error" *ngIf="setupGroupName.errors?.long">Group name cannot be longer than {{maxGroupLength}} characters.</div>
         </div>
         <div class="text-center m-bott-10">
           <button mat-raised-button (click)="resetDialog()" class="butt">Cancel</button>
-          <button mat-raised-button matStepperNext class="butt">Next<i
-              class="material-icons">keyboard_arrow_right</i></button>
+          <button mat-raised-button
+                  matStepperNext class="butt"
+                  [disabled]="!setupGroup || setupGroupName.errors?.long || setupGroupName.errors?.duplicate || setupGroupName.errors?.patterns"
+          >
+            Next
+            <i class="material-icons arrow-icon">keyboard_arrow_right</i>
+          </button>
         </div>
       </mat-step>
 
@@ -57,10 +63,10 @@
         </div>
         <div class="text-center m-bott-10">
           <button mat-raised-button matStepperPrevious class="butt"><i
-              class="material-icons">keyboard_arrow_left</i>Back</button>
+              class="material-icons arrow-icon">keyboard_arrow_left</i>Back</button>
           <button mat-raised-button (click)="resetDialog()" class="butt">Cancel</button>
           <button mat-raised-button matStepperNext class="butt">Next<i
-              class="material-icons">keyboard_arrow_right</i></button>
+              class="material-icons arrow-icon">keyboard_arrow_right</i></button>
         </div>
       </mat-step>
 
@@ -80,7 +86,7 @@
         </div>
         <div class="text-center m-bott-10">
           <button mat-raised-button matStepperPrevious class="butt"><i
-              class="material-icons">keyboard_arrow_left</i>Back</button>
+              class="material-icons arrow-icon">keyboard_arrow_left</i>Back</button>
           <button mat-raised-button (click)="resetDialog()" class="butt">Cancel</button>
           <button mat-raised-button (click)="manageAction('create', 'group')" class="butt butt-success"
             [disabled]="!setupGroup || setupGroupName.errors?.patterns || setupGroupName.errors?.duplicate || !setupRoles.length">Create</button>
@@ -95,7 +101,17 @@
     <table mat-table [dataSource]="groupsData" class="projects-table mat-elevation-z6">
       <ng-container matColumnDef="name">
         <th mat-header-cell *matHeaderCellDef class="name"> Group name </th>
-        <td mat-cell *matCellDef="let element"> {{element.group}} </td>
+        <td mat-cell *matCellDef="let element" class="name">
+          <div class="d-flex">
+            <span
+              class="ellipsis" 
+              [matTooltip]="element.group"
+              matTooltipPosition="above"
+              [matTooltipClass]="'full-size-tooltip'">
+              {{element.group}}
+            </span>
+          </div>
+        </td>
       </ng-container>
 
       <ng-container matColumnDef="roles">
@@ -119,18 +135,26 @@
         <td mat-cell *matCellDef="let element" class="users-list ani">
           <mat-form-field class="chip-list">
             <input #user matInput placeholder="Enter user login" pattern="[@.-_0-9a-zA-Z]"
-              (keydown.enter)="addUser(user.value, element); user.value = ''">
-            <button mat-icon-button matSuffix (click)="addUser(user.value, element); user.value = ''">
-              <mat-icon>person_add</mat-icon>
+                   (keydown.enter)="addUser(user, element);" (keyup)="checkIfUserAdded(element, user.value)">
+            <button mat-icon-button matSuffix (click)="addUser(user, element); user.value = ''" [disabled]="element.isUserAdded">
+              <mat-icon matTooltip="User is already added to this group" matTooltipPosition="above" [matTooltipDisabled]="!element.isUserAdded">person_add</mat-icon>
             </button>
           </mat-form-field>
           <div class="list-selected list-container ani">
-            <mat-chip-list>
-              <mat-chip *ngFor="let user of element.users">
-                {{ user }}
-                <a class="material-icons" (click)="removeUser(element.users, user)">clear</a>
-              </mat-chip>
-            </mat-chip-list>
+            <div class="scrolling">
+              <mat-chip-list [disabled]="true">
+                <mat-chip
+                  *ngFor="let user of element.users"
+                  [matTooltip]="user"
+                  matTooltipPosition="above"
+                  matTooltipClass="mat-tooltip-for-users"
+                  class="ellipsis"
+                >
+                  {{ user }}
+                  <a class="material-icons" (click)="removeUser(element.users, user)">clear</a>
+                </mat-chip>
+              </mat-chip-list>
+            </div>
           </div>
         </td>
       </ng-container>
@@ -167,6 +191,7 @@
       <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
       <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
     </table>
-
   </div>
+
+  <inform-message [message]="noPermissionMessage" *ngIf="!healthStatus?.admin && healthStatus?.projectAdmin && !groupsData.length"></inform-message>
 </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.scss b/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.scss
index 1167084..993d387 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.scss
@@ -96,7 +96,7 @@
   display: flex;
   align-self: center;
   width: 490px;
-  height: 36px;
+  height: 32px;
   padding-left: 0;
   font-family: 'Open Sans', sans-serif;
   font-size: 15px;
@@ -274,18 +274,20 @@
   }
 }
 
+.mat-chip-list{
+  pointer-events: auto;
+}
+
 .mat-chip:not(.mat-basic-chip) {
   transition: box-shadow 280ms cubic-bezier(.4, 0, .2, 1);
-  padding: 7px 0 7px 10px;
+  padding: 7px 25px 7px 10px;
   border-radius: 24px;
   cursor: default;
   display: inline-block;
-  position: relative;
-  padding-right: 25px;
+  position: relative;  ;
   white-space: nowrap;
   max-width: 100%;
   overflow: hidden;
-  text-overflow: ellipsis;
 }
 
 mat-chip.mat-chip a {
@@ -346,10 +348,12 @@
 
   .name {
     width: 15%;
-  }
-
-  .roles {
-    width: 35%;
+    max-width: 200px;
+    padding-right: 10px;
+    overflow: hidden;
+    span{
+      cursor: default;
+    }
   }
 
   .users {
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.ts
index 2b1e26b..6729729 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.ts
@@ -17,18 +17,18 @@
  * under the License.
  */
 
-import { Component, OnInit, Output, EventEmitter, Inject } from '@angular/core';
+import {Component, OnInit, Output, EventEmitter, Inject, ViewChild} from '@angular/core';
 import { ValidatorFn, FormControl } from '@angular/forms';
 import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { ToastrService } from 'ngx-toastr';
 import {RolesGroupsService, HealthStatusService, ApplicationSecurityService, AppRoutingService} from '../../core/services';
-import { CheckUtils } from '../../core/util';
+import {CheckUtils, SortUtils} from '../../core/util';
 import { DICTIONARY } from '../../../dictionary/global.dictionary';
 import {ProgressBarService} from '../../core/services/progress-bar.service';
 import {ConfirmationDialogComponent, ConfirmationDialogType} from '../../shared/modal-dialog/confirmation-dialog';
 
 @Component({
-  selector: 'dlab-roles',
+  selector: 'datalab-roles',
   templateUrl: './roles.component.html',
   styleUrls: ['../../resources/resources-grid/resources-grid.component.scss', './roles.component.scss']
 })
@@ -51,6 +51,8 @@
   displayedColumns: string[] = ['name', 'roles', 'users', 'actions'];
   @Output() manageRolesGroupAction: EventEmitter<{}> = new EventEmitter();
   private startedGroups: Array<any>;
+  public noPermissionMessage: string = 'You have not permissions for groups which are not assigned to your projects.';
+  public maxGroupLength: number = 25;
 
   constructor(
     public toastr: ToastrService,
@@ -67,7 +69,7 @@
   }
 
   openManageRolesDialog() {
-    setTimeout(() => {this.progressBarService.startProgressBar(); } , 0);
+    this.progressBarService.startProgressBar();
     this.rolesService.getGroupsData().subscribe(groups => {
       this.rolesService.getRolesData().subscribe(
         (roles: any) => {
@@ -75,8 +77,7 @@
           this.rolesList = roles.map((role) => {
               return {role: role.description, type: role.type, cloud: role.cloud};
           });
-          this.rolesList = this.rolesList.sort((a, b) => (a.cloud > b.cloud) ? 1 : ((b.cloud > a.cloud) ? -1 : 0));
-          this.rolesList = this.rolesList.sort((a, b) => (a.type > b.type) ? 1 : ((b.type > a.type) ? -1 : 0));
+          this.rolesList = SortUtils.sortByKeys(this.rolesList, ['role', 'cloud', 'type']);
           this.updateGroupData(groups);
           this.stepperView = false;
         },
@@ -105,7 +106,7 @@
         {
           action, type, value: {
             name: this.setupGroup,
-            users: this.setupUser ? this.setupUser.split(',').map(elem => elem.trim()) : [],
+            users: this.setupUser ? this.setupUser.split(',').map(elem => elem.trim()).filter(el => !!el) : [],
             roleIds: this.extractIds(this.roles, this.setupRoles.map(v => v.role))
           }
         });
@@ -138,14 +139,11 @@
           item.selected_roles = [...currGroupSource.selected_roles];
           item.roles = [...currGroupSource.roles];
         } else {
-          const isSuperAdminGroup = this.startedGroups.filter(v => v.group === item.group)[0].roles.filter(role => role.description === 'Allow to execute administration operation').length;
-          const selectedRoles = isSuperAdminGroup ?
-            [...item.selected_roles.map(v => v.role), 'Allow to execute administration operation'] :
-            item.selected_roles.map(v => v.role);
+          const selectedRoles = item.selected_roles.map(v => v.role);
           this.manageRolesGroups({
             action, type, value: {
               name: item.group,
-              roleIds: this.extractIds(this.roles, selectedRoles),
+              roles: this.extractIds(this.roles, selectedRoles),
               users: item.users || []
             }
           });
@@ -168,13 +166,7 @@
       case 'update':
         this.rolesService.updateGroup($event.value).subscribe(() => {
           this.toastr.success(`Group data is updated successfully!`, 'Success!');
-          if (!$event.value.roleIds.includes('admin' || 'projectAdmin')) {
-            this.applicationSecurityService.isLoggedIn().subscribe(() => {
-              this.getEnvironmentHealthStatus();
-            });
-          } else {
             this.openManageRolesDialog();
-          }
         }, (re) => this.toastr.error('Failed group data updating!', 'Oops!'));
 
         break;
@@ -197,13 +189,6 @@
     }
   }
 
-  public extractIds(sourceList, target) {
-    return sourceList.reduce((acc, item) => {
-      target.includes(item.description) && acc.push(item._id);
-      return acc;
-    }, []);
-  }
-
   public updateGroupData(groups) {
     this.groupsData = groups.map(v => {
       if (!v.users) {
@@ -212,11 +197,32 @@
       return v;
     }).sort((a, b) => (a.group > b.group) ? 1 : ((b.group > a.group) ? -1 : 0));
     this.groupsData.forEach(item => {
-        item.selected_roles = item.roles.map(role => ({role: role.description, type: role.type, cloud: role.cloud}));
+      const selectedRoles = item.roles.map(role => ({role: role.description, type: role.type, cloud: role.cloud}));
+      item.selected_roles = SortUtils.sortByKeys(selectedRoles, ['role', 'type']);
     });
     this.getGroupsListCopy();
   }
 
+  public extractIds(sourceList, target) {
+    const map = new Map();
+    const mapped = sourceList.reduce((acc, item) => {
+      target.includes(item.description) && acc.set( item._id, item.description);
+      return acc;
+    }, map);
+
+    return this.mapToObj(mapped);
+  }
+
+  mapToObj(inputMap) {
+    const obj = {};
+
+    inputMap.forEach(function(value, key) {
+      obj[key] = value;
+    });
+
+    return obj;
+  }
+
   private getGroupsListCopy() {
     this.startedGroups = JSON.parse(JSON.stringify(this.groupsData));
   }
@@ -224,6 +230,10 @@
   public groupValidation(): ValidatorFn {
     const duplicateList: any = this.groupsData.map(item => item.group.toLowerCase());
     return <ValidatorFn>((control: FormControl) => {
+      if (control.value && control.value.length > this.maxGroupLength) {
+        return { long: true };
+      }
+
       if (control.value && duplicateList.includes(CheckUtils.delimitersFiltering(control.value.toLowerCase()))) {
         return { duplicate: true };
       }
@@ -235,7 +245,7 @@
     });
   }
 
-  private isGroupChanded(currGroup) {
+  public isGroupChanded(currGroup) {
     const currGroupSource = this.startedGroups.filter(cur => cur.group === currGroup.group)[0];
    if (currGroup.users.length !== currGroupSource.users.length &&
      currGroup.selected_roles.length !== currGroupSource.selected_roles.length) {
@@ -263,10 +273,15 @@
     list.splice(list.indexOf(item), 1);
   }
 
-  public addUser(value: string, item): void {
-    if (value && value.trim()) {
-      item.users instanceof Array ? item.users.push(value.trim()) : item.users = [value.trim()];
+  public addUser(user, item): void {
+    if (item.isUserAdded) {
+      if (!this.toastr.toasts.length) this.toastr.error('User is already added to this group', 'Oops!');
+      return;
     }
+    if (user.value && user.value.trim()) {
+      item.users instanceof Array ? item.users.push(user.value.trim()) : item.users = [user.value.trim()];
+    }
+    user.value = '';
   }
 
   private getEnvironmentHealthStatus() {
@@ -289,6 +304,10 @@
      this.setupRoles = $event.model;
    }
   }
+
+  public checkIfUserAdded(element: any, value: string) {
+    element.isUserAdded = element.users.map(v => v.toLowerCase()).includes(value.toLowerCase());
+  }
 }
 
 
@@ -300,7 +319,9 @@
     <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
   </div>
   <div mat-dialog-content class="content">
-    <p *ngIf="data.user">User <span class="strong">{{ data.user }}</span> will be deleted from <span class="strong">{{ data.group }}</span> group.</p>
+
+    <p *ngIf="data.user">User <span class="strong">{{ data.user }}</span> will be deleted from <span class="strong">{{ data.group }}</span> group.
+    </p>
     <p *ngIf="data.id">Group <span class="ellipsis group-name strong">{{ data.group }}</span> will be decommissioned.</p>
     <p class="m-top-20"><span class="strong">Do you want to proceed?</span></p>
   </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/app.module.ts b/services/self-service/src/main/resources/webapp/src/app/app.module.ts
index e23e14a..e6e887c 100644
--- a/services/self-service/src/main/resources/webapp/src/app/app.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/app.module.ts
@@ -17,10 +17,10 @@
  * under the License.
  */
 
-import { NgModule } from '@angular/core';
+import {NgModule} from '@angular/core';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
 import { RouterModule } from '@angular/router';
-import { LocationStrategy, HashLocationStrategy } from '@angular/common';
+import {LocationStrategy, HashLocationStrategy, APP_BASE_HREF} from '@angular/common';
 import { HttpClientModule } from '@angular/common/http';
 import { BrowserModule } from '@angular/platform-browser';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
@@ -30,17 +30,20 @@
 import { AppRoutingModule } from './app.routing.module';
 
 import { LoginModule } from './login/login.module';
-import { LayoutModule } from './layout/layout.module'
+import { LayoutModule } from './layout/layout.module';
 
 import { GuidesModule } from './help';
 import { ServicePagesModule } from './service-pages/service-pages.module';
 import { ResourcesModule } from './resources/resources.module';
-
-import { ReportingModule } from './reporting/reporting.module';
 import { AdministrationModule } from './administration/administration.module';
 import { WebterminalModule } from './webterminal';
 import { CoreModule } from './core/core.module';
 import { SwaggerAPIModule } from './swagger';
+import {ReportsModule} from './reports/reports.module';
+import {LocalizationService} from './core/services/localization.service';
+import {AceEditorModule} from 'ng2-ace-editor';
+
+LocalizationService.registerCulture(window.navigator.language);
 
 @NgModule({
   declarations: [AppComponent],
@@ -55,20 +58,28 @@
     ResourcesModule,
     GuidesModule,
     ServicePagesModule,
-    ReportingModule,
+    // ReportingModule,
+
     AdministrationModule,
+    ReportsModule,
     WebterminalModule,
     SwaggerAPIModule,
     RouterModule,
     AppRoutingModule,
     CoreModule.forRoot(),
-    ToastrModule.forRoot({ timeOut: 10000 })
+    ToastrModule.forRoot({ timeOut: 10000 }),
+    AceEditorModule
   ],
   providers: [{
     provide: LocationStrategy,
     useClass: HashLocationStrategy,
     useValue: '/'
-  }],
+  },
+
+    // { provide: LOCALE_ID,
+    //   deps: [LocalizationService],
+    //   useFactory: (localizationService) => localizationService.getLocale() }
+  ],
   bootstrap: [AppComponent]
 })
 export class AppModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/app.routing.module.ts b/services/self-service/src/main/resources/webapp/src/app/app.routing.module.ts
index f2649fb..d7990bd 100644
--- a/services/self-service/src/main/resources/webapp/src/app/app.routing.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/app.routing.module.ts
@@ -26,14 +26,17 @@
 import { AccessNotebookGuideComponent, PublicKeyGuideComponent } from './help';
 import { NotFoundComponent } from './service-pages/not-found/not-found.component';
 import { AccessDeniedComponent } from './service-pages/access-denied/access-denied.component';
-import { ReportingComponent } from './reporting/reporting.component';
 import { WebterminalComponent } from './webterminal/webterminal.component';
-import { ManagementComponent } from './administration/management/management.component';
+import { ManagementComponent } from './administration/management';
 import { ProjectComponent } from './administration/project/project.component';
 import { RolesComponent } from './administration/roles/roles.component';
-import { SwaggerComponent } from './swagger/swagger.component';
-
-import { AuthorizationGuard, CheckParamsGuard, CloudProviderGuard, AdminGuard } from './core/services';
+import { SwaggerComponent } from './swagger';
+import { AuthorizationGuard, CheckParamsGuard, CloudProviderGuard, AdminGuard, AuditGuard } from './core/services';
+import {ConfigurationComponent} from './administration/configuration/configuration.component';
+import {ProjectAdminGuard} from './core/services/projectAdmin.guard';
+import {ReportingComponent} from './reports/reporting/reporting.component';
+import {OdahuComponent} from './administration/odahu/odahu.component';
+import {AuditComponent} from './reports/audit/audit.component';
 
 const routes: Routes = [{
   path: 'login',
@@ -59,7 +62,12 @@
       path: 'projects',
       component: ProjectComponent,
       canActivate: [AuthorizationGuard, AdminGuard],
-    }, {
+    },
+     {
+    //   path: 'odahu',
+    //   component: OdahuComponent,
+    //   canActivate: [AuthorizationGuard, AdminGuard],
+    // }, {
       path: 'roles',
       component: RolesComponent,
       canActivate: [AuthorizationGuard, AdminGuard],
@@ -68,10 +76,15 @@
       component: ManagementComponent,
       canActivate: [AuthorizationGuard, AdminGuard]
     }, {
-    //   path: 'swagger',
-    //   component: SwaggerComponent,
-    //   canActivate: [AuthorizationGuard]
-    // }, {
+      path: 'configuration',
+      component: ConfigurationComponent,
+      canActivate: [AuthorizationGuard, AdminGuard, ProjectAdminGuard]
+    },
+    {
+      path: 'swagger',
+      component: SwaggerComponent,
+      canActivate: [AuthorizationGuard]
+    }, {
       path: 'help/publickeyguide',
       component: PublicKeyGuideComponent,
       canActivate: [AuthorizationGuard]
@@ -79,7 +92,12 @@
       path: 'help/accessnotebookguide',
       component: AccessNotebookGuideComponent,
       canActivate: [AuthorizationGuard]
-    }
+    },
+    {
+      path: 'audit',
+      component: AuditComponent,
+      canActivate: [AuthorizationGuard, AuditGuard],
+    },
   ]
 }, {
   path: 'terminal/:id/:endpoint',
@@ -93,4 +111,4 @@
   component: NotFoundComponent
 }];
 
-export const AppRoutingModule: ModuleWithProviders = RouterModule.forRoot(routes, { useHash: true });
+export const AppRoutingModule: ModuleWithProviders<RouterModule> = RouterModule.forRoot(routes, { useHash: true });
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/core.module.ts b/services/self-service/src/main/resources/webapp/src/app/core/core.module.ts
index f815c70..20a4512 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/core.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/core.module.ts
@@ -48,6 +48,9 @@
 import { ErrorInterceptor } from './interceptors/error.interceptor';
 
 import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import {ConfigurationService} from './services/configutration.service';
+import {AuditGuard, OdahuDeploymentService} from './services';
+import {ProjectAdminGuard} from './services/projectAdmin.guard';
 
 @NgModule({
   imports: [CommonModule],
@@ -58,13 +61,15 @@
 
 export class CoreModule {
 
-  static forRoot(): ModuleWithProviders {
+  static forRoot(): ModuleWithProviders<CoreModule> {
     return {
       ngModule: CoreModule,
       providers: [
         ApplicationSecurityService,
         AuthorizationGuard,
         AdminGuard,
+        ProjectAdminGuard,
+        AuditGuard,
         CloudProviderGuard,
         CheckParamsGuard,
         AppRoutingService,
@@ -83,6 +88,8 @@
         ProjectService,
         EndpointService,
         UserAccessKeyService,
+        ConfigurationService,
+        OdahuDeploymentService,
 
         { provide: MatDialogRef, useValue: {} },
         { provide: MAT_DIALOG_DATA, useValue: [] },
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/interceptors/error.interceptor.ts b/services/self-service/src/main/resources/webapp/src/app/core/interceptors/error.interceptor.ts
index 4ae3899..ac57d6c 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/interceptors/error.interceptor.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/interceptors/error.interceptor.ts
@@ -18,7 +18,7 @@
  */
 
 import { Injectable } from '@angular/core';
-import { BehaviorSubject } from 'rxjs';
+import {BehaviorSubject} from 'rxjs';
 import {
   HttpInterceptor,
   HttpRequest,
@@ -27,10 +27,8 @@
   HttpErrorResponse
 } from '@angular/common/http';
 
-import { Observable } from 'rxjs';
-import { _throw } from 'rxjs/observable/throw';
+import { Observable, throwError } from 'rxjs';
 import { switchMap, filter, take, catchError } from 'rxjs/operators';
-
 import { StorageService, AppRoutingService, ApplicationSecurityService } from '../services';
 import { HTTP_STATUS_CODES } from '../util';
 
@@ -47,6 +45,7 @@
   intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
     return next.handle(request).pipe(
       catchError(error => {
+        if (error.error && error.error.message && error.error.message.indexOf('query param artifact') !== -1) return throwError(error);
         if (error instanceof HttpErrorResponse) {
           switch ((<HttpErrorResponse>error).status) {
             case HTTP_STATUS_CODES.UNAUTHORIZED:
@@ -54,12 +53,12 @@
             case HTTP_STATUS_CODES.BAD_REQUEST:
               return this.handleBadRequest(error, request, next);
             default:
-              return _throw(error);
+              return throwError(error);
           }
         } else {
           this.routingService.redirectToLoginPage();
           this.jwtService.destroyTokens();
-          return _throw(error);
+          return throwError(error);
         }
       }));
   }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/interceptors/http.token.interceptor.ts b/services/self-service/src/main/resources/webapp/src/app/core/interceptors/http.token.interceptor.ts
index ce476b4..5b6309a 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/interceptors/http.token.interceptor.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/interceptors/http.token.interceptor.ts
@@ -18,7 +18,7 @@
  */
 
 import { Injectable } from '@angular/core';
-import { StorageService } from '../services/storage.service';
+import { StorageService } from '../services';
 import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
 
 import { Observable } from 'rxjs';
@@ -33,8 +33,13 @@
     if (token)
       headersConfig['Authorization'] = `Bearer ${token}`;
 
-    if (!request.headers.has('Content-Type') && !request.headers.has('Upload'))
-      headersConfig['Content-Type'] = 'application/json; charset=UTF-8';
+    if (!request.headers.has('Content-Type')
+      && !request.headers.has('Upload')
+      && request.url.indexOf('upload') === -1
+      && request.url.indexOf('download') === -1
+      && request.url.indexOf('admin') === -1
+    )
+    headersConfig['Content-Type'] = 'application/json; charset=UTF-8';
 
     const header = request.clone({ setHeaders: headersConfig });
     return next.handle(header);
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/interceptors/nocache.interceptor.ts b/services/self-service/src/main/resources/webapp/src/app/core/interceptors/nocache.interceptor.ts
index 2060d3e..a0c6f91 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/interceptors/nocache.interceptor.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/interceptors/nocache.interceptor.ts
@@ -17,23 +17,16 @@
  * under the License.
  */
 
-import { Injectable } from '@angular/core';
-import {
-    HttpInterceptor,
-    HttpRequest,
-    HttpHandler,
-    HttpEvent
-} from '@angular/common/http';
+import {Injectable} from '@angular/core';
+import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';
 
-import { Observable } from 'rxjs';
+import {Observable} from 'rxjs';
 
 @Injectable()
 export class NoCacheInterceptor implements HttpInterceptor {
   private addNoCacheToUrl(url: string) {
     const separator = url.indexOf('?') === -1 ? '?' : '&';
-    const returnUrl = url + separator + 'noCache=' + new Date().getTime();
-
-    return returnUrl;
+    return url + separator + 'noCache=' + new Date().getTime();
   }
 
   intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-action-pipe/convert-action.pipe.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-action-pipe/convert-action.pipe.ts
new file mode 100644
index 0000000..41b7ebc
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-action-pipe/convert-action.pipe.ts
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Pipe, PipeTransform } from '@angular/core';
+
+@Pipe({ name: 'convertaction' })
+
+export class ConvertActionPipe implements PipeTransform {
+  transform(value: string, lowercase?): any {
+    if (!!lowercase) {
+      return value.toLowerCase().replace(/_/g, ' ');
+    }
+
+    return value.charAt(0) + value.slice(1).toLowerCase().replace(/_/g, ' ');
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-action-pipe/index.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-action-pipe/index.ts
new file mode 100644
index 0000000..ae12c1a
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-action-pipe/index.ts
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import {ConvertActionPipe} from './convert-action.pipe';
+
+@NgModule({
+  imports: [CommonModule],
+  declarations: [ConvertActionPipe],
+  exports: [ConvertActionPipe]
+})
+
+export class ConvertActionPipeModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/convert-file-size.pipe.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/convert-file-size.pipe.ts
new file mode 100644
index 0000000..0bd2f61
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/convert-file-size.pipe.ts
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Pipe, PipeTransform } from '@angular/core';
+
+@Pipe({ name: 'convertFileSize' })
+
+export class ConvertFileSizePipe implements PipeTransform {
+  transform(bytes: number): any {
+      const sizes = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];
+      if (bytes === 0) {
+        return '0 byte';
+      }
+      for (let i = 0; i < sizes.length; i++) {
+        if (bytes <= 1024) {
+          return bytes + ' ' + sizes[i];
+        } else {
+          bytes = parseFloat((bytes / 1024).toFixed(2));
+        }
+      }
+      return bytes;
+    }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/index.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/index.ts
new file mode 100644
index 0000000..2080443
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/convert-file-size/index.ts
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { ConvertFileSizePipe } from './convert-file-size.pipe';
+
+@NgModule({
+  imports: [CommonModule],
+  declarations: [ConvertFileSizePipe],
+  exports: [ConvertFileSizePipe]
+})
+
+export class ConvertFileSizePipeModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/highlight.pipe.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/highlight.pipe.ts
index 7bad3a9..4770cb3 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/pipes/highlight.pipe.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/highlight.pipe.ts
@@ -24,7 +24,8 @@
 @Pipe({ name: 'highlight' })
 export class HighLightPipe implements PipeTransform {
   transform(text: string, search: string): string {
-    return search ? text.replace(new RegExp(search, 'i'), `<span class="highlight">${search}</span>`) : text;
+    return search ? text.replace(new RegExp(search, 'i'), function(str) {
+      return `<span class="highlight">${str}</span>`; }) : text;
   }
 }
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/index.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/index.ts
index 0a78f17..399ce1d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/pipes/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/index.ts
@@ -22,3 +22,4 @@
 export * from './lib-sort-pipe';
 export * from './replace-breaks-pipe';
 export * from './highlight.pipe';
+export * from './convert-action-pipe';
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/keys-pipe/keys.pipe.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/keys-pipe/keys.pipe.ts
index 5fe18ad..62bfc9c 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/pipes/keys-pipe/keys.pipe.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/keys-pipe/keys.pipe.ts
@@ -22,11 +22,12 @@
 @Pipe({ name: 'keys' })
 
 export class KeysPipe implements PipeTransform {
-  transform(value, args: string[]): any {
+  transform(value): any {
     const keys = [];
     for (const key in value) {
       keys.push({ key: key, value: value[key]});
     }
+
     return keys;
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/lib-sort-pipe/lib-sort.pipe.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/lib-sort-pipe/lib-sort.pipe.ts
index 20c4b91..e8ba377 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/pipes/lib-sort-pipe/lib-sort.pipe.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/lib-sort-pipe/lib-sort.pipe.ts
@@ -24,10 +24,10 @@
 export class LibSortPipe {
   transform(array: Array<Object>): Array<Object> {
     const order = ['installing', 'installed', 'failed'];
-    array.sort((arg1:any, arg2:any) => {
-      if (arg1.status !== arg2.status) 
+    array.sort((arg1: any, arg2: any) => {
+      if (arg1.status !== arg2.status)
         return order.indexOf(arg1.status) - order.indexOf(arg2.status);
-      else 
+      else
         return arg1.name !== arg2.name ? arg1.name < arg2.name ? -1 : 1 : 0;
     });
     return array;
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/index.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/index.ts
new file mode 100644
index 0000000..43b33ca
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/index.ts
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { LocalCurrencyPipe } from './local-currency.pipe';
+
+@NgModule({
+  imports: [CommonModule],
+  declarations: [LocalCurrencyPipe],
+  exports: [LocalCurrencyPipe]
+})
+
+export class LocalCurrencyModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/local-currency.pipe.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/local-currency.pipe.ts
new file mode 100644
index 0000000..41c2988
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/local-currency.pipe.ts
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Pipe, PipeTransform } from '@angular/core';
+import {formatCurrency, getCurrencySymbol} from '@angular/common';
+import {LocalizationService} from '../../services/localization.service';
+
+@Pipe({ name: 'localcurrency' })
+
+export class LocalCurrencyPipe implements PipeTransform {
+  constructor(private localizationService: LocalizationService) { }
+  transform(
+    value: number,
+    currencyCode: string = 'USD',
+    display:
+      | 'code'
+      | 'symbol'
+      | 'symbol-narrow'
+      | string
+      | boolean = 'symbol',
+    digitsInfo: string = '',
+    locale: string = this.localizationService.locale,
+  ): string | null {
+    return formatCurrency(
+      value,
+      locale,
+      getCurrencySymbol(currencyCode, 'wide'),
+      currencyCode,
+      digitsInfo,
+    );
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/index.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/index.ts
new file mode 100644
index 0000000..2f29b6a
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/index.ts
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import {LocalDatePipe} from './local-date.pipe';
+
+@NgModule({
+  imports: [CommonModule],
+  declarations: [LocalDatePipe],
+  exports: [LocalDatePipe]
+})
+
+export class LocalDatePipeModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/local-date.pipe.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/local-date.pipe.ts
new file mode 100644
index 0000000..c55953b
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/local-date.pipe.ts
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Pipe, PipeTransform } from '@angular/core';
+import {LocalizationService} from '../../services/localization.service';
+import {formatDate} from '@angular/common';
+
+@Pipe({ name: 'localDate' })
+
+export class LocalDatePipe implements PipeTransform {
+  constructor(private localizationService: LocalizationService) { }
+
+  transform(value: any, format: string = 'shortDate') {
+    if (!value) { return ; }
+
+    return formatDate(value, format, this.localizationService.locale);
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/long-date-pipe/index.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/long-date-pipe/index.ts
new file mode 100644
index 0000000..8bd4f7f
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/long-date-pipe/index.ts
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import {LongDatePipe} from './long-date.pipe';
+
+@NgModule({
+  imports: [CommonModule],
+  declarations: [LongDatePipe],
+  exports: [LongDatePipe]
+})
+
+export class LongDatePipeModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/long-date-pipe/long-date.pipe.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/long-date-pipe/long-date.pipe.ts
new file mode 100644
index 0000000..ba64e45
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/long-date-pipe/long-date.pipe.ts
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Pipe, PipeTransform } from '@angular/core';
+import {LocalizationService} from '../../services/localization.service';
+import {formatDate} from '@angular/common';
+
+@Pipe({ name: 'longDate' })
+
+export class LongDatePipe implements PipeTransform {
+  constructor(private localizationService: LocalizationService) { }
+
+  transform(value: any, format: string = 'full') {
+    if (!value) { return ; }
+
+    return formatDate(value, format, (this.localizationService.locale  === 'en') ? 'en' : 'en-GB');
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/pipes/underscoreless-pipe/underscoreless.pipe.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/underscoreless-pipe/underscoreless.pipe.ts
index a21da90..32670b0 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/pipes/underscoreless-pipe/underscoreless.pipe.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/underscoreless-pipe/underscoreless.pipe.ts
@@ -22,7 +22,7 @@
 @Pipe({ name: 'underscoreless' })
 
 export class UnderscorelessPipe implements PipeTransform {
-  transform(value, args: string[]): any {
+  transform(value): any {
     return value.replace(/_/g, ' ');
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts
index 75d2087..ed78447 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts
@@ -22,7 +22,6 @@
 import { HttpClient } from '@angular/common/http';
 
 import { Dictionary } from '../collections';
-
 import { environment } from '../../../environments/environment';
 import { HTTPMethod } from '../util';
 
@@ -52,6 +51,7 @@
   private static readonly COMPUTATIONAL_RESOURCES = 'computational_resources';
   private static readonly COMPUTATIONAL_RESOURCES_DATAENGINE = 'computational_resources_dataengine';
   private static readonly COMPUTATIONAL_RESOURCES_DATAENGINESERVICE = 'computational_resources_dataengineservice';
+  private static readonly BUCKET = 'bucket';
   private static readonly USER_PREFERENCES = 'user_preferences';
   private static readonly BUDGET = 'budget';
   private static readonly ENVIRONMENT_HEALTH_STATUS = 'environment_health_status';
@@ -75,8 +75,12 @@
   private static readonly DOWNLOAD_REPORT = 'download_report';
   private static readonly SETTINGS = 'settings';
   private static readonly PROJECT = 'project';
+  private static readonly ODAHU = 'odahu';
   private static readonly ENDPOINT = 'endpoint';
   private static readonly ENDPOINT_CONNECTION = 'endpoint_connection';
+  private static readonly AUDIT = 'audit';
+  private static readonly CONFIG = 'config';
+  private static readonly QUOTA = 'quota';
 
   private requestRegistry: Dictionary<string>;
 
@@ -253,6 +257,40 @@
       null);
   }
 
+
+  public buildGetBucketData(data): Observable<any> {
+    return this.buildRequest(HTTPMethod.GET,
+      this.requestRegistry.Item(ApplicationServiceFacade.BUCKET),
+      data);
+  }
+
+  public buildUploadFileToBucket(data): Observable<any> {
+    return this.buildRequest(HTTPMethod.POST,
+      this.requestRegistry.Item(ApplicationServiceFacade.BUCKET) + '/upload',
+      data, { reportProgress: true, observe: 'events' });
+  }
+
+  public buildCreateFolderInBucket(data): Observable<any> {
+    return this.buildRequest(HTTPMethod.POST,
+      this.requestRegistry.Item(ApplicationServiceFacade.BUCKET) + '/folder/upload',
+      data);
+  }
+
+  public buildDownloadFileFromBucket(data) {
+    return this.buildRequest(HTTPMethod.GET,
+      this.requestRegistry.Item(ApplicationServiceFacade.BUCKET),
+      data, { dataType : 'binary',
+        processData : false,
+        responseType : 'arraybuffer', reportProgress: true, observe: 'events' } );
+  }
+
+  public buildDeleteFileFromBucket(data): Observable<any> {
+    return this.buildRequest(HTTPMethod.POST,
+      this.requestRegistry.Item(ApplicationServiceFacade.BUCKET) + '/objects/delete',
+      data );
+  }
+
+
   public buildUpdateUserPreferences(data): Observable<any> {
     return this.buildRequest(HTTPMethod.POST,
       this.requestRegistry.Item(ApplicationServiceFacade.USER_PREFERENCES),
@@ -272,6 +310,13 @@
       data);
   }
 
+  public buildGetQuotaStatus(): Observable<any> {
+    return this.buildRequest(HTTPMethod.GET,
+      this.requestRegistry.Item(ApplicationServiceFacade.QUOTA),
+        null
+    );
+  }
+
   public buildRunEdgeNodeRequest(): Observable<any> {
     return this.buildRequest(HTTPMethod.POST,
       this.requestRegistry.Item(ApplicationServiceFacade.EDGE_NODE_START),
@@ -599,6 +644,57 @@
       null);
   }
 
+  public getAuditList(data): Observable<any> {
+    return this.buildRequest(HTTPMethod.GET,
+      this.requestRegistry.Item(ApplicationServiceFacade.AUDIT),
+      data);
+  }
+
+  public postActionToAudit(data): Observable<any> {
+    return this.buildRequest(HTTPMethod.POST,
+      this.requestRegistry.Item(ApplicationServiceFacade.AUDIT),
+      data);
+  }
+
+  public createOdahuCluster(data): Observable<any> {
+    return this.buildRequest(HTTPMethod.POST,
+      this.requestRegistry.Item(ApplicationServiceFacade.ODAHU),
+      data);
+  }
+
+  public getOdahuList(): Observable<any> {
+    return this.buildRequest(HTTPMethod.GET,
+      this.requestRegistry.Item(ApplicationServiceFacade.ODAHU),
+      null);
+  }
+
+  public odahuStartStop(data, params): Observable<any> {
+    return this.buildRequest(HTTPMethod.POST,
+      this.requestRegistry.Item(ApplicationServiceFacade.ODAHU) + `/${params}`,
+      data);
+  }
+
+  public buildGetServiceConfig(data): Observable<any> {
+    return this.buildRequest(HTTPMethod.GET,
+      this.requestRegistry.Item(ApplicationServiceFacade.CONFIG),
+      data
+      );
+  }
+
+  public buildSetServiceConfig(data, body): Observable<any> {
+    return this.buildRequest(HTTPMethod.POST,
+
+      this.requestRegistry.Item(ApplicationServiceFacade.CONFIG) + '/' + data,
+      body);
+  }
+
+  public buildRestartServices(data): Observable<any> {
+    return this.buildRequest(HTTPMethod.POST,
+
+      this.requestRegistry.Item(ApplicationServiceFacade.CONFIG) + '/restart',
+      data );
+  }
+
   private setupRegistry(): void {
     this.requestRegistry = new Dictionary<string>();
 
@@ -641,6 +737,9 @@
     this.requestRegistry.Add(ApplicationServiceFacade.COMPUTATIONAL_RESOURCES_TEMLATES,
       '/api/infrastructure_templates/computational_templates');
 
+    // Bucket browser
+    this.requestRegistry.Add(ApplicationServiceFacade.BUCKET, '/api/bucket');
+
     // Filtering Configuration
     this.requestRegistry.Add(ApplicationServiceFacade.USER_PREFERENCES, '/api/user/settings');
     this.requestRegistry.Add(ApplicationServiceFacade.BUDGET, '/api/user/settings/budget');
@@ -660,7 +759,7 @@
     this.requestRegistry.Add(ApplicationServiceFacade.SETTINGS, '/api/settings');
 
     // Libraries Installation
-    this.requestRegistry.Add(ApplicationServiceFacade.LIB_GROUPS, '/api/infrastructure_provision/exploratory_environment/lib_groups');
+    this.requestRegistry.Add(ApplicationServiceFacade.LIB_GROUPS, '/api/infrastructure_provision/exploratory_environment/lib-groups');
     this.requestRegistry.Add(ApplicationServiceFacade.LIB_LIST, '/api/infrastructure_provision/exploratory_environment/search/lib_list');
     this.requestRegistry.Add(ApplicationServiceFacade.LIB_INSTALL, '/api/infrastructure_provision/exploratory_environment/lib_install');
     this.requestRegistry.Add(ApplicationServiceFacade.INSTALLED_LIBS_FORMAT,
@@ -673,16 +772,30 @@
     // billing report
     this.requestRegistry.Add(ApplicationServiceFacade.BILLING, '/api/billing/report');
     this.requestRegistry.Add(ApplicationServiceFacade.DOWNLOAD_REPORT, '/api/billing/report/download');
+    this.requestRegistry.Add(ApplicationServiceFacade.QUOTA, '/api/billing/quota');
 
     // project
     this.requestRegistry.Add(ApplicationServiceFacade.PROJECT, '/api/project');
     this.requestRegistry.Add(ApplicationServiceFacade.ENDPOINT, '/api/endpoint');
     this.requestRegistry.Add(ApplicationServiceFacade.ENDPOINT_CONNECTION, '/api/endpoint/url/');
+
+    // Odahu
+    this.requestRegistry.Add(ApplicationServiceFacade.ODAHU, '/api/odahu');
+
+    // audit
+    this.requestRegistry.Add(ApplicationServiceFacade.AUDIT, '/api/audit');
+
+    // configuration
+
+    this.requestRegistry.Add(ApplicationServiceFacade.CONFIG, '/api/config/multiple');
   }
 
   private buildRequest(method: HTTPMethod, url_path: string, body: any, opt?) {
     // added to simplify development process
     const url = environment.production ? url_path : API_URL + url_path;
+    // if (url_path.indexOf('/api/bucket') !== -1) {
+    //   url = 'https://35.233.183.55' + url_path;
+    // }
 
     if (method === HTTPMethod.POST) {
       return this.http.post(url, body, opt);
@@ -690,6 +803,9 @@
       return this.http.delete(body ? url + JSON.parse(body) : url, opt);
     } else if (method === HTTPMethod.PUT) {
       return this.http.put(url, body, opt);
-    } else return this.http.get(body ? (url + body) : url, opt);
+    } else {
+      return this.http.get(body ? (url + body) : url, opt);
+    }
   }
+
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/audit.guard.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/audit.guard.ts
new file mode 100644
index 0000000..ef61d05
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/audit.guard.ts
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Injectable } from '@angular/core';
+import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
+import { HealthStatusService } from './healthStatus.service';
+
+@Injectable()
+export class AuditGuard implements CanActivate {
+  constructor(private _healthStatus: HealthStatusService) { }
+
+  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
+    return this._healthStatus.isPassageway('audit');
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/audit.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/audit.service.ts
new file mode 100644
index 0000000..520f623
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/audit.service.ts
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Injectable } from '@angular/core';
+import {ApplicationServiceFacade} from './applicationServiceFacade.service';
+import {catchError, map} from 'rxjs/operators';
+import {ErrorUtils} from '../util';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class AuditService {
+  constructor(private applicationServiceFacade: ApplicationServiceFacade) { }
+
+  public getAuditData(filterData, page, itemsPrPage) {
+    let queryString = `?page-number=${page}&page-size=${itemsPrPage}`;
+    if (filterData.projects.length) {
+      queryString += `&projects=${filterData.projects.join(',')}`;
+    }
+    if (filterData.resources.length) {
+      queryString += `&resource-names=${filterData.resources.join(',')}`;
+    }
+    if (filterData.resource_types.length) {
+      queryString += `&resource-types=${filterData.resource_types.join(',')}`;
+    }
+    if (filterData.users.length) {
+      queryString += `&users=${filterData.users.join(',')}`;
+    }
+    if (filterData.date_start) {
+      queryString += `&date-start=${filterData.date_start}`;
+    }
+    if (filterData.date_end) {
+      queryString += `&date-end=${filterData.date_end}`;
+    }
+
+    return this.applicationServiceFacade
+      .getAuditList(queryString)
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+
+  public sendDataToAudit(data) {
+    return this.applicationServiceFacade
+      .postActionToAudit(data)
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
new file mode 100644
index 0000000..f412a00
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/bucket-browser.service.ts
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Injectable } from '@angular/core';
+import {Observable} from 'rxjs';
+import {catchError, map} from 'rxjs/operators';
+import {ErrorUtils} from '../util';
+import {ApplicationServiceFacade} from './applicationServiceFacade.service';
+
+export class TodoItemNode {
+  children: TodoItemNode[];
+  item: string;
+  id: string;
+  object: any;
+}
+
+export class TodoItemFlatNode {
+  item: string;
+  level: number;
+  expandable: boolean;
+  obj: string;
+}
+
+@Injectable({
+  providedIn: 'root'
+})
+export class BucketBrowserService {
+  constructor(private applicationServiceFacade: ApplicationServiceFacade) {
+  }
+
+  public getBucketData(bucket, endpoint): Observable<{}> {
+    const url = `/${bucket}/endpoint/${endpoint}`;
+    return this.applicationServiceFacade
+      .buildGetBucketData(url)
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+
+  public downloadFile(data) {
+    return this.applicationServiceFacade
+      .buildDownloadFileFromBucket(data)
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+
+  public uploadFile(data) {
+    return this.applicationServiceFacade
+      .buildUploadFileToBucket(data)
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+
+  public createFolder(data) {
+    return this.applicationServiceFacade
+      .buildCreateFolderInBucket(data)
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+
+  public deleteFile(data) {
+    return this.applicationServiceFacade
+      .buildDeleteFileFromBucket(data)
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/configutration.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/configutration.service.ts
new file mode 100644
index 0000000..8ab0b7f
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/configutration.service.ts
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Injectable } from '@angular/core';
+import {Observable, of} from 'rxjs';
+import { map, catchError } from 'rxjs/operators';
+import { ApplicationServiceFacade } from './applicationServiceFacade.service';
+import { ErrorUtils } from '../util';
+
+@Injectable()
+export class ConfigurationService {
+  constructor(private applicationServiceFacade: ApplicationServiceFacade) { }
+
+  public getServiceSettings(endpoint): Observable<{}> {
+    const queryString = `?endpoint=${endpoint}`;
+    return this.applicationServiceFacade
+      .buildGetServiceConfig(queryString)
+       .pipe(
+      map(response => response),
+      catchError(ErrorUtils.handleServiceError));
+    }
+
+  public setServiceConfig(service: string, config: string, endpoint: string): Observable<{}> {
+    const settings = {
+
+      ymlString: config,
+      endpointName: endpoint
+    };
+    service = ConfigurationService.convertProvisioning(service);
+
+    return this.applicationServiceFacade
+      .buildSetServiceConfig(service, settings)
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+
+
+  public restartServices(ui: boolean, provserv: boolean, billing: boolean, endpoint: string): Observable<{}> {
+    const body = {
+      billing, provserv, ui, endpoint
+    };
+    return this.applicationServiceFacade
+      .buildRestartServices(body)
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+
+  private static convertProvisioning(service: string): string {
+    return (service === 'provisioning') ? 'provisioning-service' : service;
+  }
+
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/healthStatus.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/healthStatus.service.ts
index 12086bc..204e712 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/healthStatus.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/healthStatus.service.ts
@@ -84,6 +84,14 @@
         catchError(ErrorUtils.handleServiceError));
   }
 
+  public getQuotaStatus(): Observable<{}> {
+    return this.applicationServiceFacade
+      .buildGetQuotaStatus()
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+
   public runEdgeNode(): Observable<{}> {
     return this.applicationServiceFacade
       .buildRunEdgeNodeRequest()
@@ -119,10 +127,18 @@
               this.appRoutingService.redirectToHomePage();
               return false;
             }
+            if (parameter === 'audit' && !data.auditEnabled) {
+              this.appRoutingService.redirectToHomePage();
+              return false;
+            }
             if (parameter === 'administration' && !data.admin && !data.projectAdmin) {
               this.appRoutingService.redirectToNoAccessPage();
               return false;
             }
+            if (parameter === 'project-admin' && !data.admin && data.projectAdmin) {
+              this.appRoutingService.redirectToNoAccessPage();
+              return false;
+            }
           }
           return true;
         }));
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/index.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/index.ts
index 0068a29..d847415 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/index.ts
@@ -26,6 +26,7 @@
 export * from './authorization.guard';
 export * from './admin.guard';
 export * from './cloudProvider.guard';
+export * from './audit.guard';
 export * from './checkParams.guard';
 export * from './librariesInstallation.service';
 export * from './manageUngit.service';
@@ -37,4 +38,5 @@
 export * from './dataengineConfiguration.service';
 export * from './storage.service';
 export * from './project.service';
+export * from './odahu-deployment.service';
 export * from './endpoint.service';
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/librariesInstallation.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/librariesInstallation.service.ts
index 2119b1a..abdad3a 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/librariesInstallation.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/librariesInstallation.service.ts
@@ -29,8 +29,8 @@
   constructor(private applicationServiceFacade: ApplicationServiceFacade) {}
 
   public getGroupsList(project, exploratory, computational?): Observable<Response> {
-    let body = `?project_name=${project}&exploratory_name=${exploratory}`;
-    if (computational) body += `&computational_name=${computational}`;
+    let body = `/exploratory?project=${project}&exploratory=${exploratory}`;
+    if (computational) body = '/compute';
 
     return this.applicationServiceFacade
       .buildGetGroupsList(body)
@@ -49,7 +49,6 @@
 
   public getAvailableDependencies(data): Observable<{}> {
     const body = `/maven?artifact=${data}`;
-
     return this.applicationServiceFacade
       .buildGetAvailableDependenciest(body)
       .pipe(
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/localization.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/localization.service.ts
new file mode 100644
index 0000000..401d3c6
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/localization.service.ts
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Injectable } from '@angular/core';
+import { registerLocaleData } from '@angular/common';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class LocalizationService {
+  private _locale;
+
+  constructor() {
+
+  }
+
+  get locale() {
+
+    if (!this._locale) {
+      let locale = window.navigator.language;
+      if (locale.indexOf('-') !== -1 && locale !== 'en-GB') {
+        locale = locale.substr(0, locale.indexOf('-'));
+      }
+      this._locale = locale;
+    }
+    return this._locale;
+  }
+
+  public static registerCulture(culture: string) {
+    if (culture.indexOf('-') !== -1 && culture !== 'en-GB') {
+      culture = culture.substr(0, culture.indexOf('-'));
+    }
+
+    import(
+      `@angular/common/locales/${culture}.js`
+      ).then(module => registerLocaleData(module.default));
+
+    if (culture !== 'en' && culture !== 'en-GB') {
+      import(
+        `@angular/common/locales/en-GB.js`
+        ).then(module => registerLocaleData(module.default));
+    }
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/odahu-deployment.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/odahu-deployment.service.ts
new file mode 100644
index 0000000..cb35758
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/odahu-deployment.service.ts
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs';
+import { catchError, map } from 'rxjs/operators';
+
+import { ApplicationServiceFacade } from './applicationServiceFacade.service';
+import { ErrorUtils } from '../util';
+
+@Injectable()
+
+export class OdahuDeploymentService {
+  constructor(private applicationServiceFacade: ApplicationServiceFacade) { }
+
+  public createOdahuNewCluster(data): Observable<{}> {
+    return this.applicationServiceFacade
+      .createOdahuCluster(data)
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+
+  public getOduhuClustersList(): Observable<{}> {
+    return this.applicationServiceFacade
+      .getOdahuList()
+      .pipe(
+        map(response => response),
+        catchError(ErrorUtils.handleServiceError));
+  }
+
+  public odahuAction(data, action) {
+    return this.applicationServiceFacade
+        .odahuStartStop(data, action)
+        .pipe(
+            map(response => response),
+            catchError(ErrorUtils.handleServiceError));
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/progress-bar.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/progress-bar.service.ts
index 7e0dabb..095d937 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/progress-bar.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/progress-bar.service.ts
@@ -17,14 +17,15 @@
  * under the License.
  */
 
-import { Injectable } from '@angular/core';
-import { Subject } from "rxjs";
+import {ApplicationRef, ChangeDetectorRef, Injectable} from '@angular/core';
+import {BehaviorSubject, Subject, timer} from 'rxjs';
+import {take} from 'rxjs/operators';
 
 @Injectable({
   providedIn: 'root'
 })
 export class ProgressBarService {
-  public showProgressBar = new Subject();
+  public showProgressBar = new BehaviorSubject(false);
 
   constructor() { }
 
@@ -33,6 +34,6 @@
   }
 
   public startProgressBar() {
-    this.showProgressBar.next(true);
+    timer(0).subscribe(_ => this.showProgressBar.next(true));
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/project.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/project.service.ts
index ccf93f8..e912503 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/services/project.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/project.service.ts
@@ -19,10 +19,11 @@
 
 import { Injectable } from '@angular/core';
 import { Observable } from 'rxjs';
-import { map, catchError } from 'rxjs/operators';
+import {map, catchError, tap} from 'rxjs/operators';
 
 import { ApplicationServiceFacade } from './applicationServiceFacade.service';
 import { ErrorUtils } from '../util';
+import {logger} from 'codelyzer/util/logger';
 
 @Injectable()
 export class ProjectService {
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/projectAdmin.guard.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/projectAdmin.guard.ts
new file mode 100644
index 0000000..2e49f33
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/projectAdmin.guard.ts
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Injectable } from '@angular/core';
+import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
+import { HealthStatusService } from './healthStatus.service';
+
+@Injectable()
+export class ProjectAdminGuard implements CanActivate {
+  constructor(private _healthStatus: HealthStatusService) { }
+
+  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
+    return this._healthStatus.isPassageway('project-admin');
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/util/checkUtils.ts b/services/self-service/src/main/resources/webapp/src/app/core/util/checkUtils.ts
index 4cd39c3..ab70476 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/util/checkUtils.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/util/checkUtils.ts
@@ -20,6 +20,14 @@
 import { PATTERNS } from './patterns';
 
 export class CheckUtils {
+
+  public static endpointStatus = {
+    CREATING: 'CONNECTING',
+    STARTING: 'CONNECTING',
+    RUNNING: 'CONNECTED',
+    STOPPING: 'DISCONNECTING',
+    STOPPED: 'DISCONNECTED'
+  };
   public static isJSON(str) {
     try {
       JSON.parse(str);
@@ -42,26 +50,10 @@
 
   public static numberOnly(event): boolean {
     const charCode = (event.which) ? event.which : event.keyCode;
-    if (charCode > 31 && (charCode < 48 || charCode > 57)) {
-      return false;
-    }
-    return true;
+    return !(charCode > 31 && (charCode < 48 || charCode > 57));
   }
 
   public static delimitersFiltering(resource): string {
     return resource.replace(RegExp(PATTERNS.delimitersRegex, 'g'), '').toString().toLowerCase();
   }
-
-  public static decodeUnicode(str) {
-    str = str.replace(/\\/g, "%");
-    return unescape(str);
-  }
-
-  public static endpointStatus = {
-    CREATING: 'CONNECTING',
-    STARTING: 'CONNECTING',
-    RUNNING: 'CONNECTED',
-    STOPPING: 'DISCONNECTING',
-    STOPPED: 'DISCONNECTED'
-  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/util/compareUtils.ts b/services/self-service/src/main/resources/webapp/src/app/core/util/compareUtils.ts
new file mode 100644
index 0000000..919aa26
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/util/compareUtils.ts
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export class CompareUtils {
+  public static compareFilters(currentData, previousData) {
+    return Object.keys(currentData).every(el => {
+      if (Array.isArray(previousData[el])) {
+        // console.log('arr', el, previousData[el], currentData[el]);
+        if (previousData[el].length === 0 && currentData[el].length === 0) return true;
+        if (previousData[el].length === currentData[el].length) {
+          return currentData[el].every(element => previousData[el].includes(element));
+        } else {
+          return false;
+        }
+      } else {
+        // console.log(el, previousData[el] === currentData[el]);
+        return previousData[el] === currentData[el];
+      }
+    });
+  }
+
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/util/copyPathUtils.ts b/services/self-service/src/main/resources/webapp/src/app/core/util/copyPathUtils.ts
new file mode 100644
index 0000000..86ff250
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/util/copyPathUtils.ts
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export class CopyPathUtils {
+  public static copyPath(copyValue) {
+    const selBox = document.createElement('textarea');
+    selBox.style.position = 'fixed';
+    selBox.style.left = '0';
+    selBox.style.top = '0';
+    selBox.style.opacity = '0';
+    selBox.value = copyValue;
+    document.body.appendChild(selBox);
+    selBox.focus();
+    selBox.select();
+    document.execCommand('copy');
+    document.body.removeChild(selBox);
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/util/errorUtils.ts b/services/self-service/src/main/resources/webapp/src/app/core/util/errorUtils.ts
index c3c9179..1d5154d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/util/errorUtils.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/util/errorUtils.ts
@@ -20,6 +20,7 @@
 
 import { throwError as observableThrowError } from 'rxjs';
 import { CheckUtils } from './checkUtils';
+import {logger} from 'codelyzer/util/logger';
 
 export class ErrorUtils {
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/util/fileUtils.ts b/services/self-service/src/main/resources/webapp/src/app/core/util/fileUtils.ts
index 98ec0f5..d1c2628 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/util/fileUtils.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/util/fileUtils.ts
@@ -37,6 +37,16 @@
     window.URL.revokeObjectURL(url);
   }
 
+  public static downloadBigFiles(data, fileName) {
+    const a = document.createElement('a');
+    document.body.appendChild(a);
+    const blob = new Blob([data], { type: 'octet/stream' }),
+      url = window.URL.createObjectURL(blob);
+    a.href = url;
+    a.download = fileName;
+    a.click();
+    window.URL.revokeObjectURL(url);
+  }
 
   public static copyToClipboard(val: string) {
     const selBox = document.createElement('textarea');
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/util/helpUtils.ts b/services/self-service/src/main/resources/webapp/src/app/core/util/helpUtils.ts
new file mode 100644
index 0000000..a0eae85
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/util/helpUtils.ts
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+export class HelpUtils {
+
+  public static getBucketProtocol = (cloud) => {
+    switch (cloud) {
+      case 'aws':
+        return 's3a://';
+
+      case 'gcp':
+        return 'gs://';
+
+      case 'azure':
+        return 'wasbs://';
+
+      default:
+        return;
+    }
+  }
+
+  public static addSizeToGpuType(index): string {
+
+    const sizes = ['S', 'M', 'L', 'XL', 'XXL'];
+
+    return sizes[index];
+  }
+
+  public static sortGpuTypes(gpuType: Array<string> = []): Array<string> {
+    
+    const sortedTypes = [
+      'nvidia-tesla-t4', 
+      'nvidia-tesla-k80', 
+      'nvidia-tesla-p4', 
+      'nvidia-tesla-p100', 
+      'nvidia-tesla-v100'
+    ];
+
+    return sortedTypes.filter(el => gpuType.includes(el));;
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/util/index.ts b/services/self-service/src/main/resources/webapp/src/app/core/util/index.ts
index 0799d07..8c04f80 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/util/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/util/index.ts
@@ -19,6 +19,7 @@
 
 export * from './http-status-codes';
 export * from './sortUtils';
+export * from './helpUtils';
 export * from './errorUtils';
 export * from './dateUtils';
 export * from './fileUtils';
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/util/patterns.ts b/services/self-service/src/main/resources/webapp/src/app/core/util/patterns.ts
index ac9137f..4408402 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/util/patterns.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/util/patterns.ts
@@ -24,5 +24,7 @@
   url: '[a-zA-Z0-9.://%#&\\.@:%-_\+~#=]*\.[^\s]*[a-zA-Z0-9]/+',
   nodeCountPattern: '^[1-9]\\d*$',
   integerRegex: '^[0-9]*$',
+  folderRegex: /^[a-zA-Z0-9!@$^&*()_+\-=\[\]{};':|,.<>~` ]*$/,
+  libVersion: /^[a-zA-Z0-9_\-:/~.+]*$/,
   fullUrl: /^(http?|ftp|https):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+([.:])(\d{4}|com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*\/$/
 };
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/util/sortUtils.ts b/services/self-service/src/main/resources/webapp/src/app/core/util/sortUtils.ts
index 0a613ad..24dbf49 100644
--- a/services/self-service/src/main/resources/webapp/src/app/core/util/sortUtils.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/util/sortUtils.ts
@@ -34,13 +34,23 @@
 
     Object.keys(shapesJson)
       .sort((a, b) => sortOrder.indexOf(a) - sortOrder.indexOf(b))
-      .forEach(key => { sortedShapes[key] = shapesJson[key]; });
+      .forEach(key => {
+        if (shapesJson[key].length) {
+          sortedShapes[key] = shapesJson[key];
+        }
+      });
 
     return sortedShapes;
   }
 
   public static libGroupsSort(groups) {
-    const sortOrder = ['os_pkg', 'pip2', 'pip3', 'r_pkg', 'java', 'others'];
+    const sortOrder = ['os_pkg', 'pip3', 'r_pkg', 'java', 'others'];
+
+    return groups.sort((arg1, arg2) => sortOrder.indexOf(arg1) - sortOrder.indexOf(arg2));
+  }
+
+  public static libFilterGroupsSort(groups) {
+    const sortOrder = ['Apt/Yum', 'Python 3', 'R packages', 'Java', 'Others'];
 
     return groups.sort((arg1, arg2) => sortOrder.indexOf(arg1) - sortOrder.indexOf(arg2));
   }
@@ -48,5 +58,13 @@
   public static flatDeep(arr, d = 1) {
     return d > 0 ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? this.flatDeep(val, d - 1) : val), [])
       : arr.slice();
-  };
+  }
+
+  public static sortByKeys(array, keys) {
+    keys.forEach(key => {
+      array = array.sort((a, b) => (a[key] > b[key]) ? 1 : ((b[key] > a[key]) ? -1 : 0));
+    });
+    return array;
+  }
+
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/help/accessnotebookguide/accessnotebookguide.component.html b/services/self-service/src/main/resources/webapp/src/app/help/accessnotebookguide/accessnotebookguide.component.html
index e4a3519..51e9364 100644
--- a/services/self-service/src/main/resources/webapp/src/app/help/accessnotebookguide/accessnotebookguide.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/help/accessnotebookguide/accessnotebookguide.component.html
@@ -18,13 +18,15 @@
   -->
 
 <section class="guide-wrapper">
-  <h2>How to access DLAB user environment on different operation systems</h2>
+  <h2>How to access DataLab user environment on different operation systems</h2>
 
   <ul>
     <h3>How to setup tunnel to EDGE instance via SSH on Microsoft Windows</h3>
     <li>Please download PuTTY program by using <a href="https://the.earth.li/~sgtatham/putty/latest/w32/putty.exe">this link</a>.</li>
     <li>Open the PuTTY program.</li>
-    <li>In the "HostName" field enter user and IP address of your Edge Node.<br>Please use "dlab-user" for logging in.</li>
+      <li>In the "HostName" field enter user and IP address of your Edge Node.<br>Please use "datalab-user" for logging
+          in.
+      </li>
     <img src="./../assets/guides/1_1.png" alt="">
     <li>Open Connection &#8594; SSH &#8594; Auth tab and select a private key, corresponding to a public key, which you've specified during Initial Infrastructure setup.</li>
     <img src="./../assets/guides/1_2.png" alt="">
@@ -37,7 +39,8 @@
 
     <h3>How to access Notebook Server over SSH on Microsoft Windows</h3>
     <li>Tunnel to the Edge should be established. Run a second PuTTY session.</li>
-    <li>In the "HostName" field enter user and IP address of your Notebook instance.<br>Please use "dlab-user".</li>
+      <li>In the "HostName" field enter user and IP address of your Notebook instance.<br>Please use "datalab-user".
+      </li>
     <img src="./../assets/guides/2_1.png" alt="">
     <li>Open Connection &#8594; SSH &#8594; Auth tab and select a private key, corresponding to a public key, which you've specified during Initial Infrastructure setup.</li>
     <img src="./../assets/guides/2_2.png" alt="">
@@ -61,14 +64,16 @@
     <li>Open terminal.</li>
     <li>Enter following command:</li>
     <div class="code-block">ssh -D 3127 USER@EDGE_IP -i PATH_TO_PRIVATE_KEY</div>
-    <li>Please use "dlab-user" for logging in .<br>Also change "EDGE_IP" and "PATH_TO_KEY" to your value.</li>
+      <li>Please use "datalab-user" for logging in .<br>Also change "EDGE_IP" and "PATH_TO_KEY" to your value.</li>
     <li>Tunnel to the Edge has been established. Do not close this terminal till you finished working with notebooks.</li>
 
     <h3>How to access Notebook Server over SSH on MacOS / Linux</h3>
     <li>Tunnel to the Edge should be established. Open new terminal.</li>
     <li>Enter following command:</li>
     <div class="code-block">ssh -o ProxyCommand='nc -x localhost:3127 %h %p' USER@NOTEBOOK_IP -i PATH_TO_PRIVATE_KEY</div>
-    <li>Please use "dlab-user" for logging in.<br>Also change "NOTEBOOK_IP" and "PATH_TO_PRIVATE_KEY" to your value.</li>
+      <li>Please use "datalab-user" for logging in.<br>Also change "NOTEBOOK_IP" and "PATH_TO_PRIVATE_KEY" to your
+          value.
+      </li>
     <li>Now you are connected to notebook server via SSH.</li>
   </ul>
 </section>
diff --git a/services/self-service/src/main/resources/webapp/src/app/help/publickeyguide/publickeyguide.component.html b/services/self-service/src/main/resources/webapp/src/app/help/publickeyguide/publickeyguide.component.html
index b5936b8..68ef7ee 100644
--- a/services/self-service/src/main/resources/webapp/src/app/help/publickeyguide/publickeyguide.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/help/publickeyguide/publickeyguide.component.html
@@ -32,7 +32,7 @@
     <img src="./../assets/guides/public_key.png" alt="">
     <li>You will need PRIVATE KEY to connect to your machine. Warning! You must save the private key.</li>
     <li>Click the "Save private key" button to save the private key.</li>
-    <li>PUBLIC KEY shall be uploaded using Web UI of Dlab.</li>
+    <li>PUBLIC KEY shall be uploaded using Web UI of DataLab.</li>
     <li>
       <strong>Do not use "Save public key" button for saving public key.</strong>
       To save public key in a proper format you have to copy all text from "Public key for pasting into OpenSSH
diff --git a/services/self-service/src/main/resources/webapp/src/app/layout/layout.component.html b/services/self-service/src/main/resources/webapp/src/app/layout/layout.component.html
index dcab0d8..44e3259 100644
--- a/services/self-service/src/main/resources/webapp/src/app/layout/layout.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/layout/layout.component.html
@@ -17,4 +17,4 @@
   ~ under the License.
   -->
 
-<dlab-navbar></dlab-navbar>
+<datalab-navbar></datalab-navbar>
diff --git a/services/self-service/src/main/resources/webapp/src/app/layout/layout.component.ts b/services/self-service/src/main/resources/webapp/src/app/layout/layout.component.ts
index f3667fa..38e88f6 100644
--- a/services/self-service/src/main/resources/webapp/src/app/layout/layout.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/layout/layout.component.ts
@@ -20,7 +20,7 @@
 import { Component, OnInit } from '@angular/core';
 
 @Component({
-  selector: 'dlab-layout',
+  selector: 'datalab-layout',
   templateUrl: './layout.component.html',
   styles: [`main { height: 100%;}`]
 })
diff --git a/services/self-service/src/main/resources/webapp/src/app/login/login.component.css b/services/self-service/src/main/resources/webapp/src/app/login/login.component.css
index a3f28fa..890b9f4 100644
--- a/services/self-service/src/main/resources/webapp/src/app/login/login.component.css
+++ b/services/self-service/src/main/resources/webapp/src/app/login/login.component.css
@@ -47,9 +47,12 @@
 }
 
 .login_page .logo {
-  display: inline-block;
+  display: flex;
+  justify-content: center;
   margin-bottom: 45px;
   cursor: default;
+  height: 250px;
+  width: 360px;
 }
 
 .login_page {
diff --git a/services/self-service/src/main/resources/webapp/src/app/login/login.component.html b/services/self-service/src/main/resources/webapp/src/app/login/login.component.html
index d87e1d1..a8e0de5 100644
--- a/services/self-service/src/main/resources/webapp/src/app/login/login.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/login/login.component.html
@@ -20,7 +20,7 @@
 <div class="login_page">
   <div class="content">
     <a class="logo">
-      <img src="assets/img/logo.png" alt="">
+      <img src="assets/svg/datalab-logo.svg" alt="">
     </a>
     <form name="form" class="form-wrap" #f="ngForm" novalidate>
       <!--
diff --git a/services/self-service/src/main/resources/webapp/src/app/login/login.component.ts b/services/self-service/src/main/resources/webapp/src/app/login/login.component.ts
index bc50072..ae5fa8f 100644
--- a/services/self-service/src/main/resources/webapp/src/app/login/login.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/login/login.component.ts
@@ -25,7 +25,7 @@
 import { DICTIONARY } from '../../dictionary/global.dictionary';
 
 @Component({
-  selector: 'dlab-login',
+  selector: 'datalab-login',
   templateUrl: 'login.component.html',
   styleUrls: ['./login.component.css']
 })
diff --git a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.html b/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.html
deleted file mode 100644
index 537cbb5..0000000
--- a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.html
+++ /dev/null
@@ -1,240 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
-  -->
-
-<section class="table-wrapper">
-  <table mat-table [dataSource]="reportData" class="data-grid reporting mat-elevation-z6">
-
-    <ng-container matColumnDef="name">
-      <th mat-header-cell *matHeaderCellDef class="env_name label-header">
-        <div class="label"><span class="text"> Environment name</span></div>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filteredReportData.dlab_id.length > 0; else dlab_id_filtered">filter_list</span>
-            <ng-template #dlab_id_filtered>more_vert</ng-template>
-          </i>
-        </button>
-      </th>
-      <td mat-cell *matCellDef="let element"><span class="table-item">{{element.dlabId}}</span></td>
-      <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
-    </ng-container>
-
-    <ng-container matColumnDef="user">
-      <th mat-header-cell *matHeaderCellDef class="th_user label-header">
-        <div class="sort">
-          <div class="sort-arrow up" (click)="sortBy('user', 'down')" [ngClass]="{'active': !!this.active['userdown']}"></div>
-          <div class="sort-arrow down" (click)="sortBy('user', 'up')" [ngClass]="{'active': !!this.active['userup']}"></div>
-        </div>
-        <div class="label">
-          <span class="text"> User </span>
-        </div>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filteredReportData.users.length > 0; else user_filtered">filter_list</span>
-            <ng-template #user_filtered>more_vert</ng-template>
-          </i>
-        </button>
-      </th>
-      <td mat-cell *matCellDef=" let element"> {{element.user}} </td>
-      <td mat-footer-cell *matFooterCellDef  class="table-footer"></td>
-    </ng-container>
-
-    <ng-container matColumnDef="project">
-      <th mat-header-cell *matHeaderCellDef class="th_project label-header">
-        <div class="sort">
-          <div class="sort-arrow up" (click)="sortBy('project', 'down')" [ngClass]="{'active': !!this.active['projectdown']}"></div>
-          <div class="sort-arrow down" (click)="sortBy('project', 'up')" [ngClass]="{'active': !!this.active['projectup']}"></div>
-        </div>
-        <div class="label"><span class="text">Project</span></div>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filteredReportData.projects.length > 0; else project_filtered">filter_list</span>
-            <ng-template #project_filtered>more_vert</ng-template>
-          </i>
-        </button>
-      </th>
-      <td mat-cell *matCellDef="let element"> {{element.project}} </td>
-      <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
-    </ng-container>
-
-    <ng-container matColumnDef="type">
-      <th mat-header-cell *matHeaderCellDef class="th_type label-header">
-        <div class="label"><span class="text"> Resource Type</span> </div>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filteredReportData.resource_type.length > 0; else type_filtered">filter_list</span>
-            <ng-template #type_filtered>more_vert</ng-template>
-          </i>
-        </button>
-      </th>
-      <td mat-cell *matCellDef="let element"> {{element.resource_type | titlecase}} </td>
-      <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
-    </ng-container>
-
-    <ng-container matColumnDef="status">
-      <th mat-header-cell *matHeaderCellDef class="th_status label-header">
-        <div class="label"><span class="text"> Status</span> </div>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filteredReportData.statuses.length > 0; else status_filtered">filter_list</span>
-            <ng-template #status_filtered>more_vert</ng-template>
-          </i>
-        </button>
-      </th>
-      <td mat-cell *matCellDef="let element">
-        <span class="status" ngClass="{{ element.status.toLowerCase() || '' }}"
-          *ngIf="element.status">{{ element.status.toLowerCase() }}</span>
-        <span *ngIf="!element.status">N/A</span>
-      </td>
-      <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
-    </ng-container>
-
-    <ng-container matColumnDef="shape">
-      <th mat-header-cell *matHeaderCellDef class="th_shape label-header">
-        <div class="label"><span class="text"> Instance size</span></div>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span
-              *ngIf="filteredReportData['shapes'].length > 0; else shape_filtered">filter_list</span>
-            <ng-template #shape_filtered>more_vert</ng-template>
-          </i>
-        </button>
-      </th>
-      <td mat-cell *matCellDef="let element">
-        <ng-container *ngIf="element.shape">
-          <div *ngFor="let shape of shapeSplit(element.shape)">{{shape}}</div>
-        </ng-container>
-      </td>
-      <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
-    </ng-container>
-
-    <ng-container matColumnDef="service">
-      <th mat-header-cell *matHeaderCellDef class="service label-header">
-        <div class="label"><span class="text"> Product</span> </div>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span
-              *ngIf="filteredReportData['shapes'].length > 0; else service_filtered">filter_list</span>
-            <ng-template #service_filtered>more_vert</ng-template>
-          </i>
-        </button>
-      </th>
-      <td mat-cell *matCellDef="let element">
-        {{ element.product }}
-<!--        <span *ngIf="element.product">{{ element.product }}</span>-->
-      </td>
-      <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
-    </ng-container>
-
-    <ng-container matColumnDef="charge" stickyEnd>
-      <th mat-header-cell *matHeaderCellDef class="th_charges label-header">
-        <div class="label">
-          <div class="sort">
-            <div class="sort-arrow up" (click)="sortBy('cost', 'down')" [ngClass]="{'active': !!this.active['costdown']}"></div>
-            <div class="sort-arrow down" (click)="sortBy('cost', 'up')" [ngClass]="{'active': !!this.active['costup']}"></div>
-          </div>
-          <span class="text">Service Charges</span>
-        </div>
-      </th>
-
-      <td mat-cell *matCellDef="let element">
-        {{ element.cost }} {{ element['currency'] }}
-      </td>
-      <td mat-footer-cell *matFooterCellDef class="table-footer total-cost">
-        Total <span *ngIf="reportData?.length"> {{ fullReport['total_cost'] }}
-          {{ fullReport['currency'] }}</span>
-      </td>
-    </ng-container>
-
-    <!-- ----------------FILTER -->
-    <ng-container matColumnDef="name-filter">
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <input #nameFilter type="text" placeholder="Filter by environment name" class="form-control filter-field"
-          [value]="filtered?.dlab_id" (input)="filteredReportData.dlab_id = $event.target['value']" />
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="user-filter">
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="'users'"
-          [items]="filterConfiguration.users" [model]="filteredReportData.users"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="project-filter">
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="'projects'"
-          [items]="filterConfiguration.projects" [model]="filteredReportData.projects"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="type-filter">
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="['resource_type']"
-          [items]="filterConfiguration.resource_type" [model]="filteredReportData.resource_type">
-        </multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="status-filter">
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="'statuses'"
-          [items]="filterConfiguration.statuses" [model]="filteredReportData.statuses"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="shape-filter">
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)"
-          [type]="'shapes'" [items]="filterConfiguration['shapes']"
-          [model]="filteredReportData['shapes']"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="service-filter">
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)"
-          [type]="['products']"
-          [items]="filterConfiguration['products']"
-          [model]="filteredReportData['products']"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="actions" stickyEnd>
-      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
-        <div class="actions th_charges">
-          <button mat-icon-button class="btn reset" (click)="resetFiltering(); isFiltered = !isFiltered">
-            <i class="material-icons">close</i>
-          </button>
-
-          <button mat-icon-button class="btn apply" (click)="filter_btnClick()">
-            <i class="material-icons">done</i>
-          </button>
-        </div>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="placeholder">
-      <td mat-footer-cell *matFooterCellDef colspan="7" class="info">
-        No data available
-      </td>
-    </ng-container>
-
-    <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true" class="header-row"></tr>
-
-    <tr [hidden]="!collapseFilterRow" mat-header-row *matHeaderRowDef="displayedFilterColumns; sticky: true"
-      class="filter-row"></tr>
-    <tr mat-row *matRowDef="let row; columns: displayedColumns;" class="content-row"></tr>
-
-    <tr [hidden]="!reportData?.length" mat-footer-row *matFooterRowDef="displayedColumns; sticky: true"
-      class="header-row"></tr>
-    <tr [hidden]="reportData?.length" mat-footer-row *matFooterRowDef="['placeholder']"></tr>
-  </table>
-</section>
diff --git a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.scss b/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.scss
deleted file mode 100644
index 9c4f819..0000000
--- a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.scss
+++ /dev/null
@@ -1,272 +0,0 @@
-/*!
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-.table-wrapper {
-  width: 100%;
-
-}
-
-.reporting {
-  width: 100%;
-  min-width: 1100px;
-  overflow: auto;
-  border-collapse: inherit;
-
-  .mat-cell {
-    vertical-align: middle;
-  }
-
-  tr {
-    th {
-      padding-right: 5px;
-      z-index: 2 !important;
-      &.th_charges{
-        z-index: 3 !important;
-      }
-    }
-
-    td {
-      font-size: 13px;
-      padding-left: 15px;
-
-      &.info {
-        z-index: 1 !important;
-        text-align: center;
-        padding: 40px;
-      }
-    }
-
-    &.filter-row {
-      th {
-        padding: 5px;
-        font-size: 13px;
-      }
-
-      .filter-field {
-        font-size: 13px;
-      }
-
-    }
-
-    &.header-row {
-      th {
-        font-size: 11px;
-        .label{
-          padding-left: 0;
-        }
-      }
-    }
-  }
-
-  .th_shape {
-    width: 10%;
-    min-width: 150px;
-  }
-
-  .th_user,
-  .env_name,
-  .service,
-  .tags {
-    width: 15%;
-    min-width: 150px;
-    overflow: hidden;
-    word-wrap: break-word;
-  }
-
-  .tags {
-    .label {
-      padding-top: 0;
-    }
-  }
-
-  .service {
-    min-width: 175px;
-  }
-
-  .env_name {
-    width: 16%;
-    min-width: 200px;
-  }
-
-  .th_project{
-    width: 12%;
-  }
-
-  .th_type {
-    width: 10%;
-    min-width: 150px;
-  }
-
-  .th_status {
-    width: 8%;
-    min-width: 150px;
-  }
-
-  .th_charges {
-    width: 10%;
-    min-width: 155px;
-    text-align: right;
-
-    .label {
-      padding-top: 0;
-    }
-  }
-
-  .th_project {
-    min-width: 150px;
-  }
-
-  .tags-col {
-    padding: 5px;
-
-    mat-chip {
-      min-height: 20px;
-      padding: 5px 10px;
-      font-size: 13px;
-      max-width: 110px !important;
-      text-overflow: ellipsis;
-      white-space: nowrap;
-      display: inline-block;
-      line-height: 10px;
-      margin: 2px;
-    }
-  }
-
-  .mat-column-charge {
-    text-align: right;
-  }
-
-  .header-row {
-    position: unset;
-
-    .th_charges {
-      padding-top: 0;
-
-      .label {
-        padding-top: 12px;
-      }
-    }
-
-    .label {
-      display: inline-block;
-      padding-top: 13px;
-      vertical-align: super !important;
-
-      .text{
-     padding-left: 15px;
-      }
-    }
-
-    .sort{
-      position: absolute;
-      bottom: 20px;
-
-      &-arrow{
-        width: 6px;
-        height: 6px;
-        border: 3px solid transparent;
-        border-bottom: 3px solid rgba(0,0,0,.54);
-        border-left: 3px solid rgba(0,0,0,.54);
-        cursor: pointer;
-
-        &.active{
-          border-bottom: 3px solid #35afd5;
-          border-left: 3px solid #35afd5;
-        }
-      }
-
-      .down{
-        transform: rotate(-45deg);
-      }
-
-      .up{
-        transform: rotate(135deg);
-      }
-    }
-  }
-
-
-
-  .filter-row {
-    .actions {
-      text-align: right;
-    }
-  }
-
-  .table-footer{
-    position: sticky;
-    bottom: 0;
-    background: inherit;
-    border-top: 1px solid #E0E0E0;
-    transform: translateY(-1px);
-    border-bottom: none;
-    padding-left: 0 !important;
-  }
-}
-
-.dashboard_table_body {
-  td:first-child {
-    cursor: default;
-  }
-
-  .dropdown-multiselect {
-    button {
-      font-size: 14px;
-      height: 34px;
-      padding: 7px 20px;
-    }
-  }
-}
-
-.table-footer{
-  position: sticky;
-  bottom: 0;
-  background: inherit;
-  border-top: 1px solid #E0E0E0;
-  transform: translateY(-1px);
-  border-bottom: none;
-
-  &.total-cost{
-    min-width: 140px;
-    padding-left: 0 !important;
-  }
-}
-
-@media screen and (max-width: 1280px) {
-  .dashboard_table.reporting {
-    .env_name,
-    .service,
-    .th_type,
-    .th_status {
-      width: 10%;
-    }
-
-    .th_user {
-      width: 12%;
-    }
-
-    .th_charges {
-      width: 6%;
-    }
-
-    .user-field {
-      word-wrap: break-word;
-    }
-  }
-}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.ts b/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.ts
deleted file mode 100644
index d4e0076..0000000
--- a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting-grid/reporting-grid.component.ts
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import {Component, OnInit, Output, EventEmitter, ViewChild, Input} from '@angular/core';
-import { ReportingConfigModel } from '../../../dictionary/global.dictionary';
-
-@Component({
-  selector: 'dlab-reporting-grid',
-  templateUrl: './reporting-grid.component.html',
-  styleUrls: ['./reporting-grid.component.scss',
-    '../../resources/resources-grid/resources-grid.component.scss'],
-
-})
-export class ReportingGridComponent implements OnInit {
-
-  filterConfiguration: ReportingConfigModel;
-  filteredReportData: ReportingConfigModel = new ReportingConfigModel([], [], [], [], [], '', '', '', []);
-  collapseFilterRow: boolean = true;
-  reportData: Array<any> = [];
-  fullReport: Array<any>;
-  isFiltered: boolean = false;
-  active: object = {};
-
-  @ViewChild('nameFilter', { static: false }) filter;
-
-  @Output() filterReport: EventEmitter<{}> = new EventEmitter();
-  @Output() resetRangePicker: EventEmitter<boolean> = new EventEmitter();
-  displayedColumns: string[] = ['name', 'user', 'project', 'type', 'status', 'shape', 'service', 'charge'];
-  displayedFilterColumns: string[] = ['name-filter', 'user-filter', 'project-filter', 'type-filter', 'status-filter', 'shape-filter', 'service-filter', 'actions'];
-  filtered: any;
-
-  ngOnInit() {}
-
-  onUpdate($event): void {
-    this.filteredReportData[$event.type] = $event.model;
-  }
-
-  refreshData(fullReport, report) {
-    this.reportData = [...report];
-    this.fullReport = fullReport;
-  }
-
-  setFullReport(data): void {
-    if (!data) {
-      this.displayedColumns = this.displayedColumns.filter(el => el !== 'user');
-      this.displayedFilterColumns = this.displayedFilterColumns.filter(el => el !== 'user-filter');
-    }
-  }
-
-  sortBy(sortItem, direction) {
-  let report: Array<object>;
-  if (direction === 'down') {
-    report = this.reportData.sort((a, b) => {
-      if (a[sortItem] === null) a = '';
-      if (b[sortItem] === null) b = '';
-     return (a[sortItem] > b[sortItem]) ? 1 : -1;
-    });
-  }
-  if (direction === 'up') {
-    report = this.reportData.sort((a, b) => {
-      if (a[sortItem] === null) a = '';
-      if (b[sortItem] === null) b = '';
-      return (a[sortItem] < b[sortItem]) ? 1 : -1 ;
-    });
-  }
-  this.refreshData(this.fullReport, report);
-  this.removeSorting();
-  this.active[sortItem + direction] = true;
-  }
-
-  removeSorting() {
-    for (const item in this.active) {
-      this.active[item] = false;
-    }
-  }
-
-  toggleFilterRow(): void {
-    this.collapseFilterRow = !this.collapseFilterRow;
-  }
-
-  setConfiguration(reportConfig: ReportingConfigModel): void {
-    this.filterConfiguration = reportConfig;
-  }
-
-  filter_btnClick(): void {
-    this.filterReport.emit(this.filteredReportData);
-    this.isFiltered = true;
-    this.removeSorting();
-  }
-
-  resetFiltering(): void {
-    this.filteredReportData.defaultConfigurations();
-    this.removeSorting();
-    this.filter.nativeElement.value = '';
-    this.filterReport.emit(this.filteredReportData);
-    this.resetRangePicker.emit(true);
-  }
-
-  shapeSplit(shape) {
-    return shape.split(/(?=Slave)/g);
-  }
-}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts b/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts
deleted file mode 100644
index 1692ef1..0000000
--- a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.component.ts
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core';
-import { ToastrService } from 'ngx-toastr';
-import {ApplicationSecurityService, BillingReportService, HealthStatusService} from '../core/services';
-import { ReportingGridComponent } from './reporting-grid/reporting-grid.component';
-import { ToolbarComponent } from './toolbar/toolbar.component';
-
-import { FileUtils } from '../core/util';
-import { DICTIONARY, ReportingConfigModel } from '../../dictionary/global.dictionary';
-import {ProgressBarService} from '../core/services/progress-bar.service';
-
-@Component({
-  selector: 'dlab-reporting',
-  template: `
-  <div class="base-retreat">
-    <dlab-toolbar (rebuildReport)="rebuildBillingReport()"
-                  (exportReport)="exportBillingReport()"
-                  (setRangeOption)="setRangeOption($event)">
-    </dlab-toolbar>
-    <mat-divider></mat-divider>
-    <dlab-reporting-grid (filterReport)="filterReport($event)" (resetRangePicker)="resetRangePicker()"></dlab-reporting-grid>
-  </div>
-
-  `,
-  styles: [`
-    footer {
-      position: fixed;
-      left: 0;
-      bottom: 0;
-      width: 100%;
-      background: #a1b7d1;
-      color: #ffffff;
-      text-align: right;
-      padding: 5px 15px;
-      font-size: 18px;
-      box-shadow: 0 9px 18px 15px #f5f5f5;
-    }
-  `]
-})
-export class ReportingComponent implements OnInit, OnDestroy {
-  readonly DICTIONARY = DICTIONARY;
-
-  @ViewChild(ReportingGridComponent, { static: false }) reportingGrid: ReportingGridComponent;
-  @ViewChild(ToolbarComponent, { static: true }) reportingToolbar: ToolbarComponent;
-
-  reportData: ReportingConfigModel = ReportingConfigModel.getDefault();
-  filterConfiguration: ReportingConfigModel = ReportingConfigModel.getDefault();
-  data: any;
-  billingEnabled: boolean;
-  admin: boolean;
-
-  constructor(
-    private billingReportService: BillingReportService,
-    private healthStatusService: HealthStatusService,
-    public toastr: ToastrService,
-    private progressBarService: ProgressBarService,
-    private applicationSecurityService: ApplicationSecurityService,
-  ) { }
-
-  ngOnInit() {
-    this.getEnvironmentHealthStatus();
-    this.buildBillingReport();
-  }
-
-  ngOnDestroy() {
-    this.clearStorage();
-  }
-
-  getGeneralBillingData() {
-    setTimeout(() => {this.progressBarService.startProgressBar(); } , 0);
-    this.billingReportService.getGeneralBillingData(this.reportData)
-      .subscribe(data => {
-        this.data = data;
-        this.reportingGrid.refreshData(this.data, this.data.report_lines);
-        this.reportingGrid.setFullReport(this.data.is_full);
-
-        this.reportingToolbar.reportData = this.data;
-        if (!localStorage.getItem('report_period')) {
-          localStorage.setItem('report_period', JSON.stringify({
-            start_date: this.data['from'],
-            end_date: this.data['to']
-          }));
-          this.reportingToolbar.setDateRange();
-        }
-
-        if (localStorage.getItem('report_config')) {
-          this.filterConfiguration = JSON.parse(localStorage.getItem('report_config'));
-          this.reportingGrid.setConfiguration(this.filterConfiguration);
-        } else {
-          this.getDefaultFilterConfiguration(this.data);
-        }
-        this.progressBarService.stopProgressBar();
-      }, () => this.progressBarService.stopProgressBar());
-  }
-
-  rebuildBillingReport(): void {
-    this.checkAutorize();
-    this.buildBillingReport();
-
-  }
-
-  buildBillingReport() {
-    this.clearStorage();
-    this.resetRangePicker();
-    this.reportData.defaultConfigurations();
-    this.getGeneralBillingData();
-  }
-
-  private checkAutorize() {
-    this.applicationSecurityService.isLoggedIn().subscribe( () => {
-        this.getEnvironmentHealthStatus();
-      }
-    );
-  }
-
-  exportBillingReport(): void {
-    this.billingReportService.downloadReport(this.reportData)
-      .subscribe(
-        data => FileUtils.downloadFile(data),
-        () => this.toastr.error('Billing report export failed!', 'Oops!'));
-  }
-
-  getDefaultFilterConfiguration(data): void {
-    const users = [], types = [], shapes = [], services = [], statuses = [], projects = [];
-
-    data.report_lines.forEach((item: any) => {
-      if (item.user && users.indexOf(item.user) === -1)
-        users.push(item.user);
-
-      if (item.status && statuses.indexOf(item.status.toLowerCase()) === -1)
-        statuses.push(item.status.toLowerCase());
-
-      if (item.project && projects.indexOf(item.project) === -1)
-        projects.push(item.project);
-
-      if (item['resource_type'] && types.indexOf(item['resource_type']) === -1)
-        types.push(item['resource_type']);
-
-      if (item.shape && types.indexOf(item.shape)) {
-       if (item.shape.indexOf('Master') > -1) {
-          for (let shape of item.shape.split(/(?=Slave)/g)) {
-            shape = shape.replace('Master: ', '');
-            shape = shape.replace(/Slave: /, '');
-            shape = shape.replace(/\s+/g, '');
-            shapes.indexOf(shape) === -1 && shapes.push(shape);
-          }
-        } else if (item.shape.match(/\d x \S+/)) {
-          const parsedShape = item.shape.match(/\d x \S+/)[0].split(' x ')[1];
-          if (shapes.indexOf(parsedShape) === -1) {
-            shapes.push(parsedShape);
-          }
-        } else {
-          shapes.indexOf(item.shape) === -1 && shapes.push(item.shape);
-        }
-      }
-
-      if (item.product && services.indexOf(item.product) === -1)
-        services.push(item.product);
-    });
-
-    if (!this.reportingGrid.filterConfiguration || !localStorage.getItem('report_config')) {
-      this.filterConfiguration = new ReportingConfigModel(users, services, types, statuses, shapes, '', '', '', projects);
-      this.reportingGrid.setConfiguration(this.filterConfiguration);
-      localStorage.setItem('report_config', JSON.stringify(this.filterConfiguration));
-    }
-  }
-
-  filterReport(event: ReportingConfigModel): void {
-    this.reportData = event;
-    this.getGeneralBillingData();
-  }
-
-  resetRangePicker() {
-    this.reportingToolbar.clearRangePicker();
-  }
-
-  setRangeOption(dateRangeOption: any): void {
-    this.reportData.date_start = dateRangeOption.start_date;
-    this.reportData.date_end = dateRangeOption.end_date;
-    this.getGeneralBillingData();
-  }
-
-  private clearStorage(): void {
-    localStorage.removeItem('report_config');
-    localStorage.removeItem('report_period');
-  }
-
-  private getEnvironmentHealthStatus() {
-    this.healthStatusService.getEnvironmentHealthStatus()
-      .subscribe((result: any) => {
-        this.billingEnabled = result.billingEnabled;
-        this.admin = result.admin;
-      });
-  }
-}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.module.ts b/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.module.ts
deleted file mode 100644
index 3067e9a..0000000
--- a/services/self-service/src/main/resources/webapp/src/app/reporting/reporting.module.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { FormsModule } from '@angular/forms';
-import { NgDateRangePickerModule } from 'ng-daterangepicker';
-
-import { MaterialModule } from '../shared/material.module';
-import { FormControlsModule } from '../shared/form-controls';
-import { ReportingComponent } from './reporting.component';
-import { KeysPipeModule, LineBreaksPipeModule } from '../core/pipes';
-import { ReportingGridComponent } from './reporting-grid/reporting-grid.component';
-import { ToolbarComponent } from './toolbar/toolbar.component';
-
-@NgModule({
-  imports: [
-    CommonModule,
-    FormsModule,
-    FormControlsModule,
-    KeysPipeModule,
-    LineBreaksPipeModule,
-    NgDateRangePickerModule,
-    MaterialModule
-  ],
-  declarations: [
-    ReportingComponent,
-    ReportingGridComponent,
-    ToolbarComponent
-  ],
-  exports: [ReportingComponent]
-})
-export class ReportingModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/reporting/toolbar/toolbar.component.html b/services/self-service/src/main/resources/webapp/src/app/reporting/toolbar/toolbar.component.html
deleted file mode 100644
index 583371e..0000000
--- a/services/self-service/src/main/resources/webapp/src/app/reporting/toolbar/toolbar.component.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing,
-  ~ software distributed under the License is distributed on an
-  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  ~ KIND, either express or implied.  See the License for the
-  ~ specific language governing permissions and limitations
-  ~ under the License.
-  -->
-<section class="toolbar">
-  <div class="info_color" *ngIf="reportData">
-    <div class="general">
-      <div><span>Service base name: </span><strong>{{ reportData.sbn }}</strong></div>
-      <div *ngIf="reportData.tag_resource_id"><span>Resource tag ID:
-        </span><strong>{{ reportData.tag_resource_id }}</strong></div>
-      <div class="report-period info_color" *ngIf="availablePeriodFrom && availablePeriodTo">
-        <span>Available reporting period from:</span>
-        <strong>{{ availablePeriodFrom | date }} </strong>
-        to: <strong>{{ availablePeriodTo | date }}</strong>
-      </div>
-    </div>
-  </div>
-
-  <div id="range-picker">
-    <ng-daterangepicker [(ngModel)]="value" [options]="options" (ngModelChange)="onChange($event)"></ng-daterangepicker>
-  </div>
-  <div class="action-butt">
-    <button mat-raised-button class="butt" (click)="export($event)" [disabled]="!reportData?.report_lines.length">
-      <i class="material-icons">file_download</i>Export
-    </button>
-    <button mat-raised-button class="butt" (click)="rebuild($event)">
-      <i class="material-icons">autorenew</i>Refresh
-    </button>
-  </div>
-</section>
diff --git a/services/self-service/src/main/resources/webapp/src/app/reporting/toolbar/toolbar.component.scss b/services/self-service/src/main/resources/webapp/src/app/reporting/toolbar/toolbar.component.scss
deleted file mode 100644
index 4a150bf..0000000
--- a/services/self-service/src/main/resources/webapp/src/app/reporting/toolbar/toolbar.component.scss
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-section.toolbar {
-  display: flex;
-  justify-content: space-between;
-  font-weight: 300;
-  width: 100%;
-
-  >div {
-    width: 33%;
-  }
-
-  >div:nth-child(2) {
-    text-align: center;
-  }
-
-  >div:nth-child(3) {
-    text-align: right;
-  }
-
-  .action-butt {
-    align-self: center;
-  }
-
-  button {
-    &:first-child {
-      margin-right: 10px;
-    }
-  }
-
-  .butt-report-range {
-    width: 240px;
-    margin-right: 10px;
-  }
-
-  .general {
-    font-size: 13px;
-
-    div {
-      span {
-        width: 190px;
-        display: inline-block;
-      }
-    }
-  }
-}
-
-/* daterangepicker themes */
-#range-picker {
-  margin-top: 5px;
-}
-
-#range-picker path#Shape {
-  fill: #36afd5;
-}
-
-#range-picker .ng-daterangepicker,
-#range-picker .ng-daterangepicker.is-active,
-#range-picker .ng-daterangepicker .calendar {
-  border: none;
-  border-radius: 0;
-  box-shadow: 0 3px 1px -2px rgba(0, 0, 0, .2), 0 2px 2px 0 rgba(0, 0, 0, .14), 0 1px 5px 0 rgba(0, 0, 0, .12);
-}
-
-#range-picker .ng-daterangepicker .calendar::after {
-  border-top: 1px solid rgba(234, 234, 234, 0.64);
-  border-left: 1px solid rgba(234, 234, 234, 0.64);
-}
-
-#range-picker .ng-daterangepicker .calendar .side-container .side-button {
-  background: #fff;
-  color: #718ba6;
-  border: none;
-  border-radius: 0px;
-  box-shadow: 0 3px 1px -2px rgba(0, 0, 0, .2), 0 2px 2px 0 rgba(0, 0, 0, .14), 0 1px 5px 0 rgba(0, 0, 0, .12)
-}
-
-#range-picker .ng-daterangepicker .calendar .side-container .side-button.is-active,
-#range-picker .ng-daterangepicker .input-section .label-txt {
-  color: #35afd5;
-}
-
-#range-picker .ng-daterangepicker .calendar .calendar-container .day-num.is-active,
-#range-picker .ng-daterangepicker .calendar .calendar-container .days .day-num:hover {
-  background: #35afd5;
-  background-clip: padding-box;
-
-}
-
-#range-picker .ng-daterangepicker .calendar .calendar-container .day-names,
-#range-picker .ng-daterangepicker .calendar .calendar-container .days {
-  width: 310px;
-}
-
-#range-picker .ng-daterangepicker .calendar .day.is-within-range.is-first-weekday,
-#range-picker .ng-daterangepicker .calendar .day.is-within-range.is-last-weekday {
-  background-clip: padding-box;
-}
-
-#range-picker .ng-daterangepicker .calendar .calendar-container .day.is-within-range {
-  background: #e9f8fc
-}
-
-#range-picker .ng-daterangepicker .input-section .cal-icon svg path {
-  fill: #35afd5;
-}
-
-#range-picker .ng-daterangepicker .input-section .value-txt {
-  color: #718ba6;
-}
-
-#range-picker .ng-daterangepicker .input-section .value-txt.untouched,
-#range-picker .ng-daterangepicker .input-section .label-txt.untouched {
-  color: #fff;
-}
-
-#range-picker .ng-daterangepicker .input-section .value-txt.untouched::after {
-  content: 'Select date';
-  position: absolute;
-  top: 22px;
-  left: 34px;
-  color: #718ba6;
-}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reporting/toolbar/toolbar.component.ts b/services/self-service/src/main/resources/webapp/src/app/reporting/toolbar/toolbar.component.ts
deleted file mode 100644
index 5272e37..0000000
--- a/services/self-service/src/main/resources/webapp/src/app/reporting/toolbar/toolbar.component.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import { Component, OnInit, AfterViewInit, Output, EventEmitter, ViewEncapsulation, ViewChild } from '@angular/core';
-import { NgDateRangePickerOptions } from 'ng-daterangepicker';
-import { DICTIONARY } from '../../../dictionary/global.dictionary';
-import {skip} from 'rxjs/operators';
-import {Subscription} from 'rxjs';
-import {HealthStatusService} from '../../core/services';
-import {GeneralEnvironmentStatus} from '../../administration/management/management.model';
-
-@Component({
-  selector: 'dlab-toolbar',
-  templateUrl: './toolbar.component.html',
-  styleUrls: ['./toolbar.component.scss'],
-  encapsulation: ViewEncapsulation.None
-})
-export class ToolbarComponent implements OnInit, AfterViewInit {
-  readonly DICTIONARY = DICTIONARY;
-  value: any;
-  reportData: any;
-  availablePeriodFrom: string;
-  availablePeriodTo: string;
-  subscriptions: Subscription = new Subscription();
-  healthStatus: GeneralEnvironmentStatus;
-
-  rangeOptions = { 'YTD': 'Year To Date', 'QTD': 'Quarter To Date', 'MTD': 'Month To Date', 'reset': 'All Period Report' };
-  options: NgDateRangePickerOptions;
-  rangeLabels: any;
-
-  @Output() rebuildReport: EventEmitter<{}> = new EventEmitter();
-  @Output() exportReport: EventEmitter<{}> = new EventEmitter();
-  @Output() setRangeOption: EventEmitter<{}> = new EventEmitter();
-
-  constructor(private healthStatusService: HealthStatusService) {
-    this.options = {
-      theme: 'default',
-      range: 'tm',
-      dayNames: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
-      presetNames: ['This Month', 'Last Month', 'This Week', 'Last Week', 'This Year', 'Last Year', 'From', 'To'],
-      dateFormat: 'dd MMM y',
-      outputFormat: 'YYYY/MM/DD',
-      startOfWeek: 1
-    };
-  }
-
-  ngOnInit() {
-    if (localStorage.getItem('report_period')) {
-      const availableRange = JSON.parse(localStorage.getItem('report_period'));
-      this.availablePeriodFrom = availableRange.start_date;
-      this.availablePeriodTo = availableRange.end_date;    }
-    this.subscriptions.add(this.healthStatusService.statusData.pipe(skip(1)).subscribe(result => {
-      this.healthStatus = result;
-    }));
-  }
-
-  ngAfterViewInit() {
-    this.clearRangePicker();
-  }
-
-  setDateRange() {
-    const availableRange = JSON.parse(localStorage.getItem('report_period'));
-
-    this.availablePeriodFrom = availableRange.start_date;
-    this.availablePeriodTo = availableRange.end_date;
-  }
-
-  clearRangePicker(): void {
-    const rangeLabels = <NodeListOf<Element>>document.querySelectorAll('.value-txt');
-
-    for (let label = 0; label < rangeLabels.length; ++label)
-      rangeLabels[label].classList.add('untouched');
-  }
-
-  onChange(dateRange: string): void {
-    const rangeLabels = <NodeListOf<Element>>document.querySelectorAll('.value-txt');
-
-    for (let label = 0; label < rangeLabels.length; ++label)
-      if (rangeLabels[label].classList.contains('untouched')) {
-        rangeLabels[label].classList.remove('untouched');
-      }
-
-    const reportDateRange = dateRange.split('-');
-    this.setRangeOption.emit({
-      start_date: reportDateRange[0].split('/').join('-'),
-      end_date: reportDateRange[1].split('/').join('-')
-    });
-  }
-
-  rebuild($event): void {
-    this.rebuildReport.emit($event);
-  }
-
-  export($event): void {
-    this.exportReport.emit($event);
-  }
-}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.html b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.html
new file mode 100644
index 0000000..cce35e1
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.html
@@ -0,0 +1,274 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<section class="audit-table-wrapper" id="scrolling" [ngClass]="{'scroll': auditData?.length > 6}">
+  <table mat-table [dataSource]="auditData" class="data-grid audit mat-elevation-z6">
+
+    <ng-container matColumnDef="date">
+      <th mat-header-cell *matHeaderCellDef class="th_date label-header">
+        <div class="label"><span class="text">Date</span></div>
+        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+          <i class="material-icons">
+            <span>more_vert</span>
+          </i>
+        </button>
+      </th>
+      <td mat-cell *matCellDef="let element"> {{element.timestamp | localDate : 'short'}} </td>
+      <td mat-footer-cell *matFooterCellDef class="table-footer">
+      </td>
+    </ng-container>
+
+    <ng-container matColumnDef="user">
+      <th mat-header-cell *matHeaderCellDef class="th_user label-header" [ngStyle]="{'z-index': 99}">
+        <div class="label"><span class="audit-user"> User</span></div>
+        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+          <i class="material-icons">
+            <span *ngIf="filterAuditData.users.length > 0; else user_filtered">filter_list</span>
+            <ng-template #user_filtered>more_vert</ng-template>
+          </i>
+        </button>
+      </th>
+      <td mat-cell *matCellDef="let element" class="th_user">
+        <div class="table-item-wrapper">
+          <span class="table-item user-col">{{element.user || 'N/A'}}</span>
+        </div>
+      </td>
+      <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
+    </ng-container>
+
+    <ng-container matColumnDef="action">
+      <th mat-header-cell *matHeaderCellDef class="th_action label-header" [ngStyle]="{'zIndex': 98, 'display': 'sticky'}">
+        <div class="label">
+          <span class="text"> Action </span>
+        </div>
+        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+          <i class="material-icons">
+            <span>more_vert</span>
+          </i>
+        </button>
+      </th>
+      <td mat-cell *matCellDef=" let element" class="th_action">
+        <div class="action-wrapper">
+          <span
+            class="ellipsis"
+            [matTooltip]="element.action | convertaction"
+            [matTooltipClass]="'full-size-tooltip'"
+            matTooltipPosition="above"
+            [matTooltipDisabled]="element.action?.length < 12"
+          >{{element.action | convertaction }}</span>
+          <div class="audit-info" (click)="openActionInfo(element)" *ngIf="element.info">
+            <i class="material-icons">info</i>
+          </div>
+        </div>
+      </td>
+      <td mat-footer-cell *matFooterCellDef  class="table-footer"></td>
+    </ng-container>
+
+    <ng-container matColumnDef="project">
+      <th mat-header-cell *matHeaderCellDef class="th_project label-header">
+        <div class="label"><span class="text">Project</span></div>
+        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+          <i class="material-icons">
+            <span *ngIf="filterAuditData.projects.length > 0; else user_filtered">filter_list</span>
+            <ng-template #user_filtered>more_vert</ng-template>
+          </i>
+        </button>
+      </th>
+      <td mat-cell *matCellDef="let element" class="th_project">
+        <div class="table-item-wrapper">
+          <span class="table-item project">{{element.project || 'N/A'}}</span>
+        </div>
+      </td>
+      <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
+    </ng-container>
+
+    <ng-container matColumnDef="resource-type">
+      <th mat-header-cell *matHeaderCellDef class="th_resource-type label-header">
+        <div class="label"><span class="text">Resource type</span></div>
+        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+          <i class="material-icons">
+            <span *ngIf="filterAuditData.resource_types.length > 0; else user_filtered">filter_list</span>
+            <ng-template #user_filtered>more_vert</ng-template>
+          </i>
+        </button>
+      </th>
+      <td mat-cell *matCellDef="let element" class="th_resource-type">
+        <div class="table-item-wrapper">
+          <span class="table-item">
+            {{element.type ? (element.type | convertaction) : 'N/A'}}
+          </span>
+        </div>
+      </td>
+      <td mat-footer-cell *matFooterCellDef class="table-footer" [colSpan]="3" >
+        <div class="pagination-wrapper">
+          <div class="selected-items-wrapper">
+            <span>Items per page:</span>
+            <div class="select-wrapper">
+              <div class="mat-reset">
+                <div class="control selector-wrapper">
+                  <mat-form-field>
+                    <mat-label></mat-label>
+                    <mat-select [(value)]="showItemsPrPage">
+                      <mat-option *ngFor="let item of itemsPrPage" [value]="item" (click)="setItemsPrPage(item)">
+                        {{ item }}</mat-option>
+                    </mat-select>
+                    <button class="caret">
+                      <i class="material-icons">keyboard_arrow_down</i>
+                    </button>
+                  </mat-form-field>
+                </div>
+              </div>
+            </div>
+          </div>
+          <span>
+            <span>{{firstItem}}</span> - <span>{{(lastItem < allItems) ? lastItem: allItems}}</span> of <span>{{allItems}}</span>
+          </span>
+          <span>
+            <span [ngClass]="{'not-active':  !isNavigationDisabled || firstItem === 1}">
+              <span class="navigation-butts" (click)="loadItemsForPage('first')" [ngClass]="{'not-allowed': firstItem === 1 || !isNavigationDisabled}">
+                <i class="material-icons">first_page</i>
+              </span>
+            </span>
+            <span [ngClass]="{'not-active': firstItem === 1 || !isNavigationDisabled}">
+              <span class="navigation-butts" (click)="loadItemsForPage('previous')" [ngClass]="{'not-allowed': firstItem === 1 || !isNavigationDisabled}">
+                <i class="material-icons">keyboard_arrow_left</i>
+              </span>
+            </span>
+            <span [ngClass]="{'not-active': lastItem >= allItems || !isNavigationDisabled}">
+              <span class="navigation-butts" (click)="loadItemsForPage('next')" [ngClass]="{'not-allowed': lastItem >= allItems || !isNavigationDisabled}">
+                <i class="material-icons">keyboard_arrow_right</i>
+              </span>
+            </span>
+            <span [ngClass]="{'not-active': lastItem >= allItems || !isNavigationDisabled}">
+              <span class="navigation-butts" (click)="loadItemsForPage('last')" [ngClass]="{'not-allowed': lastItem >= allItems || !isNavigationDisabled}">
+                <i class="material-icons">last_page</i>
+              </span>
+            </span>
+          </span>
+        </div>
+      </td>
+    </ng-container>
+
+    <ng-container matColumnDef="resource">
+      <th mat-header-cell *matHeaderCellDef class="th_resource label-header">
+        <div class="label"><span class="text">Resource</span></div>
+        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+          <i class="material-icons">
+            <span *ngIf="filterAuditData.resources.length > 0; else user_filtered">filter_list</span>
+            <ng-template #user_filtered>more_vert</ng-template>
+          </i>
+        </button>
+      </th>
+      <td mat-cell *matCellDef="let element" class="th_resource">
+        <div class="table-item-wrapper">
+          <span 
+            class="ellipsis"
+            [matTooltip]="element.resourceName || 'N/A'"
+            matTooltipPosition="above">
+            {{element.resourceName || 'N/A'}}
+          </span>
+        </div>
+      </td>
+      <td mat-footer-cell *matFooterCellDef class="table-footer" [hidden]="true">
+
+      </td>
+    </ng-container>
+
+    <ng-container matColumnDef="buttons">
+      <th mat-header-cell *matHeaderCellDef class="th_buttons label-header"></th>
+      <td mat-cell *matCellDef="let element"></td>
+      <td mat-footer-cell *matFooterCellDef class="table-footer" [hidden]="true">
+      </td>
+    </ng-container>
+
+<!--   AUDIT FILTER-->
+    <ng-container matColumnDef="user-filter">
+      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+        <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="'users'"
+                               [items]="filterConfiguration.users" [model]="filterAuditData.users"></multi-select-dropdown>
+      </th>
+    </ng-container>
+
+    <ng-container matColumnDef="project-filter">
+      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+        <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="'projects'"
+                               [items]="filterConfiguration.projects" [model]="filterAuditData.projects"></multi-select-dropdown>
+      </th>
+    </ng-container>
+
+    <ng-container matColumnDef="resource-filter">
+      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+        <multi-select-dropdown
+          class="audit-resources"
+          *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="'resources'"
+                               [items]="filterConfiguration.resources" [model]="filterAuditData.resources"></multi-select-dropdown>
+      </th>
+    </ng-container>
+
+    <ng-container matColumnDef="resource-type-filter">
+      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+        <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="'resource_types'"
+                               [items]="filterConfiguration.resource_types" [model]="filterAuditData.resource_types"></multi-select-dropdown>
+      </th>
+    </ng-container>
+
+    <ng-container matColumnDef="actions-filter">
+      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+
+      </th>
+    </ng-container>
+
+    <ng-container matColumnDef="date-filter">
+      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+      </th>
+    </ng-container>
+
+    <ng-container matColumnDef="filter-buttons" stickyEnd>
+      <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+        <div class="actions audit-actions">
+          <button mat-icon-button class="btn reset" (click)="resetFilterConfigurations()" [disabled]="!isFilterSelected">
+            <i class="material-icons">close</i>
+          </button>
+
+          <button mat-icon-button class="btn apply" (click)="buildAuditGrid(true)" [disabled]="isNavigationDisabled">
+            <i class="material-icons">done</i>
+          </button>
+        </div>
+      </th>
+    </ng-container>
+
+    <ng-container matColumnDef="placeholder">
+      <td mat-footer-cell *matFooterCellDef colspan="7" class="info">
+        <span *ngIf="!filterConfiguration.users?.length;else noMatch">No data available</span>
+        <ng-template #noMatch>
+          <span>No matches found</span>
+        </ng-template>
+      </td>
+    </ng-container>
+
+    <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true" class="header-row"></tr>
+
+    <tr [hidden]="!collapseFilterRow" mat-header-row *matHeaderRowDef="displayedFilterColumns; sticky: true"
+      class="filter-row"></tr>
+    <tr mat-row *matRowDef="let row; columns: displayedColumns;" class="content-row"></tr>
+    <tr [hidden]="!auditData?.length" mat-footer-row *matFooterRowDef="displayedColumns"></tr>
+
+    <tr [hidden]="auditData?.length" mat-footer-row *matFooterRowDef="['placeholder']"></tr>
+  </table>
+</section>
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.scss b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.scss
new file mode 100644
index 0000000..4b289b6
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.scss
@@ -0,0 +1,339 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.audit-table-wrapper {
+  position: relative;
+  width: 100%;
+  max-height: calc(100vh - 130px);
+  max-height: -moz-calc(100vh - 130px);
+  max-height: -webkit-calc(100vh - 130px);
+  overflow: visible;
+  box-shadow: 0 3px 5px -1px rgba(0,0,0,.2), 0 6px 10px 0 rgba(0,0,0,.14), 0 1px 18px 0 rgba(0,0,0,.12);
+
+  &.scroll{
+    overflow: auto;
+  }
+
+  .audit {
+    width: 100%;
+    min-width: 1100px;
+    overflow: auto;
+    border-collapse: inherit;
+    box-shadow: none;
+
+    .mat-cell {
+      vertical-align: middle;
+    }
+
+    tr {
+      .th_user {
+        width: 19%;
+        z-index: 9 !important;
+      }
+
+      .th_action {
+        width: 11%;
+        z-index: 8 !important;
+        max-width: 250px;
+      }
+
+      .th_date {
+        width: 14%;
+        z-index: 10 !important;
+        padding-left: 0;
+        max-width: 240px;
+      }
+
+      .th_project {
+        width: 11%;
+        z-index: 7 !important;
+        max-width: 206px;
+      }
+
+      .th_resource {
+        width: 14%;
+        z-index: 5 !important;
+        max-width: 240px;
+      }
+
+      .th_resource-type {
+        width: 14%;
+        z-index: 6 !important;
+        max-width: 240px;
+      }
+
+      .th_buttons {
+        width: 6%;
+        z-index: 4 !important;
+      }
+
+      th {
+        padding-right: 5px;
+        z-index: 2 !important;
+
+        &.th_charges {
+          z-index: 3 !important;
+        }
+      }
+
+      td {
+        font-size: 13px;
+        padding-left: 20px;
+
+        &.info {
+          z-index: 1 !important;
+          text-align: center;
+          padding: 40px;
+        }
+      }
+
+      &.filter-row {
+        th {
+          padding: 5px;
+          font-size: 13px;
+          z-index: 103 !important;
+        }
+
+        .filter-field {
+          font-size: 13px;
+        }
+
+      }
+
+      &.header-row {
+        th {
+          font-size: 11px;
+
+          .label {
+            padding-left: 0;
+          }
+        }
+      }
+    }
+
+
+    .tags {
+      .label {
+        padding-top: 0;
+      }
+    }
+
+    .service {
+      min-width: 175px;
+    }
+
+    .env_name {
+      width: 16%;
+      min-width: 200px;
+    }
+
+    .th_project {
+      width: 12%;
+    }
+
+    .th_type {
+      width: 10%;
+      min-width: 150px;
+    }
+
+    .th_status {
+      width: 8%;
+      min-width: 150px;
+    }
+
+    .th_charges {
+      width: 10%;
+      min-width: 155px;
+      text-align: right;
+
+      .label {
+        padding-top: 0;
+      }
+    }
+
+    .th_project {
+      min-width: 150px;
+    }
+
+    .tags-col {
+      padding: 5px;
+
+      mat-chip {
+        min-height: 20px;
+        padding: 5px 10px;
+        font-size: 13px;
+        max-width: 110px !important;
+        white-space: nowrap;
+        display: inline-block;
+        line-height: 10px;
+        margin: 2px;
+      }
+    }
+
+    .mat-column-charge {
+      text-align: right;
+    }
+
+    .header-row {
+      position: unset;
+
+      .th_charges {
+        padding-top: 0;
+
+        .label {
+          padding-top: 12px;
+        }
+      }
+
+      .label {
+        display: inline-block;
+        padding-top: 13px;
+        vertical-align: super !important;
+
+        .text {
+          padding-left: 20px;
+        }
+      }
+
+      .sort {
+        position: absolute;
+        bottom: 20px;
+
+        &-arrow {
+          width: 6px;
+          height: 6px;
+          border: 3px solid transparent;
+          border-bottom: 3px solid rgba(0, 0, 0, .54);
+          border-left: 3px solid rgba(0, 0, 0, .54);
+          cursor: pointer;
+
+          &.active {
+            border-bottom: 3px solid #35afd5;
+            border-left: 3px solid #35afd5;
+          }
+        }
+
+        .down {
+          transform: rotate(-45deg);
+        }
+
+        .up {
+          transform: rotate(135deg);
+        }
+      }
+    }
+  }
+
+  .table-item-wrapper{
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding-right: 10px;
+    span{
+      cursor: default;
+
+      &::after{
+        content: '';
+        display: block;
+      }
+    }
+  }
+
+  .action-wrapper {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding-right: 10px;
+    span{
+      max-width: 85%;
+    }
+
+    .audit-info {
+      color: lightgray;
+      cursor: pointer;
+      margin-left: 5px;
+    }
+  }
+
+  .dashboard_table_body {
+    td:first-child {
+      cursor: default;
+    }
+
+    .dropdown-multiselect {
+      button {
+        font-size: 13px;
+        height: 34px;
+        padding: 7px 20px;
+      }
+    }
+  }
+}
+
+.selected-items-wrapper {
+  display: flex;
+  align-items: center;
+
+  .select-wrapper {
+    margin-left: 20px;
+    width: 80px;
+  }
+}
+
+.pagination-wrapper {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding-right: 30px;
+
+  .not-active {
+    .navigation-butts {
+      color: lightgray;
+    }
+  }
+
+    .navigation-butts {
+      cursor: pointer;
+      color: #35afd5;
+
+      .not-active {
+        color: lightgray;
+      }
+    }
+  }
+
+
+.audit-actions {
+  text-align: right;
+}
+
+.audit-user {
+  padding-left: 20px;
+}
+
+.table-footer {
+  position: sticky;
+  position: -webkit-sticky;
+  bottom: -1px;
+  background: inherit;
+  border-top: 1px solid #E0E0E0;
+  transform: translateY(-1px);
+  border-bottom: none;
+}
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.ts b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.ts
new file mode 100644
index 0000000..2dc50a2
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.ts
@@ -0,0 +1,338 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import {Component, EventEmitter, Inject, OnInit, Output} from '@angular/core';
+import {FilterAuditModel} from '../filter-audit.model';
+import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material/dialog';
+import {AuditService} from '../../../core/services/audit.service';
+import {SortUtils} from '../../../core/util';
+import {LocalizationService} from '../../../core/services/localization.service';
+import {CompareUtils} from '../../../core/util/compareUtils';
+
+
+export interface AuditItem {
+  action: string;
+  info: string;
+  project: string;
+  resourceName: string;
+  timestamp: number;
+  type: string;
+  user: string;
+  _id: string;
+}
+
+@Component({
+  selector: 'datalab-audit-grid',
+  templateUrl: './audit-grid.component.html',
+  styleUrls: ['./audit-grid.component.scss', '../../../resources/resources-grid/resources-grid.component.scss'],
+
+})
+export class AuditGridComponent implements OnInit {
+  public auditData: Array<AuditItem>;
+  public displayedColumns: string[] = ['date', 'user', 'action', 'project', 'resource-type', 'resource', 'buttons'];
+  public displayedFilterColumns: string[] = ['date-filter', 'user-filter', 'actions-filter',  'project-filter', 'resource-type-filter', 'resource-filter', 'filter-buttons'];
+  public collapseFilterRow: boolean = false;
+  public filterConfiguration: FilterAuditModel = new FilterAuditModel([], [], [], [], [], '', '');
+  public filterAuditData: FilterAuditModel = new FilterAuditModel([], [], [], [], [], '', '');
+  public itemsPrPage: Number[] = [25, 50, 100];
+  public showItemsPrPage: number;
+  public firstItem: number = 1;
+  public lastItem: number;
+  public allItems: number;
+  private copiedFilterAuditData: FilterAuditModel;
+  public isNavigationDisabled: boolean;
+  public isFilterSelected: boolean;
+
+  @Output() resetDateFilter: EventEmitter<any> = new EventEmitter();
+
+
+  constructor(
+    public dialogRef: MatDialogRef<AuditInfoDialogComponent>,
+    public dialog: MatDialog,
+    private auditService: AuditService,
+  ) {
+  }
+
+  ngOnInit() {}
+
+  public buildAuditGrid(filter?: boolean): void {
+    if (!this.showItemsPrPage) {
+      if (window.localStorage.getItem('audit_per_page')) {
+        this.showItemsPrPage = +window.localStorage.getItem('audit_per_page');
+      } else {
+        this.showItemsPrPage = 50;
+      }
+      this.lastItem = this.showItemsPrPage;
+    }
+   this.getAuditData(filter);
+  }
+
+  public getAuditData(filter?: boolean): void {
+    const page = filter ? 1 : Math.ceil(this.lastItem / this.showItemsPrPage);
+    this.copiedFilterAuditData = JSON.parse(JSON.stringify(this.filterAuditData));
+    this.auditService.getAuditData(this.filterAuditData, page, this.showItemsPrPage).subscribe(auditData => {
+      if (filter) this.changePage('first');
+      this.auditData = auditData[0].audit;
+      this.allItems = auditData[0]['page_count'];
+      this.filterConfiguration = new FilterAuditModel(
+        auditData[0].user_filter.filter(v => v),
+        auditData[0].resource_name_filter.filter(v => v),
+        auditData[0].resource_type_filter.filter(v => v),
+        auditData[0].project_filter.filter(v => v),
+        [],
+        '',
+        ''
+      );
+      this.checkFilters();
+    });
+  }
+
+  public refreshAuditPage(): void {
+    this.filterAuditData = this.copiedFilterAuditData;
+    this.getAuditData();
+  }
+
+  public setAvaliblePeriod(period): void {
+    this.filterAuditData.date_start = period.start_date;
+    this.filterAuditData.date_end = period.end_date;
+    this.buildAuditGrid(true);
+  }
+
+  public toggleFilterRow(): void {
+    this.collapseFilterRow = !this.collapseFilterRow;
+  }
+
+  public onUpdate($event): void {
+    this.filterAuditData[$event.type] = $event.model;
+    this.checkFilters();
+  }
+
+  private checkFilters(): void {
+    this.isNavigationDisabled = CompareUtils.compareFilters(this.filterAuditData, this.copiedFilterAuditData);
+    this.isFilterSelected = Object.keys(this.filterAuditData).some(v => this.filterAuditData[v].length > 0);
+  }
+
+  public openActionInfo(element: AuditItem): void {
+    if (element.type === 'GROUP' && element.info.indexOf('role') !== -1) {
+      this.dialog.open(AuditInfoDialogComponent, { data: {element, dialogSize: 'big'}, panelClass: 'modal-xl-m' });
+    } else {
+      this.dialog.open(AuditInfoDialogComponent, { data: {element, dialogSize: 'small'}, panelClass: 'modal-md' });
+    }
+  }
+
+  public setItemsPrPage(item: number): void {
+    window.localStorage.setItem('audit_per_page', item.toString());
+    this.firstItem = 1;
+    if (this.lastItem !== item) {
+      this.lastItem = item;
+      this.buildAuditGrid();
+    }
+  }
+
+  private changePage(action: string): void {
+    if (action === 'first') {
+      this.firstItem = 1;
+      this.lastItem = this.showItemsPrPage;
+    } else if (action === 'previous') {
+      this.firstItem = this.firstItem - this.showItemsPrPage;
+      this.lastItem = this.lastItem % this.showItemsPrPage === 0 ?
+        this.lastItem - this.showItemsPrPage : this.lastItem - (this.lastItem % this.showItemsPrPage);
+    } else if (action === 'next') {
+      this.firstItem = this.firstItem + this.showItemsPrPage;
+      this.lastItem = (this.lastItem + this.showItemsPrPage) > this.allItems ?
+        this.allItems : this.lastItem + this.showItemsPrPage;
+    } else if (action === 'last') {
+      this.firstItem = this.allItems % this.showItemsPrPage === 0 ?
+        this.allItems - this.showItemsPrPage : this.allItems - (this.allItems % this.showItemsPrPage) + 1;
+      this.lastItem = this.allItems;
+    }
+  }
+
+  public loadItemsForPage(action: string): void {
+    this.changePage(action);
+    this.buildAuditGrid();
+  }
+
+  public resetFilterConfigurations(): void {
+    this.filterAuditData = FilterAuditModel.getDefault();
+    this.resetDateFilter.emit();
+    this.buildAuditGrid(true);
+  }
+}
+
+
+@Component({
+  selector: 'audit-info-dialog',
+  template: `
+      <div id="dialog-box">
+          <header class="dialog-header">
+              <h4 class="modal-title">{{data.element.action | convertaction}}</h4>
+              <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
+          </header>
+          <div mat-dialog-content class="content audit-info-content" [ngClass]="{'pb-40': actionList[0].length > 1}">
+            <mat-list *ngIf="actionList[0].length > 1 && data.element.action !== 'FOLLOW_LINK'|| data.element.info.indexOf('Update quota') !== -1;else message">
+              <ng-container *ngIf="data.element.info.indexOf('Update quota') === -1;else quotas">
+
+                <mat-list-item class="list-header">
+                  <div class="info-item-title" [ngClass]="{'same-column-width': data.dialogSize === 'small'}">Action</div>
+                  <div class="info-item-data" [ngClass]="{'same-column-width': data.dialogSize === 'small'}"> Description </div>
+                </mat-list-item>
+
+                <div class="scrolling-content mat-list-wrapper" id="scrolling">
+                  <mat-list-item class="list-item" *ngFor="let action of actionList">
+                    <div *ngIf="(data.element.action === 'upload' && action[0] === 'File(s)') || (data.element.action === 'download' && action[0] === 'File(s)');else multiAction" class="info-item-title">File</div>
+                    <ng-template #multiAction>
+                       <div class="info-item-title" [ngClass]="{'same-column-width': data.dialogSize === 'small'}">{{action[0]}}</div>
+                    </ng-template>
+                    <div class="info-item-data" [ngClass]="{'same-column-width': data.dialogSize === 'small'}" *ngIf="action[0] === 'File(s)'">
+                      <div class="file-description ellipsis"
+                           *ngFor="let description of action[1]?.split(',')"
+                           [matTooltip]="description"
+                           matTooltipPosition="above">
+                        {{description}}
+                      </div>
+                    </div>
+                    <div class="info-item-data" [ngClass]="{'same-column-width': data.dialogSize === 'small'}" *ngIf="action[0] !== 'File(s)'">
+                       <div 
+                          *ngFor="let description of action[1]?.split(',')"
+                          [matTooltip]="description"
+                          class="ellipsis"
+                          [ngStyle]="description.length < 20 ? {'width' :'fit-content'} : {'width':'100%'}"
+                          matTooltipPosition="above"
+                          matTooltipClass="mat-tooltip-description">
+                        {{description}}
+                        </div>
+                    </div>
+                  </mat-list-item>
+                </div>
+              </ng-container>
+
+              <ng-template #quotas>
+                <mat-list-item class="list-header">
+                  <div class="same-column-width" >Action</div>
+                  <div class="info-item-title"> Previous value </div>
+                  <div class="info-item-quota"> New value </div>
+                </mat-list-item>
+                <div class="scrolling-content mat-list-wrapper" id="scrolling">
+                  <mat-list-item class="list-item" *ngFor="let action of updateBudget">
+                    <div class="same-column-width">{{action[0]}}</div>
+                    <div class="info-item-title">
+                      {{action[1]}}
+                    </div>
+                    <div class="info-item-quota">
+                      {{action[2]}}
+                    </div>
+                  </mat-list-item>
+                </div>
+              </ng-template>
+            </mat-list>
+            <ng-template #message>
+              <div class="message-wrapper">
+                <p *ngIf="data.element.type !== 'COMPUTE'; else computation">
+                  <span *ngIf="data.element.info.indexOf('Scheduled') !== -1;else notScheduledNotebook">{{data.element.action | titlecase}} by scheduler.</span>
+                  <ng-template #notScheduledNotebook>
+                    <span *ngIf="data.element.type === 'WEB_TERMINAL'">{{data.element.info}} <span class="strong">{{data.element.resourceName}}</span>.</span>
+                    <span *ngIf="data.element.type !== 'WEB_TERMINAL' && data.element.type !== 'EDGE_NODE'">{{data.element.info}}.</span>
+                    <span *ngIf="data.element.type === 'EDGE_NODE' && data.element.action === 'CREATE'">
+                      Create edge node for endpoint <span class="strong">{{data.element.resourceName}}</span>, requested in project <span class="strong">{{data.element.project}}</span>.
+                    </span>
+                  </ng-template>
+                </p>
+                <ng-template #computation>
+                  <p *ngIf="data.element.info.indexOf('Scheduled') !== -1;else notScheduled"> {{data.element.action | titlecase}} by scheduler, requested for notebook <span class="strong">{{data.element.info.split(' ')[data.element.info.split(' ').length - 1] }}</span>.</p>
+                  <ng-template #notScheduled>
+                    <p>
+                      <span *ngIf="data.element.action === 'FOLLOW_LINK'">{{info.action | titlecase}} compute <span class="strong">{{info.cluster}}</span>&nbsp;<span>{{info.clusterType}}</span> link, requested for notebook <span class="strong">{{info.notebook}}</span>.</span>
+                      <span *ngIf="data.element.action !== 'FOLLOW_LINK'">{{data.element.action | titlecase}} compute <span class="strong">{{data.element.resourceName}}</span>, requested for notebook <span class="strong">{{data.element.info.split(' ')[data.element.info.split(' ').length - 1] }}</span>.</span>
+                    </p>
+                    </ng-template>
+                </ng-template>
+              </div>
+          </ng-template></div>
+      </div>
+  `,
+
+  styles: [`
+    .content { color: #718ba6; padding: 20px 30px; font-size: 14px; font-weight: 400; margin: 0; }
+    .pb-40 {  padding-bottom: 40px; }
+    .info .confirm-dialog { color: #607D8B; }
+    header { display: flex; justify-content: space-between; color: #607D8B; }
+    header h4 i { vertical-align: bottom; }
+    header a i { font-size: 20px; }
+    header a:hover i { color: #35afd5; cursor: pointer; }
+    .scrolling-content{overflow-y: auto; max-height: 200px; }
+    label{cursor: pointer}
+    .message-wrapper{min-height: 70px;; display: flex; align-items: center}
+    .mat-list-wrapper{padding-top: 5px;}
+    .list-item{color: #718ba6; height: auto; line-height: 20px; font-size: 14px}
+    .info-item-title{width: 40%; padding: 10px 0;font-size: 14px;}
+    .info-item-quota{width: 30%; padding: 10px 0;font-size: 14px;}
+    .list-header {padding-top: 5px;}
+    .info-item-data{width: 60%; text-align: left; padding: 10px 0; font-size: 14px; cursor: default;}
+    .file-description{ overflow: hidden; display: block; direction: rtl; font-size: 14px;}
+    .same-column-width{width: 50%; padding: 10px 0; font-size: 14px;}
+  `]
+})
+export class AuditInfoDialogComponent {
+  actionList: string[][];
+  updateBudget: string[][] = [];
+  info;
+  constructor(
+    public dialogRef: MatDialogRef<AuditInfoDialogComponent>,
+    @Inject(MAT_DIALOG_DATA) public data: any
+  ) {
+    if (data.element.action === 'FOLLOW_LINK' && data.element.type === 'COMPUTE') {
+      this.info = JSON.parse(data.element.info);
+    }
+    if (data.element.info.indexOf('Update quota') !== -1) {
+      this.updateBudget = data.element.info.split('\n').reduce((acc, v, i, arr) => {
+        const row = v.split(':').map((el, index) => {
+          if (el.indexOf('->') !== -1) {
+            el = el.split('->');
+          } else if (index === 1 && el.indexOf('->') === -1) {
+            el = ['', el];
+          }
+          return el;
+        });
+        acc.push(SortUtils.flatDeep(row, 1));
+        return acc;
+      }, []);
+      // this.data.element.info.replace(/->/g, ' ').split('\n').forEach( (val, j) => {
+      //   this.updateBudget[j] = [];
+      //   val.split(' ')
+      //     .forEach((v, i, arr) => {
+      //       if (arr[0] === 'Update') {
+      //         if (i === 1) {
+      //           this.updateBudget[j].push(`${arr[0]} ${arr[1]}`);
+      //         }
+      //         if (i > 1) {
+      //           this.updateBudget[j].push(arr[i]);
+      //         }
+      //       } else {
+      //         this.updateBudget[j].push(arr[i]);
+      //       }
+      //
+      //     });
+      // });
+    }
+    this.actionList = data.element.info.split('\n').map(v => v.split(':')).filter(v => v[0] !== '');
+  }
+}
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-toolbar/audit-toolbar.component.html b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-toolbar/audit-toolbar.component.html
new file mode 100644
index 0000000..468ebb3
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-toolbar/audit-toolbar.component.html
@@ -0,0 +1,41 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<section class="audit-toolbar">
+  <div class="info_color">
+    <div class="general" *ngIf="reportData">
+      <div><span>Service base name: </span><strong>{{ reportData.sbn }}</strong></div>
+      <div *ngIf="reportData.tag_resource_id"><span>Resource tag ID:
+        </span><strong>{{ reportData.tag_resource_id }}</strong></div>
+      <div class="report-period info_color" *ngIf="availablePeriodFrom && availablePeriodTo">
+        <span>Available reporting period from:</span>
+        <strong>{{ availablePeriodFrom | date }} </strong>
+        to: <strong>{{ availablePeriodTo | date }}</strong>
+      </div>
+    </div>
+  </div>
+
+  <div id="range-picker">
+    <ng-daterangepicker [(ngModel)]="value" [options]="options" (ngModelChange)="onChange($event)"></ng-daterangepicker>
+  </div>
+  <div class="action-butt">
+    <button mat-raised-button class="butt" (click)="rebuild($event)">
+      <i class="material-icons refresh-icon">autorenew</i>Refresh
+    </button>
+  </div>
+</section>
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-toolbar/audit-toolbar.component.scss b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-toolbar/audit-toolbar.component.scss
new file mode 100644
index 0000000..0bf0071
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-toolbar/audit-toolbar.component.scss
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+section.audit-toolbar {
+  display: flex;
+  justify-content: space-between;
+  font-weight: 300;
+  width: 100%;
+
+  >div {
+    width: 33%;
+  }
+
+  >div:nth-child(2) {
+    text-align: center;
+  }
+
+  >div:nth-child(3) {
+    text-align: right;
+  }
+
+  .action-butt {
+    align-self: center;
+  }
+
+  button {
+    &:first-child {
+      margin-right: 0;
+    }
+  }
+
+  .butt-report-range {
+    width: 240px;
+    margin-right: 10px;
+  }
+
+  .general {
+    font-size: 13px;
+
+    div {
+      span {
+        width: 190px;
+        display: inline-block;
+      }
+    }
+  }
+}
+
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-toolbar/audit-toolbar.component.ts b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-toolbar/audit-toolbar.component.ts
new file mode 100644
index 0000000..680dc0b
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-toolbar/audit-toolbar.component.ts
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Component, OnInit, AfterViewInit, Output, EventEmitter, ViewEncapsulation, ViewChild } from '@angular/core';
+import { NgDateRangePickerOptions } from 'ng-daterangepicker';
+import { DICTIONARY } from '../../../../dictionary/global.dictionary';
+import {skip} from 'rxjs/operators';
+import {Subscription} from 'rxjs';
+import {HealthStatusService} from '../../../core/services';
+import {GeneralEnvironmentStatus} from '../../../administration/management/management.model';
+
+@Component({
+  selector: 'audit-toolbar',
+  templateUrl: './audit-toolbar.component.html',
+  styleUrls: ['./audit-toolbar.component.scss'],
+  encapsulation: ViewEncapsulation.None
+})
+export class AuditToolbarComponent implements OnInit, AfterViewInit {
+  readonly DICTIONARY = DICTIONARY;
+  value: any;
+  reportData: any;
+  availablePeriodFrom: string;
+  availablePeriodTo: string;
+  subscriptions: Subscription = new Subscription();
+  healthStatus: GeneralEnvironmentStatus;
+
+  rangeOptions = { 'YTD': 'Year To Date', 'QTD': 'Quarter To Date', 'MTD': 'Month To Date', 'reset': 'All Period Report' };
+  options: NgDateRangePickerOptions;
+  rangeLabels: any;
+
+  @Output() rebuildAudit: EventEmitter<{}> = new EventEmitter();
+  @Output() exportReport: EventEmitter<{}> = new EventEmitter();
+  @Output() setRangeOption: EventEmitter<{}> = new EventEmitter();
+
+  constructor(private healthStatusService: HealthStatusService) {
+    this.options = {
+      theme: 'default',
+      range: 'tm',
+      dayNames: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+      presetNames: ['This Month', 'Last Month', 'This Week', 'Last Week', 'This Year', 'Last Year', 'From', 'To'],
+      dateFormat: 'dd MMM y',
+      outputFormat: 'YYYY/MM/DD',
+      startOfWeek: 1
+    };
+  }
+
+  ngOnInit() {
+    this.setInitDatapickerConfig();
+  }
+
+  ngAfterViewInit() {
+    this.clearRangePicker();
+  }
+
+  private setInitDatapickerConfig() {
+    const labels = <NodeListOf<Element>>document.querySelectorAll('.label-txt');
+    const rangeLabels = <NodeListOf<Element>>document.querySelectorAll('.value-txt');
+    if (labels && rangeLabels) {
+      labels[0].innerHTML = 'From date';
+      labels[1].innerHTML = 'To date';
+      for (let label = 0; label < rangeLabels.length; ++label) {
+        rangeLabels[label].classList.add('d-none');
+        rangeLabels[label].classList.add('untouched');
+      }
+    }
+  }
+
+  setDateRange() {
+    const availableRange = JSON.parse(localStorage.getItem('report_period'));
+    const rangeLabels = <NodeListOf<Element>>document.querySelectorAll('.value-txt');
+    for (let label = 0; label < rangeLabels.length; ++label) {
+      rangeLabels[label].classList.remove('d-none');
+
+    }
+    this.availablePeriodFrom = availableRange.start_date;
+    this.availablePeriodTo = availableRange.end_date;
+  }
+
+  clearRangePicker(): void {
+    this.setInitDatapickerConfig();
+  }
+
+  onChange(dateRange: string): void {
+    const rangeLabels = <NodeListOf<Element>>document.querySelectorAll('.value-txt');
+
+    for (let label = 0; label < rangeLabels.length; ++label)
+      if (rangeLabels[label].classList.contains('untouched')) {
+        rangeLabels[label].classList.remove('untouched');
+        rangeLabels[label].classList.remove('d-none');
+      }
+
+
+    const labels = <NodeListOf<Element>>document.querySelectorAll('.label-txt');
+    labels[0].innerHTML = 'From:';
+    labels[1].innerHTML = 'To:';
+
+    const reportDateRange = dateRange.split('-');
+    this.setRangeOption.emit({
+      start_date: reportDateRange[0].split('/').join('-'),
+      end_date: reportDateRange[1].split('/').join('-')
+    });
+  }
+
+  rebuild($event): void {
+    this.rebuildAudit.emit($event);
+  }
+
+  // export($event): void {
+  //   this.exportReport.emit($event);
+  // }
+
+
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.component.ts b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.component.ts
new file mode 100644
index 0000000..168f6df
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.component.ts
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+import {Component, OnInit, OnDestroy, ViewChild} from '@angular/core';
+import { ToastrService } from 'ngx-toastr';
+import {HealthStatusService} from '../../core/services';
+import { DICTIONARY} from '../../../dictionary/global.dictionary';
+import {AuditToolbarComponent} from './audit-toolbar/audit-toolbar.component';
+import {AuditGridComponent} from './audit-grid/audit-grid.component';
+
+@Component({
+  selector: 'datalab-reporting',
+  template: `
+    <div class="base-retreat">
+      <audit-toolbar (rebuildAudit)="rebuildAuditGrid()" (setRangeOption)="setRangeOption($event)">
+      </audit-toolbar>
+      <mat-divider></mat-divider>
+      <datalab-audit-grid (resetDateFilter)="resetDatepicker()"></datalab-audit-grid>
+    </div>
+
+  `,
+  styles: [`
+    footer {
+      position: fixed;
+      left: 0;
+      bottom: 0;
+      width: 100%;
+      background: #a1b7d1;
+      color: #ffffff;
+      text-align: right;
+      padding: 5px 15px;
+      font-size: 18px;
+      box-shadow: 0 9px 18px 15px #f5f5f5;
+    }
+  `]
+})
+export class AuditComponent implements OnInit, OnDestroy {
+  readonly DICTIONARY = DICTIONARY;
+
+  @ViewChild(AuditGridComponent, { static: true }) auditGrid: AuditGridComponent;
+  @ViewChild(AuditToolbarComponent, { static: true }) auditToolbar: AuditToolbarComponent;
+
+  constructor(
+    private healthStatusService: HealthStatusService,
+    public toastr: ToastrService,
+  ) { }
+
+  ngOnInit() {
+    this.getEnvironmentHealthStatus();
+    this.buildAuditReport();
+  }
+
+  ngOnDestroy() {
+  }
+
+  public buildAuditReport(): void {
+    this.auditGrid.buildAuditGrid();
+  }
+
+  public rebuildAuditGrid(): void {
+    this.auditGrid.refreshAuditPage();
+  }
+
+  private getEnvironmentHealthStatus(): void {
+    this.healthStatusService.getEnvironmentHealthStatus()
+      .subscribe();
+  }
+
+  public setRangeOption(event): void {
+    this.auditGrid.setAvaliblePeriod(event);
+  }
+
+  public resetDatepicker(): void {
+    this.auditToolbar.clearRangePicker();
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.module.ts b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.module.ts
new file mode 100644
index 0000000..dbffc6a
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.module.ts
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { NgDateRangePickerModule } from 'ng-daterangepicker';
+import { MaterialModule } from '../../shared/material.module';
+import { FormControlsModule } from '../../shared/form-controls';
+import { KeysPipeModule, LineBreaksPipeModule, ConvertActionPipeModule } from '../../core/pipes';
+import {AuditComponent} from './audit.component';
+import {AuditGridComponent, AuditInfoDialogComponent} from './audit-grid/audit-grid.component';
+import {AuditToolbarComponent} from './audit-toolbar/audit-toolbar.component';
+import {LocalDatePipeModule} from '../../core/pipes/local-date-pipe';
+import {LocalCurrencyModule} from '../../core/pipes/local-currency-pipe';
+
+@NgModule({
+    imports: [
+        CommonModule,
+        FormsModule,
+        FormControlsModule,
+        ConvertActionPipeModule,
+        KeysPipeModule,
+        LineBreaksPipeModule,
+        NgDateRangePickerModule,
+        MaterialModule,
+        LocalDatePipeModule,
+        LocalCurrencyModule
+    ],
+  declarations: [
+    AuditGridComponent,
+    AuditToolbarComponent,
+    AuditComponent,
+    AuditInfoDialogComponent
+  ],
+  entryComponents: [AuditInfoDialogComponent],
+  exports: [AuditComponent]
+})
+export class AuditModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/filter-audit.model.ts b/services/self-service/src/main/resources/webapp/src/app/reports/audit/filter-audit.model.ts
new file mode 100644
index 0000000..b1b6a65
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/filter-audit.model.ts
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export class FilterAuditModel {
+
+  static getDefault(): FilterAuditModel {
+    return new FilterAuditModel([], [], [], [], [], '', '');
+  }
+
+  constructor(
+    public users: Array<string>,
+    public resources: Array<string>,
+    public resource_types: Array<string>,
+    public projects: Array<string>,
+    public actions: Array<string>,
+    public date_start: string,
+    public date_end: string,
+  ) { }
+
+  defaultConfigurations(): void {
+    this.users = [];
+    this.projects = [];
+    this.resource_types = [];
+    this.resources = [];
+    this.actions = [];
+    this.date_start = '';
+    this.date_end = '';
+
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.html b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.html
new file mode 100644
index 0000000..11a3411
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.html
@@ -0,0 +1,324 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<div 
+    class="billing-page-wrapper scrolling" 
+    #pageWrapper 
+    [ngClass]="{'scroll': reportData?.length < 5}" 
+    (scroll)="scrollTable($event)">
+  <div class="wrapper" #wrapper>
+    <div 
+        class="nav-buttons" 
+        [ngStyle]="tableWrapper.scrollHeight === tableWrapper.clientHeight ? {'width': '100%'} : 
+          {'width': userAgentIndex === -1 ? 'calc(100% - 3px)' : 'calc(100% - 8px)'}"
+        *ngIf="tableWrapper.offsetWidth - tableEl['offsetWidth'] < 0 && reportData?.length">
+      <div class="button-container" >
+        <button 
+            mat-mini-fab aria-label="Scroll left" 
+            (click)="scrollTo('left')" 
+            [ngClass]="{'not-allowed': tableWrapper.scrollLeft === 0 && reportData?.length}">
+          <mat-icon [ngClass]="{'highlight': tableWrapper.scrollLeft !== 0 || pageWrapper.scrollLeft !== 0 && reportData?.length < 5}">
+            keyboard_arrow_left
+          </mat-icon>
+        </button>
+      </div>
+      <div class="button-container" [ngClass]="{'not-allowed': this.checkMaxRight()}">
+        <button mat-mini-fab aria-label="Scroll right"
+                (click)="scrollTo('right')"
+                [ngClass]="{'not-allowed': !(isMaxRight | async)}">
+          <mat-icon [ngClass]="{'highlight': isMaxRight | async }">keyboard_arrow_right</mat-icon>
+        </button>
+      </div>
+      <div class="totaL-item strong" >
+        Total <span>{{fullReport.total_cost | localcurrency}}</span>
+      </div>
+    </div>
+
+    <div class="nav-buttons"
+        [ngStyle]="tableWrapper.scrollHeight === tableWrapper.clientHeight ? {'width': '100%'} : 
+          {'width': userAgentIndex === -1 ? 'calc(100% - 3px)' : 'calc(100% - 8px)'}" 
+        *ngIf="!(tableWrapper.offsetWidth - tableEl['offsetWidth'] < 0) && reportData?.length">
+      <div class="totaL-item strong" >
+        Total <span>{{fullReport.total_cost | localcurrency}}</span>
+      </div>
+    </div>
+    
+    <section class="table-wrapper" id="scrolling" #tableWrapper (scroll)="scrollTable($event)" [ngStyle]="!reportData?.length && {'overflow': 'auto'}" [ngClass]="{'scroll': reportData?.length}">
+
+      <table mat-table [dataSource]="reportData" class="data-grid reporting" #table>
+
+        <ng-container matColumnDef="name">
+          <th mat-header-cell *matHeaderCellDef class="env_name label-header">
+            <div class="label"><span class="text"> Resource name</span></div>
+            <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+              <i class="material-icons">
+                  <span *ngIf="filteredReportData.datalabId.length > 0; else datalabId_filtered">filter_list</span>
+                  <ng-template #datalabId_filtered>more_vert</ng-template>
+              </i>
+            </button>
+          </th>
+            <td mat-cell *matCellDef="let element"><span class="table-item">{{element.datalabId}}</span></td>
+          <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
+        </ng-container>
+
+        <ng-container matColumnDef="user">
+          <th mat-header-cell *matHeaderCellDef class="th_user label-header">
+
+            <div class="label">
+              <div class="sort sort-user">
+                <div class="sort-arrow up" (click)="sortBy('user', 'down')" [ngClass]="{'active': !!this.active['userdown']}"></div>
+                <div class="sort-arrow down" (click)="sortBy('user', 'up')" [ngClass]="{'active': !!this.active['userup']}"></div>
+              </div>
+              <span class="text"> User </span>
+            </div>
+
+            <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+              <i class="material-icons">
+                <span *ngIf="filteredReportData.users.length > 0; else user_filtered">filter_list</span>
+                <ng-template #user_filtered>more_vert</ng-template>
+              </i>
+            </button>
+          </th>
+          <td mat-cell *matCellDef=" let element">
+            <div
+              class="ellipsis user-name-cell"
+              [ngStyle]="element.user?.length < 20 ? {'max-width' :'fit-content'} : {'max-width':'200px'}"
+              [matTooltip]="element.user"
+              matTooltipPosition="above"
+              matTooltipClass="billing-user-name">
+              {{element.user}}
+            </div>
+          </td>
+          <td mat-footer-cell *matFooterCellDef  class="table-footer"></td>
+        </ng-container>
+
+        <ng-container matColumnDef="project">
+          <th mat-header-cell *matHeaderCellDef class="th_project label-header">
+
+            <div class="label">
+              <div class="sort sort-project">
+                <div class="sort-arrow up" (click)="sortBy('project', 'down')" [ngClass]="{'active': !!this.active['projectdown']}"></div>
+                <div class="sort-arrow down" (click)="sortBy('project', 'up')" [ngClass]="{'active': !!this.active['projectup']}"></div>
+              </div>
+              <span class="text">Project</span>
+            </div>
+
+            <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+              <i class="material-icons">
+                <span *ngIf="filteredReportData.projects.length > 0; else project_filtered">filter_list</span>
+                <ng-template #project_filtered>more_vert</ng-template>
+              </i>
+            </button>
+          </th>
+          <td mat-cell *matCellDef="let element"> {{element.project}} </td>
+          <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
+        </ng-container>
+
+        <ng-container matColumnDef="type">
+          <th mat-header-cell *matHeaderCellDef class="th_type label-header">
+            <div class="label"><span class="text"> Resource Type</span> </div>
+            <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+              <i class="material-icons">
+                <span *ngIf="filteredReportData.resource_type.length > 0; else type_filtered">filter_list</span>
+                <ng-template #type_filtered>more_vert</ng-template>
+              </i>
+            </button>
+          </th>
+          <td mat-cell *matCellDef="let element"> {{element.resource_type | titlecase}} </td>
+          <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
+        </ng-container>
+
+        <ng-container matColumnDef="status">
+          <th mat-header-cell *matHeaderCellDef class="th_status label-header">
+            <div class="label"><span class="text"> Status</span> </div>
+            <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+              <i class="material-icons">
+                <span *ngIf="filteredReportData.statuses.length > 0; else status_filtered">filter_list</span>
+                <ng-template #status_filtered>more_vert</ng-template>
+              </i>
+            </button>
+          </th>
+          <td mat-cell *matCellDef="let element">
+        <span class="status" ngClass="{{ element.status.toLowerCase() || '' }}"
+              *ngIf="element.status">{{ element.status.toLowerCase() }}</span>
+            <span *ngIf="!element.status">N/A</span>
+          </td>
+          <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
+        </ng-container>
+
+        <ng-container matColumnDef="shape">
+          <th mat-header-cell *matHeaderCellDef class="th_shape label-header">
+            <div class="label"><span class="text"> Instance size</span></div>
+            <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+              <i class="material-icons">
+            <span
+              *ngIf="filteredReportData['shapes'].length > 0; else shape_filtered">filter_list</span>
+                <ng-template #shape_filtered>more_vert</ng-template>
+              </i>
+            </button>
+          </th>
+          <td mat-cell *matCellDef="let element">
+            <ng-container *ngIf="element.shape">
+              <div *ngFor="let shape of shapeSplit(element.shape)">{{shape}}</div>
+            </ng-container>
+          </td>
+          <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
+        </ng-container>
+
+        <ng-container matColumnDef="service">
+          <th mat-header-cell *matHeaderCellDef class="service label-header">
+            <div class="label"><span class="text"> Product</span> </div>
+            <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+              <i class="material-icons">
+            <span
+              *ngIf="filteredReportData['products'].length > 0; else service_filtered">filter_list</span>
+                <ng-template #service_filtered>more_vert</ng-template>
+              </i>
+            </button>
+          </th>
+          <td mat-cell *matCellDef="let element">
+            {{ element.product }}
+            <!--        <span *ngIf="element.product">{{ element.product }}</span>-->
+          </td>
+          <td mat-footer-cell *matFooterCellDef class="table-footer"></td>
+        </ng-container>
+
+        <ng-container matColumnDef="empty">
+          <th mat-header-cell *matHeaderCellDef class="th_empty label-header">
+          </th>
+          <td mat-cell *matCellDef="let element">
+          </td>
+          <td mat-footer-cell *matFooterCellDef class="table-footer total-cost" [colSpan]="2" [ngClass]="{'right-sticky': reportData?.length < 5}" [style]="{zIndex: 99999}">
+<!--            <span class="strong">-->
+<!--                Total <span *ngIf="reportData?.length">{{fullReport['total_cost'] | localcurrency}}</span>-->
+<!--            </span>-->
+          </td>
+        </ng-container>
+
+
+
+        <ng-container matColumnDef="charge" stickyEnd>
+          <th mat-header-cell *matHeaderCellDef class="th_charges label-header index-105 charges-th" [ngClass]="{'right-sticky': reportData?.length < 5}">
+            <div class="label">
+              <div class="sort">
+                <div class="sort-arrow up" (click)="sortBy('cost', 'down')" [ngClass]="{'active': !!this.active['costdown']}"></div>
+                <div class="sort-arrow down" (click)="sortBy('cost', 'up')" [ngClass]="{'active': !!this.active['costup']}"></div>
+              </div>
+              <span class="text">Service Charges</span>
+            </div>
+          </th>
+
+          <td mat-cell *matCellDef="let element" [ngClass]="{'right-sticky': reportData?.length < 5, 'charges-th': reportData?.length}" >
+            {{element.cost | localcurrency }}
+          </td >
+          <td mat-footer-cell *matFooterCellDef class="table-footer total-cost d-none">
+          </td>
+        </ng-container>
+
+        <!-- ----------------FILTER -->
+        <ng-container matColumnDef="name-filter">
+          <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+            <div class="input-wrapper">
+                <input #nameFilter type="text" placeholder="Filter by environment name"
+                       class="form-control filter-field"
+                       [value]="filtered?.datalabId" (input)="onFilterNameUpdate($event.target['value'])"
+                />
+            </div>
+          </th>
+        </ng-container>
+        <ng-container matColumnDef="user-filter">
+          <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+            <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="'users'"
+                                   [items]="filterConfiguration.users" [model]="filteredReportData.users"></multi-select-dropdown>
+          </th>
+        </ng-container>
+        <ng-container matColumnDef="project-filter">
+          <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+            <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="'projects'"
+                                   [items]="filterConfiguration.projects" [model]="filteredReportData.projects"></multi-select-dropdown>
+          </th>
+        </ng-container>
+        <ng-container matColumnDef="type-filter">
+          <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+            <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="'resource_type'"
+                                   [items]="filterConfiguration.resource_type" [model]="filteredReportData.resource_type">
+            </multi-select-dropdown>
+          </th>
+        </ng-container>
+        <ng-container matColumnDef="status-filter">
+          <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+            <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)" [type]="'statuses'"
+                                   [items]="filterConfiguration.statuses" [model]="filteredReportData.statuses"></multi-select-dropdown>
+          </th>
+        </ng-container>
+        <ng-container matColumnDef="shape-filter">
+          <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+            <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)"
+                                   [type]="'shapes'" [items]="filterConfiguration['shapes']"
+                                   [model]="filteredReportData['shapes']"></multi-select-dropdown>
+          </th>
+        </ng-container>
+
+        <ng-container matColumnDef="empty-filter">
+          <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+          </th>
+        </ng-container>
+
+        <ng-container matColumnDef="service-filter">
+          <th mat-header-cell *matHeaderCellDef class="filter-row-item">
+            <multi-select-dropdown *ngIf="filterConfiguration" (selectionChange)="onUpdate($event)"
+                                   [type]="['products']"
+                                   [items]="filterConfiguration['products']"
+                                   [model]="filteredReportData['products']"></multi-select-dropdown>
+          </th>
+        </ng-container>
+        <ng-container matColumnDef="actions" stickyEnd>
+          <th mat-header-cell *matHeaderCellDef class="filter-row-item index-105" [ngClass]="{'right-sticky': reportData?.length < 5}" [ngStyle]="{'zIndex': '101 !important'}">
+            <div class="actions">
+              <button mat-icon-button class="btn reset" (click)="resetFiltering(); isFiltered = !isFiltered" [disabled]="!isFilterSelected">
+                <i class="material-icons">close</i>
+              </button>
+
+              <button mat-icon-button class="btn apply" (click)="filter_btnClick()" [disabled]="isFilterChanged">
+                <i class="material-icons">done</i>
+              </button>
+            </div>
+          </th>
+        </ng-container>
+        <ng-container matColumnDef="placeholder">
+          <td mat-footer-cell *matFooterCellDef colspan="9" class="info">
+            <span *ngIf="!isFilterSelected; else notFound">No data available</span>
+            <ng-template #notFound>
+              <span>No matches found</span>
+            </ng-template>
+          </td>
+        </ng-container>
+
+        <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true" class="header-row"></tr>
+
+        <tr [hidden]="!collapseFilterRow" mat-header-row *matHeaderRowDef="displayedFilterColumns; sticky: true"
+            class="filter-row"></tr>
+        <tr mat-row *matRowDef="let row; columns: displayedColumns;" class="content-row"></tr>
+
+        <tr [hidden]="!reportData?.length" mat-footer-row *matFooterRowDef="displayedColumns; sticky: true"
+            class="header-row"></tr>
+        <tr [hidden]="reportData?.length" mat-footer-row *matFooterRowDef="['placeholder']"></tr>
+      </table>
+    </section>
+  </div>
+</div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.scss b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.scss
new file mode 100644
index 0000000..2d5304f
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.scss
@@ -0,0 +1,434 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+.billing-page-wrapper{
+  height: calc(100vh - 130px);
+  scroll-behavior: smooth;
+  margin-left: -15px;
+  margin-right: -15px;
+  padding-left: 15px;
+  padding-right: 15px;
+  &.scroll{
+    overflow: auto;
+  }
+}
+
+
+.table-wrapper {
+  width: 100%;
+  display: block;
+  max-height: calc(100vh - 130px);
+  overflow: unset;
+  position: relative;
+  scroll-behavior: smooth;
+  box-shadow: 0 3px 5px -1px rgba(0,0,0,.2), 0 6px 10px 0 rgba(0,0,0,.14), 0 1px 18px 0 rgba(0,0,0,.12);
+  &.scroll{
+    overflow: auto;
+  }
+}
+
+.charges-th {
+  right: 0px !important;
+}
+
+.wrapper{
+  position: relative;
+
+  .nav-buttons {
+    position: absolute;
+    z-index: 105;
+    bottom: 0;
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+    height: 48px;
+    background-color: #ffffff;
+  
+    .mat-mini-fab {
+      height: 25px;
+      width: 25px;
+  
+      .mat-button-wrapper {
+        padding: 0;
+        line-height: unset;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        padding-top: 2px;
+      }
+    }
+  }
+  
+  button{
+    display: flex;
+    align-items: center;
+    background-color: #fff;
+    box-shadow: none;
+    mat-icon{
+      color: lightgrey;
+      &.highlight{
+        color: #35afd5;
+      }
+    }
+  }
+}
+
+.reporting {
+  width: 100%;
+  min-width: 1100px;
+  overflow: auto;
+  border-collapse: inherit;
+
+  .mat-cell {
+    vertical-align: middle;
+  }
+
+  tr {
+    th {
+      padding-right: 5px;
+      &.th_charges{
+        z-index: 16 !important;
+      }
+    }
+
+    td {
+      font-size: 13px;
+      padding-left: 20px;
+
+      &.mat-cell{
+        border-bottom-color: #e3e5e8;
+      }
+
+      &.info {
+        z-index: 1 !important;
+        text-align: center;
+        padding: 40px;
+      }
+    }
+
+    &.filter-row {
+      th {
+        padding: 5px;
+        font-size: 13px;
+        z-index: 103 !important;
+
+      }
+
+      .filter-field {
+        font-size: 13px;
+      }
+
+    }
+
+    &.header-row {
+      th {
+
+        .label{
+          padding-left: 0;
+          position: relative;
+          font-size: 13px;
+        }
+      }
+    }
+  }
+
+  .th_shape {
+    width: 12%;
+    min-width: 150px;
+    z-index: 10 !important;
+  }
+
+  .th_user,
+  .env_name,
+  .service,
+  .tags {
+    width: 15%;
+    min-width: 150px;
+    word-wrap: break-word;
+  }
+
+  .service{
+    width: 10%;
+  }
+
+  .tags {
+    .label {
+      padding-top: 0;
+    }
+  }
+
+  .service {
+    min-width: 175px;
+    z-index: 9 !important;
+  }
+
+  .env_name {
+    width: 21%;
+    min-width: 200px;
+    z-index: 15 !important;
+    padding-left: 0;
+  }
+
+  .th_user{
+    z-index: 14 !important;
+  }
+
+  .th_empty {
+    width: 3%;
+    z-index: 4 !important;
+  }
+
+  .th_project{
+    width: 12%;
+    z-index: 13 !important;
+    min-width: 150px;
+  }
+
+  .th_type {
+    width: 12%;
+    min-width: 170px;
+    z-index: 12 !important;
+  }
+
+  .th_status {
+    width: 8%;
+    min-width: 150px;
+    z-index: 11 !important;
+  }
+
+  .th_charges {
+    min-width: 135px;
+    text-align: right;
+
+    .label {
+      padding-top: 0;
+    }
+  }
+
+  .tags-col {
+    padding: 5px;
+
+    mat-chip {
+      min-height: 20px;
+      padding: 5px 10px;
+      font-size: 13px;
+      max-width: 110px !important;
+      white-space: nowrap;
+      display: inline-block;
+      line-height: 10px;
+      margin: 2px;
+    }
+  }
+
+  .mat-column-charge,
+  .filter-row-item:last-child,
+  .table-footer.mat-column-charge{
+    text-align: right;
+    background-color: #f8f8f8;
+  }
+
+  .header-row {
+    position: unset;
+
+    .th_charges {
+      padding-top: 0;
+
+      .label {
+        padding-top: 10px;
+      }
+
+      &.label-header{
+        box-shadow: none;
+        border-bottom: 1px solid lightgrey !important;
+      }
+    }
+
+    .label {
+      display: inline-block;
+      padding-top: 13px;
+      vertical-align: super !important;
+
+      .text{
+     padding-left: 20px;
+      }
+    }
+
+    .sort{
+      position: absolute;
+      bottom: 2px;
+
+      &-user,
+      &-project{
+        right: -15px;
+      }
+
+      &-arrow{
+        width: 6px;
+        height: 6px;
+        border: 3px solid transparent;
+        border-bottom: 3px solid rgba(0,0,0,.54);
+        border-left: 3px solid rgba(0,0,0,.54);
+        cursor: pointer;
+
+        &.active{
+          border-bottom: 3px solid #35afd5;
+          border-left: 3px solid #35afd5;
+        }
+      }
+
+      .down{
+        transform: rotate(-45deg);
+      }
+
+      .up{
+        transform: rotate(135deg);
+      }
+    }
+  }
+
+  .filter-row {
+    .actions {
+      text-align: right;
+
+      button{
+        background: inherit;
+      }
+    }
+  }
+
+  .table-footer{
+    position: sticky;
+    bottom: -1px;
+    background: inherit;
+    border-top: 1px solid #E0E0E0;
+    transform: translateY(-1px);
+    border-bottom: none;
+    padding-left: 0 !important;
+  }
+}
+
+.dashboard_table_body {
+  td:first-child {
+    cursor: default;
+  }
+
+  .dropdown-multiselect {
+    button {
+      font-size: 14px;
+      height: 34px;
+      padding: 7px 20px;
+    }
+  }
+}
+
+.table-footer{
+  position: sticky;
+  bottom: -1px;
+  background: inherit;
+  border-top: 1px solid #E0E0E0;
+  transform: translateY(-1px);
+  border-bottom: none;
+
+  &.total-cost{
+    min-width: 140px;
+    padding-left: 0 !important;
+    text-align: right;
+    padding-right: 25px;
+    position: sticky;
+    right: 0;
+    z-index: 101;
+  }
+}
+
+.user-name-cell {
+  cursor: default;
+}
+
+.right {
+  position: absolute;
+  right: 0;
+}
+
+.wrapper{
+  .table-wrapper{
+    .reporting{
+      tr{
+        th.th_charges.index-105,
+        .filter-row-item.index-105
+        {
+          z-index: 105 !important;
+        }
+      }
+    }
+  }
+}
+
+
+
+@media screen and (max-width: 1280px) {
+  .dashboard_table.reporting {
+    .env_name,
+    .service,
+    .th_type,
+    .th_status {
+      width: 10%;
+    }
+
+    .th_user {
+      width: 12%;
+    }
+
+    .user-field {
+      word-wrap: break-word;
+    }
+  }
+}
+
+.totaL-item{
+  position: absolute;
+  right: 0;
+  padding-right: 24px;
+  z-index: 115;
+  font-size: 13px;
+
+  &.scrollbar-right{
+    right: 3px;
+  }
+
+  &.scrollbar-bottom{
+    bottom: 3px;
+  }
+
+  span {
+    padding-left: 2px;
+  }
+}
+
+
+
+@-moz-document url-prefix() {
+  .totaL-item {
+    &.scrollbar-right{
+      right: 8px !important;
+    }
+
+    &.scrollbar-bottom{
+      bottom: 8px !important;
+    }
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.ts b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.ts
new file mode 100644
index 0000000..d53213c
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.ts
@@ -0,0 +1,221 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import {
+  Component,
+  OnInit,
+  Output,
+  EventEmitter,
+  ViewChild,
+  Input,
+  HostListener,
+  AfterViewInit,
+  ChangeDetectorRef,
+  ChangeDetectionStrategy
+} from '@angular/core';
+import { ReportingConfigModel } from '../../../../dictionary/global.dictionary';
+import {BehaviorSubject, fromEvent, Observable, of, Subject, timer} from 'rxjs';
+import {logger} from 'codelyzer/util/logger';
+import {take} from 'rxjs/operators';
+import {CompareUtils} from '../../../core/util/compareUtils';
+
+export interface IFullReport {
+  currency: string;
+  from: Array<number>;
+  is_full: boolean;
+  name: string;
+  reportHeaderCompletable: true;
+  report_lines:  Array<any>;
+  sbn: string;
+  to: Array<number>;
+  total_cost: number;
+}
+
+@Component({
+  selector: 'datalab-reporting-grid',
+  templateUrl: './reporting-grid.component.html',
+  styleUrls: ['./reporting-grid.component.scss',
+    '../../../resources/resources-grid/resources-grid.component.scss'],
+  // changeDetection: ChangeDetectionStrategy.OnPush
+
+})
+export class ReportingGridComponent implements OnInit {
+  tableEl = {};
+  filterConfiguration: ReportingConfigModel;
+  // filteredReportData: ReportingConfigModel = new ReportingConfigModel([], [], [], [], [], '', '', '', []);
+  collapseFilterRow: boolean = false;
+  reportData: Array<any> = [];
+  fullReport: IFullReport;
+  isFiltered: boolean = false;
+  active: object = {};
+  displayedColumns: string[] = ['name', 'user', 'project', 'type', 'status', 'shape', 'service', 'empty', 'charge'];
+  displayedFilterColumns: string[] = ['name-filter', 'user-filter', 'project-filter', 'type-filter', 'status-filter', 'shape-filter',  'service-filter', 'empty-filter', 'actions'];
+  filtered: any;
+  isMaxRight: Subject<boolean> = new BehaviorSubject(false);
+  isFilterSelected: boolean;
+  isFilterChanged: boolean;
+  public isScrollButtonsVisible: boolean;
+  public previousItem: string;
+  public previousDirection: string;
+  userAgentIndex: number;
+
+  @ViewChild('nameFilter') filter;
+  @ViewChild('tableWrapper') tableWrapper;
+  @ViewChild('wrapper') wrapper;
+
+  @ViewChild('pageWrapper') pageWrapper;
+  @ViewChild('table') table;
+  @Output() filterReport: EventEmitter<{}> = new EventEmitter();
+  @Output() resetRangePicker: EventEmitter<boolean> = new EventEmitter();
+  @Input() filteredReportData: ReportingConfigModel;
+
+  @Input() previousFilterData: ReportingConfigModel;
+  @HostListener('window:resize', ['$event'])
+  onResize(event) {
+    this.isScrollButtonsVisible = this.tableWrapper.nativeElement.offsetWidth - this.table._elementRef.nativeElement.offsetWidth < 0;
+    this.checkMaxRight();
+  }
+
+  @HostListener('scroll', ['$event'])
+  scrollTable($event: Event) {
+    this.checkMaxRight();
+  }
+
+  constructor(private changeDetector: ChangeDetectorRef) {
+  }
+
+  ngOnInit() {
+    this.userAgentIndex = window.navigator.userAgent.indexOf('Firefox');
+    
+    window.setTimeout(() => {
+      this.isScrollButtonsVisible = this.tableWrapper.nativeElement.offsetWidth - this.table._elementRef.nativeElement.offsetWidth < 0;
+      this.checkMaxRight();
+      this.tableEl = this.table._elementRef.nativeElement;
+    }, 1000);
+    this.checkFilters();
+  }
+
+  onUpdate($event): void {
+    this.filteredReportData[$event.type] = $event.model;
+    this.checkFilters();
+  }
+
+  private checkFilters() {
+    this.isFilterChanged = CompareUtils.compareFilters(this.filteredReportData, this.previousFilterData);
+    this.isFilterSelected = Object.keys(this.filteredReportData)
+      .some(v => this.filteredReportData[v] && this.filteredReportData[v].length > 0);
+  }
+
+  refreshData(fullReport, report) {
+    this.reportData = [...report];
+    console.log(fullReport);
+    this.fullReport = fullReport;
+    this.checkFilters();
+  }
+
+  setFullReport(data): void {
+    if (!data) {
+      this.displayedColumns = this.displayedColumns.filter(el => el !== 'user');
+      this.displayedFilterColumns = this.displayedFilterColumns.filter(el => el !== 'user-filter');
+    }
+  }
+
+  sortBy(sortItem, direction) {
+  if (this.previousItem === sortItem && this.previousDirection === direction) {
+    return;
+  }
+  let report: Array<object>;
+  this.previousItem = sortItem;
+  this.previousDirection = direction;
+  if (direction === 'down') {
+    report = this.reportData.sort((a, b) => {
+      if (a[sortItem] === null) a[sortItem] = '';
+      if (b[sortItem] === null) b[sortItem] = '';
+     return (a[sortItem] > b[sortItem]) ? 1 : -1;
+    });
+  }
+  if (direction === 'up') {
+    report = this.reportData.sort((a, b) => {
+      if (a[sortItem] === null) a[sortItem] = '';
+      if (b[sortItem] === null) b[sortItem] = '';
+      return (a[sortItem] < b[sortItem]) ? 1 : -1 ;
+    });
+  }
+  this.refreshData(this.fullReport, report);
+  this.removeSorting();
+  this.active[sortItem + direction] = true;
+  }
+
+  removeSorting() {
+    for (const item in this.active) {
+      this.active[item] = false;
+    }
+  }
+
+  toggleFilterRow(): void {
+    this.collapseFilterRow = !this.collapseFilterRow;
+  }
+
+  setConfiguration(reportConfig: ReportingConfigModel): void {
+    this.filterConfiguration = reportConfig;
+    this.checkFilters();
+  }
+
+  filter_btnClick(): void {
+    this.filterReport.emit(this.filteredReportData);
+    this.isFiltered = true;
+    this.checkFilters();
+    this.removeSorting();
+  }
+
+  resetFiltering(): void {
+    this.filteredReportData.defaultConfigurations();
+    this.removeSorting();
+    this.filter.nativeElement.value = '';
+    this.filterReport.emit(this.filteredReportData);
+    this.resetRangePicker.emit(true);
+    this.checkFilters();
+  }
+
+  shapeSplit(shape) {
+    return shape.split(/(?=Slave)/g);
+  }
+
+  public scrollTo(direction: string) {
+    if (direction === 'left') {
+      this.tableWrapper.nativeElement.scrollLeft = 0;
+      this.pageWrapper.nativeElement.scrollLeft = 0;
+    } else {
+      this.tableWrapper.nativeElement.scrollLeft = this.tableWrapper.nativeElement.offsetWidth;
+      this.pageWrapper.nativeElement.scrollLeft = this.pageWrapper.nativeElement.offsetWidth;
+    }
+  }
+
+  public checkMaxRight() {
+    const arg = this.tableWrapper.nativeElement.offsetWidth +
+      this.tableWrapper.nativeElement.scrollLeft + 2 <= this.table._elementRef.nativeElement.offsetWidth;
+    return this.isMaxRight.next(arg);
+    
+  }
+
+  public onFilterNameUpdate(targetElement: any) {
+    this.filteredReportData.datalabId = targetElement;
+    this.checkFilters();
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting.component.ts b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting.component.ts
new file mode 100644
index 0000000..20f835e
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting.component.ts
@@ -0,0 +1,216 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core';
+import { ToastrService } from 'ngx-toastr';
+import {ApplicationSecurityService, BillingReportService, HealthStatusService} from '../../core/services';
+import { ReportingGridComponent } from './reporting-grid/reporting-grid.component';
+import { ToolbarComponent } from './toolbar/toolbar.component';
+
+import { FileUtils } from '../../core/util';
+import { DICTIONARY, ReportingConfigModel } from '../../../dictionary/global.dictionary';
+import {ProgressBarService} from '../../core/services/progress-bar.service';
+import {LocalizationService} from '../../core/services/localization.service';
+
+@Component({
+  selector: 'datalab-reporting',
+  template: `
+    <div class="base-retreat">
+      <datalab-toolbar (rebuildReport)="rebuildBillingReport()"
+                        (exportReport)="exportBillingReport()"
+                        (setRangeOption)="setRangeOption($event)">
+      </datalab-toolbar>
+      <mat-divider></mat-divider>
+      <datalab-reporting-grid
+        (filterReport)="filterReport($event)"
+        (resetRangePicker)="resetRangePicker()"
+        [filteredReportData]="reportData"
+        [previousFilterData]="this.cashedFilterData"
+      ></datalab-reporting-grid>
+    </div>
+
+  `,
+  styles: [`
+    footer {
+      position: fixed;
+      left: 0;
+      bottom: 0;
+      width: 100%;
+      background: #a1b7d1;
+      color: #ffffff;
+      text-align: right;
+      padding: 5px 15px;
+      font-size: 18px;
+      box-shadow: 0 9px 18px 15px #f5f5f5;
+    }
+  `]
+})
+export class ReportingComponent implements OnInit, OnDestroy {
+  readonly DICTIONARY = DICTIONARY;
+
+  @ViewChild(ReportingGridComponent) reportingGrid: ReportingGridComponent;
+  @ViewChild(ToolbarComponent, { static: true }) reportingToolbar: ToolbarComponent;
+
+  reportData: ReportingConfigModel = new ReportingConfigModel([], [], [], [], [], '', '', '', []);
+  filterConfiguration: ReportingConfigModel = ReportingConfigModel.getDefault();
+  data: any;
+  billingEnabled: boolean;
+  admin: boolean;
+  public cashedFilterData: any;
+
+  constructor(
+    private billingReportService: BillingReportService,
+    private healthStatusService: HealthStatusService,
+    public toastr: ToastrService,
+    private progressBarService: ProgressBarService,
+    private localizationService: LocalizationService,
+  ) { }
+
+  ngOnInit() {
+    this.getEnvironmentHealthStatus();
+    this.buildBillingReport();
+  }
+
+  ngOnDestroy() {
+    this.clearStorage();
+  }
+
+  getGeneralBillingData() {
+    this.progressBarService.startProgressBar();
+    this.cashedFilterData = JSON.parse(JSON.stringify(this.reportData));
+    Object.setPrototypeOf(this.cashedFilterData, Object.getPrototypeOf(this.reportData));
+    this.billingReportService.getGeneralBillingData(this.reportData)
+      .subscribe(data => {
+        this.data = data;
+        this.reportingGrid.refreshData(this.data, this.data.report_lines);
+        this.reportingGrid.setFullReport(this.data.is_full);
+        this.reportingToolbar.reportData = this.data;
+        if (!localStorage.getItem('report_period')) {
+          localStorage.setItem('report_period', JSON.stringify({
+            start_date: this.data['from'],
+            end_date: this.data['to']
+          }));
+          this.reportingToolbar.setDateRange();
+        }
+
+        if (localStorage.getItem('report_config')) {
+          this.filterConfiguration = JSON.parse(localStorage.getItem('report_config'));
+          this.reportingGrid.setConfiguration(this.filterConfiguration);
+        } else {
+          this.getDefaultFilterConfiguration(this.data);
+        }
+        this.progressBarService.stopProgressBar();
+      }, () => this.progressBarService.stopProgressBar());
+  }
+
+  rebuildBillingReport(): void {
+    this.reportData = this.cashedFilterData;
+    this.getGeneralBillingData();
+  }
+
+  buildBillingReport() {
+    this.clearStorage();
+    this.resetRangePicker();
+    this.getGeneralBillingData();
+  }
+
+  exportBillingReport(): void {
+    this.reportData.locale = this.localizationService.locale;
+    this.billingReportService.downloadReport(this.reportData)
+      .subscribe(
+        data => FileUtils.downloadFile(data),
+        () => this.toastr.error('Billing report export failed!', 'Oops!'));
+  }
+
+  getDefaultFilterConfiguration(data): void {
+    const users = [], types = [], shapes = [], services = [], statuses = [], projects = [];
+
+    data.report_lines.forEach((item: any) => {
+      if (item.user && users.indexOf(item.user) === -1)
+        users.push(item.user);
+
+      if (item.status && statuses.indexOf(item.status.toLowerCase()) === -1)
+        statuses.push(item.status.toLowerCase());
+
+      if (item.project && projects.indexOf(item.project) === -1)
+        projects.push(item.project);
+
+      if (item['resource_type'] && types.indexOf(item['resource_type']) === -1)
+        types.push(item['resource_type']);
+
+      if (item.shape && types.indexOf(item.shape)) {
+       if (item.shape.indexOf('Master') > -1) {
+          for (let shape of item.shape.split(/(?=Slave)/g)) {
+            shape = shape.replace('Master: ', '');
+            shape = shape.replace(/Slave: /, '');
+            shape = shape.replace(/\s+/g, '');
+            shape = shape.replace(/[0-9]?[0-9]x/g, '');
+
+            shapes.indexOf(shape) === -1 && shapes.push(shape);
+          }
+        } else if (item.shape.match(/\d x \S+/)) {
+          const parsedShape = item.shape.match(/\d x \S+/)[0].split(' x ')[1];
+          if (shapes.indexOf(parsedShape) === -1) {
+            shapes.push(parsedShape);
+          }
+        } else {
+          shapes.indexOf(item.shape) === -1 && shapes.push(item.shape);
+        }
+      }
+
+      if (item.product && services.indexOf(item.product) === -1)
+        services.push(item.product);
+    });
+
+    if (!this.reportingGrid.filterConfiguration || !localStorage.getItem('report_config')) {
+      this.filterConfiguration = new ReportingConfigModel(users, services, types, statuses, shapes, '', '', '', projects);
+      this.reportingGrid.setConfiguration(this.filterConfiguration);
+      localStorage.setItem('report_config', JSON.stringify(this.filterConfiguration));
+    }
+  }
+
+  filterReport(event: ReportingConfigModel): void {
+    this.reportData = event;
+    this.getGeneralBillingData();
+  }
+
+  resetRangePicker() {
+    this.reportingToolbar.clearRangePicker();
+  }
+
+  setRangeOption(dateRangeOption: any): void {
+    this.reportData.date_start = dateRangeOption.start_date;
+    this.reportData.date_end = dateRangeOption.end_date;
+    this.getGeneralBillingData();
+  }
+
+  private clearStorage(): void {
+    localStorage.removeItem('report_config');
+    localStorage.removeItem('report_period');
+  }
+
+  private getEnvironmentHealthStatus() {
+    this.healthStatusService.getEnvironmentHealthStatus()
+      .subscribe((result: any) => {
+        this.billingEnabled = result.billingEnabled;
+        this.admin = result.admin;
+      });
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting.module.ts b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting.module.ts
new file mode 100644
index 0000000..efcbfd9
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting.module.ts
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { NgDateRangePickerModule } from 'ng-daterangepicker';
+import { MaterialModule } from '../../shared/material.module';
+import { FormControlsModule } from '../../shared/form-controls';
+import { ReportingComponent } from './reporting.component';
+import { KeysPipeModule, LineBreaksPipeModule } from '../../core/pipes';
+import { ReportingGridComponent } from './reporting-grid/reporting-grid.component';
+import { ToolbarComponent } from './toolbar/toolbar.component';
+import {LocalCurrencyModule} from '../../core/pipes/local-currency-pipe';
+import {LocalDatePipeModule} from '../../core/pipes/local-date-pipe';
+
+@NgModule({
+    imports: [
+        CommonModule,
+        FormsModule,
+        FormControlsModule,
+        KeysPipeModule,
+        LineBreaksPipeModule,
+        NgDateRangePickerModule,
+        MaterialModule,
+        LocalCurrencyModule,
+        LocalDatePipeModule
+    ],
+  declarations: [
+    ReportingComponent,
+    ReportingGridComponent,
+    ToolbarComponent
+  ],
+  exports: [ReportingComponent]
+})
+export class ReportingModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/toolbar/toolbar.component.html b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/toolbar/toolbar.component.html
new file mode 100644
index 0000000..ca883aa
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/toolbar/toolbar.component.html
@@ -0,0 +1,44 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<section class="toolbar">
+  <div class="info_color" >
+    <div class="general" *ngIf="reportData">
+      <div><span>Service base name: </span><strong>{{ reportData.sbn }}</strong></div>
+      <div *ngIf="reportData.tag_resource_id"><span>Resource tag ID:
+        </span><strong>{{ reportData.tag_resource_id }}</strong></div>
+      <div class="report-period info_color" *ngIf="availablePeriodFrom && availablePeriodTo">
+        <span>Available reporting period from:</span>
+        <strong>{{ availablePeriodFrom.join('/') | localDate }} </strong>
+        to: <strong>{{ availablePeriodTo.join('/') | localDate }}</strong>
+      </div>
+    </div>
+  </div>
+
+  <div id="range-picker">
+    <ng-daterangepicker [(ngModel)]="value" [options]="options" (ngModelChange)="onChange($event)"></ng-daterangepicker>
+  </div>
+  <div class="action-butt">
+    <button mat-raised-button class="butt" (click)="export($event)" [disabled]="!reportData?.report_lines.length">
+      <i class="material-icons">file_download</i>Export
+    </button>
+    <button mat-raised-button class="butt" (click)="rebuild($event)">
+      <i class="material-icons refresh-icon">autorenew</i>Refresh
+    </button>
+  </div>
+</section>
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/toolbar/toolbar.component.scss b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/toolbar/toolbar.component.scss
new file mode 100644
index 0000000..f23b8a9
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/toolbar/toolbar.component.scss
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+section.toolbar {
+  display: flex;
+  justify-content: space-between;
+  font-weight: 300;
+  width: 100%;
+
+  >div {
+    width: 33%;
+  }
+
+  >div:nth-child(2) {
+    text-align: center;
+  }
+
+  >div:nth-child(3) {
+    text-align: right;
+  }
+
+  .action-butt {
+    align-self: center;
+  }
+
+  button {
+    &:first-child {
+      margin-right: 10px;
+    }
+  }
+
+  .butt-report-range {
+    width: 240px;
+    margin-right: 10px;
+  }
+
+  .general {
+    font-size: 13px;
+
+    div {
+      span {
+        width: 190px;
+        display: inline-block;
+      }
+    }
+  }
+}
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/toolbar/toolbar.component.ts b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/toolbar/toolbar.component.ts
new file mode 100644
index 0000000..2b13c8e
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/toolbar/toolbar.component.ts
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Component, OnInit, AfterViewInit, Output, EventEmitter, ViewEncapsulation, ViewChild } from '@angular/core';
+import { NgDateRangePickerOptions } from 'ng-daterangepicker';
+import { DICTIONARY } from '../../../../dictionary/global.dictionary';
+import {skip} from 'rxjs/operators';
+import {Subscription} from 'rxjs';
+import {HealthStatusService} from '../../../core/services';
+import {GeneralEnvironmentStatus} from '../../../administration/management/management.model';
+
+@Component({
+  selector: 'datalab-toolbar',
+  templateUrl: './toolbar.component.html',
+  styleUrls: ['./toolbar.component.scss'],
+  encapsulation: ViewEncapsulation.None
+})
+export class ToolbarComponent implements OnInit, AfterViewInit {
+  readonly DICTIONARY = DICTIONARY;
+  value: any;
+  reportData: any;
+  availablePeriodFrom: [];
+  availablePeriodTo: [];
+  subscriptions: Subscription = new Subscription();
+  healthStatus: GeneralEnvironmentStatus;
+
+  rangeOptions = { 'YTD': 'Year To Date', 'QTD': 'Quarter To Date', 'MTD': 'Month To Date', 'reset': 'All Period Report' };
+  options: NgDateRangePickerOptions;
+  rangeLabels: any;
+
+  @Output() rebuildReport: EventEmitter<{}> = new EventEmitter();
+  @Output() exportReport: EventEmitter<{}> = new EventEmitter();
+  @Output() setRangeOption: EventEmitter<{}> = new EventEmitter();
+
+  constructor(private healthStatusService: HealthStatusService) {
+    this.options = {
+      theme: 'default',
+      range: 'tm',
+      dayNames: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+      presetNames: ['This Month', 'Last Month', 'This Week', 'Last Week', 'This Year', 'Last Year', 'From', 'To'],
+      dateFormat: 'dd MMM y',
+      outputFormat: 'YYYY/MM/DD',
+      startOfWeek: 1
+    };
+  }
+
+  ngOnInit() {
+    // if (localStorage.getItem('report_period')) {
+    //   const availableRange = JSON.parse(localStorage.getItem('report_period'));
+    //   this.availablePeriodFrom = availableRange.start_date;
+    //   this.availablePeriodTo = availableRange.end_date;
+    // } else {
+
+    // }
+    this.subscriptions.add(this.healthStatusService.statusData.pipe(skip(1)).subscribe(result => {
+      this.healthStatus = result;
+    }));
+    this.setInitDatapickerConfig();
+  }
+
+  ngAfterViewInit() {
+    this.clearRangePicker();
+  }
+
+  private setInitDatapickerConfig() {
+    const labels = <NodeListOf<Element>>document.querySelectorAll('.label-txt');
+    const rangeLabels = <NodeListOf<Element>>document.querySelectorAll('.value-txt');
+    labels[0].innerHTML = 'From date';
+    labels[1].innerHTML = 'To date';
+    for (let label = 0; label < rangeLabels.length; ++label) {
+      rangeLabels[label].classList.add('untouched');
+      rangeLabels[label].classList.add('d-none');
+    }
+  }
+
+  setDateRange() {
+    const availableRange = JSON.parse(localStorage.getItem('report_period'));
+    this.availablePeriodFrom = availableRange.start_date;
+    this.availablePeriodTo = availableRange.end_date;
+  }
+
+  clearRangePicker(): void {
+    this.setInitDatapickerConfig();
+  }
+
+  onChange(dateRange: string): void {
+    const rangeLabels = <NodeListOf<Element>>document.querySelectorAll('.value-txt');
+
+    for (let label = 0; label < rangeLabels.length; ++label)
+      if (rangeLabels[label].classList.contains('untouched')) {
+        rangeLabels[label].classList.remove('untouched');
+        rangeLabels[label].classList.remove('d-none');
+      }
+    const labels = <NodeListOf<Element>>document.querySelectorAll('.label-txt');
+    labels[0].innerHTML = 'From:';
+    labels[1].innerHTML = 'To:';
+
+    const reportDateRange = dateRange.split('-');
+    this.setRangeOption.emit({
+      start_date: reportDateRange[0].split('/').join('-'),
+      end_date: reportDateRange[1].split('/').join('-')
+    });
+  }
+
+  rebuild($event): void {
+    this.rebuildReport.emit($event);
+  }
+
+  export($event): void {
+    this.exportReport.emit($event);
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/reports.module.ts b/services/self-service/src/main/resources/webapp/src/app/reports/reports.module.ts
new file mode 100644
index 0000000..f6b1bf9
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/reports.module.ts
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import {AuditModule} from './audit/audit.module';
+import {ReportingModule} from './reporting/reporting.module';
+
+
+@NgModule({
+  imports: [CommonModule, AuditModule, ReportingModule],
+  declarations: [],
+  exports: [AuditModule, ReportingModule]
+})
+export class ReportsModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
new file mode 100644
index 0000000..93ff8f4
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
@@ -0,0 +1,277 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<div class="bucket-browser" id="dialog-box" (click)="closeActions()">
+  <header class="dialog-header">
+    <h4 class="modal-title">Bucket browser</h4>
+    <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
+  </header>
+
+  <div class="dialog-content tabs">
+    <div class="submit m-bott-10 m-top-10">
+      <div class="left-side-butts">
+      <span [matTooltip]="isQueueFull ? 'Previous upload is still in progress, please wait.' : 'You have not permission to upload data'" matTooltipPosition="above" matTooltipDisabled="{{this.bucketStatus.upload && !isQueueFull}}">
+        <button 
+          mat-raised-button 
+          type="button" 
+          class="butt first-btn" 
+          [disabled]="!this.bucketStatus.upload || allDisable || isSelectionOpened || !path || isQueueFull" 
+          (click)="handleFileInput($event)"
+        >
+          <input 
+            [ngClass]="{'not-allowed': !this.bucketStatus.upload || allDisable || isSelectionOpened || !path || isQueueFull}" 
+            type="file" 
+            (change)="handleFileInput($event)" 
+            title="" 
+            multiple
+          >
+          Upload files
+        </button>
+      </span>
+      <span [matTooltip]="'You have not permission to create folder'" matTooltipPosition="above" matTooltipDisabled="{{this.bucketStatus.upload}}">
+        <button
+          mat-raised-button
+          type="button"
+          class="butt"
+          (click)="createFolder(selectedFolder)"
+          [disabled]="!this.bucketStatus.upload || allDisable || !path || isSelectionOpened"
+        >
+          Create folder
+        </button>
+      </span>
+      <span [matTooltip]="'You have not permission to delete data'" matTooltipPosition="above" matTooltipDisabled="{{this.bucketStatus.delete}}">
+        <button
+          type="button"
+          class="butt"
+          mat-raised-button
+          (click)="fileAction('delete')"
+          [disabled]="(!selected?.length && !selectedFolderForAction?.length) || !this.bucketStatus.delete || allDisable || !path || isSelectionOpened"
+        >
+        Delete
+      </button>
+      </span>
+      <div class="action-select-wrapper" >
+        <span class="action-button-wrapper">
+          <button
+            type="button" class="butt actions-btn"
+            mat-raised-button
+            [disabled]=" selectedItems?.length !== 1 || allDisable || !path || isSelectionOpened"
+            (click)="toogleActions();$event.stopPropagation()"
+          >
+            Actions <i class="material-icons" >{{ !isActionsOpen ?  'expand_more' : 'expand_less' }}</i>
+          </button>
+          </span>
+        <div class="action-menu" *ngIf="isActionsOpen">
+          <span [matTooltip]="'You have not permission to download data'" matTooltipPosition="above" matTooltipDisabled="{{this.bucketStatus.download}}">
+          <button
+            type="button" class="butt action-menu-item"
+            [ngClass]="{'disabled': !selected?.length || this.selectedItems?.length > 1 || !this.bucketStatus.download || allDisable || isSelectionOpened}"
+            mat-raised-button
+            [disabled]=" !selected?.length || this.selectedItems?.length > 1 || !this.bucketStatus.download || allDisable || isSelectionOpened"
+            (click)="fileAction('download');$event.stopPropagation()"
+          >
+            Download
+          </button>
+            </span>
+          <button
+            type="button" class="butt action-menu-item"
+            mat-raised-button
+            (click)="copyPath();$event.stopPropagation()"
+          >
+            Copy path
+          </button>
+        </div>
+      </div>
+      </div>
+      <button
+        mat-raised-button
+        type="button"
+        class="butt refresh"
+        (click)="refreshBucket()"
+        [disabled]="allDisable"
+      >
+        <i class="material-icons refresh-icon">autorenew</i>Refresh
+      </button>
+    </div>
+    <p class="path"><span>Bucket path:</span>
+      <span class="url ellipsis"  [ngClass]="{'cursor-not-allow': bucketDataService.emptyFolder}">
+       <span class="path-folder" *ngFor="let folder of this.objectPath">
+         <span class="url-icon" *ngIf="this.objectPath.indexOf(folder) !== 0">
+           >
+         </span>
+         <span class="url-folder" (click)="folderTreeComponent.showItem(folder);" [ngClass]="{'not-allowed': bucketDataService.emptyFolder}">{{folder.item}}</span>
+       </span>
+      </span>
+    </p>
+    <div class="bucket-wrapper" [ngClass]="{'added-upload': addedFiles.length}" id="scrolling">
+      <div class="bucket-selection" [ngClass]="{'opened': isSelectionOpened}">
+        <div class="button-wrapper" [ngClass]="{'cursor-not-allow': bucketDataService.emptyFolder}">
+          <i (click)="toggleBucketSelection()" class="material-icons close" *ngIf="!isSelectionOpened" [ngClass]="{'not-allowed': bucketDataService.emptyFolder}">chevron_right</i>
+        </div>
+        <datalab-bucket-tree
+                [hidden]="!isSelectionOpened"
+                (emitActiveBucket)=openBucket($event)
+                [buckets]='buckets'
+                [openedBucket]=this.bucketName
+        >
+        </datalab-bucket-tree>
+      </div>
+      <div class="navigation scrolling" [ngClass]="{'selection-opened': isSelectionOpened}" [hidden]="!path">
+          <datalab-folder-tree
+                  (showFolderContent)=onFolderClick($event)
+                  (disableAll)=dissableAll($event)
+                  [folders]=folders
+                  [endpoint]=endpoint
+                  [cloud]="cloud"
+          ></datalab-folder-tree>
+      </div>
+      <div class="directory" [ngClass]="{'selection-opened': isSelectionOpened}" [hidden]="!path">
+        <div class="folder-item t_header">
+          <div class="folder-item-wrapper header-wrapper folder-tree header-item">
+            <div class="name" [ngClass]="{'cursor-not-allow': bucketDataService.emptyFolder}">
+              <span class="th_name" (click)="isFilterVisible = true" *ngIf="!isFilterVisible" [ngClass]="{'not-allowed': bucketDataService.emptyFolder}">Name</span>
+              <div class="filter-files"  *ngIf="isFilterVisible">
+                <input _ngcontent-yns-c13=""
+                       [(ngModel)]="searchValue"
+                       (keyup)=filterObjects()
+                       class="form-control filter-field filter-name"
+                       placeholder="Filter by name" type="text"
+                >
+                <span><i (click)="closeFilterInput()" class="material-icons close">close</i></span>
+              </div>
+
+            </div>
+            <div class="size"><span class="th_size">Size</span></div>
+            <div class="date"><span class="th_date">Last modified</span></div>
+          </div>
+        </div>
+        <ul class="folder-tree scrolling" [ngClass]="{'cursor-not-allow': bucketDataService.emptyFolder}">
+          <li *ngFor="let file of folderItems" class="folder-item" [ngClass]="{'not-allowed': bucketDataService.emptyFolder}">
+            <div class="folder-item-wrapper" *ngIf="file.children && file.item" (click)="showItem(file)">
+              <div class="name name-folder">
+                <datalab-checkbox
+                  [checked]="file.isFolderSelected"
+                  (toggleSelection)="toggleSelectedFile(file, 'folder')"
+                >
+                </datalab-checkbox>
+
+                  <i class="material-icons folder-icon folder-name">folder</i>
+                  <span class="item-name name-wrap ellipsis"
+                        matTooltip="{{file.item}}"
+                        matTooltipPosition="above"
+                        matTooltipShowDelay="1000"
+                        [matTooltipClass]="'full-size-tooltip'"
+                  >
+                    {{file.item}}
+                </span>
+              </div>
+              <div class="size size-folder">-</div>
+              <div class="date" *ngIf="!file.isDownloading">-</div>
+            </div>
+            <div class="folder-item-wrapper"  (click)="toggleSelectedFile(file, 'file')" *ngIf="!file.children && file.item !== 'ا'">
+              <div class="name name-file">
+                <datalab-checkbox
+                  [checked]="file.isSelected"
+                  [disabled]="file.isDownloading"
+                  (toggleSelection)="toggleSelectedFile(file, 'file')"
+                >
+                </datalab-checkbox>
+                <i class="material-icons folder-icon" >description</i>
+                <span
+                  class="item-name name-wrap ellipsis"
+                  matTooltip="{{file.item}}"
+                  matTooltipPosition="above"
+                  matTooltipShowDelay="1000"
+                  [matTooltipClass]="'full-size-tooltip'"
+                >
+                  {{file.item}}
+                </span>
+              </div>
+              <div class="size">{{file.object?.size | convertFileSize}}</div>
+              <div class="date" *ngIf="!file.isDownloading">{{file.object?.lastModifiedDate | localDate : 'short' }}</div>
+              <div class="progress-wrapper" *ngIf="file.isDownloading">
+                <div class="progres">
+                  <span class="progress-bar-text">{{file.progress || 0}}% Downloading...</span>
+                  <div class="bar" [ngStyle]="{width: file.progress + '%'}">
+                  </div>
+                </div>
+              </div>
+            </div>
+          </li>
+        </ul>
+      </div>
+      <div class="loading-block" *ngIf="!path">
+        <div class="uploading">
+            <p>Please wait until DataLab loads bucket: <span class="strong">{{bucketName}}</span>...</p>
+          <mat-progress-bar mode="indeterminate"></mat-progress-bar>
+        </div>
+      </div>
+    </div>
+    <div class="upload-window" *ngIf="addedFiles.length">
+      <header class="upload-header">
+        <h4 class="modal-title">Upload files</h4>
+        <span class="close" matTooltip="Upload is still in progress, please wait." matTooltipPosition="above" [ngClass]="{'not-allow': isFileUploading}" [matTooltipDisabled]="!isFileUploading">
+           <button type="button" class="close" (click)="closeUploadWindow()" [disabled]="isFileUploading" [ngClass]="{'not-allow': isFileUploading}" >&times;</button>
+        </span>
+      </header>
+      <ul class="upload-files scrolling">
+        <li class="file upload-table-header" *ngIf="addedFiles.length">
+          <div class="name ellipsis" >File</div>
+          <div class="second-block">
+            <div class="upload-path ellipsis">Path</div>
+            <div class="size">Size</div>
+            <div class="state"></div>
+            <div class="remove"></div>
+          </div>
+
+        </li>
+        <li *ngFor="let file of addedFiles" class="file">
+          <div class="name">
+            <span
+              class="ellipsis"
+              matTooltip="{{file.name}}"
+              [matTooltipClass]="'full-size-tooltip'"
+              matTooltipPosition="above"
+            >
+              {{file.name}}
+            </span>
+          </div>
+          <div class="second-block">
+            <div class="upload-path">
+              <span class="ellipsis" matTooltip="{{file.path}}" matTooltipPosition="above" [matTooltipClass]="'full-size-tooltip'">{{file.path}}</span>
+            </div>
+            <div class="size">{{file.size | convertFileSize}} </div>
+            <div class="state">
+              <span *ngIf="file.status === 'uploaded'" class="running">Uploaded</span>
+              <div class="progres" *ngIf="file.status === 'uploading'">
+                <span class="progress-bar-text">{{file.progress || 0}}% Uploading...</span>
+                <div class="bar" [ngStyle]="{width: file.progress + '%'}">
+                </div>
+              </div>
+              <span *ngIf="file.status === 'failed'" class="error">Failed</span>
+              <span *ngIf="file.status === 'waiting'" class="stopped">Waiting for uploading...</span>
+            </div>
+            <div class="remove"><i (click)="deleteAddedFile(file)" class="material-icons close">close</i></div>
+          </div>
+        </li>
+        <li id="upload-list"></li>
+      </ul>
+    </div>
+  </div>
+</div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
new file mode 100644
index 0000000..f8e6e11
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.scss
@@ -0,0 +1,492 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.dialog-header {
+  padding-left: 33px !important;
+}
+
+.bucket-browser {
+  font-size: 14px;
+  font-weight: 400;
+
+  .loading-block{
+    width: 80%;
+    margin: 0 auto;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+    .uploading{
+      width: 100%;
+      text-align: center;
+      padding-bottom: 50px;
+      p{
+        margin-bottom: 20px;
+      }
+    }
+  }
+
+  .path{
+    margin: 0 4px 30px 0;
+    padding: 4px 4px 4px 0;
+    color: rgba(0,0,0,.87);
+    overflow: hidden;
+    white-space: nowrap;
+    display: flex;
+
+    &-folder{
+      position: relative;
+    }
+
+    .url{
+      font-weight: 600;
+      overflow: hidden;
+      display: block;
+      direction: rtl;
+
+     &-folder{
+       padding-left: 5px;
+       padding-right: 5px;
+       color: #00bcd4;
+       cursor: pointer;
+
+       &:first-of-type{
+         padding-left: 5px;
+       }
+     }
+
+      &-icon{
+        color: lightgrey;
+      }
+    }
+  }
+
+  bottom: 0;
+
+  .dialog-content{
+    padding: 0 35px;
+  }
+
+  .content-box {
+    height: 500px;
+  }
+
+  .submit{
+    display: flex;
+    justify-content: space-between;
+
+    .left-side-butts{
+      display: flex;
+    }
+
+    .butt:not(.action-menu-item){
+      position: relative;
+      overflow: hidden;
+      margin: 10px;
+
+      &.actions-btn{
+        margin: 10px 10px 0 10px;
+        padding-right: 38px;
+
+          .material-icons{
+            transition: ease-in-out 1s;
+            font-size: 25px;
+            position: absolute;
+            top: 7px;
+            right: 30px;
+          }
+      }
+
+      &.first-btn{
+        margin-left: 0;
+      }
+
+      &.refresh{
+        margin-right: 0;
+      }
+
+      &.action-menu-item{
+        &:hover{
+          color:  #00bcd4;
+          background-color: #fafafa;
+        }
+
+        &.disabled{
+          &:hover{
+            color: #577289;
+          }
+        }
+      }
+    }
+  }
+}
+
+.bucket-wrapper{
+  height: 57vh;
+  border: 2px solid rgba(0,0,0,.12);
+  border-radius: 5px;
+  display: flex;
+  width: 100%;
+
+  &.added-upload{
+    height: 40vh;
+  }
+   .bucket-selection{
+     position: relative;
+     width: 2%;
+     border-right: 2px solid rgba(0,0,0,.12);
+     padding-top: 6px;
+     transition: .2s;
+
+     &.opened{
+       width: 33.3%;
+
+       .button-wrapper {
+         text-align: right;
+         left: auto;
+
+         i{
+           padding-right: 3px;
+         }
+       }
+     }
+
+     .button-wrapper {
+       position: absolute;
+       left: 0;
+       right: 0;
+       top: 9px;
+       text-align: center;
+
+       i{
+         cursor: pointer;
+         font-size: 18px;
+
+         &:hover{
+           color:  #00bcd4;
+         }
+       }
+     }
+   }
+
+   }
+
+  .navigation{
+    transition: .2s;
+    width: 31.3%;
+    height: 100%;
+    overflow: auto;
+    padding-top: 6px;
+
+    &.selection-opened{
+      width: 66.7%;
+    }
+
+    .folder-tree{
+      .folder{
+        line-height: 30px;
+      }
+    }
+
+    .mat-tree-node{
+      min-height: auto;
+    }
+  }
+
+  .directory{
+    width: 66.7%;
+    max-height: 100%;
+    font-size: 14px;
+    font-weight: 400;
+    position: relative;
+    border-left: 2px solid rgba(0,0,0,.12);
+
+    &.selection-opened{
+      display: none;
+    }
+
+    .folder-tree{
+      overflow-x: auto;
+      overflow-y: overlay;
+      max-height: 100%;
+      padding: 6px 15px 15px 15px;
+
+      .name{
+        width: 60%;
+        display: flex;
+        align-items: center;
+        overflow: hidden;
+
+        .name-wrap {
+          overflow: hidden;
+          white-space: nowrap;
+          padding-right: 10px;
+        }
+
+        &-folder{
+          .folder-name{
+            padding-left: 8px;
+          }
+        }
+
+        &-file{
+          i{
+            transform: translateX(6px);
+          }
+          span.item-name{
+            padding-left: 4px;
+
+            &.removed-checkbox{
+              padding-left: 4px;
+            }
+          }
+        }
+      }
+
+      .size{
+        width: 15%;
+
+        &-folder{
+          padding-left: 4px;
+        }
+      }
+
+      .date{
+        width: 25%;
+
+        .th_date{
+          font-size: 13px;
+        }
+      }
+
+      .progress-wrapper{
+        flex:1;
+      }
+
+      .material-icons.close{
+        font-size: 15px;
+        margin: 0 10px;
+        cursor: pointer;
+      }
+    }
+  }
+
+  .folder-item{
+     display: flex;
+     align-items: center;
+
+    &.t_header{
+      top: -41px;
+      position: absolute;
+      left: 0;
+      right: 0;
+
+      .folder-item-wrapper{
+        height: 52px;
+      }
+
+      .th_name{
+        padding-left: 29px;
+        font-size: 14px;
+        cursor: pointer;
+
+        &:hover{
+          color: #00bcd4;
+        }
+      }
+
+      .filter-files{
+        width: 100%;
+        padding: 3px 0;
+        padding-left: 3px;
+        display: flex;
+        align-items: center;
+
+        .filter-name{
+          font-size: 14px;
+          height: 20px;
+          width: 90%;
+        }
+
+        span{
+          transform: translateY(2px);
+
+          &:hover{
+            i{
+              color: #00bcd4;
+            }
+          }
+        }
+      }
+
+      .th_size{
+        font-size: 14px;
+        padding-left: 3px;
+        cursor: auto;
+      }
+
+      .th_date{
+        font-size: 14px !important;
+        cursor: auto;
+      }
+    }
+     .folder-item-wrapper{
+       width: 100%;
+       display: flex;
+       justify-content: space-between;
+       align-items: center;
+       cursor: pointer;
+       color: rgba(0,0,0,.87);
+
+       &.header-item{
+         cursor: auto;
+
+         .name{
+           margin-left: -3px;
+         }
+
+       }
+
+       i{
+         color: rgb(232, 232, 232);
+       }
+
+       &:hover:not(.header-wrapper){
+         color: #00bcd4;
+         transition: .3s ease-in-out;
+         i{
+           color: #00bcd4;
+           transition: .3s ease-in-out;
+         }
+
+         .empty-checkbox{
+           border-color: #00bcd4
+         }
+
+         .progress-wrapper{
+
+           .progres{
+             border-color: #00bcd4 !important;
+           }
+         }
+       }
+     }
+   }
+
+.empty-checkbox {
+  min-width: 16px;
+  width: 16px;
+  height: 16px;
+  border-radius: 2px;
+  border: 2px solid lightgrey;
+  margin-top: 2px;
+  position: relative;
+
+  &.checked {
+    border-color: #35afd5;
+    background-color: #35afd5;
+  }
+
+  .checked-checkbox {
+    top: 0;
+    left: 4px;
+    width: 5px;
+    height: 10px;
+    border-bottom: 2px solid white;
+    border-right: 2px solid white;
+    position: absolute;
+    transform: rotate(45deg);
+  }
+}
+
+.folder-item-name{
+  span{
+    color: #000;
+  }
+
+  .check-box {
+    background-color: red;
+  }
+}
+
+.upload-window {
+  margin-top: 2vh;
+  border: 2px solid rgba(0, 0, 0, .12);
+  border-radius: 5px;
+  background-color: white;
+  height: 15vh;
+  color: black;
+
+  .upload-header {
+    padding-left: 8px;
+    background: #f6fafe;
+    height: 30px;
+    line-height: 30px;
+    position: relative;
+
+    .modal-title {
+      width: 90%;
+      margin: 0;
+      overflow: hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+      font-weight: 500;
+      color: #455c74;
+      font-size: 13px;
+      background: #f6fafe;
+
+      &::after {
+        content: '';
+        display: block;
+      }
+    }
+
+    .close {
+      position: absolute;
+      top: 0;
+      right: 0;
+      height: 30px;
+      width: 30px;
+      font-size: 20px;
+      font-weight: 300;
+      border: 0;
+      background: none;
+      color: #577289;
+      outline: none;
+      cursor: pointer;
+      transition: all 0.45s ease-in-out;
+
+      &:hover {
+        color: #36afd5;
+      }
+    }
+  }
+}
+
+.events-none{
+  pointer-events: none;
+}
+
+
+
+
+
+
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
new file mode 100644
index 0000000..6a6aacd
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
@@ -0,0 +1,480 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import {Component, OnInit, ViewChild, Inject, OnDestroy} from '@angular/core';
+import { FormBuilder } from '@angular/forms';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { ToastrService } from 'ngx-toastr';
+import {ApplicationSecurityService, ManageUngitService, StorageService} from '../../core/services';
+
+import {FolderTreeComponent} from './folder-tree/folder-tree.component';
+import {BucketBrowserService, TodoItemNode} from '../../core/services/bucket-browser.service';
+import {FileUtils, HelpUtils} from '../../core/util';
+import {BucketDataService} from './bucket-data.service';
+import {BucketConfirmationDialogComponent} from './bucket-confirmation-dialog/bucket-confirmation-dialog.component';
+import {HttpEventType} from '@angular/common/http';
+import {CopyPathUtils} from '../../core/util/copyPathUtils';
+import {Subject} from 'rxjs';
+import {takeUntil} from 'rxjs/operators';
+
+@Component({
+  selector: 'datalab-bucket-browser',
+  templateUrl: './bucket-browser.component.html',
+  styleUrls: ['./bucket-browser.component.scss', './upload-window.component.scss']
+})
+export class BucketBrowserComponent implements OnInit, OnDestroy {
+  public readonly uploadingQueueLength: number = 4;
+  public readonly maxFileSize: number = 4294967296;
+  public readonly refreshTokenLimit = 1500000;
+
+  private unsubscribe$ = new Subject();
+  private isTokenRefreshing = false;
+  public addedFiles = [];
+  public folderItems = [];
+  public originFolderItems = [];
+  public objectPath;
+  public path = '';
+  public pathInsideBucket = '';
+  public bucketName = '';
+  public endpoint = '';
+  public selectedFolder: any;
+  public selectedFolderForAction: any;
+  public selected: any[];
+  public bucketStatus;
+  public allDisable: boolean;
+  public isActionsOpen: boolean;
+  public folders: any[];
+  public selectedItems;
+  public searchValue: string;
+  public isQueueFull: boolean;
+  public isSelectionOpened: any;
+  public isFilterVisible: boolean;
+  public buckets;
+  public isFileUploading: boolean;
+  public cloud: string;
+
+  @ViewChild(FolderTreeComponent, {static: true}) folderTreeComponent;
+
+  constructor(
+    @Inject(MAT_DIALOG_DATA) public data: any,
+    public toastr: ToastrService,
+    public dialog: MatDialog,
+    public dialogRef: MatDialogRef<BucketBrowserComponent>,
+    private manageUngitService: ManageUngitService,
+    private _fb: FormBuilder,
+    private bucketBrowserService: BucketBrowserService,
+    public bucketDataService: BucketDataService,
+    private auth: ApplicationSecurityService,
+    private storage: StorageService,
+  ) {
+
+  }
+
+  ngOnInit() {
+    this.bucketName = this.data.bucket;
+    this.endpoint = this.data.endpoint;
+    this.bucketDataService.refreshBucketdata(this.bucketName, this.endpoint);
+    this.bucketStatus = this.data.bucketStatus;
+    this.buckets = this.data.buckets;
+    this.cloud = this.getCloud();
+    // this.cloud = 'azure';
+  }
+
+  ngOnDestroy() {
+    this.unsubscribe$.next();
+    this.unsubscribe$.complete();
+  }
+
+  public getTokenValidTime(): number {
+    const token = JSON.parse(atob(this.storage.getToken().split('.')[1]));
+    return token.exp * 1000 - new Date().getTime();
+  }
+
+  private refreshToken(): void {
+    this.isTokenRefreshing = true;
+    this.auth.refreshToken()
+      .pipe(
+        takeUntil(this.unsubscribe$)
+      )
+      .subscribe(tokens => {
+      this.storage.storeTokens(tokens);
+      this.isTokenRefreshing = false;
+      this.sendFile();
+    });
+  }
+
+  public showItem(item): void {
+    const flatItem = this.folderTreeComponent.nestedNodeMap.get(item);
+    this.folderTreeComponent.showItem(flatItem);
+  }
+
+  public closeUploadWindow(): void {
+    this.addedFiles = [];
+  }
+
+  public toggleSelectedFile(file, type): void {
+    console.log(file, type);
+    type === 'file' ?  file.isSelected = !file.isSelected : file.isFolderSelected = !file.isFolderSelected;
+    this.selected = this.folderItems.filter(item => item.isSelected);
+    this.selectedFolderForAction = this.folderItems.filter(item => item.isFolderSelected);
+    this.selectedItems = [...this.selected, ...this.selectedFolderForAction];
+    this.isActionsOpen = false;
+  }
+
+  filesPicked(files): void {
+    Array.prototype.forEach.call(files, file => {
+      this.addedFiles.push(file.webkitRelativePath);
+    });
+  }
+
+  public dissableAll(event): void {
+    this.allDisable = event;
+  }
+
+  public handleFileInput(event): void {
+    const fullFilesList = Object['values'](event.target.files);
+    if (fullFilesList.length > 0) {
+      const files = fullFilesList.filter(v => v.size < this.maxFileSize);
+      const toBigFile = fullFilesList.length !== files.length;
+      const toMany = files.length > 50;
+      if (toMany) {
+        files.length = 50;
+      }
+      if (toBigFile || toMany) {
+        this.dialog.open(BucketConfirmationDialogComponent, {data: {
+          items: {toBig: toBigFile, toMany: toMany}, type: 'upload_limitation'
+          } , width: '550px'})
+          .afterClosed().subscribe((res) => {
+         if (res) {
+           this.checkQueue(files);
+         }
+        });
+      } else {
+        this.checkQueue(files);
+      }
+    }
+    event.target.value = '';
+  }
+
+  private checkQueue(files) {
+    if (this.refreshTokenLimit > this.getTokenValidTime()) {
+      this.isTokenRefreshing = true;
+      this.auth.refreshToken()
+        .pipe(
+          takeUntil(this.unsubscribe$)
+        )
+        .subscribe(v => {
+          this.uploadingQueue(files);
+          this.isTokenRefreshing = false;
+        });
+    } else {
+      this.uploadingQueue(files);
+    }
+  }
+
+  private async uploadingQueue(files) {
+    if (files.length) {
+      let askForAll = true;
+      let skipAll = false;
+
+      const folderFiles = this.folderItems.reduce((existFiles, item) => {
+        if (!item.children) {
+          existFiles.push(item.item);
+        }
+        return existFiles;
+      }, []);
+
+      for (const file of files) {
+        const existFile = folderFiles.find(v => v === file['name']);
+        const uploadItem = {
+          name: file['name'],
+          file: file,
+          size: file.size,
+          path: this.path,
+        };
+
+        if (existFile && askForAll) {
+          const result = await this.openResolveDialog(existFile);
+          if (result) {
+            askForAll = !result.forAll;
+            if (result.forAll && !result.replaceObject) {
+              skipAll = true;
+            }
+            if (result.replaceObject) {
+              this.addedFiles.push(uploadItem);
+              this.uploadNewFile(uploadItem);
+            }
+          }
+        } else if (!existFile || (existFile && !askForAll && !skipAll)) {
+          this.addedFiles.push(uploadItem);
+          this.uploadNewFile(uploadItem);
+        }
+      }
+    }
+    setTimeout(() => {
+      const element = document.querySelector('#upload-list');
+      element && element.scrollIntoView({ block: 'end', behavior: 'smooth' });
+    }, 10);
+  }
+
+  async openResolveDialog(existFile) {
+    const dialog = this.dialog.open(BucketConfirmationDialogComponent, {
+      data: {items: existFile, type: 'resolve_conflicts'} , width: '550px'
+    });
+    return dialog.afterClosed().toPromise().then(result => {
+      return Promise.resolve(result);
+    });
+  }
+
+  public onFolderClick(event): void {
+    this.searchValue = '';
+    this.clearSelection();
+    this.selectedFolder = event.flatNode;
+    if (this.isSelectionOpened) {
+      this.isSelectionOpened = false;
+    }
+    this.folderItems = event.element ? event.element.children : event.children;
+    if (this.folderItems) {
+      this.folders = this.folderItems.filter(v => v.children);
+      const files = this.folderItems.filter(v => !v.children).sort((a, b) => a.item > b.item ? 1 : -1);
+      this.folderItems = [...this.folders, ...files];
+      this.objectPath = event.pathObject;
+      this.path = event.path;
+      this.originFolderItems = this.folderItems.map(v => v);
+      this.pathInsideBucket = this.path.indexOf('/') !== -1 ?  this.path.slice(this.path.indexOf('/') + 1) + '/' : '';
+      this.folderItems.forEach(item => item.isSelected = false);
+    }
+  }
+
+  public filterObjects(): void {
+    this.folderItems = this.originFolderItems.filter(v => v.item.toLowerCase().indexOf(this.searchValue.toLowerCase()) !== -1);
+  }
+
+  private clearSelection(): void {
+    this.folderItems.forEach(item => item.isSelected = false);
+    this.folderItems.forEach(item => item.isFolderSelected = false);
+    this.selected = this.folderItems.filter(item => item.isSelected);
+    this.selectedFolderForAction = this.folderItems.filter(item => item.isFolderSelected);
+    this.selectedItems = [];
+  }
+
+  public deleteAddedFile(file): void {
+    if ( file.subscr && file.request) {
+      this.dialog.open(BucketConfirmationDialogComponent, {data: {items: file, type: 'cancel'} , width: '550px'})
+        .afterClosed().subscribe((res) => {
+          res && file.subscr.unsubscribe();
+          res && this.addedFiles.splice(this.addedFiles.indexOf(file), 1);
+          this.isFileUploading = this.addedFiles.some(v => v.status === 'uploading');
+          this.sendFile();
+      }, () => {
+        this.isFileUploading = this.addedFiles.some(v => v.status === 'uploading');
+        this.sendFile();
+      });
+    } else {
+      this.addedFiles.splice(this.addedFiles.indexOf(file), 1);
+      this.isFileUploading = this.addedFiles.some(v => v.status === 'uploading');
+      this.sendFile();
+    }
+  }
+
+  private uploadNewFile(file): void {
+    const path = file.path.indexOf('/') !== -1 ?  this.path.slice(this.path.indexOf('/') + 1) : '';
+    const fullPath = path ? `${path}/${file.name}` : file.name;
+    const formData = new FormData();
+    formData.append('size', file.file.size);
+    formData.append('object', fullPath);
+    formData.append('bucket', this.bucketName);
+    formData.append('endpoint', this.endpoint);
+    formData.append('file', file.file);
+    file.status = 'waiting';
+
+    file.request = this.bucketBrowserService.uploadFile(formData);
+    this.sendFile(file);
+  }
+
+  public sendFile(file?): void {
+    const waitUploading = this.addedFiles.filter(v => v.status === 'waiting');
+    const uploading = this.addedFiles.filter(v => v.status === 'uploading');
+    this.isQueueFull = !!waitUploading.length;
+    this.isFileUploading = this.addedFiles.some(v => v.status === 'uploading');
+    // console.log((this.getTokenValidTime() / 1000 / 60 ).toFixed(0) + ' minutes');
+    if ((this.refreshTokenLimit > this.getTokenValidTime()) && !this.isTokenRefreshing) {
+      this.refreshToken();
+    }
+    if (waitUploading.length && uploading.length < this.uploadingQueueLength) {
+      if (!file) {
+        file = waitUploading[0];
+      }
+      file.status = 'uploading';
+      this.isFileUploading = this.addedFiles.some(v => v.status === 'uploading');
+      this.isQueueFull = this.addedFiles.some(v => v.status === 'waiting');
+      file.subscr =  file.request.subscribe((event: any) => {
+          if (event.type === HttpEventType.UploadProgress) {
+             file.progress = Math.round(95 * event.loaded / event.total);
+            if (file.progress === 95 && !file.interval) {
+              file.interval = setInterval(() => {
+                if (file.progress < 99) {
+                  return file.progress++;
+                }
+              }, file.size < 1094967296 ? 12000 : 20000);
+            }
+          } else if (event['type'] === HttpEventType.Response) {
+            window.clearInterval(file.interval);
+            file.status = 'uploaded';
+            delete file.request;
+            this.sendFile(this.addedFiles.find(v => v.status === 'waiting'));
+            this.bucketDataService.refreshBucketdata(this.bucketName, this.endpoint);
+          }
+        }, error => {
+        window.clearInterval(file.interval);
+          file.status = 'failed';
+          delete file.request;
+          this.sendFile(this.addedFiles.find(v => v.status === 'waiting'));
+        }
+      );
+    }
+
+  }
+
+  public refreshBucket(): void {
+    this.path = '';
+    this.bucketDataService.refreshBucketdata(this.bucketName, this.endpoint);
+    this.isSelectionOpened = false;
+  }
+
+  public openBucket($event): void {
+    this.bucketName = $event.name;
+    this.endpoint = $event.endpoint;
+    this.path = '';
+    this.bucketDataService.refreshBucketdata(this.bucketName, this.endpoint);
+    this.isSelectionOpened = false;
+    this.cloud = this.getCloud();
+  }
+
+  private getCloud(): string {
+    return this.buckets.filter(v => v.children.some(bucket => {
+      return bucket.name === this.bucketName;
+    }))[0].cloud.toLowerCase();
+  }
+
+  public createFolder(folder): void {
+    this.allDisable = true;
+    this.folderTreeComponent.addNewItem(folder, '', false);
+  }
+
+  public fileAction(action): void {
+    const selected = this.folderItems.filter(item => item.isSelected);
+    const folderSelected = this.folderItems.filter(item => item.isFolderSelected);
+    if (action === 'download') {
+      this.clearSelection();
+      this.isActionsOpen = false;
+      const path = encodeURIComponent(`${this.pathInsideBucket}${selected[0].item}`);
+      selected[0]['isDownloading'] = true;
+      this.folderItems.forEach(item => item.isSelected = false);
+      this.bucketBrowserService.downloadFile(`/${this.bucketName}/object/${path}/endpoint/${this.endpoint}/download`)
+        .pipe(
+          takeUntil(this.unsubscribe$)
+        )
+        .subscribe(event =>  {
+            if (event['type'] === HttpEventType.DownloadProgress) {
+              selected[0].progress = Math.round(100 * event['loaded'] / selected[0].object.size);
+            }
+            if (event['type'] === HttpEventType.Response) {
+              FileUtils.downloadBigFiles(event['body'], selected[0].item);
+              setTimeout(() => {
+                selected[0]['isDownloading'] = false;
+                selected[0].progress = 0;
+              }, 1000);
+            }
+        }, error => {
+            this.toastr.error(error.message || 'File downloading error!', 'Oops!');
+            selected[0]['isDownloading'] = false;
+          }
+        );
+    }
+
+    if (action === 'delete') {
+      const itemsForDeleting = [...folderSelected, ...selected];
+      const objects = itemsForDeleting.map(obj => obj.object.object);
+      let dataForServer = [];
+      objects.forEach(object => {
+        dataForServer.push(...this.bucketDataService.serverData.map(v => v.object).filter(v => v.indexOf(object) === 0));
+      });
+      dataForServer = [...dataForServer, ...objects].filter((v, i, arr) => i === arr.indexOf(v));
+      this.dialog.open(BucketConfirmationDialogComponent, {data: {items: itemsForDeleting, type: 'delete'} , width: '550px'})
+        .afterClosed().subscribe((res) => {
+        !res && this.clearSelection();
+        res && this.bucketBrowserService.deleteFile({
+          bucket: this.bucketName, endpoint: this.endpoint, 'objects': dataForServer
+        })
+          .pipe(
+            takeUntil(this.unsubscribe$)
+          )
+          .subscribe(() => {
+            this.bucketDataService.refreshBucketdata(this.bucketName, this.endpoint);
+            this.toastr.success('Objects successfully deleted!', 'Success!');
+            this.clearSelection();
+          }, error => {
+          this.toastr.error(error.message || 'Objects deleting error!', 'Oops!');
+          this.clearSelection();
+        });
+      });
+
+    }
+  }
+
+  public toogleActions(): void {
+    this.isActionsOpen = !this.isActionsOpen;
+  }
+
+  public closeActions(): void {
+    this.isActionsOpen = false;
+  }
+
+  public copyPath(): void {
+    const selected = this.folderItems.filter(item => item.isSelected || item.isFolderSelected)[0];
+    const cloud = this.getCloud();
+    const protocol = HelpUtils.getBucketProtocol(cloud);
+    if (cloud !== 'azure') {
+      CopyPathUtils.copyPath(protocol + selected.object.bucket + '/' + selected.object.object);
+    } else {
+      const bucketName = selected.object.bucket;
+      const accountName = this.bucketName.replace(selected.object.bucket, '').slice(0, -1);
+      const azureBucket = bucketName + '@' + accountName + '.blob.core.windows.net' + '/' + selected.object.object;
+      CopyPathUtils.copyPath(protocol + azureBucket);
+    }
+    this.clearSelection();
+    this.isActionsOpen = false;
+    this.toastr.success('Object path successfully copied!', 'Success!');
+  }
+
+  public toggleBucketSelection(): void {
+    this.isSelectionOpened = !this.isSelectionOpened;
+  }
+
+  public closeFilterInput(): void {
+    this.isFilterVisible = false;
+    this.searchValue = '';
+    this.filterObjects();
+  }
+
+}
+
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.module.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.module.ts
new file mode 100644
index 0000000..21deedf
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.module.ts
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+
+import { MaterialModule } from '../../shared/material.module';
+import { ResourcesGridModule } from '../resources-grid';
+import { ExploratoryEnvironmentCreateModule } from '../exploratory/create-environment';
+
+import {BucketBrowserComponent} from './bucket-browser.component';
+import {FolderTreeComponent} from './folder-tree/folder-tree.component';
+import {MatTreeModule} from '@angular/material/tree';
+import {BucketDataService} from './bucket-data.service';
+import {BucketConfirmationDialogComponent} from './bucket-confirmation-dialog/bucket-confirmation-dialog.component';
+import {BucketTreeComponent} from './buckets-tree/bucket-tree.component';
+import {ConvertFileSizePipeModule} from '../../core/pipes/convert-file-size';
+import {LocalDatePipeModule} from '../../core/pipes/local-date-pipe';
+import {ConvertActionPipeModule} from '../../core/pipes/convert-action-pipe';
+import {CheckboxModule} from '../../shared/checkbox';
+
+@NgModule({
+    imports: [
+        CommonModule,
+        FormsModule,
+        ReactiveFormsModule,
+        ResourcesGridModule,
+        ExploratoryEnvironmentCreateModule,
+        MaterialModule,
+        MatTreeModule,
+        ConvertFileSizePipeModule,
+        LocalDatePipeModule,
+        ConvertActionPipeModule,
+        CheckboxModule
+    ],
+  declarations: [
+    BucketBrowserComponent,
+    FolderTreeComponent,
+    BucketTreeComponent,
+    BucketConfirmationDialogComponent
+  ],
+  entryComponents: [BucketBrowserComponent, FolderTreeComponent, BucketTreeComponent, BucketConfirmationDialogComponent],
+  providers: [BucketDataService],
+})
+export class BucketBrowserModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-confirmation-dialog/bucket-confirmation-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-confirmation-dialog/bucket-confirmation-dialog.component.html
new file mode 100644
index 0000000..3d31f7d
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-confirmation-dialog/bucket-confirmation-dialog.component.html
@@ -0,0 +1,119 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<div id="dialog-box" class="confirmation-dialog">
+
+  <header class="dialog-header">
+    <h4 class="modal-title">
+        <span>{{ data.type.toUpperCase() | convertaction}} </span>
+    </h4>
+    <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
+  </header>
+
+  <div class="dialog-content">
+    <div class="content-box">
+      <div *ngIf="data.type === 'delete'">
+        <mat-list class="resources">
+
+          <mat-list-item class="list-header">
+            <div class="object">Object</div>
+            <div class="size">Size</div>
+          </mat-list-item>
+
+          <div class="scrolling-content delete-list" id="scrolling">
+
+            <mat-list-item *ngFor="let object of data.items" class="delete-item">
+              <div class="object">
+                <span *ngIf="object['children']"><i class="material-icons folder-icon" >folder</i></span>
+                <span *ngIf="!object['children']"><i class="material-icons folder-icon file-icon" >description</i></span>
+                <div class="ellipsis"
+                     matTooltip="{{object['item']}}"
+                     matTooltipPosition="above"
+                     matTooltipShowDelay="1000"
+                     [matTooltipClass]="'full-size-tooltip'">{{object['item']}}</div>
+              </div>
+              <div  class="size">{{object['children'] ? '-' : object['object'].size | convertFileSize}}</div>
+            </mat-list-item>
+
+          </div>
+        </mat-list>
+
+        <div mat-dialog-content class="bottom-message" *ngIf="data.type === 'delete'">
+          <span class="confirm-message" *ngIf="isFolders">All affected objects will be deleted.</span>
+          <span class="confirm-message" *ngIf="!isFolders"><span *ngIf="data.items.length > 1">These objects</span><span *ngIf="data.items.length === 1">This object</span> will be deleted.</span>
+        </div>
+
+        <div class="text-center m-top-20">
+          <p class="strong">Do you want to proceed?</p>
+        </div>
+      </div>
+
+      <div *ngIf="data.type === 'resolve_conflicts'">
+        <p>
+          <span
+          class="strong upload-item-name ellipsis"
+          matTooltip="{{data.items}}"
+          matTooltipPosition="above"
+          matTooltipShowDelay="1000"
+          [matTooltipClass]="'full-size-tooltip'"
+        >{{data.items}}</span> already exists in selected folder. How would you like to resolve this conflict?</p>
+        <mat-radio-group
+          aria-labelledby="upload-radio-group-label"
+          class="upload-radio-group"
+          [(ngModel)]="fileAction">
+          <mat-radio-button class="upload-radio-button" *ngFor="let action of uploadActions" [value]="action">
+            {{action}}
+          </mat-radio-button>
+        </mat-radio-group>
+        <div class="repeat-for-all" >
+          <div class="empty-checkbox" [ngClass]="{'checked': actionForAll}" (click)="toggleActionForAll();$event.stopPropagation()" >
+            <span class="checked-checkbox" *ngIf="actionForAll"></span>
+          </div>
+          <span class="repeat-message" (click)="toggleActionForAll();$event.stopPropagation()">Repeat for all remaining conflicts</span>
+        </div>
+      </div>
+
+      <div *ngIf="data.type === 'cancel'">
+        <p class="upload-message"><span>Cancel uploading file </span> <span class="strong ellipsis upload-item-name">{{data.items.name}}.</span></p>
+        <div class="text-center m-top-20">
+          <span class="strong">Do you want to proceed?</span>
+        </div>
+      </div>
+
+      <div *ngIf="data.type === 'upload_limitation'">
+        <p class="upload-limit-message" *ngIf="data.items.toMany">Only the first fifty objects will be uploaded.</p>
+        <p class="upload-limit-message" *ngIf="data.items.toBig">Only file(s) within 4 GB will be uploaded.</p>
+        <div class="text-center m-top-20">
+          <span class="strong">Do you want to proceed?</span>
+        </div>
+      </div>
+
+      <div class="text-center m-top-20" *ngIf="data.type === 'delete' || data.type === 'cancel' || data.type === 'upload_limitation'">
+        <button  mat-raised-button type="button" class="butt action" (click)="dialogRef.close()">No</button>
+        <button mat-raised-button type="button" class="butt butt-success action" (click)="dialogRef.close(true)">Yes</button>
+      </div>
+
+      <div class="text-center m-top-20" *ngIf="data.type === 'resolve_conflicts'">
+        <button  mat-raised-button type="button" class="butt action" (click)="dialogRef.close()">Cancel</button>
+        <button mat-raised-button type="button" class="butt butt-success action" (click)="submitResolving()">Continue</button>
+      </div>
+
+    </div>
+  </div>
+</div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-confirmation-dialog/bucket-confirmation-dialog.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-confirmation-dialog/bucket-confirmation-dialog.component.scss
new file mode 100644
index 0000000..ab9ade2
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-confirmation-dialog/bucket-confirmation-dialog.component.scss
@@ -0,0 +1,169 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.confirmation-dialog {
+
+  .folder-icon{
+    color: rgb(232, 232, 232);
+    margin-right: 3px;
+    transform: translateX(-2px);
+    &.file-icon{
+      transform: translateX(-4px);
+      margin-right: -2px;
+    }
+  }
+  h3{
+    margin-bottom: 20px;
+  }
+  color: #718ba6;
+  p {
+    font-size: 14px;
+    font-weight: 400;
+    margin: 0;
+    margin-bottom: 10px;
+    &.upload-limit-message{
+      text-align: center;
+      color: red;
+      font-size: 14px;
+    }
+    &.info {
+      font-weight: 500;
+    }
+  }
+  .resources {
+    .mat-list-base .mat-list-item.delete-item{
+      height: 30px;
+    }
+
+    .object {
+      width: 70%;
+      display: flex;
+      align-items: center;
+      padding-right: 10px;
+    }
+
+    .size {
+      width: 30%;
+    }
+    .scrolling-content.delete-list {
+      max-height: 200px;
+      overflow-y: auto;
+      padding-top: 11px;
+    }
+  }
+
+  .list-header {
+    border-top: 1px solid #edf1f5;
+    border-bottom: 1px solid #edf1f5;
+    color: #577289;
+    width: 100%;
+  }
+
+  .bottom-message{
+    padding-top: 20px;
+    text-align: center;
+    .confirm-message{
+      color: #ef5c4b;
+      font-size: 13px;
+      min-height: 18px;
+      text-align: center;
+      padding-top: 20px}
+  }
+.upload-item-name{
+  max-width: 300px;
+  display: inline-flex;
+}
+
+.mat-radio-button{
+  font-family: inherit;
+  .mat-radio-ripple{
+    display: none;
+  }
+}
+  .upload-radio-group{
+    display: flex;
+    flex-direction: column;
+    .upload-radio-button {
+      padding: 10px 0;
+
+      .mat-radio-container {
+        width: 15px;
+        height: 15px;
+        .mat-radio-outer-circle, .mat-radio-inner-circle  {
+          width: 15px;
+          height: 15px;
+          border-color: lightgrey;
+        }
+      }
+
+      &.mat-radio-checked {
+        .mat-radio-outer-circle {
+          border-color: #35afd5;
+        }
+
+        .mat-radio-inner-circle {
+          background-color: #35afd5;
+        }
+      }
+    }
+  }
+  .repeat-for-all{
+    display: flex;
+    margin-top: 15px;
+    margin-bottom: 40px;
+    .repeat-message{
+      padding-left: 5px;
+      cursor: pointer;
+    }
+  }
+  .empty-checkbox {
+    min-width: 16px;
+    width: 16px;
+    height: 16px;
+    border-radius: 2px;
+    border: 2px solid lightgrey;
+    margin-top: 2px;
+    position: relative;
+    cursor: pointer;
+    &.checked {
+      border-color: #35afd5;
+      background-color: #35afd5;
+    }
+    .checked-checkbox {
+      top: 0;
+      left: 4px;
+      width: 5px;
+      height: 10px;
+      border-bottom: 2px solid white;
+      border-right: 2px solid white;
+      position: absolute;
+      transform: rotate(45deg);
+    }
+  }
+}
+.upload-message{
+  display: flex;
+  justify-content: center;
+  .upload-item-name{
+    max-width: 340px;
+    display: block;
+    padding-left: 4px;
+  }
+}
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-confirmation-dialog/bucket-confirmation-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-confirmation-dialog/bucket-confirmation-dialog.component.ts
new file mode 100644
index 0000000..7c8e49a
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-confirmation-dialog/bucket-confirmation-dialog.component.ts
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Component, OnInit, Inject, ViewEncapsulation } from '@angular/core';
+import { ToastrService } from 'ngx-toastr';
+import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+
+@Component({
+  selector: 'bucket-confirmation-dialog',
+  templateUrl: 'bucket-confirmation-dialog.component.html',
+  styleUrls: ['./bucket-confirmation-dialog.component.scss'],
+  encapsulation: ViewEncapsulation.None
+})
+
+export class BucketConfirmationDialogComponent implements OnInit {
+  isFolders: boolean = false;
+  uploadActions = ['Replace existing object', 'Skip uploading object'];
+  fileAction: string = this.uploadActions[1];
+  actionForAll: boolean = false;
+  constructor(
+    @Inject(MAT_DIALOG_DATA) public data: any,
+    public dialogRef: MatDialogRef<BucketConfirmationDialogComponent>,
+    public toastr: ToastrService
+  ) {
+
+  }
+
+  ngOnInit() {
+    if (this.data.type === 'delete') {
+      this.isFolders = !!this.data.items.filter(v => v.children).length;
+    }
+  }
+
+  toggleActionForAll() {
+    this.actionForAll = !this.actionForAll;
+  }
+
+  submitResolving() {
+    const submitObj = {replaceObject: !this.uploadActions.indexOf(this.fileAction), forAll: this.actionForAll};
+    this.dialogRef.close(submitObj);
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-data.service.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-data.service.ts
new file mode 100644
index 0000000..8a5bf48
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-data.service.ts
@@ -0,0 +1,201 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Injectable } from '@angular/core';
+import { BehaviorSubject} from 'rxjs';
+import { BucketBrowserService, TodoItemNode } from '../../core/services/bucket-browser.service';
+
+
+// const array = [{'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder11/', 'size': '18', 'lastModifiedDate': '1600846214842'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '51.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'Untitlsed', 'size': '5', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'adassdas', 'size': '1', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'downloadTest.txt', 'size': '16', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/', 'size': '11', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/2.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder31/3.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/folder1/folder1/folder1/folder1/test.pem', 'size': '1', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder12/', 'size': '11', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder3/1.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'objectName', 'size': '5', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'sss.txt', 'size': '52', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test', 'size': '12', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test.pem', 'size': '1', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test1', 'size': '52', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test2', 'size': '52', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'zzz', 'size': '12', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '4.txt/dsafaraorueajkegrgavhsfnvgahsfgsdjfhagsdjfg497frgfhsdajfsgdafj', 'size': '18', 'lastModifiedDate': '1600846214842'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '5.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'Untitled', 'size': '5', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'adasdas', 'size': '1', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'downloadTest.txt', 'size': '16', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/', 'size': '11', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/2.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder31/3.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+// {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder31/folder1/3.txt', 'size': '5', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '2.jpg', 'size': '52', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '1test', 'size': '112', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test.pem', 'size': '1', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test11', 'size': '52', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test2', 'size': '52', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'zzsz', 'size': '12', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '4.txt/dsafaraorueajkegrgavhsfnvgahsfgsdjfhagsdjfg497frgfhsdajfsgdafj', 'size': '18', 'lastModifiedDate': '1600846214842'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '5.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'Untitled', 'size': '5', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'adasdas', 'size': '1', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'downloadTest.txt', 'size': '16', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1212/', 'size': '11', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/2.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/3.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'fol2der1/folder1/folder1/folder1/2folder1/test.pem',
+//     'size': '1', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder2/', 'size': '11', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder3/1.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'objectName', 'size': '5', 'lastModifiedDate': '1600846212142'},
+// {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '5.jpg', 'size': '52', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test', 'size': '12', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test.pem', 'size': '1', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test1', 'size': '52', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test2', 'size': '52', 'lastModifiedDate': '1600846212142'},
+//   {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'zzz', 'size': '12', 'lastModifiedDate': '1600846212142'}];
+
+@Injectable()
+export class BucketDataService {
+  public _bucketData = new BehaviorSubject<any>(null);
+  public serverData: any = [];
+
+  get data(): TodoItemNode[] {
+    return this._bucketData.value;
+  }
+
+  emptyFolder = null;
+
+  constructor(
+    private bucketBrowserService: BucketBrowserService,
+  ) {
+  }
+
+  public refreshBucketdata(bucket, endpoint) {
+    let backetData = [];
+    this.bucketBrowserService.getBucketData(bucket, endpoint).subscribe(v => {
+    const copiedData = JSON.parse(JSON.stringify(v));
+    this.serverData = v;
+    if (this.emptyFolder) {
+      copiedData.unshift(this.emptyFolder);
+    }
+
+    backetData = this.convertToFolderTree(copiedData);
+    const data = this.buildFileTree({[bucket]: backetData}, 0);
+    this._bucketData.next(data);
+    });
+    // if (this.emptyFolder) {
+    //   array.unshift(this.emptyFolder);
+    // }
+    // this.serverData = array;
+    // backetData = this.convertToFolderTree(array);
+    // const data = this.buildFileTree({[bucket]: backetData}, 0);
+    // this._bucketData.next(data);
+  }
+
+  public buildFileTree(obj: {[key: string]: any}, level: number): TodoItemNode[] {
+      return Object.keys(obj).reduce<TodoItemNode[]>((accumulator, key) => {
+        if (key === '') {
+          return accumulator;
+        }
+        const value = obj[key];
+        const node = new TodoItemNode();
+        node.item = key;
+        if (value === '') {
+          node.children = this.buildFileTree({}, level + 1);
+          return accumulator.concat(node);
+        }
+        if (Object.keys(value).filter(v => v !== 'obj').length > 0) {
+          if (typeof value === 'object') {
+            node.object = value.obj || {'bucket': node.item, 'object': '', 'size': '', 'lastModifiedDate': ''};
+            delete value.obj;
+            node.children = this.buildFileTree(value, level + 1);
+          } else {
+            node.item = value;
+          }
+        } else {
+          node.object = value.obj;
+        }
+        return accumulator.concat(node);
+      }, []);
+    }
+
+  public insertItem(parent: TodoItemNode, name, isFile, emptyFolderObj?) {
+    if (parent.children) {
+        if (isFile) {
+          parent.children.unshift(name as TodoItemNode);
+        } else {
+          if (name) {
+            console.log('parentObject', parent.object);
+            const child = {item: name, children: [], object: JSON.parse(JSON.stringify(parent.object))};
+            child.object.object = child.object.object.replace(/ا/g, '') + child.item + '/';
+            parent.children.unshift(child as TodoItemNode);
+          } else {
+            parent.children.unshift({item: '', children: [], object: {}} as TodoItemNode);
+            this.emptyFolder = emptyFolderObj;
+            this._bucketData.next(this.data);
+          }
+        }
+      }
+    }
+
+  public updateItem(node: TodoItemNode, file) {
+      node.item = file;
+      this._bucketData.next(this.data);
+  }
+
+  public removeItem(parent, child) {
+     parent.children.splice( parent.children.indexOf(child), 1);
+     this._bucketData.next(this.data);
+  }
+
+  public processFiles = (files, target, object) => {
+    let pointer = target;
+    files.forEach((file) => {
+      if (!pointer[file]) {
+        pointer[file] = {};
+      }
+      pointer = pointer[file];
+      if (!pointer.obj) {
+        pointer.obj = object;
+      }
+
+    });
+  }
+
+  public processFolderArray = (acc, curr) => {
+    const files = curr.object.split('/');
+    this.processFiles(files, acc, curr);
+
+    return acc;
+  }
+
+  public convertToFolderTree = (data) => {
+    const finalData = data.reduce(this.processFolderArray, {});
+    if (Object.keys(finalData).length === 0) {
+      return '';
+    }
+    return finalData;
+  }
+
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.html
new file mode 100644
index 0000000..621370c
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.html
@@ -0,0 +1,44 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<mat-tree [dataSource]="dataSource" [treeControl]="treeControl">
+  <mat-tree-node
+    *matTreeNodeDef="let node"
+    matTreeNodePadding matTreeNodePaddingIndent="17"
+    (click)="openBucketData(node)"
+    [ngClass]="{'active-item': activeBacket === node}">
+    <button mat-icon-button disabled></button>
+    <div
+      class="ellipsis"
+      matTooltip="{{node.name}}"
+      matTooltipPosition="above"
+      matTooltipShowDelay="1000"
+      [matTooltipClass]="'full-size-tooltip'"
+    >{{node.name}}</div>
+  </mat-tree-node>
+  <mat-tree-node *matTreeNodeDef="let node;when: hasChild" matTreeNodePadding matTreeNodePaddingIndent="17">
+    <button mat-icon-button matTreeNodeToggle
+            [attr.aria-label]="'toggle ' + node.name">
+      <mat-icon class="mat-icon-rtl-mirror">
+        {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
+      </mat-icon>
+    </button>
+    <span (click)="toggleProject(node, treeControl.isExpanded(node))">{{node.name}}</span>
+  </mat-tree-node>
+</mat-tree>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.scss
new file mode 100644
index 0000000..06ea47e
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.scss
@@ -0,0 +1,117 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.folder{
+  padding-left: 5px;
+  max-width: 350px;
+  white-space: nowrap;
+  overflow: hidden;
+}
+
+.mat-tree{
+  font-family: 'Open Sans', sans-serif;
+}
+
+.folder-icon{
+  color: rgb(232, 232, 232);
+}
+
+.folder-item-line{
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+
+}
+
+.active-item {
+  color: #00bcd4;
+  i{
+    color: #00bcd4;
+  }
+}
+
+.add-folder-form{
+  display: flex;
+  align-items: center;
+}
+
+.mat-tree-node:not(.input-node){
+  cursor: pointer;
+  transition: .3s;
+  overflow: unset;
+  min-height: auto;
+  button.mat-icon-button{
+    width: 25px;
+    height: 25px;
+    line-height: 28px;
+  }
+
+  &:hover{
+    color: #00bcd4;
+
+    i{
+      color: #00bcd4;
+    }
+  }
+}
+
+.input-node {
+  overflow: unset;
+  padding-top: 5px;
+  padding-bottom: 7px;
+
+
+  button.mat-icon-button {
+    &.action-btn {
+      color: lightgrey;
+      font-size: 20px;
+      cursor: not-allowed;
+    }
+
+    &.check {
+      color: #49af38;
+      cursor: pointer;
+
+      &:hover {
+        border-color: #49af38;
+        background: #f9fafb;
+      }
+    }
+
+    &.close {
+      color: #f1696e;
+      cursor: pointer;
+
+      &:hover {
+        border-color: #f1696e;
+        background: #f9fafb;
+      }
+    }
+  }
+
+  .mat-error {
+    background-color: #ffffff;
+  }
+}
+
+
+
+
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.ts
new file mode 100644
index 0000000..e00375a
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/buckets-tree/bucket-tree.component.ts
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
+import {FlatTreeControl} from '@angular/cdk/tree';
+import {MatTreeFlatDataSource, MatTreeFlattener} from '@angular/material/tree';
+
+
+interface BucketNode {
+  name: string;
+  endpoint?: string;
+  children?: BucketNode[];
+}
+
+interface BucketFlatNode {
+  expandable: boolean;
+  name: string;
+  level: number;
+}
+
+@Component({
+  selector: 'datalab-bucket-tree',
+  templateUrl: './bucket-tree.component.html',
+  styleUrls: ['./bucket-tree.component.scss']
+})
+
+export class BucketTreeComponent implements OnInit {
+  @Output() emitActiveBucket: EventEmitter<{}> = new EventEmitter();
+  @Input() openedBucket: string;
+  @Input() buckets: BucketNode[];
+
+  private _transformer = (node: BucketNode, level: number) => {
+    return {
+      expandable: !!node.children && node.children.length > 0,
+      name: node.name,
+      endpoint: node.endpoint,
+      level: level,
+    };
+  }
+
+  treeControl = new FlatTreeControl<BucketFlatNode>(
+    node => node.level, node => node.expandable);
+
+  treeFlattener = new MatTreeFlattener(
+    this._transformer, node => node.level, node => node.expandable, node => node.children);
+
+  dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
+  private activeBucketName: string;
+  public activeBacket: any;
+
+  constructor() {
+  }
+
+  ngOnInit() {
+    this.activeBucketName = this.openedBucket || '';
+    this.dataSource.data = this.buckets;
+    this.setActiveBucket();
+  }
+
+  public openBucketData(bucket): void {
+    this.dataSource['_treeControl'].collapseAll();
+    this.setActiveBucket(bucket);
+    this.emitActiveBucket.emit(bucket);
+  }
+
+  public setActiveBucket(bucket?): void {
+    this.activeBacket = bucket || this.dataSource._flattenedData.getValue().filter(v => v.name === this.openedBucket)[0];
+    this.expandAllParents(this.activeBacket);
+  }
+
+  public toggleProject(el, isExpanded): void {
+    isExpanded ? this.treeControl.collapse(el) : this.treeControl.expand(el);
+  }
+
+  private expandAllParents(el): void {
+    if (el) {
+      this.treeControl.expand(el);
+      if (this.getParentNode(el) !== null) {
+        this.expandAllParents(this.getParentNode(el));
+      }
+    }
+  }
+
+  private getParentNode(node: BucketFlatNode): BucketFlatNode | null {
+    const currentLevel = node.level;
+    if (currentLevel < 1) {
+      return null;
+    }
+
+    const startIndex = this.treeControl.dataNodes.indexOf(node) - 1;
+
+    for (let i = startIndex; i >= 0; i--) {
+      const currentNode = this.treeControl.dataNodes[i];
+
+      if (currentNode.level < currentLevel) {
+        return currentNode;
+      }
+    }
+    return null;
+  }
+
+  public hasChild = (_: number, node: BucketFlatNode) => node.expandable;
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
new file mode 100644
index 0000000..ffa5900
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.html
@@ -0,0 +1,85 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<mat-tree [dataSource]="dataSource" [treeControl]="treeControl">
+
+  <mat-tree-node
+    *matTreeNodeDef="let node"
+    matTreeNodeToggle matTreeNodePadding
+    matTreeNodePaddingIndent="17"
+    [ngStyle]="{'display': 'none'}"
+  >
+    <button mat-icon-button disabled></button>
+    {{node.item}}
+  </mat-tree-node>
+
+  <mat-tree-node *matTreeNodeDef="let node; when: hasNoContent" matTreeNodePadding matTreeNodePaddingIndent="17" class="input-node">
+    <form class="add-folder-form" id="folder-form">
+      <mat-form-field>
+        <mat-label>New folder</mat-label>
+        <input matInput #itemValue [formControl]="folderFormControl" [errorStateMatcher]="matcher">
+        <mat-error *ngIf="!folderFormControl.hasError('required') && !folderFormControl.hasError('isDuplicate')">
+          The folder name can only contain Latin letters, numbers and special characters except for #, ?, /, \, %."
+        </mat-error>
+        <mat-error *ngIf="folderFormControl.hasError('required')">
+          Folder name is <strong>required</strong>.
+        </mat-error>
+        <mat-error *ngIf="folderFormControl.hasError('isDuplicate')">
+          Folder with this name already exists.
+        </mat-error>
+        <mat-hint *ngIf="cloud === 'azure'">If you do not upload any object to the folder, this folder will be removed on MS Azure</mat-hint>
+      </mat-form-field>
+      <button (click)="createFolder(node, itemValue.value)"
+              [ngClass]="{'check': folderFormControl.valid && folderFormControl.dirty && !folderCreating}"
+              mat-icon-button class="btn action-btn"
+              [disabled]="!folderFormControl.valid || !folderFormControl.dirty"
+              matTooltip="Please wait! Folder is creating."
+              [matTooltipDisabled]="!folderCreating"
+              matTooltipPosition="above"
+      >
+        <span><i class="material-icons ">check</i></span></button>
+      <button (click)="removeItem(node)" mat-icon-button class="btn close action-btn"><span ><i class="material-icons ">close</i></span></button>
+    </form>
+  </mat-tree-node>
+
+  <mat-tree-node *matTreeNodeDef="let node; when: hasChild" matTreeNodePadding matTreeNodePaddingIndent="17" [ngClass]="{'cursor-not-allow': bucketDataService.emptyFolder}">
+    <button mat-icon-button matTreeNodeToggle
+            [attr.aria-label]="'toggle ' + node.filename" [ngClass]="{'not-allowed': bucketDataService.emptyFolder}">
+      <mat-icon class="mat-icon-rtl-mirror" [ngClass]="{'active-item': (selectedFolder === node && !bucketDataService.emptyFolder)}">
+        {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
+      </mat-icon>
+    </button>
+    <div
+      (click)="showItem(node)"
+      class="folder-item-line"
+      [ngClass]="{'active-item': (selectedFolder === node && !bucketDataService.emptyFolder), 'not-allowed': bucketDataService.emptyFolder}"
+    >
+      <i class="material-icons folder-icon">folder</i>
+      <span
+        class="folder ellipsis"
+        matTooltip="{{node.item}}"
+        matTooltipPosition="above"
+        matTooltipShowDelay="1000"
+        [matTooltipClass]="'full-size-tooltip'"
+      >
+        {{node.item}}
+      </span>
+    </div>
+  </mat-tree-node>
+</mat-tree>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
new file mode 100644
index 0000000..2cd5cae
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.scss
@@ -0,0 +1,120 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.folder{
+  padding-left: 5px;
+  max-width: 350px;
+  white-space: nowrap;
+  overflow: hidden;
+}
+
+.mat-tree{
+  font-family: 'Open Sans', sans-serif;
+}
+
+.folder-icon{
+  color: rgb(232, 232, 232);
+}
+
+.folder-item-line{
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+
+}
+
+.active-item {
+  color: #00bcd4;
+  i{
+    color: #00bcd4;
+  }
+
+
+}
+
+.add-folder-form{
+  display: flex;
+  align-items: center;
+}
+
+.mat-tree-node:not(.input-node){
+  cursor: pointer;
+  transition: .3s;
+  overflow: unset;
+  min-height: auto;
+  button.mat-icon-button{
+    width: 25px;
+    height: 25px;
+    line-height: 28px;
+  }
+}
+
+.mat-tree-node:not(.input-node):not(.cursor-not-allow){
+  &:hover{
+    color: #00bcd4;
+    i{
+      color: #00bcd4;
+    }
+  }
+}
+
+.input-node {
+  overflow: unset;
+  padding-top: 5px;
+  padding-bottom: 7px;
+
+
+  button.mat-icon-button {
+    &.action-btn {
+      color: lightgrey;
+      font-size: 20px;
+      cursor: not-allowed;
+    }
+
+    &.check {
+      color: #49af38;
+      cursor: pointer;
+
+      &:hover {
+        border-color: #49af38;
+        background: #f9fafb;
+      }
+    }
+
+    &.close {
+      color: #f1696e;
+      cursor: pointer;
+
+      &:hover {
+        border-color: #f1696e;
+        background: #f9fafb;
+      }
+    }
+  }
+
+  .mat-error {
+    background-color: #ffffff;
+  }
+}
+
+
+
+
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
new file mode 100644
index 0000000..900723d
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/folder-tree/folder-tree.component.ts
@@ -0,0 +1,287 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import {Component, Output, EventEmitter, OnDestroy, Input, OnInit} from '@angular/core';
+import {FlatTreeControl} from '@angular/cdk/tree';
+import {MatTreeFlatDataSource, MatTreeFlattener} from '@angular/material/tree';
+import {BucketBrowserService, TodoItemFlatNode, TodoItemNode} from '../../../core/services/bucket-browser.service';
+import {BucketDataService} from '../bucket-data.service';
+import {Subscription} from 'rxjs';
+import {FormControl, FormGroupDirective, NgForm, Validators} from '@angular/forms';
+import {ErrorStateMatcher} from '@angular/material/core';
+import {PATTERNS} from '../../../core/util';
+import {ToastrService} from 'ngx-toastr';
+
+export class MyErrorStateMatcher implements ErrorStateMatcher {
+  isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
+    const isSubmitted = form && form.submitted;
+    return !!(control && control.invalid && (control.dirty));
+  }
+}
+
+
+
+@Component({
+  selector: 'datalab-folder-tree',
+  templateUrl: './folder-tree.component.html',
+  styleUrls: ['./folder-tree.component.scss']
+})
+
+export class FolderTreeComponent implements OnDestroy {
+
+  @Output() showFolderContent: EventEmitter<any> = new EventEmitter();
+  @Output() disableAll: EventEmitter<any> = new EventEmitter();
+  @Input() folders;
+  @Input() endpoint: string;
+  @Input() cloud: string;
+
+  private folderTreeSubs;
+  private path = [];
+  public selectedFolder: TodoItemFlatNode;
+  private flatNodeMap = new Map<TodoItemFlatNode, TodoItemNode>();
+  private nestedNodeMap = new Map<TodoItemNode, TodoItemFlatNode>();
+
+  public folderCreating = false;
+  private subscriptions: Subscription = new Subscription();
+  public treeControl: FlatTreeControl<TodoItemFlatNode>;
+  private treeFlattener: MatTreeFlattener<TodoItemNode, TodoItemFlatNode>;
+  public dataSource: MatTreeFlatDataSource<TodoItemNode, TodoItemFlatNode>;
+
+  constructor(
+    public toastr: ToastrService,
+    private bucketBrowserService: BucketBrowserService,
+    public bucketDataService: BucketDataService,
+  ) {
+    this.treeFlattener = new MatTreeFlattener(this.transformer, this.getLevel, this.isExpandable, this.getChildren);
+    this.treeControl = new FlatTreeControl<TodoItemFlatNode>(this.getLevel, this.isExpandable);
+    this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
+    this.subscriptions.add(this.bucketDataService._bucketData.subscribe(data => {
+      if (data) {
+        this.dataSource.data = data;
+        const subject = this.dataSource._flattenedData;
+        const subjectData = subject.getValue();
+          if (this.selectedFolder) {
+            if (this.cloud !== 'azure') {
+              this.selectedFolder = subjectData.find(v => v.item === this.selectedFolder.item &&
+                v.level === this.selectedFolder.level && v.obj === this.selectedFolder.obj);
+            } else {
+              const selectedFolderPath = this.selectedFolder.obj.slice(0, this.selectedFolder.obj.lastIndexOf('/') + 1);
+              this.selectedFolder = subjectData.find(v => {
+                const objectPath = v.obj.slice(0, v.obj.lastIndexOf('/') + 1);
+                return v.item === this.selectedFolder.item &&
+                  v.level === this.selectedFolder.level && objectPath === selectedFolderPath;
+              });
+            }
+          }
+          this.expandAllParents(this.selectedFolder || subjectData[0]);
+          this.showItem(this.selectedFolder || subjectData[0]);
+          if (this.selectedFolder && !this.bucketDataService.emptyFolder) {
+            setTimeout(() => {
+              const element = document.querySelector('.folder-item-line.active-item');
+              element && element.scrollIntoView({ block: 'start', behavior: 'smooth' });
+            }, 0);
+          } else if (this.selectedFolder && this.bucketDataService.emptyFolder) {
+            setTimeout(() => {
+              const element = document.querySelector('#folder-form');
+              element && element.scrollIntoView({ block: 'end', behavior: 'smooth' });
+            }, 0);
+          }
+      }
+    }));
+    this.dataSource._flattenedData.subscribe();
+  }
+
+  getLevel = (node: TodoItemFlatNode) => node.level;
+
+  isExpandable = (node: TodoItemFlatNode) => node.expandable;
+
+  getChildren = (node: TodoItemNode): TodoItemNode[] => node.children;
+
+  hasChild = (_: number, _nodeData: TodoItemFlatNode) => _nodeData.expandable;
+
+  hasNoContent = (_: number, _nodeData: TodoItemFlatNode) => _nodeData.item === '' || _nodeData.item === 'ا';
+
+  transformer = (node: TodoItemNode, level: number) => {
+    const existingNode = this.nestedNodeMap.get(node);
+    const flatNode = existingNode && existingNode.item === node.item
+      ? existingNode
+      : new TodoItemFlatNode();
+    flatNode.item = node.item;
+    flatNode.level = level;
+    flatNode.expandable = !!node.children;
+    if (node.object) {
+      flatNode.obj = node.object.object;
+    } else {
+      flatNode.obj = '';
+    }
+    this.flatNodeMap.set(flatNode, node);
+    this.nestedNodeMap.set(node, flatNode);
+    return flatNode;
+  }
+
+  ngOnDestroy() {
+    this.bucketDataService._bucketData.next([]);
+    this.subscriptions.unsubscribe();
+    this.bucketDataService.emptyFolder = null;
+  }
+
+  folderFormControl = new FormControl('', [
+    Validators.required,
+    Validators.pattern(PATTERNS.folderRegex),
+    this.duplicate.bind(this)
+  ]);
+
+  matcher = new MyErrorStateMatcher();
+
+  private duplicate(control) {
+    if (control && control.value) {
+      const isDublicat = this.folders.slice(1).some(folder => folder.item === control.value);
+      return isDublicat ? { isDuplicate: true } : null;
+    }
+  }
+
+  public showItem(el) {
+    if (el) {
+      this.treeControl.expand(el);
+      this.selectedFolder = el;
+      const path = this.getPath(el);
+      this.path = [];
+      const data = {
+        flatNode: el,
+        element: this.flatNodeMap.get(el),
+        path: path.map(v => v.item).join('/'),
+        pathObject: path
+      };
+      this.showFolderContent.emit(data);
+    }
+  }
+
+  private getPath(el) {
+    if (el) {
+      if (this.path.length === 0) {
+        this.path.unshift(el);
+      }
+      if (this.getParentNode(el) !== null) {
+        this.path.unshift(this.getParentNode(el));
+        this.getPath(this.getParentNode(el));
+      }
+      return this.path;
+    }
+  }
+
+  private expandAllParents(el) {
+    if (el) {
+      this.treeControl.expand(el);
+      if (this.getParentNode(el) !== null) {
+        this.expandAllParents(this.getParentNode(el));
+      }
+    }
+  }
+
+  private getParentNode(node: TodoItemFlatNode): TodoItemFlatNode | null {
+    const currentLevel = this.getLevel(node);
+    if (currentLevel < 1) {
+      return null;
+    }
+
+    const startIndex = this.treeControl.dataNodes.indexOf(node) - 1;
+
+    for (let i = startIndex; i >= 0; i--) {
+      const currentNode = this.treeControl.dataNodes[i];
+
+      if (this.getLevel(currentNode) < currentLevel) {
+        return currentNode;
+      }
+    }
+    return null;
+  }
+
+
+private addNewItem(node: TodoItemFlatNode, file, isFile) {
+  const currNode = this.flatNodeMap.get(node);
+  if (!currNode.object) {
+    currNode.object = {bucket: currNode.item, object: ''};
+  }
+  const emptyFolderObject = currNode.object;
+  if (emptyFolderObject.object.lastIndexOf('ا') !== emptyFolderObject.object.length - 1 || emptyFolderObject.object === '') {
+    emptyFolderObject.object += 'ا';
+  }
+  this.bucketDataService.insertItem(currNode!, file, isFile, emptyFolderObject);
+  this.treeControl.expand(node);
+  setTimeout(() => {
+    const element = document.querySelector('#folder-form');
+    element && element.scrollIntoView({ block: 'end', behavior: 'smooth' });
+  }, 0);
+  }
+
+  public removeItem(node: TodoItemFlatNode) {
+    const parentNode = this.flatNodeMap.get(this.getParentNode(node));
+    const childNode = this.flatNodeMap.get(node);
+    if (this.cloud === 'azure') {
+      parentNode.object.object = parentNode.object.object.replace(/ا/g, '');
+    }
+    this.bucketDataService.emptyFolder = null;
+    this.bucketDataService.removeItem(parentNode!, childNode);
+    this.resetForm();
+  }
+
+  public createFolder(node: TodoItemFlatNode, itemValue: string) {
+    this.folderCreating = true;
+    const parent = this.getParentNode(node);
+    const flatParent = this.flatNodeMap.get(parent);
+    let flatObject = flatParent.object.object;
+    if (flatObject.indexOf('ا') === flatObject.length - 1) {
+      flatObject = flatObject.substring(0, flatParent.object.object.length - 1);
+    }
+    const path = `${ flatParent.object && flatObject !== '/' ? flatObject : ''}${itemValue}/`;
+    const bucket = flatParent.object ? flatParent.object.bucket : flatParent.item;
+
+    this.bucketDataService.emptyFolder = null;
+    if (this.cloud !== 'azure') {
+      this.bucketBrowserService.createFolder({
+        'bucket': bucket,
+        'folder': path.replace(/ا/g, ''),
+        'endpoint': this.endpoint
+      })
+        .subscribe(_ => {
+          this.bucketDataService.insertItem(flatParent, itemValue, false);
+          this.toastr.success('Folder successfully created!', 'Success!');
+          this.folderCreating = false;
+          this.removeItem(node);
+        }, error => {
+          this.folderCreating = false;
+          this.toastr.error(error.message || 'Folder creation error!', 'Oops!');
+        });
+    } else {
+      flatParent.object.object = flatParent.object.object.replace(/ا/g, '');
+      parent.obj = parent.obj.replace(/ا/g, '');
+      this.bucketDataService.insertItem(flatParent, itemValue, false);
+      this.toastr.success('Folder successfully created!', 'Success!');
+      this.folderCreating = false;
+      this.removeItem(node);
+    }
+  }
+
+  private resetForm() {
+    this.folderFormControl.setValue('');
+    this.folderFormControl.updateValueAndValidity();
+    this.folderFormControl.markAsPristine();
+    this.disableAll.emit(false);
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/upload-window.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/upload-window.component.scss
new file mode 100644
index 0000000..e8e9a1e
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/upload-window.component.scss
@@ -0,0 +1,196 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.upload-window{
+  margin-top: 2vh;
+  border: 2px solid rgba(0,0,0,.12);
+  border-radius: 5px;
+  background-color: white;
+  height: 15vh;
+  color: black;
+
+  .upload-header{
+    padding-left: 8px;
+    background: #f6fafe;
+    height: 30px;
+    line-height: 30px;
+    position: relative;
+
+    .modal-title {
+      font-weight: 500;
+      color: #455c74;
+      font-size: 13px;
+      background: #f6fafe;
+    }
+
+    .close{
+      position: absolute;
+      top: 0;
+      right: 0;
+      height: 30px;
+      width: 30px;
+      font-size: 20px;
+      font-weight: 300;
+      border: 0;
+      background: none;
+      color: #577289;
+      outline: none;
+      cursor: pointer;
+      transition: all 0.45s ease-in-out;
+
+      &:hover{
+        color: #36afd5;
+      }
+    }
+
+  }
+
+  .upload-files{
+    padding: 5px 0;
+    height: calc(100% - 30px);
+    overflow: auto;
+    overflow-y: overlay;
+    width: 100%;
+    .file{
+      padding: 2px;
+      display: flex;
+      font-size: 12px;
+      position: relative;
+
+      &.upload-table-header{
+        font-size: 11px;
+      }
+
+      .name{
+        width: 33.3%;
+        padding-left: 5px;
+        position: relative;
+        display: flex;
+
+        span{
+          position: absolute;
+          max-width: calc(100% + 30px);
+        }
+      }
+
+      .second-block{
+        width: 66.7%;
+        display: flex;
+        padding: 0 14px 0 17px;
+        .upload-path{
+          width: 60%;
+          padding-left: 24px;
+          padding-right: 1%;
+          display: flex;
+        }
+
+        .size{
+          width: 15%;
+        }
+        .state{
+          width: 22%;
+          display: flex;
+          align-items: center;
+          .mat-raised-button{
+            width: 60px;
+            padding: 5px;
+            border-radius: 0;
+            font-style: normal;
+            font-weight: 600;
+            font-size: 11px;
+            font-family: "Open Sans", sans-serif;
+            color: #577289;
+            line-height: 8px;
+          }
+        }
+        .remove{
+          display: flex;
+          align-items: center;
+          width: 5%;
+          position: absolute;
+          right: 20px;
+          .close{
+            color: #577289;
+            font-size: 12px;
+            cursor: pointer;
+            position: absolute;
+            top: 3px;
+            right: 0;
+            height: 18px;
+            width: 14px;
+            transition: all 0.45s ease-in-out;
+
+            &:hover{
+              color: #f1696e;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+
+
+
+
+@media only screen and (max-height: 920px) {
+  .bucket-wrapper {
+    height: 55vh;
+    &.added-upload{
+      height: 38vh;
+    }
+  }
+}
+
+@media only screen and (max-height: 840px) {
+  .bucket-wrapper {
+    height: 53vh;
+    &.added-upload{
+      height: 36vh;
+    }
+  }
+}
+
+@media only screen and (max-height: 760px) {
+  .bucket-wrapper {
+    height: 51vh;
+    &.added-upload{
+      height: 34vh;
+    }
+  }
+}
+
+@media only screen and (max-height: 700px) {
+  .bucket-wrapper {
+    height: 49vh;
+    &.added-upload{
+      height: 32vh;
+    }
+  }
+}
+
+@media only screen and (max-height: 650px) {
+  .bucket-wrapper {
+    height: 47vh;
+    &.added-upload{
+      height: 30vh;
+    }
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.html
index 04ea086..e353385 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.html
@@ -45,9 +45,9 @@
           </div>
           <div class="col"><span>{{ resource.template_name }}</span></div>
         </div>
-        <div class="row-wrap" *ngIf="resource.image === 'docker.dlab-dataengine-service'">
+        <div class="row-wrap" *ngIf="resource.image === 'docker.datalab-dataengine-service'">
           <div class="col">
-            <p>Cluster version:</p>
+              <p>Cluster version:</p>
           </div>
           <div class="col"><span>{{ resource[DICTIONARY[PROVIDER].cluster_version] }}</span></div>
         </div>
@@ -55,15 +55,14 @@
           <div class="col">
             <p>Cluster alias:</p>
           </div>
-          <div class="col tooltip-wrap" (mouseover)="isEllipsisActive($event)">
+          <div class="col" (mouseover)="isEllipsisActive($event)">
             <span>{{resource.computational_name}}</span>
-            <div class="tooltip" [style.visibility]="tooltip ? 'visible': 'hidden'">{{resource.computational_name}}
-            </div>
+            <!-- <div class="tooltip" [style.visibility]="tooltip ? 'visible': 'hidden'">{{resource.computational_name}}</div> -->
           </div>
         </div>
         <div class="row-wrap">
           <div class="col"
-            *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp' && resource.image === 'docker.dlab-dataengine-service'; else inst">
+              *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp'; else inst">
             <p>Master instance number:</p>
           </div>
           <ng-template #inst>
@@ -71,14 +70,18 @@
               <p>Total instance number:</p>
             </div>
           </ng-template>
-          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].total_instance_number] }}</span></div>
+          <div class="col">
+            <span *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'aws'">{{ resource.totalInstanceCount > 0 ? resource.totalInstanceCount : resource.dataengine_instance_count}}</span>
+            <span *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'azure'">{{resource.dataengine_instance_count}}</span>
+            <span *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp'">1</span>
+          </div>
         </div>
         <div class="row-wrap"
-          *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp' && resource.image === 'docker.dlab-dataengine-service'">
+          *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'gcp'">
           <div class="col">
             <p>Slave instance number:</p>
           </div>
-          <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].total_slave_instance_number] }}</span></div>
+          <div class="col"><span>{{ resource.totalInstanceCount - 1}}</span></div>
         </div>
         <div class="row-wrap">
           <div class="col">
@@ -86,63 +89,118 @@
           </div>
           <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].master_node_shape] }}</span></div>
         </div>
-        <div class="row-wrap" *ngIf="resource.image === 'docker.dlab-dataengine-service'">
+        <div class="row-wrap">
           <div class="col">
             <p>Slave instance size:</p>
           </div>
           <div class="col"><span>{{ resource[DICTIONARY[PROVIDER][resource.image].slave_node_shape] }}</span></div>
         </div>
-
+        <ng-template [ngIf]="resource?.enabledGPU">
+          <div class="row-wrap">
+            <div class="col">
+              <p>Master GPU type:</p>
+            </div>
+            <div class="col"><span>{{resource.master_gpu_type}}</span></div>
+          </div>
+          <div class="row-wrap">
+            <div class="col">
+              <p>Slave GPU type:</p>
+            </div>
+            <div class="col"><span>{{resource.slave_gpu_type}}</span></div>
+          </div>
+          <div class="row-wrap">
+            <div class="col">
+              <p>Master GPU count:</p>
+            </div>
+            <div class="col"><span>{{resource.master_gpu_count}}</span></div>
+          </div>
+          <div class="row-wrap">
+            <div class="col">
+              <p>Slave GPU count:</p>
+            </div>
+            <div class="col"><span>{{resource.slave_gpu_count}}</span></div>
+          </div>
+        </ng-template>
         <div *ngIf="resource.status === 'running'">
           <div class="row-wrap">
-            <p class="time_info">Up time {{upTimeInHours}} hour(s) since {{upTimeSince || "not specified."}}</p>
+            <p class="time_info">Up time {{upTimeInHours}} hour(s) since {{resource.up_time ? (resource.up_time | longDate) : "not specified."
+              }}
+            </p>
           </div>
           <div class="m-top-10">
-            <p *ngFor="let item of resource.computational_url" class="ellipsis flex">
-              <span class="strong">{{ item.description }}:</span>&nbsp;
-              <a href="{{item.url}}" target="_blank" matTooltip="{{item.url}}"
-                matTooltipPosition="above">{{ item.url }}</a>
+            <p *ngFor="let item of resource.computational_url" class="ellipsis flex" (mouseleave)="hideCopyIcon()">
+              <span class="strong spark-url-desc">{{ item.description }}:</span>&nbsp;
+              <a (click)="logAction(resource, environment, 'follow')"
+                 href="{{item.url}}"
+                 target="_blank"
+                 matTooltip="{{item.url}}"
+                 matTooltipPosition="above"
+                 (mouseover)="showCopyIcon(item.description)"
+                 class="spark-url ellipsis"
+                 (contextmenu)="false"
+              >{{ item.url }}</a>
+              <span
+                (click)="logAction(resource, environment, 'copy');$event.stopPropagation()"
+                *ngIf="isCopyIconVissible[item.description]"
+                [matTooltip]="isCopied ? 'Copy ' + item.description + (item.description.indexOf('url')  === -1 ? ' url' : ''): 'Copied'" matTooltipPosition="above" class="copy-icon-wrapper"
+              >
+                <span  class="link-icon" (click)="copyLink(item.url)" >
+                  <span _ngcontent-xpv-c19="" class="material-icons" (click)="this.isCopied = false">content_copy</span>
+                 </span>
+              </span>
             </p>
           </div>
         </div>
-
-        <div class="checkbox-group" *ngIf="resource.image === 'docker.dlab-dataengine'
-          && resource.status === 'running'
-          && environment.image !== 'docker.dlab-zeppelin'
-          && environment.image !== 'docker.dlab-superset'
-          && environment.image !== 'docker.dlab-jupyterlab'">
-          <label>
-            <input #configurationNode type="checkbox" (change)="selectConfiguration()" /> Cluster configurations
-          </label>
-          <div class="checkbox-group">
-            <form [formGroup]="configurationForm" novalidate>
-              <div class="config-details" [ngClass]="{ show: configuration?.nativeElement['checked'] || false }">
-                <textarea formControlName="configuration_parameters" placeholder="Cluster configuration template, JSON"
-                  data-gramm_editor="false"></textarea>
-                <span class="danger_color"
-                  *ngIf="!configurationForm.controls.configuration_parameters.valid && configurationForm.controls['configuration_parameters'].dirty">Configuration
-                  parameters is not in a valid format</span>
-              </div>
-            </form>
+          <div class="checkbox-group" 
+            *ngIf="resource.image === 'docker.datalab-dataengine'
+                && resource.status === 'running'
+                && environment.image !== 'docker.datalab-zeppelin'
+                && environment.image !== 'docker.datalab-superset'
+                && environment.image !== 'docker.datalab-jupyterlab'"
+          >
+            <label>
+              <input #configurationNode type="checkbox" (change)="selectConfiguration()"/> Cluster configurations
+            </label>
+            <div class="checkbox-group">
+              <form [formGroup]="configurationForm" novalidate>
+                <div class="config-details"
+                    [ngClass]="{ show: configuration?.nativeElement['checked'] || false }">
+                  <textarea 
+                    formControlName="configuration_parameters" 
+                    placeholder="Cluster configuration template, JSON"
+                    data-gramm_editor="false">
+                  </textarea>
+                  <span class="danger_color"
+                    *ngIf="!configurationForm.controls.configuration_parameters.valid 
+                        && configurationForm.controls['configuration_parameters'].dirty">
+                        Configuration parameters is not in a valid format
+                  </span>
+                </div>
+              </form>
+            </div>
           </div>
-        </div>
-        <div *ngIf="environment.image === 'docker.dlab-zeppelin' && resource.status === 'running'">
-          <small>Spark default configuration for Apache Zeppelin can not be changed from DLab UI. Currently it can be
-            done directly through Apache Zeppelin interpreter menu.
-            For more details please refer for Apache Zeppelin <a
-              href="https://zeppelin.apache.org/docs/0.8.0/usage/interpreter/overview.html" target="_blank">official
-              documentation</a>.
-          </small>
-        </div>
-        <div class="text-center m-top-30" *ngIf="configuration?.nativeElement['checked'] || false">
-          <button mat-raised-button type="button" (click)="dialogRef.close()" class="butt action">Cancel</button>
-          <button mat-raised-button type="submit" [disabled]="!configurationForm.valid" class="butt butt-success action"
-            [ngClass]="{'not-allowed': !configurationForm.valid}"
-            (click)="editClusterConfiguration(configurationForm.value)">Update</button>
+          <div *ngIf="environment.image === 'docker.datalab-zeppelin' && resource.status === 'running'">
+            <small>Spark default configuration for Apache Zeppelin can not be changed from DataLab UI. 
+              Currently it can be done directly through Apache Zeppelin interpreter menu.
+                For more details please refer for Apache Zeppelin 
+                <a href="https://zeppelin.apache.org/docs/0.9.0/usage/interpreter/overview.html" target="_blank">official
+                    documentation</a>.
+            </small>
+          </div>
+          <div class="text-center m-top-30" *ngIf="configuration?.nativeElement['checked'] || false">
+            <button mat-raised-button type="button" 
+                    (click)="dialogRef.close()" 
+                    class="butt action">Cancel
+            </button>
+            <button mat-raised-button type="submit" 
+                    [disabled]="!configurationForm.valid"
+                    class="butt butt-success action"
+                    [ngClass]="{'not-allowed': !configurationForm.valid}"
+                    (click)="editClusterConfiguration(configurationForm.value)">Update
+            </button>
         </div>
       </div>
 
-
       <div class="row-wrap detail-info content-box" *ngIf="resource.error_message">
         <p class="failed">{{resource.error_message}}</p>
       </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.scss
index 0c26eaf..be579fd 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.scss
@@ -34,7 +34,7 @@
     &.danger_color {
       position: absolute;
       bottom: -20px;
-      left: 0;
+      right: 0;
     }
   }
 }
@@ -68,3 +68,13 @@
     }
   }
 }
+
+.spark-url{
+  max-width: 250px;
+  overflow: hidden;
+}
+
+.copy-icon-wrapper{
+  margin-top: -2px;
+  margin-left: 5px;
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts
index 16fb1ae..f5e8f45 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts
@@ -26,9 +26,11 @@
 import { DataengineConfigurationService } from '../../../core/services';
 import { DICTIONARY } from '../../../../dictionary/global.dictionary';
 import { CLUSTER_CONFIGURATION } from '../computational-resource-create-dialog/cluster-configuration-templates';
+import {AuditService} from '../../../core/services/audit.service';
+import {CopyPathUtils} from '../../../core/util/copyPathUtils';
 
 @Component({
-  selector: 'dlab-cluster-details',
+  selector: 'datalab-cluster-details',
   templateUrl: 'cluster-details.component.html',
   styleUrls: ['./cluster-details.component.scss']
 })
@@ -39,20 +41,22 @@
 
   resource: any;
   environment: any;
-  @ViewChild('configurationNode', { static: false }) configuration;
+  @ViewChild('configurationNode') configuration;
 
   upTimeInHours: number;
-  upTimeSince: string = '';
   tooltip: boolean = false;
   config: Array<{}> = [];
   public configurationForm: FormGroup;
+  isCopyIconVissible: any = {};
+  isCopied: boolean = true;
 
   constructor(
     @Inject(MAT_DIALOG_DATA) public data: any,
     public toastr: ToastrService,
     public dialogRef: MatDialogRef<DetailComputationalResourcesComponent>,
     private dataengineConfigurationService: DataengineConfigurationService,
-    private _fb: FormBuilder
+    private _fb: FormBuilder,
+    private auditService: AuditService
   ) { }
 
   ngOnInit() {
@@ -66,10 +70,9 @@
 
 
     this.upTimeInHours = (this.resource.up_time) ? DateUtils.diffBetweenDatesInHours(this.resource.up_time) : 0;
-    this.upTimeSince = (this.resource.up_time) ? new Date(this.resource.up_time).toString() : '';
     this.initFormModel();
 
-    if (this.resource.image === 'docker.dlab-dataengine') this.getClusterConfiguration();
+    if (this.resource.image === 'docker.datalab-dataengine') this.getClusterConfiguration();
   }
 
   public isEllipsisActive($event): void {
@@ -97,7 +100,11 @@
   public editClusterConfiguration(data): void {
     this.dataengineConfigurationService
       .editClusterConfiguration(
-        data.configuration_parameters, this.environment.project, this.environment.name, this.resource.computational_name, this.PROVIDER
+        data.configuration_parameters,
+        this.environment.project,
+        this.environment.name,
+        this.resource.computational_name,
+        this.PROVIDER
       )
       .subscribe(result => {
         this.dialogRef.close();
@@ -117,4 +124,31 @@
         ? (control.value && control.value !== null && CheckUtils.isJSON(control.value) ? null : { valid: false })
         : null;
   }
+
+  public logAction(resource: any, environment, copy?: string) {
+    const clusterInfo = {
+      action: copy,
+      cluster: resource.computational_name,
+      notebook: environment.name,
+      clusterType: resource.dataEngineType === 'dataengine-service' ? 'Hadoop' : 'Master'
+    };
+
+    this.auditService.sendDataToAudit(
+      {resource_name: resource.computational_name, info: JSON.stringify(clusterInfo), type: 'COMPUTE'}
+      ).subscribe();
+  }
+
+  public copyLink(url: string) {
+    CopyPathUtils.copyPath(url);
+  }
+
+  public showCopyIcon(element) {
+    this.isCopyIconVissible[element] = true;
+  }
+  public hideCopyIcon() {
+    for (const key in this.isCopyIconVissible) {
+      this.isCopyIconVissible[key] = false;
+    }
+    this.isCopied = true;
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/index.ts b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/index.ts
index 88bfff6..1cc87c8 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/index.ts
@@ -23,11 +23,12 @@
 
 import { MaterialModule } from '../../../shared/material.module';
 import { DetailComputationalResourcesComponent } from './cluster-details.component';
+import {LongDatePipeModule} from '../../../core/pipes/long-date-pipe';
 
 export * from './cluster-details.component';
 
 @NgModule({
-  imports: [CommonModule, FormsModule, ReactiveFormsModule, MaterialModule],
+  imports: [CommonModule, FormsModule, ReactiveFormsModule, MaterialModule, LongDatePipeModule],
   declarations: [DetailComputationalResourcesComponent],
   entryComponents: [DetailComputationalResourcesComponent],
   exports: [DetailComputationalResourcesComponent],
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.html
index ec3c3ac..7b339f7 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.html
@@ -19,31 +19,90 @@
 
 <div class="create-cluster" id="dialog-box">
   <header class="dialog-header">
-    <h4 class="modal-title">Add computational resources</h4>
+    <h4 class="modal-title">Add compute</h4>
     <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
   </header>
   <div class="dialog-content selection">
     <div class="content-box mat-reset">
       <form [formGroup]="resourceForm" *ngIf="clusterTypes.length && resourceForm; else placeholder">
 
-        <div class="form-wrapper" [ngClass]="{ compress: selectedImage?.image === 'docker.dlab-dataengine' }">
+        <div class="form-wrapper">
           <div class="col">
+              <div class="control-group" *ngIf="PROVIDER !== 'azure'" [hidden]="clusterTypes.length === 1">
+                  <label class="label">Select cluster type</label>
+                  <div class="control selector-wrapper">
+                    <mat-form-field>
+                      <mat-select formControlName="template_name" 
+                                  disableOptionCentering
+                                  panelClass="scrolling"
+                                  placeholder="Select cluster type">
+                        <mat-option *ngFor="let type of clusterTypes" [value]="type.template_name"
+                                    (click)="selectImage(type)">{{ type.template_name }}
+                        </mat-option>
+                        <mat-option *ngIf="!clusterTypes.length" class="multiple-select ml-10" disabled>Clusters types list
+                          is empty</mat-option>
+                      </mat-select>
+                      <button class="caret">
+                        <i class="material-icons">keyboard_arrow_down</i>
+                      </button>
+                    </mat-form-field>
+                  </div>
+              </div>
 
-            <div class="control-group" *ngIf="PROVIDER !== 'azure'" [hidden]="clusterTypes.length === 1">
-              <label class="label">Select cluster type</label>
-              <div class="control selector-wrapper">
-                <mat-form-field>
-<!--                  <mat-label>Select cluster type</mat-label>-->
-                  <mat-select formControlName="template_name" disableOptionCentering placeholder="Select cluster type">
-                    <mat-option *ngFor="let type of clusterTypes" [value]="type.template_name"
-                      (click)="selectImage(type)">{{ type.template_name }}</mat-option>
-                    <mat-option *ngIf="!clusterTypes.length" class="multiple-select ml-10" disabled>Clusters types list
-                      is empty</mat-option>
-                  </mat-select>
-                  <button class="caret">
-                    <i class="material-icons">keyboard_arrow_down</i>
-                  </button>
-                </mat-form-field>
+              <div class="control-group alias-name" *ngIf="selectedImage?.image">
+                <label class="label">Cluster alias</label>
+                <div class="control">
+                  <input
+                    [class.danger_field]="!resourceForm?.controls['cluster_alias_name'].valid
+                          && resourceForm?.controls['cluster_alias_name'].dirty 
+                          && resourceForm?.controls['cluster_alias_name'].hasError('duplication')"
+                    type="text" class="form-control" placeholder="Enter cluster alias"
+                    formControlName="cluster_alias_name" />
+                  <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('user-duplication')">You have cluster with this name in current project.</span>
+                  <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('other-user-duplication')">Other user has cluster with this name in current project.</span>
+                  <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('maxlength') &&
+                  !resourceForm?.controls['cluster_alias_name'].hasError('pattern')"
+                  >
+                    Cluster name cannot be longer than {{maxClusterNameLength}} characters.
+                  </span>
+                  <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('pattern')">
+                    Cluster name can only contain letters, numbers, hyphens and '_' but can not end with special
+                    characters.
+                  </span>
+                </div>
+              </div>
+
+              <div class="control-group" *ngIf="selectedImage?.image">
+                <label class="label">Master instance size</label>
+                <div class="control selector-wrapper">
+                  <mat-form-field>
+                    <mat-label>Select instance size</mat-label>
+                    <mat-select panelClass="scrolling" formControlName="shape_master" disableOptionCentering>
+                      <mat-optgroup *ngFor="let item of (selectedImage.computation_resources_shapes | keys)"
+                        [label]="item.key | underscoreless">
+                        <mat-option *ngFor="let list_item of item.value" [value]="list_item.Type" (click)="clearGpuType('master')">
+                          <strong class="highlight icon-label">{{ list_item.Size }}</strong> {{ list_item.Type }}
+                        </mat-option>
+                      </mat-optgroup>
+                    </mat-select>
+                    <button class="caret">
+                      <i class="material-icons">keyboard_arrow_down</i>
+                    </button>
+                  </mat-form-field>
+                </div>
+              </div>
+          </div>
+
+          <div class="col">
+            <div class="control-group" *ngIf="selectedImage?.image">
+              <label class="label">Total instance number</label>
+              <div class="control">
+                <input type="number" class="form-control" min="{{minInstanceNumber}}" max="{{maxInstanceNumber}}"
+                  formControlName="instance_number" (keypress)="CheckUtils.isNumberKey($event)" />
+                <span class="error" *ngIf="!resourceForm?.controls.instance_number.valid">
+                  <span>Only integer values greater than or equal to {{ minInstanceNumber }} and less than
+                    {{ maxInstanceNumber }} are allowed.</span>
+                </span>
               </div>
             </div>
 
@@ -52,7 +111,7 @@
               <div class="control selector-wrapper">
                 <mat-form-field>
                   <mat-label>Select template</mat-label>
-                  <mat-select formControlName="version" disableOptionCentering>
+                  <mat-select panelClass="scrolling" formControlName="version" disableOptionCentering>
                     <mat-option *ngFor="let template of selectedImage.templates" [value]="template.version">
                       {{ template.version }}</mat-option>
                     <mat-option *ngIf="!selectedImage.templates" class="multiple-select ml-10" disabled>Templates list
@@ -65,177 +124,259 @@
               </div>
             </div>
 
-            <div class="control-group alias-name" *ngIf="selectedImage?.image">
-              <label class="label">Cluster alias</label>
-              <div class="control">
-                <input
-                  [class.danger_field]="!resourceForm?.controls['cluster_alias_name'].valid
-                        && resourceForm?.controls['cluster_alias_name'].dirty && resourceForm?.controls['cluster_alias_name'].hasError('duplication')"
-                  type="text" class="form-control" placeholder="Enter cluster alias"
-                  formControlName="cluster_alias_name" />
-                <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('user-duplication')">You have cluster with this name in current project.</span>
-                <span class="error" *ngIf="resourceForm?.controls['cluster_alias_name'].hasError('other-user-duplication')">Other user has cluster with this name in current project.</span>
-                <span class="error" *ngIf="!resourceForm?.controls.cluster_alias_name.valid
-                                            && resourceForm?.controls['cluster_alias_name'].dirty
-                                            && !resourceForm?.controls['cluster_alias_name'].hasError('user-duplication')
-                                            && !resourceForm?.controls['cluster_alias_name'].hasError('other-user-duplication')">
-                  Cluster name cannot be longer than {{DICTIONARY[PROVIDER].max_cluster_name_length}} characters
-                  and can only contain letters, numbers, hyphens and '_' but can not end with special
-                  characters
-                </span>
+              <div class="control-group" *ngIf="selectedImage?.image">
+                <label class="label">Slave instance size</label>
+                <div class="control selector-wrapper">
+                  <mat-form-field>
+                    <mat-label>Select instance size</mat-label>
+                      <mat-select panelClass="scrolling" formControlName="shape_slave" disableOptionCentering>
+                        <mat-optgroup *ngFor="let item of (selectedImage.computation_resources_shapes | keys)"
+                                        [label]="item.key | underscoreless">
+                          <mat-option *ngFor="let list_item of item.value" [value]="list_item.Type" (click)="clearGpuType('slave')">
+                              <strong class="highlight icon-label">{{ list_item.Size }}</strong> {{
+                              list_item.Type }}
+                          </mat-option>
+                        </mat-optgroup>
+                      </mat-select>
+                      <button class="caret">
+                        <i class="material-icons">keyboard_arrow_down</i>
+                      </button>
+                  </mat-form-field>
+                </div>
               </div>
-            </div>
-          </div>
-
-          <div class="col">
-            <div class="control-group" *ngIf="selectedImage?.image">
-              <label class="label">Total instance number</label>
-              <div class="control">
-                <input type="number" class="form-control" min="{{minInstanceNumber}}" max="{{maxInstanceNumber}}"
-                  formControlName="instance_number" (keypress)="CheckUtils.isNumberKey($event)" />
-                <span class="error" *ngIf="!resourceForm?.controls.instance_number.valid">
-                  <span>Only integer values greater than or equal to {{ minInstanceNumber }} and less than
-                    {{ maxInstanceNumber }} are allowed</span>
-                </span>
-              </div>
-            </div>
-
-            <div class="control-group" *ngIf="selectedImage?.image">
-              <label class="label">Master instance size</label>
-              <div class="control selector-wrapper">
-                <mat-form-field>
-                  <mat-label>Select instance size</mat-label>
-                  <mat-select formControlName="shape_master" disableOptionCentering>
-                    <mat-optgroup *ngFor="let item of (selectedImage.computation_resources_shapes | keys)"
-                      [label]="item.key | underscoreless">
-                      <mat-option *ngFor="let list_item of item.value" [value]="list_item.Type">
-                        <strong class="highlight icon-label">{{ list_item.Size }}</strong> {{ list_item.Type }}
-                      </mat-option>
-                    </mat-optgroup>
-                  </mat-select>
-                  <button class="caret">
-                    <i class="material-icons">keyboard_arrow_down</i>
-                  </button>
-                </mat-form-field>
-              </div>
-            </div>
-
-            <div class="control-group" *ngIf="selectedImage?.image"
-              [hidden]="selectedImage?.image === 'docker.dlab-dataengine'">
-              <label class="label">Slave instance size</label>
-              <div class="control selector-wrapper">
-                <mat-form-field>
-                  <mat-label>Select instance size</mat-label>
-                  <mat-select formControlName="shape_slave" disableOptionCentering>
-                    <mat-optgroup *ngFor="let item of (selectedImage.computation_resources_shapes | keys)"
-                      [label]="item.key | underscoreless">
-                      <mat-option *ngFor="let list_item of item.value" [value]="list_item.Type">
-                        <strong class="highlight icon-label">{{ list_item.Size }}</strong> {{ list_item.Type }}
-                      </mat-option>
-                    </mat-optgroup>
-                  </mat-select>
-                  <button class="caret">
-                    <i class="material-icons">keyboard_arrow_down</i>
-                  </button>
-                </mat-form-field>
-              </div>
-            </div>
 
           </div>
         </div>
+        <div class="checkbox-group control-group"
+             *ngIf="PROVIDER === 'gcp'">
+          <div class="d-flex cursor-pointer label m-bott-20" (click)="addAdditionalParams('gpu')">
+            <div class="empty-checkbox ml-10" [ngClass]="{'checked': isSelected.gpu}">
+              <span class="checked-checkbox" *ngIf="isSelected.gpu"></span>
+            </div>
+            <span class=" pl-5">GPU</span>
+          </div>
+          <div class="form-wrapper full-width" *ngIf="isSelected.gpu">
+            <div class="col">
+              <div class="control-group">
+                <label class="label">Master GPU type</label>
+                <div class="control selector-wrapper"
+                     [ngClass]="{ 'not-active' : !resourceForm.controls['shape_master'].value}"
+                     [matTooltip]="'Please, select master instance size.'"
+                     [matTooltipPosition]="'above'"
+                     [matTooltipClass]="'full-size-tooltip'"
+                     [matTooltipDisabled]="!!resourceForm.controls['shape_master'].value.length"
+                >
+                  <mat-form-field>
+                    <mat-select formControlName="master_GPU_type" disableOptionCentering
+                                placeholder="Select master GPU type"
+                                [disabled]="!resourceForm.controls['shape_master'].value">
+                      <mat-option *ngFor="let type of sortGpuTypes(selectedImage.computationGPU); index as i"
+                                  [value]="type" >
+                        <strong class="highlight icon-label">{{ addSizeToGpuType(i) }}</strong> {{ type }}
+                      </mat-option>
+                      <mat-option *ngIf="!selectedImage.computationGPU?.length" class="multiple-select ml-10" disabled>
+                        Master GPU types list is empty
+                      </mat-option>
+                    </mat-select>
+                    <button class="caret">
+                      <i class="material-icons">keyboard_arrow_down</i>
+                    </button>
+                  </mat-form-field>
+                </div>
+              </div>
+              <div class="control-group">
+                <label class="label">Master GPU сount</label>
+                <div class="control selector-wrapper"
+                     [ngClass]="{'not-active': !resourceForm.controls['master_GPU_type'].value}"
+                     [matTooltip]="'Please, select master GPU type.'"
+                     [matTooltipPosition]="'above'"
+                     [matTooltipClass]="'full-size-tooltip'"
+                     [matTooltipDisabled]="!!resourceForm.controls['master_GPU_type'].value"
+                >
+                  <mat-form-field>
+                    <mat-label>Select master GPU count</mat-label>
+                    <mat-select formControlName="master_GPU_count" disableOptionCentering [disabled]="!resourceForm.controls['master_GPU_type'].value">
+                      <mat-option *ngFor="let type of gpuCount" [value]="type">
+                        {{ type }}
+                      </mat-option>
+                      <mat-option *ngIf="!gpuCount?.length" class="multiple-select ml-10" disabled>Master GPU counts list is empty</mat-option>
+                    </mat-select>
+                    <button class="caret">
+                      <i class="material-icons">keyboard_arrow_down</i>
+                    </button>
+                  </mat-form-field>
+                </div>
+              </div>
+            </div>
 
-        <div class="preemptible checkbox-group control-group m-top-30 m-bott-10"
-          *ngIf="PROVIDER === 'gcp' && selectedImage?.image === 'docker.dlab-dataengine-service'">
-          <label class="label">
-            <input #preemptibleNode type="checkbox" (change)="selectPreemptibleNodes($event)" />
-            <span>Preemptible node</span>
-            <span class="align" *ngIf="preemptible?.nativeElement['checked'] || false"> count</span>
-          </label>
-          <div *ngIf="preemptible?.nativeElement['checked']" class="preemptible-details control"
-            [ngClass]="{ show: preemptible?.nativeElement['checked'] || false}">
+            <div class="col">
+              <div class="control-group">
+                <label class="label">Slave GPU type</label>
+                <div class="control selector-wrapper"
+                     [ngClass]="{ 'not-active': !resourceForm.controls['shape_slave'].value}"
+                     [matTooltip]="'Please, select slave instance size.'"
+                     [matTooltipPosition]="'above'"
+                     [matTooltipClass]="'full-size-tooltip'"
+                     [matTooltipDisabled]="!!resourceForm.controls['shape_slave'].value.length"
+                >
+                  <!--                  <span class="form-field-wrapper"  >-->
+                  <mat-form-field>
+                    <mat-label>Select slave GPU type</mat-label>
+                    <mat-select formControlName="slave_GPU_type" disableOptionCentering [disabled]="!resourceForm.controls['shape_slave'].value">
+                      <mat-option *ngFor="let type of sortGpuTypes(selectedImage.computationGPU); index as i" [value]="type">
+                        <strong class="highlight icon-label">{{ addSizeToGpuType(i) }}</strong> {{ type }}
+                      </mat-option>
+                      <mat-option *ngIf="!selectedImage.computationGPU?.length" class="multiple-select ml-10" disabled>
+                        Slave GPU types list is empty
+                      </mat-option>
+                    </mat-select>
+                    <button class="caret">
+                      <i class="material-icons">keyboard_arrow_down</i>
+                    </button>
+                  </mat-form-field>
+                  <!--                  </span>-->
+                </div>
+              </div>
+
+              <div class="control-group">
+                <label class="label">Slave GPU сount</label>
+                <div class="control selector-wrapper"
+                     [ngClass]="{'not-active': !resourceForm.controls['slave_GPU_type'].value}"
+                     [matTooltip]="'Please, select slave GPU type.'"
+                     [matTooltipPosition]="'above'"
+                     [matTooltipClass]="'full-size-tooltip'"
+                     [matTooltipDisabled]="!!resourceForm.controls['slave_GPU_type'].value"
+                >
+                  <mat-form-field>
+                    <mat-label>Select slave GPU сount</mat-label>
+                    <mat-select formControlName="slave_GPU_count" disableOptionCentering [disabled]="!resourceForm.controls['slave_GPU_type'].value">
+                      <mat-option *ngFor="let type of gpuCount" [value]="type">
+                        {{ type }}
+                      </mat-option>
+                      <mat-option *ngIf="!gpuCount?.length" class="multiple-select ml-10" disabled>
+                        Slave GPU counts list is empty
+                      </mat-option>
+                    </mat-select>
+                    <button class="caret">
+                      <i class="material-icons">keyboard_arrow_down</i>
+                    </button>
+                  </mat-form-field>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="preemptible checkbox-group control-group"
+              *ngIf="PROVIDER === 'gcp' && selectedImage?.image === 'docker.datalab-dataengine-service'">
+          <div class="d-flex cursor-pointer label" (click)="addAdditionalParams('preemptible')">
+            <div class="empty-checkbox ml-10" [ngClass]="{'checked': isSelected.preemptible}" (click)="selectPreemptibleNodes(isSelected.preemptible)">
+              <span class="checked-checkbox" *ngIf="isSelected.preemptible"></span>
+            </div>
+            <span class="pl-5">Preemptible node</span>
+          </div>
+          <div *ngIf="isSelected.preemptible" class="preemptible-details control"
+                [ngClass]="{ show: isSelected.preemptible}">
             <input type="text" class="form-control" formControlName="preemptible_instance_number"
-              (keypress)="CheckUtils.isNumberKey($event)" (keydown.arrowup)="preemptibleCounter($event, 'increment')"
-              (keydown.arrowdown)="preemptibleCounter($event, 'decrement')" />
-            <span class="error" *ngIf="!resourceForm?.controls.preemptible_instance_number.valid">
+                    (keypress)="CheckUtils.isNumberKey($event)"
+                    (keydown.arrowup)="preemptibleCounter($event, 'increment')"
+                    (keydown.arrowdown)="preemptibleCounter($event, 'decrement')"/>
+            <span class="error error-bottom" *ngIf="!resourceForm?.controls.preemptible_instance_number.valid">
               <span *ngIf="minPreemptibleInstanceNumber !== maxPreemptibleInstanceNumber; else equal">
                 Only integer values greater than or equal to {{ minPreemptibleInstanceNumber }} and less than
-                {{ maxPreemptibleInstanceNumber }} are allowed
+                {{ maxPreemptibleInstanceNumber }} are allowed.
               </span>
-              <ng-template #equal>Please manage total machines count</ng-template>
+              <ng-template #equal>Please manage total machines count.</ng-template>
             </span>
           </div>
         </div>
 
-        <div class="checkbox-group control-group m-top-15" *ngIf="PROVIDER === 'aws'"
-          [hidden]="!selectedImage.templates.length">
-          <label class="spot-label label">
-            <input #spotInstancesCheck type="checkbox" (change)="selectSpotInstances($event)" />
-            <span>Spot instance</span>
-            <span *ngIf="spotInstancesSelect?.nativeElement['checked'] || false"> bid, %</span>
-          </label>
-          <div class="control spot-details" [ngClass]="{ show: spotInstancesSelect?.nativeElement['checked'] || false }"
-            *ngIf="spotInstancesSelect?.nativeElement['checked'] || false">
+        <div class="checkbox-group control-group m-top-15" *ngIf="PROVIDER === 'aws'" [hidden]="!selectedImage.templates.length">
+          <div class="d-flex cursor-pointer label" (click)="addAdditionalParams('spotInstances')">
+            <div class="empty-checkbox ml-10" [ngClass]="{'checked': isSelected.spotInstances}" (click)="selectSpotInstances()">
+              <span class="checked-checkbox" *ngIf="isSelected.spotInstances"></span>
+            </div>
+            <span class="pl-5">Spot instance</span><span [hidden]="!isSelected.spotInstances">&nbsp;bid, %</span>
+          </div>
+          <div class="control spot-details" [ngClass]="{ show: isSelected.spotInstances }"
+            *ngIf="isSelected.spotInstances">
             <input type="number" class="form-control" step="5" min="{{minSpotPrice}}" max="{{maxSpotPrice}}"
               formControlName="instance_price" (keypress)="CheckUtils.isNumberKey($event)">
-            <span class="error" *ngIf="!resourceForm?.controls.instance_price.valid">
-              Only integer values greater than or equal to {{minSpotPrice}} and less than {{maxSpotPrice}} are allowed
+            <span class="error error-bottom" *ngIf="!resourceForm?.controls.instance_price.valid">
+              Only integer values greater than or equal to {{minSpotPrice}} and less than {{maxSpotPrice}} are allowed.
             </span>
           </div>
-          <span class="info" *ngIf="spotInstancesSelect?.nativeElement['checked'] || false">When the current Spot price
+          <span class="info ml-10" *ngIf="isSelected.spotInstances">When the current Spot price
             rises above your bid price, the Spot instance is reclaimed by AWS so that it can be given to another
             customer. Make sure to backup your data on periodic basis.</span>
         </div>
-
-
-        <div class="checkbox-group m-top-20"
-          [hidden]="PROVIDER === 'gcp' && selectedImage?.image === 'docker.dlab-dataengine-service'"
-          *ngIf="notebook_instance?.image !== 'docker.dlab-zeppelin'">
-          <label>
-            <input #configurationNode type="checkbox" (change)="selectConfiguration()" /> Cluster configurations
-          </label>
-          <div class="config-link" *ngIf="(configuration?.nativeElement['checked'] || false)
-            && selectedImage?.image === 'docker.dlab-dataengine-service'
-            && PROVIDER === 'aws'">
+        <div class="checkbox-group control-group m-top-10"
+              [hidden]="PROVIDER === 'gcp' && selectedImage?.image === 'docker.datalab-dataengine-service'"
+              *ngIf="notebook_instance?.image !== 'docker.datalab-zeppelin'">
+          <div class="d-flex cursor-pointer label" (click)="addAdditionalParams('configuration')">
+            <div class="empty-checkbox ml-10" [ngClass]="{'checked': isSelected.configuration}">
+              <span class="checked-checkbox" *ngIf="isSelected.configuration"></span>
+            </div>
+            <span class="pl-5">Cluster configurations</span>
+          </div>
+          <div class="config-link" 
+              *ngIf="(isSelected.configuration) 
+                && selectedImage?.image === 'docker.datalab-dataengine-service'
+                && PROVIDER === 'aws'"
+          >
             To view example JSON of configurations refer for <a
-              href="https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html" target="_blank">AWS
-              official documentation</a>
+                href="https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html"
+                target="_blank">AWS
+            official documentation</a>
           </div>
         </div>
-        <div class="checkbox-group">
-          <div class="config-details" [ngClass]="{ show: configuration?.nativeElement['checked'] || false }">
-            <textarea formControlName="configuration_parameters" placeholder="Cluster configuration template, JSON"
-              data-gramm_editor="false"></textarea>
+        <div class="checkbox-group ml-10">
+          <div class="config-details" [ngClass]="{ show: isSelected.configuration }">
+            <textarea formControlName="configuration_parameters" 
+                      placeholder="Cluster configuration template, JSON"
+                      data-gramm_editor="false">
+            </textarea>
             <span class="error"
-              *ngIf="!resourceForm?.controls.configuration_parameters.valid && resourceForm?.controls['configuration_parameters'].dirty">Configuration
-              parameters is not in a valid format</span>
+                  *ngIf="!resourceForm?.controls.configuration_parameters.valid 
+                  && resourceForm?.controls['configuration_parameters'].dirty">
+                  Configuration parameters is not in a valid format.
+            </span>
           </div>
         </div>
-        <div *ngIf="notebook_instance?.image === 'docker.dlab-zeppelin'">
-          <small>Spark default configuration for Apache Zeppelin can not be changed from DLab UI. Currently it can be
-            done directly through Apache Zeppelin interpreter menu.
-            For more details please refer for Apache Zeppelin <a
-              href="https://zeppelin.apache.org/docs/0.8.0/usage/interpreter/overview.html" target="_blank">official
-              documentation</a>.
+        <div *ngIf="notebook_instance?.image === 'docker.datalab-zeppelin'" class="ml-10">
+          <small>Spark default configuration for Apache Zeppelin can not be changed from DataLab UI. Currently it
+              can be
+              done directly through Apache Zeppelin interpreter menu.
+              For more details please refer for Apache Zeppelin <a
+                      href="https://zeppelin.apache.org/docs/0.9.0/usage/interpreter/overview.html" target="_blank">official
+                  documentation</a>.
           </small>
         </div>
         <div class="text-center m-top-30">
-          <button mat-raised-button type="button" (click)="dialogRef.close()" class="butt action">Cancel</button>
-          <button mat-raised-button type="button" [disabled]="!resourceForm?.valid ||
-              (selectedImage?.image === 'docker.dlab-dataengine-service' && !resourceForm.value.shape_slave) ||
-              (selectedImage?.image === 'docker.dlab-dataengine-service' && !resourceForm.value.version)"
-            (click)="createComputationalResource(resourceForm.value)" class="butt butt-success action"
-            [ngClass]="{'not-allowed': !resourceForm?.valid ||
-              (selectedImage?.image === 'docker.dlab-dataengine-service' && !resourceForm.value.shape_slave) ||
-              (selectedImage?.image === 'docker.dlab-dataengine-service' && !resourceForm.value.version) }">Create</button>
+          <button mat-raised-button 
+                  type="button" 
+                  (click)="dialogRef.close()" 
+                  class="butt action">Cancel
+          </button>
+          <button mat-raised-button 
+                  type="button" 
+                  [disabled]="!resourceForm?.valid 
+                    || (!resourceForm.value.shape_slave) 
+                    || (selectedImage?.image === 'docker.datalab-dataengine-service' && !resourceForm.value.version)"
+                  (click)="createComputationalResource(resourceForm.value)" 
+                  class="butt butt-success action"
+                  [ngClass]="{'not-allowed': !resourceForm?.valid 
+                    || (selectedImage?.image === 'docker.datalab-dataengine-service' && !resourceForm.value.shape_slave) 
+                    || (selectedImage?.image === 'docker.datalab-dataengine-service' && !resourceForm.value.version) }">
+                  Create
+          </button>
         </div>
       </form>
-
     </div>
     <ng-template #placeholder>
       <div *ngIf="!loading && !clusterTypes?.length" class="info message">
-        Computational resource creations are not available.<br>Please, check your permissions.</div>
+        Compute creations are not available. Please, check your permissions.</div>
       <div *ngIf="loading" class="info message">
-        Computational resource data is processing
+        Compute data is processing
         <mat-progress-bar mode="indeterminate"></mat-progress-bar>
       </div>
     </ng-template>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.scss
index c40a785..c849fc8 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.scss
@@ -34,7 +34,7 @@
     span {
       &.error {
         position: absolute;
-        padding-left: 5px;
+        padding-left: 10px;
         right: 0;
         top: 36px;
       }
@@ -58,6 +58,7 @@
     vertical-align: middle;
     margin-left: 10px;
     margin-right: 5px;
+    margin-bottom: 4px;
   }
   .spot-details,
   .preemptible-details,
@@ -66,16 +67,18 @@
     opacity: 0;
     visibility: hidden;
     text-align: left;
-  
+
     &.show {
       height: 60px;
       visibility: visible;
       opacity: 1;
     }
   }
-  .preemptible {
+  &.preemptible {
+    height: 50px;
     .label {
-      padding-left: 10px;
+      height: 36px;
+      padding-bottom: 14px;
     }
     .control {
       position: relative;
@@ -87,7 +90,7 @@
   .spot-details, .preemptible-details {
     position: relative;
     .error {
-      bottom: -5px;
+      bottom: 0;
     }
 
     &.show {
@@ -121,7 +124,7 @@
     &.error {
       position: absolute;
       bottom: -20px;
-      left: 0;
+      right: 0;
     }
   }
   &.control-group {
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts
index 0c867f9..714eb92 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create-dialog.component.ts
@@ -17,14 +17,14 @@
  * under the License.
  */
 
-import { Component, OnInit, ViewChild, Inject, ChangeDetectorRef } from '@angular/core';
-import {FormGroup, FormBuilder, Validators, FormControl} from '@angular/forms';
+import { Component, OnInit, Inject, ChangeDetectorRef } from '@angular/core';
+import {FormGroup, FormBuilder, Validators} from '@angular/forms';
 import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { ToastrService } from 'ngx-toastr';
 
 import { ComputationalResourceModel } from './computational-resource-create.model';
 import { UserResourceService } from '../../../core/services';
-import { HTTP_STATUS_CODES, PATTERNS, CheckUtils, SortUtils } from '../../../core/util';
+import {HTTP_STATUS_CODES, PATTERNS, CheckUtils, SortUtils, HelpUtils} from '../../../core/util';
 
 import { DICTIONARY } from '../../../../dictionary/global.dictionary';
 import { CLUSTER_CONFIGURATION } from './cluster-configuration-templates';
@@ -48,7 +48,7 @@
   projectComputations = [];
   selectedImage: any;
   spotInstance: boolean = true;
-
+  maxClusterNameLength: number = 14;
   loading: boolean = false;
 
   public minInstanceNumber: number;
@@ -58,10 +58,15 @@
   public minSpotPrice: number = 0;
   public maxSpotPrice: number = 0;
   public resourceForm: FormGroup;
-
-  @ViewChild('spotInstancesCheck', { static: false }) spotInstancesSelect;
-  @ViewChild('preemptibleNode', { static: false }) preemptible;
-  @ViewChild('configurationNode', { static: false }) configuration;
+  public gpuCount: Array<number> = [1, 2, 4];
+  public isSelected = {
+    preemptible: false,
+    gpu: false,
+    spotInstances: false,
+    configuration: false,
+  };
+  public sortGpuTypes = HelpUtils.sortGpuTypes;
+  public addSizeToGpuType = HelpUtils.addSizeToGpuType;
 
   constructor(
     @Inject(MAT_DIALOG_DATA) public data: any,
@@ -83,14 +88,15 @@
 
   public selectImage($event) {
     this.selectedImage = $event;
+    this.filterShapes();
     this.getComputationalResourceLimits();
 
     if ($event.templates && $event.templates.length)
       this.resourceForm.controls['version'].setValue($event.templates[0].version);
   }
 
-  public selectSpotInstances($event?): void {
-    if ($event ? $event.target.checked : (this.spotInstancesSelect && this.spotInstancesSelect.nativeElement['checked'])) {
+  public selectSpotInstances(): void {
+    if (this.isSelected.spotInstances) {
       this.spotInstance = true;
       this.resourceForm.controls['instance_price'].setValue(50);
     } else {
@@ -99,14 +105,15 @@
     }
   }
 
-  public selectPreemptibleNodes($event) {
-    if ($event.target.checked)
+  public selectPreemptibleNodes(addPreemptible) {
+    if (addPreemptible) {
       this.resourceForm.controls['preemptible_instance_number'].setValue(this.minPreemptibleInstanceNumber);
+    }
   }
 
   public selectConfiguration() {
-    if (this.configuration && this.configuration.nativeElement.checked) {
-      const template = (this.selectedImage.image === 'docker.dlab-dataengine-service')
+    if (this.isSelected.configuration) {
+      const template = (this.selectedImage.image === 'docker.datalab-dataengine-service')
         ? CLUSTER_CONFIGURATION.EMR
         : CLUSTER_CONFIGURATION.SPARK;
       this.resourceForm.controls['configuration_parameters'].setValue(JSON.stringify(template, undefined, 2));
@@ -124,16 +131,17 @@
   }
 
   public isAvailableSpots(): boolean {
-    if (this.PROVIDER === 'aws' && this.selectedImage.image === 'docker.dlab-dataengine-service')
+    if (this.PROVIDER === 'aws' && this.selectedImage.image === 'docker.datalab-dataengine-service')
       return !!Object.keys(this.filterAvailableSpots()).length;
 
     return false;
   }
 
   public createComputationalResource(data) {
-    this.model.createComputationalResource(data, this.selectedImage, this.notebook_instance, this.spotInstance, this.PROVIDER.toLowerCase())
+    this.model.createComputationalResource(data, this.selectedImage, this.notebook_instance,
+      this.spotInstance, this.PROVIDER.toLowerCase(), this.isSelected.gpu)
       .subscribe((response: any) => {
-        if (response.status === HTTP_STATUS_CODES.OK) this.dialogRef.close();
+        if (response.status === HTTP_STATUS_CODES.OK) this.dialogRef.close(true);
       }, error => this.toastr.error(error.message, 'Oops!'));
   }
 
@@ -143,15 +151,22 @@
       version: [''],
       shape_master: ['', Validators.required],
       shape_slave: [''],
-      cluster_alias_name: ['', [Validators.required, Validators.pattern(PATTERNS.namePattern), Validators.maxLength(DICTIONARY[this.PROVIDER].max_cluster_name_length),
-      this.checkDuplication.bind(this)]],
+      cluster_alias_name: ['', [
+        Validators.required, Validators.pattern(PATTERNS.namePattern),
+        Validators.maxLength(this.maxClusterNameLength),
+      this.checkDuplication.bind(this)
+      ]],
       instance_number: ['', [Validators.required, Validators.pattern(PATTERNS.nodeCountPattern), this.validInstanceNumberRange.bind(this)]],
       preemptible_instance_number: [0,
         Validators.compose([Validators.pattern(PATTERNS.integerRegex),
         this.validPreemptibleRange.bind(this)])],
       instance_price: [0, [this.validInstanceSpotRange.bind(this)]],
       configuration_parameters: ['', [this.validConfiguration.bind(this)]],
-      custom_tag: [this.notebook_instance.tags.custom_tag]
+      custom_tag: [this.notebook_instance.tags.custom_tag],
+      master_GPU_type: [''],
+      slave_GPU_type: [''],
+      master_GPU_count: [''],
+      slave_GPU_count: [''],
     });
   }
 
@@ -166,16 +181,16 @@
       this.minInstanceNumber = this.selectedImage.limits[activeImage.total_instance_number_min];
       this.maxInstanceNumber = this.selectedImage.limits[activeImage.total_instance_number_max];
 
-      if (this.PROVIDER === 'gcp' && this.selectedImage.image === 'docker.dlab-dataengine-service') {
+      if (this.PROVIDER === 'gcp' && this.selectedImage.image === 'docker.datalab-dataengine-service') {
         this.maxInstanceNumber = this.selectedImage.limits[activeImage.total_instance_number_max] - 1;
         this.minPreemptibleInstanceNumber = this.selectedImage.limits.min_dataproc_preemptible_instance_count;
       }
 
-      if (this.PROVIDER === 'aws' && this.selectedImage.image === 'docker.dlab-dataengine-service') {
+      if (this.PROVIDER === 'aws' && this.selectedImage.image === 'docker.datalab-dataengine-service') {
         this.minSpotPrice = this.selectedImage.limits.min_emr_spot_instance_bid_pct;
         this.maxSpotPrice = this.selectedImage.limits.max_emr_spot_instance_bid_pct;
 
-        if (this.spotInstancesSelect) this.spotInstancesSelect.nativeElement['checked'] = true;
+        this.isSelected.spotInstances = true;
         this.selectSpotInstances();
       }
 
@@ -185,9 +200,10 @@
   }
 
   //  Validation
+
   private validInstanceNumberRange(control) {
     if (control && control.value)
-      if (this.PROVIDER === 'gcp' && this.selectedImage.image === 'docker.dlab-dataengine-service') {
+      if (this.PROVIDER === 'gcp' && this.selectedImage.image === 'docker.datalab-dataengine-service') {
         this.validPreemptibleNumberRange();
         return control.value >= this.minInstanceNumber && control.value <= this.maxInstanceNumber ? null : { valid: false };
       } else {
@@ -196,8 +212,8 @@
   }
 
   private validPreemptibleRange(control) {
-    if (this.preemptible)
-      return this.preemptible.nativeElement['checked']
+    if (this.isSelected.preemptible)
+      return this.isSelected.preemptible
         ? (control.value !== null
           && control.value >= this.minPreemptibleInstanceNumber
           && control.value <= this.maxPreemptibleInstanceNumber ? null : { valid: false })
@@ -217,25 +233,25 @@
   }
 
   private validInstanceSpotRange(control) {
-    if (this.spotInstancesSelect)
-      return this.spotInstancesSelect.nativeElement['checked']
+    if (this.isSelected.spotInstances)
+      return this.isSelected.spotInstances
         ? (control.value >= this.minSpotPrice && control.value <= this.maxSpotPrice ? null : { valid: false })
         : control.value;
   }
 
   private validConfiguration(control) {
-    if (this.configuration)
-      return this.configuration.nativeElement['checked']
-        ? (control.value && control.value !== null && CheckUtils.isJSON(control.value) ? null : { valid: false })
+    if (this.isSelected.configuration)
+      return this.isSelected.configuration ?
+        (control.value && control.value !== null && CheckUtils.isJSON(control.value) ? null : { valid: false })
         : null;
   }
 
   private checkDuplication(control) {
-    if (this.containsComputationalResource(control.value, this.userComputations)){
+    if (this.containsComputationalResource(control.value, this.userComputations)) {
       return { 'user-duplication': true };
     }
 
-    if (this.containsComputationalResource(control.value, this.projectComputations)){
+    if (this.containsComputationalResource(control.value, this.projectComputations)) {
       return { 'other-user-duplication': true };
     }
   }
@@ -247,12 +263,11 @@
         this.userComputations = clusterTypes.user_computations;
         this.projectComputations = clusterTypes.project_computations;
 
-        this.clusterTypes.forEach((cluster, index) => this.clusterTypes[index].computation_resources_shapes = SortUtils.shapesSort(cluster.computation_resources_shapes));
-        this.selectedImage = clusterTypes.templates[0];
-
+        this.clusterTypes.forEach((cluster, index) => this.clusterTypes[index].computation_resources_shapes =
+          SortUtils.shapesSort(cluster.computation_resources_shapes));
+        this.selectedImage = this.clusterTypes[0];
         if (this.selectedImage) {
           this._ref.detectChanges();
-
           this.filterShapes();
           this.resourceForm.get('template_name').setValue(this.selectedImage.template_name);
           this.getComputationalResourceLimits();
@@ -263,24 +278,37 @@
   }
 
   private filterShapes(): void {
-    if (this.notebook_instance.template_name.toLowerCase().indexOf('tensorflow') !== -1
-      || this.notebook_instance.template_name.toLowerCase().indexOf('deep learning') !== -1) {
-      const allowed: any = ['GPU optimized'];
-      const filtered = Object.keys(
-        SortUtils.shapesSort(this.selectedImage.computation_resources_shapes))
-        .filter(key => allowed.includes(key))
-        .reduce((obj, key) => {
-          obj[key] = this.selectedImage.computation_resources_shapes[key];
-          return obj;
-        }, {});
+    const allowed: any = ['GPU optimized'];
+    let filtered;
 
+    const reduceShapes = (obj, key) => {
+      obj[key] = this.selectedImage.computation_resources_shapes[key];
+      return obj;
+    };
+
+    const filteredShapeKeys = Object.keys(
+      SortUtils.shapesSort(this.selectedImage.computation_resources_shapes));
+
+    const filterShapes = (filter) => filteredShapeKeys
+      .filter(filter)
+      .reduce(reduceShapes, {});
+
+    if (this.notebook_instance.template_name.toLowerCase().indexOf('tensorflow') !== -1
+      || this.notebook_instance.template_name.toLowerCase().indexOf('deep learning') !== -1
+    ) {
+      filtered = filterShapes(key => allowed.includes(key));
       if (this.PROVIDER !== 'azure') {
-        const images = this.clusterTypes.filter(image => image.image === 'docker.dlab-dataengine');
+        const images = this.clusterTypes.filter(image => image.image === 'docker.datalab-dataengine');
         this.clusterTypes = images;
         this.selectedImage = this.clusterTypes[0];
       }
-      this.selectedImage.computation_resources_shapes = filtered;
+    } else if (this.notebook_instance.template_name.toLowerCase().indexOf('jupyter notebook') !== -1 &&
+      this.selectedImage.image === 'docker.datalab-dataengine-service' && this.notebook_instance.cloud_provider !== 'gcp') {
+      filtered = filterShapes(v => v);
+    } else {
+      filtered = filterShapes(key => !(allowed.includes(key)));
     }
+    this.selectedImage.computation_resources_shapes = filtered;
   }
 
   private filterAvailableSpots() {
@@ -300,4 +328,40 @@
         CheckUtils.delimitersFiltering(conputational_resource_name) === CheckUtils.delimitersFiltering(resource));
     }
   }
+
+  public addAdditionalParams(block: string) {
+    this.isSelected[block] = !this.isSelected[block];
+
+    if (block === 'configuration') {
+      this.selectConfiguration();
+    }
+
+    if (block === 'gpu') {
+      const controls = ['master_GPU_type', 'master_GPU_count', 'slave_GPU_type', 'slave_GPU_count'];
+      if (!this.isSelected.gpu) {
+        this.clearGpuType('master');
+        this.clearGpuType('slave');
+        controls.forEach(control => {
+          this.resourceForm.controls[control].clearValidators();
+          this.resourceForm.controls[control].updateValueAndValidity();
+        });
+
+      } else {
+        controls.forEach(control => {
+          this.resourceForm.controls[control].setValidators([Validators.required]);
+          this.resourceForm.controls[control].updateValueAndValidity();
+        });
+      }
+    }
+  }
+
+  public clearGpuType(type) {
+    if (type === 'master') {
+      this.resourceForm.controls['master_GPU_type'].setValue('');
+      this.resourceForm.controls['master_GPU_count'].setValue('');
+    } else {
+      this.resourceForm.controls['slave_GPU_type'].setValue('');
+      this.resourceForm.controls['slave_GPU_count'].setValue('');
+    }
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create.model.ts b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create.model.ts
index ce80c52..596f8ea 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create.model.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resource-create-dialog/computational-resource-create.model.ts
@@ -28,10 +28,10 @@
 
   constructor(private userResourceService: UserResourceService) { }
 
-  public createComputationalResource(parameters, image, env, spot, provider): Observable<{}> {
+  public createComputationalResource(parameters, image, env, spot, provider, gpu?): Observable<{}> {
     const config = parameters.configuration_parameters ? JSON.parse(parameters.configuration_parameters) : null;
 
-    if (provider === 'aws' && image.image === 'docker.dlab-dataengine-service') {
+    if (provider === 'aws' && image.image === 'docker.datalab-dataengine-service') {
       return this.userResourceService.createComputationalResource_DataengineService({
         name: parameters.cluster_alias_name,
         emr_instance_count: parameters.instance_number,
@@ -47,7 +47,7 @@
         project: env.project,
         custom_tag: parameters.custom_tag
       }, provider);
-    } else if (provider === 'gcp' && image.image === 'docker.dlab-dataengine-service') {
+    } else if (provider === 'gcp' && image.image === 'docker.datalab-dataengine-service') {
       return this.userResourceService.createComputationalResource_DataengineService({
         template_name: image.template_name,
         image: image.image,
@@ -61,13 +61,24 @@
         dataproc_version: parameters.version,
         config: config,
         project: env.project,
-        custom_tag: parameters.custom_tag
+        custom_tag: parameters.custom_tag,
+        master_gpu_type: gpu ? parameters.master_GPU_type : null,
+        slave_gpu_type: gpu ? parameters.slave_GPU_type : null,
+        master_gpu_count: gpu ? parameters.master_GPU_count : null,
+        slave_gpu_count: gpu ? parameters.slave_GPU_count : null,
+        gpu_enabled: gpu
       }, provider);
     } else {
       return this.userResourceService.createComputationalResource_Dataengine({
         name: parameters.cluster_alias_name,
         dataengine_instance_count: parameters.instance_number,
-        dataengine_instance_shape: parameters.shape_master,
+        master_instance_shape: parameters.shape_master,
+        slave_instance_shape: parameters.shape_slave,
+        gpu_enabled: gpu,
+        master_gpu_type: gpu ? parameters.master_GPU_type : null,
+        slave_gpu_type: gpu ? parameters.slave_GPU_type : null,
+        master_gpu_count: gpu ? parameters.master_GPU_count : null,
+        slave_gpu_count: gpu ? parameters.slave_GPU_count : null,
         notebook_name: env.name,
         image: image.image,
         template_name: image.template_name,
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.html
index 1b0a139..dec0ebd 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.html
@@ -24,7 +24,7 @@
   </div>
   <div *ngIf="resources?.length">
     <div *ngFor="let resource of resources" class="resource-wrap">
-      <div class="resource-name">
+      <div class="resource-name ellipsis">
         <a class="detailed-link" (click)="detailComputationalResources(environment, resource)">
           {{resource.computational_name}}
         </a>
@@ -39,13 +39,13 @@
         </a>
 
         <a class="start-stop-action"
-          *ngIf="resource.image === 'docker.dlab-dataengine' && environment.status === 'running'">
-          <i class="material-icons" *ngIf="resource.status === 'running' || resource.status === 'stopping'"
-            (click)="toggleResourceAction(resource, 'stop')"
-            [ngClass]="{'not-allowed' : resource.status === 'stopping' }">pause_circle_outline</i>
-          <i class="material-icons" *ngIf="resource.status === 'stopped' || resource.status === 'starting'"
-            (click)="toggleResourceAction(resource, 'start')"
-            [ngClass]="{'not-allowed' : resource.status === 'starting' }">play_circle_outline</i>
+           *ngIf="resource.image === 'docker.datalab-dataengine' && environment.status === 'running'">
+            <i class="material-icons" *ngIf="resource.status === 'running' || resource.status === 'stopping'"
+               (click)="toggleResourceAction(resource, 'stop')"
+               [ngClass]="{'not-allowed' : resource.status === 'stopping' }">pause_circle_outline</i>
+            <i class="material-icons" *ngIf="resource.status === 'stopped' || resource.status === 'starting'"
+               (click)="toggleResourceAction(resource, 'start')"
+               [ngClass]="{'not-allowed' : resource.status === 'starting' }">play_circle_outline</i>
         </a>
 
         <a class="remove_butt" [ngClass]="{'disabled' : environment.status !== 'running' || environment.status !== 'stopped'
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.scss
index a4b825e..2d9d8a5 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/computational-resources-list/computational-resources-list.component.scss
@@ -17,10 +17,13 @@
  * under the License.
  */
 
+ :host{
+ width:100%;
+ }
+
  .source {
    .no-details {
      color: #bdc9d5;
-     padding-left: 10px;
    }
 
    .resource-wrap {
@@ -30,20 +33,18 @@
      align-items: center;
 
      .resource-name {
-       width: 55%;
+       width: 50%;
        white-space: nowrap;
        overflow: hidden;
-       text-overflow: ellipsis;
-       padding-left: 10px;
 
        .detailed-link {
-         color: #577289;
+         color: #35afd5;
          cursor: pointer;
        }
      }
 
      .resource-status {
-       width: 30%;
+       width: 35%;
        text-transform: capitalize;
      }
 
@@ -109,23 +110,23 @@
      }
    }
  }
- @media screen and (max-width: 1520px) {
-   .resources,
-   managment {
-     .source {
-       .resource-wrap {
-         .resource-name {
-           width: 45%;
-         }
-
-         .resource-status {
-           width: 40%;
-         }
-
-         .resource-actions {
-           width: 15%;
-         }
-       }
-     }
-   }
- }
+ //@media screen and (max-width: 1520px) {
+ //  .resources,
+ //  managment {
+ //    .source {
+ //      .resource-wrap {
+ //        .resource-name {
+ //          width: 42%;
+ //        }
+ //
+ //        .resource-status {
+ //          width: 43%;
+ //        }
+ //
+ //        .resource-actions {
+ //          width: 15%;
+ //        }
+ //      }
+ //    }
+ //  }
+ //}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.html
index 4a7a4a6..b628122 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.html
@@ -25,15 +25,16 @@
   <div class="dialog-content">
     <div class="content-box" *ngIf="notebook">
       <form [formGroup]="createAMIForm" novalidate>
-        <div class="control-group">
+        <div class="control-group name">
           <label class="label">Name</label>
           <div class="control">
             <input type="text" formControlName="name" placeholder="Enter image name">
             <span class="error" *ngIf="createAMIForm.controls['name'].hasError('duplication')">This
               image name already exists in project.</span>
+            <span class="error" *ngIf="createAMIForm.controls['name'].hasError('maxlength') && !createAMIForm.controls['name'].hasError('pattern')">Name cannot be longer than 10 characters.</span>
             <span class="error"
-              *ngIf="!createAMIForm.valid && createAMIForm.controls['name'].dirty && !createAMIForm.controls['name'].hasError('duplication')">
-              Name cannot be longer than 10 characters and can only contain letters, numbers, hyphens and '_' but can not end with special characters</span>
+              *ngIf="createAMIForm.controls['name'].hasError('pattern')">
+              Name can contain only letters, numbers, hyphens and '_' but can not end with special characters.</span>
           </div>
         </div>
         <div class="control-group">
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.scss
index 4ab43fd..367b1a4 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.scss
@@ -30,3 +30,16 @@
     font-family:'Open Sans', sans-serif;
   }
 }
+.ami-dialog{
+  .control-group {
+    &.name {
+      padding-bottom: 30px;
+      .error{
+        top: 37px;
+        position: absolute;
+        right: 0;
+      }
+    }
+  }
+}
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.ts
index e783951..56cb2a4 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/ami-create-dialog/ami-create-dialog.component.ts
@@ -27,7 +27,7 @@
 import { DICTIONARY } from '../../../../dictionary/global.dictionary';
 
 @Component({
-  selector: 'dlab-ami-create-dialog',
+  selector: 'datalab-ami-create-dialog',
   templateUrl: './ami-create-dialog.component.html',
   styleUrls: ['./ami-create-dialog.component.scss']
 })
@@ -57,24 +57,19 @@
 
   public assignChanges(data) {
     this._userResource.createAMI(data).subscribe(
-      response => response.status === HTTP_STATUS_CODES.ACCEPTED && this.dialogRef.close(),
+      response => response.status === HTTP_STATUS_CODES.ACCEPTED && this.dialogRef.close(true),
       error => this.toastr.error(error.message || `Image creation failed!`, 'Oops!'));
   }
 
   private initFormModel(): void {
     this.createAMIForm = this._fb.group({
-      name: ['', [Validators.required, Validators.pattern(PATTERNS.namePattern), this.providerMaxLength, this.checkDuplication.bind(this)]],
+      name: ['', [Validators.required, Validators.pattern(PATTERNS.namePattern), Validators.maxLength(10), this.checkDuplication.bind(this)]],
       description: [''],
       exploratory_name: [this.notebook.name],
       project_name: [this.notebook.project]
     });
   }
 
-  private providerMaxLength(control) {
-    if (control && control.value)
-      return control.value.length <= 10 ? null : { valid: false };
-  }
-
   private checkDuplication(control) {
     if (control.value)
       return this.isDuplicate(control.value) ? { duplication: true } : null;
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html
index 1331f5f..a194a3d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html
@@ -33,7 +33,7 @@
       </table>
       <div class="billing-detail content-box">
         <mat-list>
-            <mat-list-item class="list-header">
+            <mat-list-item class="list-header" [ngClass]="{'pr-3': notebook.billing.report_lines.length > 6}">
               <div class="resource-name ellipsis" [ngClass]="{ 'wide-name-field' : provider === 'azure' }">Name</div>
               <div class="service">Product</div>
 <!--              <div class="resource-type" *ngIf="provider === 'aws'">Type</div>-->
@@ -43,21 +43,22 @@
             </mat-list-item>
             <div class="scrolling-content" id="scrolling">
               <mat-list-item *ngFor="let item of notebook.billing.report_lines">
-                <div class="resource-name" [ngClass]="{ 'wide-name-field' : provider === 'azure' }"
+                <div class="resource-name ellipsis" [ngClass]="{ 'wide-name-field' : provider === 'azure' }"
                      matTooltip="{{ item.resource_name }}"
                      matTooltipPosition="above">
                      {{ item.resource_name }}
                 </div>
                 <div class="service">{{ item.product }}</div>
 <!--                <div class="resource-type" >{{ item.resourse_type }}</div>-->
-                <div class="usage-date-start">{{ item.from | date }}</div>
-                <div class="usage-date-end">{{ item.to | date }}</div>
-                <div class="cost-currency">{{ item.cost }} {{ item.currency }}</div>
+                <div class="usage-date-start ellipsis">{{ item.from.join('/') | localDate : 'shortDate'}}</div>
+                <div class="usage-date-end ellipsis">{{ item.to.join('/') | localDate : 'shortDate'}}</div>
+                <div class="cost-currency">{{ item.cost | localcurrency }}</div>
               </mat-list-item>
             </div>
+
         </mat-list>
         <div class="total">
-          <strong>Total: </strong>{{ notebook.cost }} {{ notebook.currency_code }}</div>
+          <strong>Total: </strong>{{ notebook.cost | localcurrency }}</div>
       </div>
     </div>
   </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.scss
index 18998ea..897482c 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.scss
@@ -31,25 +31,37 @@
 }
 
 .billing-detail {
+
+  div {
+    font-size: 13px;
+  }
+
   .service {
-    width: 30%;
+    width: 35%;
   }
 
   .resource-type,
   .cost-currency {
-    width: 10%;
+    width: 11%;
   }
 
   .resource-name,
   .usage-date-start,
   .usage-date-end {
-    width: 20%;
     overflow: hidden;
-    text-overflow: ellipsis;
     padding-right: 10px;
     white-space: nowrap;
   }
 
+  .resource-name{
+    width: 20%;
+  }
+
+  .usage-date-start,
+  .usage-date-end{
+    width: 17%;
+  }
+
   .wide-name-field {
     width: 25%;
   }
@@ -60,21 +72,21 @@
   }
 
   .total {
-    padding: 18px 20px 0;
+    padding-top: 18px;
+    margin-right: 70px;
     text-align: right;
-    font-size: 20px;
+    font-size: 13px;
     font-weight: 600;
   }
 }
 
-
 .scrolling-content {
   max-height: 285px;
   overflow-y: auto;
 }
 
 .mat-list-item-content {
-  font-size: 15px !important;
+  font-size: 14px !important;
   justify-content: space-between;
 }
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts
index b95c183..647257d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts
@@ -22,11 +22,13 @@
 
 import { MaterialModule } from '../../../shared/material.module';
 import { CostDetailsDialogComponent } from './cost-details-dialog.component';
+import {LocalCurrencyModule} from '../../../core/pipes/local-currency-pipe';
+import {LocalDatePipeModule} from '../../../core/pipes/local-date-pipe';
 
 export * from './cost-details-dialog.component';
 
 @NgModule({
-  imports: [CommonModule, MaterialModule],
+  imports: [CommonModule, MaterialModule, LocalCurrencyModule, LocalDatePipeModule],
   declarations: [CostDetailsDialogComponent],
   entryComponents: [CostDetailsDialogComponent],
   exports: [CostDetailsDialogComponent]
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.html
index 43b3c71..28d54f3 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.html
@@ -29,7 +29,7 @@
           <label class="label">Select project</label>
           <div class="control selector-wrapper">
             <mat-form-field>
-              <mat-select formControlName="project" panelClass="create-resources-dialog" placeholder="Select project">
+              <mat-select formControlName="project" disableOptionCentering panelClass="create-resources-dialog scrolling" placeholder="Select project">
                 <mat-option *ngFor="let project of projects" [value]="project.name" (click)="setEndpoints(project)">
                   {{ project.name }}</mat-option>
                 <mat-option *ngIf="!projects.length" class="multiple-select ml-10" disabled>Projects list is empty
@@ -47,7 +47,7 @@
           <div class="control selector-wrapper" [ngClass]="{ 'not-active' : !endpoints.length }">
             <mat-form-field>
               <mat-select formControlName="endpoint" disableOptionCentering [disabled]="!endpoints.length"
-                panelClass="create-resources-dialog" placeholder="Select endpoint">
+                panelClass="create-resources-dialog scrolling" placeholder="Select endpoint">
                 <mat-option *ngFor="let endpoint of endpoints" [value]="endpoint"
                   (click)="getTemplates(createExploratoryForm?.controls['project'].value, endpoint)">{{ endpoint }}
                 </mat-option>
@@ -60,24 +60,41 @@
             </mat-form-field>
           </div>
         </div>
-
         <div class="control-group">
           <label class="label">Select template</label>
-          <div class="control selector-wrapper" [ngClass]="{ 'not-active' : !templates.length }">
-            <mat-form-field>
-              <mat-select formControlName="version" disableOptionCentering [disabled]="!templates.length"
-                panelClass="create-resources-dialog" placeholder="Select template">
-                <mat-option *ngFor="let template of templates"
-                  [value]="template.exploratory_environment_versions[0].version" (click)="getShapes(template)">
-                  {{ template.exploratory_environment_versions[0].template_name }}
-                </mat-option>
-                <mat-option *ngIf="!templates.length" class="multiple-select ml-10" disabled>Templates list is empty
-                </mat-option>
-              </mat-select>
-              <button class="caret">
-                <i class="material-icons">keyboard_arrow_down</i>
-              </button>
-            </mat-form-field>
+          <div class="control selector-wrapper"
+               [matTooltip]="'Notebook creations are not available. Please, check your permissions.'"
+               matTooltipPosition="above"
+               [matTooltipClass]="'full-size-tooltip'"
+               [matTooltipDisabled]="!(templates.length === 0 && this.createExploratoryForm.controls.endpoint.value)"
+          >
+            <span class="form-field-wrapper"  [ngClass]="{ 'not-active' : !templates.length  || (templates.length === 0 && this.createExploratoryForm.controls.endpoint.value)}">
+              <mat-form-field>
+                <mat-select formControlName="version" disableOptionCentering [disabled]="!templates.length || (templates.length === 0 && this.createExploratoryForm.controls.endpoint.value)"
+                  panelClass="create-resources-dialog scrolling" placeholder="Select template">
+                  <mat-option *ngFor="let template of templates"
+                    [value]="template.exploratory_environment_versions[0].version" (click)="getShapes(template)">
+                    {{ template.exploratory_environment_versions[0].template_name }}
+                  </mat-option>
+                  <mat-option *ngIf="!templates.length" class="multiple-select ml-10" disabled>Templates list is empty
+                  </mat-option>
+                </mat-select>
+                <button class="caret">
+                  <i class="material-icons">keyboard_arrow_down</i>
+                </button>
+              </mat-form-field>
+            </span>
+          </div>
+        </div>
+
+        <div 
+          class="image-description control-group" 
+          *ngIf="selectedCloud !== 'gcp' && currentTemplate?.image === 'docker.datalab-deeplearning'"
+        >
+          <label class="label"></label>
+          <div class="control">
+            <i class="material-icons" >info</i>
+            {{currentTemplate?.exploratory_environment_versions[0]?.description}}
           </div>
         </div>
 
@@ -86,10 +103,22 @@
           <div class="control selector-wrapper">
             <mat-form-field>
               <mat-label>Select image</mat-label>
-              <mat-select formControlName="notebook_image_name" disableOptionCentering>
-                <mat-option [value]="null">None</mat-option>
-                <mat-option *ngFor="let image of images" [value]="image.name">{{ image.name }}</mat-option>
-                <mat-option *ngIf="!images.length" class="multiple-select ml-10" disabled>Images list is empty
+              <mat-select formControlName="notebook_image_name" panelClass="create-resources-dialog scrolling" disableOptionCentering>
+                <mat-option 
+                  *ngIf="currentTemplate?.image !== 'docker.datalab-deeplearning'" 
+                  [value]="null" 
+                  (click)="setImage(null)"
+                >
+                  None
+                </mat-option>
+                <mat-option 
+                  *ngFor="let image of images" 
+                  [value]="image?.name" 
+                  (click)="setImage(image)"
+                >
+                  {{ image?.status ? image?.name + ' (custom image)' : image?.name }}
+                </mat-option>
+                <mat-option *ngIf="!images?.length" class="multiple-select ml-10" disabled>Images list is empty
                 </mat-option>
               </mat-select>
               <button class="caret">
@@ -99,32 +128,51 @@
           </div>
         </div>
 
+        <div 
+          class="image-description control-group" 
+          *ngIf="selectedImage?.description"
+        >
+          <label class="label"></label>
+          <div class="control">
+            <i class="material-icons" >info</i>
+            {{selectedImage?.description}}
+          </div>
+        </div>
+
         <div class="control-group name-control">
           <label class="label">Name</label>
           <div class="control">
-            <input [class.danger_field]="notebookExist || !createExploratoryForm?.controls['name'].valid
+            <input [class.danger_field]=" !createExploratoryForm?.controls['name'].valid
                     && createExploratoryForm?.controls['name'].dirty
                     && createExploratoryForm?.controls['name'].hasError('duplication')" type="text"
               class="form-control" placeholder="Enter Name" formControlName="name">
             <span class="error" *ngIf="createExploratoryForm?.controls['name'].hasError('duplication')">This name already exists in current project.</span>
-            <span class="error" *ngIf="!createExploratoryForm?.controls.name.valid
-                                        && createExploratoryForm?.controls['name'].dirty
-                                        && !createExploratoryForm?.controls['name'].hasError('duplication')">Name
-             cannot be longer than 10 characters and can only
-              contain letters, numbers, hyphens and '_' but can not end with special characters
+            <span class="error" *ngIf="createExploratoryForm?.controls['name'].hasError('maxlength') &&
+            !createExploratoryForm?.controls['name'].hasError('pattern')"
+            >
+              Name cannot be longer than {{maxNotebookLength}} characters.
+            </span>
+            <span class="error" *ngIf="createExploratoryForm?.controls['name'].hasError('pattern')">
+              Name can only contain letters, numbers, hyphens and '_' but can not end with special characters.
             </span>
           </div>
         </div>
 
         <div class="control-group">
           <label class="label">Instance size</label>
-          <div class="control selector-wrapper" [ngClass]="{ 'not-active': !currentTemplate }">
+          <div class="control selector-wrapper"
+               [matTooltip]="'Instance size are not available. Please, check your permissions.'"
+               matTooltipPosition="above"
+               [matTooltipClass]="'full-size-tooltip'"
+               [matTooltipDisabled]="!(!areShapes && currentTemplate)"
+          >
+            <span class="form-field-wrapper" [ngClass]="{ 'not-active': !currentTemplate || !areShapes && currentTemplate}">
             <mat-form-field>
               <mat-label>Select instance size</mat-label>
-              <mat-select formControlName="shape" disableOptionCentering [disabled]="!currentTemplate"
-                panelClass="create-resources-shapes" placeholder="Instance size">
+              <mat-select formControlName="shape" disableOptionCentering [disabled]="!currentTemplate || !areShapes && currentTemplate"
+                panelClass="create-resources-shapes scrolling" placeholder="Instance size">
                 <mat-optgroup *ngFor="let item of (shapes | keys)" [label]="item.key | underscoreless">
-                  <mat-option *ngFor="let list_item of item.value" [value]="list_item.Type">
+                  <mat-option *ngFor="let list_item of item.value" [value]="list_item.Type" (click)="setInstanceSize()">
                     <strong class="highlight icon-label">{{ list_item.Size }}</strong> {{ list_item.Type }}
                   </mat-option>
                 </mat-optgroup>
@@ -133,6 +181,7 @@
                 <i class="material-icons">keyboard_arrow_down</i>
               </button>
             </mat-form-field>
+            </span>
           </div>
         </div>
 
@@ -143,34 +192,112 @@
           </div>
           <span class="error"
             *ngIf="!createExploratoryForm?.controls.custom_tag.valid && createExploratoryForm?.controls.custom_tag.dirty">
-            Custom tag can only contain letters, numbers, hyphens and '_' but can not end with special characters</span>
+            Custom tag can only contain letters, numbers, hyphens and '_' but can not end with special characters.</span>
         </div>
 
         <div *ngIf="currentTemplate">
+          <ng-template 
+            [ngIf]="selectedCloud === 'gcp' && 
+              (currentTemplate?.image === 'docker.datalab-jupyter' || 
+              currentTemplate?.image === 'docker.datalab-deeplearning' ||
+              currentTemplate?.image === 'docker.datalab-tensor')"
+          >
+            <div class="checkbox-group">
+              <div 
+                class="d-flex cursor-pointer label m-bott-20" 
+                *ngIf="currentTemplate?.image === 'docker.datalab-jupyter'"
+                (click)="addGpuFields()"
+              >
+                <div class="empty-checkbox" [ngClass]="{'checked': this.additionalParams.gpu}">
+                  <span class="checked-checkbox" *ngIf="this.additionalParams.gpu"></span>
+                </div>
+                <span class=" pl-5">GPU</span>
+              </div>
+              <ng-template 
+                [ngIf]="this.additionalParams.gpu || 
+                  currentTemplate?.image === 'docker.datalab-deeplearning' ||
+                  currentTemplate?.image === 'docker.datalab-tensor'"
+              >
+                <div class="control-group">
+                  <label class="label">GPU type</label>
+                  <div class="control selector-wrapper"
+                       [matTooltip]="'Please, select instance size.'"
+                       matTooltipPosition="above"
+                       [matTooltipClass]="'full-size-tooltip'"
+                       [matTooltipDisabled]="!!createExploratoryForm.controls['shape'].value"
+                  >
+                <span class="form-field-wrapper" [ngClass]="{ 'not-active': !createExploratoryForm.controls['shape'].value}">
+                <mat-form-field>
+                  <mat-label>Select GPU type</mat-label>
+                  <mat-select formControlName="gpu_type" disableOptionCentering [disabled]="!createExploratoryForm.controls['shape'].value"
+                              panelClass="create-resources-dialog" placeholder="GPU type">
+                      <mat-option *ngFor="let list_item of gpuTypes; index as i" [value]="list_item" (click)="setCount('', list_item)">
+                        <strong class="highlight icon-label">{{ addSizeToGpuType(i) }}</strong> {{ list_item }}
+                      </mat-option>
+                      <mat-option *ngIf="!gpuTypes.length" class="multiple-select ml-10" disabled>
+                        GPU list is empty
+                      </mat-option>
+                  </mat-select>
+                  <button class="caret">
+                    <i class="material-icons">keyboard_arrow_down</i>
+                  </button>
+                </mat-form-field>
+                </span>
+                  </div>
+                </div>
+                <div class="control-group">
+                  <label class="label">GPU count</label>
+                  <div class="control selector-wrapper"
+                       [matTooltip]="'Please, select GPU type.'"
+                       matTooltipPosition="above"
+                       [matTooltipClass]="'full-size-tooltip'"
+                       [matTooltipDisabled]="!!createExploratoryForm.controls['gpu_type'].value"
+                  >
+                <span class="form-field-wrapper" [ngClass]="{ 'not-active': !createExploratoryForm.controls['gpu_type'].value}">
+                <mat-form-field>
+                  <mat-label>Select GPU count</mat-label>
+                  <mat-select formControlName="gpu_count" disableOptionCentering [disabled]="!createExploratoryForm.controls['gpu_type'].value"
+                              panelClass="create-resources-dialog" placeholder="GPU count">
+                      <mat-option *ngFor="let list_item of gpuCount" [value]="list_item">
+                        {{ list_item }}
+                      </mat-option>
+                  </mat-select>
+                  <button class="caret">
+                    <i class="material-icons">keyboard_arrow_down</i>
+                  </button>
+                </mat-form-field>
+                </span>
+                  </div>
+                </div>
+              </ng-template>
+          </div>
+          </ng-template>
           <div class="checkbox-group"
-            *ngIf="currentTemplate?.image !== 'docker.dlab-zeppelin' && currentTemplate?.image !== 'docker.dlab-superset' && currentTemplate?.image !== 'docker.dlab-jupyterlab'">
-            <label>
-              <input #configurationNode type="checkbox" (change)="selectConfiguration()" /> Spark configurations
-            </label>
-            <div class="config-details" [ngClass]="{ show: configuration?.nativeElement['checked'] || false }">
+               *ngIf="currentTemplate?.image !== 'docker.datalab-zeppelin' && currentTemplate?.image !== 'docker.datalab-superset' && currentTemplate?.image !== 'docker.datalab-jupyterlab'">
+            <div class="d-flex cursor-pointer label m-bott-20" (click)="selectConfiguration()">
+              <div class="empty-checkbox" [ngClass]="{'checked': this.additionalParams.configurationNode}">
+                <span class="checked-checkbox" *ngIf="this.additionalParams.configurationNode"></span>
+              </div>
+              <span class=" pl-5">Spark configurations</span>
+            </div>
+            <div class="config-details" [ngClass]="{ show: this.additionalParams.configurationNode}">
               <textarea formControlName="cluster_config" placeholder="Cluster configuration template, JSON"
-                data-gramm_editor="false" id="config"></textarea>
-              <span class="error"
-                *ngIf="!createExploratoryForm?.controls.cluster_config.valid && createExploratoryForm?.controls['cluster_config'].dirty">Configuration
-                parameters is not in a valid format</span>
+                        data-gramm_editor="false" id="config"></textarea>
+              <span class="error spark-config"
+                    *ngIf="!createExploratoryForm?.controls.cluster_config.valid && createExploratoryForm?.controls['cluster_config'].dirty">Configuration
+                parameters is not in a valid format.</span>
             </div>
           </div>
-
-          <small *ngIf="currentTemplate?.image === 'docker.dlab-zeppelin'">
-            Spark default configuration for Apache Zeppelin can not be changed from DLab UI. Currently it can be
-            done directly through Apache Zeppelin interpreter menu.
-            For more details please refer for Apache Zeppelin <a
-              href="https://zeppelin.apache.org/docs/0.8.0/usage/interpreter/overview.html" target="_blank">official
-              documentation</a>.
-          </small>
+            <small *ngIf="currentTemplate?.image === 'docker.datalab-zeppelin'">
+                Spark default configuration for Apache Zeppelin can not be changed from DataLab UI. Currently it can be
+                done directly through Apache Zeppelin interpreter menu.
+                For more details please refer for Apache Zeppelin <a
+                    href="https://zeppelin.apache.org/docs/0.9.0/usage/interpreter/overview.html" target="_blank">official
+                documentation</a>.
+            </small>
         </div>
 
-        <div class="text-center m-top-30">
+        <div class="text-center m-top-30"  id="buttons">
           <button mat-raised-button type="button" class="butt action" (click)="dialogRef.close()">Cancel</button>
           <button mat-raised-button type="button" class="butt butt-success action"
             [disabled]="!createExploratoryForm?.valid"
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.scss
index 6711ad4..44aa50d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.scss
@@ -18,6 +18,11 @@
  */
 
 .checkbox-group {
+
+  .empty-checkbox{
+    margin: 0;
+  }
+
   .config-details {
     height: 0;
     opacity: 0;
@@ -41,6 +46,12 @@
       font-family: Consolas, monospace;
     }
 
+    .spark-config{
+      position: absolute;
+      bottom: -15px;
+      right: 0;
+    }
+
     span {
       &.danger_color {
         position: absolute;
@@ -55,7 +66,7 @@
   .error {
     position: absolute;
     right: 0;
-    top: 35px;
+    top: 38px;
   }
 
   &.name-control {
@@ -63,11 +74,24 @@
   }
 }
 
+.image-description {
+  font-size: 12.5px;
+  overflow-wrap: break-word;
+
+  i {
+    font-size: 14px;
+  }
+}
+
 .content-box {
   max-height: 580px;
   overflow-y: auto;
 }
 
+.form-field-wrapper{
+  width: 100%;
+}
+
 @-moz-document url-prefix() {
   .create-environment form {
     padding-bottom: 30px;
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.ts
index b9fc3f0..4468a18 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/create-environment/create-environment.component.ts
@@ -17,17 +17,18 @@
  * under the License.
  */
 
-import { Component, OnInit, ViewChild, Inject } from '@angular/core';
+import { Component, OnInit, Inject } from '@angular/core';
 import { FormGroup, FormBuilder, Validators } from '@angular/forms';
 import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { ToastrService } from 'ngx-toastr';
 
 import { Project } from '../../../administration/project/project.component';
 import { UserResourceService, ProjectService } from '../../../core/services';
-import { CheckUtils, SortUtils, HTTP_STATUS_CODES, PATTERNS } from '../../../core/util';
+import {CheckUtils, SortUtils, HTTP_STATUS_CODES, PATTERNS, HelpUtils} from '../../../core/util';
 import { DICTIONARY } from '../../../../dictionary/global.dictionary';
 import { CLUSTER_CONFIGURATION } from '../../computational/computational-resource-create-dialog/cluster-configuration-templates';
 import {tap} from 'rxjs/operators';
+import {timer} from 'rxjs';
 
 @Component({
   selector: 'create-environment',
@@ -47,8 +48,18 @@
   shapes = [] || {};
   resourceGrid: any;
   images: Array<any>;
+  selectedImage: any;
+  maxNotebookLength: number = 14;
+  public areShapes: boolean;
+  public selectedCloud: string = '';
+  public gpuCount: Array<number>;
+  public gpuTypes: Array<string> = [];
+  public addSizeToGpuType = HelpUtils.addSizeToGpuType;
 
-  @ViewChild('configurationNode', { static: false }) configuration;
+  public additionalParams = {
+    configurationNode: false,
+    gpu: false,
+  };
 
   constructor(
     @Inject(MAT_DIALOG_DATA) public data: any,
@@ -87,31 +98,116 @@
     });
   }
 
-  public setEndpoints(project) {
-    if (this.images) this.images = [];
+  public setImage(image) {
+    this.selectedImage = image;
+    timer(500).subscribe(_ => {
+      document.querySelector('#buttons').scrollIntoView({ block: 'center', behavior: 'smooth' });
+    });
+  }
 
+  public setEndpoints(project) {
+    const controls = ['endpoint', 'version', 'shape', 'gpu_type', 'gpu_count'];
+    this.resetSelections(controls);
+    
     this.endpoints = project.endpoints
       .filter(e => e.status === 'RUNNING')
       .map(e => e.name);
   }
 
+  public resetSelections(controls: Array<string>) {
+    if (this.images) this.images = [];
+    if (this.selectedCloud) this.selectedCloud = '';
+    if (this.additionalParams.gpu) {
+      this.additionalParams.gpu = !this.additionalParams.gpu;
+      this.createExploratoryForm.controls['gpu_enabled'].setValue(this.additionalParams.gpu);
+    }
+    this.selectedImage = null;
+    this.areShapes = false;
+    this.templates = [];
+    this.currentTemplate = [];
+    controls.forEach(control => {
+      this.createExploratoryForm.controls[control].setValue(null);
+    });
+  }
+
   public getTemplates(project, endpoint) {
+    const controls = ['version', 'shape'];
+    this.resetSelections(controls);
+
+    const endpoints = this.data.environments.find(env => env.project === project).endpoints;
+    this.selectedCloud = endpoints.find(endp => endp.name === endpoint).cloudProvider.toLowerCase();
+
     this.userResourceService.getExploratoryTemplates(project, endpoint)
       .pipe(tap(results => {
+
         results.sort((a, b) =>
           (a.exploratory_environment_versions[0].template_name > b.exploratory_environment_versions[0].template_name) ?
             1 : -1);
       }))
       .subscribe(templates =>  {
         this.templates = templates;
-      }
+        }
       );
+
   }
 
   public getShapes(template) {
+    this.selectedImage = null;
+    const controls = ['notebook_image_name', 'shape', 'gpu_type', 'gpu_count'];
+
+    controls.forEach(control => {
+      this.createExploratoryForm.controls[control].setValue(null);
+      if (control !== 'shape') {
+        this.createExploratoryForm.controls[control].clearValidators();
+        this.createExploratoryForm.controls[control].updateValueAndValidity();
+      }
+    });
+
+    if (this.additionalParams.gpu) {
+      this.additionalParams.gpu = !this.additionalParams.gpu;
+      this.createExploratoryForm.controls['gpu_enabled'].setValue(this.additionalParams.gpu);
+    }
+
+    if (this.selectedCloud === 'gcp' && template?.image === 'docker.datalab-deeplearning') {
+      this.createExploratoryForm.controls['notebook_image_name'].setValidators([Validators.required]);
+      this.createExploratoryForm.controls['notebook_image_name'].updateValueAndValidity();
+    }
+    
+    if (this.selectedCloud === 'gcp' && 
+        (template?.image === 'docker.datalab-jupyter' ||
+        template?.image === 'docker.datalab-deeplearning' ||
+        template?.image === 'docker.datalab-tensor')) {
+          
+      this.gpuTypes = template?.computationGPU ? HelpUtils.sortGpuTypes(template.computationGPU) : [];
+
+      if(template?.image === 'docker.datalab-tensor' || template?.image === 'docker.datalab-deeplearning') {
+        this.addGpuFields();
+      }
+    }
+
     this.currentTemplate = template;
-    this.shapes = SortUtils.shapesSort(template.exploratory_environment_shapes);
-    this.getImagesList();
+    const allowed: any = ['GPU optimized'];
+
+    if (template.exploratory_environment_versions[0].template_name.toLowerCase().indexOf('tensorflow') === -1
+      && template.exploratory_environment_versions[0].template_name.toLowerCase().indexOf('deeplearning') === -1
+      && template.exploratory_environment_versions[0].template_name.toLowerCase().indexOf('deep learning') === -1
+      && template.exploratory_environment_versions[0].template_name.toLowerCase().indexOf('data science') === -1
+    ) {
+      const filtered = Object.keys(
+        SortUtils.shapesSort(template.exploratory_environment_shapes))
+        .filter(key => !(allowed.includes(key)))
+        .reduce((obj, key) => {
+          obj[key] = template.exploratory_environment_shapes[key];
+          return obj;
+        }, {});
+      template.exploratory_environment_shapes.computation_resources_shapes = filtered;
+      this.shapes = SortUtils.shapesSort(template.exploratory_environment_shapes.computation_resources_shapes);
+      this.getImagesList();
+    } else {
+      this.shapes = SortUtils.shapesSort(template.exploratory_environment_shapes);
+      this.getImagesList();
+    }
+    this.areShapes = !!Object.keys(this.shapes).length;
   }
 
   public createExploratoryEnvironment(data) {
@@ -120,7 +216,15 @@
       template_name: this.currentTemplate.exploratory_environment_versions[0].template_name
     };
 
+    
+    if (!data.notebook_image_name 
+      && this.currentTemplate.image === 'docker.datalab-deeplearning' 
+      && this.selectedCloud === 'aws' || this.selectedCloud === 'azure') {
+      data.notebook_image_name = this.currentTemplate.exploratory_environment_versions[0].version;
+    }
+
     data.cluster_config = data.cluster_config ? JSON.parse(data.cluster_config) : null;
+
     this.userResourceService.createExploratoryEnvironment({ ...parameters, ...data }).subscribe((response: any) => {
       if (response.status === HTTP_STATUS_CODES.OK) this.dialogRef.close();
     }, error => this.toastr.error(error.message || 'Exploratory creation failed!', 'Oops!'));
@@ -133,11 +237,60 @@
   }
 
   public selectConfiguration() {
-    const value = (this.configuration.nativeElement.checked && this.createExploratoryForm)
-      ? JSON.stringify(CLUSTER_CONFIGURATION.SPARK, undefined, 2) : '';
+    this.additionalParams.configurationNode = !this.additionalParams.configurationNode;
+    if (this.additionalParams.configurationNode) {
+      const value = (this.additionalParams.configurationNode && this.createExploratoryForm)
+        ? JSON.stringify(CLUSTER_CONFIGURATION.SPARK, undefined, 2) : '';
+      timer(500).subscribe(_ => {
+        document.querySelector('#buttons').scrollIntoView({ block: 'start', behavior: 'smooth' });
+      });
+      this.createExploratoryForm.controls['cluster_config'].setValue(value);
+    }
+  }
 
-    document.querySelector('#config').scrollIntoView({ block: 'start', behavior: 'smooth' });
-    this.createExploratoryForm.controls['cluster_config'].setValue(value);
+  public addGpuFields() {
+    this.additionalParams.gpu = !this.additionalParams.gpu;
+    this.createExploratoryForm.controls['gpu_enabled'].setValue(this.additionalParams.gpu);
+
+    const controls = ['gpu_type', 'gpu_count'];
+    if (!this.additionalParams.gpu) {
+      controls.forEach(control => {
+        this.createExploratoryForm.controls[control].setValue(null);
+        this.createExploratoryForm.controls[control].clearValidators();
+        this.createExploratoryForm.controls[control].updateValueAndValidity();
+      });
+
+    } else {
+      controls.forEach(control => {
+        this.createExploratoryForm.controls[control].setValidators([Validators.required]);
+        this.createExploratoryForm.controls[control].updateValueAndValidity();
+      });
+      timer(500).subscribe(_ => {
+        document.querySelector('#buttons').scrollIntoView({ block: 'center', behavior: 'smooth' });
+      });
+    }
+  }
+
+  public setInstanceSize() {
+    const controls = ['gpu_type', 'gpu_count'];
+    controls.forEach(control => {
+      this.createExploratoryForm.controls[control].setValue(null);
+    });
+  }
+
+  public setCount(type: any, gpuType: any): void {
+    if (gpuType && this.currentTemplate.image === 'docker.datalab-deeplearning') {
+      this.additionalParams.gpu = true;
+      this.createExploratoryForm.controls['gpu_enabled'].setValue(this.additionalParams.gpu);
+      this.createExploratoryForm.controls['gpu_count'].setValidators([Validators.required]);
+      this.createExploratoryForm.controls['gpu_count'].updateValueAndValidity();
+    }
+    // if (type === 'master') {
+      this.gpuCount = [1, 2, 4];
+    // } else {
+    //   const slaveShape = this.resourceForm.controls['shape_slave'].value;
+    //   this.slaveGPUcount = HelpUtils.setGPUCount(slaveShape, gpuType);
+    // }
   }
 
   private initFormModel(): void {
@@ -147,16 +300,33 @@
       version: ['', Validators.required],
       notebook_image_name: [''],
       shape: ['', Validators.required],
-      name: ['', [Validators.required, Validators.pattern(PATTERNS.namePattern), this.providerMaxLength, this.checkDuplication.bind(this)]],
+      name: ['', [
+        Validators.required,
+        Validators.pattern(PATTERNS.namePattern),
+        Validators.maxLength(this.maxNotebookLength),
+        this.checkDuplication.bind(this)
+      ]],
       cluster_config: ['', [this.validConfiguration.bind(this)]],
-      custom_tag: ['', [Validators.pattern(PATTERNS.namePattern)]]
+      custom_tag: ['', [Validators.pattern(PATTERNS.namePattern)]],
+      gpu_type: [null],
+      gpu_count: [null],
+      gpu_enabled: [false]
     });
   }
 
   private getImagesList() {
     this.userResourceService.getUserImages(this.currentTemplate.image, this.createExploratoryForm.controls['project'].value,
       this.createExploratoryForm.controls['endpoint'].value)
-      .subscribe((res: any) => this.images = res.filter(el => el.status === 'CREATED'),
+      .subscribe((res: any) => {
+        this.images = res.filter(el => el.status === 'CREATED');
+        
+        if(this.selectedCloud === 'gcp' && this.currentTemplate.image === 'docker.datalab-deeplearning') {
+            this.currentTemplate.exploratory_environment_images = this.currentTemplate.exploratory_environment_images.map(image => {
+              return {name: image['Image family'] ?? image.name, description: image['Description'] ?? image.description}
+            });
+            this.images.push(...this.currentTemplate.exploratory_environment_images);
+          }
+      },
         error => this.toastr.error(error.message || 'Images list loading failed!', 'Oops!'));
   }
 
@@ -167,14 +337,9 @@
       return { duplication: true };
   }
 
-  private providerMaxLength(control) {
-    if (control && control.value)
-      return control.value.length <= 10 ? null : { valid: false };
-  }
-
   private validConfiguration(control) {
-    if (this.configuration)
-      return this.configuration.nativeElement['checked']
+    if (this.additionalParams.configurationNode)
+      return this.additionalParams.configurationNode
         ? (control.value && control.value !== null && CheckUtils.isJSON(control.value) ? null : { valid: false })
         : null;
   }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
index d41f69a..fbd5ff1 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.html
@@ -17,97 +17,238 @@
   ~ under the License.
   -->
 
+<script src="detail-dialog.component.ts"></script>
 <div class="detail-dialog" id="dialog-box">
   <header class="dialog-header header-white">
     <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
   </header>
   <div class="dialog-content">
-    <div *ngIf="data">
+    <div *ngIf="data.odahu">
       <table class="detail-header">
         <tr>
-          <td>{{notebook.template_name}}</td>
+          <td>{{odahu.name}}</td>
+          <td>
+            <span class="status" ngClass="{{odahu.status || ''}}">
+              {{odahu.status}}
+            </span>
+          </td>
+          <td>{{odahu.shape}}</td>
+        </tr>
+      </table>
+    </div>
+    <div *ngIf="data.notebook">
+      <table class="detail-header">
+        <tr>
+          <td>{{notebook.template_name || notebook.name}}</td>
           <td>
             <span class="status" ngClass="{{notebook.status || ''}}">
               {{notebook.status}}
             </span>
           </td>
-          <td>{{notebook.shape}}</td>
+          <td>
+            <div>{{notebook.shape}}</div>
+            <div *ngIf="notebook.gpu_type">{{notebook.gpu_type}}</div>
+            <div *ngIf="notebook.gpu_count">GPU count: {{notebook.gpu_count}}</div>
+          </td>
         </tr>
       </table>
+
       <div class="content-box">
         <div class="detail-info" *ngIf="notebook.error_message">
           <p class="failed">{{ notebook.error_message }}</p>
         </div>
-
-        <div class="scroll-box" id="scrolling">
+        <div *ngIf="data.type === 'environment'" class="detail-info">
+          <p>Open following URL(s) in your browser to access this box:</p>
+          <div class="links_block">
+<!--            <p *ngFor="let item of notebook.exploratory_urls">-->
+<!--              <span class="description">{{item.description}}: &nbsp;</span>-->
+<!--              <a class="ellipsis" matTooltip="{{item.url}}" matTooltipPosition="above" href="{{item.url}}"-->
+<!--                 target="_blank" (click)="logAction(notebook.name, item.description)">-->
+<!--                &nbsp;{{item.url}}{{notebook.name}}-->
+<!--              </a>-->
+<!--            </p>-->
+            <ng-container *ngFor="let item of notebook.exploratory_urls">
+                <span class="d-none" *ngIf="item.description.toLowerCase() === 'ungit' && notebook.exploratory_urls[0].description.toLowerCase().indexOf('zeppelin') !== -1; else ungit">
+                </span>
+              <ng-template #ungit>
+                <p (mouseleave)="hideCopyIcon()">
+                  <span class="description">{{item.description}}: &nbsp;</span>
+                  <a (mouseover)="showCopyIcon(item.description)"
+                     (click)="logAction(notebook.name, item.description)"
+                     class="ellipsis none-select resources-url" matTooltip="{{item.url}}"
+                     matTooltipPosition="above"
+                     href="{{item.url}}"
+                     target="_blank"
+                     (contextmenu)="false"
+                  >
+                    &nbsp;{{item.url}}
+                  </a>
+                  <span (click)="logAction(notebook.name, item.description, 'Copy');$event.stopPropagation()" *ngIf="isCopyIconVissible[item.description]" [matTooltip]="isCopied ? 'Copy ' + item.description + ' url': 'Copied'" matTooltipPosition="above" class="copy-icon-wrapper">
+                      <span  class="link-icon" (click)="copyLink(item.url)" >
+                        <span _ngcontent-xpv-c19="" class="material-icons" (click)="this.isCopied = false">content_copy</span>
+                       </span>
+                    </span>
+                </p>
+              </ng-template>
+            </ng-container>
+          </div>
+        </div>
+        <div class="scroll-box" id="scrolling" *ngIf="data.type === 'resource'">
           <div class="detail-info" *ngIf="!notebook.error_message">
             <p>Edge Node IP Address {{notebook.node_ip}}</p>
             <p *ngIf="notebook.status === 'running'">Up time {{upTimeInHours}} hour(s) since
-              {{upTimeSince || "not specified."}}</p>
-            <p>Open following URL(s) in your browser to access this box:</p>
+              {{notebook.time ? (notebook.time | longDate ) : "not specified."}}</p>
+            <p *ngIf="notebook.url?.length">Open following URL(s) in your browser to access this box:</p>
             <div class="links_block">
-              <p *ngFor="let item of notebook.url">
-               <ng-container *ngIf="!(item.description === 'Ungit' && notebook.template_name.indexOf('Apache Zeppelin') !== -1)">
-                <span class="description">{{item.description}}: &nbsp;</span>
-                <a class="ellipsis" matTooltip="{{item.url}}" matTooltipPosition="above" href="{{item.url}}"
-                  target="_blank">
-                  &nbsp;{{item.url}}
-                </a>
-               </ng-container>
-              </p>
+              <ng-container *ngFor="let item of notebook.url">
+                <span class="d-none" *ngIf="item.description.toLowerCase() === 'ungit' && notebook.template_name.toLowerCase().indexOf('zeppelin ') !== -1; else ungit">
+                </span>
+                <ng-template #ungit>
+                  <p (mouseleave)="hideCopyIcon()">
+                    <span class="description">{{item.description}}: &nbsp;</span>
+                    <a (mouseover)="showCopyIcon(item.description)"
+                       (click)="logAction(notebook.name, item.description)"
+                       class="ellipsis none-select resources-url" matTooltip="{{item.url}}"
+                       matTooltipPosition="above"
+                       href="{{item.url}}"
+                      target="_blank"
+                       (contextmenu)="false"
+                    >
+                      &nbsp;{{item.url}}
+                    </a>
+                    <span (click)="logAction(notebook.name, item.description, 'Copy');$event.stopPropagation()" *ngIf="isCopyIconVissible[item.description]" [matTooltip]="isCopied ? 'Copy ' + item.description + ' url': 'Copied'" matTooltipPosition="above" class="copy-icon-wrapper">
+                      <span  class="link-icon" (click)="copyLink(item.url)" >
+                        <span _ngcontent-xpv-c19="" class="material-icons" (click)="this.isCopied = false">content_copy</span>
+                       </span>
+                    </span>
+                  </p>
+                </ng-template>
+              </ng-container>
             </div>
             <p class="flex" *ngIf="notebook.username">Node User: &nbsp;<span
                 class="strong">{{ notebook.username }}</span></p>
             <p class="flex" *ngIf="notebook.password">Password: &nbsp;<span
                 class="strong">{{ notebook.password }}</span></p>
 
-            <p class="m-top-30">{{ DICTIONARY[PROVIDER].personal_storage }}: &nbsp;</p>
-            <div class="links_block">
-              <p *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'azure' && notebook.account_name">{{ DICTIONARY[PROVIDER].account }}
-                <span class="bucket-info">{{ notebook.account_name}}</span></p>
-              <p *ngIf="notebook.bucket_name">{{ DICTIONARY[PROVIDER].container }} <span
-                  class="bucket-info">{{ notebook.bucket_name }}</span></p>
-            </div>
-            <p>Shared endpoint bucket: &nbsp;</p>
-            <div class="links_block">
-              <p *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'azure' && notebook.shared_account_name">{{ DICTIONARY[PROVIDER].account }}
-                <span class="bucket-info">{{ notebook.shared_account_name}}</span></p>
-              <p *ngIf="notebook.shared_bucket_name">{{ DICTIONARY[PROVIDER].container }}
-                <span class="bucket-info">{{ notebook.shared_bucket_name }}</span></p>
-            </div>
-            <br />
+            <p class="m-top-30">{{ 'Project bucket' }}: &nbsp;</p>
+            <div class="links_block" (mouseleave)="hideCopyIcon()">
+                <p *ngIf="PROVIDER === 'azure' && notebook.account_name" class="bucket-info-wrapper">
+                  <span
+                    class="bucket-info"
+                    (mouseover)="showCopyIcon('bucket')"
+                    [matTooltip]="notebook.bucket_name + '@' + notebook.account_name + '.blob.core.windows.net'"
+                    matTooltipPosition="above"
+                    [matTooltipClass]="'full-size-tooltip'"
+                  >
+                    {{notebook.bucket_name + '@' + notebook.account_name + '.blob.core.windows.net'}}
+                  </span>
 
-            <div *ngIf="DICTIONARY[PROVIDER].cloud_provider === 'azure' && notebook.datalake_name">
-              <p>Data Lake Store: &nbsp;</p>
-              <div class="links_block">
-                <p>Data Lake Store Account: &nbsp;<span class="bucket-info">{{ notebook.datalake_name }}</span></p>
-                <p>Personal folder: &nbsp;<span class="bucket-info">{{ notebook.datalake_directory }}</span></p>
-                <p>Collaboration folder: &nbsp;<span class="bucket-info">{{ notebook.datalake_shared_directory }}</span>
+                  <span  *ngIf="isCopyIconVissible.bucket" [matTooltip]="isCopied ? 'Copy bucket name' : 'Copied'" matTooltipPosition="above">
+                    <span  class="link-icon" (click)="copyLink(notebook.bucket_name + '@' + notebook.account_name + '.blob.core.windows.net', true);$event.stopPropagation()" >
+                    <span _ngcontent-xpv-c19="" class="material-icons" (click)="this.isCopied = false">content_copy</span>
+                  </span>
+                  </span>
                 </p>
-              </div>
+                <p *ngIf="notebook.bucket_name && PROVIDER !== 'azure'">{{ DICTIONARY[PROVIDER].container }}
+                  <span
+                    class="bucket-info"
+                    (mouseover)="showCopyIcon('bucket')"
+                  >
+                    {{ notebook.bucket_name }}
+                </span>
+                  <span  *ngIf="isCopyIconVissible.bucket" [matTooltip]="isCopied ? 'Copy bucket name' : 'Copied'" matTooltipPosition="above">
+                    <span  class="link-icon" (click)="copyLink(notebook.bucket_name, true);$event.stopPropagation()" >
+                    <span _ngcontent-xpv-c19="" class="material-icons" (click)="this.isCopied = false">content_copy</span>
+                  </span>
+                  </span>
+                </p>
             </div>
+            <div class="bucket-info bucket-link">
+              <span></span>
+<!--              <button-->
+<!--                type="button"-->
+<!--                class="butt"-->
+<!--                mat-raised-button-->
+<!--              >-->
+<!--                Open bucket browser-->
+<!--              </button>-->
+<!--              <span class="description open-bucket"-->
+<!--                 [ngClass]="{'not-allow': !this.bucketStatus['view'] || !thisdata.buckets.length}"-->
+<!--                (click)="bucketBrowser(notebook.bucket_name, notebook.endpoint, this.bucketStatus['view'] && thisdata.buckets.length)"-->
+<!--              >-->
+                <span class="description open-bucket"
+                      [matTooltip]="!this.bucketStatus['view']
+                 ? 'You have not permission to open bucket'
+                 : 'You have not any bucket'"
+                      matTooltipDisabled="{{this.bucketStatus['view'] && this.data.buckets.length}}"
+                      matTooltipPosition="above"
+                      [matTooltipClass]="'full-size-tooltip'"
+                      [ngClass]="{'not-allow': !this.bucketStatus['view'] || !this.data.buckets.length}"
+                      (click)="bucketBrowser(notebook.cloud_provider !== 'azure' ? notebook.bucket_name : notebook.account_name + '.' + notebook.bucket_name, notebook.endpoint, this.bucketStatus['view'] && this.data.buckets.length)"
+                >
+                  Open bucket browser
+                </span>
+            </div>
+<!--            <p>Shared endpoint bucket: &nbsp;</p>-->
+<!--            <div class="links_block" (click)="bucketBrowser(notebook.shared_bucket_name, notebook.endpoint, this.bucketStatus['view'])"-->
+<!--                 [matTooltip]="'You have not permission to open bucket'"-->
+<!--                 matTooltipDisabled="{{this.bucketStatus['view']}}"-->
+<!--                 matTooltipPosition="above"-->
+<!--                 [matTooltipClass]="'full-size-tooltip'"-->
+<!--            >-->
+<!--              <p *ngIf="DICTIONARY[PROVIDER === 'azure' && notebook.shared_account_name">{{ DICTIONARY[PROVIDER].account }}-->
+<!--                <span class="bucket-info bucket-link" [ngClass]="{'not-allow': !this.bucketStatus['view']}" (mouseover)="showCopyIcon('shared')">{{ notebook.shared_account_name}}</span>-->
+<!--                <span *ngIf="isCopyIconVissible.shared" class="link-icon" (click)="copyBucketName(notebook.shared_account_name)">-->
+<!--                  <span _ngcontent-xpv-c19="" class="material-icons" matTooltip="Copy bucket name" matTooltipPosition="above">content_copy</span>-->
+<!--                </span>-->
+<!--              </p>-->
+<!--              <p *ngIf="notebook.shared_bucket_name">{{ DICTIONARY[PROVIDER].container }}-->
+<!--                <span-->
+<!--                  class="bucket-info bucket-link"-->
+<!--                  [ngClass]="{'not-allow': !this.bucketStatus['view']}"-->
+<!--                  (mouseover)="showCopyIcon('shared')"-->
+<!--                  (click)="bucketBrowser(notebook.shared_bucket_name, notebook.endpoint, this.bucketStatus['view'])"-->
+<!--                >-->
+<!--                  {{ notebook.shared_bucket_name }}-->
+<!--                </span>-->
+<!--                <span *ngIf="isCopyIconVissible.shared" class="link-icon" (click)="copyBucketName(notebook.shared_bucket_name)">-->
+<!--                  <span _ngcontent-xpv-c19="" class="material-icons" matTooltip="Copy bucket name" matTooltipPosition="above">content_copy</span>-->
+<!--                </span>-->
+<!--              </p>-->
+<!--            </div>-->
+<!--            <br />-->
 
-            <!-- <p>
-              <a href="#/help/accessnotebookguide" target="_blank">
-                <small class="helper_instruction">
-                  <i class="material-icons">help_outline</i>
-                  Read instruction how to create the tunnel</small>
-              </a>
-            </p> -->
+<!--            <div *ngIf="DICTIONARY[PROVIDER === 'azure' && notebook.datalake_name">-->
+<!--              <p>Data Lake Store: &nbsp;</p>-->
+<!--              <div class="links_block">-->
+<!--                <p>Data Lake Store Account: &nbsp;<span class="bucket-info">{{ notebook.datalake_name }}</span></p>-->
+<!--                <p>Personal folder: &nbsp;<span class="bucket-info">{{ notebook.datalake_directory }}</span></p>-->
+<!--                <p>Collaboration folder: &nbsp;<span class="bucket-info">{{ notebook.datalake_shared_directory }}</span>-->
+<!--                </p>-->
+<!--              </div>-->
+<!--            </div>-->
+
+              <!-- <p>
+                <a href="#/help/accessnotebookguide" target="_blank">
+                  <small class="helper_instruction">
+                    <i class="material-icons">help_outline</i>
+                    Read instruction how to create the tunnel</small>
+                </a>
+              </p> -->
           </div>
 
-          <div class="checkbox-group" *ngIf="notebook.image !== 'docker.dlab-zeppelin'; else not_support"
-            [hidden]="notebook.status !== 'running' || notebook.image === 'docker.dlab-superset' || notebook.image === 'docker.dlab-jupyterlab'">
-            <label>
-              <input #configurationNode type="checkbox" (change)="selectConfiguration()" /> Cluster configurations
-            </label>
-            <div class="checkbox-group">
-              <form [formGroup]="configurationForm" novalidate>
-                <div class="config-details" *ngIf="configuration?.nativeElement['checked'] || false">
+            <div class="checkbox-group" *ngIf="notebook.image !== 'docker.datalab-zeppelin'; else not_support"
+                 [hidden]="notebook.status !== 'running' || notebook.image === 'docker.datalab-superset' || notebook.image === 'docker.datalab-jupyterlab'">
+                <label>
+                    <input #configurationNode type="checkbox" (change)="selectConfiguration()"/> Cluster configurations
+                </label>
+                <div class="checkbox-group">
+                    <form [formGroup]="configurationForm" novalidate>
+                        <div class="config-details" *ngIf="configuration?.nativeElement['checked'] || false">
                   <textarea formControlName="configuration_parameters" id="config"
-                    placeholder="Cluster configuration template, JSON" data-gramm_editor="false"></textarea>
-                  <span class="danger_color"
-                    *ngIf="!configurationForm.controls.configuration_parameters.valid && configurationForm.controls['configuration_parameters'].dirty">Configuration
+                            placeholder="Cluster configuration template, JSON" data-gramm_editor="false"></textarea>
+                            <span class="danger_color"
+                                  *ngIf="!configurationForm.controls.configuration_parameters.valid && configurationForm.controls['configuration_parameters'].dirty">Configuration
                     parameters is not in a valid format</span>
                 </div>
               </form>
@@ -115,9 +256,9 @@
           </div>
           <ng-template #not_support>
             <small [hidden]="notebook.status !== 'running'">Spark default configuration for Apache Zeppelin can not be
-              changed from DLab UI. Currently it can be done directly through Apache Zeppelin interpreter menu.
-              For more details please refer for Apache Zeppelin <a
-                href="https://zeppelin.apache.org/docs/0.8.0/usage/interpreter/overview.html" target="_blank">official
+                changed from DataLab UI. Currently it can be done directly through Apache Zeppelin interpreter menu.
+                For more details please refer for Apache Zeppelin <a
+                href="https://zeppelin.apache.org/docs/0.9.0/usage/interpreter/overview.html" target="_blank">official
                 documentation</a>.
             </small>
           </ng-template>
@@ -131,5 +272,26 @@
         </div>
       </div>
     </div>
+
+    <div class="legion-info" *ngIf="data.odahu">
+      <div class="content-box">
+        <div class="detail-info" *ngIf="!odahu.error_message">
+        <div  class="links_block">
+          <div *ngFor="let url of odahu.url" class="odahu-links">
+            <div class="odahu-link">
+              <span class="description">{{url.description }}: &nbsp;</span>
+              <a class="ellipsis" matTooltip="{{ url.url}}" matTooltipPosition="above" href="{{ url.url}}"
+                 target="_blank">{{ url.url}}
+              </a>
+            </div>
+            <div class="grafana" *ngIf="url.description === 'Grafana'">
+              <div><span>Gafana user:&nbsp;</span><span class="creds">{{odahu.bucket_name}}</span></div>
+              <div><span>Gafana password:&nbsp;</span><span class="creds">{{odahu.shared_bucket_name}}</span></div>
+            </div>
+          </div>
+        </div>
+    </div>
+      </div>
+    </div>
   </div>
 </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.scss
index 2849ce0..edb7aac 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.scss
@@ -27,8 +27,31 @@
 
 .links_block {
 
-  >p {
-    display: flex;
+  .odahu-links:not(:last-child){
+    margin-bottom: 20px;
+  }
+
+  .grafana{
+    white-space: nowrap;
+    padding-left: 30px;
+    color: $blue-grey-color;
+
+    div{
+      display: flex;
+
+      span{
+        font-size: 13px;
+        font-weight: 500;
+
+        &.creds{
+          font-weight: 600;
+        }
+      }
+    }
+  }
+
+  >p, .odahu-link {
+     display: flex;
 
     .description {
       white-space: nowrap;
@@ -73,7 +96,6 @@
   }
 
   span {
-
     .danger_color {
       position: absolute;
       bottom: -16px;
@@ -84,6 +106,40 @@
 
 .bucket-info {
   padding-left: 7px;
+  margin-right: 10px;
   font-weight: 600;
   color: $blue-grey-color;
 }
+
+.bucket-link{
+  padding: 15px;
+  padding-left: 0;
+  color: #35afd5;
+  .open-bucket{
+    cursor: pointer;
+    font-size: 14px;
+  }
+  &.not-allow{
+    cursor: not-allowed;
+    color: $blue-grey-color !important;
+  }
+}
+
+.copy-icon-wrapper{
+  width: 20px;
+  margin-left: 5px;
+  margin-right: 5px;
+}
+
+.bucket-info-wrapper{
+  width: 100%;
+  .bucket-info{
+    max-width: 90%;
+  }
+}
+
+.resources-url{
+  max-width: 70%;
+}
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
index db097f3..ad41322 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
@@ -20,12 +20,15 @@
 import { Component, ViewChild, OnInit, Inject } from '@angular/core';
 import { FormGroup, FormBuilder } from '@angular/forms';
 import { ToastrService } from 'ngx-toastr';
-import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import {MatDialogRef, MAT_DIALOG_DATA, MatDialog} from '@angular/material/dialog';
 
-import { DateUtils, CheckUtils } from '../../../core/util';
+import {DateUtils, CheckUtils, HelpUtils} from '../../../core/util';
 import { DICTIONARY } from '../../../../dictionary/global.dictionary';
 import { DataengineConfigurationService } from '../../../core/services';
 import { CLUSTER_CONFIGURATION } from '../../computational/computational-resource-create-dialog/cluster-configuration-templates';
+import {CopyPathUtils} from '../../../core/util/copyPathUtils';
+import {AuditService} from '../../../core/services/audit.service';
+import {BucketBrowserComponent} from '../../bucket-browser/bucket-browser.component';
 
 @Component({
   selector: 'detail-dialog',
@@ -35,37 +38,53 @@
 
 export class DetailDialogComponent implements OnInit {
   readonly DICTIONARY = DICTIONARY;
-  readonly PROVIDER = this.data.cloud_provider;
+  readonly PROVIDER = this.data.pro?.cloud_provider?.toLowerCase() || this.data.odahu?.cloud_provider?.toLowerCase();
+  public isCopied: boolean = true;
   notebook: any;
   upTimeInHours: number;
-  upTimeSince: string = '';
   tooltip: boolean = false;
   config: Array<{}> = [];
-
+  bucketStatus: object = {};
+  isBucketAllowed = true;
+  isCopyIconVissible: {bucket} = {bucket: false};
+  public odahu: any;
   public configurationForm: FormGroup;
+  @ViewChild('configurationNode') configuration;
 
-  @ViewChild('configurationNode', { static: false }) configuration;
 
   constructor(
     @Inject(MAT_DIALOG_DATA) public data: any,
     private dataengineConfigurationService: DataengineConfigurationService,
     private _fb: FormBuilder,
     public dialogRef: MatDialogRef<DetailDialogComponent>,
-    public toastr: ToastrService
+    private dialog: MatDialog,
+    public toastr: ToastrService,
+    public auditService: AuditService
   ) {
-    this.notebook = data;
+    if (data.notebook) {
+      this.notebook = data.notebook;
+      this.PROVIDER = this.data.notebook.cloud_provider;
+    }
+
+    if (data.odahu) {
+      this.odahu = data.odahu;
+      this.PROVIDER = this.data.odahu.cloud_provider || 'azure';
+    }
   }
 
   ngOnInit() {
-    this.notebook;
-
+    this.bucketStatus = this.data.bucketStatus;
+    this.notebook = this.data.notebook;
     if (this.notebook) {
       this.tooltip = false;
-
       this.upTimeInHours = (this.notebook.time) ? DateUtils.diffBetweenDatesInHours(this.notebook.time) : 0;
-      this.upTimeSince = (this.notebook.time) ? new Date(this.notebook.time).toString() : '';
       this.initFormModel();
       this.getClusterConfiguration();
+    if (this.notebook.edgeNodeStatus === 'terminated' ||
+      this.notebook.edgeNodeStatus === 'terminating' ||
+      this.notebook.edgeNodeStatus === 'failed') {
+      this.isBucketAllowed = false;
+    }
     }
   }
 
@@ -96,7 +115,7 @@
   public editClusterConfiguration(data): void {
     this.dataengineConfigurationService
       .editExploratorySparkConfiguration(data.configuration_parameters, this.notebook.project, this.notebook.name)
-      .subscribe(result => {
+      .subscribe(() => {
         this.dialogRef.close();
       },
         error => this.toastr.error(error.message || 'Edit onfiguration failed!', 'Oops!'));
@@ -120,4 +139,39 @@
         ? (control.value && control.value !== null && CheckUtils.isJSON(control.value) ? null : { valid: false })
         : null;
   }
+
+  public bucketBrowser(bucketName, endpoint, permition): void {
+    if (!permition) {
+      return;
+    }
+    bucketName = this.isBucketAllowed ? bucketName : this.data.buckets[0].children[0].name;
+    // bucketName = 'ofuks-1304-pr2-local-bucket';
+    this.dialog.open(BucketBrowserComponent, { data:
+        {bucket: bucketName, endpoint: endpoint, bucketStatus: this.bucketStatus, buckets: this.data.buckets},
+      panelClass: 'modal-fullscreen' })
+    .afterClosed().subscribe();
+  }
+
+  public showCopyIcon(element) {
+    this.isCopyIconVissible[element] = true;
+  }
+  public hideCopyIcon() {
+    for (const key in this.isCopyIconVissible) {
+      this.isCopyIconVissible[key] = false;
+    }
+    this.isCopied = true;
+  }
+
+  public copyLink(copyValue, isBucket?) {
+    const protocol = isBucket ? HelpUtils.getBucketProtocol(this.PROVIDER) : '';
+    CopyPathUtils.copyPath(protocol + copyValue);
+  }
+
+  public logAction(name: any, description: string, copy?: string) {
+    if (copy) {
+      this.auditService.sendDataToAudit({resource_name: name, info: `Copy ${description} link`, type: 'NOTEBOOK'}).subscribe();
+    } else {
+      this.auditService.sendDataToAudit({resource_name: name, info: `Follow ${description} link`, type: 'NOTEBOOK'}).subscribe();
+    }
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/index.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/index.ts
index f46a7e5..24ec7c5 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/index.ts
@@ -23,17 +23,19 @@
 import { MaterialModule } from '../../../shared/material.module';
 import { DetailDialogComponent } from './detail-dialog.component';
 import { DirectivesModule } from '../../../core/directives';
+import {LongDatePipeModule} from '../../../core/pipes/long-date-pipe';
 
 export * from './detail-dialog.component';
 
 @NgModule({
-  imports: [
-    CommonModule,
-    FormsModule,
-    ReactiveFormsModule,
-    MaterialModule,
-    DirectivesModule
-  ],
+    imports: [
+        CommonModule,
+        FormsModule,
+        ReactiveFormsModule,
+        MaterialModule,
+        DirectivesModule,
+        LongDatePipeModule
+    ],
   declarations: [DetailDialogComponent],
   entryComponents: [DetailDialogComponent],
   exports: [DetailDialogComponent]
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/filter-libs.model.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/filter-libs.model.ts
index 4d211cc..e55a5ed 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/filter-libs.model.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/filter-libs.model.ts
@@ -22,7 +22,7 @@
     public name: string,
     public group: Array<any>,
     public resource: Array<any>,
-    public resourceType: Array<any>,
+    public resource_type: Array<any>,
     public status: Array<any>,
   ) { }
 
@@ -30,7 +30,7 @@
     this.name = '';
     this.group = [];
     this.resource = [];
-    this.resourceType = [];
+    this.resource_type = [];
     this.status = [];
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/index.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/index.ts
index 526aab4..ae9969a 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/index.ts
@@ -26,7 +26,7 @@
 import { FormControlsModule } from '../../../shared/form-controls';
 
 import { KeysPipeModule, LibSortPipeModule, HighLightPipeModule } from '../../../core/pipes';
-import { InstallLibrariesComponent, ErrorMessageDialogComponent } from './install-libraries.component';
+import {InstallLibrariesComponent, ErrorLibMessageDialogComponent, LibInfoDialogComponent} from './install-libraries.component';
 export * from './install-libraries.component';
 
 @NgModule({
@@ -41,8 +41,8 @@
     MaterialModule,
     BubbleModule
   ],
-  declarations: [InstallLibrariesComponent, ErrorMessageDialogComponent],
-  entryComponents: [InstallLibrariesComponent, ErrorMessageDialogComponent],
+  declarations: [InstallLibrariesComponent, ErrorLibMessageDialogComponent, LibInfoDialogComponent],
+  entryComponents: [InstallLibrariesComponent, ErrorLibMessageDialogComponent, LibInfoDialogComponent],
   exports: [InstallLibrariesComponent]
 })
 export class InstallLibrariesModule {}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.html
index 968f1a3..9954a91 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.html
@@ -17,83 +17,184 @@
   ~ under the License.
   -->
 
-<div class="install-libraries" id="dialog-box">
+<div class="install-libraries" id="dialog-box" [ngStyle]="notebook?.status !== 'running' && {'padding-bottom': '20px'}">
   <header class="dialog-header">
     <h4 class="modal-title">Manage <span>{{ notebook?.name }}</span> Libraries</h4>
     <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
   </header>
+  <mat-progress-bar *ngIf="autoComplete === 'UPDATING'" mode="indeterminate"></mat-progress-bar>
   <div class="dialog-content">
    <div class="aligner">
     <div class="info" *ngIf="notebook?.status !== 'running'">
       <p class=" message">Cannot install libraries: Exploratory
         <strong>{{ notebook?.name }}</strong> is not running</p>
     </div>
-    <div class="loading-block" *ngIf="!libs_uploaded && uploading && data.status === 'running'">
-      <div class="uploading">
-        <p>Please wait until DLab loads full list of available libraries for you...</p>
-        <img src="assets/img/gif-spinner.gif" alt="loading">
+    <div *ngIf="notebook?.status === 'running'" class="top-wrapper">
+      <div class="loading-block" *ngIf="!libs_uploaded && uploading && data.status === 'running'">
+        <div class="uploading">
+          <p>Please wait until DataLab loads list of available groups for your resource...</p>
+          <img src="assets/img/gif-spinner.gif" alt="loading">
+        </div>
       </div>
-    </div>
-    <div *ngIf="notebook?.status === 'running' && !uploading" class="lib-view-wrap">
+      <div *ngIf="notebook?.status === 'running' && !uploading" class="lib-view-wrap">
       <div class="search-box">
         <div class="search-form">
           <div>
             <div class="control-group constol-select">
               <label class="label">Select resource</label>
               <div class="control">
-                <dropdown-list #resourceSelect (selectedItem)="onUpdate($event)"></dropdown-list>
+                <dropdown-list #resourceSelect (selectedItem)="onUpdate($event)" (emitClick)="emitClick()"></dropdown-list>
               </div>
             </div>
             <div class="control-group control-select">
               <label class="label">Select group</label>
               <div class="control">
-                <dropdown-list #groupSelect (selectedItem)="onUpdate($event)"></dropdown-list>
-                <span class="error-message" *ngIf="!group && libSearch.value">Group field is required. Please choose appropriate group.</span>
+                <dropdown-list #groupSelect (selectedItem)="onUpdate($event)" (emitClick)="emitClick()"></dropdown-list>
+                <span class="error-message" *ngIf="!group && libSearch?.value">Group field is required. Please choose appropriate group.</span>
               </div>
             </div>
           </div>
-          <div class="search">
-            <mat-form-field class="chip-list">
-              <input
-                type="text"
-                [placeholder]="group === 'java' ? 'Enter library name in <groupId>:<artifactId>:<versionId> format' : 'Enter library name'"
-                matInput
-                [formControl]="libSearch"
-                [value]="query"
-                [matAutocomplete]="auto"
-              >
-              <mat-icon matSuffix>search</mat-icon>
-              <mat-autocomplete #auto="matAutocomplete" class="suggestions">
+          <div class="m-top-20" *ngIf="group !== 'java'; else javaGroup">
+            <div class="control-group constol-select">
+              <label class="label">Library name</label>
+              <div class="control control-relative">
+                <span class="other-message" *ngIf="group === 'others'">
+                  Other group can include libs from Python 2 and Python 3 groups.
+                  Some libs cannot be installed due to Python 2 is no longer supported
+                </span>
+                <input
+                  type="text" [placeholder]="'Enter library name'"
+                  [disabled]="!group"
+                  [matAutocomplete]="auto"
+                  [formControl]="libSearch"
+                  #trigger="matAutocompleteTrigger"
+                  (keydown.enter)="addLibrary(lib)"
+                  (keyup)="clearLibSelection($event)"
+                  class="library-input"
+                >
+              </div>
+              <mat-autocomplete #auto="matAutocomplete" class="suggestions scrolling">
                 <ng-template ngFor let-item [ngForOf]="filteredList" let-i="index">
-                  <mat-option [ngClass]="{ 'not-allowed': isDuplicated(item) }">
-                    <div class="option" (click)="selectLibrary(item)">
-                      <a *ngIf="!isDuplicated(item)">
-                        <span [innerHTML]="item.name | highlight:query"></span>
-                        <span *ngIf="item.version && item.version !== 'N/A'">{{ item.version }}</span>
+                  <mat-option>
+                    <div class="option" (click)="selectLibrary(item);$event.stopPropagation()" [ngClass]="{'not-allow': item.isInSelectedList}">
+                      <a *ngIf="!item.isInSelectedList">
+                        <span [innerHTML]="item.name | highlight:lib.name"></span>
                       </a>
-                      <span *ngIf="isInSelectedList || isInstalled">{{ item.name }}
-                        <span *ngIf="item.version && item.version !== 'N/A'">{{ item.version }}</span>
-                      </span>
-
-                      <strong *ngIf="isInSelectedList">selected
+                      <span *ngIf="item.isInSelectedList">{{ item.name }}</span>
+                      <strong *ngIf="item.isInSelectedList">selected
                         <i class="material-icons">done</i>
                       </strong>
-                      <strong *ngIf="isInstalled">installed
+                      <strong *ngIf="item.isInstalled && !item.isInSelectedList">installed
                         <i class="material-icons">done</i>
                       </strong>
                     </div>
                   </mat-option>
                 </ng-template>
-                <mat-option *ngIf="model.isEmpty(filteredList) && !validity_format">
+                <mat-option *ngIf="!filteredList?.length && !validity_format && autoComplete === 'ENABLED' && lib.name?.length > 0" disabled>
                   <span class="configuring">No matches found</span>
                 </mat-option>
-                <mat-option *ngIf="validity_format?.length > 0">
-                  <span class="configuring">{{ validity_format }}</span>
+                <mat-option *ngIf="validity_format?.length > 0 && autoComplete === 'ENABLED'">
+                  <span class="configuring" >{{ validity_format }}</span >
+                </mat-option>
+                <mat-option *ngIf="autoComplete === 'NONE' && lib.name?.length > 1" disabled>
+                  <span class="configuring" >Autocomplete is currently unavailable for {{groupsListMap[group]}} group</span >
+                </mat-option>
+                <mat-option *ngIf="autoComplete === 'UPDATING' && lib.name?.length > 1" disabled>
+                  <span class="configuring" >Library list is being loaded at the moment. Please wait...</span>
                 </mat-option>
               </mat-autocomplete>
-            </mat-form-field>
-            <div class="list-selected list-container" id='scrolling'>
-              <mat-chip-list *ngIf="model.selectedLibs.length && libs_uploaded">
+            </div>
+            <div class="control-group control-select">
+              <label class="label">Library version</label>
+              <div class="control control-relative">
+                <input
+                  type="text"
+                  class="library-input"
+                  [placeholder]="'Enter library version (optional)'"
+                  [(ngModel)]="lib.version"
+                  [disabled]="!lib.name?.trim() || lib.name?.trim().length < 2"
+                  (keyup)="validateVersion(lib.version)"
+                  (keydown.enter)="addLibrary(lib)"
+                >
+                <span
+                  class="error-message version-error"
+                  *ngIf="isVersionInvalid">
+                    Library version can only contain Latin letters, numbers and special characters -, _, :, /, ~, ., +.
+                </span>
+                <span class="plus-icon"
+                      [ngClass]="{'not-allow': lib.name?.trim().length < 2
+                      || (autoComplete === 'ENABLED' && !isLibSelected && filteredList?.length)
+                      || this.selectedLib?.isInSelectedList || isVersionInvalid || autoComplete === 'UPDATING'}"
+                      [matTooltip]="this.selectedLib?.isInSelectedList ? 'Library is in selected list' : 'Please select library from autocomplete'"
+                      matTooltipPosition="above" [matTooltipDisabled]="(!this.selectedLib?.isInSelectedList && isLibSelected) || lib.name?.length < 2 || !this.selectedLib?.isInSelectedList && autoComplete === 'NONE'"
+                >
+                  <mat-icon
+                    (click)="addLibrary(lib)"
+                    [ngClass]="{'not-allowed': lib.name?.trim().length < 2 || (autoComplete === 'ENABLED' && !isLibSelected && filteredList?.length)
+                    || this.selectedLib?.isInSelectedList || isVersionInvalid || autoComplete === 'UPDATING'}">add</mat-icon>
+                </span>
+              </div>
+            </div>
+          </div>
+
+          <ng-template #javaGroup>
+            <div class="m-top-20">
+              <div class="control-group constol-select java-library-search">
+                <label class="label">Library</label>
+                <div class="control control-relative">
+                 <input
+                    type="text" [placeholder]="'Enter library name in <groupId>:<artifactId>:<versionId> format'"
+                    class="library-input"
+                    [disabled]="!group"
+                    [matAutocomplete]="auto"
+                    [formControl]="libSearch"
+                    #trigger="matAutocompleteTrigger"
+                    (keydown.enter)="addLibrary(lib)"
+                    (keyup)="clearLibSelection($event)"
+                  >
+                  <span
+                    class="plus-icon"
+                    [ngClass]="{'not-allow': !this.selectedLib || this.selectedLib?.isInSelectedList || !isLibSelected}"
+                    matTooltip="Library is in selected list" matTooltipPosition="above" [matTooltipDisabled]="!this.selectedLib?.isInSelectedList || !isLibSelected"
+                  >
+                  <mat-icon  (click)="addLibrary(lib)" (keyup.enter)="addLibrary(lib)" [ngClass]="{'not-allowed': !this.selectedLib || this.selectedLib?.isInSelectedList || !isLibSelected}">add</mat-icon>
+                </span>
+                </div>
+                <mat-autocomplete #auto="matAutocomplete" class="suggestions">
+                  <ng-template ngFor let-item [ngForOf]="filteredList" let-i="index">
+                    <mat-option >
+                      <div class="option" (click)="selectLibrary(item);$event.stopPropagation()" [ngClass]="{'not-allow': item.isInSelectedList}">
+                        <a *ngIf="!item.isInSelectedList">
+                          <span [innerHTML]="item.name + ':' + item.version | highlight:item.name">
+                             <span>{{ item.version }}</span>
+                          </span>
+                        </a>
+                        <span *ngIf="item.isInSelectedList">{{ item.name }}
+                          <span *ngIf="item.version && item.version !== 'N/A'">{{ item.version }}</span>
+                      </span>
+                        <strong *ngIf="item.isInSelectedList">selected
+                          <i class="material-icons">done</i>
+                        </strong>
+                        <strong *ngIf="item.isInstalled && !item.isInSelectedList">installed
+                          <i class="material-icons">done</i>
+                        </strong>
+                      </div>
+                    </mat-option>
+                  </ng-template>
+                  <mat-option *ngIf="model.isEmpty(filteredList) && !validity_format">
+                    <span class="configuring">No matches found</span>
+                  </mat-option>
+                  <mat-option *ngIf="validity_format?.length > 0">
+                    <span class="configuring" >{{ validity_format }}</span >
+                  </mat-option>
+                </mat-autocomplete>
+              </div>
+            </div>
+          </ng-template>
+
+          <div class="search">
+            <div class="list-selected list-container scrolling">
+              <mat-chip-list *ngIf="model.selectedLibs.length && libs_uploaded" [disabled]="true">
                 <mat-chip *ngFor="let item of model.selectedLibs">
                   {{ item.name }}
                   <span *ngIf="item.version && item.version !== 'N/A'">&nbsp;{{ item.version }}</span>
@@ -106,8 +207,10 @@
         </div>
       </div>
     </div>
+    </div>
+
     <div class="libs-info">
-      <mat-list>
+      <mat-list class="scrolling" [ngStyle]="notebook?.status !== 'running' && {'max-height': '60vh', 'height': 'unset'}">
         <mat-list-item class="list-header">
           <div class="lib-name">Name
             <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
@@ -146,11 +249,17 @@
         </mat-list-item>
 
         <ng-container *ngIf="filtered" >
-         <mat-list-item class="lib-col filter-row">
-          <th class="lib-name lib-input">
-            <input placeholder="Filter by library name" [value]="filterModel.name" (input)="filterModel.name = $event.target['value']" type="text" class="form-control filter-field "/>
+         <mat-list-item class="filter-row">
+          <th class="lib-name filter-col">
+            <input
+              placeholder="Filter by library name"
+              [value]="filterModel.name"
+              (input)="onFilterNameUpdate($event.target['value'])"
+              type="text"
+              class="form-control filter-field"
+            />
           </th>
-          <th class="lib-group lib-col">
+          <th class="lib-group filter-col">
               <multi-select-dropdown
                 (selectionChange)="onFilterUpdate($event)"
                 [items]="this.filterConfiguration.group"
@@ -159,7 +268,7 @@
               >
               </multi-select-dropdown>
             </th>
-            <th class="lib-destination lib-col">
+            <th class="lib-destination filter-col">
               <multi-select-dropdown
                 (selectionChange)="onFilterUpdate($event)"
                 [items]="this.filterConfiguration.resource"
@@ -168,32 +277,33 @@
               >
               </multi-select-dropdown>
             </th>
-            <th class="lib-resource-type lib-col">
+            <th class="lib-resource-type filter-col">
               <multi-select-dropdown
                 (selectionChange)="onFilterUpdate($event)"
-                [items]="this.filterConfiguration.resourceType"
-                [type]="'resource type'"
-                [model]="this.filterModel.resourceType"
+                [items]="this.filterConfiguration.resource_type"
+                [type]="'resource_type'"
+                [model]="this.filterModel.resource_type"
               >
               </multi-select-dropdown>
           </th>
-          <th class="lib-status lib-col">
+          <th class="lib-status filter-col">
             <multi-select-dropdown
               (selectionChange)="onFilterUpdate($event)"
               [items]="this.filterConfiguration.status"
               [type]="'status'"
-              [model]="this.filterModel.status">
+              [model]="this.filterModel.status"
+            >
             </multi-select-dropdown>
           </th>
            <ng-container matColumnDef="action-filter" stickyEnd>
-             <th mat-header-cell>
-               <div class="filter-actions">
-                 <button mat-icon-button class="btn reset" (click)="resetFilterConfigurations()">
+             <th>
+               <div class="filter-actions actions">
+                 <button mat-icon-button class="btn reset" (click)="resetFilterConfigurations()" [disabled]="!isFilterSelected">
                    <i class="material-icons">close</i>
                  </button>
 
-                 <button mat-icon-button class="btn apply" (click)="filterLibs()">
-                   <i class="material-icons"  [ngClass]="{'not-allowed': filterModel.length === 0}">done</i>
+                 <button mat-icon-button class="btn apply" (click)="filterLibs(true)" [disabled]="isFilterChanged">
+                   <i class="material-icons"  [ngClass]="{'not-allowed': filterModel['length'] === 0}">done</i>
                  </button>
                </div>
              </th>
@@ -205,49 +315,76 @@
 <!--          <div *ngIf="notebook?.status !== 'running' && notebookFailedLibs.length > 0" class="info message">-->
 <!--            <p>Cannot retry to reinstall failed libraries: Exploratory {{ notebook?.name }} is not running</p>-->
 <!--          </div>-->
-          <mat-list-item  *ngFor="let lib of filtredNotebookLibs">
-            <div class="lib-name ellipsis">
-              <strong>{{ lib.name }}</strong>&nbsp;
-              <span *ngIf="lib.version  && lib.version !== 'N/A'">{{ lib.version }}</span>
+          <ng-container *ngFor="let lib of filtredNotebookLibs">
+            <mat-list-item class="table-item">
+            <div class="lib-name lib-name-col ellipsis" >
+              <span [matTooltip]="lib.name + ' ' + lib.version" matTooltipPosition="above" class="lib-name-wrapper ellipsis">
+                <span class="stong" >{{ lib.name }}</span>&nbsp;
+                <span *ngIf="lib.version  && lib.version !== 'N/A'">{{ lib.version }}</span>
+              </span>
             </div>
             <div class="lib-group-col">{{ groupsListMap[lib.group] }}</div>
             <div class="st-group">
               <ng-template let-item ngFor [ngForOf]="lib.filteredStatus">
                 <div class="wrap-col">
                   <div class="lib-destination-col">{{ item.resource }}</div>
-                  <div class="lib-resource-type-col">{{ item.resourceType }}</div>
-                  <div class="lib-status-col" ngClass="{{ item.status.toLowerCase() || '' }}">{{ item.status }}
-                    <div class="warn-action" *ngIf="item.status === 'failed' && notebook?.status === 'running'">
-                      <div>
-                        <span *ngIf="!installingInProgress" (click)="reinstallLibrary(item, lib)" matTooltip="Retry installation" matTooltipPosition="above">
+                  <div class="lib-resource-type-col uppercase">{{ item.resourceType }}</div>
+                  <div class="lib-status-col uppercase" ngClass="{{ item.status.toLowerCase() || 'installation_error' }}">{{ item.status.replace('_', ' ') }}
+                    <div class="warn-action" *ngIf="(item.status === 'installation_error' || item.status.toLowerCase() === 'invalid_version' || item.add_pkgs?.length) && notebook?.status === 'running'">
+                      <div *ngIf="!item.available_versions">
+                        <span *ngIf="!installingInProgress && item.status === 'installation_error'" (click)="reinstallLibrary(item, lib)" matTooltip="Retry installation" matTooltipPosition="above">
                           <i class="material-icons">replay</i>
                         </span>
-                        <span class="not-allowed" *ngIf="installingInProgress" matTooltip="You can't reinstall library until previous process will be completed"
+                        <span class="not-allow" *ngIf="installingInProgress && item.status === 'installation_error'" matTooltip="Please wait until lib installation completes"
                           matTooltipPosition="above">
-                          <i class="material-icons">replay</i>
+                          <i class="material-icons not-allowed">replay</i>
                         </span>
                       </div>
-                      <div *ngIf="item.status === 'failed' && item.error" class="lib-error" (click)="showErrorMessage(item)">
+                      <div *ngIf="item.status === 'installation_error' && item.error" class="lib-error" (click)="showErrorMessage(item)" matTooltip="Show error message" matTooltipPosition="above">
+                        <i class="material-icons terminated">error_outline</i>
+                      </div>
+                      <div class="lib-error"
+                           *ngIf="item.status.toLowerCase() === 'invalid_version' && item.available_versions?.length"
+                           (click)="openLibInfo(item, 'available');$event.stopPropagation()"
+                           matTooltip="Show available version" matTooltipPosition="above"
+                      >
                         <i class="material-icons">error_outline</i>
                       </div>
+                      <div matTooltip="Show installed dependency" matTooltipPosition="above" *ngIf="item.add_pkgs?.length">
+                        <span class="info-icon" (click)="openLibInfo(item, 'added');$event.stopPropagation() ">
+                          <i class="material-icons">info</i>
+                        </span>
+                      </div>
                     </div>
+
                   </div>
                 </div>
+
               </ng-template>
             </div>
           </mat-list-item>
-          <div *ngIf="!filtredNotebookLibs.length && notebookLibs?.length" class="scrollingList info message">
-            <p>No matches found</p>
-          </div>
+          </ng-container>
+
         </div>
         <div *ngIf="!notebookLibs?.length" class="scrollingList info message">
           <p>You have no libraries installed</p>
         </div>
+        <div *ngIf="!filtredNotebookLibs.length && notebookLibs?.length" class="scrollingList info message">
+          <p>No matches found</p>
+        </div>
       </mat-list>
     </div>
     <div class="m-top-15 actions" *ngIf="!uploading && notebook?.status === 'running'">
-      <button mat-raised-button type="button" class="butt action" (click)="dialogRef.close()">Close</button>
-      <button mat-raised-button type="submit" class="butt butt-success action" (click)="model.confirmAction()" [disabled]="!model.selectedLibs.length || installingInProgress || !destination">Install</button>
+      <button mat-raised-button type="button" class="butt action close-btn" (click)="dialogRef.close()">Close</button>
+      <span matTooltip="Please wait until lib installation completes" [matTooltipDisabled]="!installingInProgress" matTooltipPosition="above">
+        <button mat-raised-button type="submit"
+                class="butt butt-success action install-btn"
+                (click)="model.confirmAction()"
+                [disabled]="!model.selectedLibs.length || installingInProgress || !destination"
+        >
+          Install
+        </button>
+      </span>
     </div>
    </div>
   </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.scss
index a6b7070..1333fd5 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.scss
@@ -17,6 +17,8 @@
  * under the License.
  */
 
+@import '_variables.scss';
+
 .aligner {
   height: 100%;
   display: flex;
@@ -28,7 +30,7 @@
       flex: initial;
       justify-content: center;
       flex-direction: initial;
-      margin-bottom: 25px;
+      margin-bottom: 10px;
       bottom: 30px;
       left: 0;
       right: 0;
@@ -40,73 +42,33 @@
   }
 }
 
-.loading-block {
-  height: 40%;
-  display: flex;
-  justify-content: center;
-
-  .uploading {
-    flex-direction: column;
-    align-items: center;
-    align-self: center;
-    list-style: none;
-    display: flex;
-
-    p {
-      font-size: 16px;
-      ;
-    }
-  }
-}
-
 .info {
   height: 30%;
 }
 
-.install-libraries {
-  height: 100%;
-  padding-bottom: 130px;
+.top-wrapper{
+  height: 285px;
+}
 
-  .dialog-header {
-    padding-left: 25px;
-  }
+.list-item{
+  display: flex;
+  width: 100%;
+  padding-left: 20px;
+}
 
-  .dialog-content {
-    height: calc(100% - 50px);
-  }
+.object {
+  width: 70%;
+  display: flex;
+  align-items: center;
+  padding-right: 10px;
+}
 
-  .info {
-    height: 40%;
-    display: flex;
-    flex-direction: row;
-    align-items: center;
-    justify-content: center;
-  }
+.size {
+  width: 30%;
+}
 
-  .mat-list-item {
-    height: auto !important;
-
-    .mat-list-item-content {
-      height: auto !important;
-      min-height: 54px !important;
-      border-bottom: 1px solid #edf1f5;
-      padding-right: 10px;
-    }
-  }
-
-  .lib-view-wrap {
-    display: flex;
-    flex-direction: column;
-    height: 40%;
-  }
-
-  .error {
-    padding: 15px 20px;
-  }
-
-  .uploading {
-    margin: 0 auto;
-  }
+ul.resources{
+  padding-left: 10px;
 }
 
 .search-box {
@@ -125,6 +87,33 @@
 
     .control-group {
       width: 50%;
+      padding-bottom: 0;
+
+      &.java-library-search{
+        width: 100%;
+
+        .label{
+          width: 10%;
+        }
+
+        .control{
+          width: 85%;
+        }
+      }
+
+      .control{
+        width: 70%;
+
+        input{
+          font-size: 15px;
+          padding-left: 15px;
+        }
+
+        .dropdown-list button {
+          font-size: 14px;
+          padding-top: 0;
+        }
+      }
 
       .label {
         width: 20%;
@@ -136,6 +125,7 @@
       padding-bottom: 0;
       flex-direction: column;
       box-shadow: 0 3px 1px -2px rgba(0, 0, 0, .2), 0 2px 2px 0 rgba(0, 0, 0, .14), 0 1px 5px 0 rgba(0, 0, 0, .12);
+      margin-top: 40px;
 
       .mat-form-field-flex {
         padding-left: 15px;
@@ -145,9 +135,13 @@
         width: 100%;
         overflow-y: auto;
 
-        .mat-form-field {
+
+        &.mat-form-field {
           width: 100%;
-          padding: 5px 20px;
+
+          .mat-form-field-infix{
+            display: flex;
+          }
         }
 
         .mat-input-flex {
@@ -213,32 +207,6 @@
   }
 }
 
-.list-selected {
-  padding: 0 5px;
-  font-family: 'Open Sans', sans-serif;
-  height: 130px;
-  overflow-y: auto;
-
-  h4 {
-    margin-bottom: 20px;
-    font-size: 14px;
-    text-align: center;
-    font-weight: 400;
-    color: #718ba6;
-  }
-
-  mat-chip-list .mat-chip-list-wrapper {
-    overflow-y: auto;
-    padding: 3px;
-  }
-}
-
-.mat-list-item {
-  color: #718ba6 !important;
-  font-size: 14px;
-  font-weight: 300;
-}
-
 mat-chip.mat-chip:not(.mat-basic-chip) {
   margin: 2px !important;
   background-color: rgba(47, 174, 215, .2) !important;
@@ -246,34 +214,37 @@
 }
 
 /* Tab info */
-.list-header{
-  line-height: 40px;
-}
-
-.list-header+div{
-  padding-left: 5px;
-}
 
 .mat-dialog-container {
   position: relative;
 }
 
 .libs-info {
-  padding: 0 20px;
-  display: flex;
-  flex: 1 1 auto;
-  min-height: 0px;
-  height: 50%;
-
   .mat-list {
     width: 100%;
-
+    overflow-y: auto;
+    position: relative;
+    height: 350px;
+    padding-top: 0;
+    margin-top: 8px;
+  
+    .list-header{
+      line-height: 40px;
+      position: sticky;
+      top: 0;
+      z-index: 99;
+      background-color: #fff;
+    }
+  
+    .filter-row{
+      position: sticky;
+      top: 56px;
+      z-index: 99;
+      background-color: #fff;
+    }
+  
+  
     .scrollingList {
-      max-height: 300px;
-      height: 80%;
-      overflow-y: auto;
-      overflow-x: hidden;
-
       .info {
         p {
           text-align: center;
@@ -282,117 +253,113 @@
       }
     }
   }
-  .lib-col{
-    padding-left: 4px;
+}
 
-  }
-  .lib-name {
-    width: 27%;
-    &.lib-input{
+.lib-name {
+  width: 27%;
+  padding-right: 10px;
+  padding-left: 20px;
 
-    }
-
-    strong {
-      font-weight: 400;
-    }
-  }
-
-  .lib-group,
-  .lib-destination {
-    width: 17%;
-    padding-left: 6px;
-  }
-
-  .lib-status {
-    width: 17%;
-    padding-left: 6px;
-  }
-
-  .lib-resource-type {
-    width: 17%;
-    padding-left: 6px;
-  }
-  .lib-group-col {
-    width: 17%;
-    padding-left: 8px;
-  }
-
-  .st-group {
+  &-col{
     display: flex;
-    flex-direction: column;
-    width: 51%;
+  }
 
-    .wrap-col {
-      display: flex;
-      padding: 5px 0px;
+  .lib-name-wrapper{
+    overflow: hidden;
+    display: block;
+  }
 
-      .lib-destination-col {
-        width: 33.3%;
-        padding-left: 8px;
-      }
+  strong {
+    font-weight: 400;
+  }
+}
 
-      .lib-resource-type-col {
-        width: 33.3%;
-        color: #36afd5;
-        padding-left: 8px;
-      }
+.lib-group,
+.lib-destination {
+  width: 17%;
+  padding-left: 15px;
+  padding-right: 10px;
+}
 
-      .lib-status-col {
-        position: relative;
-        width: 33.3%;
-        padding-left: 8px;
+.lib-status {
+  width: 17%;
+  padding-left: 15px;
+  padding-right: 10px;
+}
 
+.lib-resource-type {
+  width: 17%;
+  padding-left: 15px;
+  padding-right: 10px;
+}
 
-        .warn-action {
-          position: absolute;
-          top: 0;
-          right: -10px;
+.lib-group-col {
+  width: 17%;
+  padding-left: 17px;
+  padding-right: 10px;
+}
 
-          div {
-            display: inline-block;
-            cursor: pointer;
-            width: 25px;
-            pointer-events: auto;
+.st-group {
+  display: flex;
+  flex-direction: column;
+  width: 51%;
 
-            span {
-              display: block;
-            }
+  .wrap-col {
+    display: flex;
+    padding: 5px 0;
+
+    .lib-destination-col {
+      width: 33.3%;
+      padding-left: 15px;
+    }
+
+    .lib-resource-type-col {
+      width: 33.3%;
+      color: #36afd5;
+      padding-left: 15px;
+    }
+
+    .lib-status-col {
+      position: relative;
+      width: 33.3%;
+      padding-left: 15px;
+
+      .warn-action {
+        position: absolute;
+        top: -3px;
+        right: -50px;
+
+        div {
+          display: inline-block;
+          cursor: pointer;
+          width: 25px;
+          pointer-events: auto;
+
+          span {
+            display: block;
           }
+        }
 
-          .lib-error {
-            color: #35afd5;
-          }
+        .lib-error {
+          color: #35afd5;
         }
       }
     }
   }
 }
 
-.reinstall-all {
-  margin: 10px 5px;
-  position: fixed;
-  right: 0;
-  bottom: 0;
-}
-
-.mat-tab-labels .mat-ink-bar {
-  background-color: #35afd5;
-}
-
-.dropdown-multiselect button span {
-  padding-top: 7px;
-  padding-bottom: 3px;
-}
-
-.mat-dialog-container.mat-dialog-container .install-libraries#dialog-box  {
+.mat-dialog-container.mat-dialog-container .install-libraries#dialog-box {
   .mat-header-cell{
     padding: 0;
     border: none;
+    position: absolute;
+    right: 10px;
   }
 
   .filter-actions {
     display: flex;
     margin-left: 6px;
+
     .btn {
       padding: 6px;
       height: auto;
@@ -403,44 +370,23 @@
         display: flex;
       }
     }
-    .reset{
-      &:hover {
-        border-color: #f1696e;
-        background: #f9fafb;
-        color: #f1696e;
+  }
+}
+
+.install-libraries .dropdown-multiselect {
+  .list-menu li {
+    a {
+      font-size: 13px;
+
+      &.list-item {
+        color: #4a5c89 !important;
       }
     }
-    .apply:hover {
-      border-color: #49af38;
-      background: #f9fafb;
-      color: #49af38;
-    }
   }
-}
 
-.install-libraries .dropdown-multiselect .list-menu li {
-  a{
-    font-size: 13px;
-    &.list-item{
-      color: #4a5c89 !important;
-    }
-  }
-}
-
-.filter-row .filter-actions {
-  display: flex;
-
-  .reset{
-      &:hover {
-      border-color: #f1696e;
-      background: #f9fafb;
-      color: #f1696e;
-    }
-  }
-  .apply:hover {
-    border-color: #49af38;
-    background: #f9fafb;
-    color: #49af38;
+  button span {
+    padding-top: 7px;
+    padding-bottom: 3px;
   }
 }
 
@@ -450,30 +396,108 @@
   top: 40px;
   font-size: 11px;
   color: red;
+  &.version-error{
+    right: 0;
+    left: unset;
+  }
 }
 
-@media screen and (min-width: 1281px) {
-  .libs-info {
-    height: 60%;
+.info-icon{
+  color: lightgray;
+  cursor: pointer;
+}
 
+.lib-info{
+  width: 100%;
+
+  .delete-item {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    width: 100%;
+    padding: 5px 10px;
+
+    .butt.action{
+      line-height: 26px;
+    }
+  }
+}
+
+.btn{
+  line-height: 26px;
+
+  &.install-btn{
+    margin-left: 0;
+  }
+}
+
+.control-relative{
+  position: relative;
+
+  .plus-icon {
+    position: absolute;
+    right: -40px;
+    top: 5px;
+    color: #35afd5;
+    font-size: 27px;
+    cursor: pointer;
+
+    &.not-allow {
+      color: lightgray;
+    }
+  }
+
+  .other-message{
+    position: absolute;
+    font-size: 12px;
+    color: $link-color;
+    top: 40px;
+    left: 12px;
+  }
+}
+
+@media screen and (max-height: 840px) {
+  .libs-info {
     .mat-list {
-      .scrollingList {
-        max-height: 300px;
-        height: 80%;
+      height: 250px;
+      .dropdown-multiselect .list-menu{
+        max-height: 143px;
       }
     }
   }
 }
 
-@media screen and (max-height: 800px) {
+@media screen and (max-height: 720px) {
   .libs-info {
-    height: 50%;
-
     .mat-list {
-      .scrollingList {
-        max-height: 140px;
-        height: 60%;
+      height: 200px;
+      .dropdown-multiselect .list-menu{
+        max-height: 94px;
       }
     }
   }
 }
+
+@media screen and (max-height: 640px) {
+
+  .aligner>div.actions {
+    margin-bottom: 0;
+  }
+
+  .install-libraries {
+    padding-bottom: 90px;
+  }
+
+  .libs-info {
+    .mat-list {
+      height: 160px;
+      .dropdown-multiselect .list-menu{
+        max-height: 54px;
+      }
+    }
+  }
+
+  .message {
+    padding: 10px 20px;
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.ts
index 2f2d733..1b44d99 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/install-libraries.component.ts
@@ -22,60 +22,76 @@
 import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { FormControl } from '@angular/forms';
 import { ToastrService } from 'ngx-toastr';
-import { debounceTime } from 'rxjs/operators';
+import {debounceTime, filter, take, takeUntil} from 'rxjs/operators';
 
 import { InstallLibrariesModel } from './install-libraries.model';
 import { LibrariesInstallationService } from '../../../core/services';
-import { SortUtils, HTTP_STATUS_CODES } from '../../../core/util';
+import {SortUtils, HTTP_STATUS_CODES, PATTERNS} from '../../../core/util';
 import {FilterLibsModel} from './filter-libs.model';
+import {Subject, timer} from 'rxjs';
+import {CompareUtils} from '../../../core/util/compareUtils';
 
+interface Library {
+  name: string;
+  version: string;
+}
+
+interface GetLibrary {
+  autoComplete: string;
+  libraries: Library[];
+}
 
 @Component({
   selector: 'install-libraries',
   templateUrl: './install-libraries.component.html',
-  styleUrls: ['./install-libraries.component.scss'],
+  styleUrls: ['./libraries-info.component.scss', './install-libraries.component.scss'],
   encapsulation: ViewEncapsulation.None
 })
 export class InstallLibrariesComponent implements OnInit, OnDestroy {
+  private readonly CHECK_GROUPS_TIMEOUT: number = 5000;
+  private readonly INSTALLATION_IN_PROGRESS_CHECK: number = 10000;
 
+  private unsubscribe$ = new Subject();
   public model: InstallLibrariesModel;
   public notebook: any;
-  public filteredList: any;
+  public filteredList: any = [];
   public groupsList: Array<string>;
   public notebookLibs: Array<any> = [];
-  public notebookFailedLibs: Array<any> = [];
   public loadLibsTimer: any;
-
-  public query: string = '';
   public group: string;
   public destination: any;
   public uploading: boolean = false;
   public libs_uploaded: boolean = false;
   public validity_format: string = '';
-
   public isInstalled: boolean = false;
   public isInSelectedList: boolean = false;
   public installingInProgress: boolean = false;
   public libSearch: FormControl = new FormControl();
+
   public groupsListMap = {
     'r_pkg': 'R packages',
-    'pip2': 'Python 2',
     'pip3': 'Python 3',
     'os_pkg': 'Apt/Yum',
     'others': 'Others',
     'java': 'Java'
   };
 
-  private readonly CHECK_GROUPS_TIMEOUT: number = 5000;
-  private clear: number;
-
   public filterConfiguration: FilterLibsModel = new FilterLibsModel('', [], [], [], []);
   public filterModel: FilterLibsModel = new FilterLibsModel('', [], [], [], []);
   public filtered: boolean;
+  public autoComplete: string;
   public filtredNotebookLibs: Array<any> = [];
+  public lib: Library = {name: '', version: ''};
+  public selectedLib: any = null;
+  public isLibSelected: boolean = false;
+  public isVersionInvalid: boolean = false;
+  public isFilterChanged: boolean;
+  public isFilterSelected: boolean;
+  private cashedFilterForm: FilterLibsModel;
 
-  @ViewChild('groupSelect', { static: false }) group_select;
-  @ViewChild('resourceSelect', { static: false }) resource_select;
+  @ViewChild('groupSelect') group_select;
+  @ViewChild('resourceSelect') resource_select;
+  @ViewChild('trigger') matAutoComplete;
 
   constructor(
     @Inject(MAT_DIALOG_DATA) public data: any,
@@ -90,34 +106,49 @@
 
   ngOnInit() {
     this.open(this.data);
-    this.uploadLibGroups();
-    this.libSearch.valueChanges.pipe(
-      debounceTime(1000))
-      .subscribe(newValue => {
-        this.query = newValue || '';
+    this.libSearch.valueChanges
+      .pipe(
+      debounceTime(1000),
+      takeUntil(this.unsubscribe$)
+      )
+      .subscribe(value => {
+        if(!!value?.match(/\s+/g)) {
+          this.libSearch.setValue(value.replace(/\s+/g, ''))
+          this.lib.name = value.replace(/\s+/g, '');
+        } else {
+          this.lib.name = value;
+        }
+        this.isDuplicated(this.lib);
         this.filterList();
       });
-    this.getInstalledLibsByResource();
   }
 
   ngOnDestroy() {
-    clearTimeout(this.loadLibsTimer);
-    clearTimeout(this.clear);
+    this.unsubscribe$.next();
+    this.unsubscribe$.complete();
   }
 
   uploadLibGroups(): void {
     this.libs_uploaded = false;
     this.uploading = true;
+
     this.librariesInstallationService.getGroupsList(this.notebook.project, this.notebook.name, this.model.computational_name)
+      .pipe(
+        takeUntil(this.unsubscribe$),
+      )
       .subscribe(
         response => {
-          this.libsUploadingStatus(response);
+          const groups = [].concat(response);
+
+          // Remove when will be removed pip2 from Backend
+          const groupWithoutPip2 = groups.filter(group => group !== 'pip2');
+
+          this.libsUploadingStatus(groupWithoutPip2);
           this.changeDetector.detectChanges();
 
           this.resource_select && this.resource_select.setDefaultOptions(
             this.getResourcesList(),
             this.destination.title, 'destination', 'title', 'array');
-
           this.group_select && this.group_select.setDefaultOptions(
             this.groupsList, 'Select group', 'group_lib', null, 'list', this.groupsListMap);
         },
@@ -131,7 +162,7 @@
       .filter(item => item.status === 'running')
       .map(item => {
         item['name'] = item.computational_name;
-        item['title'] = `${item.computational_name} <em class="capt">cluster</em>`;
+        item['title'] = `${item.computational_name} <em class="capt">compute</em>`;
         item['type'] = 'СOMPUTATIONAL';
         return item;
       }));
@@ -139,62 +170,118 @@
 
   public filterList(): void {
     this.validity_format = '';
-    (this.query.length >= 2 && this.group) ? this.getFilteredList() : this.filteredList = null;
+    (this.lib.name && this.lib.name.length >= 2 && this.group ) ? this.getFilteredList() : this.filteredList = null;
   }
 
-  public filterGroups(groupsList) {
-    const PREVENT_TEMPLATES = ['rstudio', 'rstudio with tensorflow'];
+  public filterGroups(groupsList): Array<string> {
     const CURRENT_TEMPLATE = this.notebook.template_name.toLowerCase();
-    const templateCheck = PREVENT_TEMPLATES.some(template => CURRENT_TEMPLATE.indexOf(template) !== -1);
+    if (CURRENT_TEMPLATE.indexOf('jupyter with tensorflow') !== -1  || CURRENT_TEMPLATE.indexOf('deep learning') !== -1) {
+      const filtered = groupsList.filter(group => group !== 'r_pkg');
+      return SortUtils.libGroupsSort(filtered);
+    }
 
+    const PREVENT_TEMPLATES = ['rstudio', 'rstudio with tensorflow'];
+    const templateCheck = PREVENT_TEMPLATES.some(template => CURRENT_TEMPLATE.indexOf(template) !== -1);
     const filteredGroups = templateCheck ? groupsList.filter(group => group !== 'java') : groupsList;
     return SortUtils.libGroupsSort(filteredGroups);
   }
 
-  public onUpdate($event) {
+  public onUpdate($event): void {
     if ($event.model.type === 'group_lib') {
       this.group = $event.model.value;
+      this.autoComplete = '';
+      this.isLibSelected = false;
+      if (this.group) {
+        this.libSearch.enable();
+      }
+      this.lib = {name: '', version: ''};
+      this.isVersionInvalid = false;
+      this.libSearch.setValue('');
     } else if ($event.model.type === 'destination') {
-      this.resetDialog();
+      this.isLibSelected = false;
       this.destination = $event.model.value;
       this.destination && this.destination.type === 'СOMPUTATIONAL'
         ? this.model.computational_name = this.destination.name
         : this.model.computational_name = null;
-
-      this.uploadLibGroups();
-      this.getInstalledLibsByResource();
+      this.resetDialog();
+      this.libSearch.disable();
     }
     this.filterList();
   }
 
-  public onFilterUpdate($event) {
+  public onFilterUpdate($event): void {
     this.filterModel[$event.type] = $event.model;
+    this.checkFilters();
   }
 
-  public isDuplicated(item) {
-    const select = { group: this.group, name: item.name, version: item.version };
+  private checkFilters() : void{
+    this.isFilterChanged = CompareUtils.compareFilters(this.filterModel, this.cashedFilterForm);
+    this.isFilterSelected = Object.keys(this.filterModel).some(v => this.filterModel[v].length > 0);
+  }
 
-    this.isInSelectedList = this.model.selectedLibs.filter(el => JSON.stringify(el) === JSON.stringify(select)).length > 0;
+  public isDuplicated(item): void {
+    if (this.filteredList && this.filteredList.length) {
+      if (this.group !== 'java') {
+        this.selectedLib = this.filteredList.find(lib => lib.name.toLowerCase() === item.name.toLowerCase());
+      } else {
+        this.selectedLib = this.filteredList.find(lib => {
+          return lib.name.toLowerCase() === item.name.substring(0, item.name.lastIndexOf(':')).toLowerCase();
+        });
+      }
+    } else if ( this.autoComplete === 'NONE' || (this.autoComplete === 'ENABLED' && !this.filteredList?.length && this.group !== 'java')) {
+      this.selectedLib = {
+        name: this.lib.name,
+        version: this.lib.version,
+        isInSelectedList: this.model.selectedLibs.some(el => el.name.toLowerCase() === this.lib.name.toLowerCase().trim())
+      };
+    } else {
+      this.selectedLib = null;
+    }
+  }
 
-    if (this.destination && this.destination.libs)
-      this.isInstalled = this.destination.libs.findIndex(libr => {
-        return select.group !== 'java'
-          ? select.name === libr.name && select.group === libr.group && select.version === libr.version
-          : select.name === libr.name && select.group === libr.group;
-      }) >= 0;
-
-    return this.isInSelectedList || this.isInstalled;
+  public addLibrary(item): void {
+    if ((this.autoComplete === 'ENABLED' && !this.isLibSelected && this.filteredList?.length)
+      || this.lib.name.trim().length < 2
+      || (this.selectedLib && this.selectedLib.isInSelectedList) || this.isVersionInvalid || this.autoComplete === 'UPDATING') {
+      return;
+    }
+    this.validity_format = '';
+    this.isLibSelected = false;
+    if ( (!this.selectedLib && !this.isVersionInvalid) || (!this.selectedLib.isInSelectedList && !this.isVersionInvalid)) {
+      if ( this.group !== 'java') {
+        this.model.selectedLibs.push({ group: this.group, name: item.name.trim(), version: item.version.trim() || 'N/A' });
+      } else {
+        this.model.selectedLibs.push({
+          group: this.group,
+          name: item.name.substring(0, item.name.lastIndexOf(':')),
+          version: item.name.substring(item.name.lastIndexOf(':') + 1).trim() || 'N/A'
+        });
+      }
+      this.libSearch.setValue('');
+      this.lib = {name: '', version: ''};
+      this.filteredList = null;
+    }
   }
 
   public selectLibrary(item): void {
-    this.model.selectedLibs.push({ group: this.group, name: item.name, version: item.version });
-    this.query = '';
-    this.libSearch.setValue('');
-    this.filteredList = null;
+    if (item.isInSelectedList) {
+      return;
+    }
+    if (this.group === 'java') {
+      this.isLibSelected = true;
+      this.libSearch.setValue(item.name + ':' + item.version);
+      this.lib.name = item.name + ':' + item.version;
+    } else {
+      this.isLibSelected = true;
+      this.libSearch.setValue(item.name);
+      this.lib.name = item.name;
+    }
+    this.matAutoComplete.closePanel();
   }
 
   public removeSelectedLibrary(item): void {
     this.model.selectedLibs.splice(this.model.selectedLibs.indexOf(item), 1);
+    this.getMatchedLibs();
   }
 
   public open(notebook): void {
@@ -207,29 +294,34 @@
           this.resetDialog();
         }
       },
-      error => this.toastr.error(error.message || 'Library installation failed!', 'Oops!'),
+      error => this.toastr.error(error.message || 'Library installation error!', 'Oops!'),
       () => {
         this.getInstalledLibrariesList(true);
         this.changeDetector.detectChanges();
+
         this.selectorsReset();
       },
       this.librariesInstallationService);
  }
 
   public showErrorMessage(item): void {
-    const dialogRef: MatDialogRef<ErrorMessageDialogComponent> = this.dialog.open(
-      ErrorMessageDialogComponent, { data: item.error, width: '550px', panelClass: 'error-modalbox' });
+    const dialogRef: MatDialogRef<ErrorLibMessageDialogComponent> = this.dialog.open(
+      ErrorLibMessageDialogComponent, { data: item.error, width: '550px', panelClass: 'error-modalbox' });
   }
 
   public isInstallingInProgress(): void {
     this.installingInProgress = this.notebookLibs.some(lib => lib.filteredStatus.some(status => status.status === 'installing'));
       if (this.installingInProgress) {
-        clearTimeout(this.loadLibsTimer);
-        this.loadLibsTimer = window.setTimeout(() => this.getInstalledLibrariesList(), 10000);
+        timer(this.INSTALLATION_IN_PROGRESS_CHECK)
+          .pipe(
+            take(1),
+            takeUntil(this.unsubscribe$)
+          )
+          .subscribe(v => this.getInstalledLibrariesList());
       }
-    }
+  }
 
-  public reinstallLibrary(item, lib) {
+  public reinstallLibrary(item, lib): void {
     const retry = [{ group: lib.group, name: lib.name, version: lib.version }];
 
     if (this.getResourcesList().find(el => el.name === item.resource).type === 'СOMPUTATIONAL') {
@@ -239,8 +331,11 @@
     }
   }
 
-  private getInstalledLibrariesList(init?: boolean) {
+  private getInstalledLibrariesList(init?: boolean): void {
     this.model.getInstalledLibrariesList(this.notebook)
+      .pipe(
+        takeUntil(this.unsubscribe$)
+      )
       .subscribe((data: any) => {
         if ( !this.filtredNotebookLibs.length || data.length !== this.notebookLibs.length) {
           this.filtredNotebookLibs = [...data];
@@ -255,10 +350,12 @@
             lib.version = 'v.' +  lib.version;
           }
         );
+        this.filterLibs();
         this.changeDetector.markForCheck();
         this.filterConfiguration.group = this.createFilterList(this.notebookLibs.map(v => this.groupsListMap[v.group]));
+        this.filterConfiguration.group = SortUtils.libFilterGroupsSort(this.filterConfiguration.group);
         this.filterConfiguration.resource = this.createFilterList(this.notebookLibs.map(lib => lib.status.map(status => status.resource)));
-        this.filterConfiguration.resourceType = this.createFilterList(this.notebookLibs.map(lib =>
+        this.filterConfiguration.resource_type = this.createFilterList(this.notebookLibs.map(lib =>
           lib.status.map(status => status.resourceType)));
         this.filterConfiguration.status = this.createFilterList(this.notebookLibs.map(lib => lib.status.map(status => status.status)));
         this.isInstallingInProgress();
@@ -269,90 +366,183 @@
     return array.flat().filter((v, i, arr) => arr.indexOf(v) === i);
   }
 
-  private getInstalledLibsByResource() {
+  private getInstalledLibsByResource(): void {
     this.librariesInstallationService.getInstalledLibsByResource(this.notebook.project, this.notebook.name, this.model.computational_name)
+      .pipe(
+        takeUntil(this.unsubscribe$)
+      )
       .subscribe((data: any) => this.destination.libs = data);
   }
 
   private libsUploadingStatus(groupsList): void {
     if (groupsList.length) {
+
       this.groupsList = this.filterGroups(groupsList);
       this.libs_uploaded = true;
       this.uploading = false;
     } else {
       this.libs_uploaded = false;
       this.uploading = true;
-      this.clear = window.setTimeout(() => this.uploadLibGroups(), this.CHECK_GROUPS_TIMEOUT);
+      timer(this.CHECK_GROUPS_TIMEOUT).pipe(
+        take(1),
+        takeUntil(this.unsubscribe$)
+      ).subscribe(() => this.uploadLibGroups());
     }
   }
 
   private getFilteredList(): void {
     this.validity_format = '';
-
-    if (this.group === 'java') {
-      this.model.getDependencies(this.query)
-        .subscribe(
-          lib => this.filteredList = [lib],
-          error => {
-            if (error.status === HTTP_STATUS_CODES.NOT_FOUND
-              || error.status === HTTP_STATUS_CODES.BAD_REQUEST
-              || error.status === HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR) {
-              this.validity_format = error.message;
-              this.filteredList = null;
-            }
-          });
-    } else {
-      this.model.getLibrariesList(this.group, this.query)
-        .subscribe(libs => this.filteredList = libs);
+    if (this.lib.name.length > 1) {
+      if (this.group === 'java') {
+        this.model.getDependencies(this.lib.name)
+          .pipe(
+            takeUntil(this.unsubscribe$)
+          )
+          .subscribe(
+            libs => {
+              this.filteredList = [libs];
+              this.filteredList.forEach(lib => {
+                lib.isInSelectedList = this.model.selectedLibs
+                  .some(el => {
+                    return lib.name.toLowerCase() === el.name.toLowerCase();
+                  });
+                lib.isInstalled = this.notebookLibs.some(libr => {
+                    return lib.name.toLowerCase() === libr.name.toLowerCase() &&
+                      this.group === libr.group &&
+                      libr.status.some(res => res.resource === this.destination.name);
+                  }
+                );
+              });
+              this.isDuplicated(this.lib);
+            },
+            error => {
+              if (error.status === HTTP_STATUS_CODES.NOT_FOUND
+                || error.status === HTTP_STATUS_CODES.BAD_REQUEST
+                || error.status === HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR) {
+                this.validity_format = error.message || '';
+                if (error.message.indexOf('query param artifact') !== -1 || error.message.indexOf('Illegal character') !== -1) {
+                  this.validity_format = 'Wrong library name format. Should be <groupId>:<artifactId>:<versionId>.';
+                }
+                if (error.message.indexOf('not found') !== -1) {
+                  this.validity_format = 'No matches found.';
+                }
+                this.filteredList = null;
+              }
+            });
+      } else {
+        if (this.lib.name && this.lib.name.length > 1) {
+          this.getMatchedLibs();
+        }
+      }
     }
   }
 
-  private selectorsReset(): void {
-    this.destination = this.getResourcesList()[0];
+  private getMatchedLibs() {
+    if (!this.lib.name || this.lib.name.trim().length < 2) {
+      return;
+    }
+    this.model.getLibrariesList(this.group, this.lib.name.trim().toLowerCase())
+      .pipe(
+        takeUntil(this.unsubscribe$)
+      )
+      .subscribe((libs: GetLibrary) => {
+        if (libs.autoComplete === 'UPDATING') {
+           timer(5000).pipe(
+            take(1),
+            takeUntil(this.unsubscribe$)
+          ).subscribe(_ => {
+            this.getMatchedLibs();
+          });
+        }
+        this.autoComplete = libs.autoComplete;
+        this.filteredList = libs.libraries;
+        this.filteredList.forEach(lib => {
+          lib.isInSelectedList = this.model.selectedLibs.some(el => el.name.toLowerCase() === lib.name.toLowerCase());
+          lib.isInstalled = this.notebookLibs.some(libr => lib.name === libr.name &&
+            this.group === libr.group &&
+            libr.status.some(res => res.resource === this.destination.name));
+        });
+        this.isDuplicated(this.lib);
+      });
+
+  }
+
+  private selectorsReset(leaveDestanation?): void {
+    if (!leaveDestanation) this.destination = this.getResourcesList()[0];
     this.uploadLibGroups();
     this.getInstalledLibsByResource();
+    this.libSearch.disable();
   }
 
   private resetDialog(): void {
     this.group = '';
-    this.query = '';
+    this.lib.name = '';
     this.libSearch.setValue('');
     this.isInstalled = false;
     this.isInSelectedList = false;
     this.uploading = false;
     this.model.selectedLibs = [];
-    this.filteredList = null;
+    this.filteredList = [];
     this.groupsList = [];
-
-    clearTimeout(this.clear);
-    clearTimeout(this.loadLibsTimer);
-    this.selectorsReset();
+    this.selectorsReset(true);
   }
 
   public toggleFilterRow(): void {
     this.filtered = !this.filtered;
   }
 
-  public filterLibs(): void {
+  public filterLibs(updCachedForm?): void {
+    if (!this.cashedFilterForm || updCachedForm) {
+      this.cashedFilterForm = JSON.parse(JSON.stringify(this.filterModel));
+      Object.setPrototypeOf(this.cashedFilterForm, Object.getPrototypeOf(this.filterModel));
+    }
     this.filtredNotebookLibs = this.notebookLibs.filter((lib) => {
-      const isName = this.filterModel.name ?
-        lib.name.toLowerCase().indexOf(this.filterModel.name.toLowerCase().trim()) !== -1
-        || lib.version.indexOf(this.filterModel.name.toLowerCase().trim()) !== -1 : true;
-      const isGroup = this.filterModel.group.length ? this.filterModel.group.includes(this.groupsListMap[lib.group]) : true;
+      const isName = this.cashedFilterForm.name ?
+        lib.name.toLowerCase().indexOf(this.cashedFilterForm.name.toLowerCase().trim()) !== -1
+        || lib.version.indexOf(this.cashedFilterForm.name.toLowerCase().trim()) !== -1 : true;
+      const isGroup = this.cashedFilterForm.group.length ? this.cashedFilterForm.group.includes(this.groupsListMap[lib.group]) : true;
       lib.filteredStatus = lib.status.filter(status => {
-        const isResource = this.filterModel.resource.length ? this.filterModel.resource.includes(status.resource) : true;
-        const isResourceType = this.filterModel.resourceType.length ? this.filterModel.resourceType.includes(status.resourceType) : true;
-        const isStatus = this.filterModel.status.length ? this.filterModel.status.includes(status.status) : true;
+        const isResource = this.cashedFilterForm.resource.length ? this.cashedFilterForm.resource.includes(status.resource) : true;
+        const isResourceType = this.cashedFilterForm.resource_type.length ?
+          this.cashedFilterForm.resource_type.includes(status.resourceType) : true;
+        const isStatus = this.cashedFilterForm.status.length ? this.cashedFilterForm.status.includes(status.status) : true;
         return isResource && isResourceType && isStatus;
       });
+      this.checkFilters();
       return isName && isGroup && lib.filteredStatus.length;
     });
   }
 
   public resetFilterConfigurations(): void {
     this.notebookLibs.forEach(v => v.filteredStatus = v.status);
-    this.filtredNotebookLibs = [...this.notebookLibs];
     this.filterModel.resetFilterLibs();
+    this.filterLibs(true);
+  }
+
+  public openLibInfo(lib, type) {
+    this.dialog.open(
+      LibInfoDialogComponent, { data: {lib, type}, width: '550px', panelClass: 'error-modalbox' });
+  }
+
+  public emitClick() {
+      this.matAutoComplete.closePanel();
+  }
+
+  public clearLibSelection(event) {
+    this.isLibSelected = false;
+  }
+
+  public validateVersion(version) {
+    if (version.length) {
+      this.isVersionInvalid = !PATTERNS.libVersion.test(version);
+    } else {
+      this.isVersionInvalid = false;
+    }
+  }
+
+  public onFilterNameUpdate(targetElement: any) {
+    this.filterModel.name = targetElement;
+    this.checkFilters();
   }
 }
 
@@ -363,16 +553,52 @@
     <h4 class="modal-title">Library installation error</h4>
     <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
   </div>
-  <div class="content">{{ data }}</div>
-  <div class="text-center">
-    <button type="button" class="butt" mat-raised-button (click)="dialogRef.close()">Close</button>
+  <div class="content lib-error scrolling" >
+    {{ data }}
   </div>
   `,
-  styles: []
+  styles: [    `
+      .lib-error { max-height: 200px; overflow-x: auto; word-break: break-all; padding: 20px 30px !important; margin: 20px 0 !important;}
+  `
+  ]
 })
-export class ErrorMessageDialogComponent {
+export class ErrorLibMessageDialogComponent {
   constructor(
-    public dialogRef: MatDialogRef<ErrorMessageDialogComponent>,
+    public dialogRef: MatDialogRef<ErrorLibMessageDialogComponent>,
     @Inject(MAT_DIALOG_DATA) public data: any
-  ) { }
+  ) {
+
+  }
+}
+
+@Component({
+  selector: 'lib-info-dialog',
+  template: `
+  <div class="dialog-header">
+    <h4 class="modal-title" *ngIf="data.type === 'added'">Installed dependency</h4>
+    <h4 class="modal-title" *ngIf="data.type === 'available'">Version is not available</h4>
+    <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
+  </div>
+  <div class="lib-list scrolling" *ngIf="data.type === 'added'">
+    <span class="strong dependency-title">Dependency: </span><span class="packeges" *ngFor="let pack of data.lib.add_pkgs; index as i">{{pack + (i !== data.lib.add_pkgs.length - 1 ? ', ' : '')}}</span>
+  </div>
+  <div class="lib-list" *ngIf="data.type === 'available'">
+    <span class="strong">Available versions: </span>{{data.lib.available_versions.join(', ')}}
+  </div>
+  `,
+  styles: [    `
+    .lib-list { max-height: 200px; overflow-x: auto; word-break: break-all; padding: 20px 30px !important; margin: 20px 0; color: #577289;}
+    .packeges { word-spacing: 5px; line-height: 23px;}
+    .dependency-title{ line-height: 23px; }
+  `
+  ]
+})
+
+export class LibInfoDialogComponent {
+  constructor(
+    public dialogRef: MatDialogRef<ErrorLibMessageDialogComponent>,
+    @Inject(MAT_DIALOG_DATA) public data: any
+  ) {
+
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/libraries-info.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/libraries-info.component.scss
new file mode 100644
index 0000000..2789a66
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/install-libraries/libraries-info.component.scss
@@ -0,0 +1,254 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.install-libraries {
+  height: 100%;
+  padding-bottom: 110px;
+
+  .dialog-header {
+    padding-left: 25px;
+  }
+
+  .dialog-content {
+    height: calc(100% - 50px);
+  }
+
+  .info {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: center;
+  }
+
+  .mat-list-item {
+    height: auto !important;
+    font-family: "Open Sans", sans-serif;
+    color: #718ba6 !important;
+    font-size: 13px !important;
+    font-weight: 300;
+
+    .mat-list-item-content {
+      height: auto !important;
+      min-height: 54px !important;
+      border-bottom: 1px solid #edf1f5;
+      padding-right: 10px;
+      padding-left: 0;
+    }
+  }
+
+  .lib-view-wrap {
+    display: flex;
+    flex-direction: column;
+  }
+
+  .error {
+    padding: 15px 20px;
+  }
+
+  .uploading {
+    margin: 0 auto;
+  }
+
+  .list-selected {
+    padding: 10px;
+    font-family: 'Open Sans', sans-serif;
+    height: 130px;
+    overflow-y: auto;
+
+    h4 {
+      margin-bottom: 20px;
+      font-size: 14px;
+      text-align: center;
+      font-weight: 400;
+      color: #718ba6;
+    }
+
+    mat-chip-list .mat-chip-list-wrapper {
+      overflow-y: auto;
+      padding: 3px;
+    }
+  }
+
+  .loading-block {
+    height: 40%;
+    display: flex;
+    justify-content: center;
+
+    .uploading {
+      padding-top: 200px;
+      flex-direction: column;
+      align-items: center;
+      align-self: center;
+      list-style: none;
+      display: flex;
+
+      p {
+        font-size: 16px;
+      }
+    }
+  }
+
+  .list-header{
+    line-height: 40px;
+  }
+}
+
+.libs-info {
+  padding: 0 25px;
+  display: flex;
+  flex: 1 1 auto;
+  min-height: 0;
+
+  .filter-row {
+    .filter-col{
+      padding-left: 0;
+      &.lib-name{
+        padding-left: 5px;
+        .filter-field{
+          padding-left: 15px;
+        }
+      }
+      .status{
+        text-transform: none;
+      }
+    }
+  }
+
+  .mat-list {
+
+    .list-header{
+      line-height: 40px;
+      position: sticky;
+      top: 0;
+      z-index: 99;
+      background-color: #fff;
+    }
+
+    .filter-row{
+      position: sticky;
+      top: 56px;
+      z-index: 99;
+      background-color: #fff;
+    }
+
+
+    .scrollingList {
+      .info {
+        p {
+          text-align: center;
+          padding: 40px;
+        }
+      }
+    }
+  }
+
+  .lib-name {
+    width: 27%;
+    padding-right: 10px;
+    padding-left: 20px;
+
+    &-col{
+      display: flex;
+    }
+
+    .lib-name-wrapper{
+      overflow: hidden;
+      display: block;
+      text-overflow: ellipsis;
+    }
+
+    strong {
+      font-weight: 400;
+    }
+  }
+
+  .lib-group,
+  .lib-destination {
+    width: 17%;
+    padding-left: 15px;
+    padding-right: 10px;
+  }
+
+  .lib-status {
+    width: 17%;
+    padding-left: 15px;
+    padding-right: 10px;
+  }
+
+  .lib-resource-type {
+    width: 17%;
+    padding-left: 15px;
+    padding-right: 10px;
+  }
+
+  .lib-group-col {
+    width: 17%;
+    padding-left: 17px;
+    padding-right: 10px;
+  }
+
+  .st-group {
+    display: flex;
+    flex-direction: column;
+    width: 51%;
+
+    .wrap-col {
+      display: flex;
+      padding: 5px 0px;
+
+      .lib-destination-col {
+        width: 33.3%;
+        padding-left: 15px;
+      }
+
+      .lib-resource-type-col {
+        width: 33.3%;
+        color: #36afd5;
+        padding-left: 15px;
+      }
+
+      .lib-status-col {
+        position: relative;
+        width: 33.3%;
+        padding-left: 15px;
+
+        .warn-action {
+          position: absolute;
+          top: -3px;
+          right: -50px;
+
+          div {
+            display: inline-block;
+            cursor: pointer;
+            width: 25px;
+            pointer-events: auto;
+
+            span {
+              display: block;
+            }
+          }
+
+          .lib-error {
+            color: #35afd5;
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.html
index a6c2610..bb59fbc 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.html
@@ -25,11 +25,11 @@
   <div class="dialog-content tabs">
     <mat-tab-group mat-stretch-tabs #tabGroupGit class="content-box">
       <mat-tab label="LIST">
-        <button mat-raised-button class="butt add-creds" (click)="tabGroupGit.selectedIndex = 1">
+        <button mat-raised-button class="butt add-creds" (click)="tabGroupGit.selectedIndex = 1; resetForm()">
           <i class="material-icons">people_outline</i>Add account
         </button>
         <mat-divider></mat-divider>
-        <mat-list *ngIf="gitCredentials?.length">
+        <mat-list *ngIf="gitCredentials?.length" [ngStyle]="editableForm && gitCredentials?.length && {'height': '250px'}">
           <mat-list-item class="list-header">
             <div class="hostname-field">Host name</div>
             <div class="user-field">User</div>
@@ -38,14 +38,14 @@
             <div class="actions"></div>
           </mat-list-item>
 
-          <div class="scrollingList" id="scrolling">
+          <div class="scrollingList" id="scrolling" [ngStyle]="editableForm && gitCredentials?.length && {'height': '200px'}">
             <mat-list-item *ngFor="let item of gitCredentials">
-              <div class="hostname-field">
+              <div class="hostname-field ellipsis">
                 <strong>{{ item.hostname }}</strong>
               </div>
-              <div class="user-field">{{ item.username }}</div>
-              <div class="mail-field">{{ item.email }}</div>
-              <div class="login-field">{{ item.login }}</div>
+              <div class="user-field ellipsis">{{ item.username }}</div>
+              <div class="mail-field ellipsis">{{ item.email }}</div>
+              <div class="login-field ellipsis">{{ item.login }}</div>
               <div class="actions">
                 <span class="git-actions" (click)="editSpecificAccount(item)">
                   <i class="material-icons">mode_edit</i>
@@ -80,11 +80,11 @@
                 <span class="danger_color"
                   *ngIf="!updateAccountCredentialsForm.controls['hostname'].valid
                   && updateAccountCredentialsForm.controls['hostname'].touched && !updateAccountCredentialsForm.controls['hostname'].hasError('duplicate')">
-                  Hostname field is required. Please provide a qualified domain name (e.g. gitlab.com or github.com)
+                  Hostname field is required. Please provide a qualified domain name (e.g. gitlab.com or github.com).
                 </span>
                 <span class="danger_color"
                   *ngIf="updateAccountCredentialsForm.controls['hostname'].hasError('duplicate') && updateAccountCredentialsForm.controls['hostname'].dirty">
-                  The Host name is already in use
+                  The Host name is already in use.
                 </span>
               </div>
               <div class="control-group">
@@ -94,7 +94,7 @@
                 </div>
                 <span class="danger_color"
                   *ngIf="!updateAccountCredentialsForm.controls['username'].valid && updateAccountCredentialsForm.controls['username'].touched">
-                  Username field is required. Please provide a valid username
+                  Username field is required. Please provide a valid username.
                 </span>
               </div>
               <div class="control-group">
@@ -104,7 +104,7 @@
                 </div>
                 <span class="danger_color"
                   *ngIf="!updateAccountCredentialsForm.controls['email'].valid && updateAccountCredentialsForm.controls['email'].touched">
-                  Email field is required. Please provide a valid email
+                  Email field is required. Please provide a valid email.
                 </span>
               </div>
             </div>
@@ -116,7 +116,7 @@
                 </div>
                 <span class="danger_color"
                   *ngIf="!updateAccountCredentialsForm.controls['login'].valid && updateAccountCredentialsForm.controls['login'].touched">
-                  Login field is required. Please provide a valid login
+                  Login field is required. Please provide a valid login.
                 </span>
               </div>
               <div class="control-group">
@@ -126,7 +126,7 @@
                 </div>
                 <span class="danger_color"
                   *ngIf="!updateAccountCredentialsForm.controls['password'].valid && updateAccountCredentialsForm.controls['password'].touched">
-                  Field is required. Password must be at least 6 characters
+                  Field is required. Password must be at least 6 characters.
                 </span>
               </div>
               <div class="control-group">
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.scss
index 60e40b1..2362d15 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.scss
@@ -21,6 +21,10 @@
   .content-box {
     height: 500px;
     padding: 25px 35px;
+
+    .list-header div {
+      font-size: 13px;
+    }
   }
 
   .add-creds {
@@ -29,8 +33,8 @@
 
   .scrollingList {
     overflow-x: hidden;
-    padding: 5px;
-    height: 185px;
+    padding: 5px 0;
+    height: 250px;
 
     &.info {
       display: flex;
@@ -48,20 +52,16 @@
   .login-field {
     width: 25%;
     overflow: hidden;
-    text-overflow: ellipsis;
     padding: 5px;
   }
 
   .hostname-field {
-    width: 25%;
     overflow: hidden;
-    text-overflow: ellipsis;
     padding: 5px;
     width: 30%;
   }
 
   .actions {
-    width: 20%;
     position: relative;
     overflow: visible;
     width: 50px;
@@ -111,6 +111,7 @@
         top: 45px;
         padding: 0;
         font-size: 12px;
+        right: 0;
       }
     }
 
@@ -127,4 +128,12 @@
   .submit {
     margin-top: 60px;
   }
+
+  .mat-list {
+    height: 300px;
+    .mat-list-item {
+      color: #607d8b;
+      font-size: 13px;
+    }
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.ts
index aadfc24..be68697 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/manage-ungit/manage-ungit.component.ts
@@ -26,7 +26,7 @@
 import { ManageUngitService } from '../../core/services';
 
 @Component({
-  selector: 'dlab-manage-ungit',
+  selector: 'datalab-manage-ungit',
   templateUrl: './manage-ungit.component.html',
   styleUrls: ['./manage-ungit.component.scss',
     '../exploratory/install-libraries/install-libraries.component.scss']
@@ -37,14 +37,14 @@
   currentEditableItem: AccountCredentials = null;
 
   mail_validity_pattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,63})$/;
-  hostname_validity_pattern = /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])+\.[a-z\.]+\S$/;
+  hostname_validity_pattern = /^([a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+.*)$/;
   login_acceptance_pattern = '[-_@.a-zA-Z0-9]+';
   acceptance_pattern = '[-_ a-zA-Z0-9]+';
 
   public editableForm: boolean = false;
   public updateAccountCredentialsForm: FormGroup;
 
-  @ViewChild('tabGroupGit', { static: false }) tabGroupGit;
+  @ViewChild('tabGroupGit') tabGroupGit;
 
   constructor(
     public toastr: ToastrService,
@@ -91,7 +91,9 @@
     this.currentEditableItem = item;
 
     this.updateAccountCredentialsForm = this._fb.group({
-      'hostname': [item.hostname, Validators.compose([Validators.required, Validators.pattern(this.hostname_validity_pattern), this.containsHostname.bind(this)])],
+      'hostname': [item.hostname, Validators.compose(
+        [Validators.required,  Validators.pattern(this.hostname_validity_pattern), this.containsHostname.bind(this)]
+      )],
       'username': [item.username, Validators.compose([Validators.required, Validators.pattern(this.acceptance_pattern)])],
       'email': [item.email, Validators.compose([Validators.required, Validators.pattern(this.mail_validity_pattern)])],
       'login': [item.login, Validators.compose([Validators.required, Validators.pattern(this.login_acceptance_pattern)])],
@@ -101,8 +103,8 @@
   }
 
   public deleteAccount(item: AccountCredentials) {
-    const dialogRef: MatDialogRef<ConfirmDeleteAccountDialog> = this.dialog.open(
-      ConfirmDeleteAccountDialog,
+    const dialogRef: MatDialogRef<ConfirmDeleteAccountDialogComponent> = this.dialog.open(
+      ConfirmDeleteAccountDialogComponent,
       { data: item, width: '550px', panelClass: 'error-modalbox' });
     dialogRef.afterClosed().subscribe(result => {
       if (result) {
@@ -135,7 +137,9 @@
 
   private initFormModel(): void {
     this.updateAccountCredentialsForm = this._fb.group({
-      'hostname': ['', Validators.compose([Validators.required, Validators.pattern(this.hostname_validity_pattern), this.containsHostname.bind(this)])],
+      'hostname': ['', Validators.compose(
+        [Validators.required, Validators.pattern(this.hostname_validity_pattern), this.containsHostname.bind(this)]
+      )],
       'username': ['', Validators.compose([Validators.required, Validators.pattern(this.acceptance_pattern)])],
       'email': ['', Validators.compose([Validators.required, Validators.pattern(this.mail_validity_pattern)])],
       'login': ['', Validators.compose([Validators.required, Validators.pattern(this.login_acceptance_pattern)])],
@@ -185,9 +189,9 @@
     .content { color: #718ba6; padding: 20px 50px; font-size: 14px; font-weight: 400 }
   `]
 })
-export class ConfirmDeleteAccountDialog {
+export class ConfirmDeleteAccountDialogComponent {
   constructor(
-    public dialogRef: MatDialogRef<ConfirmDeleteAccountDialog>,
+    public dialogRef: MatDialogRef<ConfirmDeleteAccountDialogComponent>,
     @Inject(MAT_DIALOG_DATA) public data: any
   ) { }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/index.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/index.ts
index 39a9732..6bbc5a0 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/index.ts
@@ -32,24 +32,26 @@
 import { AmiCreateDialogModule } from '../exploratory/ami-create-dialog';
 import { SchedulerModule } from '../scheduler';
 import { UnderscorelessPipeModule } from '../../core/pipes/underscoreless-pipe';
+import {LocalCurrencyModule} from '../../core/pipes/local-currency-pipe';
 
 @NgModule({
-  imports: [
-    CommonModule,
-    RouterModule,
-    ComputationalResourcesModule,
-    ConfirmationDialogModule,
-    BubbleModule,
-    DetailDialogModule,
-    ComputationalResourceCreateDialogModule,
-    FormControlsModule,
-    CostDetailsDialogModule,
-    InstallLibrariesModule,
-    SchedulerModule,
-    AmiCreateDialogModule,
-    UnderscorelessPipeModule,
-    MaterialModule
-  ],
+    imports: [
+        CommonModule,
+        RouterModule,
+        ComputationalResourcesModule,
+        ConfirmationDialogModule,
+        BubbleModule,
+        DetailDialogModule,
+        ComputationalResourceCreateDialogModule,
+        FormControlsModule,
+        CostDetailsDialogModule,
+        InstallLibrariesModule,
+        SchedulerModule,
+        AmiCreateDialogModule,
+        UnderscorelessPipeModule,
+        MaterialModule,
+        LocalCurrencyModule
+    ],
   declarations: [ResourcesGridComponent],
   exports: [ResourcesGridComponent]
 })
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.html
index 69edcc3..026dccd 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.html
@@ -17,285 +17,373 @@
   ~ under the License.
   -->
 
-<section class="table-wrapper">
-  <table mat-table [dataSource]="filteredEnvironments" multiTemplateDataRows
-    class="data-grid resources mat-elevation-z6">
+<section class="table-wrapper resources-wrapper">
+  <div class="table-wrapper scrolling">
+    <table mat-table [dataSource]="filteredEnvironments" multiTemplateDataRows
+           class="data-grid resources mat-elevation-z6" [trackBy]="trackBy">
 
-    <ng-container matColumnDef="project">
-      <td mat-cell *matCellDef="let element" [attr.colspan]="8" class="highlight"> {{ element.project }} </td>
-    </ng-container>
+      <ng-container matColumnDef="project">
+        <td mat-cell *matCellDef="let element" [attr.colspan]="8" class="project-name"> {{ element.project }} </td>
+      </ng-container>
 
-    <!-- <ng-container *ngFor="let column of filteringColumns; let i = index" matColumnDef="{{ column.name }}"
-      [attr.sticky]="column.name === 'name' ? true : null">
-      <th mat-header-cell *matHeaderCellDef ngClass="{{ column.class }}">
-        <span class="label">{{ column.title }}</span>
-        <button mat-icon-button *ngIf="column.filtering" aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filtering && filterForm[column.name].length > 0 && !collapseFilterRow">filter_list</span>
-            <span [hidden]="filtering && filterForm[column.name].length > 0 && !collapseFilterRow">more_vert</span>
-          </i>
-        </button>
-      </th>
-    </ng-container> -->
+      <!-- <ng-container *ngFor="let column of filteringColumns; let i = index" matColumnDef="{{ column.name }}"
+        [attr.sticky]="column.name === 'name' ? true : null">
+        <th mat-header-cell *matHeaderCellDef ngClass="{{ column.class }}">
+          <span class="label">{{ column.title }}</span>
+          <button mat-icon-button *ngIf="column.filtering" aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm[column.name].length > 0 && !collapseFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm[column.name].length > 0 && !collapseFilterRow">more_vert</span>
+            </i>
+          </button>
+        </th>
+      </ng-container> -->
 
-    <ng-container matColumnDef="name" sticky>
-      <th mat-header-cell *matHeaderCellDef class="name-col label-header">
-        <span class="label">Environment name</span>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filtering && filterForm.name.length > 0 && !collapseFilterRow">filter_list</span>
-            <span [hidden]="filtering && filterForm.name.length > 0 && !collapseFilterRow">more_vert</span>
-          </i>
-        </button>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="statuses">
-      <th mat-header-cell *matHeaderCellDef class="status-col label-header">
-        <span class="label"> Status </span>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filtering && filterForm.statuses.length > 0 && !collapseFilterRow">filter_list</span>
-            <span [hidden]="filtering && filterForm.statuses.length > 0 && !collapseFilterRow">more_vert</span>
-          </i>
-        </button>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="shapes">
-      <th mat-header-cell *matHeaderCellDef class="shape-col label-header">
-        <span class="label"> Size </span>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filtering && filterForm.shapes.length > 0 && !collapseFilterRow">filter_list</span>
-            <span [hidden]="filtering && filterForm.shapes.length > 0 && !collapseFilterRow">more_vert</span>
-          </i>
-        </button>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="tag">
-      <th mat-header-cell *matHeaderCellDef class="tag-col label-header">
-        <span class="label"> Tags </span>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="resources">
-      <th mat-header-cell *matHeaderCellDef class="resources-col label-header">
-        <span class="label"> Computational resources </span>
-        <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
-          <i class="material-icons">
-            <span *ngIf="filtering && filterForm.resources.length > 0 && !collapseFilterRow">filter_list</span>
-            <span [hidden]="filtering && filterForm.resources.length > 0 && !collapseFilterRow">more_vert</span>
-          </i>
-        </button>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="cost">
-      <th mat-header-cell *matHeaderCellDef class="cost-col label-header">
-        <span class="label"> Cost </span>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="actions" stickyEnd>
-      <th mat-header-cell *matHeaderCellDef class="actions-col label-header">
-        <span class="label"> Actions </span>
-      </th>
-    </ng-container>
+      <ng-container matColumnDef="name" sticky>
+        <th mat-header-cell *matHeaderCellDef class="name-col label-header">
+          <span class="label">Environment name</span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm.name.length > 0 && !collapseFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm.name.length > 0 && !collapseFilterRow">more_vert</span>
+            </i>
+          </button>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="statuses">
+        <th mat-header-cell *matHeaderCellDef class="status-col label-header">
+          <span class="label"> Status </span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm.statuses.length > 0 && !collapseFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm.statuses.length > 0 && !collapseFilterRow">more_vert</span>
+            </i>
+          </button>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="shapes">
+        <th mat-header-cell *matHeaderCellDef class="shape-col label-header">
+          <span class="label"> Size </span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm.shapes.length > 0 && !collapseFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm.shapes.length > 0 && !collapseFilterRow">more_vert</span>
+            </i>
+          </button>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="tag">
+        <th mat-header-cell *matHeaderCellDef class="tag-col label-header">
+          <span class="label"> Tags </span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span>more_vert</span>
+            </i>
+          </button>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="resources">
+        <th mat-header-cell *matHeaderCellDef class="resources-col label-header">
+          <span class="label"> Compute </span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span *ngIf="filtering && filterForm.resources.length > 0 && !collapseFilterRow">filter_list</span>
+              <span [hidden]="filtering && filterForm.resources.length > 0 && !collapseFilterRow">more_vert</span>
+            </i>
+          </button>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="cost">
+        <th mat-header-cell *matHeaderCellDef class="cost-col label-header">
+          <span class="label"> Cost </span>
+          <button mat-icon-button aria-label="More" class="ar" (click)="toggleFilterRow()">
+            <i class="material-icons">
+              <span>more_vert</span>
+            </i>
+          </button>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="actions" stickyEnd>
+        <th mat-header-cell *matHeaderCellDef class="settings label-header">
+          <span class="label"> Actions </span>
+        </th>
+      </ng-container>
 
-    <!-- ----------------------------------------------------- -->
+      <!-- ----------------------------------------------------- -->
 
-    <ng-container matColumnDef="expandedDetail">
-      <td mat-cell *matCellDef="let element" class="exploratory" [attr.colspan]="8"
-        [@detailExpand]="element == expandedElement ? 'expanded' : 'collapsed'" sticky>
+      <ng-container matColumnDef="expandedDetail">
+        <td mat-cell *matCellDef="let element" class="exploratory" [attr.colspan]="8" sticky>
+          <!--        [@detailExpand]="element == expandedElement ? 'expanded' : 'collapsed'" -->
 
-        <tr *ngFor="let element of element.exploratory; let i = index" class="element-row mat-row">
-          <td class="name-col" (click)="printDetailEnvironmentModal(element)">
-            <span matTooltip="{{ element.name }}" matTooltipPosition="above">{{ element.name }}</span>
-          </td>
-          <td class="status-col status" ngClass="{{ element.status.toLowerCase() || ''}}">
-            {{element.status | underscoreless }}
-          </td>
-          <td class="shape-col">{{ element.shape }}</td>
+          <tr *ngFor="let element of element.exploratory; let i = index" class="element-row mat-row">
+            <td class="name-col">
+              <span
+                *ngIf="element.shape !== 'odahu cluster';else odahu"
+                [matTooltip]="element.name"
+                matTooltipPosition="above"
+                (click)="printDetailEnvironmentModal(element)"
+              >
+                {{ element.name }}
+              </span>
+              <ng-template #odahu>
+                <span [matTooltip]=" element.name "
+                      matTooltipPosition="above"
+                      (click)="printDetailOdahuModal(element)"
+                >
+                  {{ element.name }}
+                </span>
+              </ng-template>
+            </td>
+            <td class="status-col status" ngClass="{{ element.status.toLowerCase() || ''}}">
+              {{element.status | underscoreless }}
+            </td>
+            <td class="shape-col">
+              <div>{{ element.shape }}</div>
+              <div *ngIf="element.gpu_type">{{ element.gpu_type }}</div>
+              <div *ngIf="element.gpu_count">GPU count: {{ element.gpu_count }}</div>
+            </td>
 
-          <td class="tag-col selection">
-            <mat-chip-list aria-label="Tags">
-              <mat-chip matTooltip="Endpoint tag: {{ element.tags.endpoint_tag }}" matTooltipPosition="above">
-                {{ element.tags.endpoint_tag }}
-              </mat-chip>
-              <mat-chip *ngIf="element.tags.custom_tag" matTooltip="Custom tag: {{ element.tags.custom_tag }}"
-                matTooltipPosition="above">
-                {{ element.tags.custom_tag }}
-              </mat-chip>
-              <mat-chip matTooltip="User tag: {{ element.tags.user_tag }}" matTooltipPosition="above">
-                {{ element.tags.user_tag }}
-              </mat-chip>
-              <mat-chip matTooltip="Project tag: {{ element.tags.project_tag }}" matTooltipPosition="above">
-                {{ element.tags.project_tag }}
-              </mat-chip>
-            </mat-chip-list>
-          </td>
+            <td class="tag-col selection">
+              <mat-chip-list aria-label="Tags">
+                <mat-chip matTooltip="Endpoint tag: {{ element.tags.endpoint_tag }}" matTooltipPosition="above" class="ellipsis">
+                  {{ element.tags.endpoint_tag }}
+                </mat-chip>
+                <mat-chip *ngIf="element.tags.custom_tag" matTooltip="Custom tag: {{ element.tags.custom_tag }}"
+                          matTooltipPosition="above" class="ellipsis">
+                  {{ element.tags.custom_tag }}
+                </mat-chip>
+                <mat-chip *ngIf="element.tags.user_tag" matTooltip="User tag: {{ element.tags.user_tag }}" matTooltipPosition="above" class="ellipsis">
+                  {{ element.tags.user_tag }}
+                </mat-chip>
+                <mat-chip matTooltip="Project tag: {{ element.tags.project_tag }}" matTooltipPosition="above" class="ellipsis">
+                  {{ element.tags.project_tag }}
+                </mat-chip>
+                <mat-chip *ngIf="element.tags.gpu_tag" matTooltip="GPU tag: {{element.tags.gpu_tag?.toUpperCase()}}" matTooltipPosition="above" class="ellipsis">
+                  {{ element.tags.gpu_tag?.toUpperCase() }}
+                </mat-chip>
+              </mat-chip-list>
+            </td>
 
-          <td class="resources-col">
-            <computational-resources-list [resources]="element.resources" [environment]="element"
-              (buildGrid)="buildGrid($event)">
-            </computational-resources-list>
-          </td>
-          <td *ngIf="healthStatus?.billingEnabled" class="cost-col">
-            <span class="total_cost">{{ element.cost || 'N/A' }} {{ element.currency_code || '' }}</span>
-            <span (click)="element.billing && printCostDetails(element)" class="currency_details"
-              [ngClass]="{ 'not-allowed' : !element.billing.report_lines.length }">
+            <td class="resources-col">
+              <computational-resources-list [resources]="element.resources" [environment]="element"
+                                            (buildGrid)="buildGrid()">
+              </computational-resources-list>
+            </td>
+            <td *ngIf="healthStatus?.billingEnabled" class="cost-col">
+              <span class="total_cost">{{ element.billing?.report_lines?.length ? (element.cost | localcurrency) : 'N/A' }}</span>
+              <span (click)="element.billing && printCostDetails(element)" class="currency_details"
+                    [ngClass]="{ 'not-allowed' : !element.billing?.report_lines?.length }">
               <i class="material-icons">help_outline</i>
             </span>
-          </td>
+            </td>
 
-          <td class="settings">
+            <td class="settings">
             <span #settings (click)="actions.toggle($event, settings)" class="actions"
-              [ngClass]="{ 'disabled': element.status.toLowerCase() === 'creating'
-              || (element.image === 'docker.dlab-superset' && element.status !== 'running' && element.status !== 'stopped')
-              || (element.image === 'docker.dlab-jupyterlab' && element.status !== 'running' && element.status !== 'stopped') }">
+                  [ngClass]="{ 'disabled': element.status.toLowerCase() === 'creating'
+              || (element.image === 'docker.datalab-superset' && element.status !== 'running' && element.status !== 'stopped')
+              || (element.image === 'docker.datalab-jupyterlab' && element.status !== 'running' && element.status !== 'stopped') }">
             </span>
 
-            <bubble-up #actions class="list-menu" position="bottom-left" alternative="top-left">
-              <ul class="list-unstyled">
-                <div class="active-items" *ngIf="element.status.toLowerCase() !== 'failed'
+              <bubble-up #actions class="list-menu scrolling" position="bottom-left" alternative="top-left">
+                <ul class="list-unstyled" *ngIf="element.shape !== 'odahu cluster'">
+                  <div class="active-items" *ngIf="element.status.toLowerCase() !== 'failed'
                 && element.status !== 'terminating'
                 && element.status !== 'terminated'
                 && element.status !== 'creating image'">
-                  <li
-                    *ngIf="element.status !== 'stopped' && element.status !== 'stopping' && element.status !== 'starting' && element.status !== 'creating image' && element.status.toLowerCase() !== 'reconfiguring'"
-                    matTooltip="Unable to stop notebook because at least one computational resource is in progress"
-                    matTooltipPosition="above" [matTooltipDisabled]="!isResourcesInProgress(element)">
-                    <div (click)="exploratoryAction(element, 'stop')"
-                      [ngClass]="{'not-allowed': isResourcesInProgress(element) }">
-                      <i class="material-icons">pause_circle_outline</i>
-                      <span>Stop</span>
-                    </div>
-                  </li>
-                  <li *ngIf="element.status.toLowerCase() === 'stopped' || element.status.toLowerCase() === 'stopping'"
-                    matTooltip="{{element.edgeNodeStatus !== 'running' ? 'Unable to run notebook if edge node is not running.' : 'Unable to run notebook until it will be stopped.'}}" matTooltipPosition="above"
-                    [matTooltipDisabled]="!isResourcesInProgress(element) && element.status.toLowerCase() !== 'stopping' && element.edgeNodeStatus === 'running'"
-                    [ngClass]="{'not-allow': isResourcesInProgress(element) || element.status.toLowerCase() === 'stopping' || element.edgeNodeStatus !== 'running' }"
-                  >
-                    <div (click)="exploratoryAction(element, 'run')"
-                      [ngClass]="{'not-allowed': isResourcesInProgress(element) || element.status.toLowerCase() === 'stopping' || element.edgeNodeStatus !== 'running' }">
-                      <i class="material-icons">play_circle_outline</i>
-                      <span>Run</span>
-                    </div>
-                  </li>
-                  <li *ngIf="element.status.toLowerCase() === 'running' || element.status.toLowerCase() === 'stopped'"
-                    matTooltip="Unable to terminate notebook because at least one computational resource is in progress"
-                    matTooltipPosition="above" [matTooltipDisabled]="!isResourcesInProgress(element)">
-                    <div (click)="exploratoryAction(element, 'terminate')"
-                      [ngClass]="{'not-allowed': isResourcesInProgress(element) }">
-                      <i class="material-icons">phonelink_off</i>
-                      <span>Terminate</span>
-                    </div>
-                  </li>
-                  <li (click)="exploratoryAction(element, 'deploy')"
-                    *ngIf="element.status === 'running' && element.image !== 'docker.dlab-superset' && element.image !== 'docker.dlab-jupyterlab'">
-                    <i class="material-icons">memory</i>
-                    <span>Add compute</span>
-                  </li>
-                  <li (click)="exploratoryAction(element, 'schedule')" *ngIf="element.status.toLowerCase() === 'running'
+                    <li
+                      *ngIf="element.status !== 'stopped' && element.status !== 'stopping' && element.status !== 'starting' && element.status !== 'creating image' && element.status.toLowerCase() !== 'reconfiguring'"
+                      matTooltip="Unable to stop notebook because at least one compute is in progress"
+                      matTooltipPosition="above" [matTooltipDisabled]="!isResourcesInProgress(element)">
+                      <div (click)="exploratoryAction(element, 'stop')"
+                           [ngClass]="{'not-allowed': isResourcesInProgress(element) }">
+                        <i class="material-icons">pause_circle_outline</i>
+                        <span>Stop</span>
+                      </div>
+                    </li>
+                    <li *ngIf="element.status.toLowerCase() === 'stopped' || element.status.toLowerCase() === 'stopping'"
+                        matTooltip="{{element.edgeNodeStatus !== 'running' ? 'Unable to run notebook if edge node is not running.' : 'Unable to run notebook until it will be stopped.'}}" matTooltipPosition="above"
+                        [matTooltipDisabled]="!isResourcesInProgress(element) && element.status.toLowerCase() !== 'stopping' && element.edgeNodeStatus === 'running'"
+                        [ngClass]="{'not-allow': isResourcesInProgress(element) || element.status.toLowerCase() === 'stopping' || element.edgeNodeStatus !== 'running' }"
+                    >
+                      <div (click)="exploratoryAction(element, 'run')"
+                           [ngClass]="{'not-allowed': isResourcesInProgress(element) || element.status.toLowerCase() === 'stopping' || element.edgeNodeStatus !== 'running' }">
+                        <i class="material-icons">play_circle_outline</i>
+                        <span>Run</span>
+                      </div>
+                    </li>
+                    <li *ngIf="element.status.toLowerCase() === 'running' || element.status.toLowerCase() === 'stopped'"
+                        matTooltip="Unable to terminate notebook because at least one compute is in progress"
+                        matTooltipPosition="above" [matTooltipDisabled]="!isResourcesInProgress(element)">
+                      <div (click)="exploratoryAction(element, 'terminate')"
+                           [ngClass]="{'not-allowed': isResourcesInProgress(element) }">
+                        <i class="material-icons">phonelink_off</i>
+                        <span>Terminate</span>
+                      </div>
+                    </li>
+                    <li
+                      *ngIf="element.status === 'running' && element.image !== 'docker.datalab-superset' && element.image !== 'docker.datalab-jupyterlab'"
+                      matTooltip="Only one compute can be associated with analytical tool at a time"
+                      matTooltipPosition="above" [matTooltipDisabled]="!element.activeCompute"
+                      [matTooltipClass]="'full-size-tooltip'"
+                      [ngClass]="{'not-allow': element.activeCompute }"
+                    >
+                      <div
+                        (click)="exploratoryAction(element, 'deploy')"
+                        [ngClass]="{'not-allowed': element.activeCompute }"
+                      >
+                        <i class="material-icons">memory</i>
+                        <span>Add compute</span>
+                      </div>
+                    </li>
+                    <li (click)="exploratoryAction(element, 'schedule')" *ngIf="element.status.toLowerCase() === 'running'
                 || element.status.toLowerCase() === 'stopped'">
-                    <i class="material-icons">schedule</i>
-                    <span>Scheduler</span>
+                      <div>
+                        <i class="material-icons">schedule</i>
+                        <span>Scheduler</span>
+                      </div>
+                    </li>
+                  </div>
+                  <li (click)="exploratoryAction(element, 'ami')"
+                      *ngIf="element.status === 'running'  && element.image !== 'docker.datalab-superset' && element.image !== 'docker.datalab-jupyterlab'">
+                    <div>
+                      <i class="material-icons">view_module</i>
+                      <span>Create AMI</span>
+                    </div>
                   </li>
-                </div>
-                <li (click)="exploratoryAction(element, 'ami')"
-                  *ngIf="element.status === 'running' && element.cloud_provider !== 'gcp' && element.image !== 'docker.dlab-superset' && element.image !== 'docker.dlab-jupyterlab'">
-                  <i class="material-icons">view_module</i>
-                  <span>Create {{ DICTIONARY[element.cloud_provider].image }}</span>
-                </li>
-                <li (click)="exploratoryAction(element, 'install')"
-                  *ngIf="element.image !== 'docker.dlab-superset' && element.image !== 'docker.dlab-jupyterlab'">
-                  <i class="material-icons">developer_board</i>
-                  <span>Manage libraries</span>
-                </li>
-                <li *ngIf="element.status === 'running'">
-                  <a target="_blank" [attr.href]="'/#/terminal/' + element.private_ip + '/' + element.endpoint"
-                    class="navigate">
-                    <i class="material-icons">laptop</i>
-                    <span>Open terminal</span>
-                  </a>
-                </li>
-              </ul>
-            </bubble-up>
-          </td>
-        </tr>
-      </td>
-    </ng-container>
+                  <li (click)="exploratoryAction(element, 'install')"
+                      *ngIf="element.image !== 'docker.datalab-superset' && element.image !== 'docker.datalab-jupyterlab'">
+                    <div>
+                      <i class="material-icons">developer_board</i>
+                      <span>Manage libraries</span>
+                    </div>
+                  </li>
+                  <li *ngIf="element.status === 'running'" (click)="logAction(element.name)">
+                    <div>
+                      <a
+                        target="_blank"
+                        [attr.href]="'/#/terminal/' + element.private_ip + '/' + element.endpoint"
+                        class="navigate"
+                        (contextmenu)="false"
+                      >
+                        <i class="material-icons">laptop</i>
+                        <span>Open terminal</span>
+                      </a>
+                    </div>
+                  </li>
+                </ul>
+                <ul class="list-unstyled" *ngIf="element.shape === 'odahu cluster'">
+                  <li class="project-seting-item" *ngIf="element.status === 'stopped'" (click)="odahuAction(element, 'start')">
+                    <div>
+                      <i class="material-icons">play_circle_outline</i>
+                      <a class="action">
+                        Start
+                      </a>
+                    </div>
+                  </li>
+                  <li class="project-seting-item" *ngIf="element.status === 'running'" (click)="odahuAction(element, 'stop')">
+                    <div>
+                      <i class="material-icons">pause_circle_outline</i>
+                      <a class="action" >
+                        Stop
+                      </a>
+                    </div>
+                  </li>
+                  <li class="project-seting-item"
+                      [ngClass]="{'disabled': element.status === 'stopped' || element.status.toLowerCase() === 'stopping' || element.status.toLowerCase() === 'starting'}"
+                      *ngIf="element.status === element.status !== 'terminated' && element.status !== 'terminating'" (click)="odahuAction(element, 'terminate')"
+                  >
+                    <div>
+                      <i class="material-icons">phonelink_off</i>
+                      <a class="action">
+                        Terminate
+                      </a>
+                    </div>
+                  </li>
+                </ul>
+              </bubble-up>
+            </td>
+          </tr>
+        </td>
+      </ng-container>
+      
+      <!-- FILTER START -->
+      <ng-container matColumnDef="name-filter" sticky>
+        <th mat-header-cell *matHeaderCellDef class="name-col filter-row-item ">
+          <div class="input-wrapper">
+            <input placeholder="Filter by environment name" type="text" class="form-control filter-field"
+                   [value]="filterForm.name" (input)="onFilterNameUpdate($event.target['value'])"/>
+          </div>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="status-filter">
+        <th mat-header-cell *matHeaderCellDef class="status-col filter-row-item">
+          <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'statuses'"
+                                 [items]="filterConfiguration.statuses" [model]="filterForm.statuses"></multi-select-dropdown>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="shape-filter">
+        <th mat-header-cell *matHeaderCellDef class="shape-col filter-row-item">
+          <multi-select-dropdown (selectionChange)="onUpdate($event)"
+                                 [type]="'sizes'" [items]="filterConfiguration.shapes"
+                                 [model]="filterForm.shapes"></multi-select-dropdown>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="tag-filter">
+        <th mat-header-cell *matHeaderCellDef class="tag-col filter-row-item">
 
-    <!-- FILTER START -->
-    <ng-container matColumnDef="name-filter" sticky>
-      <th mat-header-cell *matHeaderCellDef class="name-col filter-row-item">
-        <input placeholder="Filter by environment name" type="text" class="form-control filter-field"
-          [value]="filterForm.name" (input)="filterForm.name = $event.target['value']" />
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="status-filter">
-      <th mat-header-cell *matHeaderCellDef class="status-col filter-row-item">
-        <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'statuses'"
-          [items]="filterConfiguration.statuses" [model]="filterForm.statuses"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="shape-filter">
-      <th mat-header-cell *matHeaderCellDef class="shape-col filter-row-item">
-        <multi-select-dropdown (selectionChange)="onUpdate($event)"
-          [type]="'sizes'" [items]="filterConfiguration.shapes"
-          [model]="filterForm.shapes"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="tag-filter">
-      <th mat-header-cell *matHeaderCellDef class="tag-col filter-row-item">
 
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="resource-filter">
-      <th mat-header-cell *matHeaderCellDef class="resources-col filter-row-item">
-        <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'resources'"
-          [items]="filterConfiguration.resources" [model]="filterForm.resources"></multi-select-dropdown>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="cost-filter">
-      <th mat-header-cell *matHeaderCellDef class="cost-col filter-row-item">
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="resource-filter">
+        <th mat-header-cell *matHeaderCellDef class="resources-col filter-row-item">
+          <multi-select-dropdown (selectionChange)="onUpdate($event)" [type]="'resources'"
+                                 [items]="filterConfiguration.resources" [model]="filterForm.resources"></multi-select-dropdown>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="cost-filter">
+        <th mat-header-cell *matHeaderCellDef class="cost-col filter-row-item">
 
-      </th>
-    </ng-container>
+        </th>
+      </ng-container>
 
-    <ng-container matColumnDef="action-filter" stickyEnd>
-      <th mat-header-cell *matHeaderCellDef>
-        <div class="actions">
-          <button mat-icon-button class="btn reset" (click)="resetFilterConfigurations()" [disabled]="filteredEnvironments.length == 0 && !filtering">
-            <i class="material-icons">close</i>
-          </button>
+      <ng-container matColumnDef="action-filter" stickyEnd>
+        <th mat-header-cell *matHeaderCellDef>
+          <div class="actions">
+            <button mat-icon-button class="btn reset" (click)="resetFilterConfigurations()" [disabled]="!isFilterSelected">
+              <i class="material-icons">close</i>
+            </button>
 
-          <button mat-icon-button class="btn apply" (click)="applyFilter_btnClick(filterForm)"
-            [disabled]="filteredEnvironments.length == 0 && !filtering">
-            <i class="material-icons">done</i>
-          </button>
-        </div>
-      </th>
-    </ng-container>
-    <ng-container matColumnDef="placeholder">
-      <td mat-footer-cell *matFooterCellDef
-        [colSpan]="!healthStatus?.billingEnabled ? displayedFilterColumns.length -1 : displayedFilterColumns.length"
-        class="info">
+            <button mat-icon-button class="btn apply" (click)="applyFilter_btnClick(filterForm)"
+                    [disabled]="!isFilterChanged">
+              <i class="material-icons">done</i>
+            </button>
+          </div>
+        </th>
+      </ng-container>
+      <ng-container matColumnDef="placeholder">
+        <td mat-footer-cell *matFooterCellDef
+            [colSpan]="!healthStatus?.billingEnabled ? displayedFilterColumns.length -1 : displayedFilterColumns.length"
+            class="info">
         <span *ngIf="(!filteredEnvironments) && !filtering || (filteredEnvironments.length == 0) && !filtering">
           To start working, please, create new environment</span>
-        <span *ngIf="(filteredEnvironments.length == 0) && filtering">No matches found</span>
-      </td>
-    </ng-container>
+          <span *ngIf="(filteredEnvironments.length == 0) && filtering">No matches found</span>
+        </td>
+      </ng-container>
 
-    <!-- FILTER END -->
+      <!-- FILTER END -->
 
-    <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true" class="header-row"></tr>
+      <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true" class="header-row"></tr>
 
-    <tr [hidden]="!collapseFilterRow" mat-header-row *matHeaderRowDef="displayedFilterColumns; sticky: true"
-      class="filter-row"></tr>
+      <tr [hidden]="!collapseFilterRow" mat-header-row *matHeaderRowDef="displayedFilterColumns; sticky: true"
+          class="filter-row"></tr>
 
-    <tr mat-row *matRowDef="let element; columns: ['project']" class="element-row"
-      [class.expanded-row]="expandedElement === element"
-      (click)="expandedElement = expandedElement === element ? null : element">
-    </tr>
-    <tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="detail-row"></tr>
+      <tr mat-row *matRowDef="let element; columns: ['project']" class="element-row">
+        <!--      [class.expanded-row]="expandedElement === element"-->
+        <!--      (click)="expandedElement = expandedElement === element ? null : element">-->
+      </tr>
+      <tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="detail-row"></tr>
 
-    <tr [hidden]="filteredEnvironments?.length" mat-footer-row *matFooterRowDef="['placeholder']"></tr>
-  </table>
+      <tr [hidden]="filteredEnvironments?.length" mat-footer-row *matFooterRowDef="['placeholder']"></tr>
+    </table>
+  </div>
 </section>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.scss
index d6c0556..3b01abe 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.scss
@@ -17,29 +17,55 @@
  * under the License.
  */
 
+@import "variables";
+
 .data-table {
   width: 100%;
 }
 
-table {
+.resources-wrapper{
+  height: calc(100vh - 105px);
+  overflow: hidden;
+  margin:  -15px;
+  padding: 15px;
+  .table-wrapper{
+    overflow: auto;
+    height: calc(100vh - 115px);
+    margin:  0 -15px -15px -15px;
+    padding: 0 15px 15px 15px;
+  }
+}
+
+table.resources {
   width: 100%;
+  max-height: 100%;
 
   .header-row {
     position: sticky;
     background-clip:padding-box;
+    z-index: 1;
     th {
       padding: 5px;
+      padding-left: 20px;
+
+      .mat-icon-button{
+        line-height: 45px;
+      }
     }
 
     .label {
       display: inline-block;
-      padding-top: 10px;
+      padding-top: 14px;
       vertical-align: super !important;
-      padding-left: 5px;
-      font-size: 12px;
+      font-size: 13px;
     }
   }
 
+  .filter-field{
+    font-size: 13px;
+    padding-left: 10px;
+  }
+
   .exploratory {
     padding: 0;
 
@@ -50,18 +76,26 @@
 
       td {
         padding: 5px;
+        padding-left: 20px;
+        display: flex;
+        align-items: center;
 
         &.name-col {
-          padding-right: 5px;
-          padding-left: 24px;
-          cursor: pointer;
+          padding-left: 21px;
           overflow: hidden;
-          text-overflow: ellipsis;
+          span{
+            cursor: pointer;
+          }
+        }
+
+        &.shape-col{
+          align-items: start;
+          flex-direction: column;
+          justify-content: center;
         }
 
         &.resources-col {
           overflow: hidden;
-          text-overflow: ellipsis;
         }
       }
     }
@@ -78,12 +112,13 @@
   }
 
   .filter-row {
-    height: 0 !important;
     background-clip:padding-box;
 
     th {
       padding: 5px;
       background-clip: padding-box;
+
+
       &:last-child {
         padding-right: 6px;
       }
@@ -91,32 +126,38 @@
   }
 
   .name-col {
-    width: 18%;
+    width: 17%;
     padding-right: 5px;
     padding-left: 24px;
     background-color: inherit;
-    .label{
-      padding-top: 14px;
-    }
   }
 
+  .project-name{
+    font-weight: 600;
+    color: #577289;
+    padding-left: 21px;
+  }
+
+
   .status-col,
   .shape-col {
-    width: 14%;
+    width: 11%;
+  }
+  .shape-col{
+    color: #577289;
     .label{
-      padding-top: 14px;
+      color: $table-header-color;
     }
   }
 
   .tag-col {
-    width: 10%;
+    width: 13%;
 
     mat-chip {
       min-height: 20px;
       padding: 5px 10px;
       font-size: 13px;
       max-width: 110px !important;
-      text-overflow: ellipsis;
       white-space: nowrap;
       display: inline-block;
       line-height: 10px;
@@ -125,158 +166,203 @@
   }
 
   .resources-col {
-    width: 28%;
-    .label{
-      padding-top: 14px;
-    }
+    width: 30%;
   }
 
   .cost-col {
-    width: 10%;
-    text-align: center;
+    width: 12%;
+    justify-content: space-between;
+  }
+
+  .label-header{
+    &.cost-col{
+      z-index: 6 !important;
+    }
+
+    &.status-col{
+      z-index: 10 !important;
+    }
+
+    &.resources-col {
+      z-index: 7 !important;
+    }
+
+    &.tag-col {
+      z-index: 8 !important;
+    }
+
+    &.shape-col {
+      z-index: 9 !important;
+    }
+
+    &.settings {
+      z-index: 5 !important;
+    }
   }
 
   .actions-col {
-    width: 10%;
     padding-right: 24px;
     text-align: right;
     background-color: inherit;
+    z-index: 5 !important;
     .label{
       padding-right: 5px;
     }
   }
-}
+  tr.detail-row {
+    height: 0;
+  }
+  
+  .element-diagram {
+    min-width: 80px;
+    border: 2px solid black;
+    padding: 8px;
+    font-weight: lighter;
+    margin: 8px 0;
+    height: 104px;
+  }
 
-tr.detail-row {
-  height: 0;
-}
+  .element-symbol {
+    font-weight: bold;
+    font-size: 40px;
+    line-height: normal;
+  }
 
+  .element-description {
+    padding: 16px;
+  }
 
-.element-diagram {
-  min-width: 80px;
-  border: 2px solid black;
-  padding: 8px;
-  font-weight: lighter;
-  margin: 8px 0;
-  height: 104px;
-}
-
-.element-symbol {
-  font-weight: bold;
-  font-size: 40px;
-  line-height: normal;
-}
-
-.element-description {
-  padding: 16px;
-}
-
-.element-description-attribution {
-  opacity: 0.5;
-}
+  .element-description-attribution {
+    opacity: 0.5;
+  }
 
 
 
-.dashboard_table {
-  width: 100%;
-  table-layout: fixed;
-}
+  .dashboard_table {
+    width: 100%;
+    table-layout: fixed;
+  }
 
 
 
-.dashboard_table tr {
-  vertical-align: top;
-}
+  .dashboard_table tr {
+    vertical-align: top;
+  }
 
-.dashboard_table tr th span {
-  width: 50px;
-  text-align: center;
-  height: 100%;
-  line-height: 40px;
-}
+  .dashboard_table tr th span {
+    width: 50px;
+    text-align: center;
+    height: 100%;
+    line-height: 40px;
+  }
 
-.dashboard_table tr td {
-  font-size: 14px;
-  padding: 20px 15px 16px;
-}
+  .dashboard_table tr td {
+    font-size: 13px;
+    padding: 20px 15px 16px;
+  }
 
-.dashboard_table tr td,
-.dashboard_table tr th {
-  border: 1px solid #d5dfea;
-  text-align: left;
-}
+  .dashboard_table tr td,
+  .dashboard_table tr th {
+    border: 1px solid #d5dfea;
+    text-align: left;
+  }
 
-.dashboard_table tr td:last-child {
-  text-align: center;
-}
+  .dashboard_table tr td:last-child {
+    text-align: center;
+  }
 
-.dashboard_table_body td:first-child {
-  background: #f3fbfd;
-  color: #455c74;
-  font-weight: 600;
-  font-size: 16px;
-  cursor: pointer;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
+  .dashboard_table_body td:first-child {
+    background: #f3fbfd;
+    color: #455c74;
+    font-weight: 600;
+    font-size: 16px;
+    cursor: pointer;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    &::after{
+      content: '';
+      display: block;
+    }
+  }
 
-.dashboard_table tr:nth-child(2n + 1) {
-  background: #f9fafb;
-}
+  .dashboard_table tr:nth-child(2n + 1) {
+    background: #f9fafb;
+  }
 
-.dashboard_table tr.filter-row td {
-  padding: 10px;
-}
+  .dashboard_table tr.filter-row td {
+    padding: 10px;
+  }
 
-.dashboard_table tr.filter-row td:first-child {
-  font-weight: 400;
-}
+  .dashboard_table tr.filter-row td:first-child {
+    font-weight: 400;
+  }
 
-.dashboard_table tr.filter-row td:last-child {
-  padding: 10px 0;
-}
+  .dashboard_table tr.filter-row td:last-child {
+    padding: 10px 0;
+  }
 
-.filter-row .actions {
-  text-align: right;
-  display: flex;
-  justify-content: flex-end;
-}
+  .dashboard_table tr:nth-child(2n + 1) td:first-child {
+    background: #edf6f9;
+  }
 
-.filter-row .actions button {
-  background: #fff;
-  border-color: #35afd5;
-  color: #35afd5;
-  outline: none;
-}
+  .dashboard_table th {
+    background: #a1b7d1;
+    color: #fff;
+    font-weight: 600;
+    line-height: 40px;
+    text-transform: uppercase;
+    padding-left: 12px;
+    font-size: 13px;
+  }
+  
+  &.data-grid .status-col .status {
+    text-transform: capitalize;
+  }
 
-.filter-row .actions .reset:hover {
-  border-color: #f1696e;
-  background: #f9fafb;
-  color: #f1696e;
-}
+  .message_block td {
+    text-align: left !important;
+  }
 
-.filter-row .actions .apply:hover {
-  border-color: #49af38;
-  background: #f9fafb;
-  color: #49af38;
-}
+  &.data-grid .total_cost {
+    float: left;
+    display: inline-block;
+    color: #455c74;
+  }
 
-.dashboard_table tr:nth-child(2n + 1) td:first-child {
-  background: #edf6f9;
-}
+  .currency_details {
+    display: flex;
+    color: #35afd5;
+    cursor: pointer;
+    transition: all 0.45s ease-in-out;
+    padding-left: 10px;
+  }
 
-.dashboard_table th {
-  background: #a1b7d1;
-  color: #fff;
-  font-weight: 600;
-  line-height: 40px;
-  text-transform: uppercase;
-  padding-left: 12px;
-  font-size: 12px;
-}
+  .currency_details:hover {
+    color: #3392b0;
+  }
 
-.data-grid .status {
-  text-transform: capitalize;
+  .currency_details .material-icons {
+    font-size: 18px;
+  }
+
+  .mat-icon-button .mat-icon,
+  .mat-icon-button i {
+    line-height: 42px;
+    font-size: 18px;
+  }
+
+  .info {
+    padding: 40px;
+    text-align: center;
+  }
+
+  .content-row{
+    background-clip: padding-box;
+  }
+
+  .not-allow{
+    cursor: not-allowed !important;
+  }
 }
 
 .data-grid .list-menu {
@@ -285,15 +371,18 @@
   right: 15px;
   padding: 10px 15px;
   box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
-    0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12);
+  0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12);
   border: none;
   min-width: 190px;
+  max-height: calc(100vh / 2 - 70px);
 }
 
-.settings {
+.settings:not(.label-header) {
   position: relative;
   text-align: right;
-  min-width: 5%;
+  width: 6%;
+  padding-right: 15px !important;
+  justify-content: flex-end;
 
   .actions {
     background-image: url(../../../assets/svg/settings_icon.svg);
@@ -313,13 +402,16 @@
 
 
 .data-grid .list-menu li {
-  font-size: 14px;
+  font-size: 13px;
   border-bottom: 1px solid #edf1f5;
-  padding: 8px 15px;
+  padding-bottom: 5px;
   cursor: pointer;
   margin: 5px -5px;
   color: #577289;
   transition: all 0.45s ease-in-out;
+  div{
+    padding: 8px 15px;
+  }
 }
 
 .data-grid .list-menu a.navigate {
@@ -334,8 +426,8 @@
   vertical-align: bottom;
 }
 
-.data-grid .list-menu li:hover,
-.data-grid .list-menu li:hover a {
+.data-grid .list-menu li:not(.not-allow):hover,
+.data-grid .list-menu li:not(.not-allow):hover a {
   background: none !important;
   color: #36afd5;
 }
@@ -356,46 +448,26 @@
   background: #edf6f9;
 }
 
-.message_block td {
-  text-align: left !important;
+@media screen and (max-width: 1400px) {
+  table.resources {
+    .settings {
+      width: 7%;
+    }
+  }
 }
 
-.data-grid .total_cost {
-  display: inline-block;
-  width: 70%;
-  color: #455c74;
-}
 
-.currency_details {
-  float: right;
-  color: #35afd5;
-  cursor: pointer;
-  transition: all 0.45s ease-in-out;
-}
-
-.currency_details:hover {
-  color: #3392b0;
-}
-
-.currency_details .material-icons {
-  font-size: 18px;
-}
-
-.mat-icon-button .mat-icon,
-.mat-icon-button i {
-  line-height: 42px;
-  font-size: 18px;
-}
 
 .info {
   padding: 40px;
   text-align: center;
 }
 
-.content-row{
-  background-clip: padding-box;
+.odahu-icon{
+  vertical-align: middle;
+  margin-left: 10px;
 }
 
-.not-allow{
-  cursor: not-allowed !important;
+.content-row{
+  background-clip: padding-box;
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts
index 3a7aabd..6173283 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.component.ts
@@ -16,16 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-/* tslint:disable:no-empty */
 
-import {Component, Input, OnInit} from '@angular/core';
+import {Project} from '../../administration/project/project.component';
+import {
+  Component,
+  EventEmitter,
+  Input,
+  OnInit,
+  Output
+} from '@angular/core';
 import { animate, state, style, transition, trigger } from '@angular/animations';
 import { ToastrService } from 'ngx-toastr';
 import { MatDialog } from '@angular/material/dialog';
-
-import { UserResourceService } from '../../core/services';
-
-import { ExploratoryModel, Exploratory } from './resources-grid.model';
+import {ProjectService, UserResourceService, OdahuDeploymentService} from '../../core/services';
+import { ExploratoryModel } from './resources-grid.model';
 import { FilterConfigurationModel } from './filter-configuration.model';
 import { GeneralEnvironmentStatus } from '../../administration/management/management.model';
 import { ConfirmationDialogType } from '../../shared';
@@ -37,14 +41,47 @@
 import { CostDetailsDialogComponent } from '../exploratory/cost-details-dialog';
 import { ConfirmationDialogComponent } from '../../shared/modal-dialog/confirmation-dialog';
 import { SchedulerComponent } from '../scheduler';
-
 import { DICTIONARY } from '../../../dictionary/global.dictionary';
 import {ProgressBarService} from '../../core/services/progress-bar.service';
 import {ComputationModel} from '../computational/computational-resource.model';
 import {NotebookModel} from '../exploratory/notebook.model';
+import {AuditService} from '../../core/services/audit.service';
+import {CompareUtils} from '../../core/util/compareUtils';
+import {timer} from 'rxjs';
+import {OdahuActionDialogComponent} from '../../shared/modal-dialog/odahu-action-dialog';
 
+export interface SharedEndpoint {
+  edge_node_ip: string;
+  shared_bucket_name?: string | null;
+  shared_container_name?: string | null;
+  status: string;
+  user_own_bucket_name?: string | null;
+  user_container_name?: string | null;
+  user_own_bicket_name?: string | null;
+  shared_storage_account_name?: string | null;
+  user_storage_account_name?: string | null;
+}
 
+export interface ProjectEndpoint {
+  account: string;
+  cloudProvider: string;
+  endpoint_tag: string;
+  name: string;
+  status: string;
+  url: string;
+}
 
+export interface BucketList {
+  name: string;
+  children: Bucket[];
+  length?: number;
+  cloud: string;
+}
+
+export interface Bucket {
+  name: string;
+  endpoint: string;
+}
 
 
 @Component({
@@ -64,18 +101,18 @@
   readonly DICTIONARY = DICTIONARY;
 
   @Input() projects: Array<any>;
+  @Output() getEnvironments: EventEmitter<any> = new EventEmitter();
 
-  environments: Exploratory[];
+  public environments;
+  public collapseFilterRow: boolean = false;
+  public filtering: boolean = false;
+  public activeFiltering: boolean = false;
+  public activeProject: any;
+  public healthStatus: GeneralEnvironmentStatus;
+  public filteredEnvironments = [];
+  public filterConfiguration: FilterConfigurationModel = new FilterConfigurationModel('', [], [], [], '', '');
+  public filterForm: FilterConfigurationModel = new FilterConfigurationModel('', [], [], [], '', '');
 
-  collapseFilterRow: boolean = false;
-  filtering: boolean = false;
-  activeFiltering: boolean = false;
-  activeProject: any;
-  healthStatus: GeneralEnvironmentStatus;
-
-  filteredEnvironments: Exploratory[] = [];
-  filterConfiguration: FilterConfigurationModel = new FilterConfigurationModel('', [], [], [], '', '');
-  filterForm: FilterConfigurationModel = new FilterConfigurationModel('', [], [], [], '', '');
 
   public filteringColumns: Array<any> = [
     { title: 'Environment name', name: 'name', class: 'name-col', filter_class: 'name-filter', filtering: true },
@@ -89,40 +126,62 @@
 
   public displayedColumns: string[] = this.filteringColumns.map(item => item.name);
   public displayedFilterColumns: string[] = this.filteringColumns.map(item => item.filter_class);
-
+  public bucketsList: BucketList;
+  public activeProjectsList: any;
+  public isFilterChanged: boolean;
+  public isFilterSelected: boolean;
+  private cashedFilterForm: FilterConfigurationModel;
 
   constructor(
     public toastr: ToastrService,
     private userResourceService: UserResourceService,
     private dialog: MatDialog,
     private progressBarService: ProgressBarService,
+    private projectService: ProjectService,
+    private auditService: AuditService,
+    private odahuDeploymentService: OdahuDeploymentService,
   ) { }
 
   ngOnInit(): void {
     this.buildGrid();
+    this.getUserProjects();
+  }
+
+  public getUserProjects() {
+    this.projectService.getUserProjectsList(true).subscribe((projects: Project[]) => {
+      this.activeProjectsList = projects;
+    });
   }
 
   public buildGrid(): void {
-    setTimeout(() => {this.progressBarService.startProgressBar(); } , 0);
+    this.progressBarService.startProgressBar();
     this.userResourceService.getUserProvisionedResources()
       .subscribe((result: any) => {
         this.environments = ExploratoryModel.loadEnvironments(result);
+        this.getEnvironments.emit(this.environments);
+        this.getBuckets();
         this.getDefaultFilterConfiguration();
         (this.environments.length) ? this.getUserPreferences() : this.filteredEnvironments = [];
         this.healthStatus && !this.healthStatus.billingEnabled && this.modifyGrid();
         this.progressBarService.stopProgressBar();
-      }, () => this.progressBarService.stopProgressBar());
+        }, () => this.progressBarService.stopProgressBar());
   }
 
   public toggleFilterRow(): void {
     this.collapseFilterRow = !this.collapseFilterRow;
   }
 
-  public onUpdate($event) {
+  public onUpdate($event): void {
     this.filterForm[$event.type] = $event.model;
+    this.checkFilters();
   }
 
-  public selectActiveProject(project = '') {
+  private checkFilters() {
+    this.isFilterChanged = !CompareUtils.compareFilters(this.filterForm, this.cashedFilterForm);
+    this.isFilterSelected = Object.keys(this.filterForm).some(v => this.filterForm[v].length > 0);
+  }
+
+  public selectActiveProject(project = ''): void {
     this.filterForm.project = project;
     this.applyFilter_btnClick(this.filterForm);
   }
@@ -142,7 +201,7 @@
    }
 
 
-  public isResourcesInProgress(notebook) {
+  public isResourcesInProgress(notebook): boolean {
     const env = this.getResourceByName(notebook.name, notebook.project);
 
     if (env && env.resources.length) {
@@ -168,7 +227,15 @@
   }
 
   public printDetailEnvironmentModal(data): void {
-    this.dialog.open(DetailDialogComponent, { data: data, panelClass: 'modal-lg' })
+    this.dialog.open(DetailDialogComponent, { data:
+        {notebook: data, bucketStatus: this.healthStatus.bucketBrowser, buckets: this.bucketsList, type: 'resource'},
+      panelClass: 'modal-lg'
+    })
+      .afterClosed().subscribe(() => this.buildGrid());
+  }
+
+  public printDetailOdahuModal(data): void {
+    this.dialog.open(DetailDialogComponent, { data: {odahu: data}, panelClass: 'modal-lg' })
       .afterClosed().subscribe(() => this.buildGrid());
   }
 
@@ -177,12 +244,13 @@
       .afterClosed().subscribe(() => this.buildGrid());
   }
 
-  public exploratoryAction(data, action: string) {
+  public exploratoryAction(data, action: string): void {
     const resource = this.getResourceByName(data.name, data.project);
-
     if (action === 'deploy') {
       this.dialog.open(ComputationalResourceCreateDialogComponent, { data: { notebook: resource, full_list: this.environments }, panelClass: 'modal-xxl' })
-        .afterClosed().subscribe(() => this.buildGrid());
+        .afterClosed().subscribe((res) => {
+        res && this.buildGrid();
+      });
     } else if (action === 'run') {
       this.userResourceService
         .runExploratoryEnvironment({ notebook_instance_name: data.name, project_name: data.project })
@@ -190,25 +258,62 @@
           () => this.buildGrid(),
           error => this.toastr.error(error.message || 'Exploratory starting failed!', 'Oops!'));
     } else if (action === 'stop') {
-      this.dialog.open(ConfirmationDialogComponent, { data: { notebook: data, type: ConfirmationDialogType.StopExploratory }, panelClass: 'modal-sm' })
-        .afterClosed().subscribe(() => this.buildGrid());
+      const compute =  data.resources.filter(cluster => cluster.status === 'running');
+      this.dialog.open(ConfirmationDialogComponent,
+        { data: { notebook: data, compute, type: ConfirmationDialogType.StopExploratory }, panelClass: 'modal-sm' })
+        .afterClosed().subscribe((res) => {
+        res && this.buildGrid();
+      });
     } else if (action === 'terminate') {
+      const compute =  data.resources.filter(cluster => cluster.status === 'running' || cluster.status === 'stopped');
       this.dialog.open(ConfirmationDialogComponent, { data:
-          { notebook: data, type: ConfirmationDialogType.TerminateExploratory }, panelClass: 'modal-sm' })
-        .afterClosed().subscribe(() => this.buildGrid());
+          { notebook: data, compute, type: ConfirmationDialogType.TerminateExploratory }, panelClass: 'modal-sm' })
+        .afterClosed().subscribe((res) => res && this.buildGrid());
     } else if (action === 'install') {
       this.dialog.open(InstallLibrariesComponent, { data: data, panelClass: 'modal-fullscreen' })
-        .afterClosed().subscribe(() => this.buildGrid());
+        .afterClosed().subscribe((res) => res && this.buildGrid());
     } else if (action === 'schedule') {
       this.dialog.open(SchedulerComponent, { data: { notebook: data, type: 'EXPLORATORY' }, panelClass: 'modal-xl-s' })
-        .afterClosed().subscribe(() => this.buildGrid());
+        .afterClosed().subscribe((res) => res && this.buildGrid());
     } else if (action === 'ami') {
       this.dialog.open(AmiCreateDialogComponent, { data: data, panelClass: 'modal-sm' })
-
-        .afterClosed().subscribe(() => this.buildGrid());
+        .afterClosed().subscribe((res) => res && this.buildGrid());
     }
   }
 
+  public getBuckets(): void {
+    const bucketsList = [];
+    this.environments.forEach(project => {
+      if (project.endpoints && project.endpoints.length !== 0) {
+        project.endpoints.forEach((endpoint: ProjectEndpoint) => {
+          if (endpoint.status === 'ACTIVE') {
+            const currEndpoint: SharedEndpoint = project.projectEndpoints[endpoint.name];
+            const edgeItem: BucketList = {name: `${project.project} (${endpoint.name})`, children: [], cloud: endpoint.cloudProvider};
+            let projectBucket: string = currEndpoint.user_own_bicket_name
+              || currEndpoint.user_own_bucket_name;
+            if (currEndpoint.user_container_name) {
+              projectBucket = currEndpoint.user_storage_account_name + '.' + currEndpoint.user_container_name;
+            }
+            let sharedBucket: string = currEndpoint.shared_bucket_name;
+            if (currEndpoint.shared_container_name) {
+              sharedBucket = currEndpoint.shared_storage_account_name + '.' + currEndpoint.shared_container_name;
+            }
+            if (projectBucket && currEndpoint.status !== 'terminated'
+              && currEndpoint.status !== 'terminating' && currEndpoint.status !== 'failed') {
+              edgeItem.children.push({name: projectBucket, endpoint: endpoint.name});
+            }
+            if (sharedBucket) {
+              edgeItem.children.push({name: sharedBucket, endpoint: endpoint.name});
+            }
+            bucketsList.push(edgeItem);
+          }
+        });
+      }
+    });
+
+    this.bucketsList = SortUtils.flatDeep(bucketsList, 1).filter(v => v.children.length);
+  }
+
 
   // PRIVATE
   private getResourceByName(notebook_name: string, project_name: string) {
@@ -222,7 +327,7 @@
   }
 
   private getDefaultFilterConfiguration(): void {
-    const data: Exploratory[] = this.environments;
+    const data = this.environments;
     const shapes = [], statuses = [], resources = [];
 
     data.filter(elem => elem.exploratory.map((item: any) => {
@@ -239,15 +344,19 @@
     this.filterConfiguration = new FilterConfigurationModel('', statuses, shapes, resources, '', '');
   }
 
-  private applyFilter_btnClick(config: FilterConfigurationModel) {
-
+  public applyFilter_btnClick(config: FilterConfigurationModel): void {
+    const cached = this.loadUserPreferences(config);
+    this.cashedFilterForm = JSON.parse(JSON.stringify(cached));
+    Object.setPrototypeOf(this.cashedFilterForm, Object.getPrototypeOf(cached));
     let filteredData = this.getEnvironmentsListCopy();
-
+    this.checkFilters();
     const containsStatus = (list, selectedItems) => {
       return list.filter((item: any) => { if (selectedItems.indexOf(item.status) !== -1) return item; });
     };
 
-    if (filteredData.length) this.filtering = true;
+    if (filteredData.some((v) => v.exploratory.length)) {
+      this.filtering = true;
+    }
     if (config) {
       this.activeProject = config.project;
       filteredData = filteredData
@@ -312,12 +421,12 @@
     this.displayedFilterColumns = this.displayedFilterColumns.filter(el => el !== 'cost-filter');
   }
 
-  private aliveStatuses(сonfig): void {
+  private aliveStatuses(config): void {
     for (const index in this.filterConfiguration) {
-      if (сonfig[index] && сonfig[index] instanceof Array)
-        сonfig[index] = сonfig[index].filter(item => this.filterConfiguration[index].includes(item));
+      if (config[index] && config[index] instanceof Array)
+        config[index] = config[index].filter(item => this.filterConfiguration[index].includes(item));
     }
-    return сonfig;
+    return config;
   }
 
   isActiveFilter(filterConfig): void {
@@ -335,6 +444,7 @@
           this.filterForm = this.loadUserPreferences(result.type ? this.filterActiveInstances() : this.aliveStatuses(result));
         }
         this.applyFilter_btnClick(result || this.filterForm);
+        this.checkFilters();
       }, () => this.applyFilter_btnClick(null));
   }
 
@@ -344,7 +454,33 @@
 
   private updateUserPreferences(filterConfiguration: FilterConfigurationModel): void {
     this.userResourceService.updateUserPreferences(filterConfiguration)
-      .subscribe((result) => { },
+      .subscribe(() => { },
         (error) => console.log('UPDATE USER PREFERENCES ERROR ', error));
   }
+
+  private odahuAction(element: any, action: string) {
+    this.dialog.open(OdahuActionDialogComponent, {data: {type: action, item: element}, panelClass: 'modal-sm'})
+      .afterClosed().subscribe(result => {
+        result && this.odahuDeploymentService.odahuAction(element,  action).subscribe(v =>
+            this.buildGrid(),
+          error => this.toastr.error(`Odahu cluster ${action} failed!`, 'Oops!')
+        ) ;
+      }, error => this.toastr.error(error.message || `Odahu cluster ${action} failed!`, 'Oops!')
+    );
+  }
+
+  public logAction(name) {
+    this.auditService.sendDataToAudit({
+      resource_name: name, info: `Open terminal, requested for notebook`, type: 'WEB_TERMINAL'
+    }).subscribe();
+  }
+
+  public trackBy(index, item) {
+    return null;
+  }
+
+  public onFilterNameUpdate(targetElement: any) {
+    this.filterForm.name = targetElement;
+    this.checkFilters();
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts
index e769dbe..4da8818 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources-grid/resources-grid.model.ts
@@ -50,56 +50,106 @@
     public project: string,
     public endpoint: string,
     public tags: any,
-    public edgeNodeStatus: string
+    public edgeNodeStatus: string,
+    public activeCompute: boolean,
+    public gpu_type?: string,
+    public gpu_count?: string
   ) { }
 
   public static loadEnvironments(data: Array<any>) {
     if (data) {
+
       return data.map((value) => {
+        const exploratory = value.exploratory.map(el => {
+          const provider = el.cloud_provider.toLowerCase();
+          const billing = value.exploratoryBilling.filter(res => res.name === el.exploratory_name)[0];
+          return new ExploratoryModel(
+            provider,
+            el.exploratory_name,
+            el.template_name,
+            el.image,
+            el.status,
+            el.shape,
+            el.computational_resources,
+            el.up_time,
+            el.exploratory_url,
+            value.shared[el.endpoint].edge_node_ip,
+            el.private_ip,
+            el.exploratory_user,
+            el.exploratory_pass,
+            value.shared[el.endpoint][DICTIONARY[provider].bucket_name],
+            value.shared[el.endpoint][DICTIONARY[provider].shared_bucket_name],
+            el.error_message,
+            billing ? billing.total_cost : '',
+            billing ? billing.currency : '',
+            billing,
+            el.libs,
+            value.shared[el.endpoint][DICTIONARY[provider].user_storage_account_name],
+            value.shared[el.endpoint][DICTIONARY[provider].shared_storage_account_name],
+            value.shared[el.endpoint][DICTIONARY[provider].datalake_name],
+            value.shared[el.endpoint][DICTIONARY[provider].datalake_user_directory_name],
+            value.shared[el.endpoint][DICTIONARY[provider].datalake_shared_directory_name],
+            el.project,
+            el.endpoint,
+            el.tags,
+            value.shared[el.endpoint].status,
+            !!el.computational_resources.filter(resource => resource.status !== 'terminated' && resource.status !== 'failed').length
+          );
+        });
+
+        const odahu = value.odahu.map(el => {
+          let provider;
+          if (el.cloud_provider) {
+            provider = el.cloud_provider.toLowerCase();
+          } else {
+            provider = 'azure';
+          }
+          return new ExploratoryModel(
+            provider,
+            el.name,
+            el.template_name,
+            el.image,
+            el.status.toLowerCase(),
+            'odahu cluster',
+            [],
+            el.up_time,
+            el.urls,
+            value.shared[el.endpoint].edge_node_ip,
+            el.private_ip,
+            el.exploratory_user,
+            el.exploratory_pass,
+            el.grafana_admin,
+            el.grafana_pass,
+            el.error_message,
+            el[DICTIONARY[provider].billing.cost],
+            el[DICTIONARY[provider].billing.currencyCode],
+            [],
+            [],
+            '',
+            '',
+            '',
+            '',
+            '',
+            el.project,
+            el.endpoint,
+            el.tags,
+            '',
+            false,
+          ); });
         return {
           project: value.project,
-          exploratory: value.exploratory.map(el => {
-            const provider = el.cloud_provider.toLowerCase();
-            const billing = value.exploratoryBilling.filter(res => res.name === el.exploratory_name)[0];
-            return new ExploratoryModel(
-              provider,
-              el.exploratory_name,
-              el.template_name,
-              el.image,
-              el.status,
-              el.shape,
-              el.computational_resources,
-              el.up_time,
-              el.exploratory_url,
-              value.shared[el.endpoint].edge_node_ip,
-              el.private_ip,
-              el.exploratory_user,
-              el.exploratory_pass,
-              value.shared[el.endpoint][DICTIONARY[provider].bucket_name],
-              value.shared[el.endpoint][DICTIONARY[provider].shared_bucket_name],
-              el.error_message,
-              billing ? billing.total_cost : '',
-              billing ? billing.currency : '',
-              billing,
-              el.libs,
-              value.shared[el.endpoint][DICTIONARY[provider].user_storage_account_name],
-              value.shared[el.endpoint][DICTIONARY[provider].shared_storage_account_name],
-              value.shared[el.endpoint][DICTIONARY[provider].datalake_name],
-              value.shared[el.endpoint][DICTIONARY[provider].datalake_user_directory_name],
-              value.shared[el.endpoint][DICTIONARY[provider].datalake_shared_directory_name],
-              el.project,
-              el.endpoint,
-              el.tags,
-              value.shared[el.endpoint].status
-            );
-          })
+          exploratory: [...exploratory, ...odahu],
+          endpoints: value.endpoints,
+          projectEndpoints: value.shared
         };
       });
     }
   }
 }
 
-export interface Exploratory {
-  project: string;
-  exploratory: ExploratoryModel[];
-}
+// export interface Exploratory {
+//   project: string;
+//   endpoints: [];
+//   projectEndpoints: [];
+//   exploratory: ExploratoryModel[];
+// }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
index b705c38..94366f6 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.html
@@ -18,23 +18,39 @@
   -->
 
 <div class="base-retreat">
-  <div class="sub-nav">
+  <div class="sub-nav resource-btns">
     <div class="selection">
+      <span
+        matTooltip="{{!healthStatus?.projectAssigned ? 'You are not assigned to any project' : 'You have not any active project'}}"
+        matTooltipPosition="above"
+        [matTooltipClass]="'full-size-tooltip'"
+        [matTooltipDisabled]="healthStatus?.projectAssigned && resourcesGrid.activeProjectsList?.length !== 0"
+      >
       <button mat-raised-button class="butt butt-create" (click)="createEnvironment()"
-        [disabled]="!healthStatus?.projectAssigned">
+        [disabled]="!healthStatus?.projectAssigned || !resourcesGrid.activeProjectsList?.length">
         <i class="material-icons">add</i>Create new
       </button>
-
+      </span>
       <div class="mat-reset">
-        <div class="control selector-wrapper" *ngIf="projects.length">
+        <div class="control selector-wrapper" *ngIf="projects?.length">
           <mat-form-field>
-            <mat-label>Select active project</mat-label>
-            <mat-select [(value)]="resourcesGrid.activeProject">
-              <mat-option *ngIf="projects.length > 1" (click)="setActiveProject()">Show all</mat-option>
-              <mat-option *ngFor="let project of projects" [value]="project.name"
-                (click)="setActiveProject(project.name)">
-                {{ project.name }}</mat-option>
-              <mat-option *ngIf="!projects.length" class="multiple-select ml-10" disabled>Projects list is empty
+            <mat-label>Select project</mat-label>
+
+            <mat-select 
+              disableOptionCentering
+              [(value)]="resourcesGrid.activeProject" 
+              panelClass="top-select scrolling">
+              <mat-option 
+                *ngIf="projects?.length > 1" 
+                (click)="setActiveProject('')">Show all
+              </mat-option>
+              <mat-option 
+                *ngFor="let project of projects" 
+                [value]="project"
+                (click)="setActiveProject(project)">
+                {{ project }}
+              </mat-option>
+              <mat-option *ngIf="!projects?.length" class="multiple-select ml-10" disabled>Projects list is empty
               </mat-option>
             </mat-select>
             <button class="caret">
@@ -46,22 +62,38 @@
     </div>
 
     <div>
-      <button mat-raised-button class="butt butt-tool" (click)="manageUngit()">
-        <i class="material-icons"></i>Git credentials
-      </button>
-      <button mat-raised-button class="butt butt-tool" (click)="toggleFiltering()">
-        <span *ngIf="!resourcesGrid.activeFiltering">
-          <i class="material-icons">visibility_off</i> Show active
-        </span>
-        <span *ngIf="resourcesGrid.activeFiltering">
-          <i class="material-icons">visibility</i> Show all
-        </span>
-      </button>
-      <button mat-raised-button class="butt" (click)="refreshGrid()">
-        <i class="material-icons">autorenew</i>Refresh
-      </button>
+      <span  matTooltip="{{!this.bucketStatus?.view ? 'You have not permission to open bucket browser' : 'You have not any bucket'}}"
+             matTooltipPosition="above"
+             matTooltipDisabled="{{resourcesGrid.bucketsList?.length > 0 && this.bucketStatus?.view}}"
+             [matTooltipClass]="'full-size-tooltip'"
+      >
+        <button mat-raised-button class="butt butt-tool" (click)="bucketBrowser(this.bucketStatus?.view)"
+                [disabled]="!this.bucketStatus?.view || resourcesGrid.bucketsList?.length === 0">
+          <i class="material-icons"></i>Bucket browser
+        </button>
+      </span>
+      <span>
+        <button mat-raised-button class="butt butt-tool" (click)="manageUngit()">
+          <i class="material-icons"></i>Git credentials
+        </button>
+      </span>
+      <span>
+        <button mat-raised-button class="butt butt-tool show-all-btn" (click)="toggleFiltering()">
+          <span *ngIf="!resourcesGrid.activeFiltering">
+            <i class="material-icons">visibility_off</i> Show active
+          </span>
+          <span *ngIf="resourcesGrid.activeFiltering">
+            <i class="material-icons">visibility</i> Show all
+          </span>
+        </button>
+      </span>
+      <span>
+        <button mat-raised-button class="butt" (click)="refreshGrid()">
+          <i class="material-icons highlight">autorenew</i>Refresh
+        </button>
+      </span>
     </div>
   </div>
   <mat-divider></mat-divider>
-  <resources-grid></resources-grid>
+  <resources-grid (getEnvironments)="getEnvironments($event)" ></resources-grid>
 </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts
index 7eb6ff6..92a979a 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources.component.ts
@@ -17,30 +17,31 @@
  * under the License.
  */
 
-import { Component, OnInit, ViewChild } from '@angular/core';
+import {AfterViewInit, Component, OnInit, ViewChild} from '@angular/core';
 import { ToastrService } from 'ngx-toastr';
 import { MatDialog } from '@angular/material/dialog';
 
 import { ResourcesGridComponent } from './resources-grid/resources-grid.component';
 import { ExploratoryEnvironmentCreateComponent } from './exploratory/create-environment';
-import { Exploratory } from './resources-grid/resources-grid.model';
 import {ApplicationSecurityService, HealthStatusService} from '../core/services';
 import { ManageUngitComponent } from './manage-ungit/manage-ungit.component';
-import { Project } from './../administration/project/project.component';
+import {BucketBrowserComponent} from './bucket-browser/bucket-browser.component';
+
 
 @Component({
-  selector: 'dlab-resources',
+  selector: 'datalab-resources',
   templateUrl: 'resources.component.html',
   styleUrls: ['./resources.component.scss']
 })
 
-export class ResourcesComponent implements OnInit {
-  public exploratoryEnvironments: Exploratory[] = [];
+export class ResourcesComponent implements OnInit, AfterViewInit {
+  public exploratoryEnvironments = [];
   public healthStatus: any;
-  projects: Project[] = [];
+  projects = [];
 
   @ViewChild(ResourcesGridComponent, { static: true }) resourcesGrid: ResourcesGridComponent;
 
+  public bucketStatus;
   constructor(
     public toastr: ToastrService,
     private healthStatusService: HealthStatusService,
@@ -50,7 +51,11 @@
 
   ngOnInit() {
     this.getEnvironmentHealthStatus();
-    this.exploratoryEnvironments = this.resourcesGrid.environments;
+    this.projects = this.resourcesGrid.activeProjectsList;
+  }
+
+  ngAfterViewInit() {
+
   }
 
   public createEnvironment(): void {
@@ -64,6 +69,8 @@
     this.exploratoryEnvironments = this.resourcesGrid.environments;
   }
 
+
+
   public toggleFiltering(): void {
     if (this.resourcesGrid.activeFiltering) {
       this.resourcesGrid.resetFilterConfigurations();
@@ -77,6 +84,19 @@
       .afterClosed().subscribe(() => this.refreshGrid());
   }
 
+  public bucketBrowser(permition): void {
+    const defaultBucket = this.resourcesGrid.bucketsList[0].children[0];
+      permition && this.dialog.open(BucketBrowserComponent, { data:
+        {
+          bucket: defaultBucket.name,
+          endpoint: defaultBucket.endpoint,
+          bucketStatus: this.bucketStatus,
+          buckets: this.resourcesGrid.bucketsList
+        },
+      panelClass: 'modal-fullscreen' })
+      .afterClosed().subscribe();
+  }
+
   public setActiveProject(project): void {
     this.resourcesGrid.selectActiveProject(project);
   }
@@ -94,11 +114,18 @@
   }
 
 
+  public getEnvironments(environment) {
+    this.exploratoryEnvironments = environment;
+    this.projects = environment.map(env => env.project);
+  }
+
+
   private getEnvironmentHealthStatus() {
     this.healthStatusService.getEnvironmentHealthStatus().subscribe(
       (result: any) => {
         this.healthStatus = result;
         this.resourcesGrid.healthStatus = this.healthStatus;
+        this.bucketStatus = this.healthStatus.bucketBrowser;
       },
       error => this.toastr.error(error.message, 'Oops!'));
   }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts b/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
index 7ce335b..cd98dd5 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/resources.module.ts
@@ -26,23 +26,32 @@
 import { ResourcesGridModule } from './resources-grid';
 import { ExploratoryEnvironmentCreateModule } from './exploratory/create-environment';
 import { ManageUngitComponent } from './manage-ungit/manage-ungit.component';
-import { ConfirmDeleteAccountDialog } from './manage-ungit/manage-ungit.component';
+import { ConfirmDeleteAccountDialogComponent } from './manage-ungit/manage-ungit.component';
+import {MatTreeModule} from '@angular/material/tree';
+import {BucketDataService} from './bucket-browser/bucket-data.service';
+import {ConvertFileSizePipeModule} from '../core/pipes/convert-file-size';
+import {BucketBrowserModule} from './bucket-browser/bucket-browser.module';
 
 @NgModule({
-  imports: [
-    CommonModule,
-    FormsModule,
-    ReactiveFormsModule,
-    ResourcesGridModule,
-    ExploratoryEnvironmentCreateModule,
-    MaterialModule
-  ],
+    imports: [
+        CommonModule,
+        FormsModule,
+        ReactiveFormsModule,
+        ResourcesGridModule,
+        ExploratoryEnvironmentCreateModule,
+        MaterialModule,
+        MatTreeModule,
+        ConvertFileSizePipeModule,
+        BucketBrowserModule
+    ],
   declarations: [
     ResourcesComponent,
     ManageUngitComponent,
-    ConfirmDeleteAccountDialog
+    ConfirmDeleteAccountDialogComponent,
+
   ],
-  entryComponents: [ManageUngitComponent, ConfirmDeleteAccountDialog],
+  entryComponents: [ManageUngitComponent, ConfirmDeleteAccountDialogComponent],
+  providers: [BucketDataService],
   exports: [ResourcesComponent]
 })
 export class ResourcesModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.calculations.ts b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.calculations.ts
index 1174e74..1ceb5f8 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.calculations.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.calculations.ts
@@ -40,4 +40,16 @@
     }
     return result;
   }
+
+  public static setTimeInMiliseconds(timeObj) {
+    let time = {...timeObj};
+
+    const minutes = (Number(time.minute) < 10) ? ('0' + time.minute) : time.minute;
+    const timeMilisec = new Date().setMinutes(+minutes);
+
+    if (time.meridiem === 'PM' && time.hour < 12) time.hour += 12;
+    if (time.meridiem === 'AM' && time.hour === 12) time.hour -= 12;
+
+    return new Date(timeMilisec).setHours(time.hour);
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.html
index a13ffa1..eb81592 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.html
@@ -34,16 +34,17 @@
           <mat-slide-toggle labelPosition="after" [checked]="enableSchedule" (change)="toggleSchedule($event)">
             <span *ngIf="toggleSchedule" class="hold-label">Scheduler by time</span>
           </mat-slide-toggle>
-          <div class="idle" *ngIf="destination.image !== 'docker.dlab-dataengine-service'">
-            <mat-slide-toggle labelPosition="before" [checked]="enableIdleTime" (change)="toggleIdleTimes($event)">
-              <span *ngIf="toggleSchedule" class="hold-label">Scheduler by inactivity</span>
-            </mat-slide-toggle>
+          <div class="idle" *ngIf="destination.image !== 'docker.datalab-dataengine-service'">
+              <mat-slide-toggle labelPosition="before" [checked]="enableIdleTime" (change)="toggleIdleTimes($event)">
+                  <span *ngIf="toggleSchedule" class="hold-label">Scheduler by inactivity</span>
+              </mat-slide-toggle>
           </div>
         </div>
 
-        <div class="note m-bott-10" *ngIf="destination.image !== 'docker.dlab-dataengine-service'">
-          NOTE: In case of turning on inactivity time-check, your schedule
-          configuration will be decommissioned.</div>
+          <div class="note m-bott-10" *ngIf="destination.image !== 'docker.datalab-dataengine-service'">
+              NOTE: In case of turning on inactivity time-check, your schedule
+              configuration will be decommissioned.
+          </div>
 
         <div class="control-group idle-control" [ngClass]="{ show: enableIdleTimeView }">
           <label class="label">Scheduler by inactivity, min</label>
@@ -53,34 +54,36 @@
               (keydown.arrowdown)="inactivityCounter($event, 'decrement')" />
             <span class="error" *ngIf="!schedulerForm.controls.inactivityTime.valid">
               <span>The value should be an integer greater than or equal to {{ inactivityLimits.min }} and
-                cannot exceed 1 week ({{ inactivityLimits.max }}) in min</span>
+                cannot exceed 1 week ({{ inactivityLimits.max }}) in min.</span>
             </span>
           </div>
         </div>
-        <div class="schedule-by-time" *ngIf="!enableIdleTimeView" [ngClass]="{ hide: enableIdleTimeView, resource: destination.type === 'СOMPUTATIONAL',
-                       des: destination.image === 'docker.dlab-dataengine-service' }">
-          <div class="row-wrap" *ngIf="destination.image !== 'docker.dlab-dataengine-service'">
-            <div class="col-3">
-              <mat-form-field>
-                <input matInput [matDatepicker]="startDate" placeholder="Choose start date" formControlName="startDate">
-                <mat-datepicker-toggle
-                  [ngClass]="{'not-allowed' : destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule }"
-                  matSuffix [for]="startDate"></mat-datepicker-toggle>
-                <mat-datepicker #startDate></mat-datepicker>
-              </mat-form-field>
-            </div>
-            <div class="col-3">
+          <div class="schedule-by-time" *ngIf="!enableIdleTimeView" [ngClass]="{ hide: enableIdleTimeView, resource: destination.type === 'СOMPUTATIONAL',
+                       des: destination.image === 'docker.datalab-dataengine-service' }">
+              <div class="row-wrap" *ngIf="destination.image !== 'docker.datalab-dataengine-service'">
+                  <div class="col-3">
+                      <mat-form-field>
+                          <input matInput [matDatepicker]="startDate" placeholder="Choose start date"
+                                 formControlName="startDate">
+                          <mat-datepicker-toggle
+
+                                  matSuffix [for]="startDate"
+                                  [ngClass]="{'not-allowed' : destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule }"></mat-datepicker-toggle>
+                          <mat-datepicker #startDate></mat-datepicker>
+                      </mat-form-field>
+                  </div>
+                  <div class="col-3">
               <mat-form-field>
                 <input matInput [matDatepicker]="finishDate" placeholder="Choose finish date"
                   formControlName="finishDate">
-                <mat-datepicker-toggle matSuffix [for]="finishDate"></mat-datepicker-toggle>
-                <mat-datepicker #finishDate></mat-datepicker>
+                <mat-datepicker-toggle matSuffix [for]="finishDate" [ngClass]="{'not-allowed' : destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule }"></mat-datepicker-toggle>
+                <mat-datepicker #finishDate ></mat-datepicker>
               </mat-form-field>
             </div>
             <div class="col-3" *ngIf="destination.type === 'СOMPUTATIONAL'; else timezone">
               <mat-form-field>
                 <input matInput [matDatepicker]="terminateDate" placeholder="Choose terminate date"
-                  formControlName="terminateDate">
+                  formControlName="terminateDate" >
                 <mat-datepicker-toggle matSuffix [for]="terminateDate"></mat-datepicker-toggle>
                 <mat-datepicker #terminateDate></mat-datepicker>
               </mat-form-field>
@@ -88,7 +91,7 @@
             <ng-template #timezone>
               <div class="col-3">
                 <mat-form-field class="timezone-offset">
-                  <mat-select placeholder="Select timezone" [(value)]="tzOffset"
+                  <mat-select placeholder="Select timezone" [(value)]="tzOffset" panelClass="scrolling timezone-mat-select"
                     [disabled]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule">
                     <mat-option *ngFor="let zone of zones | keys" [value]="zone.key" matTooltip="{{ zone.value }}"
                       matTooltipShowDelay="1000" matTooltipPosition="above"> GMT {{zone.key}} {{ zone.value }}
@@ -99,20 +102,25 @@
             </ng-template>
           </div>
 
-          <div class="row-wrap" *ngIf="destination.image !== 'docker.dlab-dataengine-service'">
-            <div class="control-group col-3 time-range">
-              <dlab-time-picker [(pickTime)]="startTime" [label]="'Choose start time'"
-                [disable]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule">
-              </dlab-time-picker>
-            </div>
-            <div class="control-group col-3 time-range">
-              <dlab-time-picker [(pickTime)]="endTime" [label]="'Choose finish time'" [disable]="!enableSchedule">
-              </dlab-time-picker>
-            </div>
-            <div class="control-group col-3 time-range" *ngIf="destination.type === 'СOMPUTATIONAL'">
-              <dlab-time-picker [(pickTime)]="terminateTime" [label]="'Choose terminate time'"
-                [disable]="!enableSchedule"></dlab-time-picker>
-            </div>
+              <div class="row-wrap" *ngIf="destination.image !== 'docker.datalab-dataengine-service'">
+                  <div class="control-group col-3 time-range">
+                      <datalab-time-picker [(pickTime)]="startTime" [(milisecTime)]="startTimeMilliseconds"
+                                           [label]="'Choose start time'"
+                                           [disable]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule">
+                          {{destination.type}}
+                      </datalab-time-picker>
+                  </div>
+                  <div class="control-group col-3 time-range">
+                      <datalab-time-picker [(pickTime)]="endTime" [(milisecTime)]="endTimeMilliseconds"
+                                           [label]="'Choose finish time'"
+                                           [disable]="destination.type === 'СOMPUTATIONAL' && inherit ||!enableSchedule">
+                      </datalab-time-picker>
+                  </div>
+                  <div class="control-group col-3 time-range" *ngIf="destination.type === 'СOMPUTATIONAL'">
+                      <datalab-time-picker [(pickTime)]="terminateTime" [(milisecTime)]="terminateTimeMilliseconds"
+                                           [label]="'Choose terminate time'"
+                                           [disable]="!enableSchedule"></datalab-time-picker>
+                  </div>
             <div *ngIf="timeReqiered" class="error term m-bott-10 mt-5"><span>At least one of time range fields
                 should be selected</span>
             </div>
@@ -121,30 +129,33 @@
             </div>
           </div>
 
-          <div class="row-wrap"
-            *ngIf="destination.type === 'СOMPUTATIONAL' && destination.image !== 'docker.dlab-dataengine-service'">
-            <div class="col-3">
-              <mat-form-field class="timezone-offset">
-                <mat-select placeholder="Select timezone" [(value)]="tzOffset"
-                  [disabled]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule">
-                  <mat-option *ngFor="let zone of zones | keys" [value]="zone.key" matTooltip="{{ zone.value }}"
-                    matTooltipShowDelay="1000" matTooltipPosition="above"> GMT {{zone.key}} {{ zone.value }}
-                  </mat-option>
-                </mat-select>
-              </mat-form-field>
-            </div>
+              <div class="row-wrap"
+                   *ngIf="destination.type === 'СOMPUTATIONAL' && destination.image !== 'docker.datalab-dataengine-service'">
+                  <div class="col-3">
+                      <mat-form-field class="timezone-offset">
+                          <mat-select placeholder="Select timezone" [(value)]="tzOffset"
+                                      [disabled]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule">
+                              <mat-option *ngFor="let zone of zones | keys" [value]="zone.key"
+                                          matTooltip="{{ zone.value }}"
+                                          matTooltipShowDelay="1000" matTooltipPosition="above"> GMT {{zone.key}} {{
+                                  zone.value }}
+                              </mat-option>
+                          </mat-select>
+                      </mat-form-field>
+                  </div>
           </div>
-          <div class="control-group" *ngIf="destination && destination.image !== 'docker.dlab-dataengine-service'">
-            <label class="label repeat" for="options">Repeat on :</label>
-            <div class="days-block">
-              <label>Start date:</label>
-              <mat-button-toggle *ngFor="let day of weekdays; let i = index" value="{{ day }}"
-                (change)="onDaySelect($event, day, 'start')"
-                [disabled]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule"
-                [checked]="selectedStartWeekDays[day.toLowerCase()]">{{ day[0] }}
-              </mat-button-toggle>
-            </div>
-            <div class="days-block">
+              <div class="control-group"
+                   *ngIf="destination && destination.image !== 'docker.datalab-dataengine-service'">
+                  <label class="label repeat" for="options">Repeat on :</label>
+                  <div class="days-block">
+                      <label>Start date:</label>
+                      <mat-button-toggle *ngFor="let day of weekdays; let i = index" value="{{ day }}"
+                                         (change)="onDaySelect($event, day, 'start')"
+                                         [disabled]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule"
+                                         [checked]="selectedStartWeekDays[day.toLowerCase()]">{{ day[0] }}
+                      </mat-button-toggle>
+                  </div>
+                  <div class="days-block">
               <label>Stop date:</label>
               <mat-button-toggle *ngFor="let day of weekdays; let i = index" value="{{ day }}"
                 (change)="onDaySelect($event, day, 'stop')"
@@ -154,20 +165,21 @@
             </div>
           </div>
 
-          <div class="des-block" *ngIf="destination.image === 'docker.dlab-dataengine-service'">
-            <div class="row-wrap">
-              <div class="col-3">
-                <mat-form-field>
-                  <input matInput [matDatepicker]="terminateDate" placeholder="Choose terminate date"
-                    formControlName="terminateDate">
-                  <mat-datepicker-toggle matSuffix [for]="terminateDate"></mat-datepicker-toggle>
-                  <mat-datepicker #terminateDate></mat-datepicker>
-                </mat-form-field>
-              </div>
-              <div class="control-group col-3 time-range" *ngIf="destination.type === 'СOMPUTATIONAL'">
-                <dlab-time-picker [(pickTime)]="terminateTime" [label]="'Choose terminate time'"
-                  [disable]="!enableSchedule"></dlab-time-picker>
-              </div>
+              <div class="des-block" *ngIf="destination.image === 'docker.datalab-dataengine-service'">
+                  <div class="row-wrap">
+                      <div class="col-3">
+                          <mat-form-field>
+                              <input matInput [matDatepicker]="terminateDate" placeholder="Choose terminate date"
+                                     formControlName="terminateDate">
+                              <mat-datepicker-toggle matSuffix [for]="terminateDate"></mat-datepicker-toggle>
+                              <mat-datepicker #terminateDate></mat-datepicker>
+                          </mat-form-field>
+                      </div>
+                      <div class="control-group col-3 time-range" *ngIf="destination.type === 'СOMPUTATIONAL'">
+                          <datalab-time-picker [(pickTime)]="terminateTime" [(milisecTime)]="terminateTimeMilliseconds"
+                                               [label]="'Choose terminate time'"
+                                               [disable]="!enableSchedule"></datalab-time-picker>
+                      </div>
               <div class="col-3">
                 <mat-form-field class="timezone-offset">
                   <mat-select placeholder="Select timezone" [(value)]="tzOffset"
@@ -184,18 +196,18 @@
             </div>
           </div>
 
-          <div class="options"
-            *ngIf="destination && allowInheritView && destination.image !== 'docker.dlab-dataengine-service'">
-            <mat-slide-toggle labelPosition="after" [checked]="inherit" (change)="toggleInherit($event)"
-              [disabled]="!enableSchedule || (!parentInherit && destination.type === 'СOMPUTATIONAL')">
+              <div class="options"
+                   *ngIf="destination && allowInheritView && destination.image !== 'docker.datalab-dataengine-service'">
+                  <mat-slide-toggle labelPosition="after" [checked]="inherit" (change)="toggleInherit($event)"
+                                    [disabled]="!enableSchedule || (!parentInherit && destination.type === 'СOMPUTATIONAL')">
               <span *ngIf="destination.type === 'EXPLORATORY'; else resourcePropagation" class="hold-label">
                 <span>Start all spark clusters associated with current notebook based on notebook start
                   schedule</span>
               </span>
-              <ng-template #resourcePropagation>
-                <span class="hold-label">Inherit notebook schedule settings</span>
-              </ng-template>
-            </mat-slide-toggle>
+                      <ng-template #resourcePropagation>
+                          <span class="hold-label">Inherit notebook schedule settings</span>
+                      </ng-template>
+                  </mat-slide-toggle>
           </div>
         </div>
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.scss b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.scss
index 0c2f2e3..54a1eed 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.scss
@@ -85,11 +85,9 @@
 
   .idle-control {
     .control {
-      position: relative;
-
       .error {
         position: absolute;
-        left: 5px;
+        right: 0;
         top: 40px;
         font-size: 12px;
       }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.ts
index 8b31445..79b5008 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { Component, OnInit, ViewChild, Output, EventEmitter, ViewEncapsulation, ChangeDetectorRef, Inject } from '@angular/core';
+import {Component, OnInit, ViewChild, ViewEncapsulation, ChangeDetectorRef, Inject, LOCALE_ID} from '@angular/core';
 import { FormGroup, FormBuilder, Validators } from '@angular/forms';
 import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { ToastrService } from 'ngx-toastr';
@@ -31,10 +31,9 @@
 import { SchedulerCalculations } from './scheduler.calculations';
 import { HTTP_STATUS_CODES, CheckUtils } from '../../core/util';
 import { ScheduleSchema } from './scheduler.model';
-import { map } from 'rxjs/operators';
 
 @Component({
-  selector: 'dlab-scheduler',
+  selector: 'datalab-scheduler',
   templateUrl: './scheduler.component.html',
   styleUrls: ['./scheduler.component.scss'],
   encapsulation: ViewEncapsulation.None
@@ -64,14 +63,17 @@
   public destination: any;
   public zones: {};
   public tzOffset: string = _moment().format('Z');
-  public startTime = { hour: 9, minute: 0, meridiem: 'AM' };
-  public endTime = { hour: 8, minute: 0, meridiem: 'PM' };
+  public startTime = SchedulerCalculations.convertTimeFormat('09:00');
+  public startTimeMilliseconds: number = SchedulerCalculations.setTimeInMiliseconds(this.startTime);
+  public endTime = SchedulerCalculations.convertTimeFormat('20:00');
+  public endTimeMilliseconds: number = SchedulerCalculations.setTimeInMiliseconds(this.endTime);
   public terminateTime = null;
+  public terminateTimeMilliseconds: number;
 
   public inactivityLimits = { min: 120, max: 10080 };
   public integerRegex: string = '^[0-9]*$';
 
-  @ViewChild('resourceSelect', { static: false }) resource_select;
+  @ViewChild('resourceSelect') resource_select;
 
   constructor(
     @Inject(MAT_DIALOG_DATA) public data: any,
@@ -140,8 +142,10 @@
     if (this.destination.type === 'СOMPUTATIONAL' && this.inherit) {
       this.getExploratorySchedule(this.notebook.project, this.notebook.name);
       this.schedulerForm.get('startDate').disable();
+      this.schedulerForm.get('finishDate').disable();
     } else {
       this.schedulerForm.get('startDate').enable();
+      this.schedulerForm.get('finishDate').enable();
     }
   }
 
@@ -155,8 +159,10 @@
       ? this.schedulerForm.get('startDate').enable()
       : this.schedulerForm.get('startDate').disable();
 
-    this.enableSchedule ? this.schedulerForm.get('finishDate').enable() : this.schedulerForm.get('finishDate').disable();
-    this.enableSchedule ? this.schedulerForm.get('terminateDate').enable() : this.schedulerForm.get('terminateDate').disable();
+    this.enableSchedule && this.destination.type !== 'СOMPUTATIONAL' ?
+      this.schedulerForm.get('finishDate').enable() : this.schedulerForm.get('finishDate').disable();
+    this.enableSchedule ?
+      this.schedulerForm.get('terminateDate').enable() : this.schedulerForm.get('terminateDate').disable();
 
     if (this.enableSchedule && $event.source) this.enableIdleTimeView = false;
   }
@@ -268,7 +274,7 @@
   private formInit(start?: string, end?: string, terminate?: string) {
     this.schedulerForm = this.formBuilder.group({
       startDate: { disabled: this.inherit, value: start ? _moment(start).format() : null },
-      finishDate: { disabled: false, value: end ? _moment(end).format() : null },
+      finishDate: { disabled: this.inherit, value: end ? _moment(end).format() : null },
       terminateDate: { disabled: false, value: terminate ? _moment(terminate).format() : null },
       inactivityTime: [this.inactivityLimits.min,
       [Validators.compose([Validators.pattern(this.integerRegex), this.validInactivityRange.bind(this)])]]
@@ -282,9 +288,12 @@
           params.start_days_repeat.filter(key => (this.selectedStartWeekDays[key.toLowerCase()] = true));
           params.stop_days_repeat.filter(key => (this.selectedStopWeekDays[key.toLowerCase()] = true));
           this.inherit = params.sync_start_required;
-          this.tzOffset = params.timezone_offset;
-          this.startTime = params.start_time ? SchedulerCalculations.convertTimeFormat(params.start_time) : null;
-          this.endTime = params.end_time ? SchedulerCalculations.convertTimeFormat(params.end_time) : null;
+          this.tzOffset = params.timezone_offset && params.timezone_offset !== 'Z' ? params.timezone_offset : this.tzOffset;
+          this.startTime = params.start_time ? SchedulerCalculations.convertTimeFormat(params.start_time) : this.startTime;
+          this.startTimeMilliseconds = SchedulerCalculations.setTimeInMiliseconds(this.startTime);
+          this.endTime = params.end_time ? SchedulerCalculations.convertTimeFormat(params.end_time) : this.endTime;
+          this.endTimeMilliseconds = SchedulerCalculations.setTimeInMiliseconds(this.endTime);
+
           this.formInit(params.begin_date, params.finish_date, params.terminate_datetime);
           this.schedulerForm.controls.inactivityTime.setValue(params.max_inactivity || this.inactivityLimits.min);
           this.enableIdleTime = params.check_inactivity_required;
@@ -294,6 +303,7 @@
             const terminate_datetime = params.terminate_datetime.split(' ');
             this.schedulerForm.controls.terminateDate.setValue(terminate_datetime[0]);
             this.terminateTime = SchedulerCalculations.convertTimeFormat(terminate_datetime[1]);
+            this.terminateTimeMilliseconds = SchedulerCalculations.setTimeInMiliseconds(this.terminateTime);
           }
 
           (this.enableIdleTime && params.max_inactivity)
@@ -319,7 +329,7 @@
   }
 
   private checkIsActiveSpark() {
-    return this.notebook.resources.length > 0 && this.notebook.resources.some(el => el.image === 'docker.dlab-dataengine'
+    return this.notebook.resources.length > 0 && this.notebook.resources.some(el => el.image === 'docker.datalab-dataengine'
       && (el.status !== 'terminated' && el.status !== 'terminating' && el.status !== 'failed'));
   }
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/service-pages/access-denied/access-denied.component.ts b/services/self-service/src/main/resources/webapp/src/app/service-pages/access-denied/access-denied.component.ts
index 5be53fd..cb290ec 100644
--- a/services/self-service/src/main/resources/webapp/src/app/service-pages/access-denied/access-denied.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/service-pages/access-denied/access-denied.component.ts
@@ -19,7 +19,7 @@
 import { Component, OnInit } from '@angular/core';
 
 @Component({
-  selector: 'dlab-access-denied',
+  selector: 'datalab-access-denied',
   template: `
     <div class="no-access-page">
       <div class="content">
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/bubble/bubble.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/bubble/bubble.component.ts
index 9bc17f5..46d6d63 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/bubble/bubble.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/bubble/bubble.component.ts
@@ -90,7 +90,14 @@
 
         if (this.alternative) {
           this.changeDirection = !this.isInViewport(bubbleElem);
-          this.changeDirection && this.bubbleService.updatePosition(element, bubbleElem, this.alternative);
+
+          let isBubbleOutOfWrapper;
+          
+          if(document.querySelector('.wrapper')) {
+            isBubbleOutOfWrapper = bubbleElem.getBoundingClientRect().bottom > document.querySelector('.wrapper').getBoundingClientRect().bottom;
+          }
+          
+          (this.changeDirection || isBubbleOutOfWrapper) && this.bubbleService.updatePosition(element, bubbleElem, this.alternative);
         }
 
         this.ref.markForCheck();
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/checkbox.component.css b/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/checkbox.component.css
new file mode 100644
index 0000000..2dec4e7
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/checkbox.component.css
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.empty-checkbox{
+  margin: 0;
+  z-index: 1011;
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/checkbox.component.html b/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/checkbox.component.html
new file mode 100644
index 0000000..584fa53
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/checkbox.component.html
@@ -0,0 +1,23 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<div class="empty-checkbox" [ngClass]="{'checked': checked || someChecked, 'not-allowed': disabled}">
+  <span class="checked-checkbox" *ngIf="checked"></span>
+  <span class="line-checkbox" *ngIf="someChecked"></span>
+</div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/checkbox.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/checkbox.component.ts
new file mode 100644
index 0000000..aec9000
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/checkbox.component.ts
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import {Component, EventEmitter, HostListener, Input, Output} from '@angular/core';
+
+
+@Component({
+  selector: 'datalab-checkbox',
+  templateUrl: 'checkbox.component.html',
+  styleUrls: ['./checkbox.component.css'],
+})
+
+export class CheckboxComponent {
+
+  @Input() checked: boolean;
+  @Input() someChecked: boolean;
+  @Input() disabled: boolean;
+  @Output() toggleSelection: EventEmitter<{}> = new EventEmitter();
+
+  @HostListener('click', ['$event']) onClick(event) {
+    event.stopPropagation();
+    event.preventDefault();
+    this.toggleSelection.emit(!this.checked);
+  }
+
+  constructor() {}
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/index.ts b/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/index.ts
new file mode 100644
index 0000000..4a4fafb
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/checkbox/index.ts
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { MaterialModule } from '../material.module';
+import {CheckboxComponent} from './checkbox.component';
+
+@NgModule({
+    imports: [CommonModule, MaterialModule],
+    declarations: [CheckboxComponent],
+    exports: [CheckboxComponent]
+})
+export class CheckboxModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdown-list/dropdown-list.component.html b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdown-list/dropdown-list.component.html
index e3dae92..13d6b7d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdown-list/dropdown-list.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdown-list/dropdown-list.component.html
@@ -17,8 +17,8 @@
   ~ under the License.
   -->
 
-<div class="dropdown-list">
-  <button class="dropdown-toggle" type="button" #list (click)="actions.toggle($event, list)">
+<div class="dropdown-list" >
+  <button class="dropdown-toggle" type="button" #list (click)="emitEvent()" (click)="actions.toggle($event, list)">
     <span class="title"><span [innerHTML]="label || 'None'"></span></span>
     <span class="caret-btn"><i class="material-icons">keyboard_arrow_down</i></span>
   </button>
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdown-list/dropdown-list.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdown-list/dropdown-list.component.ts
index 7622adf..eccceb6 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdown-list/dropdown-list.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdown-list/dropdown-list.component.ts
@@ -44,6 +44,7 @@
   empty: boolean = false;
 
   @Output() selectedItem: EventEmitter<{}> = new EventEmitter();
+  @Output() emitClick: EventEmitter<{}> = new EventEmitter();
 
   public selectOptions($event: Event, value: any, index: number): void {
     this.label = this.map ? this.map[value] : (this.empty && !value ? value : value[this.byField]);
@@ -69,4 +70,8 @@
   private onUpdate(): void {
     this.selectedItem.emit({ model: this.model });
   }
+
+  public emitEvent() {
+    this.emitClick.emit();
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdowns.component.scss b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdowns.component.scss
index a177f5c..66cf215 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdowns.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/dropdowns.component.scss
@@ -28,8 +28,9 @@
   min-width: 100%;
   background: #fff;
   padding-left: 15px;
-  font-size: 14px;
-  // height: 34px;
+  font-size: 13px;
+  padding-top: 1px;
+  height: 34px;
   text-align: left;
   white-space: nowrap;
   cursor: pointer;
@@ -68,7 +69,7 @@
     span {
       color: #999;
       font-weight: 300;
-      display: inline-block;
+      //display: inline-block;
       max-width: 80%;
     }
 
@@ -145,7 +146,7 @@
 }
 
 .dropdown-multiselect .list-menu li a {
-  padding-left: 45px;
+  padding-left: 30px;
   transition: all .45s ease-in-out;
 }
 
@@ -245,9 +246,10 @@
 
 .dropdown-multiselect .list-menu a span {
   position: absolute;
-  top: 8px;
-  left: 12px;
+  top: 10px;
+  left: 9px;
   color: #35afd5;
+  font-size: 18px;
 }
 
 .dropdown-multiselect.btn-group.open .dropdown-toggle {
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/index.ts b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/index.ts
index 4ea5a14..861e21a 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/index.ts
@@ -23,9 +23,10 @@
 import { DropdownListComponent } from './dropdown-list/dropdown-list.component';
 import { MultiSelectDropdownComponent } from './multi-select-dropdown/multi-select-dropdown.component';
 import { DirectivesModule } from '../../core/directives';
-import { KeysPipeModule, UnderscorelessPipeModule } from '../../core/pipes';
+import {ConvertActionPipeModule, KeysPipeModule, UnderscorelessPipeModule} from '../../core/pipes';
 import { BubbleModule } from '..';
 import {MultiLevelSelectDropdownComponent} from './multi-level-select-dropdown/multi-level-select-dropdown.component';
+import {CheckboxModule} from '../checkbox';
 
 export * from './multi-select-dropdown/multi-select-dropdown.component';
 export * from './dropdown-list/dropdown-list.component';
@@ -36,7 +37,9 @@
     DirectivesModule,
     KeysPipeModule,
     UnderscorelessPipeModule,
-    BubbleModule
+    BubbleModule,
+    ConvertActionPipeModule,
+    CheckboxModule
   ],
   declarations: [DropdownListComponent, MultiSelectDropdownComponent, MultiLevelSelectDropdownComponent],
   exports: [DropdownListComponent, MultiSelectDropdownComponent, MultiLevelSelectDropdownComponent]
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.html b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.html
index 420aa09..ef66677 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.html
@@ -21,7 +21,7 @@
   <button type="button" #list (click)="multiactions.toggle($event, list)">
     <span class="ellipsis" *ngIf="model.length === 0">Select roles</span>
     <span class="selected-items ellipsis" *ngIf="model.length !== 0">
-      {{selectedRolesList()}}
+      {{selectedList?.length ? selectedList : getSelectedRolesList()}}
     </span>
     <span class="caret-btn"><i class="material-icons">keyboard_arrow_down</i></span>
   </button>
@@ -43,10 +43,18 @@
               <span class="arrow" [ngClass]="{'rotate-arrow': isOpenCategory[item.type], 'arrow-checked': selectedAllInCattegory(item.type) || selectedSomeInCattegory(item.type)}">
                 <i class="material-icons">keyboard_arrow_right</i>
               </span>
-              <span class="empty-checkbox" [ngClass]="{'checked': selectedAllInCattegory(item.type) || selectedSomeInCattegory(item.type)}" (click)="toggleselectedCategory($event, model, item.type);$event.stopPropagation()" >
-                <span class="checked-checkbox" *ngIf="selectedAllInCattegory(item.type)"></span>
-                <span class="line-checkbox" *ngIf="selectedSomeInCattegory(item.type)"></span>
-              </span>
+<!--              <span class="empty-checkbox" [ngClass]="{'checked': selectedAllInCattegory(item.type) || selectedSomeInCattegory(item.type)}" (click)="toggleselectedCategory($event, model, item.type);$event.stopPropagation()" >-->
+<!--                <span class="checked-checkbox" *ngIf="selectedAllInCattegory(item.type)"></span>-->
+<!--                <span class="line-checkbox" *ngIf="selectedSomeInCattegory(item.type)"></span>-->
+<!--              </span>-->
+              <datalab-checkbox
+                class="header-checkbox"
+                [checked]="selectedAllInCattegory(item.type)"
+                [someChecked]="selectedSomeInCattegory(item.type)"
+                (toggleSelection)="toggleselectedCategory(model, item.type)"
+              >
+              </datalab-checkbox>
+
               {{labels[item.type] || item.type | titlecase}}
             </a>
           </li>
@@ -56,10 +64,16 @@
               *ngIf="model && isOpenCategory[item.type] && item.type !== 'COMPUTATIONAL_SHAPE' && item.type !== 'NOTEBOOK_SHAPE'"
               [hidden]="!isAdmin && item.role === 'Allow to execute administration operation'"
           >
-            <a href="#" class="list-item" role="menuitem" (click)="toggleSelectedOptions($event, model, item)">
-              <span class="empty-checkbox" [ngClass]="{'checked': checkInModel(item.role)}">
-                <span class="checked-checkbox" *ngIf="checkInModel(item.role)"></span>
-              </span>
+            <a href="#" class="list-item" role="menuitem" (click)="toggleSelectedOptions(model, item, $event)">
+<!--              <span class="empty-checkbox" [ngClass]="{'checked': checkInModel(item.role)}">-->
+<!--                <span class="checked-checkbox" *ngIf="checkInModel(item.role)"></span>-->
+<!--              </span>-->
+              <datalab-checkbox
+                class="header-checkbox"
+                [checked]="checkInModel(item.role)"
+                (toggleSelection)="toggleSelectedOptions(model, item)"
+              >
+              </datalab-checkbox>
               {{item.role}}
             </a>
           </li>
@@ -73,24 +87,37 @@
               <span class="arrow" [ngClass]="{'rotate-arrow': isCloudOpen[item.type + item.cloud], 'arrow-checked': selectedAllInCloud(item.type, item.cloud) || selectedSomeInCloud(item.type, item.cloud)}">
                  <i class="material-icons">keyboard_arrow_right</i>
               </span>
-              <span class="empty-checkbox"
-                    [ngClass]="{
-                    'checked': selectedAllInCloud(item.type, item.cloud)
-                    || selectedSomeInCloud(item.type, item.cloud)}"
-                    (click)="toggleSelectedCloud($event, model, item.type, item.cloud);
-                    $event.stopPropagation()"
+<!--              <span class="empty-checkbox"-->
+<!--                    [ngClass]="{-->
+<!--                    'checked': selectedAllInCloud(item.type, item.cloud)-->
+<!--                    || selectedSomeInCloud(item.type, item.cloud)}"-->
+<!--                    (click)="toggleSelectedCloud($event, model, item.type, item.cloud);-->
+<!--                    $event.stopPropagation()"-->
+<!--              >-->
+<!--                <span class="checked-checkbox" *ngIf="selectedAllInCloud(item.type, item.cloud)"></span>-->
+<!--                <span class="line-checkbox" *ngIf="selectedSomeInCloud(item.type, item.cloud)"></span>-->
+<!--              </span>-->
+              <datalab-checkbox
+                class="header-checkbox"
+                [checked]="selectedAllInCloud(item.type, item.cloud)"
+                [someChecked]="selectedSomeInCloud(item.type, item.cloud)"
+                (toggleSelection)="toggleSelectedCloud(model, item.type, item.cloud)"
               >
-                <span class="checked-checkbox" *ngIf="selectedAllInCloud(item.type, item.cloud)"></span>
-                <span class="line-checkbox" *ngIf="selectedSomeInCloud(item.type, item.cloud)"></span>
-              </span>
+              </datalab-checkbox>
               {{item.cloud}}
             </a>
           </li>
           <li class="role-cloud-item" role="presentation" *ngIf="model && isCloudOpen[item.type + item.cloud] && isOpenCategory[item.type]" >
-            <a href="#" class="list-item" role="menuitem" (click)="toggleSelectedOptions($event, model, item)">
-              <span class="empty-checkbox" [ngClass]="{'checked': checkInModel(item.role)}">
-                <span class="checked-checkbox" *ngIf="checkInModel(item.role)"></span>
-              </span>
+            <a href="#" class="list-item" role="menuitem" (click)="toggleSelectedOptions( model, item, $event)">
+<!--              <span class="empty-checkbox" [ngClass]="{'checked': checkInModel(item.role)}">-->
+<!--                <span class="checked-checkbox" *ngIf="checkInModel(item.role)"></span>-->
+<!--              </span>-->
+              <datalab-checkbox
+                class="header-checkbox"
+                [checked]="checkInModel(item.role)"
+                (toggleSelection)="toggleSelectedOptions(model, item)"
+              >
+              </datalab-checkbox>
               {{item.role}}
             </a>
           </li>
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.scss b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.scss
index a066dd5..6231568 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.scss
@@ -25,12 +25,12 @@
 
 .dropdown-list button,
 .dropdown-multiselect button {
-  height: 38px;
+
   width: 100%;
   background: #fff;
   padding-left: 15px;
-  font-size: 14px;
-  // height: 34px;
+  font-size: 13px;
+  height: 34px;
   text-align: left;
   white-space: nowrap;
   cursor: pointer;
@@ -66,16 +66,22 @@
 
 .dropdown-multiselect {
   button {
-    span {
+    span{
       color: #999;
       font-weight: 300;
       display: inline-block;
       max-width: 80%;
     }
 
+    span:not(.caret-btn){
+      padding-top: 3px;
+      font-size: 14px;
+    }
+
     .selected-items {
       color: #4a5c89;
       max-width: 477px;
+      padding-top: 5px;
     }
   }
 }
@@ -114,9 +120,11 @@
       padding: 0;
       margin: 0;
     }
+
     .role-item{
       padding-left: 30px;
     }
+
     .role-cloud-item{
       padding-left: 60px;
     }
@@ -142,7 +150,7 @@
 
 .dropdown-list .list-menu a,
 .dropdown-multiselect .list-menu li a {
-  display: block;
+  display: flex;
   padding: 10px;
   padding-left: 15px;
   position: relative;
@@ -153,7 +161,7 @@
 }
 
 .dropdown-multiselect .list-menu li a {
-  padding-left: 45px;
+  padding-left: 25px;
   transition: all .45s ease-in-out;
 }
 
@@ -259,7 +267,7 @@
     color: #35afd5;
 
     &.checked-checkbox {
-      top: 0px;
+      top: 0;
       left: 4px;
       width: 5px;
       height: 10px;
@@ -270,7 +278,7 @@
     }
 
     &.line-checkbox {
-      top: 0px;
+      top: 0;
       left: 2px;
       width: 8px;
       height: 7px;
@@ -322,3 +330,6 @@
   display: none;
 }
 
+datalab-checkbox{
+  margin: 2px 5px 0 0;
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.ts
index 5b9c1a9..9b1c918 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.ts
@@ -18,6 +18,7 @@
  */
 
 import { Input, Output, Component, EventEmitter } from '@angular/core';
+import {SortUtils} from '../../../core/util';
 
 @Component({
   selector: 'multi-level-select-dropdown',
@@ -43,27 +44,32 @@
   public labels = {
     COMPUTATIONAL_SHAPE: 'Compute shapes',
     NOTEBOOK_SHAPE: 'Notebook shapes',
-    COMPUTATIONAL: 'Compute'
+    COMPUTATIONAL: 'Compute',
+    BUCKET_BROWSER: 'Bucket browser actions'
   };
+  public selectedList: any;
 
-  toggleSelectedOptions($event, model, value) {
-    $event.preventDefault();
-    const currRole = model.filter(v => v.role === value.role).length;
-    currRole ? this.model = model.filter(v => v.role !== value.role) : model.push(value);
-    this.onUpdate($event);
+  constructor() {
   }
 
-  toggleselectedCategory($event, model, value) {
-    $event.preventDefault();
+  toggleSelectedOptions( model, value, event?) {
+    if (event) event.preventDefault();
+    const currRole = model.filter(v => v.role === value.role).length;
+    currRole ? this.model = model.filter(v => v.role !== value.role) : model.push(value);
+    this.onUpdate(event);
+  }
+
+  toggleselectedCategory( model, value, event?) {
+    if (event) event.preventDefault();
     const categoryItems = this.items.filter(role => role.type === value);
     this.selectedAllInCattegory(value) ? this.model = this.model.filter(role => role.type !== value) : categoryItems.forEach(role => {
       if (!model.filter(mod => mod.role === role.role).length) {this.model.push(role); }
     });
-    this.onUpdate($event);
+    this.onUpdate(event);
   }
 
-  toggleSelectedCloud($event, model, category, cloud) {
-    $event.preventDefault();
+  toggleSelectedCloud( model, category, cloud, event?) {
+    if (event) event.preventDefault();
     const categoryItems = this.items.filter(role => role.type === category && role.cloud === cloud);
     this.selectedAllInCloud(category, cloud) ? this.model = this.model.filter(role => {
       if (role.type === category && role.cloud === cloud) {
@@ -73,7 +79,7 @@
     }) : categoryItems.forEach(role => {
       if (!model.filter(mod => mod.role === role.role).length) {this.model.push(role); }
     });
-    this.onUpdate($event);
+    this.onUpdate(event);
   }
 
   selectAllOptions($event) {
@@ -90,6 +96,7 @@
   }
 
   onUpdate($event): void {
+    this.selectedList = SortUtils.sortByKeys(this.getSelectedRolesList(), ['type']);
     this.selectionChange.emit({ model: this.model, type: this.type, $event });
   }
 
@@ -134,7 +141,7 @@
     return this.model.filter(v => v.role === item).length;
   }
 
-  public selectedRolesList() {
-    return this.model.map(role => role.role).join(',');
+  public getSelectedRolesList() {
+    return this.model.map(role => role.role);
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-select-dropdown/multi-select-dropdown.component.html b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-select-dropdown/multi-select-dropdown.component.html
index 60744c4..2458d9f 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-select-dropdown/multi-select-dropdown.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-select-dropdown/multi-select-dropdown.component.html
@@ -19,7 +19,11 @@
 
 <div class="dropdown-multiselect btn-group" ngClass="{{type || ''}}">
   <button type="button" #list (click)="multiactions.toggle($event, list)">
-    <span class="ellipsis" *ngIf="model.length === 0">Select {{type}}</span>
+    <span class="ellipsis" *ngIf="model.length === 0 && type">
+      <ng-container *ngIf="type === 'resource_type' || type === 'resource_types';else noResourceTypeSelect">Select {{ type | convertaction}}</ng-container>
+         <ng-template #noResourceTypeSelect>Select {{ type  }}</ng-template>
+
+    </span>
     <span class="selected-items ellipsis" *ngIf="model.length !== 0">
       Selected {{model.length}} item<strong *ngIf="model.length > 1">s</strong>
     </span>
@@ -38,17 +42,26 @@
       </li>
         <ng-template let-item ngFor [ngForOf]="items">
           <li role="presentation" *ngIf="model">
-            <a href="#" class="list-item" role="menuitem" (click)="toggleSelectedOptions($event, model, item)">
+            <a href="#" 
+              class="list-item billing-user-name"
+              [ngClass]="{'uppercase': type === 'resource_type' || type === 'status'}"
+              role="menuitem" 
+              (click)="toggleSelectedOptions($event, model, item)">
               <span class="material-icons" *ngIf="model.indexOf(item) >= 0">done</span>
-              <ng-container *ngIf="type[0] !== 'resource_type'">{{item}}</ng-container>
-              <ng-container *ngIf="type[0] === 'resource_type'">{{item | titlecase}}</ng-container>
+              <ng-container *ngIf="type !== 'resource_type' && type !== 'resource_types' && item !== 'invalid_name' && item !== 'invalid_version' && item !== 'installation_error'">
+                <div [ngClass]="{'uppercase': type === 'status'}">{{item}}</div>
+              </ng-container>
+              <ng-container *ngIf="type === 'resource_type' || type === 'resource_types' || item === 'invalid_name' || item === 'invalid_version' || item === 'installation_error'">
+                <div [ngClass]="{'uppercase': type === 'status' || type === 'resource_type'}">{{item | convertaction}}</div>
+              </ng-container>
             </a>
           </li>
         </ng-template>
       <li *ngIf="items?.length == 0">
         <a role="menuitem" class="list-item">
           <span class="material-icons">visibility_off</span>
-          No {{type}}
+         <ng-container *ngIf="type === 'resource_type' || type === 'resource_types';else noResourceType">No {{type | convertaction}}</ng-container>
+         <ng-template #noResourceType>No {{type}}</ng-template>
         </a>
       </li>
     </ul>
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/index.ts b/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/index.ts
new file mode 100644
index 0000000..3e10ff7
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/index.ts
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { MaterialModule } from '../material.module';
+import {InformMessageComponent} from './inform-message.component';
+
+@NgModule({
+    imports: [CommonModule, MaterialModule],
+    declarations: [InformMessageComponent],
+    exports: [InformMessageComponent]
+})
+export class InformMessageModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/inform-message.component.css b/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/inform-message.component.css
new file mode 100644
index 0000000..4a36213
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/inform-message.component.css
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+.message-wrapper{
+  min-height: 200px;
+  width: 100%;
+  box-shadow: 0 2px 1px -1px rgba(0,0,0,.2), 0 1px 1px 0 rgba(0,0,0,.14), 0 1px 3px 0 rgba(0,0,0,.12);
+  transition: box-shadow 280ms cubic-bezier(.4,0,.2,1);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  padding: 16px;
+  border-radius: 4px;
+  background: #fff;
+  color: rgba(0,0,0,.87);
+}
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/inform-message.component.html b/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/inform-message.component.html
new file mode 100644
index 0000000..14a197a
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/inform-message.component.html
@@ -0,0 +1,21 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<div class="message-wrapper">
+  <p class="highlight">{{message}}</p>
+</div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/inform-message.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/inform-message.component.ts
new file mode 100644
index 0000000..f516928
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/inform-message/inform-message.component.ts
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Component, Input, Output, EventEmitter, HostBinding,
+         ChangeDetectorRef, ElementRef, OnInit, OnDestroy,
+         ViewEncapsulation, HostListener } from '@angular/core';
+
+
+@Component({
+  selector: 'inform-message',
+  templateUrl: './inform-message.component.html',
+  styleUrls: ['./inform-message.component.css'],
+
+
+})
+export class InformMessageComponent implements OnInit {
+  @Input() message: string;
+
+  constructor() {}
+
+  ngOnInit(): void {
+  }
+
+
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/material.module.ts b/services/self-service/src/main/resources/webapp/src/app/shared/material.module.ts
index c677b05..b8c0c03 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/material.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/material.module.ts
@@ -19,14 +19,13 @@
 
 import { NgModule } from '@angular/core';
 import { CdkTableModule } from '@angular/cdk/table';
-
 import { MatAutocompleteModule } from '@angular/material/autocomplete';
 import { MatButtonModule } from '@angular/material/button';
 import { MatButtonToggleModule } from '@angular/material/button-toggle';
 import { MatCardModule } from '@angular/material/card';
 import { MatCheckboxModule } from '@angular/material/checkbox';
 import { MatChipsModule } from '@angular/material/chips';
-import {MAT_HAMMER_OPTIONS, MatNativeDateModule} from '@angular/material/core';
+import { MatNativeDateModule} from '@angular/material/core';
 import { MatDatepickerModule } from '@angular/material/datepicker';
 import { MatDialogModule } from '@angular/material/dialog';
 import { MatExpansionModule } from '@angular/material/expansion';
@@ -51,7 +50,7 @@
 import { MatTabsModule } from '@angular/material/tabs';
 import { MatToolbarModule } from '@angular/material/toolbar';
 import { MatTooltipModule } from '@angular/material/tooltip';
-import {STEPPER_GLOBAL_OPTIONS} from "@angular/cdk/stepper";
+import {STEPPER_GLOBAL_OPTIONS} from '@angular/cdk/stepper';
 
 @NgModule({
   exports: [
@@ -89,15 +88,7 @@
     MatTableModule
   ],
   providers: [
-    {
-      provide: MAT_HAMMER_OPTIONS,
-      useValue: {
-        cssProps: {
-          userSelect: true
-        }
-      },
-    },
-    {
+        {
       provide: STEPPER_GLOBAL_OPTIONS,
       useValue: { displayDefaultIndicatorType: false }
     }
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog-type.enum.ts b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog-type.enum.ts
index ca05251..d6207c2 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog-type.enum.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog-type.enum.ts
@@ -23,4 +23,5 @@
   TerminateComputationalResources = 2,
   StopEdgeNode = 3,
   deleteUser = 4,
+  deleteGroup
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.html
index b80443a..2bd5f97 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.html
@@ -20,10 +20,11 @@
 <div id="dialog-box" class="confirmation-dialog">
   <header class="dialog-header">
     <h4 class="modal-title">
-      <span *ngIf="model.notebook.name && model.notebook.name !== 'edge node'">
-        <span>{{ confirmationType ? 'Terminate' : 'Stop' }} notebook: {{ model.notebook.name }}</span>
+
+      <span *ngIf="data.type !== 5 && model.notebook.name && model.notebook.name !== 'edge node'">
+        <span>{{ data.type === 1 ? 'Terminate' : 'Stop' }} resource</span>
       </span>
-      <span *ngIf="model.notebook.type === 'Edge Node' || model.notebook.name === 'edge node' || data.type === 4 && data.notebook.length">
+      <span *ngIf="model.notebook.type === 'Edge Node' || model.notebook.name === 'edge node' || data.type === 4 && data.notebook.length || data.type === 5 ">
         <i class="material-icons">priority_high</i>Warning
       </span>
       <span *ngIf="data.type === 4 && !data.notebook.length">
@@ -34,40 +35,71 @@
   </header>
   <div class="dialog-content">
     <div class="content-box">
-      <p *ngIf="data.type !== 4" class="info text-center">{{ model.title }}</p>
+<!--      <p *ngIf="data.type !== 4 && data.type !== 5" class="info text-center">{{ model.title }}</p>-->
       <div *ngIf="data.type === 4" class="text-center m-bot-20">
-        <h3 class="strong">Group data will be updated.</h3>
+        <h4 class="strong">Group data will be updated.</h4>
       </div>
-      <p *ngIf="data.type === 4 && data.notebook.length" class="text-center delete-user">User<span *ngIf="data.notebook.length>1">s</span>  <span class="strong"> {{data.notebook.join(', ')}} </span>will be deleted from this group.</p>
-<!--        All <span *ngIf="data.notebook.length===1">his</span><span *ngIf="data.notebook.length>1">their</span> resources authorized within this group will be terminated.-->
-      <mat-list class="resources"
-        [hidden]="model.notebook.type === 'Edge Node' || model.notebook.name === 'edge node'
-                                  || !model.notebook.resources || model.notebook.resources.length === 0 || (!isAliveResources && !confirmationType) || onlyKilled">
-        <mat-list-item class="list-header">
-          <div class="cluster">Cluster</div>
-          <div class="status">Further status</div>
-          <div class="size">Size</div>
-        </mat-list-item>
-        <div class="scrolling-content" id="scrolling">
-          <mat-list-item *ngFor="let resource of model.notebook.resources"
-            [hidden]="resource.status === 'failed' || resource.status === 'terminated' || resource.status === 'terminating' || (resource.status === 'stopped' && !confirmationType)">
-            <div class="cluster ellipsis">{{ resource.computational_name  }}</div>
-            <div class="status" [ngClass]="{ 'stopped': !confirmationType && resource.image === 'docker.dlab-dataengine',
-                  'terminated': resource.image === 'docker.dlab-dataengine-service' || confirmationType }">
-              {{ (!confirmationType && resource.image === 'docker.dlab-dataengine') ? 'Stopped' : 'Terminated' }}</div>
-            <div class="size">{{ resource[DICTIONARY[notebook.cloud_provider.toLowerCase()][resource.image].master_node_shape] }} </div>
-          </mat-list-item>
+      <p 
+        *ngIf="data.type === 4 && data.notebook.length" 
+        class="text-center delete-user scrolling" 
+        matTooltip="{{data.notebook.join(',\n')}}"
+        matTooltipPosition="above"
+        matTooltipClass="group-updated-tooltip"
+      >
+        User<span *ngIf="data.notebook.length>1">s</span>  
+        <span class="strong" > {{data.notebook.join(', ')}} </span>
+        will be removed from this group. Removing may prevent the user
+        <span *ngIf="data.notebook.length>1">s</span> to access {{data.notebook.length>1 ? 'their' : 'his/her'}} resources
+      </p>
+      <p *ngIf="data.type === 5" class="text-center delete-user">Removing the group<span *ngIf="data.notebook.length>1">s</span> <span class="strong">{{' ' + data.notebook}}</span> from the project may prevent the users from this group<span *ngIf="data.notebook.length>1">s</span> to access their resources</p>
+        <div class="resource-list" *ngIf="data.type === 0 || data.type === 1">
+          <div class="resource-list-header">
+            <div class="resource-name">Notebook</div>
+            <div class="clusters-list">
+              <div class="clusters-list-item">
+                <div class="cluster"><span *ngIf="isClusterLength">Compute</span></div>
+                <div class="status">Further status</div>
+              </div>
+            </div>
+
+          </div>
+          <div class="scrolling-content resource-heigth">
+            <div class="resource-list-row sans node">
+              <div class="resource-name ellipsis">
+                {{notebook.name}}
+              </div>
+
+              <div class="clusters-list">
+                <div class="clusters-list-item">
+                  <div class="cluster"></div>
+                  <div class="status"
+                       [ngClass]="{
+                   'stopped': data.type === 0, 'terminated': data.type === 1
+                    }"
+                  >
+                    {{data.type  === 0 ? 'Stopped' : 'Terminated'}}
+                  </div>
+                </div>
+                <div class="clusters-list-item" *ngFor="let cluster of data.compute">
+                  <div class="cluster">{{cluster.computational_name}}</div>
+                  <div class="status" [ngClass]="{
+              'stopped': (data.type === 0 && cluster.image==='docker.datalab-dataengine'), 'terminated': data.type === 1 || (data.type===0 && cluster.image!=='docker.datalab-dataengine')
+              }">{{data.type  === 0 && cluster.image === "docker.datalab-dataengine" ? 'Stopped' : 'Terminated'}}</div>
+                </div>
+              </div>
+            </div>
+          </div>
         </div>
-      </mat-list>
 
       <div class="text-center m-top-20">
         <p class="strong">Do you want to proceed?</p>
       </div>
       <div class="text-center m-top-20">
         <button mat-raised-button type="button" class="butt action" (click)="dialogRef.close()">No</button>
-        <button *ngIf="data.type !== 4" mat-raised-button type="button" class="butt butt-success action" (click)="confirm()">Yes</button>
-        <button *ngIf="data.type === 4" mat-raised-button type="button" class="butt butt-success action" (click)="dialogRef.close(true)">Yes</button>
+        <button *ngIf="data.type !== 4 && data.type !== 5" mat-raised-button type="button" class="butt butt-success action" (click)="confirm()">Yes</button>
+        <button *ngIf="data.type === 4 || data.type === 5" mat-raised-button type="button" class="butt butt-success action" (click)="dialogRef.close(true)">Yes</button>
       </div>
     </div>
+    </div>
   </div>
-</div>
+
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.scss b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.scss
index c71e2ed..1022888 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.scss
@@ -18,7 +18,10 @@
  */
 
 .confirmation-dialog {
-  h3{
+  .content-box{
+    font-family: "Open Sans", sans-serif;
+  }
+  h4{
     margin-bottom: 20px;
   }
   color: #718ba6;
@@ -46,13 +49,6 @@
       overflow-y: auto;
     }
   }
-  .empty-list {
-    display: flex;
-    width: 100%;
-    justify-content: center;
-    color: #35afd5;
-    padding: 15px;
-  }
 
   .list-header {
     border-top: 1px solid #edf1f5;
@@ -61,3 +57,27 @@
     width: 100%;
   }
 }
+
+.content { color: #718ba6; padding: 20px 50px; font-size: 14px; font-weight: 400; margin: 0; }
+.info { color: #35afd5; }
+.info .confirm-dialog { color: #607D8B; }
+header { display: flex; justify-content: space-between; color: #607D8B; }
+header h4 i { vertical-align: bottom; }
+header a i { font-size: 20px; }
+header a:hover i { color: #35afd5; cursor: pointer; }
+.plur { font-style: normal; }
+.scrolling-content{overflow-y: auto; max-height: 200px; }
+.cluster { width: 50%; text-align: left;}
+.status { width: 50%;text-align: left;}
+.label { font-size: 15px; font-weight: 500; font-family: "Open Sans",sans-serif;}
+.node { font-weight: 300;}
+.resource-name { width: 40%;text-align: left; padding: 10px 0;line-height: 26px;}
+.clusters-list { width: 60%;text-align: left; padding: 10px 0;line-height: 26px;}
+.clusters-list-item { width: 100%;text-align: left;display: flex}
+.resource-list{max-width: 100%; margin: 0 auto;margin-top: 20px; }
+.resource-list-header{display: flex; font-weight: 600; font-size: 16px;height: 48px; border-top: 1px solid #edf1f5; border-bottom: 1px solid #edf1f5; padding: 0 20px;}
+.resource-list-row{display: flex; border-bottom: 1px solid #edf1f5;padding: 0 20px;}
+.confirm-resource-terminating{text-align: left; padding: 10px 20px;}
+.confirm-message{color: #ef5c4b;font-size: 13px;min-height: 18px; text-align: center; padding-top: 20px}
+.checkbox{margin-right: 5px;vertical-align: middle; margin-bottom: 3px;}
+label{cursor: pointer}
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.ts
index d0b5c9b..a89d40f 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.component.ts
@@ -43,9 +43,9 @@
   dataengines: Array<any> = [];
   dataengineServices: Array<any> = [];
   confirmationType: number = 0;
+  public isClusterLength: boolean;
 
   @Input() manageAction: boolean = false;
-
   @Output() buildGrid: EventEmitter<{}> = new EventEmitter();
 
   constructor(
@@ -60,21 +60,31 @@
   }
 
   ngOnInit() {
-    this.confirmationType = this.data.type;
-    this.notebook = this.data.notebook;
-    this.model = new ConfirmationDialogModel(this.confirmationType, this.notebook,
-      response => {
-        if (response.status === HTTP_STATUS_CODES.OK) this.dialogRef.close();
-      },
-      error => this.toastr.error(error.message || 'Action failed!', 'Oops'),
-      this.data.manageAction,
-      this.userResourceService,
-      this.healthStatusService,
-      this.manageEnvironmentsService);
+    if (this.data.type !== 5) {
+      this.confirmationType = this.data.type;
+      this.notebook = this.data.notebook;
+      this.model = new ConfirmationDialogModel(this.confirmationType, this.notebook,
+        response => {
+          if (response.status === HTTP_STATUS_CODES.OK) this.dialogRef.close(true);
+        },
+        error => this.toastr.error(error.message || 'Action failed!', 'Oops'),
+        this.data.manageAction,
+        this.userResourceService,
+        this.healthStatusService,
+        this.manageEnvironmentsService);
 
-    if (!this.confirmationType) this.filterResourcesByType(this.notebook.resources);
-    this.isAliveResources = this.model.isAliveResources(this.notebook.resources);
-    this.onlyKilled = this.notebook.resources ? !this.notebook.resources.some(el => el.status !== 'terminated' && el.status !== 'failed') : false;
+      if (!this.confirmationType) this.filterResourcesByType(this.data.compute);
+      this.isAliveResources = this.model.isAliveResources(this.notebook.resources);
+      this.onlyKilled = this.notebook.resources ?
+        !this.notebook.resources.some(el => el.status !== 'terminated' && el.status !== 'failed')
+        : false;
+    }
+
+    if (this.data.type === 0 || this.data.type === 1) {
+      if (this.data.compute.length) {
+        this.isClusterLength = true;
+      }
+    }
   }
 
   public confirm() {
@@ -82,12 +92,8 @@
   }
 
   private filterResourcesByType(resources) {
-    resources
-      .filter(resource =>
-        (resource.status !== 'failed' && resource.status !== 'terminated'
-          && resource.status !== 'terminating' && resource.status !== 'stopped'))
-      .forEach(resource => {
-        (resource.image === 'docker.dlab-dataengine') ? this.dataengines.push(resource) : this.dataengineServices.push(resource);
+    resources.forEach(resource => {
+        (resource.image === 'docker.datalab-dataengine') ? this.dataengines.push(resource) : this.dataengineServices.push(resource);
       });
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.model.ts b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.model.ts
index 79b0512..71abde3 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.model.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/confirmation-dialog/confirmation-dialog.model.ts
@@ -124,6 +124,9 @@
             error => fnProcessErrors(error));
       }
         break;
+      case ConfirmationDialogType.deleteGroup: {
+      }
+        break;
       default: {
         this.title = this.isAliveResources(notebook.resources) ? containRunningResourcesTerminateMessage : defaultTerminateMessage;
         this.notebook = notebook;
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/edge-action-dialog/edge-action-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/edge-action-dialog/edge-action-dialog.component.ts
index cf74931..244493d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/edge-action-dialog/edge-action-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/edge-action-dialog/edge-action-dialog.component.ts
@@ -29,24 +29,35 @@
       <h4 class="modal-title"><span class="action">{{data.type | titlecase}}</span> edge node</h4>
       <button type="button" class="close" (click)="this.dialogRef.close()">&times;</button>
     </header>
-      <div mat-dialog-content class="content message mat-dialog-content">
+      <div mat-dialog-content class="content message mat-dialog-content" >
+        <div *ngIf="data.item.length > 1; else oneNode">
           <h3 class="strong">Select the edge nodes you want to {{data.type}}</h3>
           <ul class="endpoint-list scrolling-content">
             <li *ngIf="data.item.length>1" class="endpoint-list-item header-item">
-              <label class="strong all">
-                <input type="checkbox" [(ngModel)]="isAllChecked" (change)="chooseAll()">
-                {{data.type | titlecase}} all
-              </label>
+              <span class="strong all item-wrapper" (click)="chooseAll()">
+                <div class="empty-checkbox" [ngClass]="{'checked': isAllChecked || isSomeSelected}">
+                  <span class="checked-checkbox" *ngIf="isAllChecked"></span>
+                  <span class="line-checkbox" *ngIf="isSomeSelected"></span>
+                </div>
+                <span class="pl-5">{{data.type | titlecase}} all</span>
+              </span>
             </li>
             <div class="scrolling-content" id="scrolling">
-            <li *ngFor="let endpoint of data.item" class="endpoint-list-item">
-                <label class="strong">
-                    <input type="checkbox" [(ngModel)]="endpoint.checked" (change)="endpointAction()">
-                    {{endpoint.name}}
-                </label>
-            </li>
+              <li *ngFor="let endpoint of data.item" class="endpoint-list-item">
+                <span class="strong item-wrapper" (click)="endpointAction(endpoint)">
+                  <div class="empty-checkbox" [ngClass]="{'checked': endpoint.checked}">
+                    <span class="checked-checkbox" *ngIf="endpoint.checked"></span>
+                  </div>
+                  <!--                    <input type="checkbox" [(ngModel)]="endpoint.checked" (change)="endpointAction()">      -->
+                  <span class="pl-5">{{endpoint.name}}</span>
+                </span>
+              </li>
             </div>
           </ul>
+        </div>
+        <ng-template #oneNode>
+          Edge node <span class="strong">{{data.item[0].name}}</span> wil be {{data.type === 'stop' ? 'stopped' : data.type === 'start' ? 'started' : 'recreated'}}
+        </ng-template>
 
       <p class="m-top-20 action-text"><span class="strong">Do you want to proceed?</span></p>
 
@@ -59,19 +70,18 @@
   `,
   styles: [`
     .content { color: #718ba6; padding: 20px 50px; font-size: 14px; font-weight: 400; margin: 0; }
-    .info { color: #35afd5; }
-    .info .confirm-dialog { color: #607D8B; }
     header { display: flex; justify-content: space-between; color: #607D8B; }
     header h4 i { vertical-align: bottom; }
     header a i { font-size: 20px; }
     header a:hover i { color: #35afd5; cursor: pointer; }
-    .endpoint-list{text-align: left; margin-top: 30px}
+    h3.strong{ margin-top: 10px;}
+    .endpoint-list{text-align: left; margin-top: 15px}
     .endpoint-list-item{padding: 5px 20px}
     .action{text-transform: capitalize}
     .action-text { text-align: center; }
     .scrolling-content{overflow-y: auto; max-height: 200px; }
-    label { font-size: 15px; font-weight: 300; font-family: "Open Sans",sans-serif; cursor: pointer; display: flex; align-items: center; padding-left: 10px}
-    label input {margin-top: 2px; margin-right: 10px;cursor: pointer;}
+    .item-wrapper { font-size: 15px; font-weight: 300; font-family: "Open Sans",sans-serif; cursor: pointer; display: flex; align-items: center; padding-left: 10px}
+    .item-wrapper .empty-checkbox {margin-top: 0}
     .all{font-size: 16px; padding-left: 0; font-weight: 500}
     .scrolling-content{overflow-y: auto; max-height: 200px;}
   `]
@@ -80,18 +90,24 @@
 export class EdgeActionDialogComponent implements OnDestroy {
   public endpointsNewStatus: Array<object> = [];
   public isAllChecked: boolean;
+  public isSomeSelected: boolean;
   constructor(
     public dialogRef: MatDialogRef<EdgeActionDialogComponent>,
     @Inject(MAT_DIALOG_DATA) public data: any) {
+    if (this.data.item.length === 1) {
+      this.endpointsNewStatus = this.data.item;
+    }
   }
 
-  public endpointAction() {
+  public endpointAction(target?) {
+    if (target) target.checked = !target.checked;
     this.endpointsNewStatus = this.data.item.filter(endpoint => endpoint.checked);
     this.isAllChecked = this.endpointsNewStatus.length === this.data.item.length;
+    this.isSomeSelected = this.endpointsNewStatus.length && !this.isAllChecked;
   }
 
   public chooseAll() {
-    if (this.isAllChecked) {
+    if (!this.isAllChecked) {
       this.data.item.forEach(endpoint => endpoint.checked = true);
     } else {
       this.clearCheckedNodes();
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/edge-action-dialog/index.ts b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/edge-action-dialog/index.ts
index fd6e98a..c91d503 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/edge-action-dialog/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/edge-action-dialog/index.ts
@@ -21,7 +21,7 @@
 import { CommonModule } from '@angular/common';
 import { EdgeActionDialogComponent } from './edge-action-dialog.component';
 import { MaterialModule } from '../../material.module';
-import {FormsModule} from "@angular/forms";
+import {FormsModule} from '@angular/forms';
 
 export * from './edge-action-dialog.component';
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/notification-dialog/notification-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/notification-dialog/notification-dialog.component.ts
index 20ec20f..3183929 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/notification-dialog/notification-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/notification-dialog/notification-dialog.component.ts
@@ -29,34 +29,36 @@
               <h4 class="modal-title"><i class="material-icons">priority_high</i>Warning</h4>
               <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
           </header>
-          <div mat-dialog-content class="content message">
+          <div mat-dialog-content class="content message scrolling">
             <div *ngIf="data.type === 'terminateNode'" class="table-header">
               <div *ngIf="data.item.action.endpoint.length > 0">
-                Edge node<span *ngIf="data.item.action.endpoint.length>1">s</span>
-                        <span class="strong">{{ ' ' + data.item.action.endpoint.join(', ') }}</span> in project
+                Edge node<span *ngIf="data.item.action.endpoint.length>1">s</span>&nbsp;<span class="strong">{{ data.item.action.endpoint.join(', ') }}</span> in project
                 <span class="strong">{{ data.item.action.project_name }}</span> will be terminated.
               </div>
             </div>
-              <div *ngIf="data.type === 'list'" class="info">
-                  <div *ngIf="data.template.notebook.length > 0">
-                      Following notebook server<span *ngIf="data.template.notebook.length>1">s </span>
-                      <span *ngFor="let item of data.template.notebook">
-                        <span class="strong">{{ item.exploratory_name }}</span>
+              <div  *ngIf="data.type === 'list'" class="info pb-10">
+                  <div class="quota-message" *ngIf="data.template.notebook?.length > 0">
+                      Following notebook server<span *ngIf="data.template.notebook.length>1 || data.template.notebook[0].notebook.length>1">s</span><span *ngFor="let item of data.template.notebook">
+                        <span class="strong blue" *ngFor="let notebook of item.notebook; let i = index">{{i === 0 ? '' : ', '}} {{ notebook }}</span> in project <span
+                        class="strong blue">{{ item.project }}</span>
                         <span *ngIf="data.template.notebook.length > 1">, </span>
-                      </span> will be stopped and all computational resources will be stopped/terminated
+                      </span> will be stopped and all computes will be stopped/terminated
                   </div>
 
-                  <div *ngIf="data.template.cluster.length > 0">
-                      <p *ngFor="let item of data.template.cluster">
-                          Computational resource<span *ngIf="data.template.cluster.length > 1">s </span>
-                          <span class="strong">{{ item.computational_name }}</span> on <span
-                              class="strong">{{ item.exploratory_name }}</span>
+                  <div class="quota-message" *ngIf="data.template.cluster?.length > 0">
+                      <p>
+                          Computational resource<span *ngIf="data.template.cluster.length > 1">s</span>&nbsp;<span *ngFor="let item of data.template.cluster; let i = index">{{i === 0 ? '' : ', '}}<span class="strong blue">{{ item.computational_name }}</span> for <span
+                                class="strong blue">{{ item.exploratory_name }}</span> in project <span
+                          class="strong blue">{{ item.project }}</span>
+                          </span>
                           will be stopped
                       </p>
                   </div>
-                  <span class="strong">by a schedule in 15 minutes.</span>
+                  <span class="strong blue pb-10">by a schedule in less than 15 minutes</span>.
               </div>
-              <div *ngIf="data.type === 'message'"><span [innerHTML]="data.template"></span></div>
+              <div class="alert" *ngIf="data.type === 'message'">
+                <span  class='highlight'[innerHTML]="data.template"></span>
+              </div>
               <div *ngIf="data.type === 'confirmation'" class="confirm-dialog">
                   <p *ngIf="data.template; else label">
                       <span [innerHTML]="data.template"></span>
@@ -77,11 +79,11 @@
                               <div class="resource-name">Resource</div>
                               <div class="project">Project</div>
                           </div>
-                          <div class="scrolling-content resource-heigth">
+                          <div class="scrolling-content resource-heigth scrolling">
                               <div class="resource-list-row sans node" *ngFor="let project of data.list">
                                   <div class="resource-name ellipsis">
                                       <div>Edge node</div>
-                                      <div *ngFor="let notebook of project.resource">{{notebook.exploratory_name}}</div>
+                                      <div *ngFor="let notebook of project['resource']">{{notebook['exploratory_name']}}</div>
                                   </div>
                                   <div class="project ellipsis">{{project.name}}</div>
                               </div>
@@ -94,7 +96,7 @@
 <!--                          </label>-->
 <!--                      </div>-->
                       <p class="confirm-message">
-                          <span *ngIf="!willNotTerminate">All connected computational resources will be terminated as well.</span>
+                          <span *ngIf="!willNotTerminate">All connected computes will be terminated as well.</span>
                       </p>
                   </div>
                   <mat-list *ngIf="data.item.endpoints?.length">
@@ -102,7 +104,7 @@
                           <div class="endpoint">Edge node in endpoint</div>
                           <div class="status">Further status</div>
                       </mat-list-item>
-                      <div class="scrolling-content">
+                      <div class="scrolling-content scrolling">
                           <mat-list-item *ngFor="let endpoint of filterEndpoints()" class="sans node">
                               <div class="endpoint ellipsis">{{endpoint.name}}</div>
                               <div class="status terminated">Terminated</div>
@@ -112,29 +114,29 @@
                 <p class="m-top-20"><span class="strong">Do you want to proceed?</span></p>
                   <div class="text-center m-top-30 m-bott-10">
                       <button type="button" class="butt" mat-raised-button (click)="dialogRef.close()">No</button>
-                      <button *ngIf="!this.willNotTerminate" type="button" class="butt butt-success" mat-raised-button
-                              (click)="dialogRef.close('terminate')">Yes
-                      </button>
-                      <button *ngIf="this.willNotTerminate" type="button" class="butt butt-success" mat-raised-button
-                              (click)="dialogRef.close('noTerminate')">Yes
+                      <button type="button" class="butt butt-success" mat-raised-button
+                              (click)="dialogRef.close(true)">Yes
                       </button>
                   </div>
               </div>
                <div class="confirm-dialog" *ngIf="data.type === 'terminateNode'">
-                   <mat-list *ngIf="data.item.resources.length > 0">
-                     <mat-list-item class="list-header sans">
-                       <div class="endpoint">Resources</div>
-                       <div class="status">Further status</div>
+                 <mat-list *ngIf="data.item.resources.length > 0; else noResources">
+                   <mat-list-item class="list-header sans">
+                     <div class="endpoint">Resources</div>
+                     <div class="status">Further status</div>
+                   </mat-list-item>
+                   <div class="scrolling-content scrolling">
+                     <mat-list-item *ngFor="let resource of data.item.resources" class="sans node">
+                       <div class="endpoint ellipsis">{{resource}}</div>
+                       <div class="status terminated">Terminated</div>
                      </mat-list-item>
-                     <div class="scrolling-content">
-                       <mat-list-item *ngFor="let resource of data.item.resources" class="sans node">
-                         <div class="endpoint ellipsis">{{resource}}</div>
-                         <div class="status terminated">Terminated</div>
-                       </mat-list-item>
-                     </div>
-                   </mat-list>
+                   </div>
+                 </mat-list>
+                 <ng-template #noResources>
+                   There are not related resources to this edge node.
+                 </ng-template>
                    <div mat-dialog-content class="bottom-message" *ngIf="data.item.resources.length > 0">
-                     <span class="confirm-message">All connected computational resources will be terminated as well.</span>
+                     <span class="confirm-message">All connected computes will be terminated as well.</span>
                    </div>
                  <p class="m-top-20"><span class="strong">Do you want to proceed?</span></p>
                  <div class="text-center m-top-30 m-bott-10">
@@ -156,7 +158,7 @@
     header a i { font-size: 20px; }
     header a:hover i { color: #35afd5; cursor: pointer; }
     .plur { font-style: normal; }
-    .scrolling-content{overflow-y: auto; max-height: 200px; }
+    .scrolling-content{overflow-y: auto; max-height: 200px; border-bottom: 1px solid #edf1f5; }
     .endpoint { width: 70%; text-align: left; color: #577289;}
     .status { width: 30%;text-align: left;}
     .label { font-size: 15px; font-weight: 500; font-family: "Open Sans",sans-serif;}
@@ -164,16 +166,18 @@
     .resource-name { width: 280px;text-align: left; padding: 10px 0;line-height: 26px;}
     .project { width: 30%;text-align: left; padding: 10px 0;line-height: 26px;}
     .resource-list{max-width: 100%; margin: 0 auto;margin-top: 20px; }
-    .resource-list-header{display: flex; font-weight: 600; font-size: 16px;height: 48px; border-top: 1px solid #edf1f5; border-bottom: 1px solid #edf1f5; padding: 0 20px;}
+    .resource-list-header{display: flex; font-weight: 600; font-size: 14px;height: 48px; border-top: 1px solid #edf1f5; border-bottom: 1px solid #edf1f5; padding: 0 20px;}
     .resource-list-row{display: flex; border-bottom: 1px solid #edf1f5;padding: 0 20px;}
+    .resource-list-row:last-child{border-bottom: none}
     .confirm-resource-terminating{text-align: left; padding: 10px 20px;}
     .confirm-message{color: #ef5c4b;font-size: 13px;min-height: 18px; text-align: center; padding-top: 20px}
     .checkbox{margin-right: 5px;vertical-align: middle; margin-bottom: 3px;}
     label{cursor: pointer}
-    .bottom-message{padding-top: 15px;}
+    .bottom-message{padding-top: 15px; overflow: hidden}
     .table-header{padding-bottom: 10px;}
-
-
+    .alert{text-align: left; line-height: 22px; padding-bottom: 25px;padding-top: 15px;}
+    .quota-message{padding-top: 10px}
+    .mat-list-base .mat-list-item { font-size: 15px}
   `]
 })
 export class NotificationDialogComponent {
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/odahu-action-dialog/index.ts b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/odahu-action-dialog/index.ts
new file mode 100644
index 0000000..0f41ff5
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/odahu-action-dialog/index.ts
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { OdahuActionDialogComponent } from './odahu-action-dialog.component';
+import { MaterialModule } from '../../material.module';
+import {FormsModule} from '@angular/forms';
+
+export * from './odahu-action-dialog.component';
+
+@NgModule({
+  imports: [CommonModule, MaterialModule, FormsModule],
+  declarations: [OdahuActionDialogComponent],
+  entryComponents: [OdahuActionDialogComponent],
+  exports: [OdahuActionDialogComponent]
+})
+export class OdahuActionDialogModule {}
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/odahu-action-dialog/odahu-action-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/odahu-action-dialog/odahu-action-dialog.component.ts
new file mode 100644
index 0000000..d24c3c9
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/modal-dialog/odahu-action-dialog/odahu-action-dialog.component.ts
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Component, Inject } from '@angular/core';
+import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+
+
+@Component({
+  selector: 'edge-action-dialog',
+  template: `
+  <div id="dialog-box">
+    <header class="dialog-header">
+      <h4 class="modal-title"><span class="action">{{data.type | titlecase}}</span> Odahu cluster</h4>
+      <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
+    </header>
+      <div mat-dialog-content class="content message mat-dialog-content">
+          <h3>Odahu cluster <span class="strong">{{data.item.name}} </span>will be {{label[data.type]}}</h3>
+      <p class="m-top-20 action-text"><span class="strong">Do you want to proceed?</span></p>
+
+      <div class="text-center m-top-30 m-bott-30">
+        <button type="button" class="butt" mat-raised-button (click)="dialogRef.close()">No</button>
+        <button type="button" class="butt butt-success" mat-raised-button (click)="dialogRef.close(true)">Yes</button>
+      </div>
+      </div>
+  </div>
+  `,
+  styles: [`
+    .content { color: #718ba6; padding: 20px 50px; font-size: 14px; font-weight: 400; margin: 0; }
+    .info .confirm-dialog { color: #607D8B; }
+    header { display: flex; justify-content: space-between; color: #607D8B; }
+    h3 { font-weight: 300; }
+    header h4 i { vertical-align: bottom; }
+    header a i { font-size: 20px; }
+    header a:hover i { color: #35afd5; cursor: pointer; }
+    .action{text-transform: capitalize}
+    .action-text { text-align: center; }
+    label { font-size: 15px; font-weight: 500; font-family: "Open Sans",sans-serif; cursor: pointer; display: flex; align-items: center;}
+    label input {margin-top: 2px; margin-right: 5px;}
+  `]
+})
+
+export class OdahuActionDialogComponent {
+  public label = {
+    stop: 'stopped',
+    start: 'started',
+    terminate: 'terminated',
+  };
+
+  constructor(
+    public dialogRef: MatDialogRef<OdahuActionDialogComponent>,
+    @Inject(MAT_DIALOG_DATA) public data: any) {
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/navbar/index.ts b/services/self-service/src/main/resources/webapp/src/app/shared/navbar/index.ts
index 7a6f2d4..0041163 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/navbar/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/navbar/index.ts
@@ -22,10 +22,11 @@
 import { RouterModule } from '@angular/router';
 import { MaterialModule } from '../material.module';
 import { ProgressDialogModule, BubbleModule } from '../index';
-
 import { NavbarComponent } from './navbar.component';
 import { NotificationDialogModule } from '../modal-dialog/notification-dialog';
-import {EdgeActionDialogModule} from "../modal-dialog/edge-action-dialog";
+import {EdgeActionDialogModule} from '../modal-dialog/edge-action-dialog';
+import {OdahuActionDialogModule} from '../modal-dialog/odahu-action-dialog';
+
 
 export * from './navbar.component';
 
@@ -38,6 +39,7 @@
     EdgeActionDialogModule,
     ProgressDialogModule,
     BubbleModule,
+    OdahuActionDialogModule
   ],
   declarations: [NavbarComponent],
   exports: [NavbarComponent, RouterModule]
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.html b/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.html
index d8b2322..c539dbb 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.html
@@ -18,7 +18,8 @@
   -->
 
 <div class="nav-bar" [hidden]="!isLoggedIn">
-  <mat-progress-bar *ngIf="showProgressBar" mode="indeterminate"></mat-progress-bar>
+<!--  <mat-progress-bar *ngIf="showProgressBar" mode="indeterminate"></mat-progress-bar>-->
+  <mat-progress-bar *ngIf="progressBarService.showProgressBar | async" mode="indeterminate"></mat-progress-bar>
   <div class="menu-area" *ngIf="healthStatus">
 
     <button class="hamburger" (click)="collapse()">
@@ -28,7 +29,7 @@
     </button>
 
     <a [routerLink]="['/resources_list']" class="navbar-logo">
-      <img src="assets/img/logo-nav.png" alt="">
+      <img src="assets/svg/logo.svg" alt="">
     </a>
   </div>
 
@@ -65,9 +66,9 @@
   </div>
 
 </div>
-<mat-sidenav-container class="example-container" autosize>
-  <mat-sidenav #drawer mode="side" opened role="navigation" [style.width]="isExpanded ? '220px' : '60px'" disableClose>
-    <mat-nav-list>
+<mat-sidenav-container class="example-container" autosize >
+  <mat-sidenav #drawer mode="side" opened role="navigation" [style.width]="isExpanded ? '220px' : '60px'" disableClose *ngIf="healthStatus">
+    <mat-nav-list >
       <nav>
         <div>
           <a class="nav-item" [routerLink]="['/resources_list']" [routerLinkActive]="['active']"
@@ -88,17 +89,36 @@
               <span *ngIf="isExpanded; else projects">Projects</span>
               <ng-template #projects><i class="material-icons">dns</i></ng-template>
             </a>
+<!--            <a class="sub-nav-item" [style.margin-left.px]="isExpanded ? '30' : '0'" [routerLink]="['/odahu']"-->
+<!--               [routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}">-->
+<!--              <span *ngIf="isExpanded; else odahu">Odahu deployment</span>-->
+<!--              <ng-template #odahu><i class="material-icons">get_app</i></ng-template>-->
+<!--            </a>-->
             <a class="sub-nav-item" [style.margin-left.px]="isExpanded ? '30' : '0'"
               [routerLink]="['/environment_management']" [routerLinkActive]="['active']"
               [routerLinkActiveOptions]="{exact:true}">
               <span *ngIf="isExpanded; else env">Environment Management</span>
               <ng-template #env><i class="material-icons">settings</i></ng-template>
             </a>
+            <a *ngIf="healthStatus?.admin" class="sub-nav-item" [style.margin-left.px]="isExpanded ? '30' : '0'"
+               [routerLink]="['/configuration']" [routerLinkActive]="['active']"
+               [routerLinkActiveOptions]="{exact:true}" >
+              <span *ngIf="isExpanded; else env">Configuration</span>
+              <ng-template #env><i class="material-icons">build_circle</i></ng-template>
+            </a>
           </a>
-          <a *ngIf="healthStatus?.billingEnabled" class="nav-item" [routerLink]="['/billing_report']"
-            [routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}">
-            <span *ngIf="isExpanded; else billing">Billing Report</span>
-            <ng-template #billing><i class="material-icons">account_balance_wallet</i></ng-template>
+          <a class="nav-item has-children" *ngIf="healthStatus?.billingEnabled || healthStatus?.auditEnabled">
+            <span *ngIf="isExpanded">Reports</span>
+            <a *ngIf="healthStatus?.auditEnabled" class="sub-nav-item" [routerLink]="['/audit']" [style.margin-left.px]="isExpanded ? '30' : '0'"
+               [routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}">
+              <span *ngIf="isExpanded; else audit">Audit</span>
+              <ng-template #audit><i class="material-icons">library_books</i></ng-template>
+            </a>
+            <a *ngIf="healthStatus?.billingEnabled" class="sub-nav-item" [routerLink]="['/billing_report']"
+              [routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}" [style.margin-left.px]="isExpanded ? '30' : '0'">
+              <span *ngIf="isExpanded; else billing">Billing</span>
+              <ng-template #billing><i class="material-icons">account_balance_wallet</i></ng-template>
+            </a>
           </a>
         </div>
 <!--        <div>-->
@@ -107,7 +127,6 @@
 <!--            <span *ngIf="isExpanded; else endpoint">Cloud Endpoint API</span>-->
 <!--            <ng-template #endpoint>-->
 <!--              <span>-->
-<!--                <svg width="30px" height="27px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">-->
 <!--                  <g>-->
 <!--                    <path d="M127.059657,255.996921 C58.8506544,255.526472 -0.457073619,198.918442 0.00265506057,126.998303 C0.444649399,57.7958628 57.9516598,-0.468967577 129.11002,0.00284555012 C198.267128,0.462386081 256.613109,57.8667711 255.995136,128.194199 C256.568091,197.883453 197.934268,256.489189 127.059657,255.996921 Z M127.059657,255.996921 C58.8506544,255.526472 -0.457073619,198.918442 0.00265506057,126.998303 C0.444649399,57.7958628 57.9516598,-0.468967577 129.11002,0.00284555012 C198.267128,0.462386081 256.613109,57.8667711 255.995136,128.194199 C256.568091,197.883453 197.934268,256.489189 127.059657,255.996921 Z" fill="#FFFFFF"></path>-->
 <!--                    <path id="swager-bgr" d="M127.184644,238.997327 C68.0323765,238.589271 16.6036091,189.498744 17.0023028,127.131428 C17.3860285,67.1185953 67.2554,16.5917106 128.963117,17.0024872 C188.934544,17.4010221 239.531905,67.1825241 238.995778,128.169251 C239.492444,188.602381 188.64743,239.424426 127.184644,238.997327 Z M127.184644,238.997327 C68.0323765,238.589271 16.6036091,189.498744 17.0023028,127.131428 C17.3860285,67.1185953 67.2554,16.5917106 128.963117,17.0024872 C188.934544,17.4010221 239.531905,67.1825241 238.995778,128.169251 C239.492444,188.602381 188.64743,239.424426 127.184644,238.997327 Z" fill="#577289"></path>-->
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.scss b/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.scss
index fd1e8e9..86480bd 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.scss
@@ -36,7 +36,7 @@
     align-items: center;
 
     .navbar-logo {
-      width: 65px;
+      width: 85px;
       align-self: center;
       margin-left: 10px;
 
@@ -106,6 +106,8 @@
       border-radius: 0;
       font-size: 14px;
       cursor: pointer;
+      min-width: 280px;
+      text-align: left;
 
       .user-name {
         color: #36afd5;
@@ -238,7 +240,7 @@
 
 .hamburger {
   border: none;
-  padding: 0px;
+  padding: 0;
   background: none;
   outline: none;
   width: 60px;
@@ -326,3 +328,7 @@
     max-height: 100%;
   }
 }
+
+.blue{
+  color: #35afd5;
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.ts
index 1f33caa..bdb2b86 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/navbar/navbar.component.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { Component, ViewEncapsulation, OnInit, OnDestroy, ViewChild } from '@angular/core';
+import {Component, ViewEncapsulation, OnInit, OnDestroy, ViewChild, ChangeDetectorRef, ApplicationRef} from '@angular/core';
 import { MatDialog, MatDialogRef } from '@angular/material/dialog';
 import {Subscription, timer, interval, Subject} from 'rxjs';
 import { ToastrService } from 'ngx-toastr';
@@ -25,8 +25,6 @@
 
 import { ApplicationSecurityService, HealthStatusService, AppRoutingService, SchedulerService, StorageService } from '../../core/services';
 import { GeneralEnvironmentStatus } from '../../administration/management/management.model';
-import { DICTIONARY } from '../../../dictionary/global.dictionary';
-import { FileUtils } from '../../core/util';
 import { NotificationDialogComponent } from '../modal-dialog/notification-dialog';
 import {
   trigger,
@@ -34,15 +32,18 @@
   transition,
   style,
   query, group,
-  sequence,
-  animateChild,
-  state
+
 } from '@angular/animations';
-import {skip} from 'rxjs/operators';
+import {skip, take} from 'rxjs/operators';
 import {ProgressBarService} from '../../core/services/progress-bar.service';
 
+
+interface Quota {
+  projectQuotas: {};
+  totalQuotaUsed: number;
+}
 @Component({
-  selector: 'dlab-navbar',
+  selector: 'datalab-navbar',
   templateUrl: 'navbar.component.html',
   styleUrls: ['./navbar.component.scss'],
   animations: [trigger('fadeAnimation', [
@@ -76,7 +77,7 @@
 })
 export class NavbarComponent implements OnInit, OnDestroy {
 
-  private readonly CHECK_ACTIVE_SCHEDULE_TIMEOUT: number = 55000;
+  private readonly CHECK_ACTIVE_SCHEDULE_TIMEOUT: number = 300000;
   private readonly CHECK_ACTIVE_SCHEDULE_PERIOD: number = 15;
 
   currentUserName: string;
@@ -84,10 +85,8 @@
   isLoggedIn: boolean = false;
   metadata: any;
   isExpanded: boolean = true;
-  public showProgressBar: any = false;
   healthStatus: GeneralEnvironmentStatus;
   subscriptions: Subscription = new Subscription();
-  showProgressBarSubscr = new Subscription();
 
   constructor(
     public toastr: ToastrService,
@@ -97,11 +96,10 @@
     private schedulerService: SchedulerService,
     private storage: StorageService,
     private dialog: MatDialog,
-    private progressBarService: ProgressBarService,
+    public progressBarService: ProgressBarService,
   ) { }
 
   ngOnInit() {
-    this.showProgressBarSubscr = this.progressBarService.showProgressBar.subscribe(isProgressBarVissible => this.showProgressBar = isProgressBarVissible);
     this.applicationSecurityService.loggedInStatus.subscribe(response => {
       this.subscriptions.unsubscribe();
       this.subscriptions.closed = false;
@@ -110,7 +108,7 @@
       if (this.isLoggedIn) {
         this.subscriptions.add(this.healthStatusService.statusData.pipe(skip(1)).subscribe(result => {
           this.healthStatus = result;
-          result.status && this.checkQuoteUsed(this.healthStatus);
+          result.status && this.checkQuoteUsed();
           result.status && !result.projectAssigned && !result.admin && this.checkAssignment(this.healthStatus);
         }));
         this.subscriptions.add(timer(0, this.CHECK_ACTIVE_SCHEDULE_TIMEOUT).subscribe(() => this.refreshSchedulerData()));
@@ -122,7 +120,6 @@
 
   ngOnDestroy(): void {
     this.subscriptions.unsubscribe();
-    this.showProgressBarSubscr.unsubscribe();
   }
 
   public getRouterOutletState(routerOutlet: RouterOutlet) {
@@ -148,9 +145,9 @@
     this.isExpanded = !this.isExpanded;
   }
 
-  public emitQuotes(alert, user_quota?, total_quota?): void {
+  public emitQuotes(alert, total_quota?, exideedProjects?, informProjects?): void {
     const dialogRef: MatDialogRef<NotificationDialogComponent> = this.dialog.open(NotificationDialogComponent, {
-      data: { template: this.selectAlert(alert, user_quota, total_quota), type: 'message' },
+      data: { template: this.selectAlert(alert, total_quota, exideedProjects, informProjects), type: 'message' },
       width: '550px'
     });
     dialogRef.afterClosed().subscribe(() => {
@@ -158,17 +155,41 @@
     });
   }
 
-  private checkQuoteUsed(params): void {
-    if (!this.storage.getBillingQuoteUsed() && params) {
-      let checkQuotaAlert = '';
+  private checkQuoteUsed(): void {
+    if (!this.storage.getBillingQuoteUsed( )) {
+      this.healthStatusService.getQuotaStatus().pipe(take(1)).subscribe((params: Quota) => {
+        let checkQuotaAlert = '';
+        const exceedProjects = [], informProjects = [];
+        Object.keys(params.projectQuotas).forEach(key => {
+          if (params.projectQuotas[key] > this.quotesLimit && params.projectQuotas[key] < 100) {
+            informProjects.push(key);
+          } else if (params.projectQuotas[key] >= 100) {
+            exceedProjects.push(key);
+          }
+        });
 
-      if (params.billingUserQuoteUsed >= this.quotesLimit && params.billingUserQuoteUsed < 100) checkQuotaAlert = 'user_quota';
-      if (params.billingQuoteUsed >= this.quotesLimit && params.billingQuoteUsed < 100) checkQuotaAlert = 'total_quota';
-      if (Number(params.billingUserQuoteUsed) >= 100) checkQuotaAlert = 'user_exceed';
-      if (Number(params.billingQuoteUsed) >= 100) checkQuotaAlert = 'total_exceed';
+        if (informProjects.length > 0 && exceedProjects.length === 0) checkQuotaAlert = 'project_quota';
+        if (params.totalQuotaUsed >= this.quotesLimit && params.totalQuotaUsed < 100) checkQuotaAlert = 'total_quota';
+        if (exceedProjects.length > 0 && informProjects.length === 0) checkQuotaAlert = 'project_exceed';
+        if (informProjects.length > 0 && exceedProjects.length > 0) checkQuotaAlert = 'project_inform_and_exceed';
+        if (params.totalQuotaUsed >= this.quotesLimit && params.totalQuotaUsed < 100 && exceedProjects.length > 0) {
+          checkQuotaAlert = 'total_quota_and_project_exceed';
+        }
+        if (params.totalQuotaUsed >= this.quotesLimit && params.totalQuotaUsed < 100
+          && informProjects.length > 0 && exceedProjects.length > 0) checkQuotaAlert = 'total_quota_and_project_inform_and_exceed';
 
-      if (this.dialog.openDialogs.length > 0 || this.dialog.openDialogs.length > 0) return;
-      checkQuotaAlert && this.emitQuotes(checkQuotaAlert, params.billingUserQuoteUsed, params.billingQuoteUsed);
+
+        if (Number(params.totalQuotaUsed) >= 100) checkQuotaAlert = 'total_exceed';
+
+        if (checkQuotaAlert === '') {
+          this.storage.setBillingQuoteUsed('informed');
+        } else {
+          this.storage.setBillingQuoteUsed('');
+        }
+
+        if (this.dialog.openDialogs.length > 0 || this.dialog.openDialogs.length > 0) return;
+        checkQuotaAlert && this.emitQuotes(checkQuotaAlert, params.totalQuotaUsed, exceedProjects, informProjects);
+      });
     }
   }
 
@@ -194,6 +215,15 @@
     const memo = { notebook: [], cluster: [] };
     sheduler_data.map(item => !item.computational_name ? memo.notebook.push(item) : memo.cluster.push(item));
     memo.cluster = memo.cluster.filter(el => !memo.notebook.some(elm => el.exploratory_name === elm.exploratory_name));
+    memo.notebook = memo.notebook.reduce((acc, v) => {
+      const existedProject = acc.find(el => el.project === v.project);
+      if (existedProject) {
+        existedProject.notebook.push(v.exploratory_name);
+      } else {
+        acc.push({project: v.project, notebook: [v.exploratory_name]});
+      }
+      return acc;
+    }, []);
     return memo;
   }
 
@@ -206,27 +236,48 @@
       });
   }
 
-  private selectAlert(type: string, user_quota?: number, total_quota?: number): string {
+  private selectAlert(type: string, total_quota?: number, exideedProjects?: string[], informProjects?: string[]): string {
     const alerts = {
-      user_exceed: `Dear <b>${this.currentUserName}</b>,<br />
-          DLab cloud infrastructure usage quota associated with your user has been exceeded.
-          All your analytical environment will be stopped. To proceed working with environment,
-          request increase of user quota from DLab administrator.`,
-      total_exceed: `Dear <b>${this.currentUserName}</b>,<br />
-          DLab cloud infrastructure usage quota has been exceeded.
-          All your analytical environment will be stopped. To proceed working with environment,
-          request increase application quota from DLab administrator.`,
-      user_quota: `Dear <b>${this.currentUserName}</b>,<br />
-          Cloud infrastructure usage quota associated with your user has been used for <b>${user_quota}%</b>.
-          Once quota is depleted all your analytical environment will be stopped.
-          To proceed working with environment you'll have to request increase of user quota from DLab administrator.`,
-      total_quota: `Dear <b>${this.currentUserName}</b>,<br />
-          DLab cloud infrastructure usage quota has been used for <b>${total_quota}%</b>.
-          Once quota is depleted all your analytical environment will be stopped.
-          To proceed working with environment you'll have to request increase of user quota from DLab administrator. `,
-      permissions: `Dear <b>${this.currentUserName}</b>,<br />
+      total_quota_and_project_inform_and_exceed: `Dear <span class="strong">${this.currentUserName}</span>,<br /><br />
+          DataLab cloud infrastructure usage quota has been used for <span class="strong">${total_quota}%</span>.
+          Once quota is depleted all your analytical environment will be stopped.<br /><br />
+          Quota associated with project(s) <span class="strong">${exideedProjects.join(', ')}</span> has been exceeded. All your analytical environment will be stopped.<br /><br />
+          Quota associated with project(s) <span class="strong">${informProjects.join(', ')}</span> has been used over <span class="strong">${this.quotesLimit}%</span>.
+          If quota is depleted all your analytical environment will be stopped.<br /><br />
+          To proceed working with environment you'll have to request increase of quota from DataLab administrator. `,
+
+      total_quota_and_project_exceed: `Dear <span class="strong">${this.currentUserName}</span>,<br /><br />
+          DataLab cloud infrastructure usage quota has been used for <span class="strong">${total_quota}%</span>.
+          Once quota is depleted all your analytical environment will be stopped.<br /><br />
+          Quota associated with project(s) <span class="strong">${exideedProjects.join(', ')}</span> has been exceeded. All your analytical environment will be stopped.<br /><br />
+          To proceed working with environment you'll have to request increase of quota from DataLab administrator. `,
+
+      project_inform_and_exceed: `Dear <span class="strong">${this.currentUserName}</span>,<br /><br />
+          DataLab cloud infrastructure usage quota associated with project(s) <span class="strong">${exideedProjects.join(', ')}</span> has been exceeded. All your analytical environment will be stopped.<br /><br />
+          Quota associated with project(s) <span class="strong">${informProjects.join(', ')}</span> has been used over <span class="strong">${this.quotesLimit}%</span>.
+          If quota is depleted all your analytical environment will be stopped.<br /><br />
+          To proceed working with environment, request increase of project quota from DataLab administrator.`,
+      project_exceed: `Dear <span class="strong">${this.currentUserName}</span>,<br /><br />
+          DataLab cloud infrastructure usage quota associated with project(s) <span class="strong">${exideedProjects.join(', ')}</span> has been exceeded.
+          All your analytical environment will be stopped.<br /><br />
+          To proceed working with environment,
+          request increase of project(s) quota from DataLab administrator.`,
+      total_exceed: `Dear <span class="strong">${this.currentUserName}</span>,<br /><br />
+          DataLab cloud infrastructure usage quota has been exceeded.
+          All your analytical environment will be stopped.<br /><br />
+          To proceed working with environment,
+          request increase application quota from DataLab administrator.`,
+      project_quota: `Dear <span class="strong">${this.currentUserName}</span>,<br /><br />
+          Cloud infrastructure usage quota associated with project(s) <span class="strong">${informProjects.join(', ')}</span> has been used over <span class="strong">${this.quotesLimit}%</span>.
+          Once quota is depleted all your analytical environment will be stopped.<br /><br />
+          To proceed working with environment you'll have to request increase of project(s) quota from DataLab administrator.`,
+      total_quota: `Dear <span class="strong">${this.currentUserName}</span>,<br /><br />
+          DataLab cloud infrastructure usage quota has been used for <span class="strong">${total_quota}%</span>.
+          Once quota is depleted all your analytical environment will be stopped.<br /><br />
+          To proceed working with environment you'll have to request increase of total quota from DataLab administrator. `,
+      permissions: `Dear <span class="strong">${this.currentUserName}</span>,<br /><br />
           Currently, you are not assigned to any project. To start working with the environment
-          request permission from DLab administrator.`
+          request permission from DataLab administrator.`
     };
 
     return alerts[type];
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/index.ts b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/index.ts
index 9161e89..4133045 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/index.ts
@@ -28,11 +28,12 @@
   TimePickerComponent,
   TimePickerDialogComponent
 } from './time-picker.component';
+import {LocalDatePipeModule} from '../../core/pipes/local-date-pipe';
 
 export * from './time-picker.component';
 
 @NgModule({
-  imports: [CommonModule, FormsModule, ReactiveFormsModule, MaterialModule],
+    imports: [CommonModule, FormsModule, ReactiveFormsModule, MaterialModule, LocalDatePipeModule],
   declarations: [TimePickerComponent, TimePickerDialogComponent, TimeCoverComponent, TickerComponent],
   entryComponents: [TimePickerDialogComponent],
   exports: [TimePickerComponent]
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/ticker.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/ticker.component.ts
index d6f7874..6600838 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/ticker.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/ticker.component.ts
@@ -56,7 +56,7 @@
   @Input() public color: string;
 
   public steps = new Array<number>();
-  private selectedTimePart;
+  public selectedTimePart;
 
   private format: number = 12;
   private degrees: number;
@@ -117,14 +117,14 @@
     return style;
   }
 
-  private getTimeValueClass(step: number, index: number) {
+  public getTimeValueClass(step: number, index: number) {
     let classes = 'ticker-step ticker-deg' + this.degrees * (index + 1);
     if (this.selectedTimePart === step) classes += ' mat-primary';
 
     return classes;
   }
 
-  private changeTimeValue(step: number) {
+  public changeTimeValue(step: number) {
     if (this.currentTemplate === CLOCK_TYPE.HOURS) {
       this.pickTime.hour = step;
       this.viewChange.emit(CLOCK_TYPE.MINUTES);
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.scss b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.scss
index 999d7d7..55909ef 100755
--- a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.scss
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.scss
@@ -214,6 +214,7 @@
       .mat-mini-fab {
         box-shadow: none;
         background-color: transparent;
+        transform: translateX(0);
       }
     }
 
@@ -226,6 +227,7 @@
       pointer-events: none;
       box-shadow: none;
       cursor: none;
+      transform: none;
     }
   }
 }
@@ -292,7 +294,7 @@
 
 .ticker-deg180 {
   top: 100%;
-  left: 50%;
+  left: 51%;
 }
 
 .ticker-deg195 {
@@ -302,7 +304,7 @@
 
 .ticker-deg210 {
   top: 93.30127019%;
-  left: 25%;
+  left: 26%;
 }
 
 .ticker-deg225 {
@@ -312,17 +314,17 @@
 
 .ticker-deg240 {
   top: 75%;
-  left: 6.69872981%;
+  left: 7.69872981%;
 }
 
 .ticker-deg255 {
   top: 62.94095226%;
-  left: 1.703708686%;
+  left: 2.703708686%;
 }
 
 .ticker-deg270 {
   top: 50%;
-  left: 0%;
+  left: 1%;
 }
 
 .ticker-deg285 {
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.ts
index 020872e..7b1f38d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.ts
@@ -21,14 +21,20 @@
 import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 
 import { CLOCK_TYPE, TimeFormat } from './ticker.component';
+import {SchedulerCalculations} from '../../resources/scheduler/scheduler.calculations';
 type TimeFormatAlias = TimeFormat;
-     
+
 @Component({
-  selector: 'dlab-time-picker',
+  selector: 'datalab-time-picker',
   template: `
     <div class="time-picker">
       <mat-form-field class="time-select">
-        <input matInput placeholder="{{ label }}" [value]="selectedTime" (input)="checkEmpty($event.target.value)" [disabled]="disable">
+        <input matInput
+               placeholder="{{ label }}"
+               [value]="(selectedTime | localDate : 'shortTime') || null"
+               (input)="checkEmpty($event.target['value'])"
+               [disabled]="disable"
+        />
         <mat-icon matSuffix [ngClass]="{'not-allowed': disable}" (click)="openDatePickerDialog($event)" disabled="disable">access_time</mat-icon>
       </mat-form-field>
     </div>`,
@@ -38,14 +44,16 @@
   @Input() pickTime: TimeFormatAlias;
   @Input() label: string = 'Select time';
   @Input() disable: boolean = false;
+  @Input() milisecTime: number;
   @Output() pickTimeChange: EventEmitter<TimeFormatAlias> = new EventEmitter();
+  @Output() milisecTimeChange: EventEmitter<TimeFormatAlias> = new EventEmitter();
 
   constructor(private dialog: MatDialog) { }
 
   ngOnInit() { }
 
-  public get selectedTime(): string {
-    return !this.pickTime ? '' : `${this.pickTime.hour}:${this.getFullMinutes()} ${this.pickTime.meridiem}`;
+  public get selectedTime(): string | number {
+    return !this.pickTime ? '' : this.milisecTime;
   }
 
   public getFullMinutes() {
@@ -58,7 +66,7 @@
         time: {
           hour: this.pickTime ? this.pickTime.hour : 0,
           minute: this.pickTime ? this.pickTime.minute : 0,
-          meridiem: this.pickTime ? this.pickTime.meridiem : 'AM' 
+          meridiem: this.pickTime ? this.pickTime.meridiem : 'AM'
         }
       }
     });
@@ -67,13 +75,14 @@
       if (result === undefined) return;
       if (result !== -1) {
         this.pickTime = result;
+        this.milisecTime = SchedulerCalculations.setTimeInMiliseconds(this.pickTime);
         this.emitpickTimeSelection();
       }
     });
     return false;
   }
 
-  checkEmpty(searchValue : string ) {
+  checkEmpty(searchValue: string ) {
     if (!searchValue.length) {
       this.pickTime = null;
       this.emitpickTimeSelection();
diff --git a/services/self-service/src/main/resources/webapp/src/app/swagger/swagger.component.ts b/services/self-service/src/main/resources/webapp/src/app/swagger/swagger.component.ts
index 5c3c612..2d2f6e5 100644
--- a/services/self-service/src/main/resources/webapp/src/app/swagger/swagger.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/swagger/swagger.component.ts
@@ -24,7 +24,7 @@
 declare const SwaggerUIBundle: any;
 
 @Component({
-  selector: 'dlab-swagger',
+  selector: 'datalab-swagger',
   templateUrl: './swagger.component.html',
   styleUrls: ['./swagger.component.scss']
 })
diff --git a/services/self-service/src/main/resources/webapp/src/app/webterminal/webterminal.component.ts b/services/self-service/src/main/resources/webapp/src/app/webterminal/webterminal.component.ts
index 7f796d1..0b54e47 100644
--- a/services/self-service/src/main/resources/webapp/src/app/webterminal/webterminal.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/webterminal/webterminal.component.ts
@@ -31,7 +31,7 @@
 import { FileUtils } from '../core/util';
 
 @Component({
-  selector: 'dlab-webterminal',
+  selector: 'datalab-webterminal',
   templateUrl: './webterminal.component.html',
   styleUrls: ['./webterminal.component.scss'],
   encapsulation: ViewEncapsulation.None
@@ -41,7 +41,7 @@
   public endpoint: string;
   public state: string = '';
   public layer;
-  @ViewChild('terminal', { read: ElementRef, static: false }) terminal: ElementRef;
+  @ViewChild('terminal', { read: ElementRef }) terminal: ElementRef;
   @ViewChild('clip', { static: true }) clip;
 
 
@@ -62,7 +62,7 @@
     const url = environment.production ? window.location.origin : API_URL;
     const tunnel = new Guacamole.HTTPTunnel(
       `${url}/api/tunnel`, false,
-      { 'DLab-Authorization': `Bearer ${this.storageService.getToken()}` }
+      { 'DataLab-Authorization': `Bearer ${this.storageService.getToken()}` }
     );
 
     const guac = new Guacamole.Client(tunnel);
@@ -85,7 +85,7 @@
       //   mouseState.y = mouseState.y + 65;
       // }
       guac.sendMouseState(mouseState);
-    }
+    };
 
     const keyboard = new Guacamole.Keyboard(document);
     keyboard.onkeydown = (keysym) => guac.sendKeyEvent(1, keysym);
diff --git a/services/self-service/src/main/resources/webapp/src/assets/data.json b/services/self-service/src/main/resources/webapp/src/assets/data.json
index cb8e3d1..d8bbff7 100644
--- a/services/self-service/src/main/resources/webapp/src/assets/data.json
+++ b/services/self-service/src/main/resources/webapp/src/assets/data.json
@@ -56,7 +56,7 @@
             ]
           }
         ],
-        "image": "docker.dlab-dataengine-service",
+        "image": "docker.datalab-dataengine-service",
         "image_type": "COMPUTATIONAL",
         "template_name": "EMR cluster",
         "environment_type": "computational",
@@ -142,7 +142,7 @@
       {
         "description": "Spark standalone cluster",
         "templates": [],
-        "image": "docker.dlab-dataengine",
+        "image": "docker.datalab-dataengine",
         "image_type": "COMPUTATIONAL",
         "template_name": "Spark cluster",
         "environment_type": "computational",
diff --git a/services/self-service/src/main/resources/webapp/src/assets/endpoint-api.json b/services/self-service/src/main/resources/webapp/src/assets/endpoint-api.json
index 73d6eb5..57adc16 100644
--- a/services/self-service/src/main/resources/webapp/src/assets/endpoint-api.json
+++ b/services/self-service/src/main/resources/webapp/src/assets/endpoint-api.json
@@ -7,9 +7,9 @@
   }
   ],
   "info": {
-    "description": "DLab cloud endpoint API",
+    "description": "DataLab cloud endpoint API",
     "version": "0.0.1",
-    "title": "DLab cloud endpoint API",
+    "title": "DataLab cloud endpoint API",
     "contact": {
       "email": "bohdan_hliva@epam.com"
     },
diff --git a/services/self-service/src/main/resources/webapp/src/assets/img/blank-file-svgrepo-com.svg b/services/self-service/src/main/resources/webapp/src/assets/img/blank-file-svgrepo-com.svg
new file mode 100644
index 0000000..4c88fd9
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/assets/img/blank-file-svgrepo-com.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 26 26" style="enable-background:new 0 0 26 26;" xml:space="preserve">
+<g>
+	<path style="fill:lightgray;" d="M20.266,4.207c-0.244-0.24-0.494-0.484-0.74-0.732c-0.248-0.246-0.492-0.496-0.732-0.74
+		C17.082,0.988,16.063,0,15,0H7C4.795,0,3,1.795,3,4v18c0,2.205,1.795,4,4,4h12c2.205,0,4-1.795,4-4V8
+		C23,6.938,22.012,5.918,20.266,4.207z M21,22c0,1.104-0.896,2-2,2H7c-1.104,0-2-0.896-2-2V4c0-1.104,0.896-2,2-2l7.289-0.004
+		C15.01,2.18,15,3.066,15,3.953V7c0,0.551,0.449,1,1,1h3c0.998,0,2,0.005,2,1V22z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss b/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss
index c6f8fe8..e10cc90 100644
--- a/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss
+++ b/services/self-service/src/main/resources/webapp/src/assets/styles/_dialogs.scss
@@ -36,7 +36,11 @@
 }
 
 .modal-xl-s {
-  width: 660px;
+  width: 665px;
+}
+
+.modal-xl-m {
+  width: 715px;
 }
 
 .modal-xl {
@@ -44,11 +48,12 @@
 }
 
 .modal-xxl {
-  width: 1000px;
+  width: 1100px;
 }
 
 .modal-fullscreen {
-  width: 100vw;
+  width: 90vw;
+  max-width: 90vw !important;
   min-height: 80vh;
 }
 
@@ -59,10 +64,12 @@
     padding: 0;
     border-radius: 0;
     overflow-x: hidden;
+    position: relative;
 
     #dialog-box {
       color: $modal-text-color;
       min-height: 150px;
+      font-family: "Open Sans", sans-serif;
 
       .dialog-header {
         padding-left: 30px;
@@ -82,6 +89,11 @@
           font-size: 18px;
           background: $modal-header-color;
 
+          &::after{
+            content: '';
+            display: block;
+          }
+
           i {
             vertical-align: middle;
           }
@@ -112,6 +124,12 @@
         }
       }
 
+      .dialog-content {
+        .mat-select {
+          font-family: 'Opens Sans', sans-serif;
+        }
+      }
+
       .dialog-body {
         padding-top: 0;
       }
@@ -140,6 +158,9 @@
         text-decoration: none;
         transition: all .45s ease-in-out;
         line-height: 19px;
+        &.spark-url{
+          line-height: 16px;
+        }
 
         &:hover {
           color: #5faec7;
@@ -202,16 +223,8 @@
   }
 
   input[type=file] {
-    width: 100%;
-    height: 100%;
-    position: absolute;
-    top: 0;
-    right: 0;
-    min-width: 100%;
-    min-height: 100%;
     font-size: 100px;
     text-align: right;
-    opacity: 0;
     outline: none;
     background: #fff;
     cursor: inherit;
@@ -244,6 +257,10 @@
       text-overflow: ellipsis;
       overflow: hidden;
       cursor: default;
+      &::after{
+        content: '';
+        display: block;
+      }
     }
 
     &.tooltip-wrap {
@@ -252,7 +269,6 @@
         font-weight: 600;
         color: #455c74;
         overflow: hidden;
-        text-overflow: ellipsis;
       }
     }
   }
@@ -262,6 +278,7 @@
   p {
     font-weight: 400;
     margin-bottom: 10px;
+    display: flex;
 
     small {
       font-size: 12px;
@@ -269,11 +286,22 @@
     }
   }
 
-  span:not(.description) {
+  span:not(.description),{
     font-size: 14px;
     overflow: hidden;
     text-overflow: ellipsis;
     display: block;
+    max-width: 450px;
+    white-space: nowrap;
+    &::after{
+      content: '';
+      display: block;
+    }
+    &.link-icon{
+      //margin-left: 10px;
+      cursor: pointer;
+      padding-top: 2px;
+    }
   }
 
   .links_block {
@@ -298,7 +326,7 @@
     }
   }
 
-  .create-resources-dialog {
+  .create-resources-dialog, .top-select {
     margin-left: 6px;
     min-width: calc(100% + 10px) !important;
   }
@@ -339,9 +367,92 @@
 .confirmation-dialog p.delete-user{
   font-weight: 500;
   max-height: 200px;
-  overflow: auto;
+  padding: 5px;
+  overflow: hidden auto;
+  text-overflow: ellipsis;
 }
 
+.bucket-browser{
+  .mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper {
+    width: calc(100% + 85px);
+  }
+}
+
+.full-size-tooltip{
+  max-width: 1100px  !important;
+  white-space: pre-line;
+}
+
+.mat-list-base .mat-list-item.delete-item{
+  height: 30px;
+}
+
+.mat-list-item{
+  font-family: "Open Sans", sans-serif;
+  font-weight: 400;
+}
+
+.d-none{
+  display: none !important;
+}
+
+.d-flex{
+  display: flex !important;
+}
+
+.progres{
+  border: 1px solid rgba(0,0,0,.12);
+  height: 17px;
+  position: relative;
+  width: 155px;
+
+  .bar{
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    width: 0;
+    background-color:  #00bcd4;
+  }
+
+  .progress-bar-text{
+    position: absolute;
+    left: 5px;
+    top: 0;
+    bottom: 0;
+    font-size: 11px;
+    line-height: 13px;
+    color: rgba(0, 0, 0, 0.87);
+    z-index: 10;
+  }
+}
+
+.not-allow{
+  cursor: not-allowed !important;
+  &.open-bucket{
+    color: $blue-grey-color !important;
+  }
+}
+
+.audit-info-content{
+  .mat-list {
+    height: unset;
+
+    .list-header {
+      line-height: unset;
+      
+      .mat-list-item-content{
+        align-items: start !important;
+      }
+    }
+  }
+}
+
+.add-folder-form .mat-hint{
+  color: #00bcd4;
+}
+
+
 @media screen and (max-width: 1280px) {
   .modal-fullscreen {
     max-width: 100vw !important;
diff --git a/services/self-service/src/main/resources/webapp/src/assets/styles/_general.scss b/services/self-service/src/main/resources/webapp/src/assets/styles/_general.scss
index 769b5ef..16ffc1e 100644
--- a/services/self-service/src/main/resources/webapp/src/assets/styles/_general.scss
+++ b/services/self-service/src/main/resources/webapp/src/assets/styles/_general.scss
@@ -30,11 +30,20 @@
 }
 
 .alignleft, .al {float: left}
-.alignright, .ar {float: right}
+.alignright, .ar {float: right; left: 26px; z-index: 1010}
 .aligncenter, .ac {margin-left: auto;margin-right: auto}
 
 .mt-5 {margin-top: 5px}
 
+
+.pr-3{padding-right: 3px}
+
+.pb-50 {padding-bottom: 50px;}
+.pb-25 {padding-bottom: 25px;}
+.pb-10 {padding-bottom: 10px;}
+
+.full-width{width: 100%;}
+
 .txt-r {text-align: right }
 .txt-l {text-align: left }
 
@@ -172,3 +181,44 @@
 input[type=file]::-webkit-file-upload-button {
     cursor: pointer;
 }
+
+.refresh-icon{
+  color: #35afd5;
+}
+
+.buttons {
+  position: absolute;
+  display: flex;
+  justify-content: space-around;
+  z-index: 102;
+  bottom: 9px;
+  width: 100%;
+
+  .mat-mini-fab {
+    height: 25px;
+    width: 25px;
+
+    .mat-button-wrapper {
+      padding: 0;
+      line-height: unset;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      padding-top: 2px;
+    }
+  }
+}
+
+.shadow-none{
+  box-shadow: none !important;
+}
+
+.right-sticky{
+  right: -15px !important;
+}
+
+.cursor-pointer{
+  cursor: pointer;
+}
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/assets/styles/_theme.scss b/services/self-service/src/main/resources/webapp/src/assets/styles/_theme.scss
index 43e9c50..4a37d89 100644
--- a/services/self-service/src/main/resources/webapp/src/assets/styles/_theme.scss
+++ b/services/self-service/src/main/resources/webapp/src/assets/styles/_theme.scss
@@ -28,6 +28,9 @@
     font-size: 15px;
     font-family: 'Open Sans', sans-serif;
     color: #577289;
+    &[disabled]{
+      box-shadow: 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12);
+    }
 
     i {
       margin: 0 5px 0 0;
@@ -39,7 +42,10 @@
       i {
         margin: 0 5px 0 0;
         font-size: 20px;
-        vertical-align: sub;
+        vertical-align: middle;
+        &.arrow-icon{
+          vertical-align: -5px
+        }
       }
     }
 
@@ -49,6 +55,14 @@
 
     &.action {
       width: 140px;
+
+      &.install-btn{
+        margin-left: 0;
+      }
+
+      &.close-btn{
+        margin-right: 25px;
+      }
     }
 
     &.butt-success {
@@ -86,6 +100,8 @@
   }
 }
 
+
+
 .selector-wrapper {
   display: flex;
   align-self: center;
@@ -130,6 +146,26 @@
   }
 }
 
+
+.audit{
+  .select-wrapper {
+    .mat-reset{
+      .selector-wrapper{
+        height: 25px;
+
+      .mat-form-field .mat-form-field-wrapper .mat-form-field-infix{
+        padding-top: 6px;
+        font-size: 13px;
+      }
+        .caret {
+          width: 25px;
+          height: 31px;
+
+        }
+      }
+    }
+  }
+}
 .multiple-select {
   border-bottom: 1px solid #dedbdb;
   padding: 0;
@@ -218,10 +254,13 @@
   .mat-select-placeholder {
     cursor: not-allowed;
   }
-
+  .mat-select-value{
+    cursor: not-allowed;
+  }
 }
 
-.mat-select-disabled + .caret {
+.mat-select-disabled + .caret,
+.mat-tab-disabled{
   cursor: not-allowed !important;
 }
 
@@ -240,6 +279,15 @@
   height: 34px;
 }
 
+input[type="file"] {
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  opacity: 0;
+}
+
 span.mat-slide-toggle-content {
   // font: 100 16px/24px 'Open Sans', sans-serif;
   font-style: normal;
@@ -317,9 +365,27 @@
     }
 }
 
+.mat-chip-list {
+  pointer-events: none;
+  .mat-chip{
+    overflow: hidden;
+    pointer-events: all;
+    &.mat-standard-chip.mat-chip-disabled{
+      opacity: 1;
+    }
+  }
+}
+
+.selection, .project-form {
+  .mat-reset .mat-form-field .mat-form-field-wrapper .mat-form-field-label {
+    transform: none;
+  }
+}
+
 .manage-roles,
 .project-form,
-.selection {
+.selection,
+.audit{
   .mat-form-field {
     width: 100%;
   }
@@ -433,6 +499,119 @@
   }
 }
 
+.audit {
+  .mat-select {
+    font-family: 'Open Sans', sans-serif;
+
+    .mat-select-value-text span {
+      color: unset !important;
+    }
+  }
+}
+
+.empty-checkbox {
+  min-width: 16px;
+  width: 16px;
+  height: 16px;
+  border-radius: 2px;
+  border: 2px solid lightgrey;
+  margin-top: 2px;
+  position: relative;
+  cursor: pointer;
+
+  &.checked {
+    border-color: #35afd5;
+    background-color: #35afd5;
+  }
+  .checked-checkbox {
+    top: 0;
+    left: 4px;
+    width: 5px;
+    height: 10px;
+    border-bottom: 2px solid white;
+    border-right: 2px solid white;
+    position: absolute;
+    transform: rotate(45deg);
+  }
+
+  .line-checkbox {
+    top: 0;
+    left: 2px;
+    width: 8px;
+    height: 7px;
+    border-bottom: 2px solid white;
+    position: absolute;
+  }
+}
+.none-select{
+  user-select: none;
+}
+
+.action-select-wrapper{
+  position: relative;
+  display: block !important;
+
+  .action-button-wrapper{
+    position: relative;
+    width: 160px;
+  }
+
+  .mat-raised-button.butt{
+    margin-bottom: 0;
+    padding-left: 45px;
+    text-align: left;
+
+
+    &.actions-btn{
+      padding-right: 38px;
+      margin: 0;
+
+      .material-icons{
+        transition: ease-in-out 1s;
+        font-size: 25px;
+        position: absolute;
+        top: 7px;
+        right: 30px;
+      }
+    }
+  }
+
+  .action-menu{
+    position: absolute;
+    text-align: center;
+    display: block;
+    background-color: #fff;
+
+    &-item.mat-raised-button.butt{
+      z-index: 101;
+      margin: 0;
+      box-shadow: 0 2px 1px -1px rgba(0,0,0,.2), 0 0px 0px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12);
+      width: 160px;
+      padding: 0 20px;
+      border-radius: 0;
+      font-style: normal;
+      font-weight: 600;
+      font-size: 15px;
+      font-family: 'Open Sans', sans-serif;
+      color: #577289;
+      position: relative;
+      overflow: hidden;
+      line-height: 36px;
+      &.action-menu-item{
+        &:hover{
+          color:  #00bcd4;
+          background-color: #fafafa;
+        }
+        &.disabled{
+          &:hover{
+            color: #577289;
+          }
+        }
+      }
+    }
+  }
+}
+
 mat-horizontal-stepper {
   .mat-step-header {
     .mat-step-icon {
@@ -561,7 +740,7 @@
 
     .content {
       color: #718ba6;
-      padding: 20px 0;
+      padding: 20px 40px;
       font-size: 14px;
       font-weight: 400;
       text-align: center;
@@ -612,17 +791,32 @@
   }
 }
 
-.mat-table {
-  .header-row {
-    th.mat-header-cell {
+table.mat-table {
+  font-family: "Open Sans", sans-serif;
+  font-weight: 400;
+
+  .mat-cell{
+    font-size: 13px;
+  }
+  .header-row,
+  .mat-header-row{
+    .mat-header-cell {
       font-family: 'Open Sans', sans-serif;
       font-weight: 600;
+      font-size: 13px;
+      .label{
+        font-family: 'Open Sans', sans-serif;
+        font-weight: 600;
+        font-size: 13px;
+      }
     }
 
     .mat-cell {
       word-break: break-all;
       vertical-align: top;
       padding: 15px 5px 10px 5px;
+      font-size: 13px;
+      font-family: "Open Sans", sans-serif;
 
       td {
         vertical-align: baseline;
@@ -665,5 +859,230 @@
 .filter-row-item, .label-header{
   box-shadow: inset 0 -1px 0 lightgrey;
   border-bottom: none !important;
+  multi-select-dropdown, .input-wrapper{
+    position: absolute;
+    top: 10px;
+    left: 5px;
+    right: 5px;
+  }
+
+  .input-wrapper{
+    left: 10px;
+    right: 4px;
+  }
 }
 
+/* daterangepicker themes */
+#range-picker {
+  display: flex;
+  justify-content: center;
+  z-index: 120;
+}
+
+#range-picker path#Shape {
+  fill: #36afd5;
+}
+
+#range-picker .ng-daterangepicker,
+ {
+  border: none;
+  border-radius: 0;
+  box-shadow: none;
+}
+
+#range-picker .ng-daterangepicker .calendar {
+  z-index: 102;
+  border: 1px solid rgba(234, 234, 234, 0.64);
+  border-radius: 0;
+  box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2),
+  0 2px 2px 0 rgba(0, 0, 0, 0.14),
+  0 1px 5px 0 rgba(0, 0, 0, 0.12);
+  top: 58px;
+
+  &.is-to:after {
+    left: 250px;
+  }
+
+  &.is-opened{
+    display: flex;
+  }
+}
+
+#range-picker .ng-daterangepicker .calendar::after {
+  border-top: 1px solid rgba(234, 234, 234, 0.64);
+  border-left: 1px solid rgba(234, 234, 234, 0.64);
+}
+
+#range-picker .ng-daterangepicker .calendar .side-container .side-button {
+  background: #fff;
+  color: #718ba6;
+  border: none;
+  border-radius: 0px;
+}
+
+#range-picker .ng-daterangepicker .calendar .side-container .side-button.is-active,
+#range-picker .ng-daterangepicker .input-section .label-txt {
+  color: #35afd5;
+  display: unset;
+  font-size: 13px;
+}
+
+#range-picker .ng-daterangepicker .calendar .side-container .side-button.is-active {
+  color: #fff;
+  background: #35afd5;
+  border-radius: 10px;
+}
+
+#range-picker .ng-daterangepicker .calendar .calendar-container .day-num.is-active,
+#range-picker .ng-daterangepicker .calendar .calendar-container .days .day-num:hover {
+  background: #35afd5;
+  background-clip: padding-box;
+
+}
+
+#range-picker .ng-daterangepicker .calendar .calendar-container .day-names,
+#range-picker .ng-daterangepicker .calendar .calendar-container .days {
+  width: 310px;
+}
+
+#range-picker .ng-daterangepicker .calendar .day.is-within-range.is-first-weekday,
+#range-picker .ng-daterangepicker .calendar .day.is-within-range.is-last-weekday {
+  background-clip: padding-box;
+}
+
+#range-picker .ng-daterangepicker .calendar .calendar-container .day.is-within-range {
+  background: #e9f8fc
+}
+
+#range-picker .ng-daterangepicker .input-section .cal-icon svg path {
+  fill: #35afd5;
+}
+
+#range-picker .ng-daterangepicker .input-section .value-txt {
+  color: #718ba6;
+  display: unset;
+  padding-left: 5px;
+}
+
+#range-picker .ng-daterangepicker .input-section .value-txt.untouched,
+#range-picker .ng-daterangepicker .input-section .label-txt.untouched {
+  color: #fff;
+}
+
+//#range-picker .ng-daterangepicker .input-section .value-txt.untouched::after {
+//  content: 'date';
+//  position: absolute;
+//  top: 9px;
+//  left: 61px;
+//  color: #718ba6;
+//}
+
+.filter-row .actions {
+  text-align: right;
+  display: flex;
+  justify-content: flex-end;
+}
+
+.filter-row .actions button {
+  background: #fff;
+  border-color: #35afd5;
+  color: #35afd5;
+  outline: none;
+}
+
+.filter-row .actions .reset:not([disabled]):hover {
+  border-color: #f1696e;
+  background: #f9fafb;
+  color: #f1696e;
+}
+
+.filter-row .actions .apply:not([disabled]):hover {
+  border-color: #49af38;
+  background: #f9fafb;
+  color: #49af38;
+}
+
+#range-picker .ng-daterangepicker {
+  height: 37px;
+  width: 360px;
+  display: flex;
+  justify-content: space-between;
+
+
+  .d-none{
+    display: none;
+  }
+
+  .input-section {
+    height: 37px;
+    padding-right: 30px;
+    width: 175px;
+    box-shadow: 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12);
+  }
+}
+
+.show-all-btn.mat-raised-button .mat-button-wrapper > *{
+  vertical-align: baseline;
+}
+
+.resource-btns {
+  .mat-raised-button{
+    line-height: 38px;
+  }
+
+  .mat-select-value{
+    margin-top: 1px;
+  }
+}
+
+.alert .highlight .strong{ color: #35afd5}
+
+.audit-table-wrapper,
+.billing-page-wrapper{
+  tfoot{
+    position: sticky;
+    z-index: 102;
+    bottom: 0;
+  }
+
+  .dropdown-multiselect{
+    &.resources {
+      .list-menu {
+        .list-item {
+          text-transform: unset !important;
+        }
+      }
+    }
+  }
+}
+.configuration-wrapper{
+  box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
+  .mat-tab-header{
+    margin: 0 30px;
+  }
+  .mat-tab-label{
+    .mat-tab-label-content{
+      font-family: "Open Sans", sans-serif;
+      font-weight: 600;
+      font-size: 13px;
+    }
+  }
+
+  .ace-monokai{
+    height: calc(100%);
+  }
+
+  .ace_print-margin {
+    width: unset !important;
+  }
+
+  .ace_scrollbar{
+    scrollbar-width: thin;
+  }
+}
+
+
+
+
+
+
diff --git a/services/self-service/src/main/resources/webapp/src/assets/styles/_variables.scss b/services/self-service/src/main/resources/webapp/src/assets/styles/_variables.scss
index 63d8202..e0d909d 100644
--- a/services/self-service/src/main/resources/webapp/src/assets/styles/_variables.scss
+++ b/services/self-service/src/main/resources/webapp/src/assets/styles/_variables.scss
@@ -20,8 +20,11 @@
 $modal-text-color: #718aa5;
 $modal-header-color: #f6fafe;
 
+$table-header-color: rgba(0,0,0,.54);
+
 $brand-color: #4ab8dc;
 $blue-grey-color: #718ba6;
 $dark-grey-color: #455c74;
+$link-color: #00bcd4;
 
 $default-font-size: 14px;
diff --git a/services/self-service/src/main/resources/webapp/src/assets/styles/app-loading.scss b/services/self-service/src/main/resources/webapp/src/assets/styles/app-loading.scss
index 6fb034b..f96a335 100644
--- a/services/self-service/src/main/resources/webapp/src/assets/styles/app-loading.scss
+++ b/services/self-service/src/main/resources/webapp/src/assets/styles/app-loading.scss
@@ -1,4 +1,4 @@
-/*!
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -17,72 +17,72 @@
  * under the License.
  */
 
-body,
-html {
-  height: 100%;
-}
-
-.app-loading {
-  position: relative;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  height: 100%;
-}
-
-.app-loading .spinner {
-  height: 200px;
-  width: 200px;
-  animation: rotate 2s linear infinite;
-  transform-origin: center center;
-  position: absolute;
-  top: calc(50% - 100px);
-  left: calc(50% - 100px);
-  margin: 0;
-}
-
-.app-loading .spinner .path {
-  stroke-dasharray: 20, 200;
-  stroke-dashoffset: 0;
-  animation: dash 1.5s ease-in-out infinite;
-  stroke-linecap: round;
-  stroke: #35afd5;
-}
-
-@keyframes rotate {
-  100% {
-    transform: rotate(360deg);
-  }
-}
-
-@keyframes dash {
-  0% {
-    stroke-dasharray: 1, 200;
-    stroke-dashoffset: 0;
-  }
-
-  50% {
-    stroke-dasharray: 89, 200;
-    stroke-dashoffset: -35px;
-  }
-
-  100% {
-    stroke-dasharray: 89, 200;
-    stroke-dashoffset: -124px;
-  }
-}
-
-
-.app-loading {
-  .logo {
-    width: 100px;
-    height: 100px;
-    // background: url(../img/logo.png);
-    background-size: cover;
-  }
-}
-
+//body,
+//html {
+//  height: 100%;
+//}
+//
+//.app-loading {
+//  position: relative;
+//  display: flex;
+//  flex-direction: column;
+//  align-items: center;
+//  justify-content: center;
+//  height: 100%;
+//}
+//
+//.app-loading .spinner {
+//  height: 300px;
+//  width: 225px;
+//  animation: rotate 2s linear infinite;
+//  transform-origin: center center;
+//  position: absolute;
+//  top: calc(50% - 125px);
+//  left: calc(50% - 125px);
+//  margin: 0;
+//}
+//
+//.app-loading .spinner .path {
+//  stroke-dasharray: 20, 200;
+//  stroke-dashoffset: 0;
+//  animation: dash 1.5s ease-in-out infinite;
+//  stroke-linecap: round;
+//  stroke: #35afd5;
+//}
+//
+//@keyframes rotate {
+//  100% {
+//    transform: rotate(360deg);
+//  }
+//}
+//
+//@keyframes dash {
+//  0% {
+//    stroke-dasharray: 1, 200;
+//    stroke-dashoffset: 0;
+//  }
+//
+//  50% {
+//    stroke-dasharray: 89, 200;
+//    stroke-dashoffset: -35px;
+//  }
+//
+//  100% {
+//    stroke-dasharray: 89, 200;
+//    stroke-dashoffset: -124px;
+//  }
+//}
+//
+//
+//.app-loading {
+//  .logo {
+//    width: 150px;
+//    height: 100px;
+//    // background: url(../img/logo.png);
+//    background-size: cover;
+//  }
+//}
+//
 .nav-bar .mat-progress-bar {
   position: absolute;
   height: 2px;
diff --git a/services/self-service/src/main/resources/webapp/src/assets/svg/datalab-logo.svg b/services/self-service/src/main/resources/webapp/src/assets/svg/datalab-logo.svg
new file mode 100644
index 0000000..27e4edc
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/assets/svg/datalab-logo.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="309px" height="152px" viewBox="0 0 309 152" version="1.1" xmlns="http://www.w3.org/2000/svg">
+    <title>Group</title>
+    <g id="Page-2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="Artboard-Copy" transform="translate(-100.000000, -6.000000)" fill="#35AFD5" fill-rule="nonzero">
+            <g id="Group" transform="translate(100.000000, 6.000000)">
+                <path d="M48,0 L48,50.304 L48.040916,55.668891 L47.950033,55.677562 L46.6386939,55.8175213 L45.9255692,55.900871 L45.8143969,55.915542 C23.9652352,58.951769 7.5,77.7148504 7.5,99.9895207 C7.5,124.566192 27.4233286,144.489521 52,144.489521 C63.7945578,144.489521 74.850976,139.884216 83.1068414,131.811186 L83.5172913,131.404651 L88.4750135,136.34641 C78.8766784,145.975749 65.8707068,151.489521 52,151.489521 C23.5573354,151.489521 0.5,128.432185 0.5,99.9895207 C0.5,75.5349665 17.6438798,54.7411444 40.9999076,49.6668368 L41,7 L32,7 L32,0 L48,0 Z M165.725133,87 C180.659525,87 185.571785,99.997962 185.668537,106.310769 L185.67,106.5 L185.67,125.401152 L179.21943,125.401152 L179.21943,120.31094 C176.401939,123.454894 171.804981,126 165.725133,126 C155.27076,126 146.67,117.466411 146.67,106.537428 C146.67,95.6084453 155.27076,87 165.725133,87 Z M100.725133,87 C115.659525,87 120.571785,99.997962 120.668537,106.310769 L120.67,106.5 L120.67,125.401152 L114.21943,125.401152 L114.21943,120.31094 C111.401939,123.454894 106.804981,126 100.725133,126 C90.2707605,126 81.67,117.466411 81.67,106.537428 C81.67,95.6084453 90.2707605,87 100.725133,87 Z M276.194715,74 L276.194715,92.030303 C279.160494,89.012987 283.683308,86.6580087 289.614867,86.6580087 C300.06924,86.6580087 308.67,95.1212121 308.67,105.865801 C308.67,116.61039 300.06924,125 289.614867,125 C281.830928,125 269.921189,119.162503 269.673914,106.275116 L269.67,105.865801 L269.67,74 L276.194715,74 Z M200.895734,74 L200.895734,118.373723 L226.67,118.373723 L226.67,125 L193.67,125 L193.67,74 L200.895734,74 Z M245.725133,86 C260.659525,86 265.571785,98.997962 265.668537,105.310769 L265.67,105.5 L265.67,124.401152 L259.21943,124.401152 L259.21943,119.31094 C256.401939,122.454894 251.804981,125 245.725133,125 C235.27076,125 226.67,116.466411 226.67,105.537428 C226.67,94.6084453 235.27076,86 245.725133,86 Z M52.76,74.31 C67.412,74.31 78.438,85.336 78.438,99.544 C78.438,113.68318 67.6314174,124.776209 53.1984648,124.996656 L52.76,125 L35,125 L35,74.31 L52.76,74.31 Z M135.658,77 L135.658,87.286 L145.574,87.286 L145.574,93.058 L135.658,93.058 L135.658,112.668 C135.658,117.45432 138.429714,118.900369 141.814049,118.956296 L142.022,118.958 L145.574,118.958 L145.574,124.73 L141.948,124.73 C134.582319,124.73 129.372756,121.136469 129.223301,113.028631 L129.22,112.668 L129.22,93.058 L123.67,93.058 L123.67,87.286 L129.22,87.286 L129.22,77 L135.658,77 Z M166.095856,93.1381958 C158.681407,93.1381958 153.046426,99.0518234 153.046426,106.537428 C153.046426,114.023033 158.681407,119.93666 166.095856,119.93666 C173.658593,119.93666 179.367719,114.097889 179.367719,106.537428 C179.367719,99.0518234 173.584449,93.1381958 166.095856,93.1381958 Z M101.095856,93.1381958 C93.6814068,93.1381958 88.0464259,99.0518234 88.0464259,106.537428 C88.0464259,114.023033 93.6814068,119.93666 101.095856,119.93666 C108.658593,119.93666 114.367719,114.097889 114.367719,106.537428 C114.367719,99.0518234 108.584449,93.1381958 101.095856,93.1381958 Z M289.244144,92.6926407 C281.755551,92.6926407 275.972281,98.5064935 275.972281,105.865801 C275.972281,113.298701 281.681407,119.038961 289.244144,119.038961 C296.658593,119.038961 302.293574,113.225108 302.293574,105.865801 C302.293574,98.5064935 296.658593,92.6926407 289.244144,92.6926407 Z M246.095856,92.1381958 C238.681407,92.1381958 233.046426,98.0518234 233.046426,105.537428 C233.046426,113.023033 238.681407,118.93666 246.095856,118.93666 C253.658593,118.93666 259.367719,113.097889 259.367719,105.537428 C259.367719,98.0518234 253.584449,92.1381958 246.095856,92.1381958 Z M52.464,80.896 L42.178,80.896 L42.178,118.414 L52.316,118.414 C63.416,118.414 71.26,110.2 71.26,99.692 C71.26,89.036 63.194,80.896 52.464,80.896 Z M72,0 L72,7 L62.9994923,7 L63.0003609,49.6793321 C72.3934241,51.7252087 80.9885914,56.3662817 87.8723853,63.0520566 L88.3188454,63.4909316 L83.3817065,68.4532556 C76.4855783,61.5921271 67.5443496,57.1475703 57.8192825,55.8771804 L57.1166971,55.791461 L56.0381427,55.6853811 L55.9874923,55.6803995 L55.9994923,50.98 L56,0 L72,0 Z"
+                      id="Combined-Shape"></path>
+            </g>
+        </g>
+    </g>
+</svg>
diff --git a/services/self-service/src/main/resources/webapp/src/assets/svg/logo.svg b/services/self-service/src/main/resources/webapp/src/assets/svg/logo.svg
index b0b4da0..240cf7a 100644
--- a/services/self-service/src/main/resources/webapp/src/assets/svg/logo.svg
+++ b/services/self-service/src/main/resources/webapp/src/assets/svg/logo.svg
@@ -1,3 +1,8 @@
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 140.5 47.1" style="enable-background:new 0 0 140.5 47.1;" xml:space="preserve">
-    <path fill="#35AFD5" d="M0.9,46C0.3,45.4,0,44.6,0,43.7V3.1c0-0.8,0.3-1.7,0.9-2.2C1.5,0.3,2.3,0,3.1,0H14c4.2-0.1,8.3,1,12,3 c3.5,1.9,6.3,4.8,8.2,8.3c2,3.7,3,7.9,3,12.1c0.1,4.2-0.9,8.4-2.9,12.1c-1.9,3.5-4.8,6.4-8.3,8.3c-3.7,2-7.8,3.1-12.1,3H3.1 C2.3,46.9,1.5,46.6,0.9,46z M14,41.3c3.1,0.1,6.2-0.7,8.9-2.3c2.6-1.5,4.7-3.7,6.1-6.4c1.5-2.9,2.2-6,2.2-9.3 c0.1-3.2-0.7-6.4-2.2-9.2c-1.4-2.7-3.5-4.9-6.1-6.4c-2.7-1.5-5.8-2.3-8.9-2.3H6.2v35.8H14z M41.8,46.2C41.3,45.6,41,44.8,41,44V3.4 c0-0.8,0.3-1.6,0.9-2.2c0.6-0.6,1.3-0.9,2.1-0.9c1.7,0,3.1,1.3,3.1,3c0,0,0,0.1,0,0.1v37.5h21.8c1.7,0,3.1,1.4,3.1,3.1 c0,1.7-1.4,3.1-3.1,3.1c0,0,0,0,0,0H44C43.2,47.1,42.4,46.8,41.8,46.2z M96.2,16c2.5,1.4,4.5,3.5,5.9,6c1.5,2.6,2.2,5.5,2.2,8.5 v13.4c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1v-2.2c-4.8,5.7-13,7.1-19.4,3.3c-2.4-1.5-4.3-3.5-5.5-6c-1.4-2.6-2-5.5-2-8.5 c0-3,0.7-5.9,2.1-8.4c1.4-2.5,3.5-4.6,6-6c2.6-1.5,5.5-2.2,8.4-2.2C90.7,13.8,93.6,14.5,96.2,16z M93.2,40.2c1.6-1,2.9-2.3,3.8-4 c0.9-1.8,1.4-3.7,1.4-5.7c0-2-0.5-4-1.4-5.8c-2.8-5.1-9.2-7-14.4-4.2c-0.1,0.1-0.2,0.1-0.3,0.2c-1.6,1-2.9,2.3-3.8,4 c-1,1.8-1.4,3.8-1.4,5.8c0,2,0.5,4,1.4,5.7c0.9,1.7,2.2,3,3.8,4C85.7,42.2,89.8,42.2,93.2,40.2L93.2,40.2z M132.9,16 c2.4,1.5,4.3,3.5,5.5,6c1.4,2.6,2,5.5,2,8.5c0,3-0.7,5.9-2.2,8.5c-1.4,2.5-3.5,4.6-6,6c-2.6,1.5-5.5,2.2-8.4,2.2 c-5.9,0.1-11.4-3.1-14.3-8.2c-1.5-2.6-2.2-5.5-2.2-8.5V3.1c0-0.8,0.3-1.6,0.9-2.2c1.3-1.1,3.2-1.1,4.4,0c0.6,0.6,0.9,1.4,0.8,2.2 v16.2C118.3,13.5,126.5,12.1,132.9,16z M129.3,40.3c1.6-1,2.9-2.4,3.8-4c1-1.8,1.4-3.8,1.4-5.8c0-2-0.5-4-1.4-5.7 c-0.9-1.7-2.2-3-3.8-4c-4.9-3-11.4-1.4-14.4,3.5c-0.1,0.2-0.2,0.3-0.3,0.5c-0.9,1.8-1.4,3.7-1.4,5.7c0,2,0.4,4,1.4,5.8 c2.8,5.1,9.2,7,14.4,4.2C129.1,40.4,129.2,40.3,129.3,40.3z M41,0.1h6.2v5.3H41V0.1z M0,0h6.1v5.3H0V0z M0,41.5h6.1v5.3H0V41.5z  M65.9,40.9H72v6.2h-6.1V40.9z M41,41.9h3.5v5.2H41V41.9z M98.2,41.3h6.1v5.6h-6.1V41.3z M107.4,0h6.1v5.4h-6.1V0z" />
-</svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="274px" height="52px" viewBox="0 0 274 52" version="1.1" xmlns="http://www.w3.org/2000/svg">
+    <title>Combined Shape</title>
+    <g id="Page-2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <path d="M130.725133,13 C145.810378,13 150.67,26.2618732 150.67,32.5 L150.67,32.5 L150.67,51.4011516 L144.21943,51.4011516 L144.21943,46.3109405 C141.401939,49.4548944 136.804981,52 130.725133,52 C120.27076,52 111.67,43.4664107 111.67,32.537428 C111.67,21.6084453 120.27076,13 130.725133,13 Z M65.7251331,13 C80.8103777,13 85.67,26.2618732 85.67,32.5 L85.67,32.5 L85.67,51.4011516 L79.2194297,51.4011516 L79.2194297,46.3109405 C76.4019392,49.4548944 71.804981,52 65.7251331,52 C55.2707605,52 46.67,43.4664107 46.67,32.537428 C46.67,21.6084453 55.2707605,13 65.7251331,13 Z M241.524715,0 L241.524715,18.030303 C244.490494,15.012987 249.013308,12.6580087 254.944867,12.6580087 C265.39924,12.6580087 274,21.1212121 274,31.8658009 C274,42.6103896 265.39924,51 254.944867,51 C247.078992,51 235,45.038961 235,31.8658009 L235,31.8658009 L235,0 L241.524715,0 Z M166.225734,0 L166.225734,44.3737226 L192,44.3737226 L192,51 L159,51 L159,0 L166.225734,0 Z M211.055133,12 C226.140378,12 231,25.2618732 231,31.5 L231,31.5 L231,50.4011516 L224.54943,50.4011516 L224.54943,45.3109405 C221.731939,48.4548944 217.134981,51 211.055133,51 C200.60076,51 192,42.4664107 192,31.537428 C192,20.6084453 200.60076,12 211.055133,12 Z M17.76,0.31 C32.412,0.31 43.438,11.336 43.438,25.544 C43.438,39.826 32.412,51 17.76,51 L17.76,51 L4.97379915e-14,51 L4.97379915e-14,0.31 Z M100.658,3 L100.658,13.286 L110.574,13.286 L110.574,19.058 L100.658,19.058 L100.658,38.668 C100.658,43.552 103.544,44.958 107.022,44.958 L107.022,44.958 L110.574,44.958 L110.574,50.73 L106.948,50.73 C99.474,50.73 94.22,47.03 94.22,38.668 L94.22,38.668 L94.22,19.058 L88.67,19.058 L88.67,13.286 L94.22,13.286 L94.22,3 L100.658,3 Z M131.095856,19.1381958 C123.681407,19.1381958 118.046426,25.0518234 118.046426,32.537428 C118.046426,40.0230326 123.681407,45.9366603 131.095856,45.9366603 C138.658593,45.9366603 144.367719,40.0978887 144.367719,32.537428 C144.367719,25.0518234 138.584449,19.1381958 131.095856,19.1381958 Z M66.0958555,19.1381958 C58.6814068,19.1381958 53.0464259,25.0518234 53.0464259,32.537428 C53.0464259,40.0230326 58.6814068,45.9366603 66.0958555,45.9366603 C73.6585932,45.9366603 79.3677186,40.0978887 79.3677186,32.537428 C79.3677186,25.0518234 73.5844487,19.1381958 66.0958555,19.1381958 Z M254.574144,18.6926407 C247.085551,18.6926407 241.302281,24.5064935 241.302281,31.8658009 C241.302281,39.2987013 247.011407,45.038961 254.574144,45.038961 C261.988593,45.038961 267.623574,39.2251082 267.623574,31.8658009 C267.623574,24.5064935 261.988593,18.6926407 254.574144,18.6926407 Z M211.425856,18.1381958 C204.011407,18.1381958 198.376426,24.0518234 198.376426,31.537428 C198.376426,39.0230326 204.011407,44.9366603 211.425856,44.9366603 C218.988593,44.9366603 224.697719,39.0978887 224.697719,31.537428 C224.697719,24.0518234 218.914449,18.1381958 211.425856,18.1381958 Z M17.464,6.896 L7.178,6.896 L7.178,44.414 L17.316,44.414 C28.416,44.414 36.26,36.2 36.26,25.692 C36.26,15.036 28.194,6.896 17.464,6.896 L17.464,6.896 Z"
+              id="Combined-Shape" fill="#35AFD5" fill-rule="nonzero"></path>
+    </g>
+</svg>
diff --git a/services/self-service/src/main/resources/webapp/src/assets/svg/not_found_page.svg b/services/self-service/src/main/resources/webapp/src/assets/svg/not_found_page.svg
index ff94c2e..478d2a7 100644
--- a/services/self-service/src/main/resources/webapp/src/assets/svg/not_found_page.svg
+++ b/services/self-service/src/main/resources/webapp/src/assets/svg/not_found_page.svg
@@ -1,158 +1,80 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 660.05 441.27">
+<svg width="661" height="442" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <g clip-path="url(#clip0)">
+    <path opacity=".07" d="M428.1 245.77l-6.5-.4c-2.77-.03-5.54.1-8.3.4l-17.5.1-151.5-9.4a2.93 2.93 0 001.5-2.3c0-8.1-55.7-14.6-119.5-14.6s-115.6 6.6-115.6 14.6 51.8 14.6 115.6 14.6a781.8 781.8 0 0079.8-3.8l155.7 9.6 9.8 1.8c-.4.6.3 1 2.2 1.1l6.5.4c6 .4 21.6-2.1 34.8-5.5 13.1-3.2 18.9-6.2 13-6.6zm-211.7-2l102.4 6.3-102.4-6.3zm159.4 9.9l-5.8-.4-19.7-1.2 25.5 1.6zm21.4-5.6l-156.5-9.7 129 8 20.6 1.3 6.9.4z" fill="#0C0D0D"/>
+    <path d="M423 243.27h176.6s133.6 1.6-33.3 20.5c-177.5 20.1-45.7 26.3 44.8 29.1 50.7 1.6 91.4 36.8-34.8 43.2-126.2 6.4-13.5 24.8-5 24.8s118.5 40.2-61.7 39c-59.4-.4-243.8-3.3-82.3-32.6 140.5-25.5-41.8-30.6-91.8-31.9-53.8-1.4-37.3-26.2 12.4-22.7 25.6 1.8 81.2-12.9 35.9-32.1-66-28 13-24.8 16.4-27.7 3.4-2.9-5.7-3.8-5.7-3.8l6-6c-.1.1 6.9.2 22.5.2z" fill="#35AFD5"/>
+    <path d="M31.69 91.38c8.84-30.04 10.72-55.94 4.2-57.86C29.38 31.6 16.93 54.4 8.1 84.44c-8.84 30.04-10.73 55.94-4.21 57.86 6.51 1.92 18.96-20.88 27.8-50.92z" fill="#999"/>
+    <path d="M35.85 33.54L3.83 142.32l7.1 2.1 32.02-108.8-7.1-2.08z" fill="#999"/>
+    <path d="M11 144.37c-6.5-1.9-4.7-27.8 4.2-57.9 8.9-30.1 21.3-52.8 27.8-50.9 6.5 1.9 4.7 27.8-4.2 57.9-8.9 30.1-21.3 52.8-27.8 50.9z" fill="#C4BFBE"/>
+    <path d="M25.2 142.27l28.6-97a103.52 103.52 0 00-26.6 44.9 105.06 105.06 0 00-2 52.1z" fill="#35AFD5"/>
+    <path opacity=".4" d="M233.4 127.47l12.9 3.8c.5-4.68.7-9.4.6-14.1l-13.4-4c.22 4.77.18 9.54-.1 14.3zm-12.6 42.8a116.7 116.7 0 01-7 11.2l13.4 3.9c2.41-3.64 4.62-7.41 6.6-11.3l-13-3.8z" fill="#C4BFBE"/>
+    <path opacity=".4" d="M403.91 177.66l-12.59 42.78 14.97 4.4 12.59-42.78-14.97-4.4z" fill="#E7DAD8"/>
+    <path opacity=".4" d="M233.4 127.47A105.44 105.44 0 00159 18.97l-1-.3a105.5 105.5 0 00-104.6 26.8l-28.3 96.3a105.29 105.29 0 0073.4 79.2l1 .3a105.52 105.52 0 00121.3-50.9l185.5 54.6 12.6-42.8-185.5-54.7z" fill="#E7DAD8"/>
+    <path d="M98.4 220.87l1 .3a105.3 105.3 0 00114.3-39.3l.2-.4a36.1 36.1 0 005.6-9.1c-15.9 6.3-51 8.9-90.5 9.3-39.9.4-77.2-3.3-91.1-7.6 12.3 21.2 34.4 40.1 60.5 46.8z" fill="#35AFD5"/>
+    <path d="M422.7 169.17l-20 67.9-17.5-18.4-23.2-6.9 36.9 38.8 28-95.1-54 13.1 23.7 6.9 26.1-6.3z" fill="#C4BFBE"/>
+    <path d="M393.4 249.07c-5.7-1.7-4.1-24.4 3.7-50.7 7.8-26.3 18.6-46.3 24.4-44.6 5.8 1.7 4.1 24.4-3.7 50.7-7.8 26.3-18.7 46.3-24.4 44.6z" fill="#C4BFBE"/>
+    <path d="M421.46 153.88l-28.04 95.26 6.24 1.83 28.03-95.26-6.23-1.83z" fill="#C4BFBE"/>
+    <path d="M399.6 250.97c-5.7-1.7-4.1-24.4 3.7-50.7 7.8-26.3 18.6-46.3 24.4-44.6 5.8 1.7 4.1 24.4-3.7 50.7-7.8 26.3-18.7 46.3-24.4 44.6z" fill="#C4BFBE"/>
+    <path d="M399.6 250.97c-5.7-1.7-4.1-24.4 3.7-50.7 7.8-26.3 18.6-46.3 24.4-44.6 5.8 1.7 4.1 24.4-3.7 50.7-7.8 26.3-18.7 46.3-24.4 44.6z" fill="#C4BFBE"/>
+    <path d="M402.7 237.07l.4-1.4c-1.8-3.9 0-18 4.8-34s10.7-28.9 14.4-31.2l.4-1.3-26.1 6.3 7.3 2.2-12.6 42.8-6.1-1.8 17.5 18.4z" fill="#C4BFBE"/>
+    <path d="M420 205.17c5.4-18.4 7.1-34.1 3.7-35.1a1.9 1.9 0 00-1.4.3c-3.7 2.3-9.7 15.1-14.4 31.2-4.7 16.1-6.6 30.1-4.8 34 .2.47.55.86 1 1.1 3.4 1 10.5-13.1 15.9-31.5z" fill="#6A6B6C"/>
+    <path d="M390.9 232.07l19.2-65.2c-3.7 2.3-9.7 15.1-14.4 31.2-4.7 16.1-6.7 30-4.8 34z" fill="#C4BFBE"/>
+    <path opacity=".2" d="M226.4 441.27h.1v-.1l-.1.1z" fill="#fff"/>
+    <path d="M74 45.87s39.9-29.7 82.7-12.1m21.3 11.3s8.3 2.8 17 14.2m51.8 83.2l69.6 20.7m19.8 5.8l14.2 3.8" stroke="#fff" stroke-width="7" stroke-miterlimit="10" stroke-linecap="round"/>
+    <path d="M219.7 171.87c.1 5.8-40.8 10.9-90.8 11.4s-91-3.8-91-9.6 40.8-10.8 90.8-11.3 90.9 3.7 91 9.5z" fill="#31A2C4"/>
+    <path d="M246.3 131.27l157.6 46.4 3.9-13.1-160.9-47.3-13.4-4c.32 4.73.28 9.48-.1 14.2l12.9 3.8z" fill="#C4BFBE"/>
+    <path d="M161.1 4.87a119.65 119.65 0 00-118.5 30.4l-32.1 109.2a119.58 119.58 0 00216.7 40.9l160.5 47.3 3.6-12.2-157.6-46.4-12.9-3.8a116.7 116.7 0 01-7 11.2 105.5 105.5 0 01-114.3 39.8l-1-.3a105.63 105.63 0 01-73.4-79.2l28.3-96.3A105.5 105.5 0 01158 18.67l1 .3a105.3 105.3 0 0174.4 94.3l13.4 4a119.45 119.45 0 00-85.7-112.4z" fill="#C4BFBE"/>
+    <path opacity=".9" d="M99.2 152.87a19.46 19.46 0 00-32.9 14.6c.04 1.87.34 3.72.9 5.5 4.9 2.5 11.9 3.4 19.7 3.8 8.7.4 13.6-1.3 17.3-3.6a20.7 20.7 0 001-6.6 19.16 19.16 0 00-6-13.7z" fill="#67BDD8"/>
+    <path opacity=".8" d="M173.9 160.17a11.9 11.9 0 00-8.7-3.4 12.5 12.5 0 00-9 4.3c-1.96 2.27-3 5.2-2.9 8.2a9.33 9.33 0 00.6 3.4c3 1.6 7.4 2.5 12.3 2.4 3.72-.04 7.39-.82 10.8-2.3a12.17 12.17 0 00-3.1-12.6z" fill="#67BDD8"/>
+    <path opacity=".2" d="M98 157.77a6.05 6.05 0 11-12.1.3 6.05 6.05 0 0112.1-.3z" fill="#fff"/>
+    <g opacity=".8">
+      <path opacity=".8" d="M578.8 234.07a13.62 13.62 0 00-22.4 14.1c3.4 1.7 8.4 2.4 13.8 2.6 6.1.3 9.6-.9 12.2-2.6a13.36 13.36 0 00-3.6-14.1z" fill="#67BDD8"/>
+      <path opacity=".2" d="M576.1 238.97a4.3 4.3 0 11-8.6.2 4.3 4.3 0 018.6-.2z" fill="#fff"/>
+    </g>
+    <path d="M601.4 243.57a7.54 7.54 0 00-11 .6 7.5 7.5 0 00-1.8 5c-.02.72.11 1.44.4 2.1 1.9 1 4.6 1.3 7.6 1.5 3.4.1 5.3-.5 6.7-1.4a7.46 7.46 0 00-1.9-7.8z" fill="#67BDD8"/>
+    <path opacity=".2" d="M597.6 248.57a2.3 2.3 0 100-4.6 2.3 2.3 0 000 4.6z" fill="#fff"/>
+    <path d="M562 282.77a10.1 10.1 0 00-7.5-2.9 10.36 10.36 0 00-7.7 3.7 10.9 10.9 0 00-2.5 7c.02 1.02.19 2.03.5 3 2.6 1.3 6.4 1.8 10.6 2 4.7.2 7.3-.7 9.3-2a8.2 8.2 0 00.5-3.5 10.08 10.08 0 00-3.2-7.3z" fill="#67BDD8"/>
+    <path opacity=".2" d="M556.8 289.97a3.3 3.3 0 100-6.6 3.3 3.3 0 000 6.6z" fill="#fff"/>
+    <g opacity=".8">
+      <path opacity=".8" d="M384.4 253.77a10.1 10.1 0 00-7.5-2.9 10.36 10.36 0 00-7.7 3.7 10.9 10.9 0 00-2.5 7c.02 1.02.19 2.03.5 3 2.6 1.3 6.4 1.8 10.6 2 4.7.2 7.3-.7 9.3-2a8.2 8.2 0 00.5-3.5 10.52 10.52 0 00-3.2-7.3z" fill="#67BDD8"/>
+      <path opacity=".2" d="M379.1 260.87a3.3 3.3 0 100-6.6 3.3 3.3 0 000 6.6z" fill="#fff"/>
+    </g>
+    <path opacity=".2" d="M171.6 163.67a3.8 3.8 0 11-3.9-3.7 3.75 3.75 0 013.9 3.7z" fill="#fff"/>
+    <path d="M145.6 212.17a13.79 13.79 0 1117.5-8.6 13.86 13.86 0 01-17.5 8.6z" fill="#67BDD8"/>
+    <path opacity=".2" d="M155.8 201.77a4.7 4.7 0 100-9.4 4.7 4.7 0 000 9.4z" fill="#fff"/>
+    <path d="M68.6 197.47a6.6 6.6 0 100-13.2 6.6 6.6 0 000 13.2z" fill="#67BDD8"/>
+    <path opacity=".2" d="M71.3 192.07a2.2 2.2 0 100-4.4 2.2 2.2 0 000 4.4z" fill="#fff"/>
+    <path d="M101.4 213.37a3.9 3.9 0 100-7.8 3.9 3.9 0 000 7.8z" fill="#67BDD8"/>
+    <path opacity=".2" d="M103 210.17a1.3 1.3 0 100-2.6 1.3 1.3 0 000 2.6zm444.3 114.9c12.2 0 22.1-1.84 22.1-4.1s-9.9-4.1-22.1-4.1c-12.2 0-22.1 1.84-22.1 4.1s9.9 4.1 22.1 4.1z" fill="#fff"/>
+    <path opacity=".1" d="M602.5 318.97c26.01 0 47.1-3.09 47.1-6.9 0-3.81-21.09-6.9-47.1-6.9s-47.1 3.09-47.1 6.9c0 3.81 21.09 6.9 47.1 6.9z" fill="#fff"/>
+    <path opacity=".04" d="M460.4 329.77c37.67 0 68.2-6.09 68.2-13.6s-30.53-13.6-68.2-13.6-68.2 6.09-68.2 13.6 30.53 13.6 68.2 13.6z" fill="#000"/>
+    <path d="M495.4 382.87c10.94 0 19.8-1.3 19.8-2.9 0-1.6-8.87-2.9-19.8-2.9-10.94 0-19.8 1.3-19.8 2.9 0 1.6 8.86 2.9 19.8 2.9zm-152.1-53.7c12.2 0 22.1-1.84 22.1-4.1s-9.9-4.1-22.1-4.1c-12.2 0-22.1 1.84-22.1 4.1s9.9 4.1 22.1 4.1z" fill="#67BDD8"/>
+    <g opacity=".8">
+      <path opacity=".8" d="M435.9 364.67a19.27 19.27 0 00-13.7-5.3 19.2 19.2 0 00-17.7 25c4.8 2.4 11.7 3.4 19.4 3.7 8.6.4 13.4-1.3 17.1-3.6.7-2.1 1.03-4.3 1-6.5a20.2 20.2 0 00-6.1-13.3z" fill="#67BDD8"/>
+      <path opacity=".2" d="M432.2 371.57a6 6 0 11-3.8-5.41 5.92 5.92 0 013.8 5.41z" fill="#fff"/>
+    </g>
+    <path opacity=".2" d="M547.3 389.47c18 0 32.6-1.84 32.6-4.1s-14.6-4.1-32.6-4.1-32.6 1.84-32.6 4.1 14.6 4.1 32.6 4.1z" fill="#fff"/>
+    <path opacity=".07" d="M352.7 250.37l-24-1.4 28.3 1.6-4.3-.2z" fill="#0C0D0D"/>
+    <g opacity=".8">
+      <path opacity=".8" d="M458.6 259.57a19.27 19.27 0 00-13.7-5.3 19.2 19.2 0 00-17.7 25c4.8 2.4 11.7 3.4 19.4 3.7 8.6.4 13.4-1.3 17.1-3.6.7-2.1 1.03-4.3 1-6.5a20.2 20.2 0 00-6.1-13.3z" fill="#67BDD8"/>
+      <path opacity=".2" d="M454.9 266.47a6 6 0 11-3.8-5.41 5.94 5.94 0 013.8 5.41z" fill="#fff"/>
+    </g>
+    <path d="M488.3 305.57a10.1 10.1 0 00-7.5-2.9 10.36 10.36 0 00-7.7 3.7 10.9 10.9 0 00-2.5 7c.02 1.02.19 2.03.5 3 2.6 1.3 6.4 1.8 10.6 2 4.7.2 7.3-.7 9.3-2a8.2 8.2 0 00.5-3.5 10.08 10.08 0 00-3.2-7.3z" fill="#67BDD8"/>
+    <path opacity=".2" d="M483.1 312.77a3.3 3.3 0 100-6.6 3.3 3.3 0 000 6.6z" fill="#fff"/>
+    <path d="M475.3 240.77a6.9 6.9 0 00-4.8-1.9 6.64 6.64 0 00-4.9 2.4 7.06 7.06 0 00-1.6 4.5c0 .64.1 1.29.3 1.9 2.16.86 4.47 1.3 6.8 1.3 3 .1 4.7-.4 6-1.3.3-.7.4-1.45.3-2.2a6.84 6.84 0 00-2.1-4.7z" fill="#67BDD8"/>
+    <path opacity=".2" d="M471.9 245.37a2.1 2.1 0 100-4.2 2.1 2.1 0 000 4.2z" fill="#fff"/>
+    <path d="M495.9 257.07a5.88 5.88 0 00-4.5-1.7 6.35 6.35 0 00-4.6 2.2 6.18 6.18 0 00-1.2 6c2 .82 4.14 1.23 6.3 1.2 2.8.1 4.4-.4 5.6-1.2a5.1 5.1 0 00.3-2.1 6 6 0 00-1.9-4.4z" fill="#67BDD8"/>
+    <path opacity=".2" d="M492.8 261.37a2 2 0 100-4 2 2 0 000 4z" fill="#fff"/>
+    <path d="M379.6 302.17a11.2 11.2 0 00-8.8-1.4 11.67 11.67 0 00-7.5 5.8 12.14 12.14 0 00-1.1 8.2 11.8 11.8 0 001.2 3.1c3.1.8 7.4.4 12-.3 5.1-.9 7.7-2.5 9.6-4.4.2-1.3.1-2.64-.3-3.9a10.89 10.89 0 00-5.1-7.1z" fill="#67BDD8"/>
+    <path opacity=".2" d="M375.7 311.3a3.7 3.7 0 10-1.58-7.23 3.7 3.7 0 001.58 7.23z" fill="#fff"/>
+    <path fill="url(#pattern0)" d="M438 175h218.75v45H438z"/>
+  </g>
   <defs>
-    <style>
-      .a {
-        fill: #0c0d0d;
-        opacity: 0.07;
-      }
-      .a, .e, .f, .h, .k, .l, .o, .p {
-        isolation: isolate;
-      }
-      .b {
-        fill: #35afd5;
-      }
-      .c {
-        fill: #999;
-      }
-      .d, .e {
-        fill: #c4bfbe;
-      }
-      .e, .f {
-        opacity: 0.4;
-      }
-      .f {
-        fill: #e7dad8;
-      }
-      .g {
-        fill: #6a6b6c;
-      }
-      .h, .o {
-        fill: #fff;
-      }
-      .h {
-        opacity: 0.2;
-      }
-      .i {
-        fill: none;
-        stroke: #fff;
-        stroke-linecap: round;
-        stroke-miterlimit: 10;
-        stroke-width: 7px;
-      }
-      .j {
-        fill: #31a2c4;
-      }
-      .k, .l, .n {
-        fill: #67bdd8;
-      }
-      .k {
-        opacity: 0.9;
-      }
-      .l, .m {
-        opacity: 0.8;
-      }
-      .o {
-        opacity: 0.1;
-      }
-      .p {
-        opacity: 0.04;
-      }
-    </style>
+    <clipPath id="clip0">
+      <path fill="#fff" d="M0 0h660.05v441.27H0z"/>
+    </clipPath>
+    <pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
+      <use xlink:href="#image0" transform="scale(.00162 .00787)"/>
+    </pattern>
+    <image id="image0" width="618" height="129" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmoAAACBCAYAAABwzpYXAAAgAElEQVR4Ae19538kxdX1+095ycuCiUvO2YDJ2ICJhsfYGJtgPziAjUmPzZJN1K6kVVhJuyttkLRRq11NnpFmNDkn7ef7/k4vDc0wobu6qqdndD/Mryf0dFdXnao6devec//fyZMniV9cB4wBxgBjgDHAGGAMMAbch4H/x43ivkbhNuE2YQwwBhgDjAHGAGMAGGCixhZFtqgyBhgDjAHGAGOAMeBSDDBRc2nD8EqKV1KMAcYAY4AxwBhgDDBRY6LGqyjGAGOAMcAYYAwwBlyKASZqLm0YXkXxKooxwBhgDDAGGAOMASZqTNR4FcUYYAwwBhgDjAHGgEsxwETNpQ3DqyheRTEGGAOMAcYAY4AxwESNiRqvohgDjAHGAGOAMcAYcCkGmKi5tGF4FcWrKMYAYyBVqdOe1QJNrxaFXnPJEtXW1ngC5nFeGQZipSrtjVvH575EifLVurJy9dP42ZaorZ08SQPhHL1yJOHq12sLCfrbsTi950nTF8EsTazkaS5eoGPpEoXzFcpV6rTGgxV3CB6sGQM9hoGDyRL9dNhLZw2Kva4cD1C2wpNhP03abnuWbZEcbRqyjs8LtvvpULLEY5KJMaktUaufPEm/novST7Z6eu515qCXNo8F6ObJIP1y7zK9dDhOW7xp2hMvUrRU1Zh8bY1X7G7r9FwexiRj4HsMgKhtHPIKj7+XjPopW2WLGmPqe0zJrouBUFZbSFjlCcA18C27PP14vb4lau1Ac96wjx6YjtDrxxK0K1agAptfubOYWNX04wDAz6RuApNRt0zU3N0+Mtq416/BRE09RtclUWskcWcP+ej+6Qh9E85RJF9h0sKkhTHAGHAFBpioqZ8Ee50odbv8TNTUY5SJmmFbd8NWD1046qdn56O0e7VI8VLNFYN1tzsi3199R+Q65jpuhgEmaoyLZrhw03dM1NRjlImagagZLW3nDPnokb3LtDWUpSxvjTJhtWFhWls7SbW6yIt9i9w0IXWjLEzU1E+C3WjXfronEzX1GGWi1oKoGUnbLVMh+m8gQ7kaT5z9NMA49SzH0mX689G45dc/jiUox47g63qRwERN/STo1DjQr/dhoqYeo0zUTBA1nbRtHvPTf/0ZDj6wYV3q18Gq3XMNR3JCUXsXjvgoxtvvTNQ46nNdY6Dd2OKG35ioMVETmuB0YqXiePo2D929K6z5sBXYwsYDqAnSykRN/UDmhglLRRnYosbYUYErmddkoqYeo2xRs2BRMxK/TcM++stCnFaKVSYrJsiKzIGh167FRE39QNZrmDBbXiZqjB2zWOnWeUzU1GOUiZogUQNpQ5To9RNBzbpWZ/FcJqwtCCsTNfUDWbcmKdX3ZaLG2FGNMbvXZ6KmHqNM1GwQNd3CdsY2D71yOE4Zjg5lstaErDFRUz+Q2Z1s3Pp/JmqMHbdiUy8XEzX1GGWiJoGogbAhF9/Ts1Hy5apUq3N0qN6J+XiSmKipH8j6FWdM1Bg7bsc2EzX1GGWiJomogaydts1LN00GaV+iyJalJpYltw84qsrHRE39QKaq7bp9XSZqjJ1uY7DT/ZmoqccoEzWJRE3fCr10LKBZUdaYrDBhPckWtU4DPf/eeqBnota6bhg37qgbJmrq20EpUTtr0EdT0YKyyRpEqFSrU7a6RoFchQ6lSjQcydLbJ5JaGqh7Z5bp8vGA5vSvkyinjshs8L4nRfU13gZd7wMqW9TUD2T9ijEmaowdt2ObiZp6jPY0UWsH4EqtTqulGi1lKzQZzdPrx+L0yz0RunwsQBsGlhzRZ7t01E8feFOU4yADZWS9HQbc8hsTNfUDmVvaWnY5mKgxdmRjSvb1mKipx2jfErVmYCzV1uhoukRbPCm6dzpCF273Kbe2nTPopY99aeJtUPVgbtbmbviOidr6bXu7+GOixtixiyHV/2eiph6j64qoGQFbrYO0lenVI3HaNOxVamHbOOSlLwPZdW1VMtb9envPRE39QNavmGKixthxO7aZqKnH6LolakbwY2vyQ2+arhwPKiNs5w55tQAD4335vXqAu6GOmaitj3ZWgTUmaowdFbiSeU0mauoxykTt28jM2tpJOpoq0Z+PxuniUT9t2CbfygbpjkPJEq1xFoN1ZV1koqZ+IJM58bjpWkzUGDtuwmOzsjBRU49RJmoNEhrwJZuOF+jhPcuEyE2ZUaJIOXXHrjAtF2vriqg069zr6TsmauoHsn7FExM1xo7bsc1ETT1Gmag1EDW9U+Rra/R/SynaKJmsgfj9Zj7KkaAt6l2v/346MlFTP5D1E16Mz8JEjbFjxIMb3zNRU49RJmodCMNipkQ3TgSlRofCsvZvD0eCunHQUVEmJmrqBzIV7eaGazJRY+y4AYftysBETT1Gmah1IGoA6EK6RE/NRumMQY+0rdArxwM0s6pODLhdx+Lf1HcsYx0zUXO2vo113+vvmagxdtyOYSZq6jHKRM0EUUNHSZdr9MdDq3TGNnlk7c5dYSrUOHOB2wciu+VjoqZ+ILPbRm79PxO1/sAOMtQgYK2KY/2kFlDWL9qaTNTUY5SJmkmihoE8X61rUaEyAww+0NJMqW9ot05E66FcTNQY36I4Z6LWW9gB+cpU6nQkVaKx5Rx96k/TOydS9JejcW3ueOnwqnbE538sJmmLN0PfhLI0tZKnE5my9l9RrHTrf0zU1GOUiZoFooaOUKzVpVrWkGbqeLbCUaAW26Fbg5LIfZmoqR/IRNqlF/7DRM3d2IEGJySXPvWl6Q+HVunO3WG6bCxA5w37CELnZw562/o3w1/5rCEvnTvko/OHfbR51E937AzTCwdjWvrBPatFSpSrrs5s42aiVq2fpHipRv58hRYzZTqcLBH6FF5H0iXtu1C+ou2Y1Vycl5uJmgBBSFZA1uLStkH/fDShEcBemDhalVFbSVbrFMxX6FimTLPxIk2s5GkwkqOvgxn6Opilb0I5GgrnaHwlT/viRTqUKtFSrkIrxRoV6muuHoyMz12un7KuwsJq5oWBTMQKe+GIjwL5iql7mCmH8RxsxRifyQ3vsQiKFmvkyVXpYLJIM6tFGonkNIsD8IPXYDinCUfvXi3SgWSJjqVL5M+VKVWuaVtLbngOmWVgouY+opau1GlfoqhZxO7eHSYstkG4RPp4u/+cts1LP93uo1t3hjTiNhTOkidbIbcRCjcQNaSHxNgxnyjSV4EM/XUhTs/MxejemWW6eSpE104EtTzfm8cCdMmIX3ttHg3QFeMBun4iSLfvDNMDMxF6fj6qqT2MRnJa5qJkue6KcZKJmgBRw0CMzooAgw1b7Qvjnjfko/2JoisAYWaSASnDpJoo12g+WaQPvSl64UCM7p+JaKC/cMRPp3cQDMYghFXkZaN+um0qTI/tW6GXD8foi0BGI3DxUtW15PV9T5oe2xc1/bprd1hoED9r0KvVqZV7mTn3ufkYxcvd1fIDUUQfOpEt02A4S39biNPjs1FtwIRFAtaIdpMYfjt7yEcgszdMBLV6en4+pkVTT0YLFMpXKVer9wz5b9XvmKi5g6jBtyyQq9B/A1l6cE+EzhmWq7HZCev4HWPmNRMhevnwqjZflFyC724QtVp9TdsmxnbxB94UPTsfpRsng4Tc2mbqstM5IN4Xj/jovumIRvqmYgXNoFCudYe4MVETJGoYWIO5Cl27Q07aqWfnopqjaasB2y3fr5ZqmpUMWnCYUDsBXuR3dBJExT4zF6XPAxmKFNy1NfzCwVUlzy1SVyL/uXC7jyKFalcWBpX6Gu2PF+nvCwn62a6wNKt0Yz1sHPZpK+S3jidpNlEk5PZ1Sx+yUg4mat0narFSlf6+EKcrJY31jVgV+YyF8APTERqK5Al9ygqmZJ/rNFFbLlQJi+V7piOExaxI/Vn9D+akK8YCBB/Dg6mS43XORM0GUQPgsYUH07fVhm88f+Ogh2bi7rSqZSt12rGcpxcOrdLmMb+WsUGFqb+xTvAZ/huXjPrp8dkV+jKY0czb3Y6WYqJmbfLEVs1CukzvLCW1zBwXbPcp2Spqhh/gFJbbW6ZC9PZSio6lyz1F2pioWcOaTBICNw4EAly9Q66OZjOcin4HooLtvZHlHHXL2uMEUcPW5u5Ygf54OK7NB6dLVF+wUvcYT7Adfe9MhL4IZihedmbBy0TNJlHDFs6bi0mNUFhp8GbnPjEbddVWTapS17YisXLb1AVTf2MdwTH39l1heutEio5nuuerwUTN3ORZqddpPlGi3x+MEXxDnCL3jbjRP5+2zUNXjQcIW79TsTzlqt21RJghFUzUzGHNTF2aPadQrdM3wSzdtStMpztksdExKnqElfzJ2ahmPXba/1QlUdMt8M/OxTSCJFo/Kv6HrEXYFfgymKVoUS1hY6Jmk6ih88PXBo6IdsFwxjav5rNjdkBRdV4C25vhLN29O9L1ybVVnV61I6iFvMMM7rSFjYla+8kT24wLmbJG0GA9a9WG3fz+7EEPPY2JLV4kpItT1ZfsXpeJWnus2a1f4/+hcwY/NOwcYCzuJj5F733xiF/zGUZwlvHZVL5XQdRA0OC/+r9H47Rp2N1tgQXgnbtCNBzOEki+irpmoiaBqKFh9saLWni1aAfT/wd9HQwYKhrbzDX3J0r0i73LmuOqXiY3H+En95k/46hwMBO11vhERPTfjyVMBQO4AVcISIB/qD/nLj9Iva8yUWuNNb2OZByx2EOU+nUTcnyOu43tp2ZXHMO0bKIGkoagDZDObtejlftjxwfWen+2LH3+ZqImiajVT56kPx2N2wbWlePBrjjPI7T5jWNxTf/HCjjdcC78FRBx6lTkLBO1H0+e8EMbX85rWwEYsNyACytlQPTxx960JoUiY+KXdQ0maj/Gmqy61a9TrK9pi4vLxnqLGLTDNyJErxjz01Q0L5006PWmH2URNZDlcKFCv56PaX7Q7Z7Pzb9dPxmkbeEcISpXryO7RyZqkogaGmIxXbYdWAC5j6FITloDdwIIJtiDybIWQdNtHyI7nQ9lv3jUTx/60tpWdKfntvM7E7UfTp4QlPzz0XjPWNFa4QyRos/MrWjyMHbwIfO/TNR+iDWZdYtrpcp1evFgjLB91QoXvfz9JSM+GgjnKC+RNDS2gQyihl2kyWiebt8Z6ot2gE/3K0dWNRkkGa45TNQkErVyfY3eWEzQTwaWbIHt2fmYI1IdiBL6xJemK3aokdnoxgB3xqCXfncgptTsz0Tt1OS5trZGR9JlemjGvb6MIhhEhOiuWMFx38fGCRCfmaipI2oQj31837KtsVoEX07/59xhr7aAVSWUa5eoYd5ERL8M9QSn67bd/TAXYWz05e0HGjBRk0jUMLCuFKt0+bg94gO9Hq9in5litU5/PRrvGV+0dh2i2W+IxlFVh0zUTk2eO1byyrT0mrWpk98hoguW7W5rVDFRU0PUEIR05y4xIWoncSjrXucM+eitE0lSERFqh6gdSBY1wdqzBvvToon2gyA3MiY0W4iZ/Y6JmmSiBjPnK0fitMFG1BD8C7aGs7Yath0AoqUaPX8gpuWhkzUQuPE6cAzGRCfD9Gysz/VO1EBevgpmpATPuBE3epnOG/bSe55UVzNkMFGTT9RiRedJ2jlDp9JBIW0RxLwvGfXRed/mAtXxpvoIzbV/e9LS5xVRooby/HJPpO/nIbjlIFXVTKwgXPdM1CQTNUzo07ECQdfGTsdDiLhsgoGyLRerWlRntwQD7dSJyH9vmgzRXKIodSW5nokatss/9qUJFieR9ui1/0AsF1kUkDLNSNades9ETS5Ry1br9OTsijLsImMAFOzvmYloqZ4+8KRoIprX/B6Ppku0lC1r+TqRIByfkTUDOTyxIMDi+a7dEc3X9gxFPnPnDp+yFENAVhaGRYkaxgKn/KLh+422OXvQS6gDbEuepiA/a7vx7caJoJa/WMRKz0RNAVHDtuIDM/bM6vCTQb5LWZ0J18nW6vTwnmXHRBzRCZFZAHkbN6KDfPseKymNKA44Y+6Gsvj0qvhqprENXj+W0NSxkTHBzEs0/xzqz8z1rZ6DJMUiAo3Id4hcrFDmbjcgyfoNz48IUmzbYHA9d8ijHfEZ3zs1yIOsvXU8JZXsN2Kq1WcmavKIGnITY7dDFj7164AAQCYIuZ+/DmXpWKYsrKeVqdS0heUH3rSWZxILftk4R1JyLF5bYc7q93aIml6Hso6oK1jCr9oRoHunw5q/8rtLSfoqlNVcGRCZDhmW7ZEcodwg0n86mqDH9q7QDZNB+unwKUInqzyN10EkrkjdM1FTQNQA9A+9aVsDwgXbvQRNM6udptX5hVqdnp6L2ipTI+iafYY5H4lsXzgYo3dOJOnrYJZGl3NamPjMaoHg14TQZVhlXkMi7v0rmnaR6qir6yfk+f0hpRZynpp9/TeQEap3iMVi0Dd7H7PnYcIS8VWBwy8ck5u1u6zvIDR602RQE6OFHhvqbjCUpfGVPAE/iAwbjuToq2CW3jyepN8cjGkRy1gEyCpDs+tgYfFNKOu4xiETNTlEDbsTwItsSxX8kf91PKkl7Ja9A4LE4yeyFXr1SJwu2C5XOuTWqRAF8nK0A91A1DBu3LEzRG8uJmhfokQ5AeHZytpJLdXdR740IUsQFofNxgK7390wGbAsbM9ETRFRwwRrS5V9wEMfeeX4E+SrdfrfhYT0QQqARQdBqpU3FuO0M1bQtlbRSaAh02ngAllA2ZCqCjkYvwxk6Lm5qBb9Y8fHr1VHwrYCski0IrOqvgexaFWmdt9fOOKjWKnmeHkb6wHtCIskVqrtyivyG/wxr90RpGdnVzRrBCameLmmWSQQVdpYlsbP2MJBKqhIoUJjKzl67WiC7tgZVuL3AvmXUQelc/CsTNTkEDXoiZ0nceKFn9m/l1JadDkIVSMuZX6Gu8HxbIVeW0jYdqnR+ygsT7/Ysyxs+TM+X7eImqYVNx7QNPDQT5BRZ02CWDzGO9Q5gtG2eNN0286QdPkWGDPiZfNzERM1RUQtU6nTI3vthX5DMd3YIUTe19dO0n88aRLdftM7tvGITg6T/G8PxGhnLE8JC4Dr9AxIwQGS+4E3RfdNh6ULH0IzCX4qncoh8/deJ2q+XIWulCzhcuY2L90zE6ZP/Gny5SuEEH0ZdQ7yH8pXaCpa0Eg/nLdlbh0hQAVZSGSU1cw1mKjZJ2qwNMOZ2ziGib6HRe65uRUK5KqOW1fRR+aTRW0XYpMECzL8TEFEzOCw3TlOEzX052t3BOi9EynN56+TQaBd2c38FspX6fNAhu6biUjza4OP3B8PrZoe95ioKSJqAMDfFuz5QyCBtBkgtTtnf7woNRUH/DFAIE856NsfRNuVHVuMn/szhLyeogNr4/9gAXRSUBjP18tEDdbRRyVrTV23I0gDoRzBH6dd+9v9DbpRwOnzB1elroihjSSLWHZ6RiZq9sYY+FX+1eY4rI8hP93upQ98aamK853av9nvEK9981iCzpZA1s7f7rOdCcdJogaS9psDMVrKVsiMxb1Z/Yl+FylU6S8LcWkLP7hrwFfODNFkoqaQqGFVr3dykSNAmbMRnYNJ9mpJlhCYmX8+HdEETp3uINgexcrv0jE5q+KLRvyOWkV6majB50NWdBRcAbZ4UlK2W6wMtkjvdjhV0vD7E5ti1OjHWKxgi9VKGUTPZaJmj6jtXi1I2Qa/bWfYthaWKAZa/W/PakFzgBeZW4z/eWYuSoWquEXbKaJ2/URAc69pVR9OfY+xBNY1Yx2KvsdchG3tTmVnoqaQqIXzVdsyBkdSYgEF8BH74+FVKez/whE/vbeUIjihdwKUqt+x6kDi7CdmV6T42t07E6GMQ1ugvUrUECF1vgS/Hpj5H9u7TJ6c86tgIx6B37dPJKX4+UAXC9IKxuureM9ETZyoQYrooT32JlQsUDEpw1fUjOVDBQbaXTNcqGo+wna299E/h8LiaQtVE7XTYUWbj2oK/25oA5QhVa7Rq0fjmqqBKEnT//fcfGeizERNIVFLlut025S93GUjgs7LcOyXYRpHBB6iNuFc2W7AcOo3+MP9YzFpm0BAMuTt40lHnqkXiRp8BSHjoQ8mokeY9yFnIhKFpQJT0DCCX6WMnIIPzEQI2yEqyqlfk4maOFGD9fb0QfEAGJAfyCwhUbjeHm48Inrzkb320rjdPBmimKAclEqiBhkebF1jPHJb3SMI7v+WUrb9vzEXQdal3fMxUVNI1CCJAbOy6CSH/0HGol0DNvsNSbJlmGY3j/pds4oxPicCJKCLA/FCO3WLrTisjIzXVvG+14gaIqc+9KZs1S3aBVuE//Gkuu7T09im2LpHwMG1E/Z8HyEp874EZ+zG8hk/M1ETI2qrpSpBP9HO+HD7rjAFFKfyM7a1nffIJwkJItHnBZY/9mWExkJVRA2SOLBawc/QTt2o/C/8YP+5mLRtFLlrd5gSbRQJmKgpJGqIQHvjWMLW9iPycVoNOcb2jl2/IlgcsHWrEuR2ro26hc7cJpuSEcgyoFp1vteIGqQukOJGdNDH/7A1CL08tJOddlb5XyxoHrTpa4JAlxOZsrJnZKImRtQgnWFnOxAkT9TtRCVm2107mK/QNTbIKZ5ZRL5IBVFD0Ne/jicI/qXtntkNv2GM2+JJ05k2gjuwqH37RKrlszJRUwyEz3z2GvB3B6JUrpsHayRvX0oBujGQyHBDJ+hUhvHlnC29OvhgwSm3033s/N5LRA0rRAhs2pnkoOT/VSBjeYFhp45F/4vk3I/stZdS6OUjq8rww0TN/NinYwDBR5eMigcenT3ko73xkqstOfqzNh6xeBWVYoI/HnL4Nl6z02fZRA1jz5+OxgkSV53u7Zbf4VKhqTzYyLYDsfhWfuBM1BQTNSjxYw9a1DqBvHQYeMwC0q4FD+Kjc/GCKx1nm9VBbe2kZrK3MzA/Ox+loo3o2mblMn7XS0TNl6sStrxF8YqUYQg8QbsY68DN75F38We7xVO+XTkuL+tFYz0xUbOOI9H+BsxDaPvPRxM9M/414gXb+sjoIZqLFz7VCERrvG67z7KJ2v3TYcrbiEJtV1aVv2HR9+i+lVPpEQXziCJ1WLOtXiZqiokadMzsKLo/uCdCeZMkAtaQS21MshioxpZzPWEJMXa4an2NXl9ICJMLRLWK5F8zlqHde9GJoxuZCWB+FyVp+N+jeyOOCwq3q3szv8G1ACH3Wv5ZgQEW2xYImFChUM9EzRpRgxvDk/vFLaTwW5Qp4G0Gf7LPwfblTVPi/mqzcWs7DDKJGgjmUo/4BTZrNyx0kXtZdAy9dSrY1JLIRE0xUTueqdhKYn3PdFhLkdMMFI3fQT1ZFCBwJsWWV+M1e+Uzsg08bCMUH1kWVD1rrxA1RDAiubQohq7cESTIBaiqR9XXRX5e0W0jBKb4c/LdBZioWSNqsI6KRrufM+Sjr0PiMhWq8Wnl+iPLeRLNf4vsLVYEnWURtbMGvVoQk5XndOO5mIdFMYixF7twjc/FRE0xUUM0DiwjopPfnbvClDah4A75A6RcEr0PkvS6Ia9kI0CtfPZky8KD08UjfvIrCp7oFaKGCEb4qYhgCER/dPnHA4yV9uv2uehDyLoh8vz4D0L1Zes8MVGzRtT+400Lt9/j+1d6zhrcqs/AXeY38zGhuoAbSdDCWCiLqP1q3woVTO4etXpuN3wPfU47RoPn56M/ksNioqaYqCES5yIbRO32nSBqnX0GFtJl4agTOM8ilYUbQG63DP9YTNCZQ9aJMVZz8K2ye/9m/+8FoobtPwSRiJIU5LXF1nuz5++l77AFeo1gNo/7ZyKEvJIyn5eJmnmiBufzB/eI5VdGlOGgDdFXmW0u61oL6RIhRZRIn7YiCyWDqJ2/3UsHHBCQllW3na6ze7VI5wsqEiBy15P74c4EEzXFRA06PEhgLtJZ8J+f7QqbUtBHEIHoPWCJy/ag82azzrJartHmMTEfAVgvm13T7ne9QNSg4g6rmAiGNg776HBaLIOG3bqV/X9NUmdRrC9B1092wnYmauaJGrY9Rf2DoGMFWRrZeOrm9RAghQWUSJ+GmLPZgCAZRA1O+KplkpxsC9T94/vEfCUR9QppI2N5magpJmqebIUusGFRu2c60tFHDSG9otYQOELvillzHjUCyI3voUi+YeuS5QEKHeRERv5g3QtE7c3jScv1pU8Av56LSt/y6yauYAUXnfD/cEiuVAcTNfNEzY6PLv7bTcypuveuWF6oX18CVxCTTv12iRoixeeT6tOxqarjVtfdGc0LyxwhZZbxukzUFBO1Q0lx8zMmwof2LHeM+pyOFYUDFn65N+LK9BxGkFp9D1+7WwSjnhC9J9vPyO1EDX4hCInXiZeVIyKa9/fRlgWwdsqqJkZcb5gISt3+ZKJmnqghZ6IV7OrnIoDEjHuJ1XHIDedD30tECWDDVq+mAGDmGewSNVgz+8maptdZ2oYB5cbJEMUNKb2YqCkmajOrBWEHdwwkT80iYWt7H7V3l9LCzH1rg4lVB1kvH5Fi6i1BmQkQFtmDttuJWrxcE/ZluWtXqC8cgBvxvpStCPWpTcM+morKC6pgomaOqJVra3TtuJgkBXwLG9u/nz4/f1AsqODFQ+Yi4e0StbccyrnsdJuCJJ/SNbW+uwN3qX3x791JmKgpJmpDkRwh7FtfvVk9/v7gasdQ6ccE98LhQNtL6s9WOtqCoC7WucM+OpqSK7PgdqI2vVoQxidS9Vhpl146V9Qqi4AWWc/JRM0cUQvkynTBiHXfVEQ5I+WerPZy43W+CWWEAs1unAiY2l2wQ9TgbrJSlBuA46Y2OJSEjqr1+R/18okhzzcTNcVE7X2PuOQBSB3SUkBtuhX4sG115biY9tWv58ytmFrd283fQ2rhIUFdtY8kJ9p2O1GDkrnVBQTOv2C7n0J95oBtxPRn/rSQCO7Pp+VZaJiomSNqCOIQWRDDAio7AMSIITe8h8+lSEAb/oMgo07PYIeo3b0r1PH6nQkuQHMAACAASURBVO7v5t+xu3PTlFg0/f/Mfe+nxkRNIVGD6fOVw6tCk6A+cX7cgTQcSoklJocKe2NkiZsBL1K2f3vENJWelyx+62aihqwOooT2iVmk3mq/LS/Sbm75DyRvNgsIAF8yFpDmp8ZEzRxRgwsHrBD6uGn2eMV4gDImdCrdgkmRcsDnFjJPZutEPw+yTWb8T+0QtX8t9rc1E+31guDW8w0Tge9ILBM1hUQN1q5fCoZH651lpIO+2bZwnqABpp9v9ogtvl5JvC4yOOE/+xJFy/WC+rtzN7JByCMgbiZqqXKdbpoU8+15p8+3jAq1Ov1cIAcotjpmLKbhaYVxJmrmiNo7S2Kpz27f2d8WHR1XzwgIOUMRYCjS2d9SlKjh+lPR/lIc0OvbePzEJ5YxCERZD2xjoqaQqCVKNbpKcFtSJ1yd9Kn+dTwptJJE4u1+UIE2dojG9/n6STpdgMRePhagxbQ8PzU3EzWkPRKxGgGf8G1rrPN++4y0anpfNHvEBPS+R47vHhM1c0QNju9m28d43lOzK32PYfTJvx0Ti2J+50RnHIsSNWw7H+sT/cV2495kNE/IYWrEndn3CPTCtZmoKSRqxzIlIRKlNyJM+Z3I1G8PiIWkP9jnkU56x4H5WK9Ps0fkyNsZ67yS1O/R6ehmonY0VSJYV83WjfE82Sr8neqxG79/EcwK1c2Lh1Z/lAZGpPxM1MwRNaR/MmLT7Pu/LvRufmMrePpM0KrTqOfV7J6iRA1p+xJleTsXzcrmhu+Opst0uaDBRt/1YqKmkKjZEWDEQANrnG76bAW4hwW3Vns5AXurumj2/TNzAivtAQ99KVEA081EbU+8KLSYwAoRemPN6ryfvptZLdJpAr5P8PvLmkj91qmumKiZI2oQBjdLzoznvWvCYtSpjXrh96FwTmh34ZF9nS2OokTt6vEAwdm+F+rPThkjhSpdPyHmXrL3WxcKJmqKiFqlXidIaxgHBavvn5z9PuqjFVCQYsrqdXG+MfS31bX74XsI2IrUD5T6ZT2/m4kacryK1A+EXWXVj5uvA5mXCwRSwF03EaAEEzXHMHLHLjGi9oG389aem/Fptmxjy3k6e8i6L/PdJiKYRYnaLVPrwz8Qupy3CkZ+Tn7rw8dETRFRC+crdKtApI0+aWLb80MTgwgSuOr/sXIcXf5hLjGzHb7XzgMhtVIv+rmvHpW3JeJmoiZaP7AY9RoWRMrry1eF5G8uGvETMmSI3NP4H7aombO43DwpJoHwX3/WdhsZ28ut73fGxITXb5zqvCATJWr3TKvJrey2NshX64Q80vrcYuWIhTSeh4maIqIGdXJIYFhpFOO5F474ab+JyLHLBOQDcJ+ZeP/lVmvWQQdCYmH7v5mXpzHnZqIGwVoj7sy+RxRZs/rut++gQQXrodl60c9DJPZyobMGVaf6YqJmjqiJWiw+NoiKdmqLXv59ciUn5It6w2Rnq5coUXt4z/K6GEMg0yW6NQ/BfOCOiZoiovayQLSYPsjjeOfuiClHSzhkGv9n5v1p2zw022f5GVsNoliRiER+PrlfHhFxM1F7WzAZ++8ka821ar9uf79SrNKtAnljYREHybNbfiZq5ojaXYIWi/940rbbyG4bO/F/yDydKRABb4aoQcJDRGwY5MWJZ+/2Pdiipohk2W1YbHmICAwaSdZvD8Y6BhKgnCJEDcRldp1Y1EDUQEyNdWvm/RPrhagJ5kRFtLHdftIL/4dVTNRaA+kTu8/IRM0cUXtgRsxHDfJGdtuoF/4vurNghqiNr+SFrHU3rxMftWSlRrftFNuaH//WRYktagrI3tfBrNAKw0ggvgmZ8yET3frcvQ40sDCAwiwvoli+Xoia6Nbn0yYCXXphAutUxmChSjcKCgIzUTNHsjq1gZnfn50XiO7e6qGXDsvzRTVTzm6d875XzMXBDFGDniIkjYzzl5n3V40HaW0dRH3CKn+jgPsE6lBPb8ZETTJRQ7jxfTPLlkFrBPZVO4Lky5nbNrlWEAAcTNDeyrZeiNonfrFgi/USTODNVeiqHda1+NCfmag5R9T+ctS6MDHa6KF1oicJQmqcY8y+N0PUjqRK9FOByOiLR6GjZj/gplvk1+x9j6RLtHlUbAw5njnFA5ioSSZqWF2cI7C6MHacp+eilDeZQ/EOQZOq7MTjZkHr9HlvLIrJc6wXojYYFhN0vXmyczSY022t4n5H02KTEPozEzXniNrHvgxtEHBxgL5VbR3oAT4iqLdphqghcfslo9Z9pZFq7UTWnEFCRd926pq7BCNuMYboouJM1CQStVKtTo/tF8sU8B1RG/AQEgybBdHDe8R8M146tD5M/kKCt1s9tF6IGgQVRSa4jcM+qkvsO2bx7vR5M6sFIUsEEzXnSBowMbaSE4qyB8Hw5+1H5zqNSyv3K9XXSHTnxQxRK9fXhCRsEIAgMwOMlTpx8txPBSWiztjm+U5UnImaxMlmciUv5Lj+HUnb6tFWJpGC+VXGbw+I+Wbcv04ibm4SiNhDe6wXoraQLgnnoVst9fcEh8H8y4CYxZGJmrNEDWl6NgrsZIAsbDXpD+zk5C7zXghIEdmaBIbNEDWU9YFpMZ2wd5f6X3AYEfLGOd7se6OoOBM1SUQtWqzSXbvFwGpsOPhaVC2Y4v+1mBBylkcQQr7W3ymAEBaNVYmxfs2+Xy9ELZCvCCdl3x3r/6Tsf7Ihs8Nbn86RNUTWiWy/YTz4w6FV0zsYMgmUU9d635MWkihC3Zglan9bEPOBu3t3f4veVutrwumjfnfwey1PJmoSiBrycSJ6zo7ALTrFhq1LhCTZVjowtknPEdDHgX8AnECt3KvXzj2QLAqRNLTFeiFqmUpdSNAVdfTeUvI703yvYcNMeSFUeZ+gpQD1w0TNOaK2trZGPxPMBHPNjgDV6v27aP2FoH8aMGyWqA2GxYTFzxrymtILNdNf3XgO5vNNApZeKBUYxZiZqEkganA4vlYwlRM6g/Ya8BBWF1aT1IpG3Jwx6KVvQv2dPmWLRyyiEe2xXogaEquLDuS/2r9ChT62yi5ly4TE0d/1Ub2vmjwyUXOOqGGSfm1BLHAIk+LhVH9masFC7OwhnzCGzRK145myECFB3+rXfKsw4ECnT0QeCino5gyi9EzUbBI1rLof2mNPjgNgPX/YSxMrecsWLkyUl49bj7jBPZ+e+9606sbViJ0yYdvz0X0rwgPUeiFqqON/CmYnOG/YS8hpa6ed3PzfL4Niau46sWOi5ixRQ8T9mYKk5JUjq30Z/QmrjI5HkaNZopau1Oh6Qb3B+2fCVDSpcuDm8aKxbJlqnZB4XqTeIZBrlC5homaDqCHKEz4sp2+zLvbX2HhPza5QWRCsvxIkJPDfSlbqfTnRHs+WhVKm6O2ynojavrj4FvF7fewMDAu3jgeRIxM1Z4nacrFGt06JtdlF2/vPFSRbrdNNguRJx7tZogaS8uJBMad5WPwOJfvPDWdsOS88fqAujcSPiZogUcOW0dZwls4SXMHpHQFHJHCejFq3pukN+c6JlJB5FfeGbwFMtPq1+uGI59nitbeSXE9EDYEwFwnoIAE/9+zGarj//HsixSqdZnMBxkTN2XEFcjGiZAHbU68vJvpqLNweyQoHEejzkxWiNhXNC89DLx6CRdNZvKic63LVOokaUIDFRokuJmoCJAVEAGZ20ZBnvRPox+fmY4StOlHgoCybBAkjlLmx8hK9txv/h5X1HYKOxXqbrCeihu1zUT0+6KntWe0v/x70byx+dCyIHpmoOT/xji2LObWjjZGBAjIfbhzTrJYpVqrSvdP2XXKsELVoqSakp4a6/+mwr2/qHm0FkduzBYIIUBdX7gjSUoMQMBM1AaIGXZobbJqU9cEfWQzsDg6Z6ppw0ldEqk5F+0tm4Ytg1raenSuI2nYfxUrOpFh5R9BPDTiGL2A/5eyLl+p0+ZiY36fer3FkouY8UUN/udpGYFfjlpNVguSW8986nhSWJjJi2ApRgxTFbwW3P/VxpB+yRMCaJpoJAvUAbVS4VRmxxETNAlHDSvugYF4zI/iN7+HjI8Pk+/aJpLAFAPpv/WJVg8/d1YK5GY3tIpOoja+I+Sog0TG2JY0dVtX7aLEmLC+zccj3gwglVWV04rrYPpNhTQOWmKg5T9QQNY9IO2NftvIefW5nj+sDHkuX6aIR8UhPY31ZIWron8cyZWGXAUh1fOpPOzLeqRxLtnhSwv7R2PbEDllj+ZiomSRqsBjA6RoJ041AtvMeorPZqhyLyYlMhbANJVKe07Z6aKBPpDr+b0ncX89YdzKJ2jSc9QesC+9CQiVScIaoYRFiR7D50b3LhBV14wDTa58x0VwjqY8zUXOeqAFv2Dayo2l501SoZxeuEEt/cEYsoMI4/unvrRI11L+oGwXuuXnUT8gd2mvjhl5ef75CmNf1+rN6vHUqRLkGaxquzUTNBFGDBAd8Hy4esb8dojfcJSN+2iEgx6EDovEIc+vDM2J5P1Gm63YECFaVxuv20mf4pm0UEP/V28R4lEnU5hIl4RWWk6LEH3jTwhMcyP7XPU72sd0AmQYjDuy8Z6LWHaKGRfVjgpHwenv/8dAqlXssSAaiv//xyFmo6vUgQtTgSiPqn4X7PrZv2ZbPdrfmLMzBv9grLgmFZ//Mn2k6BzNR60DUsBXyxrEEQYBOB6+M4xuLCemq7hCwFS0bJlpE3nQL5Hbvi8jDp+eiws/fWG8yiRp8EKE51ngPM59Hl8Wjga3W6WqpRpfbEHi9dDTgmAXQ6rOZOR/953xBq3SztmSi1h2ihrbenyzZIgtnbPPSu0vpnooC3RbOE3KXNsOi6HciRA1J2u/aJW7VO22bh+DKA2UFM/3WDecU62uE9I+i9Yz/ITgx20Iui4laG6LmyVZsWalaNRoU3VNl+dYrbD3Z3ZodCmcJKzM3gN9sGeCAii3PVvUt8r1MoubPVYQzV7x+LOFoW/zHm6YNW8VIJer5wT3LPblthO0y+NqJYKXVf5iodY+owar25H571g0keYe/kdlxqJvnwXVF5iJDx7QIUUM97I8XCfWnX8fq8cxBjzamwyWjm/Vq5t6Yf/65mLAlhQKJLmPKqMb7MlFrAgSYvL8JZei6iYCwLkwrYGIP3pOrKFupYSUCp8xW9+/0PfbX5w2pKxoB47bPGJC3R3J04Yj4MzerE5lELVmu0b2COSN/sSdCOQe3YEKFCl0qqKmm1eOAR7NAY1XtNqy0Kk+sXKP7psXdBprhB98xUevuJLs/XqDL7GB5q4cu2O6jL4PuXryOLue0crbCoZ3vRYkaAuSesbnDgcAOpJdycx5WkLT3TqTowu32Fnn3T0co3sZ4w0TNQNRgSULOMjhDijrmt+sUSM46vpxTOoGhsdG52pWj02/XTYS06J1WE5ubvp9PluiiEXHnzVZ1IZOowcfxWcFB6/ztPsKE41SdI2oOof0i+en0utw07KVPfBllixGZdREtVrRUanrZZR6ZqHWXqGGH4c3FhC0sAw+wDH0MwuCynQb4REHUFv1NJm6N1xIlauij3mzFlisFygGjw5uLKarUfyhXIXMMEL0WFqPvelLCfr16PcOSD+H5duVgovYtUUO0xsuH43Tedrm+aN81xrDPseSzp5zC7XXeGydD5M+7O/rmSLpEl9hcMevt03iUSdTQASHD0ngPs59/fyjmqE4Zgkog/mm2fM3OQ1qYzwMZR8vdbqBr9hv0B5G6bcPWJVvP2uz58R0Tte4SNbT5SrFKN03Zj9Q/c9BLfzi0SukWPkTN8KXyu0ylRn86sqpltWmFPxnf2yFq8O/+yGaGGDwDUjS+eChGhSbRkCrruN21V4tVeuFATEr6yN8djFG+w67JuiZqMM8uZsv08uFVZaZjHWh/XYhL0UtrBx79t0SpRvfaiADVO/iV40FtsnGbnwAGAEThyg7w0J8bR9lEzU4+zfOGfTQpMUJYx0mrIyzLdpM5ow6RS/a/gYwrty5SlTrdNx2mDTbTRBkx0/ieiVr3iRowvjuWJwRLNbaPyGc4yWOB2KrvOPE9JGTumY7YthSaeX47RE2vi+fmorRhwP5i6NadYZpPdj8LCvKSynKVgKsRjER6XbU6rjuiBvN1pFChbeEcPTSzrNRsjI6AAeLlI3GCn1KrRlDx/YFkkc6z4aumd2KofGO7Fvo8Kspp9ZowN7/vSdOFkgQd9edsPMomait5e75fl474HSXNaO+f7QrbngwQwfXaQpyweLDa1irOh0/joWRRe7bGNpf9mYmaO4ga2vxPR+JSlPqBEbiwQBQZ1jqnAq/wDNBUfGMxSVi4ycZqq+vJIGrLhSrdMmXPHUcvH/zWoMLglL6kPgah/pPlOv1zMUnnSqr/cwa9NBzOmhoX+56owRERqvu+bJkGQjl6Yv/KKWdpAQFSHSxmjyBpMI92MmvqYJB5BKGBFc+Or5H+nPDR+MtCglLl7voJID3M07NRKc+kP1uro2yiVqjWhRNG62W8ZWeIQMBl4qTdtfbG4f9nf1KA1MH902FaypS76reWr9Xpi2DGtuOv3h6djkzU3EHUgPF4qaYJOssYD9Hup23z0rUTAXrnRJIga6Nq1wHXBSHc4kVwm/0t3E6YbfxdBlFD/R9KFWnzqD13Cr1saMObJkP0vjetpdhTVfcoN64N7HwVzNC1O+QFFyLKE3Ie8AluNwbrv/UdUcO2GNj2xEqe/r2U0iJPbp4KEdir3tBOHKEqD5836Hvple30EeTgZkk5SUE6b50KaqmCVHaMZnWEOnzfkyJsxTrRdriHbKKG50KiXrurMYguw1G/6JC/xhZPUjglTGNbwRLw9vGkY2XXsYTV8IlshRBZZUexvvF5On1momZuEtLbSfXRl6/QjZLJDgjbZWN++vPRuBaAJWtsxM7PnniRXjocp81j8ghCJ8w2/i6LqKFtZ1YLtiQ7GssGwoa6+dtCnCCBJKvudRwiQwICq5CpBO3ceH87n5+ai1Kuap4bKCVq2PbAShpJRlW9np1b0VSo794dpmsngrakKexUvPG/YMt/XUj8KLGqDgAnj/OJglSHe1hH/mc+SgvpknJBwlJtjZAn8+e77W/BGdvHzHsVRA1RaMCpmfu3PWfAQ1eMBegjb0prB5UK6lDrlykkjOe6fiJIg+EsIWpNZV/AwL2QLtNfFuKE4Ia2dSrJh8l4DzcQNTjBw8Xj0X39/cL2mhkszSaKmrCosZ1kvcdi9qaJIP1jMUWT0QKFi1XTc0ChuqalvoKB4bWjCS2xvKogFyvPK5OooT9uDWdtCRG3Kjvq/radIdriSdNcsqjplFrdlsZ4hEwwyA7w+P4V4Wwyrcqof3/7rhB5c5390ox4VkrU9IKtp+O5Qx7NEdsKWzY2iOz36BwfetO2LTmNbQgFbOjk7IwWpJqfoUYdzFfpI19aU7eGZbLx3k58VkHU0Laf+9PSIrWwooTIJSyNv9y7rFlwkZD6Q2+KPvVnWr6+CGQpb2E1Bwv1bTslEEwDGQLhx/bF54GsFsYPCRMZ2Afe4WqwL1Gkp2dX6PxhryNb5c0w6Qai1qxc/fidJ1s2jR+k7ts4KCe4oFVdYnw8b7tPk6e4d2ZZM1S8tpCgfx1P0XtLac3P6pXDcW0RdPvOsJbj8oIRP53ZhQVFq2fA9zKJGvo3yBMygFwoOdOP/gwYE7FrAS3Iu3ZF6PkDMS2tFuQvkNpqX6Kk7QrtjBVoOJKnj30ZQrqwn09HtMUvfOD0a6k4QvoKQvoYp6yMd0zUDJOHnYYBQC4bDdBUzLmUP2YbGluHH3jSdJaCQQDWwxsngwQJiYloXiNt+WrdVIQrwIotPDiaQwQYwpJY+Z+K5rQfJWSnPVURtWSlTvdLTJos8owQZ7TijIt2QhqsCyQ50RrLrG9fPDQT0bZ0gQOkUQEuOg1m2NIs109qeQEhKTIVzWuSBRCqBi6N9+nGeyZqasmQsU2tEDXgZiCck7oNZyyL297Dxxj+VSLlkk3UMGfBLwsZcCAmLFImu/+RvY1ppjwY55A1CBZ+s/O28TwmapKI2iN7l12tO4aJ75Uj9nKRmQHkucNeun1niB7fv6z5bXzoS9NAOKvJaYDEDkXy9Jk/TW8dT9FvDsTowZkIXbcjSGdK9gEwU9Z256giauh88NWQEZHbrvztfrNK1PQBA9symxSQfWNZ4UOGSeXBPRF64WBMSyPzeSBNQ5GstiLeHsnTl8EMbfGmNTw/MRslWCSQJ894HTe8Z6LmTqIGPGMR8E0w60rcyMQuCMLXwSz9r2AeShVETav/tTWaixftZUGRNHfLrO9W17pjZ5iOW7D66mOufmSiZrOxzx700OvHkpRR7G+jN5idI1YyT81CpM+5AbQVcJ34/vStHkKicJF7qSRqcBR+/Zh60tzquUWJGrAHPbeNCpXQW5W5W9/b0epjoubcOGPFomYcQ6dX5frwdgunze6LbbxPfKdylcJnutk5nb5TRdT0NkAf0RK4S9BZ6/Qs3fr9zt1hWhS0pOn1xERNkKhBLRk6U5AwqEvyr9EbReUReSMRDNDvZA0+UP88nhRO3aSSqKF9E+UaPb4/Siin0wOIHaKGsiPAQ1VGCKfrot397sN2rD8t3D5M1NxP1IDnxUyFbpkMds2XsR0GRX/DAmN7OPud/qVbiZo2Fpaq9PuDMceVGUTr1uz/YM2EnBTG+k5uHKiHdi8malaJ2oCHIJGAkOCMS9KJtGvgZr8BOHA6P9sFfjxmQW/lPMhAvHk8QXBQhyq2lf/q56omamgX6MJhi0+/p1NHu0QN0avTq0XlosNO1Uez+8C5GOmC9idKwu3DRK03iBr6YjBfoRcOrvY+WRg4Ff14MFH8Qfo2NxM11D90P5FtBm4wIDjN+mQvfYeF7LsnUpr/bLM52Op3TNQsgAJWtF/Px8gHzRaTQnVWG8Sp89ExPvOlu2LRUdnhkOD2q9D3K0k3EzW0dbRYJVhuVNZJ47XtEjUdo4eTRem6VI1ldfozJolH9y5TvHRK7oGJWm9MmqJbnzqWccTC7qtgls53ob+jmX4AJ/ln56NNs+C4najp7QAjwquH5WWRMFNvss+5fSqkLWTtWtH0OsGRiZoJogYtosf2rdB0rNDWPGms2F55vyNaoGski0DKBr7Z610y4qfpWPEHZma3EzXgBHkn4TgP3UGzz2rnPFlEDWXXE5tDx8hOmdzwX0SKvnokrkWd6v2XiVpvtKsMoqa3eSBXoYf2LPeUe8hVOwL0qT/d0oDQK0RNb4PDqRLdN7NM8DN2w9hgpgyIYn3taNyS9JH+vJ2OTNRaAWHAo4Vvg6AhbU/Wgu5Up0p30+9g/YFcmZ6aXXGFpIGZDtF4Dvy8IO+w1CSqpheIGvCA3JrQjrtaYpqSxnrSP8skaig7RHGRBeSSEV/Pbltgq2I4kvsBScOzMVHrjYlSJlFDu0OLbyico7uRzaLVHNHt7wc8hIAB5DFFGiukS0TZm716jajhGTCuTEbzmsaZ05mF9LHSzPHsIS89MxfTxMdr9eb136xNrHzHRK2hs2HSv2I8QC8dXqXFTFnbO7dSob16LlSZEcZ96ZhYlKQZQKs4B/6Cb59ItlzF9ApRA24gBrmQKWuOtRCy/YmifLSyiZqO+SPpMj22f6WnyNpGTbkfJL+5UjgTtfVJ1HRMQ5/v60CWYLFyi+8UynHBiI/+Zy6qjRdmtth6kajpbYBc3SBskHJCf1Uxj1i9JtoAosYPzIRpPlGkomLVByZq3xI1sOIHZiL0gTdN8S4nH9cB2o3j8UxZc8BXIY5rtTO0Ox/+GHfvjtDBZOkHW52NddZLRE0ve2VtjZDq5on9aqycqogayo/E59A4syNr0a7dZf4G9XJkcCi0sUQwUVvfRE3vk8lynT7ypunWqVBXCdvGYR/99kBUU9eHzI9evk7HXiZq+rMhpSDyJT87F6VNXZQIQhDeY/uWacdKTvNr1Mun8rhuiRosZ9fsCNCTs1FNpTpWrJkGvcoGccu1YU18fN+KK3KnGidnBHTcOxPRJCLMBHT0IlEzYgAZBLZ4UnTfdFhLSSNjVa+SqOllR4oqyKMgYbWx/br+fsBDl2uJnJGLt/NEx0SNiZqOaRyhRXkkXaQXD8bo6vGAI9uiEHN+aE9EW1SIKg30A1EztkOhVqeBUI4QnX/piJ9U50XdNOSl+2bC9N5SqiuaqeuCqMFJePNYgG6aCtITsyv0qS+j+TMhnQ98g4wA4Pff77GXa3U6kCjSc/MxLRedDJIgNFHDX3DQo5EVrKjgP2LG3I+27HWipuMR/horxaoWwg6H9wdnlumGiaCWSxADOQJezNatE0QN5UYbYevonRMpunkqSGcozq/Y7vnP2ObR6gvWvlDefK49JmpM1PQ+aDzCHwyLkfl4kf65mKB7piN05Y6A7a05LEQvHvXTjRMB+t3BGA2Gs7RcqBDGYrNjnrGc+ntk83hmbsXyC87x+jXceESkbrx8Kn3cy4dX6e7dYbpyPEDn2MjZuWFgSYv8RSq6J+eitDWcI3+uemre6RJf6EjU/nBoVRO3hLOtW1+bRwOaX9lV40G6YxfSF61oiVbBfsejeTqSKlG4UCWwcDtgdyNQnSgTTOyQJIHpH2QXueNU+U8ZJ1s4kF6zI6hF0hxLl0xZQBrro1+IWuNzoU0QLRrIVwjb1QdTJS3hMJINj0ZyNNLmtTtWEKrLxjKY/Yw+Fy/VaFesqMkHXDRijVgaMWHlPRJcY2yA3Mb4cl4oIKjbRG0pU9H8o9w69rqlXP58cx9Dsxi1ex4WUsvFKh1KlrQ8lm9qYtsxjThcNR7QFrqXjvi0OfSysVOfQSiQ/gzbaK8eWdUMCHvjRW2sLSj2ebL7vG79P9ohlK/SgVSJtoWz9I/FhCaphbSGqG9Y+NEOeMF4c/l4gG5AyrqZiOYb/L43TXtXi3QiW9EsZ27hC22JGhoDCZIRUeLmV65S1/aK3VKpinWLbwAAAd5JREFUbgWxjHKhI+xLFOnvC3G6c1dYeqQoVpQ3T4a0PI7bIzlCkIOdcr+2kCAMlFZffzy8auu+dsrcz/9FH8WkCtIPHzwEg1ghXx3PHfBo/nG/2r9Cn/jSWv7duo1V8MFk0TJ2dKyFJZCH6topkuvm8dcNZau5WNcSmM9X65qAMuoKQsrw5bSDy34eI1Q9G9oBTv/pcl3LFpCrrlGpjX+qqnKIXLcjURO5KP/n++3Dfq8L+PnsTxQ1eQZYr+6bjtD1EyG6aLuPID7buF2Kz/geOTiv2xHQxF5/PbdCb51IEpJ+o/P0e53x833fPzBZwSr4dShLLx2O0y/2RDSHbURenzfs/bGW1YBHy6iB7V74CGGxAAmdV46s0tZQlvy5Cllxsua2+L4tuC64LhgD7sQAE7UWujMMWOuAhXN/obpGCKeG/x9U97EdgMnTm6tovkH4jO9Xi1VtZVms1dvq/3A7WG+HXq0zrHiRMQNRmIlSjWLlmuafA58y4AeWOARXrBSqmoU/Va5pfiNYLOC/vfrcXG5uO8YAY6AdBpio8QDPExxjgDHAGGAMMAYYAy7FABM1lzZMO3bNv/HqizHAGGAMMAYYA+sDA0zUmKjxKooxwBhgDDAGGAOMAZdi4P8D83/1TBTATEwAAAAASUVORK5CYII="/>
   </defs>
-  <path class="a" d="M428.1,246.1h0l-6.5-.4h0a69.91,69.91,0,0,0-8.3.4l-17.5.1-151.5-9.4a2.94,2.94,0,0,0,1.5-2.3c0-8.1-55.7-14.6-119.5-14.6S10.7,226.5,10.7,234.5s51.8,14.6,115.6,14.6a781.61,781.61,0,0,0,79.8-3.8l155.7,9.6,9.8,1.8c-.4.6.3,1,2.2,1.1h0l6.5.4h0c6,.4,21.6-2.1,34.8-5.5C428.2,249.5,434,246.5,428.1,246.1Zm-211.7-2h0l102.4,6.3ZM375.8,254l-5.8-.4-19.7-1.2,25.5,1.6Zm21.4-5.6-156.5-9.7h0l129,8,20.6,1.3,6.9.4Z" transform="translate(0 -0.33)"/>
-  <path class="b" d="M423,243.6H599.6s133.6,1.6-33.3,20.5c-177.5,20.1-45.7,26.3,44.8,29.1,50.7,1.6,91.4,36.8-34.8,43.2s-13.5,24.8-5,24.8,118.5,40.2-61.7,39c-59.4-.4-243.8-3.3-82.3-32.6,140.5-25.5-41.8-30.6-91.8-31.9-53.8-1.4-37.3-26.2,12.4-22.7,25.6,1.8,81.2-12.9,35.9-32.1-66-28,13-24.8,16.4-27.7s-5.7-3.8-5.7-3.8l6-6C400.4,243.5,407.4,243.6,423,243.6Z" transform="translate(0 -0.33)"/>
-  <ellipse class="c" cx="19.89" cy="88.23" rx="56.7" ry="12.3" transform="translate(-70.37 82.08) rotate(-73.6)"/>
-  <rect class="c" x="-33.31" y="85.6" width="113.4" height="7.4" transform="translate(-68.88 86.2) rotate(-73.6)"/>
-  <path class="d" d="M11,144.7c-6.5-1.9-4.7-27.8,4.2-57.9S36.5,34,43,35.9s4.7,27.8-4.2,57.9S17.5,146.6,11,144.7Z" transform="translate(0 -0.33)"/>
-  <path class="b" d="M25.2,142.6l28.6-97A103.52,103.52,0,0,0,27.2,90.5,105.06,105.06,0,0,0,25.2,142.6Z" transform="translate(0 -0.33)"/>
-  <path class="e" d="M233.4,127.8l12.9,3.8a110.86,110.86,0,0,0,.6-14.1l-13.4-4A136.43,136.43,0,0,1,233.4,127.8Z" transform="translate(0 -0.33)"/>
-  <path class="e" d="M220.8,170.6a116.81,116.81,0,0,1-7,11.2l13.4,3.9a115,115,0,0,0,6.6-11.3Z" transform="translate(0 -0.33)"/>
-  <rect class="f" x="382.78" y="193.77" width="44.6" height="15.6" transform="translate(97.36 532.94) rotate(-73.6)"/>
-  <path class="f" d="M233.4,127.8A105.44,105.44,0,0,0,159,19.3l-1-.3A105.5,105.5,0,0,0,53.4,45.8L25.1,142.1a105.29,105.29,0,0,0,73.4,79.2c.3.1.7.2,1,.3a105.52,105.52,0,0,0,121.3-50.9l185.5,54.6,12.6-42.8Z" transform="translate(0 -0.33)"/>
-  <path class="b" d="M98.4,221.2c.3.1.7.2,1,.3a105.3,105.3,0,0,0,114.3-39.3l.2-.4a36.2,36.2,0,0,0,5.6-9.1c-15.9,6.3-51,8.9-90.5,9.3-39.9.4-77.2-3.3-91.1-7.6C50.2,195.6,72.3,214.5,98.4,221.2Z" transform="translate(0 -0.33)"/>
-  <polygon class="d" points="422.7 169.17 402.7 237.07 385.2 218.67 362 211.77 398.9 250.57 426.9 155.47 372.9 168.57 396.6 175.47 422.7 169.17"/>
-  <path class="d" d="M393.4,249.4c-5.7-1.7-4.1-24.4,3.7-50.7s18.6-46.3,24.4-44.6,4.1,24.4-3.7,50.7S399.1,251.1,393.4,249.4Z" transform="translate(0 -0.33)"/>
-  <rect class="d" x="360.9" y="199.49" width="99.3" height="6.5" transform="translate(100.15 539.03) rotate(-73.6)"/>
-  <path class="d" d="M399.6,251.3c-5.7-1.7-4.1-24.4,3.7-50.7s18.6-46.3,24.4-44.6,4.1,24.4-3.7,50.7S405.3,253,399.6,251.3Z" transform="translate(0 -0.33)"/>
-  <path class="d" d="M399.6,251.3c-5.7-1.7-4.1-24.4,3.7-50.7s18.6-46.3,24.4-44.6,4.1,24.4-3.7,50.7S405.3,253,399.6,251.3Z" transform="translate(0 -0.33)"/>
-  <path class="d" d="M402.7,237.4l.4-1.4c-1.8-3.9,0-18,4.8-34s10.7-28.9,14.4-31.2l.4-1.3-26.1,6.3,7.3,2.2-12.6,42.8-6.1-1.8Z" transform="translate(0 -0.33)"/>
-  <path class="g" d="M420,205.5c5.4-18.4,7.1-34.1,3.7-35.1a1.9,1.9,0,0,0-1.4.3c-3.7,2.3-9.7,15.1-14.4,31.2s-6.6,30.1-4.8,34a2.18,2.18,0,0,0,1,1.1C407.5,238,414.6,223.9,420,205.5Z" transform="translate(0 -0.33)"/>
-  <path class="d" d="M390.9,232.4l19.2-65.2c-3.7,2.3-9.7,15.1-14.4,31.2S389,228.4,390.9,232.4Z" transform="translate(0 -0.33)"/>
-  <polygon class="h" points="226.4 441.27 226.5 441.27 226.5 441.17 226.4 441.27"/>
-  <g>
-    <path class="i" d="M74,46.2s39.9-29.7,82.7-12.1" transform="translate(0 -0.33)"/>
-    <path class="i" d="M178,45.4s8.3,2.8,17,14.2" transform="translate(0 -0.33)"/>
-    <line class="i" x1="246.8" y1="142.47" x2="316.4" y2="163.17"/>
-    <line class="i" x1="336.2" y1="168.97" x2="350.4" y2="172.77"/>
-  </g>
-  <path class="j" d="M219.7,172.2c.1,5.8-40.8,10.9-90.8,11.4s-91-3.8-91-9.6,40.8-10.8,90.8-11.3S219.6,166.4,219.7,172.2Z" transform="translate(0 -0.33)"/>
-  <g>
-    <path class="d" d="M246.3,131.6,403.9,178l3.9-13.1L246.9,117.6l-13.4-4a96.25,96.25,0,0,1-.1,14.2Z" transform="translate(0 -0.33)"/>
-    <path class="d" d="M161.1,5.2A119.65,119.65,0,0,0,42.6,35.6L10.5,144.8a119.58,119.58,0,0,0,216.7,40.9h0L387.7,233l3.6-12.2L233.7,174.4c-1,2-2,3.9-3.1,5.8,1.1-1.9,2.1-3.8,3.1-5.8l-12.9-3.8a116.81,116.81,0,0,1-7,11.2h0A105.5,105.5,0,0,1,99.5,221.6c-.3-.1-.7-.2-1-.3a105.63,105.63,0,0,1-73.4-79.2L53.4,45.8A105.5,105.5,0,0,1,158,19l1,.3a105.3,105.3,0,0,1,74.4,94.3l13.4,4A119.45,119.45,0,0,0,161.1,5.2Z" transform="translate(0 -0.33)"/>
-  </g>
-  <path class="k" d="M99.2,153.2a19.46,19.46,0,0,0-32.9,14.6,19.79,19.79,0,0,0,.9,5.5c4.9,2.5,11.9,3.4,19.7,3.8,8.7.4,13.6-1.3,17.3-3.6a20.7,20.7,0,0,0,1-6.6A19.17,19.17,0,0,0,99.2,153.2Z" transform="translate(0 -0.33)"/>
-  <path class="l" d="M173.9,160.5a11.91,11.91,0,0,0-8.7-3.4,12.49,12.49,0,0,0-9,4.3,11.94,11.94,0,0,0-2.9,8.2,9.34,9.34,0,0,0,.6,3.4c3,1.6,7.4,2.5,12.3,2.4a27.86,27.86,0,0,0,10.8-2.3,14,14,0,0,0,.6-4.1A12.17,12.17,0,0,0,173.9,160.5Z" transform="translate(0 -0.33)"/>
-  <path class="h" d="M98,158.1a6.05,6.05,0,1,1-6.2-5.9A6,6,0,0,1,98,158.1Z" transform="translate(0 -0.33)"/>
-  <g class="m">
-    <path class="n" d="M578.8,234.4a13.62,13.62,0,0,0-23.1,10.2,12.27,12.27,0,0,0,.7,3.9c3.4,1.7,8.4,2.4,13.8,2.6,6.1.3,9.6-.9,12.2-2.6a13.36,13.36,0,0,0-3.6-14.1Z" transform="translate(0 -0.33)"/>
-    <path class="h" d="M576.1,239.3a4.3,4.3,0,1,1-4.4-4.2A4.27,4.27,0,0,1,576.1,239.3Z" transform="translate(0 -0.33)"/>
-  </g>
-  <g>
-    <path class="n" d="M601.4,243.9a7.53,7.53,0,0,0-11,.6,7.49,7.49,0,0,0-1.8,5,4.92,4.92,0,0,0,.4,2.1c1.9,1,4.6,1.3,7.6,1.5,3.4.1,5.3-.5,6.7-1.4a7.46,7.46,0,0,0,.4-2.6A7.19,7.19,0,0,0,601.4,243.9Z" transform="translate(0 -0.33)"/>
-    <circle class="h" cx="597.6" cy="246.27" r="2.3"/>
-  </g>
-  <g>
-    <path class="n" d="M562,283.1a10.1,10.1,0,0,0-7.5-2.9,10.36,10.36,0,0,0-7.7,3.7,10.9,10.9,0,0,0-2.5,7,10.47,10.47,0,0,0,.5,3c2.6,1.3,6.4,1.8,10.6,2,4.7.2,7.3-.7,9.3-2a8.28,8.28,0,0,0,.5-3.5A10.07,10.07,0,0,0,562,283.1Z" transform="translate(0 -0.33)"/>
-    <circle class="h" cx="556.8" cy="286.67" r="3.3"/>
-  </g>
-  <g class="m">
-    <path class="n" d="M384.4,254.1a10.1,10.1,0,0,0-7.5-2.9,10.36,10.36,0,0,0-7.7,3.7,10.9,10.9,0,0,0-2.5,7,10.47,10.47,0,0,0,.5,3c2.6,1.3,6.4,1.8,10.6,2,4.7.2,7.3-.7,9.3-2a8.28,8.28,0,0,0,.5-3.5A10.52,10.52,0,0,0,384.4,254.1Z" transform="translate(0 -0.33)"/>
-    <circle class="h" cx="379.1" cy="257.57" r="3.3"/>
-  </g>
-  <path class="h" d="M171.6,164a3.8,3.8,0,1,1-3.9-3.7A3.74,3.74,0,0,1,171.6,164Z" transform="translate(0 -0.33)"/>
-  <g>
-    <path class="n" d="M145.6,212.5a13.79,13.79,0,1,1,17.5-8.6A13.86,13.86,0,0,1,145.6,212.5Z" transform="translate(0 -0.33)"/>
-    <circle class="h" cx="155.8" cy="197.07" r="4.7"/>
-  </g>
-  <g>
-    <circle class="n" cx="68.6" cy="190.87" r="6.6"/>
-    <circle class="h" cx="71.3" cy="189.87" r="2.2"/>
-  </g>
-  <g>
-    <circle class="n" cx="101.4" cy="209.47" r="3.9"/>
-    <circle class="h" cx="103" cy="208.87" r="1.3"/>
-  </g>
-  <ellipse class="h" cx="547.3" cy="320.97" rx="22.1" ry="4.1"/>
-  <ellipse class="o" cx="602.5" cy="312.07" rx="47.1" ry="6.9"/>
-  <ellipse class="p" cx="460.4" cy="316.17" rx="68.2" ry="13.6"/>
-  <ellipse class="n" cx="495.4" cy="379.97" rx="19.8" ry="2.9"/>
-  <ellipse class="n" cx="343.3" cy="325.07" rx="22.1" ry="4.1"/>
-  <g class="m">
-    <path class="n" d="M435.9,365a19.27,19.27,0,0,0-13.7-5.3,19.19,19.19,0,0,0-17.7,25c4.8,2.4,11.7,3.4,19.4,3.7,8.6.4,13.4-1.3,17.1-3.6a19.68,19.68,0,0,0,1-6.5A20.19,20.19,0,0,0,435.9,365Z" transform="translate(0 -0.33)"/>
-    <path class="h" d="M432.2,371.9a6,6,0,1,1-6.1-5.8A5.93,5.93,0,0,1,432.2,371.9Z" transform="translate(0 -0.33)"/>
-  </g>
-  <ellipse class="h" cx="547.3" cy="385.37" rx="32.6" ry="4.1"/>
-  <polygon class="a" points="352.7 250.37 328.7 248.97 357 250.57 352.7 250.37"/>
-  <path class="a" d="M211.2,244Z" transform="translate(0 -0.33)"/>
-  <g class="m">
-    <path class="n" d="M458.6,259.9a19.27,19.27,0,0,0-13.7-5.3,19.19,19.19,0,0,0-17.7,25c4.8,2.4,11.7,3.4,19.4,3.7,8.6.4,13.4-1.3,17.1-3.6a19.68,19.68,0,0,0,1-6.5A20.19,20.19,0,0,0,458.6,259.9Z" transform="translate(0 -0.33)"/>
-    <path class="h" d="M454.9,266.8a6,6,0,1,1-6.1-5.8A5.93,5.93,0,0,1,454.9,266.8Z" transform="translate(0 -0.33)"/>
-  </g>
-  <g>
-    <path class="n" d="M488.3,305.9a10.1,10.1,0,0,0-7.5-2.9,10.36,10.36,0,0,0-7.7,3.7,10.9,10.9,0,0,0-2.5,7,10.47,10.47,0,0,0,.5,3c2.6,1.3,6.4,1.8,10.6,2,4.7.2,7.3-.7,9.3-2a8.28,8.28,0,0,0,.5-3.5A10.07,10.07,0,0,0,488.3,305.9Z" transform="translate(0 -0.33)"/>
-    <circle class="h" cx="483.1" cy="309.47" r="3.3"/>
-  </g>
-  <g>
-    <path class="n" d="M475.3,241.1a6.9,6.9,0,0,0-4.8-1.9,6.63,6.63,0,0,0-4.9,2.4,7.06,7.06,0,0,0-1.6,4.5,6.28,6.28,0,0,0,.3,1.9,18.26,18.26,0,0,0,6.8,1.3c3,.1,4.7-.4,6-1.3a4.22,4.22,0,0,0,.3-2.2A6.84,6.84,0,0,0,475.3,241.1Z" transform="translate(0 -0.33)"/>
-    <circle class="h" cx="471.9" cy="243.27" r="2.1"/>
-  </g>
-  <g>
-    <path class="n" d="M495.9,257.4a5.88,5.88,0,0,0-4.5-1.7,6.33,6.33,0,0,0-4.6,2.2,6.18,6.18,0,0,0-1.5,4.2,5.66,5.66,0,0,0,.3,1.8,16.05,16.05,0,0,0,6.3,1.2c2.8.1,4.4-.4,5.6-1.2a5.11,5.11,0,0,0,.3-2.1A6,6,0,0,0,495.9,257.4Z" transform="translate(0 -0.33)"/>
-    <circle class="h" cx="492.8" cy="259.37" r="2"/>
-  </g>
-  <g>
-    <path class="n" d="M379.6,302.5a11.2,11.2,0,0,0-8.8-1.4,11.67,11.67,0,0,0-7.5,5.8,12.14,12.14,0,0,0-1.1,8.2,11.72,11.72,0,0,0,1.2,3.1c3.1.8,7.4.4,12-.3,5.1-.9,7.7-2.5,9.6-4.4a8.64,8.64,0,0,0-.3-3.9A10.89,10.89,0,0,0,379.6,302.5Z" transform="translate(0 -0.33)"/>
-    <circle class="h" cx="374.92" cy="308" r="3.7" transform="translate(-56.98 86.55) rotate(-12.29)"/>
-  </g>
-  <path class="b logo" d="M465.3,222.2a3.17,3.17,0,0,1-.9-2.3V179.3a2.94,2.94,0,0,1,.9-2.2,3.1,3.1,0,0,1,2.2-.9h10.9a24,24,0,0,1,12,3,20.48,20.48,0,0,1,8.2,8.3,25.51,25.51,0,0,1,3,12.1,24.31,24.31,0,0,1-2.9,12.1,20.72,20.72,0,0,1-8.3,8.3,24.14,24.14,0,0,1-12.1,3H467.5A2.65,2.65,0,0,1,465.3,222.2Zm13.1-4.7a16.46,16.46,0,0,0,8.9-2.3,15.68,15.68,0,0,0,6.1-6.4,19.91,19.91,0,0,0,2.2-9.3,18.4,18.4,0,0,0-2.2-9.2,15.68,15.68,0,0,0-6.1-6.4,18.44,18.44,0,0,0-8.9-2.3h-7.8v35.8h7.8Zm27.8,4.9a3.49,3.49,0,0,1-.8-2.2V179.6a3.1,3.1,0,0,1,.9-2.2,2.88,2.88,0,0,1,2.1-.9,3,3,0,0,1,3.1,3v37.6h21.8a3.1,3.1,0,1,1,0,6.2H508.4A3.1,3.1,0,0,1,506.2,222.4Zm54.4-30.2a15.46,15.46,0,0,1,5.9,6,16.84,16.84,0,0,1,2.2,8.5v13.4a3.1,3.1,0,0,1-6.2,0v-2.2a15.21,15.21,0,0,1-19.4,3.3,14.45,14.45,0,0,1-5.5-6,17.75,17.75,0,0,1-2-8.5,17.17,17.17,0,0,1,2.1-8.4,15.72,15.72,0,0,1,6-6,16.74,16.74,0,0,1,8.4-2.2A15.8,15.8,0,0,1,560.6,192.2Zm-3,24.2a10.44,10.44,0,0,0,3.8-4,12.63,12.63,0,0,0,1.4-5.7,13,13,0,0,0-1.4-5.8,10.63,10.63,0,0,0-14.4-4.2c-.1.1-.2.1-.3.2a10.44,10.44,0,0,0-3.8,4,11.84,11.84,0,0,0-1.4,5.8,12.32,12.32,0,0,0,1.4,5.7,10.44,10.44,0,0,0,3.8,4,10.65,10.65,0,0,0,10.9,0Zm39.7-24.2a14.45,14.45,0,0,1,5.5,6,17.75,17.75,0,0,1,2,8.5,16.84,16.84,0,0,1-2.2,8.5,15.72,15.72,0,0,1-6,6,16.74,16.74,0,0,1-8.4,2.2,16.21,16.21,0,0,1-14.3-8.2,16.84,16.84,0,0,1-2.2-8.5V179.3a3.1,3.1,0,0,1,.9-2.2,3.35,3.35,0,0,1,4.4,0,2.65,2.65,0,0,1,.8,2.2v16.2A15.12,15.12,0,0,1,597.3,192.2Zm-3.6,24.3a11.19,11.19,0,0,0,3.8-4,11.84,11.84,0,0,0,1.4-5.8,12.32,12.32,0,0,0-1.4-5.7,10.5,10.5,0,0,0-18.2-.5c-.1.2-.2.3-.3.5a12.63,12.63,0,0,0-1.4,5.7,11.84,11.84,0,0,0,1.4,5.8,10.63,10.63,0,0,0,14.4,4.2C593.5,216.6,593.6,216.5,593.7,216.5Zm-88.3-40.2h6.2v5.3h-6.2Zm-41-.1h6.1v5.3h-6.1Zm0,41.5h6.1V223h-6.1Zm65.9-.6h6.1v6.2h-6.1Zm-24.9,1h3.5v5.2h-3.5Zm57.2-.6h6.1v5.6h-6.1Zm9.2-41.3h6.1v5.4h-6.1Z" transform="translate(0 -0.33)"/>
-</svg>
+</svg>
\ No newline at end of file
diff --git a/services/self-service/src/main/resources/webapp/src/dictionary/aws.dictionary.ts b/services/self-service/src/main/resources/webapp/src/dictionary/aws.dictionary.ts
index f989415..8fcc9ec 100644
--- a/services/self-service/src/main/resources/webapp/src/dictionary/aws.dictionary.ts
+++ b/services/self-service/src/main/resources/webapp/src/dictionary/aws.dictionary.ts
@@ -41,9 +41,9 @@
         'service': 'product',
         'service_filter_key': 'product',
         'type': 'resource_type',
-        'resourceType': 'dlab_resource_type',
+        'resourceType': 'data_lab_resource_type',
         'instance_size': 'shape',
-        'dlabId': 'dlab_id'
+        'datalabId': 'datalabId'
     },
     'service': 'Service',
     'type': 'Type',
@@ -55,7 +55,7 @@
     'datalake_name': '',
     'datalake_user_directory_name': '',
     'datalake_shared_directory_name': '',
-    'docker.dlab-dataengine-service': {
+    'docker.datalab-dataengine-service': {
         'total_instance_number_min': 'min_emr_instance_count',
         'total_instance_number_max': 'max_emr_instance_count',
         'min_emr_spot_instance_bid_pct': 'min_emr_spot_instance_bid_pct',
@@ -64,7 +64,7 @@
         'slave_node_shape': 'slave_node_shape',
         'total_instance_number': 'total_instance_number',
     },
-    'docker.dlab-dataengine': {
+    'docker.datalab-dataengine': {
         'total_instance_number_min': 'min_spark_instance_count',
         'total_instance_number_max': 'max_spark_instance_count',
         'data_engine_master_instance_size': 'Node shape',
diff --git a/services/self-service/src/main/resources/webapp/src/dictionary/azure.dictionary.ts b/services/self-service/src/main/resources/webapp/src/dictionary/azure.dictionary.ts
index b7d9abc..15b0ec0 100644
--- a/services/self-service/src/main/resources/webapp/src/dictionary/azure.dictionary.ts
+++ b/services/self-service/src/main/resources/webapp/src/dictionary/azure.dictionary.ts
@@ -44,7 +44,7 @@
         'type': '',
         'resourceType': 'resource_type',
         'instance_size': 'size',
-        'dlabId': 'dlabId'
+        'datalabId': 'datalabId'
     },
     'service': 'Category',
     'type': '',
@@ -56,7 +56,7 @@
     'datalake_name': 'datalake_name',
     'datalake_user_directory_name': 'datalake_user_directory_name',
     'datalake_shared_directory_name': 'datalake_shared_directory_name',
-    'docker.dlab-dataengine-service': {
+    'docker.datalab-dataengine-service': {
         'total_instance_number_min': 'min_emr_instance_count',
         'total_instance_number_max': 'max_emr_instance_count',
         'min_emr_spot_instance_bid_pct': 'min_emr_spot_instance_bid_pct',
@@ -65,7 +65,7 @@
         'slave_node_shape': 'slave_node_shape',
         'total_instance_number': 'total_instance_number',
     },
-    'docker.dlab-dataengine': {
+    'docker.datalab-dataengine': {
         'total_instance_number_min': 'min_spark_instance_count',
         'total_instance_number_max': 'max_spark_instance_count',
         'data_engine_master_instance_size': 'Node size',
diff --git a/services/self-service/src/main/resources/webapp/src/dictionary/gcp.dictionary.ts b/services/self-service/src/main/resources/webapp/src/dictionary/gcp.dictionary.ts
index d92b7ff..9cf117b 100644
--- a/services/self-service/src/main/resources/webapp/src/dictionary/gcp.dictionary.ts
+++ b/services/self-service/src/main/resources/webapp/src/dictionary/gcp.dictionary.ts
@@ -40,10 +40,10 @@
         'dateTo': 'to',
         'service': 'product',
         'service_filter_key': 'product',
-        'type': 'dlab_resource_type',
-        'resourceType': 'dlab_resource_type',
+        'type': 'data_lab_resource_type',
+        'resourceType': 'data_lab_resource_type',
         'instance_size': 'shapes',
-        'dlabId': 'dlab_id'
+        'datalabId': 'datalabId'
     },
     'service': 'Product',
     'type': 'Resource',
@@ -55,7 +55,7 @@
     'datalake_name': '',
     'datalake_user_directory_name': '',
     'datalake_shared_directory_name': '',
-    'docker.dlab-dataengine-service': {
+    'docker.datalab-dataengine-service': {
         'total_instance_number_min': 'min_instance_count',
         'total_instance_number_max': 'max_instance_count',
         'min_emr_spot_instance_bid_pct': 'min_emr_spot_instance_bid_pct',
@@ -67,12 +67,13 @@
         'total_instance_number': 'total_master_instance_number',
         'total_slave_instance_number': 'total_slave_instance_number',
     },
-    'docker.dlab-dataengine': {
+    'docker.datalab-dataengine': {
         'total_instance_number_min': 'min_spark_instance_count',
         'total_instance_number_max': 'max_spark_instance_count',
         'data_engine_master_instance_size': 'Machine type',
         'master_instance_number': 'Master machine number',
-        'master_node_shape': 'dataengine_instance_shape',
+        'master_node_shape': 'master_node_shape',
+        'slave_node_shape': 'slave_node_shape',
         'total_instance_number': 'dataengine_instance_count',
     },
 };
diff --git a/services/self-service/src/main/resources/webapp/src/dictionary/global.dictionary.ts b/services/self-service/src/main/resources/webapp/src/dictionary/global.dictionary.ts
index 26fe456..4ce4121 100644
--- a/services/self-service/src/main/resources/webapp/src/dictionary/global.dictionary.ts
+++ b/services/self-service/src/main/resources/webapp/src/dictionary/global.dictionary.ts
@@ -35,18 +35,6 @@
     return new ReportingConfigModel([], [], [], [], [], '', '', '', []);
   }
 
-  constructor(
-    public users: Array<string>,
-    public products: Array<string>,
-    public resource_type: Array<string>,
-    public statuses: Array<string>,
-    public shapes: Array<string>,
-    public date_start: string,
-    public date_end: string,
-    public dlab_id: string,
-    public projects: Array<string>
-  ) { }
-
   defaultConfigurations(): void {
     this.users = [];
     this.products = [];
@@ -55,9 +43,22 @@
     this.shapes = [];
     this.date_start = '';
     this.date_end = '';
-    this.dlab_id = '';
+    this.datalabId = '';
     this.projects = [];
   }
+
+  constructor(
+    public users: Array<string>,
+    public products: Array<string>,
+    public resource_type: Array<string>,
+    public statuses: Array<string>,
+    public shapes: Array<string>,
+    public date_start: string,
+    public date_end: string,
+    public datalabId: string,
+    public projects: Array<string>,
+    public locale?: string
+  ) { }
 }
 
 
diff --git a/services/self-service/src/main/resources/webapp/src/favicon.ico b/services/self-service/src/main/resources/webapp/src/favicon.ico
index 2bb416d..3a72b5a 100644
--- a/services/self-service/src/main/resources/webapp/src/favicon.ico
+++ b/services/self-service/src/main/resources/webapp/src/favicon.ico
Binary files differ
diff --git a/services/self-service/src/main/resources/webapp/src/index.html b/services/self-service/src/main/resources/webapp/src/index.html
index 849c5f1..32472bc 100644
--- a/services/self-service/src/main/resources/webapp/src/index.html
+++ b/services/self-service/src/main/resources/webapp/src/index.html
@@ -23,7 +23,7 @@
 
 <head>
   <meta charset="utf-8">
-  <title>DLab</title>
+  <title>DataLab</title>
   <base href="/">
 
   <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -34,6 +34,7 @@
     body,
     html {
       height: 100%;
+      margin: 0;
     }
 
     .app-loading {
@@ -46,16 +47,14 @@
     }
 
     .app-loading .spinner {
-      height: 200px;
-      width: 200px;
+      height: 270px;
+      width: 270px;
       animation: rotate 2s linear infinite;
       transform-origin: center center;
       position: absolute;
-      top: 0;
-      bottom: 0;
-      left: 0;
-      right: 0;
-      margin: auto;
+      top: calc(50% - 135px);
+      left: calc(50% - 135px);
+      margin: 0;
     }
 
     .app-loading .spinner .path {
@@ -95,15 +94,22 @@
 <body>
   <app-root>
     <div class="app-loading">
-      <div class="logo">
-        <svg version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 140.5 47.1" width="100px" height="100px"
-          style="enable-background:new 0 0 140.5 47.1;" xml:space="preserve">
-          <path fill="#35AFD5"
-            d="M0.9,46C0.3,45.4,0,44.6,0,43.7V3.1c0-0.8,0.3-1.7,0.9-2.2C1.5,0.3,2.3,0,3.1,0H14c4.2-0.1,8.3,1,12,3 c3.5,1.9,6.3,4.8,8.2,8.3c2,3.7,3,7.9,3,12.1c0.1,4.2-0.9,8.4-2.9,12.1c-1.9,3.5-4.8,6.4-8.3,8.3c-3.7,2-7.8,3.1-12.1,3H3.1 C2.3,46.9,1.5,46.6,0.9,46z M14,41.3c3.1,0.1,6.2-0.7,8.9-2.3c2.6-1.5,4.7-3.7,6.1-6.4c1.5-2.9,2.2-6,2.2-9.3 c0.1-3.2-0.7-6.4-2.2-9.2c-1.4-2.7-3.5-4.9-6.1-6.4c-2.7-1.5-5.8-2.3-8.9-2.3H6.2v35.8H14z M41.8,46.2C41.3,45.6,41,44.8,41,44V3.4 c0-0.8,0.3-1.6,0.9-2.2c0.6-0.6,1.3-0.9,2.1-0.9c1.7,0,3.1,1.3,3.1,3c0,0,0,0.1,0,0.1v37.5h21.8c1.7,0,3.1,1.4,3.1,3.1 c0,1.7-1.4,3.1-3.1,3.1c0,0,0,0,0,0H44C43.2,47.1,42.4,46.8,41.8,46.2z M96.2,16c2.5,1.4,4.5,3.5,5.9,6c1.5,2.6,2.2,5.5,2.2,8.5 v13.4c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1v-2.2c-4.8,5.7-13,7.1-19.4,3.3c-2.4-1.5-4.3-3.5-5.5-6c-1.4-2.6-2-5.5-2-8.5 c0-3,0.7-5.9,2.1-8.4c1.4-2.5,3.5-4.6,6-6c2.6-1.5,5.5-2.2,8.4-2.2C90.7,13.8,93.6,14.5,96.2,16z M93.2,40.2c1.6-1,2.9-2.3,3.8-4 c0.9-1.8,1.4-3.7,1.4-5.7c0-2-0.5-4-1.4-5.8c-2.8-5.1-9.2-7-14.4-4.2c-0.1,0.1-0.2,0.1-0.3,0.2c-1.6,1-2.9,2.3-3.8,4 c-1,1.8-1.4,3.8-1.4,5.8c0,2,0.5,4,1.4,5.7c0.9,1.7,2.2,3,3.8,4C85.7,42.2,89.8,42.2,93.2,40.2L93.2,40.2z M132.9,16 c2.4,1.5,4.3,3.5,5.5,6c1.4,2.6,2,5.5,2,8.5c0,3-0.7,5.9-2.2,8.5c-1.4,2.5-3.5,4.6-6,6c-2.6,1.5-5.5,2.2-8.4,2.2 c-5.9,0.1-11.4-3.1-14.3-8.2c-1.5-2.6-2.2-5.5-2.2-8.5V3.1c0-0.8,0.3-1.6,0.9-2.2c1.3-1.1,3.2-1.1,4.4,0c0.6,0.6,0.9,1.4,0.8,2.2 v16.2C118.3,13.5,126.5,12.1,132.9,16z M129.3,40.3c1.6-1,2.9-2.4,3.8-4c1-1.8,1.4-3.8,1.4-5.8c0-2-0.5-4-1.4-5.7 c-0.9-1.7-2.2-3-3.8-4c-4.9-3-11.4-1.4-14.4,3.5c-0.1,0.2-0.2,0.3-0.3,0.5c-0.9,1.8-1.4,3.7-1.4,5.7c0,2,0.4,4,1.4,5.8 c2.8,5.1,9.2,7,14.4,4.2C129.1,40.4,129.2,40.3,129.3,40.3z M41,0.1h6.2v5.3H41V0.1z M0,0h6.1v5.3H0V0z M0,41.5h6.1v5.3H0V41.5z  M65.9,40.9H72v6.2h-6.1V40.9z M41,41.9h3.5v5.2H41V41.9z M98.2,41.3h6.1v5.6h-6.1V41.3z M107.4,0h6.1v5.4h-6.1V0z" />
-        </svg>
-      </div>
+        <div class="logo">
+            <svg width="175px" height="100px" viewBox="0 0 309 152" version="1.1" xmlns="http://www.w3.org/2000/svg">
+                <title>Group</title>
+                <g id="Page-2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+                    <g id="Artboard-Copy" transform="translate(-100.000000, -6.000000)" fill="#35AFD5"
+                       fill-rule="nonzero">
+                        <g id="Group" transform="translate(100.000000, 6.000000)">
+                            <path d="M48,0 L48,50.304 L48.040916,55.668891 L47.950033,55.677562 L46.6386939,55.8175213 L45.9255692,55.900871 L45.8143969,55.915542 C23.9652352,58.951769 7.5,77.7148504 7.5,99.9895207 C7.5,124.566192 27.4233286,144.489521 52,144.489521 C63.7945578,144.489521 74.850976,139.884216 83.1068414,131.811186 L83.5172913,131.404651 L88.4750135,136.34641 C78.8766784,145.975749 65.8707068,151.489521 52,151.489521 C23.5573354,151.489521 0.5,128.432185 0.5,99.9895207 C0.5,75.5349665 17.6438798,54.7411444 40.9999076,49.6668368 L41,7 L32,7 L32,0 L48,0 Z M165.725133,87 C180.659525,87 185.571785,99.997962 185.668537,106.310769 L185.67,106.5 L185.67,125.401152 L179.21943,125.401152 L179.21943,120.31094 C176.401939,123.454894 171.804981,126 165.725133,126 C155.27076,126 146.67,117.466411 146.67,106.537428 C146.67,95.6084453 155.27076,87 165.725133,87 Z M100.725133,87 C115.659525,87 120.571785,99.997962 120.668537,106.310769 L120.67,106.5 L120.67,125.401152 L114.21943,125.401152 L114.21943,120.31094 C111.401939,123.454894 106.804981,126 100.725133,126 C90.2707605,126 81.67,117.466411 81.67,106.537428 C81.67,95.6084453 90.2707605,87 100.725133,87 Z M276.194715,74 L276.194715,92.030303 C279.160494,89.012987 283.683308,86.6580087 289.614867,86.6580087 C300.06924,86.6580087 308.67,95.1212121 308.67,105.865801 C308.67,116.61039 300.06924,125 289.614867,125 C281.830928,125 269.921189,119.162503 269.673914,106.275116 L269.67,105.865801 L269.67,74 L276.194715,74 Z M200.895734,74 L200.895734,118.373723 L226.67,118.373723 L226.67,125 L193.67,125 L193.67,74 L200.895734,74 Z M245.725133,86 C260.659525,86 265.571785,98.997962 265.668537,105.310769 L265.67,105.5 L265.67,124.401152 L259.21943,124.401152 L259.21943,119.31094 C256.401939,122.454894 251.804981,125 245.725133,125 C235.27076,125 226.67,116.466411 226.67,105.537428 C226.67,94.6084453 235.27076,86 245.725133,86 Z M52.76,74.31 C67.412,74.31 78.438,85.336 78.438,99.544 C78.438,113.68318 67.6314174,124.776209 53.1984648,124.996656 L52.76,125 L35,125 L35,74.31 L52.76,74.31 Z M135.658,77 L135.658,87.286 L145.574,87.286 L145.574,93.058 L135.658,93.058 L135.658,112.668 C135.658,117.45432 138.429714,118.900369 141.814049,118.956296 L142.022,118.958 L145.574,118.958 L145.574,124.73 L141.948,124.73 C134.582319,124.73 129.372756,121.136469 129.223301,113.028631 L129.22,112.668 L129.22,93.058 L123.67,93.058 L123.67,87.286 L129.22,87.286 L129.22,77 L135.658,77 Z M166.095856,93.1381958 C158.681407,93.1381958 153.046426,99.0518234 153.046426,106.537428 C153.046426,114.023033 158.681407,119.93666 166.095856,119.93666 C173.658593,119.93666 179.367719,114.097889 179.367719,106.537428 C179.367719,99.0518234 173.584449,93.1381958 166.095856,93.1381958 Z M101.095856,93.1381958 C93.6814068,93.1381958 88.0464259,99.0518234 88.0464259,106.537428 C88.0464259,114.023033 93.6814068,119.93666 101.095856,119.93666 C108.658593,119.93666 114.367719,114.097889 114.367719,106.537428 C114.367719,99.0518234 108.584449,93.1381958 101.095856,93.1381958 Z M289.244144,92.6926407 C281.755551,92.6926407 275.972281,98.5064935 275.972281,105.865801 C275.972281,113.298701 281.681407,119.038961 289.244144,119.038961 C296.658593,119.038961 302.293574,113.225108 302.293574,105.865801 C302.293574,98.5064935 296.658593,92.6926407 289.244144,92.6926407 Z M246.095856,92.1381958 C238.681407,92.1381958 233.046426,98.0518234 233.046426,105.537428 C233.046426,113.023033 238.681407,118.93666 246.095856,118.93666 C253.658593,118.93666 259.367719,113.097889 259.367719,105.537428 C259.367719,98.0518234 253.584449,92.1381958 246.095856,92.1381958 Z M52.464,80.896 L42.178,80.896 L42.178,118.414 L52.316,118.414 C63.416,118.414 71.26,110.2 71.26,99.692 C71.26,89.036 63.194,80.896 52.464,80.896 Z M72,0 L72,7 L62.9994923,7 L63.0003609,49.6793321 C72.3934241,51.7252087 80.9885914,56.3662817 87.8723853,63.0520566 L88.3188454,63.4909316 L83.3817065,68.4532556 C76.4855783,61.5921271 67.5443496,57.1475703 57.8192825,55.8771804 L57.1166971,55.791461 L56.0381427,55.6853811 L55.9874923,55.6803995 L55.9994923,50.98 L56,0 L72,0 Z"
+                                  id="Combined-Shape"></path>
+                        </g>
+                    </g>
+                </g>
+            </svg>
+        </div>
       <svg class="spinner" viewBox="25 25 50 50">
-        <circle class="path" cx="50" cy="50" r="20" fill="none" stroke-width="1" stroke-miterlimit="10" />
+          <circle class="path" cx="50" cy="50" r="20" fill="none" stroke-width="0.6" stroke-miterlimit="10"/>
       </svg>
     </div>
   </app-root>
diff --git a/services/self-service/src/main/resources/webapp/src/main.ts b/services/self-service/src/main/resources/webapp/src/main.ts
index 9586596..b7b957e 100644
--- a/services/self-service/src/main/resources/webapp/src/main.ts
+++ b/services/self-service/src/main/resources/webapp/src/main.ts
@@ -27,4 +27,5 @@
   enableProdMode();
 }
 
+
 platformBrowserDynamic().bootstrapModule(AppModule);
diff --git a/services/self-service/src/main/resources/webapp/src/polyfills.ts b/services/self-service/src/main/resources/webapp/src/polyfills.ts
index 3e45a73..47f1965 100644
--- a/services/self-service/src/main/resources/webapp/src/polyfills.ts
+++ b/services/self-service/src/main/resources/webapp/src/polyfills.ts
@@ -1,3 +1,7 @@
+/***************************************************************************************************
+ * Load `$localize` onto the global scope - used if i18n tags appear in Angular templates.
+ */
+import '@angular/localize/init';
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -71,17 +75,4 @@
 /***************************************************************************************************
  * Zone JS is required by Angular itself.
  */
-import 'zone.js/dist/zone';  // Included with Angular CLI.
-
-
-
-/***************************************************************************************************
- * APPLICATION IMPORTS
- */
-
-/**
- * Date, currency, decimal and percent pipes.
- * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
- */
-// import 'intl';  // Run `npm install --save intl`.
-import 'hammerjs';
\ No newline at end of file
+import 'zone.js/dist/zone';
\ No newline at end of file
diff --git a/services/self-service/src/main/resources/webapp/src/styles.scss b/services/self-service/src/main/resources/webapp/src/styles.scss
index e1bbe94..efc6b3a 100644
--- a/services/self-service/src/main/resources/webapp/src/styles.scss
+++ b/services/self-service/src/main/resources/webapp/src/styles.scss
@@ -61,6 +61,19 @@
   height: calc(100% - 48px);
 }
 
+
+.mat-chip-list-wrap {
+  max-height: 120px;
+  overflow: auto;
+  margin-right: 5px;
+  .mat-chip-list-wrapper{
+    margin: 0;
+    .mat-chip {
+      font-size: 13px;
+    }
+  }
+}
+
 mat-chip.mat-chip {
   outline: none;
   color: #758ea8;
@@ -135,11 +148,15 @@
   color: #35afd5;
 }
 
+.invalid,
 .terminated,
 .terminating,
 .failed,
 .deleting,
-.deleted {
+.deleted,
+.invalid_version,
+.invalid_name,
+.installation_error{
   color: #f1696e;
 }
 
@@ -155,6 +172,10 @@
   pointer-events: none;
 }
 
+.cursor-not-allow{
+  cursor: not-allowed !important;
+}
+
 .not-active {
   cursor: not-allowed !important;
   opacity: .6;
@@ -169,6 +190,10 @@
   font-size: 15px;
   font-weight: 300;
   color: #35afd5;
+  position: relative;
+  .buttons{
+    position: absolute;
+  }
 }
 
 .base-retreat {
@@ -295,6 +320,22 @@
   text-align: right;
 }
 
+.pl-5{
+  padding-left: 5px;
+}
+
+.pl-10{
+  padding-left: 10px !important;
+}
+
+.pl-20{
+  padding-left: 20px;
+}
+
+.pr-20{
+  padding-right: 20px;
+}
+
 .m-top-10 {
   margin-top: 10px;
 }
@@ -311,12 +352,20 @@
   margin-top: 30px;
 }
 
+.m-top-40 {
+  margin-top: 40px;
+}
+
 .m-bott-10 {
   margin-bottom: 10px;
 }
 
+.m-bott-20 {
+  margin-bottom: 20px;
+}
+
 .m-bott-30 {
-  margin-bottom: 10px;
+  margin-bottom: 30px;
 }
 
 .m-top-10p {
@@ -350,14 +399,21 @@
     text-align: center;
   }
 }
+#scrolling, .scrolling, ace_scrollbar{
+  scrollbar-width: thin;
+}
 
 #scrolling::-webkit-scrollbar,
+.scrolling::-webkit-scrollbar,
+.ace_scrollbar::-webkit-scrollbar,
 .list-selected mat-chip-list .mat-chip-list-wrapper::-webkit-scrollbar {
-  width: 5px;
-  height: 5px;
+  width: 3px;
+  height: 3px;
 }
 
 #scrolling::-webkit-scrollbar-track,
+.scrolling::-webkit-scrollbar-track,
+.ace_scrollbar::-webkit-scrollbar-track,
 .list-selected mat-chip-list .mat-chip-list-wrapper::-webkit-scrollbar-track {
   box-shadow: none;
   -webkit-box-shadow: none;
@@ -365,6 +421,8 @@
 }
 
 #scrolling::-webkit-scrollbar-thumb,
+.scrolling::-webkit-scrollbar-thumb,
+.ace_scrollbar::-webkit-scrollbar-thumb,
 .list-selected mat-chip-list .mat-chip-list-wrapper::-webkit-scrollbar-thumb {
   background-color: #f6fafe;
   background-color: rgba(0, 0, 0, 0.4);
@@ -398,6 +456,16 @@
   text-overflow: ellipsis;
   white-space: nowrap;
   overflow: hidden;
+  &::after{
+    content: '';
+    display: block;
+  }
+}
+
+.mat-chip.mat-standard-chip::after {
+  height: 0;
+  width: 0;
+  position: unset;
 }
 
 .capitalize {
@@ -473,4 +541,29 @@
   max-width: 350px;
   overflow: hidden;
   text-overflow: ellipsis;
+  &::after{
+    content: '';
+    display: block;
+  }
+}
+
+.group-updated-tooltip {
+  white-space: pre-line;
+  max-width: fit-content !important;
+}
+
+.mat-tooltip-for-users, .mat-tooltip-description {
+  overflow-wrap: break-word;
+}
+
+.billing-user-name {
+  word-break: break-all;
+}
+
+.uppercase::first-letter {
+  text-transform: capitalize;
+}
+
+.timezone-mat-select {
+  max-width: 350px !important;
 }
diff --git a/services/self-service/src/main/resources/webapp/src/tsconfig.app.json b/services/self-service/src/main/resources/webapp/src/tsconfig.app.json
index be171af..4323da5 100644
--- a/services/self-service/src/main/resources/webapp/src/tsconfig.app.json
+++ b/services/self-service/src/main/resources/webapp/src/tsconfig.app.json
@@ -22,13 +22,15 @@
       ]
     }
   },
+  "files": [
+    "main.ts",
+    "polyfills.ts"
+  ],
+  "include": [
+    "src/**/*.d.ts"
+  ],
   "typeRoots": [
     "node_modules/@types"
   ],
-  "types": ["jest"],
-  "exclude": [
-    "test.ts",
-    "**/*.spec.ts",
-    "..node_modules",
-  ]
+  "types": ["jest"]
 }
diff --git a/services/self-service/src/main/resources/webapp/tsconfig.json b/services/self-service/src/main/resources/webapp/tsconfig.json
index 2cd272d..20365e6 100644
--- a/services/self-service/src/main/resources/webapp/tsconfig.json
+++ b/services/self-service/src/main/resources/webapp/tsconfig.json
@@ -10,13 +10,15 @@
     "sourceMap": true,
     "emitDecoratorMetadata": true,
     "experimentalDecorators": true,
-    "lib": ["es2015", "dom"],
+    "lib": ["es2017", "es2015", "dom"],
     "noImplicitAny": false,
     "suppressImplicitAnyIndexErrors": true
   },
   "angularCompilerOptions": {
-    // "fullTemplateTypeCheck": true,
+     //"fullTemplateTypeCheck": true,
     // "preserveWhitespaces": true
+    "annotationsAs": "decorators",
+    "enableIvy": false
   },
   "skipLibCheck": true
 }
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/domain/ExploratoryLibListTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/domain/ExploratoryLibListTest.java
new file mode 100644
index 0000000..fe15cde
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/domain/ExploratoryLibListTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.domain;
+
+import com.epam.datalab.backendapi.resources.dto.LibraryAutoCompleteDTO;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Map;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertFalse;
+import static junit.framework.TestCase.assertTrue;
+
+public class ExploratoryLibListTest {
+
+	@Test
+	public void getLibs() {
+		String content =
+				"{" +
+						"\"os_pkg\": {\"htop\": \"2.0.1-1ubuntu1\", \"python-mysqldb\": \"1.3.7-1build2\"}," +
+						"\"pip2\": {\"requests\": \"N/A\", \"configparser\": \"N/A\"}," +
+						"\"pip3\": {\"configparser\": \"N/A\"}," +
+						"\"r_pkg\": {\"rmarkdown\": \"1.5\"}" +
+						"}";
+
+		ExploratoryLibList libs = new ExploratoryLibList("imageName", content);
+
+		assertEquals("imageName", libs.getGroup());
+		assertFalse(libs.isExpired());
+		assertFalse(libs.isUpdateNeeded());
+		assertFalse(libs.isUpdating());
+
+		List<String> groups = libs.getGroupList();
+		assertEquals(4, groups.size());
+		assertEquals("os_pkg", groups.get(0));
+		assertEquals("r_pkg", groups.get(3));
+
+		Map<String, String> map = libs.getLibs("os_pkg");
+		assertEquals(2, map.size());
+		assertEquals("2.0.1-1ubuntu1", map.get("htop"));
+		assertEquals("1.3.7-1build2", map.get("python-mysqldb"));
+
+		final LibraryAutoCompleteDTO dtoList = libs.getLibs("os_pkg", "py");
+		assertEquals(1, dtoList.getLibraries().size());
+		assertEquals("1.3.7-1build2", dtoList.getLibraries().get(0).getVersion());
+
+		libs.setUpdating();
+		assertTrue(libs.isUpdating());
+	}
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ApplicationSettingResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ApplicationSettingResourceTest.java
new file mode 100644
index 0000000..949741a
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ApplicationSettingResourceTest.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources;
+
+
+import com.epam.datalab.backendapi.service.ApplicationSettingService;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Collections;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+public class ApplicationSettingResourceTest extends TestBase {
+
+    private ApplicationSettingService applicationSettingService = mock(ApplicationSettingService.class);
+
+    @Rule
+    public final ResourceTestRule resources =
+            getResourceTestRuleInstance(new ApplicationSettingResource(applicationSettingService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+
+    @Test
+    public void setMaxBudget() {
+        final Response response = resources.getJerseyTest()
+                .target("/settings/budget/12")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .put(Entity.entity("dummy", MediaType.TEXT_PLAIN));
+
+        assertEquals(HttpStatus.SC_NO_CONTENT, response.getStatus());
+
+        verify(applicationSettingService).setMaxBudget(12L);
+        verifyNoMoreInteractions(applicationSettingService);
+    }
+
+    @Test
+    public void removeMaxBudget() {
+        final Response response = resources.getJerseyTest()
+                .target("/settings/budget")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .delete();
+
+        assertEquals(HttpStatus.SC_NO_CONTENT, response.getStatus());
+
+        verify(applicationSettingService).removeMaxBudget();
+        verifyNoMoreInteractions(applicationSettingService);
+    }
+
+    @Test
+    public void getSettings() {
+
+        when(applicationSettingService.getSettings()).thenReturn(Collections.singletonMap("key", "value"));
+        final Response response = resources.getJerseyTest()
+                .target("/settings")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+        final Map map = response.readEntity(Map.class);
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getMediaType());
+        assertEquals(1, map.size());
+        assertEquals("value", map.get("key"));
+
+        verify(applicationSettingService).getSettings();
+        verifyNoMoreInteractions(applicationSettingService);
+
+
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/AuditResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/AuditResourceTest.java
new file mode 100644
index 0000000..f7fc60f
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/AuditResourceTest.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.backendapi.domain.AuditCreateDTO;
+import com.epam.datalab.backendapi.domain.AuditResourceTypeEnum;
+import com.epam.datalab.backendapi.service.AuditService;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+public class AuditResourceTest extends TestBase {
+
+    private final static String USER = "testuser";
+    private final static String INFO = "testInfo";
+    private final static String RESOURCE = "testResource";
+
+    private final AuditService auditService = mock(AuditService.class);
+
+    @Rule
+    public final ResourceTestRule resources = getResourceTestRuleInstance(new AuditResource(auditService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void saveAudit() {
+        final Response response = resources.getJerseyTest()
+                .target("/audit")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(prepareAuditCreateDTO()));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        verify(auditService).save(eq(USER), refEq(prepareAuditCreateDTO()));
+        verifyNoMoreInteractions(auditService);
+    }
+
+    @Test
+    public void getAudit() {
+        final Response response = resources.getJerseyTest()
+                .target("/audit")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+    }
+
+    private AuditCreateDTO prepareAuditCreateDTO() {
+        return new AuditCreateDTO(RESOURCE, INFO, AuditResourceTypeEnum.COMPUTE);
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/BackupResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/BackupResourceTest.java
new file mode 100644
index 0000000..0e14032
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/BackupResourceTest.java
@@ -0,0 +1,228 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.resources.dto.BackupFormDTO;
+import com.epam.datalab.backendapi.resources.dto.BackupInfoRecord;
+import com.epam.datalab.backendapi.service.BackupService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.dto.backup.EnvBackupDTO;
+import com.epam.datalab.dto.backup.EnvBackupStatus;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+public class BackupResourceTest extends TestBase {
+
+    private final Date TIMESTAMP = new Date();
+    private BackupService backupService = mock(BackupService.class);
+    private RequestId requestId = mock(RequestId.class);
+    private RequestBuilder requestBuilder = mock(RequestBuilder.class);
+
+    @Rule
+    public final ResourceTestRule resources =
+            getResourceTestRuleInstance(new BackupResource(backupService, requestBuilder, requestId));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void getBackup() {
+        when(backupService.getBackup(anyString(), anyString())).thenReturn(getBackupInfo());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/backup/1")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getBackupInfo(), response.readEntity(BackupInfoRecord.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(backupService).getBackup(USER.toLowerCase(), "1");
+        verifyNoMoreInteractions(backupService);
+        verifyZeroInteractions(requestId, requestBuilder);
+    }
+
+    @Test
+    public void getBackupWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(backupService.getBackup(anyString(), anyString())).thenReturn(getBackupInfo());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/backup/1")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(backupService, requestId, requestBuilder);
+    }
+
+    @Test
+    public void getBackupWithNotFoundException() {
+        when(backupService.getBackup(anyString(), anyString())).thenThrow(new ResourceNotFoundException("Backup not " +
+                "found"));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/backup/1")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(backupService).getBackup(USER.toLowerCase(), "1");
+        verifyNoMoreInteractions(backupService);
+        verifyZeroInteractions(requestId, requestBuilder);
+    }
+
+    @Test
+    public void getBackups() {
+        when(backupService.getBackups(anyString())).thenReturn(Collections.singletonList(getBackupInfo()));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/backup")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(Collections.singletonList(getBackupInfo()),
+                response.readEntity(new GenericType<List<BackupInfoRecord>>() {
+                }));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(backupService).getBackups(USER.toLowerCase());
+        verifyNoMoreInteractions(backupService);
+        verifyZeroInteractions(requestId, requestBuilder);
+    }
+
+    @Test
+    public void getBackupsWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(backupService.getBackups(anyString())).thenReturn(Collections.singletonList(getBackupInfo()));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/backup")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(backupService, requestId, requestBuilder);
+    }
+
+    @Test
+    public void createBackup() {
+        when(requestBuilder.newBackupCreate(any(BackupFormDTO.class), anyString())).thenReturn(getEnvBackupDto());
+        when(backupService.createBackup(any(EnvBackupDTO.class), any(UserInfo.class))).thenReturn("someUuid");
+        when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
+
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/backup")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getBackupFormDto()));
+
+        assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
+        assertEquals(MediaType.TEXT_PLAIN, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(requestBuilder).newBackupCreate(eq(getBackupFormDto()), anyString());
+        verify(backupService).createBackup(getEnvBackupDto(), getUserInfo());
+        verify(requestId).put(USER.toLowerCase(), "someUuid");
+        verifyNoMoreInteractions(requestBuilder, backupService, requestId);
+    }
+
+    @Test
+    public void createBackupWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(requestBuilder.newBackupCreate(any(BackupFormDTO.class), anyString())).thenReturn(getEnvBackupDto());
+        when(backupService.createBackup(any(EnvBackupDTO.class), any(UserInfo.class))).thenReturn("someUuid");
+        when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
+
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/backup")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getBackupFormDto()));
+
+        assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(requestBuilder, backupService, requestId);
+    }
+
+    private BackupInfoRecord getBackupInfo() {
+        final List<String> configFiles = Arrays.asList("ss.yml", "sec.yml");
+        final List<String> keys = Collections.singletonList("key.pub");
+        final List<String> cert = Collections.singletonList("cert");
+        final List<String> jars = Collections.singletonList("ss.jar");
+        return new BackupInfoRecord(configFiles, keys, cert, jars, false, true, "file.backup",
+                EnvBackupStatus.CREATED, null, TIMESTAMP);
+    }
+
+    private BackupFormDTO getBackupFormDto() {
+        return new BackupFormDTO(Arrays.asList("ss.yml", "sec.yml"), Collections.singletonList("key.pub"),
+                Collections.singletonList("cert"), Collections.singletonList("ss.jar"), false, true);
+    }
+
+    private EnvBackupDTO getEnvBackupDto() {
+        return EnvBackupDTO.builder()
+                .configFiles(Arrays.asList("ss.yml", "sec.yml"))
+                .keys(Collections.singletonList("key.pub"))
+                .certificates(Collections.singletonList("cert"))
+                .jars(Collections.singletonList("ss.jar"))
+                .databaseBackup(false)
+                .logsBackup(true)
+                .backupFile("file.backup")
+                .id("someId")
+                .build();
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/EnvironmentResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/EnvironmentResourceTest.java
new file mode 100644
index 0000000..d5abaa2
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/EnvironmentResourceTest.java
@@ -0,0 +1,291 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.EnvironmentService;
+import com.epam.datalab.exceptions.ResourceConflictException;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+public class EnvironmentResourceTest extends TestBase {
+
+    private EnvironmentService environmentService = mock(EnvironmentService.class);
+
+    @Rule
+    public final ResourceTestRule resources = getResourceTestRuleInstance(new EnvironmentResource(environmentService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void getAllEnv() {
+        UserInfo userInfo = getUserInfo();
+        when(environmentService.getAllEnv(userInfo)).thenReturn(Collections.emptyList());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/all")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(environmentService).getAllEnv(eq(userInfo));
+        verifyNoMoreInteractions(environmentService);
+    }
+
+    @Test
+    public void getAllEnvWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(environmentService.getAllEnv(getUserInfo())).thenReturn(Collections.emptyList());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/all")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(environmentService);
+    }
+
+    @Test
+    public void stopNotebook() {
+        doNothing().when(environmentService).stopExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/stop/projectName/explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(environmentService).stopExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
+        verifyNoMoreInteractions(environmentService);
+    }
+
+    @Test
+    public void stopNotebookWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        doNothing().when(environmentService).stopExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/stop/projectName/explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(environmentService);
+    }
+
+    @Test
+    public void stopNotebookWithResourceConflictException() {
+        doThrow(new ResourceConflictException("Can not stop notebook because its status is CREATING or STARTING"))
+                .when(environmentService).stopExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/stop/projectName/explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(environmentService).stopExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
+        verifyNoMoreInteractions(environmentService);
+    }
+
+    @Test
+    public void stopCluster() {
+        doNothing().when(environmentService).stopComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/stop/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(environmentService).stopComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
+        verifyNoMoreInteractions(environmentService);
+    }
+
+    @Test
+    public void stopClusterWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        doNothing().when(environmentService).stopComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/stop/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(environmentService);
+    }
+
+    @Test
+    public void stopClusterWithResourceConflictException() {
+        doThrow(new ResourceConflictException("Can not stop cluster because its status is CREATING or STARTING"))
+                .when(environmentService).stopComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/stop/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(environmentService).stopComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
+        verifyNoMoreInteractions(environmentService);
+    }
+
+    @Test
+    public void terminateNotebook() {
+        doNothing().when(environmentService).terminateExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/terminate/projectName/explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(environmentService).terminateExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
+        verifyNoMoreInteractions(environmentService);
+    }
+
+    @Test
+    public void terminateNotebookWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        doNothing().when(environmentService).terminateExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/terminate/projectName/explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(environmentService);
+    }
+
+    @Test
+    public void terminateNotebookWithResourceConflictException() {
+        doThrow(new ResourceConflictException("Can not terminate notebook because its status is CREATING or STARTING"))
+                .when(environmentService).terminateExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/terminate/projectName/explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(environmentService).terminateExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
+        verifyNoMoreInteractions(environmentService);
+    }
+
+    @Test
+    public void terminateCluster() {
+        doNothing().when(environmentService).terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/terminate/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(environmentService).terminateComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
+        verifyNoMoreInteractions(environmentService);
+    }
+
+    @Test
+    public void terminateClusterWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        doNothing().when(environmentService).terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/terminate/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(environmentService);
+    }
+
+    @Test
+    public void terminateClusterWithResourceConflictException() {
+        doThrow(new ResourceConflictException("Can not terminate cluster because its status is CREATING or STARTING"))
+                .when(environmentService).terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/environment/terminate/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.text(USER));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(environmentService).terminateComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
+        verifyNoMoreInteractions(environmentService);
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ExploratoryResourceTest.java
new file mode 100644
index 0000000..0f2a8f0
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ExploratoryResourceTest.java
@@ -0,0 +1,325 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.ExploratoryActionFormDTO;
+import com.epam.datalab.backendapi.resources.dto.ExploratoryCreateFormDTO;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.model.exploratory.Exploratory;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+public class ExploratoryResourceTest extends TestBase {
+
+    private ExploratoryService exploratoryService = mock(ExploratoryService.class);
+
+    @Rule
+    public final ResourceTestRule resources = getResourceTestRuleInstance(new ExploratoryResource(exploratoryService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void create() {
+        when(exploratoryService.create(any(UserInfo.class), any(Exploratory.class), anyString(), anyString())).thenReturn(
+                "someUuid");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .put(Entity.json(getExploratoryCreateFormDTO()));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals("someUuid", response.readEntity(String.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryService).create(refEq(getUserInfo()), refEq(getExploratory(getExploratoryCreateFormDTO())),
+                eq("project"), eq("someName"));
+        verifyNoMoreInteractions(exploratoryService);
+    }
+
+    @Test
+    public void createWithException() {
+        doThrow(new DatalabException("Could not create exploratory environment"))
+                .when(exploratoryService).create(any(UserInfo.class), any(Exploratory.class), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .put(Entity.json(getExploratoryCreateFormDTO()));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        String expectedJson = "\"code\":500,\"message\":\"There was an error processing your request. " +
+                "It has been logged";
+        String actualJson = response.readEntity(String.class);
+        assertTrue(actualJson.contains(expectedJson));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryService).create(getUserInfo(), getExploratory(getExploratoryCreateFormDTO()), "project", "someName");
+        verifyNoMoreInteractions(exploratoryService);
+    }
+
+    @Test
+    public void start() {
+        ExploratoryActionFormDTO exploratoryDTO = getExploratoryActionFormDTO();
+        when(exploratoryService.start(any(UserInfo.class), anyString(), anyString(), anyString())).thenReturn("someUuid");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(exploratoryDTO));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals("someUuid", response.readEntity(String.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryService).start(getUserInfo(), exploratoryDTO.getNotebookInstanceName(), exploratoryDTO.getProjectName(), null);
+
+        verifyZeroInteractions(exploratoryService);
+    }
+
+    @Test
+    public void startUnprocessableEntity() {
+        when(exploratoryService.start(any(UserInfo.class), anyString(), anyString(), anyString())).thenReturn("someUuid");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getEmptyExploratoryActionFormDTO()));
+
+        assertEquals(HttpStatus.SC_UNPROCESSABLE_ENTITY, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(exploratoryService);
+    }
+
+    @Test
+    public void stop() {
+        when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString(), anyString(), anyString())).thenReturn("someUuid");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/project/someName/stop")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .delete();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals("someUuid", response.readEntity(String.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryService).stop(getUserInfo(), getUserInfo().getName(), "project", "someName", null);
+        verifyNoMoreInteractions(exploratoryService);
+    }
+
+    @Test
+    public void stopWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString(), anyString(), anyString())).thenReturn("someUuid");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/project/someName/stop")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .delete();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals("someUuid", response.readEntity(String.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryService).stop(getUserInfo(), getUserInfo().getName(), "project", "someName", null);
+        verifyNoMoreInteractions(exploratoryService);
+    }
+
+    @Test
+    public void stopWithException() {
+        doThrow(new DatalabException("Could not stop exploratory environment"))
+                .when(exploratoryService).stop(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/project/someName/stop")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .delete();
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        String expectedJson = "\"code\":500,\"message\":\"There was an error processing your request. " +
+                "It has been logged";
+        String actualJson = response.readEntity(String.class);
+        assertTrue(actualJson.contains(expectedJson));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryService).stop(getUserInfo(), getUserInfo().getName(), "project", "someName", null);
+        verifyNoMoreInteractions(exploratoryService);
+    }
+
+    @Test
+    public void terminate() {
+        when(exploratoryService.terminate(any(UserInfo.class), anyString(), anyString(), anyString(), anyString())).thenReturn("someUuid");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/project/someName/terminate")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .delete();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals("someUuid", response.readEntity(String.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryService).terminate(getUserInfo(), getUserInfo().getName(), "project", "someName", null);
+        verifyNoMoreInteractions(exploratoryService);
+    }
+
+    @Test
+    public void terminateWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(exploratoryService.terminate(any(UserInfo.class), anyString(), anyString(), anyString(), anyString())).thenReturn("someUuid");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/project/someName/terminate")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .delete();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals("someUuid", response.readEntity(String.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryService).terminate(getUserInfo(), getUserInfo().getName(), "project", "someName", null);
+        verifyNoMoreInteractions(exploratoryService);
+    }
+
+    @Test
+    public void terminateWithException() {
+        doThrow(new DatalabException("Could not terminate exploratory environment"))
+                .when(exploratoryService).terminate(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/project/someName/terminate")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .delete();
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        String expectedJson = "\"code\":500,\"message\":\"There was an error processing your request. " +
+                "It has been logged";
+        String actualJson = response.readEntity(String.class);
+        assertTrue(actualJson.contains(expectedJson));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryService).terminate(getUserInfo(), getUserInfo().getName(), "project", "someName", null);
+        verifyNoMoreInteractions(exploratoryService);
+    }
+
+    @Test
+    public void updateSparkConfig() {
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/someProject/someName/reconfigure")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .put(Entity.json(Collections.singletonList(new ClusterConfig())));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+
+        verify(exploratoryService).updateClusterConfig(refEq(getUserInfo()), eq("someProject"),
+                eq("someName"), eq(Collections.singletonList(new ClusterConfig())));
+        verifyNoMoreInteractions(exploratoryService);
+    }
+
+    @Test
+    public void getSparkConfig() {
+        final ClusterConfig config = new ClusterConfig();
+        config.setClassification("test");
+        when(exploratoryService.getClusterConfig(any(UserInfo.class), anyString(), anyString())).thenReturn(Collections.singletonList(config));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/someProject/someName/cluster/config")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        final List<ClusterConfig> clusterConfigs = response.readEntity(new GenericType<List<ClusterConfig>>() {
+        });
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(1, clusterConfigs.size());
+        assertEquals("test", clusterConfigs.get(0).getClassification());
+
+        verify(exploratoryService).getClusterConfig(refEq(getUserInfo()), eq("someProject"), eq("someName"));
+        verifyNoMoreInteractions(exploratoryService);
+    }
+
+    private ExploratoryCreateFormDTO getExploratoryCreateFormDTO() {
+        ExploratoryCreateFormDTO ecfDto = new ExploratoryCreateFormDTO();
+        ecfDto.setImage("someImage");
+        ecfDto.setTemplateName("someTemplateName");
+        ecfDto.setName("someName");
+        ecfDto.setShape("someShape");
+        ecfDto.setVersion("someVersion");
+        ecfDto.setImageName("someImageName");
+        ecfDto.setProject("project");
+        ecfDto.setEndpoint("endpoint");
+        return ecfDto;
+    }
+
+    private ExploratoryActionFormDTO getEmptyExploratoryActionFormDTO() {
+        return new ExploratoryActionFormDTO();
+    }
+
+    private ExploratoryActionFormDTO getExploratoryActionFormDTO() {
+        return new ExploratoryActionFormDTO("notebook_instance_name", "project_name");
+    }
+
+    private Exploratory getExploratory(@Valid @NotNull ExploratoryCreateFormDTO formDTO) {
+        return Exploratory.builder()
+                .name(formDTO.getName())
+                .dockerImage(formDTO.getImage())
+                .imageName(formDTO.getImageName())
+                .templateName(formDTO.getTemplateName())
+                .version(formDTO.getVersion())
+                .shape(formDTO.getShape())
+                .endpoint(formDTO.getEndpoint())
+                .project(formDTO.getProject()).build();
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/GitCredsResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/GitCredsResourceTest.java
new file mode 100644
index 0000000..bb4bad1
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/GitCredsResourceTest.java
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.GitCredentialService;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCreds;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+public class GitCredsResourceTest extends TestBase {
+
+    private GitCredentialService gitCredentialService = mock(GitCredentialService.class);
+
+    @Rule
+    public final ResourceTestRule resources = getResourceTestRuleInstance(new GitCredsResource(gitCredentialService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void updateGitCreds() {
+        doNothing().when(gitCredentialService).updateGitCredentials(any(UserInfo.class),
+                any(ExploratoryGitCredsDTO.class));
+        final Response response = resources.getJerseyTest()
+                .target("/user/git_creds")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .put(Entity.json(getExploratoryGitCredsDTO()));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(gitCredentialService)
+                .updateGitCredentials(refEq(getUserInfo()), refEq(getExploratoryGitCredsDTO(), "self"));
+        verifyNoMoreInteractions(gitCredentialService);
+    }
+
+    @Test
+    public void updateGitCredsWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        doNothing().when(gitCredentialService).updateGitCredentials(any(UserInfo.class),
+                any(ExploratoryGitCredsDTO.class));
+        final Response response = resources.getJerseyTest()
+                .target("/user/git_creds")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .put(Entity.json(getExploratoryGitCredsDTO()));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(gitCredentialService)
+                .updateGitCredentials(refEq(getUserInfo()), refEq(getExploratoryGitCredsDTO(), "self"));
+        verifyNoMoreInteractions(gitCredentialService);
+    }
+
+    @Test
+    public void updateGitCredsWithException() {
+        doThrow(new DatalabException("Cannot update the GIT credentials")).when(gitCredentialService)
+                .updateGitCredentials(any(UserInfo.class), any(ExploratoryGitCredsDTO.class));
+        final Response response = resources.getJerseyTest()
+                .target("/user/git_creds")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .put(Entity.json(getExploratoryGitCredsDTO()));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(gitCredentialService).updateGitCredentials(refEq(getUserInfo()),
+                refEq(getExploratoryGitCredsDTO(), "self"));
+        verifyNoMoreInteractions(gitCredentialService);
+    }
+
+    @Test
+    public void getGitCreds() {
+        ExploratoryGitCredsDTO egcDto = getExploratoryGitCredsDTO();
+        when(gitCredentialService.getGitCredentials(anyString())).thenReturn(egcDto);
+        final Response response = resources.getJerseyTest()
+                .target("/user/git_creds")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(egcDto.getGitCreds(), response.readEntity(ExploratoryGitCredsDTO.class).getGitCreds());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(gitCredentialService).getGitCredentials(USER.toLowerCase());
+        verifyNoMoreInteractions(gitCredentialService);
+    }
+
+    @Test
+    public void getGitCredsWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        ExploratoryGitCredsDTO egcDto = getExploratoryGitCredsDTO();
+        when(gitCredentialService.getGitCredentials(anyString())).thenReturn(egcDto);
+        final Response response = resources.getJerseyTest()
+                .target("/user/git_creds")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(egcDto.getGitCreds(), response.readEntity(ExploratoryGitCredsDTO.class).getGitCreds());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(gitCredentialService).getGitCredentials(USER.toLowerCase());
+        verifyNoMoreInteractions(gitCredentialService);
+    }
+
+    @Test
+    public void getGitCredsWithException() {
+        doThrow(new DatalabException("Cannot load GIT credentials for user"))
+                .when(gitCredentialService).getGitCredentials(anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/user/git_creds")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(gitCredentialService).getGitCredentials(USER.toLowerCase());
+        verifyNoMoreInteractions(gitCredentialService);
+    }
+
+    private ExploratoryGitCredsDTO getExploratoryGitCredsDTO() {
+        ExploratoryGitCredsDTO exploratoryGitCredsDTO = new ExploratoryGitCredsDTO();
+        final ExploratoryGitCreds exploratoryGitCreds = new ExploratoryGitCreds();
+        exploratoryGitCreds.setHostname("host");
+        exploratoryGitCredsDTO.setGitCreds(Collections.singletonList(exploratoryGitCreds));
+        return exploratoryGitCredsDTO;
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ImageExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ImageExploratoryResourceTest.java
new file mode 100644
index 0000000..f62b1e3
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ImageExploratoryResourceTest.java
@@ -0,0 +1,282 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.resources.dto.ExploratoryImageCreateFormDTO;
+import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord;
+import com.epam.datalab.backendapi.service.ImageExploratoryService;
+import com.epam.datalab.dto.exploratory.ImageStatus;
+import com.epam.datalab.exceptions.ResourceAlreadyExistException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+public class ImageExploratoryResourceTest extends TestBase {
+    private final static String AUDIT_MESSAGE = "Create image: %s";
+    private static final String PROJECT = "projectName";
+    private ImageExploratoryService imageExploratoryService = mock(ImageExploratoryService.class);
+    private RequestId requestId = mock(RequestId.class);
+
+    @Rule
+    public final ResourceTestRule resources =
+            getResourceTestRuleInstance(new ImageExploratoryResource(imageExploratoryService, requestId));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void createImage() {
+        when(imageExploratoryService.createImage(any(UserInfo.class), anyString(), anyString(), anyString(), anyString(), anyString()))
+                .thenReturn("someUuid");
+        when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/image")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getExploratoryImageCreateFormDTO()));
+
+        assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(imageExploratoryService).createImage(getUserInfo(), PROJECT, "someNotebookName",
+                "someImageName", "someDescription", String.format(AUDIT_MESSAGE, "someImageName"));
+        verify(requestId).put(USER.toLowerCase(), "someUuid");
+        verifyNoMoreInteractions(imageExploratoryService, requestId);
+    }
+
+    @Test
+    public void createImageWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(imageExploratoryService.createImage(any(UserInfo.class), anyString(), anyString(), anyString(), anyString(), anyString()))
+                .thenReturn("someUuid");
+        when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/image")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getExploratoryImageCreateFormDTO()));
+
+        assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(imageExploratoryService).createImage(getUserInfo(), PROJECT, "someNotebookName", "someImageName", "someDescription", String.format(AUDIT_MESSAGE, "someImageName"));
+
+        verify(requestId).put(USER.toLowerCase(), "someUuid");
+        verifyNoMoreInteractions(imageExploratoryService, requestId);
+    }
+
+    @Test
+    public void createImageWithException() {
+        doThrow(new ResourceAlreadyExistException("Image with name is already exist"))
+                .when(imageExploratoryService).createImage(any(UserInfo.class), anyString(), anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/image")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getExploratoryImageCreateFormDTO()));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(imageExploratoryService).createImage(getUserInfo(), PROJECT, "someNotebookName", "someImageName", "someDescription", String.format(AUDIT_MESSAGE, "someImageName"));
+        verifyNoMoreInteractions(imageExploratoryService);
+        verifyZeroInteractions(requestId);
+    }
+
+    @Test
+    public void getImages() {
+        when(imageExploratoryService.getNotFailedImages(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(getImageList());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/image")
+                .queryParam("docker_image", "someDockerImage")
+                .queryParam("project", "someProject")
+                .queryParam("endpoint", "someEndpoint")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getImageList(), response.readEntity(new GenericType<List<ImageInfoRecord>>() {
+        }));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(imageExploratoryService).getNotFailedImages(USER.toLowerCase(), "someDockerImage", "someProject", "someEndpoint");
+        verifyNoMoreInteractions(imageExploratoryService);
+    }
+
+    @Test
+    public void getImagesWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(imageExploratoryService.getNotFailedImages(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(getImageList());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/image")
+                .queryParam("docker_image", "someDockerImage")
+                .queryParam("project", "someProject")
+                .queryParam("endpoint", "someEndpoint")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getImageList(), response.readEntity(new GenericType<List<ImageInfoRecord>>() {
+        }));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(imageExploratoryService).getNotFailedImages(USER.toLowerCase(), "someDockerImage", "someProject", "someEndpoint");
+        verifyNoMoreInteractions(imageExploratoryService);
+    }
+
+    @Test
+    public void getImage() {
+        when(imageExploratoryService.getImage(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(getImageList().get(0));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/image/someName")
+                .queryParam("project", "someProject")
+                .queryParam("endpoint", "someEndpoint")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getImageList().get(0), response.readEntity(ImageInfoRecord.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(imageExploratoryService).getImage(USER.toLowerCase(), "someName", "someProject", "someEndpoint");
+        verifyNoMoreInteractions(imageExploratoryService);
+    }
+
+    @Test
+    public void getImageWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(imageExploratoryService.getImage(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(getImageList().get(0));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/image/someName")
+                .queryParam("project", "someProject")
+                .queryParam("endpoint", "someEndpoint")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getImageList().get(0), response.readEntity(ImageInfoRecord.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(imageExploratoryService).getImage(USER.toLowerCase(), "someName", "someProject", "someEndpoint");
+        verifyNoMoreInteractions(imageExploratoryService);
+    }
+
+    @Test
+    public void getAllImagesForProject() {
+        when(imageExploratoryService.getImagesForProject(anyString())).thenReturn(getImageList());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/image/all")
+                .queryParam("project", "someProject")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getImageList(), response.readEntity(new GenericType<List<ImageInfoRecord>>() {
+        }));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(imageExploratoryService).getImagesForProject("someProject");
+        verifyNoMoreInteractions(imageExploratoryService);
+    }
+
+    @Test
+    public void getAllImagesForNullProject() {
+        when(imageExploratoryService.getImagesForProject(anyString())).thenReturn(getImageList());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/image/all")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_BAD_REQUEST, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(imageExploratoryService, never()).getImagesForProject(anyString());
+        verifyNoMoreInteractions(imageExploratoryService);
+    }
+
+    @Test
+    public void getImageWithException() {
+        doThrow(new ResourceNotFoundException("Image with name was not found for user"))
+                .when(imageExploratoryService).getImage(anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/image/someName")
+                .queryParam("project", "someProject")
+                .queryParam("endpoint", "someEndpoint")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(imageExploratoryService).getImage(USER.toLowerCase(), "someName", "someProject", "someEndpoint");
+        verifyNoMoreInteractions(imageExploratoryService);
+    }
+
+    private ExploratoryImageCreateFormDTO getExploratoryImageCreateFormDTO() {
+        ExploratoryImageCreateFormDTO eicfDto = new ExploratoryImageCreateFormDTO("someImageName", "someDescription");
+        eicfDto.setNotebookName("someNotebookName");
+        eicfDto.setProjectName(PROJECT);
+        return eicfDto;
+    }
+
+    private List<ImageInfoRecord> getImageList() {
+        ImageInfoRecord imageInfoRecord = new ImageInfoRecord("someName", "someDescription", "someProject", "someEndpoint", "someUser", "someApp",
+                "someFullName", ImageStatus.CREATED);
+        return Collections.singletonList(imageInfoRecord);
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/InfrastructureInfoResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/InfrastructureInfoResourceTest.java
new file mode 100644
index 0000000..52b09b3
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/InfrastructureInfoResourceTest.java
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.HealthStatusPageDTO;
+import com.epam.datalab.backendapi.service.InfrastructureInfoService;
+import com.epam.datalab.dto.InfrastructureMetaInfoDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+public class InfrastructureInfoResourceTest extends TestBase {
+
+    private InfrastructureInfoService infrastructureInfoService = mock(InfrastructureInfoService.class);
+
+    @Rule
+    public final ResourceTestRule resources =
+            getResourceTestRuleInstance(new InfrastructureInfoResource(infrastructureInfoService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void status() {
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(infrastructureInfoService);
+    }
+
+    @Test
+    public void statusWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(infrastructureInfoService);
+    }
+
+    @Test
+    public void healthStatus() {
+        HealthStatusPageDTO hspDto = getHealthStatusPageDTO();
+        when(infrastructureInfoService.getHeathStatus(any(UserInfo.class))).thenReturn(hspDto);
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/status")
+                .queryParam("full", "1")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(hspDto.getStatus(), response.readEntity(HealthStatusPageDTO.class).getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()));
+        verifyNoMoreInteractions(infrastructureInfoService);
+    }
+
+    @Test
+    public void healthStatusWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        HealthStatusPageDTO hspDto = getHealthStatusPageDTO();
+        when(infrastructureInfoService.getHeathStatus(any(UserInfo.class))).thenReturn(hspDto);
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/status")
+                .queryParam("full", "1")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(hspDto.getStatus(), response.readEntity(HealthStatusPageDTO.class).getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()));
+        verifyNoMoreInteractions(infrastructureInfoService);
+    }
+
+    @Test
+    public void healthStatusWithDefaultQueryParam() {
+        HealthStatusPageDTO hspDto = getHealthStatusPageDTO();
+        when(infrastructureInfoService.getHeathStatus(any(UserInfo.class))).thenReturn(hspDto);
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/status")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(hspDto.getStatus(), response.readEntity(HealthStatusPageDTO.class).getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()));
+        verifyNoMoreInteractions(infrastructureInfoService);
+    }
+
+    @Test
+    public void healthStatusWithException() {
+        doThrow(new DatalabException("Could not return status of resources for user"))
+                .when(infrastructureInfoService).getHeathStatus(any(UserInfo.class));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/status")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()));
+        verifyNoMoreInteractions(infrastructureInfoService);
+    }
+
+
+    @Test
+    public void getUserResourcesWithException() {
+        doThrow(new DatalabException("Could not load list of provisioned resources for user"))
+                .when(infrastructureInfoService).getUserResources(any(UserInfo.class));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/info")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(infrastructureInfoService).getUserResources(any());
+        verifyNoMoreInteractions(infrastructureInfoService);
+    }
+
+    @Test
+    public void getInfrastructureMeta() {
+
+        when(infrastructureInfoService.getInfrastructureMetaInfo()).thenReturn(
+                InfrastructureMetaInfoDTO.builder()
+                        .version("1.0").build());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure/meta")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        final InfrastructureMetaInfoDTO infrastructureMetaInfoDTO =
+                response.readEntity(InfrastructureMetaInfoDTO.class);
+        assertEquals("1.0", infrastructureMetaInfoDTO.getVersion());
+    }
+
+    private HealthStatusPageDTO getHealthStatusPageDTO() {
+        return HealthStatusPageDTO.builder()
+                .status("someStatus")
+                .build();
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/InfrastructureTemplateResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/InfrastructureTemplateResourceTest.java
new file mode 100644
index 0000000..8031c3d
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/InfrastructureTemplateResourceTest.java
@@ -0,0 +1,182 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.InfrastructureTemplateService;
+import com.epam.datalab.dto.base.computational.FullComputationalTemplate;
+import com.epam.datalab.dto.imagemetadata.ComputationalMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ExploratoryMetadataDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+public class InfrastructureTemplateResourceTest extends TestBase {
+
+    private InfrastructureTemplateService infrastructureTemplateService = mock(InfrastructureTemplateService.class);
+
+    @Rule
+    public final ResourceTestRule resources =
+            getResourceTestRuleInstance(new InfrastructureTemplateResource(infrastructureTemplateService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void getComputationalTemplates() {
+        FullComputationalTemplate fullComputationalTemplate =
+                new FullComputationalTemplate(new ComputationalMetadataDTO());
+        when(infrastructureTemplateService.getComputationalTemplates(any(UserInfo.class), anyString(), anyString()))
+                .thenReturn(Collections.singletonList(fullComputationalTemplate));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_templates/test/endpoint/computational_templates")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(infrastructureTemplateService).getComputationalTemplates(getUserInfo(), "test", "endpoint");
+        verifyNoMoreInteractions(infrastructureTemplateService);
+    }
+
+    @Test
+    public void getComputationalTemplatesWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        FullComputationalTemplate fullComputationalTemplate =
+                new FullComputationalTemplate(new ComputationalMetadataDTO());
+        when(infrastructureTemplateService.getComputationalTemplates(any(UserInfo.class), anyString(), anyString()))
+                .thenReturn(Collections.singletonList(fullComputationalTemplate));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_templates/test/endpoint/computational_templates")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(infrastructureTemplateService).getComputationalTemplates(getUserInfo(), "test", "endpoint");
+        verifyNoMoreInteractions(infrastructureTemplateService);
+    }
+
+    @Test
+    public void getComputationalTemplatesWithException() {
+        doThrow(new DatalabException("Could not load list of computational templates for user"))
+                .when(infrastructureTemplateService).getComputationalTemplates(any(UserInfo.class), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_templates/test/endpoint/computational_templates")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(infrastructureTemplateService).getComputationalTemplates(getUserInfo(), "test", "endpoint");
+        verifyNoMoreInteractions(infrastructureTemplateService);
+    }
+
+    @Test
+    public void getExploratoryTemplates() {
+        ExploratoryMetadataDTO exploratoryMetadataDTO =
+                new ExploratoryMetadataDTO("someImageName");
+        when(infrastructureTemplateService.getExploratoryTemplates(any(UserInfo.class), anyString(), anyString()))
+                .thenReturn(Collections.singletonList(exploratoryMetadataDTO));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_templates/test/endpoint/exploratory_templates")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(Collections.singletonList(exploratoryMetadataDTO),
+                response.readEntity(new GenericType<List<ExploratoryMetadataDTO>>() {
+                }));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(infrastructureTemplateService).getExploratoryTemplates(getUserInfo(), "test", "endpoint");
+        verifyNoMoreInteractions(infrastructureTemplateService);
+    }
+
+    @Test
+    public void getExploratoryTemplatesWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        ExploratoryMetadataDTO exploratoryMetadataDTO =
+                new ExploratoryMetadataDTO("someImageName");
+        when(infrastructureTemplateService.getExploratoryTemplates(any(UserInfo.class), anyString(), anyString()))
+                .thenReturn(Collections.singletonList(exploratoryMetadataDTO));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_templates/test/endpoint/exploratory_templates")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(Collections.singletonList(exploratoryMetadataDTO),
+                response.readEntity(new GenericType<List<ExploratoryMetadataDTO>>() {
+                }));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(infrastructureTemplateService).getExploratoryTemplates(getUserInfo(), "test", "endpoint");
+        verifyNoMoreInteractions(infrastructureTemplateService);
+    }
+
+
+    @Test
+    public void getExploratoryTemplatesWithException() {
+        doThrow(new DatalabException("Could not load list of exploratory templates for user"))
+                .when(infrastructureTemplateService).getExploratoryTemplates(any(UserInfo.class), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_templates/test/endpoint/exploratory_templates")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(infrastructureTemplateService).getExploratoryTemplates(getUserInfo(), "test", "endpoint");
+        verifyNoMoreInteractions(infrastructureTemplateService);
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/KeycloakResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/KeycloakResourceTest.java
new file mode 100644
index 0000000..9f3dac6
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/KeycloakResourceTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.SecurityDAO;
+import com.epam.datalab.backendapi.service.KeycloakService;
+import com.epam.datalab.backendapi.service.SecurityService;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Rule;
+import org.junit.Test;
+import org.keycloak.representations.AccessTokenResponse;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+public class KeycloakResourceTest extends TestBase {
+    private SecurityService securityService = mock(SecurityService.class);
+    private SelfServiceApplicationConfiguration configuration = mock(SelfServiceApplicationConfiguration.class, RETURNS_DEEP_STUBS);
+    private SecurityDAO securityDAO = mock(SecurityDAO.class);
+    private KeycloakService keycloakService = mock(KeycloakService.class);
+
+    @Rule
+    public final ResourceTestRule resources = getResourceTestRuleInstance(
+            new KeycloakResource(securityService, configuration, securityDAO, keycloakService));
+
+    @Test
+    public void refreshAccessToken() {
+        when(keycloakService.generateAccessToken(anyString())).thenReturn(mock(AccessTokenResponse.class));
+
+        final Response response = resources.getJerseyTest()
+                .target("oauth/refresh/" + "refresh_token")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(""));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+        verify(keycloakService).generateAccessToken(anyString());
+        verifyNoMoreInteractions(keycloakService);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/LibExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/LibExploratoryResourceTest.java
new file mode 100644
index 0000000..d291698
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/LibExploratoryResourceTest.java
@@ -0,0 +1,443 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.resources.dto.LibInfoRecord;
+import com.epam.datalab.backendapi.resources.dto.LibInstallFormDTO;
+import com.epam.datalab.backendapi.resources.dto.LibKey;
+import com.epam.datalab.backendapi.resources.dto.LibraryDTO;
+import com.epam.datalab.backendapi.resources.dto.LibraryStatus;
+import com.epam.datalab.backendapi.resources.dto.SearchLibsFormDTO;
+import com.epam.datalab.backendapi.service.ExternalLibraryService;
+import com.epam.datalab.backendapi.service.LibraryService;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.dto.exploratory.LibInstallDTO;
+import com.epam.datalab.dto.exploratory.LibraryInstallDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.bson.Document;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.anyListOf;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+public class LibExploratoryResourceTest extends TestBase {
+    private static final String AUDIT_MESSAGE = "Install libs: %s";
+    private static final String LIB_GROUP = "group";
+    private static final String LIB_NAME = "name";
+    private static final String LIB_VERSION = "version";
+    private static final String EXPLORATORY_NAME = "explName";
+    private static final String PROJECT = "projectName";
+    private static final String COMPUTATIONAL_NAME = "compName";
+    private static final String UUID = "uid";
+    private ExploratoryDAO exploratoryDAO = mock(ExploratoryDAO.class);
+    private LibraryService libraryService = mock(LibraryService.class);
+    private RESTService provisioningService = mock(RESTService.class);
+    private ExternalLibraryService externalLibraryService = mock(ExternalLibraryService.class);
+    private RequestId requestId = mock(RequestId.class);
+
+    @Rule
+    public final ResourceTestRule resources = getResourceTestRuleInstance(
+            new LibExploratoryResource(exploratoryDAO, libraryService, externalLibraryService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void getComputeLibGroupList() {
+        when(libraryService.getComputeLibGroups()).thenReturn(Collections.emptyList());
+
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/lib-groups/compute")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(libraryService).getComputeLibGroups();
+        verifyNoMoreInteractions(libraryService);
+    }
+
+    @Test
+    public void getExploratoryLibGroupList() {
+        when(libraryService.getExploratoryLibGroups(any(UserInfo.class), anyString(), anyString())).thenReturn(Collections.emptyList());
+
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/lib-groups/exploratory")
+                .queryParam("project", "projectName")
+                .queryParam("exploratory", "explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(libraryService).getExploratoryLibGroups(getUserInfo(), "projectName", "explName");
+        verifyNoMoreInteractions(libraryService);
+    }
+
+    @Test
+    public void getLibList() {
+        when(libraryService.getLibs(anyString(), anyString(), anyString(), anyString())).thenReturn(getDocuments());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/lib_list")
+                .queryParam("project_name", "projectName")
+                .queryParam("exploratory_name", "explName")
+                .queryParam("computational_name", "compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getDocuments(), response.readEntity(new GenericType<List<Document>>() {
+        }));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(libraryService).getLibs(USER.toLowerCase(), "projectName", "explName", "compName");
+        verifyNoMoreInteractions(libraryService);
+    }
+
+    @Test
+    public void getLibListWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(libraryService.getLibs(anyString(), anyString(), anyString(), anyString())).thenReturn(getDocuments());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/lib_list")
+                .queryParam("project_name", "projectName")
+                .queryParam("exploratory_name", "explName")
+                .queryParam("computational_name", "compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getDocuments(), response.readEntity(new GenericType<List<Document>>() {
+        }));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(libraryService).getLibs(USER.toLowerCase(), "projectName", "explName", "compName");
+        verifyNoMoreInteractions(libraryService);
+    }
+
+    @Test
+    public void getLibListWithException() {
+        doThrow(new DatalabException("Cannot load installed libraries"))
+                .when(libraryService).getLibs(anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/lib_list")
+                .queryParam("project_name", "projectName")
+                .queryParam("exploratory_name", "explName")
+                .queryParam("computational_name", "compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(libraryService).getLibs(USER.toLowerCase(), "projectName", "explName", "compName");
+        verifyNoMoreInteractions(libraryService);
+    }
+
+    @Test
+    public void getLibListFormatted() {
+        when(libraryService.getLibInfo(anyString(), anyString(), anyString())).thenReturn(getLibInfoRecords());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/lib_list/formatted")
+                .queryParam("exploratory_name", "explName")
+                .queryParam("project_name", "projectName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(libraryService).getLibInfo(USER.toLowerCase(), "projectName", "explName");
+        verifyNoMoreInteractions(libraryService);
+    }
+
+    @Test
+    public void getLibListFormattedWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(libraryService.getLibInfo(anyString(), anyString(), anyString())).thenReturn(getLibInfoRecords());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/lib_list/formatted")
+                .queryParam("exploratory_name", "explName")
+                .queryParam("project_name", "projectName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(libraryService).getLibInfo(USER.toLowerCase(), "projectName", "explName");
+        verifyNoMoreInteractions(libraryService);
+    }
+
+    @Test
+    public void getLibListFormattedWithException() {
+        doThrow(new DatalabException("Cannot load  formatted list of installed libraries"))
+                .when(libraryService).getLibInfo(anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/lib_list/formatted")
+                .queryParam("exploratory_name", "explName")
+                .queryParam("project_name", "projectName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(libraryService).getLibInfo(USER.toLowerCase(), "projectName", "explName");
+        verifyNoMoreInteractions(libraryService);
+    }
+
+    @Test
+    public void libInstall() {
+        List<LibInstallDTO> libInstallDTOS = singletonList(new LibInstallDTO(LIB_GROUP, LIB_NAME, LIB_VERSION));
+        when(libraryService.installComputationalLibs(any(UserInfo.class), anyString(), anyString(),
+                anyString(), anyListOf(LibInstallDTO.class), anyString())).thenReturn(UUID);
+        LibInstallFormDTO libInstallFormDTO = new LibInstallFormDTO();
+        libInstallFormDTO.setComputationalName(COMPUTATIONAL_NAME);
+        libInstallFormDTO.setNotebookName(EXPLORATORY_NAME);
+        libInstallFormDTO.setProject(PROJECT);
+        libInstallFormDTO.setLibs(libInstallDTOS);
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/lib_install")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(libInstallFormDTO));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+        assertEquals(UUID, response.readEntity(String.class));
+
+        verify(libraryService).installComputationalLibs(refEq(getUserInfo()), eq(PROJECT),
+                eq(EXPLORATORY_NAME), eq(COMPUTATIONAL_NAME), eq(libInstallDTOS), eq(getAuditInfo(libInstallDTOS)));
+        verifyNoMoreInteractions(libraryService);
+        verifyZeroInteractions(provisioningService, requestId);
+    }
+
+
+    @Test
+    public void libInstallWithoutComputational() {
+        List<LibInstallDTO> libInstallDTOS = singletonList(new LibInstallDTO(LIB_GROUP, LIB_NAME, LIB_VERSION));
+        when(libraryService.installExploratoryLibs(any(UserInfo.class), anyString(), anyString(), anyListOf(LibInstallDTO.class), anyString())).thenReturn(UUID);
+        LibInstallFormDTO libInstallFormDTO = new LibInstallFormDTO();
+        libInstallFormDTO.setNotebookName(EXPLORATORY_NAME);
+        libInstallFormDTO.setLibs(libInstallDTOS);
+        libInstallFormDTO.setProject(PROJECT);
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/lib_install")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(libInstallFormDTO));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+        assertEquals(UUID, response.readEntity(String.class));
+
+        verify(libraryService).installExploratoryLibs(refEq(getUserInfo()), eq(PROJECT),
+                eq(EXPLORATORY_NAME), eq(libInstallDTOS), eq(getAuditInfo(libInstallDTOS)));
+        verifyNoMoreInteractions(libraryService);
+        verifyZeroInteractions(provisioningService, requestId);
+    }
+
+    @Test
+    public void getLibraryListWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(getUserInstanceDto());
+        SearchLibsFormDTO searchLibsFormDTO = new SearchLibsFormDTO();
+        searchLibsFormDTO.setComputationalName("compName");
+        searchLibsFormDTO.setNotebookName("explName");
+        searchLibsFormDTO.setGroup("someGroup");
+        searchLibsFormDTO.setStartWith("someText");
+        searchLibsFormDTO.setProjectName("projectName");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/search/lib_list")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(searchLibsFormDTO));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName", "compName");
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void getLibraryListWithException() {
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(getUserInstanceDto());
+        SearchLibsFormDTO searchLibsFormDTO = new SearchLibsFormDTO();
+        searchLibsFormDTO.setComputationalName("compName");
+        searchLibsFormDTO.setNotebookName("explName");
+        searchLibsFormDTO.setGroup("someGroup");
+        searchLibsFormDTO.setStartWith("someText");
+        searchLibsFormDTO.setProjectName("projectName");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/search/lib_list")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(searchLibsFormDTO));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName", "compName");
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void getLibraryListWithoutComputationalWithException() {
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString()))
+                .thenReturn(getUserInstanceDto());
+        SearchLibsFormDTO searchLibsFormDTO = new SearchLibsFormDTO();
+        searchLibsFormDTO.setComputationalName("");
+        searchLibsFormDTO.setNotebookName("explName");
+        searchLibsFormDTO.setGroup("someGroup");
+        searchLibsFormDTO.setStartWith("someText");
+        searchLibsFormDTO.setProjectName("projectName");
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/search/lib_list")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(searchLibsFormDTO));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName");
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void getMavenArtifact() {
+        when(externalLibraryService.getLibrary(anyString(), anyString(), anyString())).thenReturn(libraryDto());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/search/lib_list/maven")
+                .queryParam("artifact", "group:artifact:version")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+        final LibraryDTO libraryDTO = response.readEntity(LibraryDTO.class);
+        assertEquals("test", libraryDTO.getName());
+        assertEquals("1.0", libraryDTO.getVersion());
+
+        verify(externalLibraryService).getLibrary("group", "artifact", "version");
+        verifyNoMoreInteractions(externalLibraryService);
+    }
+
+    @Test
+    public void getMavenArtifactWithValidationException() {
+        when(externalLibraryService.getLibrary(anyString(), anyString(), anyString())).thenReturn(libraryDto());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/search/lib_list/maven")
+                .queryParam("artifact", "group:artifact")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_BAD_REQUEST, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        assertEquals("{\"errors\":[\"query param artifact Wrong library name format. Should be <groupId>:<artifactId>:<versionId>\"]}",
+                response.readEntity(String.class));
+
+        verifyZeroInteractions(externalLibraryService);
+    }
+
+    private LibraryDTO libraryDto() {
+        return new LibraryDTO(
+                "test", "1.0");
+    }
+
+    private UserInstanceDTO getUserInstanceDto() {
+        UserComputationalResource ucResource = new UserComputationalResource();
+        ucResource.setComputationalName("compName");
+        return new UserInstanceDTO()
+                .withUser(USER)
+                .withExploratoryName("explName")
+                .withProject(PROJECT)
+                .withResources(singletonList(ucResource));
+    }
+
+    private List<Document> getDocuments() {
+        return singletonList(new Document());
+    }
+
+    private List<LibInfoRecord> getLibInfoRecords() {
+        return singletonList(new LibInfoRecord(
+                new LibKey(), singletonList(new LibraryStatus())));
+    }
+
+    private LibraryInstallDTO getLibraryInstallDTO() {
+        return new LibraryInstallDTO().withComputationalName("compName");
+    }
+
+    private String getAuditInfo(List<LibInstallDTO> libs) {
+        return String.format(AUDIT_MESSAGE, libs
+                .stream()
+                .map(LibInstallDTO::getName)
+                .collect(Collectors.joining(", ")));
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ProjectResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ProjectResourceTest.java
new file mode 100644
index 0000000..0dee149
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/ProjectResourceTest.java
@@ -0,0 +1,305 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.BudgetDTO;
+import com.epam.datalab.backendapi.domain.CreateProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
+import com.epam.datalab.backendapi.domain.UpdateProjectBudgetDTO;
+import com.epam.datalab.backendapi.domain.UpdateProjectDTO;
+import com.epam.datalab.backendapi.resources.dto.KeysDTO;
+import com.epam.datalab.backendapi.resources.dto.ProjectActionFormDTO;
+import com.epam.datalab.backendapi.service.AccessKeyService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceConflictException;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.anyList;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+public class ProjectResourceTest extends TestBase {
+
+    private static final String PROJECT_NAME = "DATALAB";
+
+    private final ProjectService projectService = mock(ProjectService.class);
+    private final AccessKeyService keyService = mock(AccessKeyService.class);
+
+    @Rule
+    public final ResourceTestRule resources = getResourceTestRuleInstance(
+            new ProjectResource(projectService, keyService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void createProject() {
+        CreateProjectDTO createProjectDTO = returnCreateProjectDTO();
+        final Response response = resources.getJerseyTest()
+                .target("project")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(createProjectDTO));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        verify(projectService).create(getUserInfo(), prepareProjectDTO(createProjectDTO), createProjectDTO.getName());
+        verifyNoMoreInteractions(projectService);
+    }
+
+    @Test
+    public void createExistingProject() {
+        CreateProjectDTO createProjectDTO = returnCreateProjectDTO();
+        doThrow(new ResourceConflictException("Project with passed name already exist in system"))
+                .when(projectService).create(any(UserInfo.class), any(ProjectDTO.class), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("project")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(createProjectDTO));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        verify(projectService).create(getUserInfo(), prepareProjectDTO(createProjectDTO), createProjectDTO.getName());
+        verifyNoMoreInteractions(projectService);
+    }
+
+    @Test
+    public void recreateProject() {
+        final Response response = resources.getJerseyTest()
+                .target("project/recreate")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getProjectActionDTO()));
+
+        assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
+        verify(projectService).recreate(getUserInfo(), ENDPOINT_NAME, PROJECT_NAME);
+        verifyNoMoreInteractions(projectService);
+    }
+
+    @Test
+    public void startProject() {
+        final Response response = resources.getJerseyTest()
+                .target("project/start")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getProjectActionDTO()));
+
+        assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
+        verify(projectService).start(getUserInfo(), Collections.singletonList(ENDPOINT_NAME), PROJECT_NAME);
+        verifyNoMoreInteractions(projectService);
+    }
+
+    @Test
+    public void stopProject() {
+        final Response response = resources.getJerseyTest()
+                .target("project/stop")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getProjectActionDTO()));
+
+        assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
+        verify(projectService).stopWithResources(getUserInfo(), Collections.singletonList(ENDPOINT_NAME), PROJECT_NAME);
+        verifyNoMoreInteractions(projectService);
+    }
+
+    @Test
+    public void getProject() {
+        when(projectService.get(anyString())).thenReturn(ProjectDTO.builder().name(PROJECT_NAME).build());
+
+        final Response response = resources.getJerseyTest()
+                .target("project/" + PROJECT_NAME)
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+        verify(projectService).get(PROJECT_NAME);
+        verifyNoMoreInteractions(projectService);
+    }
+
+    @Test
+    public void getProjects() {
+        when(projectService.getProjects(any(UserInfo.class))).thenReturn(Collections.singletonList(ProjectDTO.builder().name(PROJECT_NAME).build()));
+
+        final Response response = resources.getJerseyTest()
+                .target("project")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+        verify(projectService).getProjects(getUserInfo());
+        verifyNoMoreInteractions(projectService);
+    }
+
+    @Test
+    public void getUserProjects() {
+        when(projectService.getUserProjects(getUserInfo(), false)).thenReturn(Collections.singletonList(ProjectDTO.builder().name(PROJECT_NAME).build()));
+
+        final Response response = resources.getJerseyTest()
+                .target("project/me")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+        verify(projectService).getUserProjects(getUserInfo(), Boolean.FALSE);
+        verifyNoMoreInteractions(projectService);
+    }
+
+    @Test
+    public void updateProject() {
+        doNothing().when(projectService).update(any(UserInfo.class), any(UpdateProjectDTO.class), anyString());
+
+        final Response response = resources.getJerseyTest()
+                .target("project")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .put(Entity.json(prepareUpdateProjectDTO()));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        verify(projectService).update(getUserInfo(), prepareUpdateProjectDTO(), PROJECT_NAME);
+        verifyNoMoreInteractions(projectService);
+    }
+
+    @Test
+    public void removeProjectEndpoint() {
+        doNothing().when(projectService).terminateEndpoint(any(UserInfo.class), anyList(), anyString());
+
+        final Response response = resources.getJerseyTest()
+                .target("project/terminate")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(prepareProjectActionFormDTO()));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        verify(projectService).terminateEndpoint(getUserInfo(), prepareProjectActionFormDTO().getEndpoints(), prepareProjectActionFormDTO().getProjectName());
+        verifyNoMoreInteractions(projectService);
+    }
+
+    @Test
+    public void updateBudget() {
+        doNothing().when(projectService).updateBudget(any(UserInfo.class), anyList());
+
+        final Response response = resources.getJerseyTest()
+                .target("project/budget")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .put(Entity.json((prepareUpdateProjectBudgetDTOs())));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+
+        verify(projectService).updateBudget(getUserInfo(), prepareUpdateProjectBudgetDTOs());
+        verifyNoMoreInteractions(projectService);
+    }
+
+    @Test
+    public void generate() {
+        when(keyService.generateKeys(any(UserInfo.class))).thenReturn(new KeysDTO("somePublicKey", "somePrivateKey", "user"));
+
+        final Response response = resources.getJerseyTest()
+                .target("/project/keys")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(""));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(keyService).generateKeys(getUserInfo());
+        verifyNoMoreInteractions(keyService);
+    }
+
+    @Test
+    public void generateKeysWithException() {
+        doThrow(new DatalabException("Can not generate private/public key pair due to"))
+                .when(keyService).generateKeys(any(UserInfo.class));
+
+        final Response response = resources.getJerseyTest()
+                .target("/project/keys")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(""));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(keyService).generateKeys(getUserInfo());
+        verifyNoMoreInteractions(keyService);
+    }
+
+    private CreateProjectDTO returnCreateProjectDTO() {
+        return new CreateProjectDTO(PROJECT_NAME, Collections.emptySet(), Collections.emptySet(), "ssh-testKey", "testTag");
+    }
+
+    private ProjectDTO prepareProjectDTO(CreateProjectDTO createProjectDTO) {
+        List<ProjectEndpointDTO> projectEndpointDTOS = createProjectDTO.getEndpoints()
+                .stream()
+                .map(e -> new ProjectEndpointDTO(e, UserInstanceStatus.CREATING, null))
+                .collect(Collectors.toList());
+
+        return new ProjectDTO(createProjectDTO.getName(), createProjectDTO.getGroups(), createProjectDTO.getKey(), createProjectDTO.getTag(),
+                new BudgetDTO(), projectEndpointDTOS, createProjectDTO.isSharedImageEnabled());
+    }
+
+    private ProjectActionFormDTO getProjectActionDTO() {
+        return new ProjectActionFormDTO(PROJECT_NAME, Collections.singletonList(ENDPOINT_NAME));
+    }
+
+    private UpdateProjectDTO prepareUpdateProjectDTO() {
+        return new UpdateProjectDTO(PROJECT_NAME, Collections.emptySet(), Collections.emptySet(), Boolean.TRUE);
+    }
+
+    private ProjectActionFormDTO prepareProjectActionFormDTO() {
+        return new ProjectActionFormDTO(PROJECT_NAME, Collections.singletonList(ENDPOINT_NAME));
+    }
+
+    private List<UpdateProjectBudgetDTO> prepareUpdateProjectBudgetDTOs() {
+        return Collections.singletonList(new UpdateProjectBudgetDTO(PROJECT_NAME, 123, Boolean.FALSE));
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/SchedulerJobResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/SchedulerJobResourceTest.java
new file mode 100644
index 0000000..36758fb
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/SchedulerJobResourceTest.java
@@ -0,0 +1,341 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.service.SchedulerJobService;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.exceptions.ResourceInappropriateStateException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.model.scheduler.SchedulerJobData;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+public class SchedulerJobResourceTest extends TestBase {
+
+    private SchedulerJobService schedulerJobService = mock(SchedulerJobService.class);
+
+    @Rule
+    public final ResourceTestRule resources =
+            getResourceTestRuleInstance(new SchedulerJobResource(schedulerJobService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void updateExploratoryScheduler() {
+        doNothing().when(schedulerJobService)
+                .updateExploratorySchedulerData(any(UserInfo.class), anyString(), anyString(), any(SchedulerJobDTO.class));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getSchedulerJobDTO()));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).updateExploratorySchedulerData(getUserInfo(), "projectName",
+                "explName", getSchedulerJobDTO());
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+    @Test
+    public void updateExploratorySchedulerWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        doNothing().when(schedulerJobService)
+                .updateExploratorySchedulerData(any(UserInfo.class), anyString(), anyString(), any(SchedulerJobDTO.class));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
+                .request()
+                .header("Authorization", String.join(" ", "Bearer", TOKEN))
+                .post(Entity.json(getSchedulerJobDTO()));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).updateExploratorySchedulerData(getUserInfo(), "projectName",
+                "explName", getSchedulerJobDTO());
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+    @Test
+    public void updateExploratorySchedulerWithException() {
+        doThrow(new ResourceInappropriateStateException("Can't create/update scheduler for user instance with status"))
+                .when(schedulerJobService).updateExploratorySchedulerData(any(UserInfo.class), anyString(), anyString(),
+                any(SchedulerJobDTO.class));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getSchedulerJobDTO()));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).updateExploratorySchedulerData(getUserInfo(), "projectName",
+                "explName", getSchedulerJobDTO());
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+    @Test
+    public void upsertComputationalScheduler() {
+        doNothing().when(schedulerJobService)
+                .updateComputationalSchedulerData(any(UserInfo.class), anyString(), anyString(), anyString(), any(SchedulerJobDTO.class));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getSchedulerJobDTO()));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).updateComputationalSchedulerData(getUserInfo(), "projectName",
+                "explName", "compName", getSchedulerJobDTO());
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+    @Test
+    public void upsertComputationalSchedulerWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        doNothing().when(schedulerJobService)
+                .updateComputationalSchedulerData(any(UserInfo.class), anyString(), anyString(), anyString(), any(SchedulerJobDTO.class));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getSchedulerJobDTO()));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).updateComputationalSchedulerData(getUserInfo(), "projectName",
+                "explName", "compName", getSchedulerJobDTO());
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+    @Test
+    public void upsertComputationalSchedulerWithException() {
+        doThrow(new ResourceInappropriateStateException("Can't create/update scheduler for user instance with status"))
+                .when(schedulerJobService).updateComputationalSchedulerData(any(UserInfo.class), anyString(), anyString(),
+                anyString(), any(SchedulerJobDTO.class));
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getSchedulerJobDTO()));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).updateComputationalSchedulerData(getUserInfo(), "projectName",
+                "explName", "compName", getSchedulerJobDTO());
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+    @Test
+    public void fetchSchedulerJobForUserAndExploratory() {
+        when(schedulerJobService.fetchSchedulerJobForUserAndExploratory(anyString(), anyString(), anyString()))
+                .thenReturn(getSchedulerJobDTO());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getSchedulerJobDTO(), response.readEntity(SchedulerJobDTO.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).fetchSchedulerJobForUserAndExploratory(USER.toLowerCase(), "projectName", "explName");
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+    @Test
+    public void fetchSchedulerJobForUserAndExploratoryWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(schedulerJobService.fetchSchedulerJobForUserAndExploratory(anyString(), anyString(), anyString()))
+                .thenReturn(getSchedulerJobDTO());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getSchedulerJobDTO(), response.readEntity(SchedulerJobDTO.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).fetchSchedulerJobForUserAndExploratory(USER.toLowerCase(), "projectName", "explName");
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+
+    @Test
+    public void fetchSchedulerJobForUserAndExploratoryWithException() {
+        doThrow(new ResourceNotFoundException("Scheduler job data not found for user with exploratory"))
+                .when(schedulerJobService).fetchSchedulerJobForUserAndExploratory(anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).fetchSchedulerJobForUserAndExploratory(USER.toLowerCase(), "projectName", "explName");
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+    @Test
+    public void fetchSchedulerJobForComputationalResource() {
+        when(schedulerJobService.fetchSchedulerJobForComputationalResource(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(getSchedulerJobDTO());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getSchedulerJobDTO(), response.readEntity(SchedulerJobDTO.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).fetchSchedulerJobForComputationalResource(USER.toLowerCase(), "projectName",
+                "explName", "compName");
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+    @Test
+    public void fetchSchedulerJobForComputationalResourceWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(schedulerJobService.fetchSchedulerJobForComputationalResource(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(getSchedulerJobDTO());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(getSchedulerJobDTO(), response.readEntity(SchedulerJobDTO.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).fetchSchedulerJobForComputationalResource(USER.toLowerCase(), "projectName",
+                "explName", "compName");
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+    @Test
+    public void fetchSchedulerJobForComputationalResourceWithException() {
+        doThrow(new ResourceNotFoundException("Scheduler job data not found for user with exploratory with " +
+                "computational resource")).when(schedulerJobService)
+                .fetchSchedulerJobForComputationalResource(anyString(), anyString(), anyString(), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).fetchSchedulerJobForComputationalResource(USER.toLowerCase(), "projectName",
+                "explName", "compName");
+        verifyNoMoreInteractions(schedulerJobService);
+    }
+
+    @Test
+    public void testGetActiveSchedulers() {
+        when(schedulerJobService.getActiveSchedulers(anyString(), anyLong()))
+                .thenReturn(Collections.singletonList(new SchedulerJobData(USER, "exploratoryName", null,
+                        "project", getSchedulerJobDTO())));
+        final long minuteOffset = 10L;
+        final Response response = resources.getJerseyTest()
+                .target("/infrastructure_provision/exploratory_environment/scheduler/active")
+                .queryParam("minuteOffset", minuteOffset)
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+        final List<SchedulerJobData> activeSchedulers = response.readEntity(new GenericType<List<SchedulerJobData>>() {
+        });
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(1, activeSchedulers.size());
+        assertEquals(Collections.singletonList(new SchedulerJobData(USER, "exploratoryName", null,
+                "project", getSchedulerJobDTO())), activeSchedulers);
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(schedulerJobService).getActiveSchedulers(USER.toLowerCase(), minuteOffset);
+        verifyNoMoreInteractions(schedulerJobService);
+
+    }
+
+    private SchedulerJobDTO getSchedulerJobDTO() {
+        SchedulerJobDTO schedulerJobDTO = new SchedulerJobDTO();
+        schedulerJobDTO.setTimeZoneOffset(OffsetDateTime.now(ZoneId.systemDefault()).getOffset());
+        schedulerJobDTO.setBeginDate(LocalDate.now());
+        schedulerJobDTO.setFinishDate(LocalDate.now().plusDays(1));
+        schedulerJobDTO.setStartTime(LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        schedulerJobDTO.setEndTime(LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        schedulerJobDTO.setTerminateDateTime(
+                LocalDateTime.of(LocalDate.now(), LocalTime.now().truncatedTo(ChronoUnit.MINUTES)));
+        schedulerJobDTO.setStartDaysRepeat(Arrays.asList(DayOfWeek.values()));
+        schedulerJobDTO.setStopDaysRepeat(Arrays.asList(DayOfWeek.values()));
+        schedulerJobDTO.setSyncStartRequired(false);
+        return schedulerJobDTO;
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/SystemInfoResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/SystemInfoResourceTest.java
new file mode 100644
index 0000000..aa75bac
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/SystemInfoResourceTest.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.backendapi.resources.dto.SystemInfoDto;
+import com.epam.datalab.backendapi.service.SystemInfoService;
+import com.epam.datalab.model.systeminfo.DiskInfo;
+import com.epam.datalab.model.systeminfo.MemoryInfo;
+import com.epam.datalab.model.systeminfo.OsInfo;
+import com.epam.datalab.model.systeminfo.ProcessorInfo;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+public class SystemInfoResourceTest extends TestBase {
+
+    private SystemInfoService systemInfoService = mock(SystemInfoService.class);
+
+    @Rule
+    public final ResourceTestRule resources = getResourceTestRuleInstance(new SystemInfoResource(systemInfoService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void getSystemInfo() {
+        when(systemInfoService.getSystemInfo()).thenReturn(getSystemInfoDto());
+        final Response response = resources.getJerseyTest()
+                .target("/sysinfo")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(systemInfoService).getSystemInfo();
+        verifyNoMoreInteractions(systemInfoService);
+    }
+
+    @Test
+    public void getSystemInfoWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(systemInfoService.getSystemInfo()).thenReturn(getSystemInfoDto());
+        final Response response = resources.getJerseyTest()
+                .target("/sysinfo")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verifyZeroInteractions(systemInfoService);
+    }
+
+    private SystemInfoDto getSystemInfoDto() {
+        OsInfo osInfo = OsInfo.builder()
+                .family(System.getProperty("os.name"))
+                .buildNumber(System.getProperty("os.version"))
+                .build();
+        ProcessorInfo processorInfo = ProcessorInfo.builder().build();
+        MemoryInfo memoryInfo = MemoryInfo.builder().build();
+        DiskInfo diskInfo = DiskInfo.builder().build();
+        return new SystemInfoDto(osInfo, processorInfo, memoryInfo, Collections.singletonList(diskInfo));
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/TestBase.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/TestBase.java
new file mode 100644
index 0000000..43169b1
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/TestBase.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.rest.mappers.ResourceNotFoundExceptionMapper;
+import io.dropwizard.auth.AuthDynamicFeature;
+import io.dropwizard.auth.AuthValueFactoryProvider;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.auth.Authenticator;
+import io.dropwizard.auth.Authorizer;
+import io.dropwizard.auth.oauth.OAuthCredentialAuthFilter;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.glassfish.jersey.media.multipart.MultiPartFeature;
+import org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature;
+import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory;
+
+import java.util.Optional;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class TestBase {
+
+    protected final String TOKEN = "TOKEN";
+    protected final String USER = "testUser";
+    protected final String ENDPOINT_NAME = "local";
+    protected final String ENDPOINT_URL = "http://localhost:8443/";
+    protected final String ENDPOINT_ACCOUNT = "account";
+    protected final String ENDPOINT_TAG = "tag";
+
+    @SuppressWarnings("unchecked")
+    private static Authenticator<String, UserInfo> authenticator = mock(Authenticator.class);
+    @SuppressWarnings("unchecked")
+    private static Authorizer<UserInfo> authorizer = mock(Authorizer.class);
+
+    protected <T> ResourceTestRule getResourceTestRuleInstance(T resourceInstance) {
+        return ResourceTestRule.builder()
+                .bootstrapLogging(false)
+                .setTestContainerFactory(new GrizzlyWebTestContainerFactory())
+                .addProvider(new AuthDynamicFeature(new OAuthCredentialAuthFilter.Builder<UserInfo>()
+                        .setAuthenticator(authenticator)
+                        .setAuthorizer(authorizer)
+                        .setRealm("SUPER SECRET STUFF")
+                        .setPrefix("Bearer")
+                        .buildAuthFilter()))
+                .addProvider(RolesAllowedDynamicFeature.class)
+                .addProvider(new ResourceNotFoundExceptionMapper())
+                .addProvider(new AuthValueFactoryProvider.Binder<>(UserInfo.class))
+                .addProvider(MultiPartFeature.class)
+                .addResource(resourceInstance)
+                .build();
+    }
+
+    protected void authSetup() throws AuthenticationException {
+        when(authenticator.authenticate(TOKEN)).thenReturn(Optional.of(getUserInfo()));
+        when(authorizer.authorize(any(), any())).thenReturn(true);
+    }
+
+    protected void authFailSetup() throws AuthenticationException {
+        when(authenticator.authenticate(TOKEN)).thenReturn(Optional.of(getUserInfo()));
+        when(authorizer.authorize(any(), any())).thenReturn(false);
+    }
+
+    protected UserInfo getUserInfo() {
+        return new UserInfo(USER, TOKEN);
+    }
+
+    protected EndpointDTO getEndpointDTO() {
+        return new EndpointDTO(ENDPOINT_NAME, ENDPOINT_URL, ENDPOINT_ACCOUNT, ENDPOINT_TAG, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/UserGroupResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/UserGroupResourceTest.java
new file mode 100644
index 0000000..1aba319
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/UserGroupResourceTest.java
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.ProjectDAO;
+import com.epam.datalab.backendapi.resources.dto.GroupDTO;
+import com.epam.datalab.backendapi.resources.dto.UpdateGroupDTO;
+import com.epam.datalab.backendapi.resources.dto.UserGroupDto;
+import com.epam.datalab.backendapi.service.UserGroupService;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+public class UserGroupResourceTest extends TestBase {
+
+    private static final String USER = "user";
+    private static final String ROLE_ID = "id";
+    private static final String ROLE_DESCRIPTION = "description";
+    private static final String GROUP = "group";
+    private UserGroupService userGroupService = mock(UserGroupService.class);
+    private ProjectDAO projectDAO = mock(ProjectDAO.class);
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Rule
+    public final ResourceTestRule resources =
+            getResourceTestRuleInstance(new UserGroupResource(userGroupService));
+
+    @Test
+    public void createGroup() {
+
+        final Response response = resources.getJerseyTest()
+                .target("/group")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getCreateGroupDto(GROUP, Collections.singletonMap(ROLE_ID, ROLE_DESCRIPTION))));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+
+        verify(userGroupService).createGroup(getUserInfo(), GROUP, Collections.singleton(ROLE_ID), Collections.singleton(USER));
+        verifyNoMoreInteractions(userGroupService);
+    }
+
+    @Test
+    public void createGroupWhenGroupNameIsEmpty() {
+
+        final Response response = resources.getJerseyTest()
+                .target("/group")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getCreateGroupDto("", Collections.singletonMap(ROLE_ID, ROLE_DESCRIPTION))));
+
+        assertEquals(HttpStatus.SC_UNPROCESSABLE_ENTITY, response.getStatus());
+
+        verifyZeroInteractions(userGroupService);
+    }
+
+    @Test
+    public void createGroupWhenRoleIdIsEmpty() {
+
+        final Response response = resources.getJerseyTest()
+                .target("/group")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getCreateGroupDto(GROUP, Collections.emptyMap())));
+
+        assertEquals(HttpStatus.SC_UNPROCESSABLE_ENTITY, response.getStatus());
+
+        verifyZeroInteractions(userGroupService);
+    }
+
+    @Test
+    public void updateGroup() {
+
+        final Response response = resources.getJerseyTest()
+                .target("/group")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .put(Entity.json(getUpdaeGroupDto(GROUP, Collections.singletonMap(ROLE_ID, ROLE_DESCRIPTION), Collections.singleton(USER))));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+
+        verify(userGroupService).updateGroup(getUserInfo(), GROUP, Collections.singletonMap(ROLE_ID, ROLE_DESCRIPTION), Collections.singleton(USER));
+        verifyNoMoreInteractions(userGroupService);
+    }
+
+    @Test
+    public void getGroups() {
+        when(userGroupService.getAggregatedRolesByGroup(any(UserInfo.class))).thenReturn(Collections.singletonList(getUserGroup()));
+
+        final Response response = resources.getJerseyTest()
+                .target("/group")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        final List<UserGroupDto> actualRoles = response.readEntity(new GenericType<List<UserGroupDto>>() {
+        });
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(GROUP, actualRoles.get(0).getGroup());
+        assertTrue(actualRoles.get(0).getRoles().isEmpty());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(userGroupService).getAggregatedRolesByGroup(getUserInfo());
+        verifyNoMoreInteractions(userGroupService);
+    }
+
+    @Test
+    public void deleteGroup() {
+        final Response response = resources.getJerseyTest()
+                .target("/group/" + GROUP)
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .delete();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+
+
+        verify(userGroupService).removeGroup(getUserInfo(), GROUP);
+        verifyNoMoreInteractions(userGroupService);
+    }
+
+    private UserGroupDto getUserGroup() {
+        return new UserGroupDto(GROUP, Collections.emptyList(), Collections.emptySet());
+    }
+
+    private GroupDTO getCreateGroupDto(String group, Map<String, String> roleIds) {
+        final GroupDTO dto = new GroupDTO();
+        dto.setName(group);
+        dto.setRoleIds(roleIds);
+        dto.setUsers(Collections.singleton(USER));
+        return dto;
+    }
+
+    private UpdateGroupDTO getUpdaeGroupDto(String group, Map<String, String> roles, Set<String> users) {
+        UpdateGroupDTO updateGroupDTO = new UpdateGroupDTO();
+        updateGroupDTO.setName(group);
+        updateGroupDTO.setRoles(roles);
+        updateGroupDTO.setUsers(users);
+        return updateGroupDTO;
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/UserRoleResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/UserRoleResourceTest.java
new file mode 100644
index 0000000..5799c0d
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/UserRoleResourceTest.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.backendapi.resources.dto.UserRoleDTO;
+import com.epam.datalab.backendapi.service.UserRoleService;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+public class UserRoleResourceTest extends TestBase {
+
+
+    private static final String USER = "user";
+    private static final String ROLE_ID = "id";
+
+    private UserRoleService rolesService = mock(UserRoleService.class);
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Rule
+    public final ResourceTestRule resources =
+            getResourceTestRuleInstance(new UserRoleResource(rolesService));
+
+
+    @Test
+    public void getRoles() {
+        when(rolesService.getUserRoles()).thenReturn(Collections.singletonList(getUserRole()));
+
+        final Response response = resources.getJerseyTest()
+                .target("/role")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        final List<UserRoleDTO> actualRoles = response.readEntity(new GenericType<List<UserRoleDTO>>() {
+        });
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals(ROLE_ID, actualRoles.get(0).getId());
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(rolesService).getUserRoles();
+        verifyNoMoreInteractions(rolesService);
+    }
+
+    @Test
+    public void createRole() {
+
+        final Response response = resources.getJerseyTest()
+                .target("/role")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json(getUserRole()));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+
+        verify(rolesService).createRole(refEq(getUserRole()));
+        verifyNoMoreInteractions(rolesService);
+    }
+
+    private UserRoleDTO getUserRole() {
+        final UserRoleDTO userRoleDto = new UserRoleDTO();
+        userRoleDto.setId(ROLE_ID);
+        return userRoleDto;
+    }
+
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/UserSettingsResourceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/UserSettingsResourceTest.java
new file mode 100644
index 0000000..2a03626
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/resources/UserSettingsResourceTest.java
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.resources;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.resources.dto.UserDTO;
+import com.epam.datalab.backendapi.service.UserSettingService;
+import io.dropwizard.auth.AuthenticationException;
+import io.dropwizard.testing.junit.ResourceTestRule;
+import org.apache.http.HttpHeaders;
+import org.apache.http.HttpStatus;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.refEq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+public class UserSettingsResourceTest extends TestBase {
+
+    private UserSettingService userSettingService = mock(UserSettingService.class);
+
+    @Rule
+    public final ResourceTestRule resources =
+            getResourceTestRuleInstance(new UserSettingsResource(userSettingService));
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void getSettings() {
+        when(userSettingService.getUISettings(any(UserInfo.class))).thenReturn("someSettings");
+        final Response response = resources.getJerseyTest()
+                .target("/user/settings")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals("someSettings", response.readEntity(String.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(userSettingService).getUISettings(refEq(getUserInfo()));
+        verifyNoMoreInteractions(userSettingService);
+    }
+
+    @Test
+    public void getSettingsWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        when(userSettingService.getUISettings(any(UserInfo.class))).thenReturn("someSettings");
+        final Response response = resources.getJerseyTest()
+                .target("/user/settings")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .get();
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertEquals("someSettings", response.readEntity(String.class));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(userSettingService).getUISettings(refEq(getUserInfo()));
+        verifyNoMoreInteractions(userSettingService);
+    }
+
+    @Test
+    public void saveSettings() {
+        doNothing().when(userSettingService).saveUISettings(any(UserInfo.class), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/user/settings")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json("someSettings"));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(userSettingService).saveUISettings(refEq(getUserInfo()), eq("someSettings"));
+        verifyNoMoreInteractions(userSettingService);
+    }
+
+    @Test
+    public void saveSettingsWithFailedAuth() throws AuthenticationException {
+        authFailSetup();
+        doNothing().when(userSettingService).saveUISettings(any(UserInfo.class), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/user/settings")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json("someSettings"));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(userSettingService).saveUISettings(refEq(getUserInfo()), eq("someSettings"));
+        verifyNoMoreInteractions(userSettingService);
+    }
+
+    @Test
+    public void saveSettingsWithException() {
+        doThrow(new RuntimeException()).when(userSettingService).saveUISettings(any(UserInfo.class), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/user/settings")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .post(Entity.json("someSettings"));
+
+        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
+        assertTrue(response.readEntity(String.class).contains("{\"code\":500,\"message\":\"There was an error " +
+                "processing your request. It has been logged"));
+        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(userSettingService).saveUISettings(refEq(getUserInfo()), eq("someSettings"));
+        verifyNoMoreInteractions(userSettingService);
+    }
+
+    @Test
+    public void saveAllowedBudget() {
+        doNothing().when(userSettingService).saveUISettings(any(UserInfo.class), anyString());
+        final Response response = resources.getJerseyTest()
+                .target("/user/settings/budget")
+                .request()
+                .header("Authorization", "Bearer " + TOKEN)
+                .put(Entity.json(singletonList(new UserDTO(USER, 10, UserDTO.Status.ACTIVE))));
+
+        assertEquals(HttpStatus.SC_OK, response.getStatus());
+        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        verify(userSettingService).updateUsersBudget(singletonList(new UserDTO(USER, 10, UserDTO.Status.ACTIVE)));
+        verifyNoMoreInteractions(userSettingService);
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/roles/UserRolesTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/roles/UserRolesTest.java
new file mode 100644
index 0000000..cd9b490
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/roles/UserRolesTest.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.roles;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.SecurityDAO;
+import com.mongodb.client.FindIterable;
+import com.mongodb.client.MongoCursor;
+import org.bson.Document;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class UserRolesTest {
+
+    @Mock
+    private SecurityDAO dao;
+
+    @Test
+    @SuppressWarnings("unchecked")
+    public void checkAccess() {
+        UserInfo userInfoDev = new UserInfo("developer", "token123");
+        userInfoDev.addRole("dev");
+        List<String> shapes1 = new ArrayList<>();
+        shapes1.add("shape_1");
+        shapes1.add("shape_2");
+        shapes1.add("shape_3");
+        ArrayList<String> devGroup = new ArrayList<>();
+        devGroup.add("dev");
+        Document doc1 = new Document().append("exploratory_shapes", shapes1).append("groups", devGroup);
+
+        UserInfo userInfoTest = new UserInfo("tester", "token321");
+        userInfoTest.addRole("test");
+        List<String> shapes2 = new ArrayList<>();
+        shapes2.add("shape_2");
+        shapes2.add("shape_3");
+        ArrayList<String> testGroup = new ArrayList<>();
+        testGroup.add("test");
+        Document doc2 = new Document().append("exploratory_shapes", shapes2).append("groups", testGroup);
+
+        MongoCursor cursor = mock(MongoCursor.class);
+
+        FindIterable mockIterable = mock(FindIterable.class);
+
+        when(dao.getRoles()).thenReturn(mockIterable);
+        when(mockIterable.iterator()).thenReturn(cursor);
+        when(cursor.hasNext()).thenReturn(true).thenReturn(true).thenReturn(false);
+        when(cursor.next()).thenReturn(doc1).thenReturn(doc2);
+        UserRoles.initialize(dao, true);
+
+        assertTrue(UserRoles.checkAccess(userInfoDev, RoleType.EXPLORATORY_SHAPES, "shape_1", userInfoDev.getRoles()));
+        assertTrue(UserRoles.checkAccess(userInfoDev, RoleType.EXPLORATORY_SHAPES, "shape_2", userInfoDev.getRoles()));
+        assertTrue(UserRoles.checkAccess(userInfoDev, RoleType.EXPLORATORY_SHAPES, "shape_3", userInfoDev.getRoles()));
+        assertTrue(UserRoles.checkAccess(userInfoDev, RoleType.EXPLORATORY_SHAPES, "someShape", userInfoDev.getRoles()));
+
+        assertFalse(UserRoles.checkAccess(userInfoTest, RoleType.EXPLORATORY_SHAPES, "shape_1", userInfoTest.getRoles()));
+        assertFalse(UserRoles.checkAccess(userInfoTest, RoleType.EXPLORATORY_SHAPES, "shape_2", userInfoTest.getRoles()));
+        assertFalse(UserRoles.checkAccess(userInfoTest, RoleType.EXPLORATORY_SHAPES, "shape_3", userInfoTest.getRoles()));
+        assertTrue(UserRoles.checkAccess(userInfoTest, RoleType.EXPLORATORY_SHAPES, "someShape", userInfoTest.getRoles()));
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/schedulers/CheckApplicationQuoteSchedulerTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/schedulers/CheckApplicationQuoteSchedulerTest.java
new file mode 100644
index 0000000..dc05a1a
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/schedulers/CheckApplicationQuoteSchedulerTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers;
+
+import com.epam.datalab.backendapi.dao.BillingDAO;
+import com.epam.datalab.backendapi.service.EnvironmentService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.quartz.JobExecutionContext;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class CheckApplicationQuoteSchedulerTest {
+
+    @Mock
+    private BillingDAO billingDAO;
+    @Mock
+    private EnvironmentService environmentService;
+    @Mock
+    private JobExecutionContext jobExecutionContext;
+    @InjectMocks
+    private CheckApplicationQuoteScheduler checkApplicationQuoteScheduler;
+
+    @Test
+    public void testWhenQuoteNotReached() {
+        when(billingDAO.isBillingQuoteReached()).thenReturn(false);
+
+        checkApplicationQuoteScheduler.execute(jobExecutionContext);
+
+        verify(billingDAO).isBillingQuoteReached();
+        verifyNoMoreInteractions(billingDAO);
+        verifyZeroInteractions(environmentService);
+    }
+
+    @Test
+    public void testWhenQuoteReached() {
+        when(billingDAO.isBillingQuoteReached()).thenReturn(true);
+
+        checkApplicationQuoteScheduler.execute(jobExecutionContext);
+
+        verify(billingDAO).isBillingQuoteReached();
+        verify(environmentService).stopAll();
+        verifyNoMoreInteractions(billingDAO, environmentService);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/schedulers/CheckUserQuoteSchedulerTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/schedulers/CheckUserQuoteSchedulerTest.java
new file mode 100644
index 0000000..8b21ba4
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/schedulers/CheckUserQuoteSchedulerTest.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.schedulers;
+
+import com.epam.datalab.backendapi.dao.BillingDAO;
+import com.epam.datalab.backendapi.resources.dto.UserDTO;
+import com.epam.datalab.backendapi.service.EnvironmentService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.quartz.JobExecutionContext;
+
+import java.util.Collections;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class CheckUserQuoteSchedulerTest {
+
+    private static final String USER = "test";
+    @Mock
+    private BillingDAO billingDAO;
+    @Mock
+    private EnvironmentService environmentService;
+    @Mock
+    private JobExecutionContext jobExecutionContext;
+    @InjectMocks
+    private CheckUserQuoteScheduler checkUserQuoteScheduler;
+
+    @Test
+    public void testWhenUserQuoteReached() {
+        when(billingDAO.isUserQuoteReached(anyString())).thenReturn(true);
+        when(environmentService.getUsers()).thenReturn(Collections.singletonList(new UserDTO(USER, 1, UserDTO.Status.ACTIVE)));
+
+        checkUserQuoteScheduler.execute(jobExecutionContext);
+
+        verify(environmentService).getUsers();
+        verify(billingDAO).isUserQuoteReached(USER);
+        verify(environmentService).stopEnvironmentWithServiceAccount(USER);
+        verifyNoMoreInteractions(environmentService, billingDAO);
+        verifyZeroInteractions(jobExecutionContext);
+    }
+
+    @Test
+    public void testWhenUserQuoteNotReached() {
+        when(billingDAO.isUserQuoteReached(anyString())).thenReturn(false);
+        when(environmentService.getUsers()).thenReturn(Collections.singletonList(new UserDTO(USER, 1, UserDTO.Status.ACTIVE)));
+
+        checkUserQuoteScheduler.execute(jobExecutionContext);
+
+        verify(environmentService).getUsers();
+        verify(billingDAO).isUserQuoteReached(USER);
+        verify(environmentService, never()).stopEnvironmentWithServiceAccount(anyString());
+        verifyNoMoreInteractions(environmentService, billingDAO);
+        verifyZeroInteractions(jobExecutionContext);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/ApplicationSettingServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/ApplicationSettingServiceImplTest.java
new file mode 100644
index 0000000..166c73b
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/ApplicationSettingServiceImplTest.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.dao.MongoSetting;
+import com.epam.datalab.backendapi.dao.SettingsDAO;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Collections;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ApplicationSettingServiceImplTest {
+
+    private static final long MAX_BUDGET = 10L;
+    @Mock
+    private SettingsDAO settingsDAO;
+    @InjectMocks
+    private ApplicationSettingServiceImpl applicationSettingService;
+
+    @Test
+    public void setMaxBudget() {
+
+        applicationSettingService.setMaxBudget(MAX_BUDGET);
+
+        verify(settingsDAO).setMaxBudget(MAX_BUDGET);
+        verifyNoMoreInteractions(settingsDAO);
+    }
+
+    @Test
+    public void getSettings() {
+        when(settingsDAO.getSettings()).thenReturn(Collections.singletonMap("key", "value"));
+        final Map<String, Object> settings = applicationSettingService.getSettings();
+        assertEquals(1, settings.size());
+        assertEquals("value", settings.get("key"));
+
+        verify(settingsDAO).getSettings();
+        verifyNoMoreInteractions(settingsDAO);
+    }
+
+    @Test
+    public void removeMaxBudget() {
+
+        applicationSettingService.removeMaxBudget();
+
+        verify(settingsDAO).removeSetting(MongoSetting.CONF_MAX_BUDGET);
+        verifyNoMoreInteractions(settingsDAO);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/KeycloakServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/KeycloakServiceImplTest.java
new file mode 100644
index 0000000..50992ec
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/KeycloakServiceImplTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.SecurityDAO;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.keycloak.representations.AccessTokenResponse;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.Response;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class KeycloakServiceImplTest {
+    private static final String ACCESS_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJNUC15QVpENFdJRzloa" +
+            "np3R0RqQjdCeW9aNGpaV05QTjJ3X25uS1BkTnQ4In0.eyJqdGkiOiJlYTgzZTQ2OS0xNjFhLTQ1ZDUtYWI4YS1mZDUxYThmMzMwMzYiL" +
+            "CJleHAiOjE1NzA0NDQ1NTQsIm5iZiI6MCwiaWF0IjoxNTcwNDQzMzU0LCJpc3MiOiJodHRwOi8vNTIuMTEuNDUuMTE6ODA4MC9hdXRoL" +
+            "3JlYWxtcy9ETEFCX2JobGl2YSIsImF1ZCI6WyJwcm92aXNpb25pbmciLCJhY2NvdW50Il0sInN1YiI6ImRjNzczMThkLWYzN2UtNGNmO" +
+            "S1iMDgwLTU2ZTRjMWUwNDVhNSIsInR5cCI6IkJlYXJlciIsImF6cCI6InNzcyIsImF1dGhfdGltZSI6MTU3MDQ0MzMyOSwic2Vzc2lvb" +
+            "l9zdGF0ZSI6ImVkYTE3ODJjLTliZmItNDQ5Yy1hYWY1LWNhNzM5MDViMmI1NyIsImFjciI6IjEiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZ" +
+            "XMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7InNzcyI6eyJyb2xlcyI6W" +
+            "yJ0ZXN0Il19LCJwcm92aXNpb25pbmciOnsicm9sZXMiOlsidGVzdCJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3Vud" +
+            "CIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSIsImVtY" +
+            "WlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoidGVzdCJ9.jXjqFP1xmG32NahYnw1spO7fhEyGiqeu0QdBYuo9" +
+            "y6TI8xlAy5EFQ_5SrW6UuzpZUhgCjStH3Qkk_xgLlbZ9IqnxwOmx1i8arlurKf1mY_rm2_C5JBxHdHio8in8yEMls8t-wQOT46kMJNC7" +
+            "4GUzuWWQxS1h6F1V6238rnT8_W27oFcG449ShOGOQ5Du4F9B4ur3Ns6j5oSduwUFlbY_rNpGurUmtFWXBaXM61CiezJPxXu5pHzWK6Xq" +
+            "Z1IkuEUaDDJdBf1OGi13toq88V7C-Pr7YlnyWlbZ7bw2VXAs3NAgtn_30KlgYwR9YUJ_AB5TP3u8kK0jY0vLPosuBZgKeA";
+    private static final String REFRESH_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImUyZjk0YjFmLTBhMjMtNGJi" +
+            "OS05NDUwLTdjNDQ4MTdjY2RkMCJ9.eyJqdGkiOiI0NmNiMzczMy1mM2IzLTRiYjItYmQyZC02N2FjNzg5N2VmNTUiLCJleHAiOjE1NzA" +
+            "0NDMzNTQsIm5iZiI6MCwiaWF0IjoxNTcwNDQzMzU0LCJpc3MiOiJodHRwOi8vNTIuMTEuNDUuMTE6ODA4MC9hdXRoL3JlYWxtcy9ETEF" +
+            "CX2JobGl2YSIsImF1ZCI6Imh0dHA6Ly81Mi4xMS40NS4xMTo4MDgwL2F1dGgvcmVhbG1zL0RMQUJfYmhsaXZhIiwic3ViIjoiZGM3NzM" +
+            "xOGQtZjM3ZS00Y2Y5LWIwODAtNTZlNGMxZTA0NWE1IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InNzcyIsImF1dGhfdGltZSI6MCwic2V" +
+            "zc2lvbl9zdGF0ZSI6ImVkYTE3ODJjLTliZmItNDQ5Yy1hYWY1LWNhNzM5MDViMmI1NyIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ" +
+            "vZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsic3NzIjp7InJvbGVzIjpbInRlc3Q" +
+            "iXX0sInByb3Zpc2lvbmluZyI6eyJyb2xlcyI6WyJ0ZXN0Il19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWF" +
+            "uYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIn0.rzkrAprIt0-" +
+            "jD0h9ex3krzfu8UDcgnrRdocNFJmYa30";
+    @Mock
+    private Client httpClient;
+    @Mock
+    private SecurityDAO securityDAO;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private SelfServiceApplicationConfiguration conf;
+
+    private KeycloakServiceImpl keycloakService;
+
+    @Before
+    public void setUp() {
+        keycloakService = new KeycloakServiceImpl(httpClient, conf, securityDAO);
+    }
+
+    @Test
+    public void generateAccessToken() {
+        WebTarget webTarget = mock(WebTarget.class);
+        Invocation.Builder builder = mock(Invocation.Builder.class);
+        Response response = mock(Response.class);
+        Response.StatusType statusType = mock(Response.StatusType.class);
+        AccessTokenResponse tokenResponse = mock(AccessTokenResponse.class);
+
+        when(httpClient.target(anyString())).thenReturn(webTarget);
+        when(webTarget.request()).thenReturn(builder);
+        when(builder.header(any(), anyString())).thenReturn(builder);
+        when(builder.post(any())).thenReturn(response);
+        when(response.getStatusInfo()).thenReturn(statusType);
+        when(response.readEntity(AccessTokenResponse.class)).thenReturn(tokenResponse);
+        when(statusType.getFamily()).thenReturn(Response.Status.Family.SUCCESSFUL);
+        when(tokenResponse.getToken()).thenReturn(ACCESS_TOKEN);
+        doNothing().when(securityDAO).updateUser(anyString(), any(AccessTokenResponse.class));
+
+        keycloakService.generateAccessToken(REFRESH_TOKEN);
+
+        verify(httpClient).target(anyString());
+        verify(securityDAO).updateUser("test", tokenResponse);
+        verifyNoMoreInteractions(securityDAO, httpClient);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/ProjectServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/ProjectServiceImplTest.java
new file mode 100644
index 0000000..b2fc3d6
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/ProjectServiceImplTest.java
@@ -0,0 +1,477 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.ProjectDAO;
+import com.epam.datalab.backendapi.dao.UserGroupDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.OdahuDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.domain.UpdateProjectBudgetDTO;
+import com.epam.datalab.backendapi.resources.TestBase;
+import com.epam.datalab.backendapi.service.impl.ProjectServiceImpl;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.project.ProjectActionDTO;
+import com.epam.datalab.dto.project.ProjectCreateDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceConflictException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.rest.client.RESTService;
+import com.google.common.collect.Sets;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyListOf;
+import static org.mockito.Matchers.anySet;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ProjectServiceImplTest extends TestBase {
+
+    private static final String CREATE_PRJ_API = "infrastructure/project/create";
+	private static final String RECREATE_PRJ_API = "infrastructure/project/recreate";
+	private static final String TERMINATE_PRJ_API = "infrastructure/project/terminate";
+    private static final String START_PRJ_API = "infrastructure/project/start";
+    private static final String STOP_PRJ_API = "infrastructure/project/stop";
+
+    private static final String NAME1 = "name1";
+    private static final String NAME2 = "name2";
+    private static final String GROUP1 = "group1";
+    private static final String GROUP2 = "group2";
+    private static final String UUID = "uuid";
+
+    private static final List<UserInstanceStatus> notebookStatuses = Arrays.asList(
+            UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE,
+            UserInstanceStatus.CONFIGURING, UserInstanceStatus.RECONFIGURING, UserInstanceStatus.STOPPING,
+            UserInstanceStatus.TERMINATING);
+    private static final UserInstanceStatus[] computeStatuses = {UserInstanceStatus.CREATING, UserInstanceStatus.CONFIGURING, UserInstanceStatus.STARTING,
+            UserInstanceStatus.RECONFIGURING, UserInstanceStatus.CREATING_IMAGE, UserInstanceStatus.STOPPING,
+            UserInstanceStatus.TERMINATING};
+
+    @Mock
+    private ProjectDAO projectDAO;
+    @Mock
+    private EndpointService endpointService;
+    @Mock
+    private RESTService provisioningService;
+    @Mock
+    private RequestBuilder requestBuilder;
+	@Mock
+	private RequestId requestId;
+	@Mock
+	private ExploratoryService exploratoryService;
+	@Mock
+	private ExploratoryDAO exploratoryDAO;
+	@Mock
+	private UserGroupDAO userGroupDao;
+	@Mock
+	private SelfServiceApplicationConfiguration configuration;
+	@Mock
+	private OdahuService odahuService;
+	@InjectMocks
+	private ProjectServiceImpl projectService;
+
+	@Test
+	public void getProjects() {
+		List<ProjectDTO> projectsMock = getProjectDTOs();
+		when(projectDAO.getProjects()).thenReturn(projectsMock);
+
+		List<ProjectDTO> projects = projectService.getProjects();
+
+        assertEquals(projects, projectsMock);
+        verify(projectDAO).getProjects();
+        verifyNoMoreInteractions(projectDAO);
+    }
+
+    @Test
+    public void testGetProjects() {
+        List<ProjectDTO> projectsMock = getProjectDTOs();
+        when(projectDAO.getProjects()).thenReturn(projectsMock);
+
+        projectService.getProjects(getUserInfo());
+
+        verify(projectDAO).getProjects();
+        verifyNoMoreInteractions(projectDAO);
+    }
+
+    @Test
+    public void getUserProjects() {
+        List<ProjectDTO> projectsMock = Collections.singletonList(getProjectCreatingDTO());
+        when(projectDAO.getUserProjects(any(UserInfo.class), anyBoolean())).thenReturn(projectsMock);
+
+        List<ProjectDTO> projects = projectService.getUserProjects(getUserInfo(), Boolean.TRUE);
+
+        assertEquals(projectsMock, projects);
+        verify(projectDAO).getUserProjects(getUserInfo(), Boolean.TRUE);
+        verifyNoMoreInteractions(projectDAO);
+    }
+
+    @Test
+    public void getProjectsByEndpoint() {
+        List<ProjectDTO> projectsMock = Collections.singletonList(getProjectCreatingDTO());
+        when(projectDAO.getProjectsByEndpoint(anyString())).thenReturn(projectsMock);
+
+        List<ProjectDTO> projects = projectService.getProjectsByEndpoint(ENDPOINT_NAME);
+
+        assertEquals(projectsMock, projects);
+        verify(projectDAO).getProjectsByEndpoint(ENDPOINT_NAME);
+        verifyNoMoreInteractions(projectDAO);
+    }
+
+    @Test
+    public void create() {
+        when(projectDAO.get(anyString())).thenReturn(Optional.empty());
+        when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+        when(provisioningService.post(anyString(), anyString(), any(), any())).thenReturn(UUID);
+        when(requestBuilder.newProjectCreate(any(UserInfo.class), any(ProjectDTO.class), any(EndpointDTO.class))).thenReturn(newProjectCreate());
+
+        ProjectDTO projectDTO = getProjectCreatingDTO();
+        projectService.create(getUserInfo(), projectDTO, projectDTO.getName());
+
+        verify(projectDAO).get(NAME1);
+        verify(projectDAO).create(projectDTO);
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(requestBuilder).newProjectCreate(getUserInfo(), projectDTO, getEndpointDTO());
+        verify(provisioningService).post(ENDPOINT_URL + CREATE_PRJ_API, TOKEN, newProjectCreate(), String.class);
+        verify(requestId).put(USER.toLowerCase(), UUID);
+        verifyNoMoreInteractions(projectDAO, endpointService, provisioningService, requestBuilder);
+    }
+
+    @Test(expected = ResourceConflictException.class)
+    public void createWithException() {
+	    when(projectDAO.get(anyString())).thenReturn(Optional.of(getProjectCreatingDTO()));
+
+	    ProjectDTO projectDTO = getProjectCreatingDTO();
+	    projectService.create(getUserInfo(), projectDTO, projectDTO.getName());
+
+	    verify(projectDAO).get(NAME1);
+	    verifyNoMoreInteractions(projectDAO);
+    }
+
+	@Test
+	public void recreate() {
+		ProjectDTO projectDTO = getProjectCreatingDTO();
+		when(projectDAO.get(anyString())).thenReturn(Optional.of(projectDTO));
+		when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+		when(provisioningService.post(anyString(), anyString(), any(), any())).thenReturn(UUID);
+		when(requestBuilder.newProjectCreate(any(UserInfo.class), any(ProjectDTO.class), any(EndpointDTO.class))).thenReturn(newProjectCreate());
+
+		projectService.recreate(getUserInfo(), ENDPOINT_NAME, projectDTO.getName());
+
+		verify(projectDAO).get(NAME1);
+		verify(projectDAO).updateEdgeStatus(NAME1, ENDPOINT_NAME, UserInstanceStatus.CREATING);
+		verify(endpointService).get(ENDPOINT_NAME);
+		verify(requestBuilder).newProjectCreate(getUserInfo(), projectDTO, getEndpointDTO());
+		verify(provisioningService).post(ENDPOINT_URL + RECREATE_PRJ_API, TOKEN, newProjectCreate(), String.class);
+		verify(requestId).put(USER.toLowerCase(), UUID);
+		verifyNoMoreInteractions(projectDAO, endpointService, provisioningService, requestBuilder);
+	}
+
+	@Test
+	public void get() {
+		ProjectDTO projectMock = getProjectCreatingDTO();
+		when(projectDAO.get(anyString())).thenReturn(Optional.of(projectMock));
+
+		ProjectDTO project = projectService.get(NAME1);
+
+		assertEquals(projectMock, project);
+		verify(projectDAO).get(NAME1);
+        verifyNoMoreInteractions(projectDAO);
+    }
+
+    @Test(expected = ResourceNotFoundException.class)
+    public void getWithException() {
+        when(projectDAO.get(anyString())).thenReturn(Optional.empty());
+
+        projectService.get(NAME1);
+
+        verify(projectDAO).get(NAME1);
+        verifyNoMoreInteractions(projectDAO);
+    }
+
+    @Test
+    public void terminateEndpoint() {
+	    when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+	    when(provisioningService.post(anyString(), anyString(), any(), any())).thenReturn(UUID);
+	    when(requestBuilder.newProjectAction(any(UserInfo.class), anyString(), any(EndpointDTO.class))).thenReturn(getProjectActionDTO());
+	    when(odahuService.get(anyString(), anyString())).thenReturn(getOdahu());
+
+	    projectService.terminateEndpoint(getUserInfo(), ENDPOINT_NAME, NAME1);
+
+	    verify(exploratoryService).updateProjectExploratoryStatuses(getUserInfo(), NAME1, ENDPOINT_NAME, UserInstanceStatus.TERMINATING);
+	    verify(odahuService).get(NAME1, ENDPOINT_NAME);
+	    verify(odahuService).terminate("name", NAME1, ENDPOINT_NAME, getUserInfo());
+	    verify(projectDAO).updateEdgeStatus(NAME1, ENDPOINT_NAME, UserInstanceStatus.TERMINATING);
+	    verify(endpointService).get(ENDPOINT_NAME);
+	    verify(provisioningService).post(ENDPOINT_URL + TERMINATE_PRJ_API, TOKEN, getProjectActionDTO(), String.class);
+	    verify(requestBuilder).newProjectAction(getUserInfo(), NAME1, getEndpointDTO());
+	    verify(requestId).put(USER.toLowerCase(), UUID);
+	    verifyNoMoreInteractions(projectDAO, endpointService, provisioningService, requestBuilder, exploratoryService, odahuService);
+    }
+
+    @Test
+    public void terminateEndpointWithException() {
+	    when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+	    when(requestBuilder.newProjectAction(any(UserInfo.class), anyString(), any(EndpointDTO.class))).thenReturn(getProjectActionDTO());
+	    when(provisioningService.post(anyString(), anyString(), any(), any())).thenThrow(new DatalabException("Exception message"));
+	    when(odahuService.get(anyString(), anyString())).thenReturn(getOdahu());
+
+	    projectService.terminateEndpoint(getUserInfo(), ENDPOINT_NAME, NAME1);
+
+	    verify(exploratoryService).updateProjectExploratoryStatuses(getUserInfo(), NAME1, ENDPOINT_NAME, UserInstanceStatus.TERMINATING);
+	    verify(odahuService).get(NAME1, ENDPOINT_NAME);
+	    verify(odahuService).terminate("name", NAME1, ENDPOINT_NAME, getUserInfo());
+	    verify(projectDAO).updateEdgeStatus(NAME1, ENDPOINT_NAME, UserInstanceStatus.TERMINATING);
+	    verify(projectDAO).updateStatus(NAME1, ProjectDTO.Status.FAILED);
+	    verify(endpointService).get(ENDPOINT_NAME);
+	    verify(provisioningService).post(ENDPOINT_URL + TERMINATE_PRJ_API, TOKEN, getProjectActionDTO(), String.class);
+	    verify(requestBuilder).newProjectAction(getUserInfo(), NAME1, getEndpointDTO());
+	    verifyNoMoreInteractions(projectDAO, endpointService, provisioningService, requestBuilder, exploratoryService, odahuService);
+    }
+
+    @Test
+    public void testTerminateEndpoint() {
+	    when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+	    when(provisioningService.post(anyString(), anyString(), any(), any())).thenReturn(UUID);
+	    when(odahuService.get(anyString(), anyString())).thenReturn(getOdahu());
+	    when(odahuService.inProgress(anyString(), anyString())).thenReturn(Boolean.FALSE);
+	    when(requestBuilder.newProjectAction(any(UserInfo.class), anyString(), any(EndpointDTO.class))).thenReturn(getProjectActionDTO());
+	    when(projectDAO.get(anyString())).thenReturn(Optional.of(getProjectRunningDTO()));
+	    when(exploratoryDAO.fetchProjectEndpointExploratoriesWhereStatusIn(anyString(), anyListOf(String.class), anyListOf(UserInstanceStatus.class)))
+			    .thenReturn(Collections.emptyList());
+
+	    projectService.terminateEndpoint(getUserInfo(), Collections.singletonList(ENDPOINT_NAME), NAME1);
+
+	    verify(projectDAO).get(NAME1);
+	    verify(exploratoryDAO).fetchProjectEndpointExploratoriesWhereStatusIn(NAME1, Collections.singletonList(ENDPOINT_NAME), notebookStatuses, computeStatuses);
+	    verify(exploratoryService).updateProjectExploratoryStatuses(getUserInfo(), NAME1, ENDPOINT_NAME, UserInstanceStatus.TERMINATING);
+	    verify(projectDAO).updateEdgeStatus(NAME1, ENDPOINT_NAME, UserInstanceStatus.TERMINATING);
+	    verify(endpointService).get(ENDPOINT_NAME);
+	    verify(odahuService).get(NAME1, ENDPOINT_NAME);
+	    verify(odahuService).terminate("name", NAME1, ENDPOINT_NAME, getUserInfo());
+	    verify(odahuService).inProgress(NAME1, ENDPOINT_NAME);
+	    verify(provisioningService).post(ENDPOINT_URL + TERMINATE_PRJ_API, TOKEN, getProjectActionDTO(), String.class);
+	    verify(requestBuilder).newProjectAction(getUserInfo(), NAME1, getEndpointDTO());
+	    verify(requestId).put(USER.toLowerCase(), UUID);
+	    verifyNoMoreInteractions(projectDAO, endpointService, provisioningService, requestBuilder, exploratoryDAO, odahuService);
+    }
+
+	@Test(expected = ResourceConflictException.class)
+	public void testTerminateEndpointWithException1() {
+		when(projectDAO.get(anyString())).thenReturn(Optional.of(getProjectCreatingDTO()));
+
+		projectService.terminateEndpoint(getUserInfo(), Collections.singletonList(ENDPOINT_NAME), NAME1);
+
+		verify(projectDAO).get(NAME1);
+		verifyNoMoreInteractions(projectDAO);
+	}
+
+	@Test(expected = ResourceConflictException.class)
+	public void testTerminateEndpointWithException2() {
+		when(projectDAO.get(anyString())).thenReturn(Optional.of(getProjectRunningDTO()));
+		when(odahuService.inProgress(anyString(), anyString())).thenReturn(Boolean.TRUE);
+
+		projectService.terminateEndpoint(getUserInfo(), Collections.singletonList(ENDPOINT_NAME), NAME1);
+
+		verify(projectDAO).get(NAME1);
+		verify(odahuService).inProgress(NAME1, ENDPOINT_NAME);
+		verifyNoMoreInteractions(projectDAO, odahuService);
+	}
+
+	@Test
+	public void start() {
+		when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+		when(provisioningService.post(anyString(), anyString(), any(), any())).thenReturn(UUID);
+		when(requestBuilder.newProjectAction(any(UserInfo.class), anyString(), any(EndpointDTO.class))).thenReturn(getProjectActionDTO());
+
+		projectService.start(getUserInfo(), ENDPOINT_NAME, NAME1);
+
+		verify(projectDAO).updateEdgeStatus(NAME1, ENDPOINT_NAME, UserInstanceStatus.STARTING);
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).post(ENDPOINT_URL + START_PRJ_API, TOKEN, getProjectActionDTO(), String.class);
+        verify(requestBuilder).newProjectAction(getUserInfo(), NAME1, getEndpointDTO());
+        verify(requestId).put(USER.toLowerCase(), UUID);
+        verifyNoMoreInteractions(projectDAO, endpointService, provisioningService, requestBuilder, requestId);
+    }
+
+    @Test
+    public void testStart() {
+        when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+        when(provisioningService.post(anyString(), anyString(), any(), any())).thenReturn(UUID);
+        when(requestBuilder.newProjectAction(any(UserInfo.class), anyString(), any(EndpointDTO.class))).thenReturn(getProjectActionDTO());
+
+        projectService.start(getUserInfo(), Collections.singletonList(ENDPOINT_NAME), NAME1);
+
+        verify(projectDAO).updateEdgeStatus(NAME1, ENDPOINT_NAME, UserInstanceStatus.STARTING);
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).post(ENDPOINT_URL + START_PRJ_API, TOKEN, getProjectActionDTO(), String.class);
+        verify(requestBuilder).newProjectAction(getUserInfo(), NAME1, getEndpointDTO());
+        verify(requestId).put(USER.toLowerCase(), UUID);
+        verifyNoMoreInteractions(projectDAO, endpointService, provisioningService, requestBuilder, requestId);
+    }
+
+    @Test
+    public void stop() {
+        when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+        when(provisioningService.post(anyString(), anyString(), any(), any())).thenReturn(UUID);
+        when(requestBuilder.newProjectAction(any(UserInfo.class), anyString(), any(EndpointDTO.class))).thenReturn(getProjectActionDTO());
+
+        projectService.stop(getUserInfo(), ENDPOINT_NAME, NAME1, null);
+
+        verify(projectDAO).updateEdgeStatus(NAME1, ENDPOINT_NAME, UserInstanceStatus.STOPPING);
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).post(ENDPOINT_URL + STOP_PRJ_API, TOKEN, getProjectActionDTO(), String.class);
+        verify(requestBuilder).newProjectAction(getUserInfo(), NAME1, getEndpointDTO());
+        verify(requestId).put(USER.toLowerCase(), UUID);
+        verifyNoMoreInteractions(projectDAO, endpointService, provisioningService, requestBuilder, requestId);
+    }
+
+    @Test
+    public void stopWithResources() {
+        when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+        when(provisioningService.post(anyString(), anyString(), any(), any())).thenReturn(UUID);
+        when(requestBuilder.newProjectAction(any(UserInfo.class), anyString(), any(EndpointDTO.class))).thenReturn(getProjectActionDTO());
+        when(projectDAO.get(anyString())).thenReturn(Optional.of(getProjectRunningDTO()));
+        when(exploratoryDAO.fetchProjectEndpointExploratoriesWhereStatusIn(anyString(), anyListOf(String.class), anyListOf(UserInstanceStatus.class)))
+                .thenReturn(Collections.emptyList());
+
+        projectService.stopWithResources(getUserInfo(), Collections.singletonList(ENDPOINT_NAME), NAME1);
+
+        verify(projectDAO).get(NAME1);
+        verify(exploratoryDAO).fetchProjectEndpointExploratoriesWhereStatusIn(NAME1, Collections.singletonList(ENDPOINT_NAME), notebookStatuses, computeStatuses);
+        verify(projectDAO).updateEdgeStatus(NAME1, ENDPOINT_NAME, UserInstanceStatus.STOPPING);
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).post(ENDPOINT_URL + STOP_PRJ_API, TOKEN, getProjectActionDTO(), String.class);
+        verify(requestBuilder).newProjectAction(getUserInfo(), NAME1, getEndpointDTO());
+        verify(requestId).put(USER.toLowerCase(), UUID);
+        verifyNoMoreInteractions(projectDAO, endpointService, provisioningService, requestBuilder, requestId);
+    }
+
+    @Test
+    public void update() {
+    }
+
+    @Test
+    public void updateBudget() {
+        projectService.updateBudget(getUserInfo(), Collections.singletonList(getUpdateProjectBudgetDTO()));
+
+        verify(projectDAO).updateBudget(NAME1, 10, true);
+        verifyNoMoreInteractions(projectDAO);
+    }
+
+    @Test
+    public void isAnyProjectAssigned() {
+        when(userGroupDao.getUserGroups(anyString())).thenReturn(Sets.newHashSet(GROUP1));
+        when(projectDAO.isAnyProjectAssigned(anySet())).thenReturn(Boolean.TRUE);
+
+        final boolean anyProjectAssigned = projectService.isAnyProjectAssigned(getUserInfo());
+
+        assertEquals(anyProjectAssigned, Boolean.TRUE);
+        verify(userGroupDao).getUserGroups(USER.toLowerCase());
+        verify(projectDAO).isAnyProjectAssigned(Sets.newHashSet(GROUP1));
+        verifyNoMoreInteractions(userGroupDao, projectDAO);
+    }
+
+    @Test
+    public void checkExploratoriesAndComputationalProgress() {
+        when(exploratoryDAO.fetchProjectEndpointExploratoriesWhereStatusIn(anyString(), anyListOf(String.class), anyListOf(UserInstanceStatus.class)))
+                .thenReturn(Collections.emptyList());
+
+        final boolean b = projectService.checkExploratoriesAndComputationalProgress(NAME1, Collections.singletonList(ENDPOINT_NAME));
+
+        assertEquals(b, Boolean.TRUE);
+        verify(exploratoryDAO).fetchProjectEndpointExploratoriesWhereStatusIn(NAME1, Collections.singletonList(ENDPOINT_NAME), notebookStatuses, computeStatuses);
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    private List<ProjectDTO> getProjectDTOs() {
+        ProjectDTO project1 = ProjectDTO.builder()
+                .name(NAME1)
+                .groups(getGroup(GROUP1))
+                .build();
+        ProjectDTO project2 = ProjectDTO.builder()
+                .name(NAME2)
+                .groups(getGroup(GROUP2))
+                .build();
+        return Arrays.asList(project1, project2);
+    }
+
+    private ProjectDTO getProjectCreatingDTO() {
+        ProjectEndpointDTO projectEndpointDTO = new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.CREATING, null);
+        return ProjectDTO.builder()
+                .name(NAME1)
+                .groups(getGroup(GROUP1))
+                .endpoints(Collections.singletonList(projectEndpointDTO))
+                .build();
+    }
+
+    private ProjectDTO getProjectRunningDTO() {
+        ProjectEndpointDTO projectEndpointDTO = new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, null);
+        return ProjectDTO.builder()
+                .name(NAME1)
+                .groups(getGroup(GROUP1))
+                .endpoints(Collections.singletonList(projectEndpointDTO))
+                .build();
+    }
+
+    private Set<String> getGroup(String group) {
+	    return Collections.singleton(group);
+    }
+
+	private ProjectCreateDTO newProjectCreate() {
+		return ProjectCreateDTO.builder()
+				.name(NAME1)
+				.endpoint(ENDPOINT_NAME)
+				.build();
+	}
+
+	private Optional<OdahuDTO> getOdahu() {
+		return Optional.of(new OdahuDTO("name", NAME1, ENDPOINT_NAME, UserInstanceStatus.RUNNING, Collections.emptyMap()));
+	}
+
+	private ProjectActionDTO getProjectActionDTO() {
+		return new ProjectActionDTO(NAME1, ENDPOINT_NAME);
+	}
+
+	private UpdateProjectBudgetDTO getUpdateProjectBudgetDTO() {
+		return new UpdateProjectBudgetDTO(NAME1, 10, true);
+	}
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/SecurityServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/SecurityServiceImplTest.java
new file mode 100644
index 0000000..1050d00
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/SecurityServiceImplTest.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.SecurityDAO;
+import com.epam.datalab.backendapi.domain.AuditActionEnum;
+import com.epam.datalab.backendapi.domain.AuditDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.keycloak.representations.AccessTokenResponse;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class SecurityServiceImplTest {
+
+    private static final String CODE = "code";
+    private static final String TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJNUC15QVpENFdJRzloanp3R0RqQjdCeW9aNGpaV05QTjJ3X25uS1BkTnQ4In0.eyJqdGkiOiJkN2U0MDk3Yi1hNjdlLTQxYWUtYjBiNC05MzE1YWFmOGZkMDciLCJleHAiOjE1OTkwNDI1ODgsIm5iZiI6MCwiaWF0IjoxNTk5MDM4OTg4LCJpc3MiOiJodHRwOi8vNTIuMTEuNDUuMTE6ODA4MC9hdXRoL3JlYWxtcy9ETEFCX2JobGl2YSIsImF1ZCI6WyJwcm92aXNpb25pbmciLCJhY2NvdW50Il0sInN1YiI6ImRjNzczMThkLWYzN2UtNGNmOS1iMDgwLTU2ZTRjMWUwNDVhNSIsInR5cCI6IkJlYXJlciIsImF6cCI6InNzcyIsImF1dGhfdGltZSI6MTU5OTAzODk4Nywic2Vzc2lvbl9zdGF0ZSI6Ijg2Njg3NzQ3LTNlOGUtNDhhYy1iMTE1LWM4ZDRmNzQ5M2M1ZSIsImFjciI6IjEiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7InNzcyI6eyJyb2xlcyI6WyJ0ZXN0Il19LCJwcm92aXNpb25pbmciOnsicm9sZXMiOlsidGVzdCJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoidGVzdCIsImVtYWlsIjoidGVzdEBlcGFtLmNvbSJ9.cYXGXjHGOg2XKADNGuQSykb6aUc-_CC4cUaTJ9qVml0IZDPYcUF9H_iTB-vL67k5MpuM4mVpZWHYT9oJYuFKZoR5lPUmiHG3A8LWxZq4ALeTEqWzOdOn2hUsoPSVoaTG8nLqgOQFHAV8G66dD-0zy-8QheGwZznXZ2_lRvSIg-IYRj_vhv91AItNQQ2eXho7zAic_QiLQHo5vUIEOGcVQdRkiVXe-CZ9pe8lHw8tlKwLlHJj7ldv1YVi0m8f9Tztn2ylSoETwSXdmk09pLxzoFG1EP-EU5cDE5l_MDJIVdhGFJR8eLd8dyzFjThupSMwgWEr_iDmbZ4Q116sv8g4jw";
+    private static final String REFRESH_TOKEN = "refreshToken";
+    private static final String USERNAME = "test";
+
+    @Mock
+    private KeycloakService keycloakService;
+    @Mock
+    private SecurityDAO securityDAO;
+    @Mock
+    private AuditService auditService;
+
+    @InjectMocks
+    private SecurityServiceImpl securityService;
+
+    @Test
+    public void testGetUserInfo() {
+        AccessTokenResponse tokenResponse = mock(AccessTokenResponse.class);
+        when(tokenResponse.getToken()).thenReturn(TOKEN);
+        when(tokenResponse.getRefreshToken()).thenReturn(REFRESH_TOKEN);
+        when(keycloakService.getToken(anyString())).thenReturn(tokenResponse);
+
+        UserInfo actualUserInfo = securityService.getUserInfo(CODE);
+
+        assertEquals("UserInfo should be equal", getUserInfoWithRefreshToken(), actualUserInfo);
+        verify(keycloakService).getToken(CODE);
+        verify(securityDAO).saveUser(USERNAME, tokenResponse);
+        verify(auditService).save(getAuditDTO());
+        verifyNoMoreInteractions(keycloakService, securityDAO, auditService);
+    }
+
+    @Test
+    public void getUserInfoOffline() {
+        AccessTokenResponse tokenResponseFromDB = mock(AccessTokenResponse.class);
+        when(tokenResponseFromDB.getRefreshToken()).thenReturn(REFRESH_TOKEN);
+        when(securityDAO.getTokenResponse(anyString())).thenReturn(Optional.of(tokenResponseFromDB));
+        AccessTokenResponse tokenResponse = mock(AccessTokenResponse.class);
+        when(tokenResponse.getToken()).thenReturn(TOKEN);
+        when(keycloakService.refreshToken(anyString())).thenReturn(tokenResponse);
+
+        UserInfo actualUserInfoOffline = securityService.getUserInfoOffline(USERNAME);
+
+        assertEquals("UserInfo should be equal", getUserInfo(), actualUserInfoOffline);
+        verify(securityDAO).getTokenResponse(USERNAME);
+        verify(keycloakService).refreshToken(REFRESH_TOKEN);
+        verifyNoMoreInteractions(securityDAO, keycloakService);
+    }
+
+    @Test(expected = DatalabException.class)
+    public void getUserInfoOfflineWithException() {
+        when(securityDAO.getTokenResponse(anyString())).thenReturn(Optional.empty());
+
+        securityService.getUserInfoOffline(USERNAME);
+
+        verify(securityDAO).getTokenResponse(USERNAME);
+        verifyNoMoreInteractions(securityDAO, keycloakService);
+    }
+
+    @Test
+    public void getServiceAccountInfo() {
+        AccessTokenResponse tokenResponse = mock(AccessTokenResponse.class);
+        when(tokenResponse.getToken()).thenReturn(TOKEN);
+        when(keycloakService.generateServiceAccountToken()).thenReturn(tokenResponse);
+
+        UserInfo actualUserInfo = securityService.getServiceAccountInfo(USERNAME);
+
+        assertEquals("UserInfo should be equal", getUserInfo(), actualUserInfo);
+        verify(keycloakService).generateServiceAccountToken();
+        verifyNoMoreInteractions(keycloakService);
+    }
+
+
+    private UserInfo getUserInfo() {
+        return new UserInfo(USERNAME, TOKEN);
+    }
+
+    private UserInfo getUserInfoWithRefreshToken() {
+        UserInfo userInfo = new UserInfo(USERNAME, TOKEN);
+        userInfo.setRefreshToken(REFRESH_TOKEN);
+        return userInfo;
+    }
+
+    private AuditDTO getAuditDTO() {
+        return AuditDTO.builder()
+                .user(USERNAME)
+                .action(AuditActionEnum.LOG_IN)
+                .build();
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/TagServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/TagServiceImplTest.java
new file mode 100644
index 0000000..1b061db
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/TagServiceImplTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.resources.TestBase;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+public class TagServiceImplTest extends TestBase {
+
+    private static final String PROJECT = "project";
+    private static final String ENDPOINT = "endpoint";
+    private static final String CUSTOM_TAG = "customTag";
+
+    TagService tagService = new TagServiceImpl();
+
+    @Test
+    public void getResourceTags() {
+        Map<String, String> actualResourceTags = tagService.getResourceTags(getUserInfo(), ENDPOINT, PROJECT, CUSTOM_TAG,
+                false);
+        assertEquals("maps of tags are not equals", getExpectedResourceTags(), actualResourceTags);
+    }
+
+    @Test
+    public void getResourceTagsWithNullCustomTag() {
+        Map<String, String> actualResourceTags = tagService.getResourceTags(getUserInfo(), ENDPOINT, PROJECT, null
+                , false);
+        assertEquals("maps of tags are not equals", getExpectedResourceTagsWithNullCustomTag(), actualResourceTags);
+    }
+
+    private Map<String, String> getExpectedResourceTags() {
+        Map<String, String> resourceTags = new HashMap<>();
+        resourceTags.put("user_tag", USER.toLowerCase());
+        resourceTags.put("endpoint_tag", ENDPOINT);
+        resourceTags.put("project_tag", PROJECT);
+        resourceTags.put("custom_tag", CUSTOM_TAG);
+
+        return resourceTags;
+    }
+
+    private Map<String, String> getExpectedResourceTagsWithNullCustomTag() {
+        Map<String, String> resourceTags = new HashMap<>();
+        resourceTags.put("user_tag", USER.toLowerCase());
+        resourceTags.put("endpoint_tag", ENDPOINT);
+        resourceTags.put("project_tag", PROJECT);
+
+        return resourceTags;
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/UserRoleServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/UserRoleServiceImplTest.java
new file mode 100644
index 0000000..a55654e
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/UserRoleServiceImplTest.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.backendapi.dao.UserRoleDAO;
+import com.epam.datalab.backendapi.resources.TestBase;
+import com.epam.datalab.backendapi.resources.dto.UserRoleDTO;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class UserRoleServiceImplTest extends TestBase {
+
+    private static final String ROLE_ID = "roleId";
+    @Mock
+    private UserRoleDAO dao;
+    @InjectMocks
+    private UserRoleServiceImpl userRoleService;
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Test
+    public void createRole() {
+
+        userRoleService.createRole(getUserRole());
+
+        verify(dao).insert(refEq(getUserRole()));
+        verifyNoMoreInteractions(dao);
+    }
+
+    @Test
+    public void updateRole() {
+        when(dao.update(any())).thenReturn(true);
+        userRoleService.updateRole(getUserRole());
+
+        verify(dao).update(refEq(getUserRole()));
+        verifyNoMoreInteractions(dao);
+    }
+
+    @Test
+    public void updateRoleWithException() {
+
+        expectedException.expectMessage("Any of role : [" + ROLE_ID + "] were not found");
+        expectedException.expect(ResourceNotFoundException.class);
+        when(dao.update(any())).thenReturn(false);
+        userRoleService.updateRole(getUserRole());
+    }
+
+    @Test
+    public void removeRole() {
+
+        userRoleService.removeRole(ROLE_ID);
+
+        verify(dao).remove(ROLE_ID);
+        verifyNoMoreInteractions(dao);
+    }
+
+    private UserRoleDTO getUserRole() {
+        final UserRoleDTO userRoleDto = new UserRoleDTO();
+        userRoleDto.setId(ROLE_ID);
+        return userRoleDto;
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/UserSettingServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/UserSettingServiceImplTest.java
new file mode 100644
index 0000000..b7aa811
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/UserSettingServiceImplTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.UserSettingsDAO;
+import com.epam.datalab.backendapi.resources.dto.UserDTO;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.refEq;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class UserSettingServiceImplTest {
+
+    private static final String SETTINGS = "settings";
+    private static final String TOKEN = "Token";
+    private static final String USER = "user";
+    private static final Integer BUDGET = 10;
+    @Mock
+    private UserSettingsDAO settingsDAO;
+    @InjectMocks
+    private UserSettingServiceImpl userSettingService;
+
+    @Test
+    public void saveUISettings() {
+        userSettingService.saveUISettings(getUserInfo(), SETTINGS);
+
+        verify(settingsDAO).setUISettings(refEq(getUserInfo()), eq(SETTINGS));
+        verifyNoMoreInteractions(settingsDAO);
+    }
+
+    @Test
+    public void getUISettings() {
+        when(settingsDAO.getUISettings(any(UserInfo.class))).thenReturn(SETTINGS);
+
+        final String uiSettings = userSettingService.getUISettings(getUserInfo());
+
+        assertEquals(SETTINGS, uiSettings);
+        verify(settingsDAO).getUISettings(refEq(getUserInfo()));
+    }
+
+    @Test
+    public void updateUsersBudget() {
+
+        userSettingService.updateUsersBudget(Collections.singletonList(getBudgetDTO()));
+
+        verify(settingsDAO).updateBudget(refEq(getBudgetDTO()));
+        verifyNoMoreInteractions(settingsDAO);
+    }
+
+    private UserDTO getBudgetDTO() {
+        return new UserDTO(USER, BUDGET, UserDTO.Status.ACTIVE);
+    }
+
+
+    private UserInfo getUserInfo() {
+        return new UserInfo(USER, TOKEN);
+    }
+
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/AccessKeyServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/AccessKeyServiceImplTest.java
new file mode 100644
index 0000000..c92cef0
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/AccessKeyServiceImplTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.resources.TestBase;
+import com.epam.datalab.backendapi.resources.dto.KeysDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class AccessKeyServiceImplTest extends TestBase {
+
+    @Mock
+    private SelfServiceApplicationConfiguration conf;
+
+    @InjectMocks
+    private AccessKeyServiceImpl accessKeyService;
+
+
+    @Test
+    public void generateKeys() {
+        UserInfo userInfo = getUserInfo();
+        when(conf.getPrivateKeySize()).thenReturn(2048);
+
+        KeysDTO keysDTO = accessKeyService.generateKeys(userInfo);
+
+        assertEquals("Usernames are not equal", USER.toLowerCase(), keysDTO.getUsername());
+        assertNotNull("Public key is null", keysDTO.getPublicKey());
+        assertNotNull("Private key is null", keysDTO.getPrivateKey());
+    }
+
+    @Test(expected = DatalabException.class)
+    public void generateKeysWithException() {
+        UserInfo userInfo = getUserInfo();
+        when(conf.getPrivateKeySize()).thenReturn(0);
+
+        accessKeyService.generateKeys(userInfo);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/AuditServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/AuditServiceImplTest.java
new file mode 100644
index 0000000..a7ad657
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/AuditServiceImplTest.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.dao.AuditDAO;
+import com.epam.datalab.backendapi.domain.AuditActionEnum;
+import com.epam.datalab.backendapi.domain.AuditCreateDTO;
+import com.epam.datalab.backendapi.domain.AuditDTO;
+import com.epam.datalab.backendapi.domain.AuditResourceTypeEnum;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.refEq;
+import static org.mockito.Mockito.verify;
+
+@RunWith(MockitoJUnitRunner.class)
+public class AuditServiceImplTest {
+    private static final String USER = "user";
+    private static final String PROJECT = "project";
+    private static final String RESOURCE_NAME = "resourceName";
+    private static final String INFO = "info";
+
+    @Mock
+    private AuditDAO auditDAO;
+    @InjectMocks
+    private AuditServiceImpl auditService;
+
+    @Test
+    public void save() {
+        AuditDTO auditDTO = getAuditDTO();
+
+        auditService.save(auditDTO);
+
+        verify(auditDAO).save(refEq(auditDTO));
+    }
+
+    @Test
+    public void testSave() {
+        AuditCreateDTO auditCreateDTO = getAuditCreateDTO();
+
+        auditService.save(USER, auditCreateDTO);
+
+        verify(auditDAO).save(eq(getAuditDTO(USER, auditCreateDTO)));
+    }
+
+    @Test
+    public void getAudit() {
+        List<String> users = new ArrayList<>();
+        List<String> projects = new ArrayList<>();
+        List<String> resourceNames = new ArrayList<>();
+        List<String> resourceTypes = new ArrayList<>();
+        String dateStart = "";
+        String dateEnd = "";
+        int pageNumber = 1;
+        int pageSize = 10;
+
+        auditService.getAudit(users, projects, resourceNames, resourceTypes, dateStart, dateEnd, pageNumber, pageSize);
+
+        verify(auditDAO).getAudit(refEq(users), refEq(projects), refEq(resourceNames), refEq(resourceTypes), eq(dateStart), eq(dateEnd), eq(pageNumber), eq(pageSize));
+    }
+
+    private AuditDTO getAuditDTO() {
+        return AuditDTO.builder()
+                .user(USER)
+                .project(PROJECT)
+                .build();
+    }
+
+    private AuditDTO getAuditDTO(String user, AuditCreateDTO auditCreateDTO) {
+        return AuditDTO.builder()
+                .user(user)
+                .resourceName(auditCreateDTO.getResourceName())
+                .info(auditCreateDTO.getInfo())
+                .type(auditCreateDTO.getType())
+                .action(AuditActionEnum.FOLLOW_LINK)
+                .build();
+    }
+
+    private AuditCreateDTO getAuditCreateDTO() {
+        return new AuditCreateDTO(RESOURCE_NAME, INFO, AuditResourceTypeEnum.COMPUTE);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BackupServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BackupServiceImplTest.java
new file mode 100644
index 0000000..140b5b6
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BackupServiceImplTest.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.BackupDAO;
+import com.epam.datalab.backendapi.resources.dto.BackupInfoRecord;
+import com.epam.datalab.dto.backup.EnvBackupDTO;
+import com.epam.datalab.dto.backup.EnvBackupStatus;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.BackupAPI;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class BackupServiceImplTest {
+
+    private final String USER = "test";
+
+    @Mock
+    private RESTService provisioningService;
+    @Mock
+    private BackupDAO backupDao;
+
+    @InjectMocks
+    private BackupServiceImpl backupService;
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+
+    @Test
+    public void createBackup() {
+        doNothing().when(backupDao).createOrUpdate(any(EnvBackupDTO.class), anyString(), any(EnvBackupStatus.class));
+        String expectedUuid = "1234-56789765-4321";
+        String token = "token";
+        when(provisioningService.post(refEq(BackupAPI.BACKUP), eq(token), any(EnvBackupDTO.class), any()))
+                .thenReturn(expectedUuid);
+
+        EnvBackupDTO ebDto = EnvBackupDTO.builder().build();
+        UserInfo userInfo = new UserInfo(USER, token);
+        String uuid = backupService.createBackup(ebDto, userInfo);
+        assertNotNull(uuid);
+        assertEquals(expectedUuid, uuid);
+
+        verify(backupDao).createOrUpdate(ebDto, USER, EnvBackupStatus.CREATING);
+        verify(provisioningService).post(BackupAPI.BACKUP, token, ebDto, String.class);
+        verifyNoMoreInteractions(backupDao, provisioningService);
+    }
+
+    @Test
+    public void updateStatus() {
+        doNothing().when(backupDao).createOrUpdate(any(EnvBackupDTO.class), anyString(), any(EnvBackupStatus.class));
+
+        EnvBackupDTO ebDto = EnvBackupDTO.builder().build();
+        backupService.updateStatus(ebDto, USER, EnvBackupStatus.CREATING);
+
+        verify(backupDao).createOrUpdate(ebDto, USER, EnvBackupStatus.CREATING);
+        verifyNoMoreInteractions(backupDao);
+    }
+
+    @Test
+    public void getBackups() {
+        BackupInfoRecord biRecord = mock(BackupInfoRecord.class);
+        when(backupDao.getBackups(anyString())).thenReturn(Collections.singletonList(biRecord));
+
+        List<BackupInfoRecord> biRecords = backupService.getBackups(USER);
+        assertNotNull(biRecords);
+        assertEquals(1, biRecords.size());
+        assertEquals(Collections.singletonList(biRecord), biRecords);
+
+        verify(backupDao).getBackups(USER);
+        verifyNoMoreInteractions(backupDao);
+    }
+
+    @Test
+    public void getBackup() {
+        BackupInfoRecord biRecord = mock(BackupInfoRecord.class);
+        when(backupDao.getBackup(anyString(), anyString())).thenReturn(Optional.of(biRecord));
+
+        String id = "someId";
+        BackupInfoRecord actualBiRecord = backupService.getBackup(USER, id);
+        assertNotNull(actualBiRecord);
+        assertEquals(biRecord, actualBiRecord);
+
+        verify(backupDao).getBackup(USER, id);
+        verifyNoMoreInteractions(backupDao);
+    }
+
+    @Test
+    public void getBackupWithException() {
+        String id = "someId";
+        doThrow(new ResourceNotFoundException(String.format("Backup with id %s was not found for user %s", id, USER)))
+                .when(backupDao).getBackup(USER, id);
+        expectedException.expect(ResourceNotFoundException.class);
+        expectedException.expectMessage("Backup with id " + id + " was not found for user " + USER);
+
+        backupService.getBackup(USER, id);
+    }
+
+    @Test
+    public void getBackupWhenBackupIsAbsent() {
+        String id = "someId";
+        when(backupDao.getBackup(USER, id)).thenReturn(Optional.empty());
+        expectedException.expect(ResourceNotFoundException.class);
+        expectedException.expectMessage("Backup with id " + id + " was not found for user " + USER);
+
+        backupService.getBackup(USER, id);
+    }
+
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BillingServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BillingServiceImplTest.java
new file mode 100644
index 0000000..672bc2e
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BillingServiceImplTest.java
@@ -0,0 +1,753 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.BillingDAO;
+import com.epam.datalab.backendapi.dao.ImageExploratoryDAO;
+import com.epam.datalab.backendapi.dao.ProjectDAO;
+import com.epam.datalab.backendapi.domain.BillingReport;
+import com.epam.datalab.backendapi.domain.BillingReportLine;
+import com.epam.datalab.backendapi.domain.BudgetDTO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
+import com.epam.datalab.backendapi.resources.TestBase;
+import com.epam.datalab.backendapi.resources.dto.BillingFilter;
+import com.epam.datalab.backendapi.resources.dto.ExportBillingFilter;
+import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord;
+import com.epam.datalab.backendapi.resources.dto.QuotaUsageDTO;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.billing.BillingData;
+import com.epam.datalab.dto.billing.BillingResourceType;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.dto.exploratory.ImageStatus;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import javax.ws.rs.core.GenericType;
+import java.time.LocalDate;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.StringJoiner;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyListOf;
+import static org.mockito.Matchers.anySet;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class BillingServiceImplTest extends TestBase {
+
+    private static final String PROJECT = "project";
+    private static final String PROJECT_2 = "project2";
+    private static final String ENDPOINT = "endpoint";
+    private static final String USAGE_DATE = "2020-06-00";
+    private static final String USAGE_DATE_FORMATTED = "2020-06-00";
+    private static final String SERVICE_BASE_NAME = "sbn";
+    private static final String IMAGE_NAME = "image_name";
+    private static final String IMAGE_DESCRIPTION = "imageDescription";
+    private static final String IMAGE_APPLICATION = "image_application";
+    private static final String IMAGE_FULL_NAME = "imageFullName";
+    private static final String BILLING_URL = "http://localhost:8088/api/billing";
+    private static final String EXPLORATORY_NAME = "exploratoryName";
+    private static final String COMPUTE_NAME = "computeName";
+    private static final String COMPUTE_NAME_2 = "computeName2";
+    private static final String CURRENCY = "currency";
+    private static final String PRODUCT = "product";
+    private static final String SHAPE = "shape";
+
+    private static final String SHARED_RESOURCE = "Shared resource";
+    private static final String SSN_ID = SERVICE_BASE_NAME + "-ssn";
+    private static final String SSN_VOLUME_ID = SERVICE_BASE_NAME + "-ssn" + "-volume-primary";
+    private static final String EDGE_ID_1 = SERVICE_BASE_NAME + "-" + PROJECT + "-" + ENDPOINT + "-edge";
+    private static final String EDGE_VOLUME_ID_1 = SERVICE_BASE_NAME + "-" + PROJECT + "-" + ENDPOINT + "-edge-volume-primary";
+    private static final String ENDPOINT_BUCKET_ID = SERVICE_BASE_NAME + "-" + PROJECT + "-" + ENDPOINT + "-bucket";
+    private static final String PROJECT_ENDPOINT_BUCKET_ID_1 = SERVICE_BASE_NAME + "-" + ENDPOINT + "-shared-bucket";
+    private static final String ENDPOINT_ID_1 = SERVICE_BASE_NAME + "-" + ENDPOINT + "-endpoint";
+    private static final String EXPLORATORY_ID = "exploratory_id";
+    private static final String EXPLORATORY_VOLUME_PRIMARY_ID_1 = EXPLORATORY_ID + "-volume-primary";
+    private static final String EXPLORATORY_SECONDARY_ID_1 = EXPLORATORY_ID + "-volume-secondary";
+    private static final String COMPUTE_ID = "compute_id";
+    private static final String COMPUTE_VOLUME_PRIMARY_ID = COMPUTE_ID + "-volume-primary";
+    private static final String COMPUTE_VOLUME_SECONDARY_ID = COMPUTE_ID + "-volume-secondary";
+    private static final String COMPUTE_MASTER_VOLUME_PRIMARY_ID = COMPUTE_ID + "-m" + "-volume-primary";
+    private static final String COMPUTE_MASTER_VOLUME_SECONDARY_ID = COMPUTE_ID + "-m" + "-volume-secondary";
+    private static final String COMPUTE_SLAVE_1_VOLUME_PRIMARY_ID = COMPUTE_ID + "-s1" + "-volume-primary";
+    private static final String COMPUTE_SLAVE_1_VOLUME_SECONDARY_ID = COMPUTE_ID + "-s1" + "-volume-secondary";
+    private static final String COMPUTE_SLAVE_2_VOLUME_PRIMARY_ID = COMPUTE_ID + "-s2" + "-volume-primary";
+    private static final String COMPUTE_SLAVE_2_VOLUME_SECONDARY_ID = COMPUTE_ID + "-s2" + "-volume-secondary";
+    private static final String IMAGE_ID = SERVICE_BASE_NAME + "-" + PROJECT + "-" + ENDPOINT + "-" + IMAGE_APPLICATION + "-" + IMAGE_NAME;
+	private static final Integer BILLING_PORT = 8088;
+
+    @Mock
+    private SelfServiceApplicationConfiguration configuration;
+    @Mock
+    private ProjectDAO projectDAO;
+    @Mock
+    private ProjectService projectService;
+    @Mock
+    private BillingDAO billingDAO;
+    @Mock
+    private EndpointService endpointService;
+    @Mock
+    private RESTService provisioningService;
+    @Mock
+    private ExploratoryService exploratoryService;
+    @Mock
+    private ImageExploratoryDAO imageExploratoryDAO;
+
+    @InjectMocks
+    private BillingServiceImpl billingService;
+
+    @Test
+    public void getBillingReport() {
+        when(billingDAO.aggregateBillingData(any(BillingFilter.class))).thenReturn(getBillingReportLineWithCost());
+        when(projectService.get(anyString())).thenReturn(getProjectDTO(Boolean.FALSE));
+        when(configuration.getServiceBaseName()).thenReturn(SERVICE_BASE_NAME);
+        when(exploratoryService.getUserInstance(anyString(), anyString(), anyString())).thenReturn(Optional.of(getUserInstanceDTO()));
+        when(exploratoryService.getUserInstance(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(Optional.of(getUserInstanceDTOWithCompute()));
+
+        BillingReport actualBillingReport = billingService.getBillingReport(getUserInfo(), new BillingFilter());
+
+        assertEquals("reports should be equal", getExpectedBillingReport(), actualBillingReport);
+        verify(billingDAO).aggregateBillingData(new BillingFilter());
+        verify(projectService).get(PROJECT);
+        verify(exploratoryService).getUserInstance(USER, PROJECT, EXPLORATORY_NAME);
+        verify(exploratoryService).getUserInstance(USER, PROJECT, EXPLORATORY_NAME, Boolean.TRUE);
+        verifyNoMoreInteractions(billingDAO);
+    }
+
+    @Test
+    public void getBillingReportWithNullCurrency() {
+        when(billingDAO.aggregateBillingData(any(BillingFilter.class))).thenReturn(getBillingReportLineWithDifferentCurrency());
+        when(configuration.getServiceBaseName()).thenReturn(SERVICE_BASE_NAME);
+
+        BillingReport actualBillingReport = billingService.getBillingReport(getUserInfo(), new BillingFilter());
+
+        assertEquals("reports should be equal", getExpectedBillingReportWithNullCurrency(), actualBillingReport);
+        verify(billingDAO).aggregateBillingData(new BillingFilter());
+        verifyNoMoreInteractions(billingDAO);
+    }
+
+    @Test
+    public void downloadReport() {
+        when(billingDAO.aggregateBillingData(any(BillingFilter.class))).thenReturn(getBillingReportLineWithCost());
+        when(projectService.get(anyString())).thenReturn(getProjectDTO(Boolean.FALSE));
+        when(configuration.getServiceBaseName()).thenReturn(SERVICE_BASE_NAME);
+        when(exploratoryService.getUserInstance(anyString(), anyString(), anyString())).thenReturn(Optional.of(getUserInstanceDTO()));
+        when(exploratoryService.getUserInstance(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(Optional.of(getUserInstanceDTOWithCompute()));
+
+	    String actualBillingReport = billingService.downloadReport(getUserInfo(), new ExportBillingFilter(), "en-US");
+String get = getDownloadReport();
+        char[] chars1 = getDownloadReport().toCharArray();
+        char[] chars2 = actualBillingReport.toCharArray();
+        for (int i = 0; i < getDownloadReport().length(); i++) {
+            if (chars1[i] != chars2[i])
+                System.out.println(chars1[i] + " = " + chars2[i] + "  i = " + i);
+        }
+
+	    assertEquals("reports should be equal", getDownloadReport(), actualBillingReport);
+	    verify(billingDAO).aggregateBillingData(new ExportBillingFilter());
+	    verify(projectService).get(PROJECT);
+        verify(exploratoryService).getUserInstance(USER, PROJECT, EXPLORATORY_NAME);
+        verify(exploratoryService).getUserInstance(USER, PROJECT, EXPLORATORY_NAME, Boolean.TRUE);
+        verifyNoMoreInteractions(billingDAO);
+    }
+
+    @Test
+    public void getExploratoryBillingData() {
+        when(billingDAO.findBillingData(anyString(), anyString(), anyListOf(String.class))).thenReturn(getBillingReportLineWithCost());
+
+        BillingReport actualReport = billingService.getExploratoryBillingData(PROJECT, ENDPOINT, EXPLORATORY_NAME, Arrays.asList(COMPUTE_NAME, COMPUTE_NAME_2));
+
+        assertEquals("reports should be equal", getReport(), actualReport);
+        verify(billingDAO).findBillingData(PROJECT, ENDPOINT, Arrays.asList(COMPUTE_NAME, COMPUTE_NAME_2, EXPLORATORY_NAME));
+        verifyNoMoreInteractions(billingDAO);
+    }
+
+    @Test
+    public void getExploratoryBillingDataWithNullCurrency() {
+        when(billingDAO.findBillingData(anyString(), anyString(), anyListOf(String.class))).thenReturn(getBillingReportLineWithDifferentCurrency());
+
+        BillingReport actualReport = billingService.getExploratoryBillingData(PROJECT, ENDPOINT, EXPLORATORY_NAME, Arrays.asList(COMPUTE_NAME, COMPUTE_NAME_2));
+
+        assertEquals("reports should be equal", getReportWithNullCurrency(), actualReport);
+        verify(billingDAO).findBillingData(PROJECT, ENDPOINT, Arrays.asList(COMPUTE_NAME, COMPUTE_NAME_2, EXPLORATORY_NAME));
+        verifyNoMoreInteractions(billingDAO);
+    }
+
+    @Test
+    public void updateGCPRemoteBillingData() {
+	    when(configuration.getServiceBaseName()).thenReturn(SERVICE_BASE_NAME);
+	    when(configuration.getBillingPort()).thenReturn(BILLING_PORT);
+	    when(configuration.getMaxSparkInstanceCount()).thenReturn(2);
+        when(endpointService.getEndpoints()).thenReturn(getGCPEndpointDTO());
+        when(provisioningService.get(anyString(), anyString(), any(GenericType.class))).thenReturn(getBillingData());
+        when(projectService.getProjects()).thenReturn(getProjectDTOs());
+        when(exploratoryService.findAll(anySet())).thenReturn(getUserInstanceDTOs());
+        when(imageExploratoryDAO.getImagesForProject(anyString())).thenReturn(getImageInfoRecords());
+
+        billingService.updateRemoteBillingData(getUserInfo());
+
+        verify(endpointService).getEndpoints();
+        verify(provisioningService).get(BILLING_URL, TOKEN, new GenericType<List<BillingData>>() {
+        });
+        verify(projectService).getProjects();
+        verify(exploratoryService).findAll(new HashSet<>(getProjectDTOs()));
+        verify(imageExploratoryDAO).getImagesForProject(PROJECT);
+        verify(billingDAO).deleteByUsageDateRegex(ENDPOINT, USAGE_DATE_FORMATTED);
+        verify(billingDAO).save(getBillingReportLine());
+        verifyNoMoreInteractions(endpointService, provisioningService, billingDAO, projectService, exploratoryService, imageExploratoryDAO);
+    }
+
+    @Test
+    public void updateAWSRemoteBillingData() {
+	    when(configuration.getServiceBaseName()).thenReturn(SERVICE_BASE_NAME);
+	    when(configuration.getBillingPort()).thenReturn(BILLING_PORT);
+	    when(configuration.getMaxSparkInstanceCount()).thenReturn(2);
+        when(endpointService.getEndpoints()).thenReturn(getAWSEndpointDTO());
+        when(provisioningService.get(anyString(), anyString(), any(GenericType.class))).thenReturn(getBillingData());
+        when(projectService.getProjects()).thenReturn(getProjectDTOs());
+        when(exploratoryService.findAll(anySet())).thenReturn(getUserInstanceDTOs());
+        when(imageExploratoryDAO.getImagesForProject(anyString())).thenReturn(getImageInfoRecords());
+
+        billingService.updateRemoteBillingData(getUserInfo());
+
+        verify(endpointService).getEndpoints();
+        verify(provisioningService).get(BILLING_URL, TOKEN, new GenericType<List<BillingData>>() {
+        });
+        verify(projectService).getProjects();
+        verify(exploratoryService).findAll(new HashSet<>(getProjectDTOs()));
+        verify(imageExploratoryDAO).getImagesForProject(PROJECT);
+        verify(billingDAO).deleteByUsageDate(ENDPOINT, USAGE_DATE);
+        verify(billingDAO).save(getBillingReportLine());
+        verifyNoMoreInteractions(endpointService, provisioningService, billingDAO, projectService, exploratoryService, imageExploratoryDAO);
+    }
+
+    @Test
+    public void updateAzureRemoteBillingData() {
+	    when(configuration.getServiceBaseName()).thenReturn(SERVICE_BASE_NAME);
+	    when(configuration.getBillingPort()).thenReturn(BILLING_PORT);
+	    when(configuration.getMaxSparkInstanceCount()).thenReturn(2);
+        when(endpointService.getEndpoints()).thenReturn(getAzureEndpointDTO());
+        when(provisioningService.get(anyString(), anyString(), any(GenericType.class))).thenReturn(getBillingData());
+        when(projectService.getProjects()).thenReturn(getProjectDTOs());
+        when(exploratoryService.findAll(anySet())).thenReturn(getUserInstanceDTOs());
+        when(imageExploratoryDAO.getImagesForProject(anyString())).thenReturn(getImageInfoRecords());
+
+        billingService.updateRemoteBillingData(getUserInfo());
+
+        verify(endpointService).getEndpoints();
+        verify(provisioningService).get(BILLING_URL, TOKEN, new GenericType<List<BillingData>>() {
+        });
+        verify(projectService).getProjects();
+        verify(exploratoryService).findAll(new HashSet<>(getProjectDTOs()));
+        verify(imageExploratoryDAO).getImagesForProject(PROJECT);
+        verify(billingDAO).save(getBillingReportLine());
+        verifyNoMoreInteractions(endpointService, provisioningService, billingDAO, projectService, exploratoryService, imageExploratoryDAO);
+    }
+
+    @Test(expected = DatalabException.class)
+    public void updateRemoteBillingDataWithException1() {
+        when(endpointService.getEndpoints()).thenReturn(Collections.emptyList());
+
+        billingService.updateRemoteBillingData(getUserInfo());
+    }
+
+    @Test
+    public void updateRemoteBillingDataWithException2() {
+	    when(configuration.getBillingPort()).thenReturn(BILLING_PORT);
+	    when(endpointService.getEndpoints()).thenReturn(getAWSEndpointDTO());
+        when(provisioningService.get(anyString(), anyString(), any(GenericType.class))).thenThrow(new DatalabException("Exception message"));
+
+        billingService.updateRemoteBillingData(getUserInfo());
+
+        verify(endpointService).getEndpoints();
+        verify(provisioningService).get(BILLING_URL, TOKEN, new GenericType<List<BillingData>>() {
+        });
+        verifyNoMoreInteractions(endpointService, provisioningService, billingDAO, projectService, exploratoryService, imageExploratoryDAO);
+    }
+
+    @Test
+    public void updateRemoteBillingDataWithException3() {
+        when(endpointService.getEndpoints()).thenReturn(getEndpointDTOWithWrongUrl());
+
+        billingService.updateRemoteBillingData(getUserInfo());
+
+        verify(endpointService).getEndpoints();
+        verifyNoMoreInteractions(endpointService, provisioningService, billingDAO, projectService, exploratoryService, imageExploratoryDAO);
+    }
+
+    @Test
+    public void getQuotas() {
+        when(billingDAO.getBillingQuoteUsed()).thenReturn(50);
+        when(projectService.getProjects(any(UserInfo.class))).thenReturn(getProjectDTOs(Boolean.FALSE));
+        when(projectDAO.getAllowedBudget(anyString())).thenReturn(Optional.of(10));
+        when(projectService.get(anyString())).thenReturn(getProjectDTO(Boolean.FALSE));
+        when(billingDAO.getOverallProjectCost(anyString())).thenReturn(5d);
+
+        QuotaUsageDTO quotas = billingService.getQuotas(getUserInfo());
+
+        assertEquals("QuotaUsageDTO should be equal", getQuotaUsageDTO(), quotas);
+        verify(billingDAO).getBillingQuoteUsed();
+        verify(projectService).getProjects(getUserInfo());
+        verify(projectDAO).getAllowedBudget(PROJECT);
+        verify(projectDAO).getAllowedBudget(PROJECT_2);
+        verify(projectService).get(PROJECT);
+        verify(projectService).get(PROJECT_2);
+        verify(billingDAO).getOverallProjectCost(PROJECT);
+        verify(billingDAO).getOverallProjectCost(PROJECT_2);
+        verifyNoMoreInteractions(projectDAO, projectService, billingDAO);
+    }
+
+    @Test
+    public void getMonthlyQuotas() {
+        when(billingDAO.getBillingQuoteUsed()).thenReturn(50);
+        when(projectService.getProjects(any(UserInfo.class))).thenReturn(getProjectDTOs(Boolean.FALSE));
+        when(projectDAO.getAllowedBudget(anyString())).thenReturn(Optional.of(10));
+        when(projectService.get(anyString())).thenReturn(getProjectDTO(Boolean.TRUE));
+        when(billingDAO.getMonthlyProjectCost(anyString(), any(LocalDate.class))).thenReturn(5d);
+
+        QuotaUsageDTO quotas = billingService.getQuotas(getUserInfo());
+
+        assertEquals("QuotaUsageDTO should be equal", getQuotaUsageDTO(), quotas);
+        verify(billingDAO).getBillingQuoteUsed();
+        verify(projectService).getProjects(getUserInfo());
+        verify(projectDAO).getAllowedBudget(PROJECT);
+        verify(projectDAO).getAllowedBudget(PROJECT_2);
+        verify(projectService).get(PROJECT);
+        verify(projectService).get(PROJECT_2);
+        verify(billingDAO).getMonthlyProjectCost(PROJECT, LocalDate.now());
+        verify(billingDAO).getMonthlyProjectCost(PROJECT_2, LocalDate.now());
+        verifyNoMoreInteractions(projectDAO, projectService, billingDAO);
+    }
+
+    @Test
+    public void isProjectQuoteReached() {
+        when(projectDAO.getAllowedBudget(anyString())).thenReturn(Optional.of(10));
+        when(projectService.get(anyString())).thenReturn(getProjectDTO(Boolean.FALSE));
+        when(billingDAO.getOverallProjectCost(anyString())).thenReturn(5d);
+
+        final boolean projectQuoteReached = billingService.isProjectQuoteReached(PROJECT);
+
+        assertEquals("quotes should be equal", Boolean.FALSE, projectQuoteReached);
+        verify(projectDAO).getAllowedBudget(PROJECT);
+        verify(projectService).get(PROJECT);
+        verify(billingDAO).getOverallProjectCost(PROJECT);
+        verifyNoMoreInteractions(projectDAO, projectService, billingDAO);
+    }
+
+    @Test
+    public void isProjectQuoteNullReached() {
+        when(projectDAO.getAllowedBudget(anyString())).thenReturn(Optional.of(10));
+        when(projectService.get(anyString())).thenReturn(getProjectQuoteNullDTO());
+        when(billingDAO.getOverallProjectCost(anyString())).thenReturn(5d);
+
+        final boolean projectQuoteReached = billingService.isProjectQuoteReached(PROJECT);
+
+        assertEquals("quotes should be equal", Boolean.FALSE, projectQuoteReached);
+        verify(projectDAO).getAllowedBudget(PROJECT);
+        verify(projectService).get(PROJECT);
+        verify(billingDAO).getOverallProjectCost(PROJECT);
+        verifyNoMoreInteractions(projectDAO, projectService, billingDAO);
+    }
+
+    @Test
+    public void isProjectMonthlyQuoteReached() {
+        when(projectDAO.getAllowedBudget(anyString())).thenReturn(Optional.of(10));
+        when(projectService.get(anyString())).thenReturn(getProjectDTO(Boolean.TRUE));
+        when(billingDAO.getMonthlyProjectCost(anyString(), any(LocalDate.class))).thenReturn(5d);
+
+        final boolean projectQuoteReached = billingService.isProjectQuoteReached(PROJECT);
+
+        assertEquals("quotes should be equal", Boolean.FALSE, projectQuoteReached);
+        verify(projectDAO).getAllowedBudget(PROJECT);
+        verify(projectService).get(PROJECT);
+        verify(billingDAO).getMonthlyProjectCost(PROJECT, LocalDate.now());
+        verifyNoMoreInteractions(projectDAO, projectService, billingDAO);
+    }
+
+    @Test
+    public void getBillingProjectQuoteUsed() {
+        when(projectDAO.getAllowedBudget(anyString())).thenReturn(Optional.of(10));
+        when(projectService.get(anyString())).thenReturn(getProjectDTO(Boolean.FALSE));
+        when(billingDAO.getOverallProjectCost(anyString())).thenReturn(5d);
+
+        final int billingProjectQuoteUsed = billingService.getBillingProjectQuoteUsed(PROJECT);
+
+        assertEquals("quotes should be equal", 50, billingProjectQuoteUsed);
+        verify(projectDAO).getAllowedBudget(PROJECT);
+        verify(projectService).get(PROJECT);
+        verify(billingDAO).getOverallProjectCost(PROJECT);
+        verifyNoMoreInteractions(projectDAO, projectService, billingDAO);
+    }
+
+    @Test
+    public void getBillingProjectQuoteNullUsed() {
+        when(projectDAO.getAllowedBudget(anyString())).thenReturn(Optional.of(10));
+        when(projectService.get(anyString())).thenReturn(getProjectQuoteNullDTO());
+        when(billingDAO.getOverallProjectCost(anyString())).thenReturn(5d);
+
+        final int billingProjectQuoteUsed = billingService.getBillingProjectQuoteUsed(PROJECT);
+
+        assertEquals("quotes should be equal", 50, billingProjectQuoteUsed);
+        verify(projectDAO).getAllowedBudget(PROJECT);
+        verify(projectService).get(PROJECT);
+        verify(billingDAO).getOverallProjectCost(PROJECT);
+        verifyNoMoreInteractions(projectDAO, projectService, billingDAO);
+    }
+
+    @Test
+    public void getBillingProjectMonthlyQuoteUsed() {
+        when(projectDAO.getAllowedBudget(anyString())).thenReturn(Optional.of(10));
+        when(projectService.get(anyString())).thenReturn(getProjectDTO(Boolean.TRUE));
+        when(billingDAO.getMonthlyProjectCost(anyString(), any(LocalDate.class))).thenReturn(5d);
+
+        final int billingProjectQuoteUsed = billingService.getBillingProjectQuoteUsed(PROJECT);
+
+        assertEquals("quotes should be equal", 50, billingProjectQuoteUsed);
+        verify(projectDAO).getAllowedBudget(PROJECT);
+        verify(projectService).get(PROJECT);
+        verify(billingDAO).getMonthlyProjectCost(PROJECT, LocalDate.now());
+        verifyNoMoreInteractions(projectDAO, projectService, billingDAO);
+    }
+
+    private ProjectDTO getProjectDTO(boolean isMonthlyBudget) {
+        return ProjectDTO.builder()
+                .name(PROJECT)
+                .budget(new BudgetDTO(10, isMonthlyBudget))
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT, UserInstanceStatus.RUNNING, null)))
+                .build();
+    }
+
+    private List<ProjectDTO> getProjectDTOs(boolean isMonthlyBudget) {
+        ProjectDTO project1 = ProjectDTO.builder()
+                .name(PROJECT)
+                .budget(new BudgetDTO(10, isMonthlyBudget))
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT, UserInstanceStatus.RUNNING, null)))
+                .build();
+        ProjectDTO project2 = ProjectDTO.builder()
+                .name(PROJECT_2)
+                .budget(new BudgetDTO(20, isMonthlyBudget))
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT, UserInstanceStatus.RUNNING, null)))
+                .build();
+        return Arrays.asList(project1, project2);
+    }
+
+    private ProjectDTO getProjectQuoteNullDTO() {
+        return ProjectDTO.builder()
+                .name(PROJECT)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT, UserInstanceStatus.RUNNING, null)))
+                .build();
+    }
+
+    private List<ProjectDTO> getProjectDTOs() {
+        return Collections.singletonList(ProjectDTO.builder()
+                .name(PROJECT)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT, UserInstanceStatus.RUNNING, null)))
+                .build());
+    }
+
+    private QuotaUsageDTO getQuotaUsageDTO() {
+        Map<String, Integer> projectQuotas = new HashMap<>();
+        projectQuotas.put(PROJECT, 50);
+        projectQuotas.put(PROJECT_2, 50);
+        return QuotaUsageDTO.builder()
+                .totalQuotaUsed(50)
+                .projectQuotas(projectQuotas)
+                .build();
+    }
+
+    private List<BillingData> getBillingData() {
+        BillingData ssnID = BillingData.builder().tag(SSN_ID).usageDate(USAGE_DATE).build();
+        BillingData ssnVolumeID = BillingData.builder().tag(SSN_VOLUME_ID).usageDate(USAGE_DATE).build();
+
+        BillingData edgeID = BillingData.builder().tag(EDGE_ID_1).usageDate(USAGE_DATE).build();
+        BillingData edgeVolumeId = BillingData.builder().tag(EDGE_VOLUME_ID_1).usageDate(USAGE_DATE).build();
+        BillingData endpointBucketId = BillingData.builder().tag(ENDPOINT_BUCKET_ID).usageDate(USAGE_DATE).build();
+
+        BillingData projectEndpointBucketId = BillingData.builder().tag(PROJECT_ENDPOINT_BUCKET_ID_1).usageDate(USAGE_DATE).build();
+        BillingData endpointId = BillingData.builder().tag(ENDPOINT_ID_1).usageDate(USAGE_DATE).build();
+
+        BillingData exploratoryId = BillingData.builder().tag(EXPLORATORY_ID).usageDate(USAGE_DATE).build();
+        BillingData exploratoryPrimaryVolumeId = BillingData.builder().tag(EXPLORATORY_VOLUME_PRIMARY_ID_1).usageDate(USAGE_DATE).build();
+        BillingData exploratorySecondaryVolumeId = BillingData.builder().tag(EXPLORATORY_SECONDARY_ID_1).usageDate(USAGE_DATE).build();
+
+        BillingData computeId = BillingData.builder().tag(COMPUTE_ID).usageDate(USAGE_DATE).build();
+        BillingData computePrimaryVolumeId = BillingData.builder().tag(COMPUTE_VOLUME_PRIMARY_ID).usageDate(USAGE_DATE).build();
+        BillingData computeSecondaryVolumeId = BillingData.builder().tag(COMPUTE_VOLUME_SECONDARY_ID).usageDate(USAGE_DATE).build();
+        BillingData computeMasterPrimaryVolumeId = BillingData.builder().tag(COMPUTE_MASTER_VOLUME_PRIMARY_ID).usageDate(USAGE_DATE).build();
+        BillingData computeMasterSecondaryVolumeId = BillingData.builder().tag(COMPUTE_MASTER_VOLUME_SECONDARY_ID).usageDate(USAGE_DATE).build();
+        BillingData computeSlave1PrimaryVolumeId = BillingData.builder().tag(COMPUTE_SLAVE_1_VOLUME_PRIMARY_ID).usageDate(USAGE_DATE).build();
+        BillingData computeSlave1SecondaryVolumeId = BillingData.builder().tag(COMPUTE_SLAVE_1_VOLUME_SECONDARY_ID).usageDate(USAGE_DATE).build();
+        BillingData computeSlave2PrimaryVolumeId = BillingData.builder().tag(COMPUTE_SLAVE_2_VOLUME_PRIMARY_ID).usageDate(USAGE_DATE).build();
+        BillingData computeSlave2SecondaryVolumeId = BillingData.builder().tag(COMPUTE_SLAVE_2_VOLUME_SECONDARY_ID).usageDate(USAGE_DATE).build();
+
+        BillingData imageId = BillingData.builder().tag(IMAGE_ID).usageDate(USAGE_DATE).build();
+
+
+        return Arrays.asList(ssnID, ssnVolumeID, edgeID, edgeVolumeId, endpointBucketId, projectEndpointBucketId, endpointId, exploratoryId, exploratoryPrimaryVolumeId,
+                exploratorySecondaryVolumeId, computeId, computePrimaryVolumeId, computeSecondaryVolumeId, computeMasterPrimaryVolumeId, computeMasterSecondaryVolumeId,
+                computeSlave1PrimaryVolumeId, computeSlave1SecondaryVolumeId, computeSlave2PrimaryVolumeId, computeSlave2SecondaryVolumeId, imageId);
+    }
+
+    private List<BillingReportLine> getBillingReportLine() {
+        BillingReportLine ssn = BillingReportLine.builder().datalabId(SSN_ID).usageDate(USAGE_DATE).application(ENDPOINT).resourceName("SSN")
+                .user(SHARED_RESOURCE).project(SHARED_RESOURCE).resourceType(BillingResourceType.SSN).build();
+        BillingReportLine ssnVolume = BillingReportLine.builder().datalabId(SSN_VOLUME_ID).usageDate(USAGE_DATE).application(ENDPOINT).resourceName("SSN Volume")
+                .user(SHARED_RESOURCE).project(SHARED_RESOURCE).resourceType(BillingResourceType.VOLUME).build();
+
+        BillingReportLine edge = BillingReportLine.builder().datalabId(EDGE_ID_1).usageDate(USAGE_DATE).application(ENDPOINT).resourceName(ENDPOINT)
+                .user(SHARED_RESOURCE).project(PROJECT).resourceType(BillingResourceType.EDGE).build();
+        BillingReportLine edgeVolumeId = BillingReportLine.builder().datalabId(EDGE_VOLUME_ID_1).usageDate(USAGE_DATE).application(ENDPOINT).resourceName("EDGE volume")
+                .user(SHARED_RESOURCE).project(PROJECT).resourceType(BillingResourceType.VOLUME).build();
+        BillingReportLine endpointBucketId = BillingReportLine.builder().datalabId(ENDPOINT_BUCKET_ID).usageDate(USAGE_DATE).application(ENDPOINT).resourceName("Project endpoint shared bucket")
+                .user(SHARED_RESOURCE).project(PROJECT).resourceType(BillingResourceType.BUCKET).build();
+
+        BillingReportLine projectEndpointBucket = BillingReportLine.builder().datalabId(PROJECT_ENDPOINT_BUCKET_ID_1).usageDate(USAGE_DATE).application(ENDPOINT).resourceName("Endpoint shared bucket")
+                .user(SHARED_RESOURCE).project(SHARED_RESOURCE).resourceType(BillingResourceType.BUCKET).build();
+        BillingReportLine endpoint = BillingReportLine.builder().datalabId(ENDPOINT_ID_1).usageDate(USAGE_DATE).application(ENDPOINT).resourceName("Endpoint")
+                .user(SHARED_RESOURCE).project(SHARED_RESOURCE).resourceType(BillingResourceType.ENDPOINT).build();
+
+        BillingReportLine exploratory = BillingReportLine.builder().datalabId(EXPLORATORY_ID).usageDate(USAGE_DATE).application(ENDPOINT)
+                .user(USER).project(PROJECT).endpoint(ENDPOINT).resourceName(EXPLORATORY_NAME).resourceType(BillingResourceType.EXPLORATORY).build();
+        BillingReportLine exploratoryPrimaryVolume = BillingReportLine.builder().datalabId(EXPLORATORY_VOLUME_PRIMARY_ID_1).usageDate(USAGE_DATE).application(ENDPOINT)
+                .user(USER).project(PROJECT).endpoint(ENDPOINT).resourceName(EXPLORATORY_NAME).resourceType(BillingResourceType.VOLUME).build();
+        BillingReportLine exploratorySecondaryVolume = BillingReportLine.builder().datalabId(EXPLORATORY_SECONDARY_ID_1).usageDate(USAGE_DATE).application(ENDPOINT)
+                .user(USER).project(PROJECT).endpoint(ENDPOINT).resourceName(EXPLORATORY_NAME).resourceType(BillingResourceType.VOLUME).build();
+
+        BillingReportLine compute = BillingReportLine.builder().datalabId(COMPUTE_ID).usageDate(USAGE_DATE).application(ENDPOINT).user(USER).project(PROJECT)
+                .endpoint(ENDPOINT).resourceName(COMPUTE_NAME).resourceType(BillingResourceType.COMPUTATIONAL).shape("3 x " + SHAPE).exploratoryName(EXPLORATORY_NAME).build();
+        BillingReportLine computePrimaryVolume = BillingReportLine.builder().datalabId(COMPUTE_VOLUME_PRIMARY_ID).usageDate(USAGE_DATE).application(ENDPOINT).user(USER)
+                .project(PROJECT).endpoint(ENDPOINT).resourceName(COMPUTE_NAME).resourceType(BillingResourceType.VOLUME).build();
+        BillingReportLine computeSecondaryVolume = BillingReportLine.builder().datalabId(COMPUTE_VOLUME_SECONDARY_ID).usageDate(USAGE_DATE).application(ENDPOINT).user(USER)
+                .project(PROJECT).endpoint(ENDPOINT).resourceName(COMPUTE_NAME).resourceType(BillingResourceType.VOLUME).build();
+        BillingReportLine computeMasterPrimaryVolume = BillingReportLine.builder().datalabId(COMPUTE_MASTER_VOLUME_PRIMARY_ID).usageDate(USAGE_DATE).application(ENDPOINT)
+                .user(USER).project(PROJECT).endpoint(ENDPOINT).resourceName(COMPUTE_NAME).resourceType(BillingResourceType.VOLUME).build();
+        BillingReportLine computeMasterSecondaryVolume = BillingReportLine.builder().datalabId(COMPUTE_MASTER_VOLUME_SECONDARY_ID).usageDate(USAGE_DATE).application(ENDPOINT)
+                .user(USER).project(PROJECT).endpoint(ENDPOINT).resourceName(COMPUTE_NAME).resourceType(BillingResourceType.VOLUME).build();
+        BillingReportLine computeSlave1PrimaryVolume = BillingReportLine.builder().datalabId(COMPUTE_SLAVE_1_VOLUME_PRIMARY_ID).usageDate(USAGE_DATE).application(ENDPOINT)
+                .user(USER).project(PROJECT).endpoint(ENDPOINT).resourceName(COMPUTE_NAME).resourceType(BillingResourceType.VOLUME).build();
+        BillingReportLine computeSlave1SecondaryVolume = BillingReportLine.builder().datalabId(COMPUTE_SLAVE_1_VOLUME_SECONDARY_ID).usageDate(USAGE_DATE).application(ENDPOINT)
+                .user(USER).project(PROJECT).endpoint(ENDPOINT).resourceName(COMPUTE_NAME).resourceType(BillingResourceType.VOLUME).build();
+        BillingReportLine computeSlave2PrimaryVolume = BillingReportLine.builder().datalabId(COMPUTE_SLAVE_2_VOLUME_PRIMARY_ID).usageDate(USAGE_DATE).application(ENDPOINT)
+                .user(USER).project(PROJECT).endpoint(ENDPOINT).resourceName(COMPUTE_NAME).resourceType(BillingResourceType.VOLUME).build();
+        BillingReportLine computeSlave2SecondaryVolume = BillingReportLine.builder().datalabId(COMPUTE_SLAVE_2_VOLUME_SECONDARY_ID).usageDate(USAGE_DATE).application(ENDPOINT)
+                .user(USER).project(PROJECT).endpoint(ENDPOINT).resourceName(COMPUTE_NAME).resourceType(BillingResourceType.VOLUME).build();
+
+        BillingReportLine image = BillingReportLine.builder().datalabId(IMAGE_ID).usageDate(USAGE_DATE).application(ENDPOINT)
+                .user(USER).project(PROJECT).resourceName(IMAGE_NAME).resourceType(BillingResourceType.IMAGE).build();
+
+        return Arrays.asList(ssn, ssnVolume, edge, edgeVolumeId, endpointBucketId, projectEndpointBucket, endpoint, exploratory, exploratoryPrimaryVolume,
+                exploratorySecondaryVolume, compute, computePrimaryVolume, computeSecondaryVolume, computeMasterPrimaryVolume, computeMasterSecondaryVolume,
+                computeSlave1PrimaryVolume, computeSlave1SecondaryVolume, computeSlave2PrimaryVolume, computeSlave2SecondaryVolume, image);
+    }
+
+    private List<BillingReportLine> getBillingReportLineWithCost() {
+        BillingReportLine line1 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-01-01")).usageDateTo(LocalDate.parse("2020-03-01")).cost(1.999)
+                .currency(CURRENCY).datalabId(EDGE_ID_1).user(USER).product(PRODUCT).shape(SHAPE).resourceType(BillingResourceType.EDGE).project(PROJECT)
+                .resourceName(ENDPOINT).build();
+        BillingReportLine line2 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-02-01")).usageDateTo(LocalDate.parse("2020-05-01")).cost(1.0)
+                .currency(CURRENCY).datalabId(EXPLORATORY_ID).product(PRODUCT).shape(SHAPE).user(USER).resourceType(BillingResourceType.EXPLORATORY).project(PROJECT)
+                .resourceName(EXPLORATORY_NAME).build();
+        BillingReportLine line3 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-03-01")).usageDateTo(LocalDate.parse("2020-04-01")).cost(1.0)
+                .currency(CURRENCY).datalabId(COMPUTE_ID).product(PRODUCT).shape(SHAPE).user(USER).resourceType(BillingResourceType.COMPUTATIONAL).project(PROJECT)
+                .resourceName(COMPUTE_NAME)
+                .exploratoryName(EXPLORATORY_NAME).build();
+
+        return Arrays.asList(line1, line2, line3);
+    }
+
+    private List<BillingReportLine> getBillingReportLineWithDifferentCurrency() {
+        BillingReportLine line1 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-01-01")).usageDateTo(LocalDate.parse("2020-03-01")).cost(1.999)
+                .currency(CURRENCY).build();
+        BillingReportLine line2 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-02-01")).usageDateTo(LocalDate.parse("2020-05-01")).cost(1.0)
+                .currency("currency2").build();
+        BillingReportLine line3 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-03-01")).usageDateTo(LocalDate.parse("2020-04-01")).cost(1.0)
+                .currency(CURRENCY).build();
+
+        return Arrays.asList(line1, line2, line3);
+    }
+
+    private BillingReport getReport() {
+        BillingReportLine line1 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-01-01")).usageDateTo(LocalDate.parse("2020-03-01")).cost(2.0)
+                .currency(CURRENCY).datalabId(EDGE_ID_1).user(USER).product(PRODUCT).shape(SHAPE).resourceType(BillingResourceType.EDGE).project(PROJECT)
+                .resourceName(ENDPOINT).build();
+        BillingReportLine line2 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-02-01")).usageDateTo(LocalDate.parse("2020-05-01")).cost(1.0)
+                .currency(CURRENCY).datalabId(EXPLORATORY_ID).product(PRODUCT).shape(SHAPE).user(USER).resourceType(BillingResourceType.EXPLORATORY).project(PROJECT)
+                .resourceName(EXPLORATORY_NAME).build();
+        BillingReportLine line3 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-03-01")).usageDateTo(LocalDate.parse("2020-04-01")).cost(1.0)
+                .currency(CURRENCY).datalabId(COMPUTE_ID).product(PRODUCT).shape(SHAPE).user(USER).resourceType(BillingResourceType.COMPUTATIONAL).project(PROJECT)
+                .resourceName(COMPUTE_NAME).exploratoryName(EXPLORATORY_NAME).build();
+        List<BillingReportLine> billingReportLines = Arrays.asList(line1, line2, line3);
+
+        return BillingReport.builder()
+                .name(EXPLORATORY_NAME)
+                .reportLines(billingReportLines)
+                .totalCost(4.0)
+                .currency(CURRENCY)
+                .build();
+    }
+
+    private BillingReport getReportWithNullCurrency() {
+        BillingReportLine line1 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-01-01")).usageDateTo(LocalDate.parse("2020-03-01")).cost(2.0)
+                .currency(CURRENCY).build();
+        BillingReportLine line2 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-02-01")).usageDateTo(LocalDate.parse("2020-05-01")).cost(1.0)
+                .currency("currency2").build();
+        BillingReportLine line3 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-03-01")).usageDateTo(LocalDate.parse("2020-04-01")).cost(1.0)
+                .currency(CURRENCY).build();
+        List<BillingReportLine> billingReportLines = Arrays.asList(line1, line2, line3);
+
+        return BillingReport.builder()
+                .name(EXPLORATORY_NAME)
+                .reportLines(billingReportLines)
+                .totalCost(4.0)
+                .currency(null)
+                .build();
+    }
+
+    private BillingReport getExpectedBillingReport() {
+        BillingReportLine line1 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-01-01")).usageDateTo(LocalDate.parse("2020-03-01")).cost(1.999)
+                .currency(CURRENCY).datalabId(EDGE_ID_1).user(USER).product(PRODUCT).shape(SHAPE).resourceType(BillingResourceType.EDGE).project(PROJECT)
+                .resourceName(ENDPOINT).status(UserInstanceStatus.RUNNING).build();
+        BillingReportLine line2 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-02-01")).usageDateTo(LocalDate.parse("2020-05-01")).cost(1.0)
+                .currency(CURRENCY).datalabId(EXPLORATORY_ID).product(PRODUCT).shape(SHAPE).user(USER).resourceType(BillingResourceType.EXPLORATORY).project(PROJECT)
+                .resourceName(EXPLORATORY_NAME).status(UserInstanceStatus.FAILED).build();
+        BillingReportLine line3 = BillingReportLine.builder().usageDateFrom(LocalDate.parse("2020-03-01")).usageDateTo(LocalDate.parse("2020-04-01")).cost(1.0)
+                .currency(CURRENCY).datalabId(COMPUTE_ID).product(PRODUCT).shape(SHAPE).user(USER).resourceType(BillingResourceType.COMPUTATIONAL).project(PROJECT)
+                .resourceName(COMPUTE_NAME).exploratoryName(EXPLORATORY_NAME).status(UserInstanceStatus.CREATING).build();
+        List<BillingReportLine> billingReportLines = Arrays.asList(line1, line2, line3);
+
+        return BillingReport.builder()
+                .name("Billing report")
+                .sbn(SERVICE_BASE_NAME)
+                .reportLines(billingReportLines)
+                .usageDateFrom(LocalDate.parse("2020-01-01"))
+                .usageDateTo(LocalDate.parse("2020-05-01"))
+                .totalCost(4.0)
+                .currency(CURRENCY)
+                .isReportHeaderCompletable(Boolean.TRUE)
+                .build();
+    }
+
+    private BillingReport getExpectedBillingReportWithNullCurrency() {
+        return BillingReport.builder()
+                .name("Billing report")
+                .sbn(SERVICE_BASE_NAME)
+                .reportLines(getBillingReportLineWithDifferentCurrency())
+                .usageDateFrom(LocalDate.parse("2020-01-01"))
+                .usageDateTo(LocalDate.parse("2020-05-01"))
+                .totalCost(4.0)
+                .currency(null)
+                .isReportHeaderCompletable(Boolean.TRUE)
+                .build();
+    }
+
+    private String getDownloadReport() {
+	    StringBuilder sb = new StringBuilder();
+	    sb.append("\"Service base name: ").append(SERVICE_BASE_NAME).append(". Available reporting period from: ").append("Jan 1, 2020")
+			    .append(" to: ").append("May 1, 2020").append("\"\r\n");
+
+	    sb.append(new StringJoiner(",").add("DataLab ID").add("User").add("Project").add("DataLab Resource Type").add("Status").add("Shape").add("Product")
+			    .add("Cost\r\n").toString());
+
+	    sb.append(new StringJoiner(",").add(EDGE_ID_1).add(USER).add(PROJECT).add("Edge").add("running").add(SHAPE).add(PRODUCT).add(1.999 + "\r\n"));
+	    sb.append(new StringJoiner(",").add(EXPLORATORY_ID).add(USER).add(PROJECT).add("Exploratory").add("failed").add(SHAPE).add(PRODUCT).add(1.0 + "\r\n"));
+	    sb.append(new StringJoiner(",").add(COMPUTE_ID).add(USER).add(PROJECT).add("Computational").add("creating").add(SHAPE).add(PRODUCT).add(1.0 + "\r\n"));
+
+	    sb.append(",,,,,,,Total: 4.0 currency\r\n");
+
+        return sb.toString();
+    }
+
+    private List<EndpointDTO> getGCPEndpointDTO() {
+        return Collections.singletonList(new EndpointDTO(ENDPOINT, ENDPOINT_URL, ENDPOINT_ACCOUNT, ENDPOINT_TAG, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.GCP));
+    }
+
+    private List<EndpointDTO> getAWSEndpointDTO() {
+        return Collections.singletonList(new EndpointDTO(ENDPOINT, ENDPOINT_URL, ENDPOINT_ACCOUNT, ENDPOINT_TAG, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS));
+    }
+
+    private List<EndpointDTO> getAzureEndpointDTO() {
+        return Collections.singletonList(new EndpointDTO(ENDPOINT, ENDPOINT_URL, ENDPOINT_ACCOUNT, ENDPOINT_TAG, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AZURE));
+    }
+
+    private List<EndpointDTO> getEndpointDTOWithWrongUrl() {
+        return Collections.singletonList(new EndpointDTO(ENDPOINT, "wrong url", ENDPOINT_ACCOUNT, ENDPOINT_TAG, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AZURE));
+    }
+
+    private List<UserInstanceDTO> getUserInstanceDTOs() {
+        return Collections.singletonList(
+                new UserInstanceDTO().withExploratoryId(EXPLORATORY_ID).withUser(USER).withProject(PROJECT).withExploratoryName(EXPLORATORY_NAME).withEndpoint(ENDPOINT)
+                        .withResources(Collections.singletonList(getCompute())));
+    }
+
+    private UserInstanceDTO getUserInstanceDTO() {
+        return new UserInstanceDTO().withExploratoryId(EXPLORATORY_ID).withUser(USER).withProject(PROJECT).withExploratoryName(EXPLORATORY_NAME).withEndpoint(ENDPOINT)
+                .withStatus("failed");
+    }
+
+    private UserInstanceDTO getUserInstanceDTOWithCompute() {
+        return new UserInstanceDTO().withExploratoryId(EXPLORATORY_ID).withUser(USER).withProject(PROJECT).withExploratoryName(EXPLORATORY_NAME).withEndpoint(ENDPOINT)
+                .withStatus("failed").withResources(Collections.singletonList(getCompute()));
+    }
+
+    private UserComputationalResource getCompute() {
+        UserComputationalResource resource = new UserComputationalResource();
+        resource.setComputationalId(COMPUTE_ID);
+        resource.setComputationalName(COMPUTE_NAME);
+        resource.setImageName(DataEngineType.SPARK_STANDALONE.getName());
+        resource.setDataengineInstanceCount(3);
+        resource.setDataengineShape(SHAPE);
+        resource.setStatus("creating");
+
+        return resource;
+    }
+
+    private List<ImageInfoRecord> getImageInfoRecords() {
+        return Collections.singletonList(
+                new ImageInfoRecord(IMAGE_NAME, IMAGE_DESCRIPTION, PROJECT, ENDPOINT, USER, IMAGE_APPLICATION, IMAGE_FULL_NAME, ImageStatus.CREATED)
+        );
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BucketServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BucketServiceImplTest.java
new file mode 100644
index 0000000..d9c92fb
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/BucketServiceImplTest.java
@@ -0,0 +1,264 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.resources.TestBase;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.dto.bucket.BucketDTO;
+import com.epam.datalab.dto.bucket.BucketDeleteDTO;
+import com.epam.datalab.dto.bucket.FolderUploadDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import org.apache.http.HttpStatus;
+import org.glassfish.jersey.media.multipart.FormDataMultiPart;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.time.LocalDate;
+import java.util.Collections;
+import java.util.List;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class BucketServiceImplTest extends TestBase {
+
+    private static final String BUCKET_GET_OBJECTS = "%sbucket/%s";
+    private static final String BUCKET_UPLOAD_OBJECT = "%sbucket/upload";
+    private static final String BUCKET_UPLOAD_FOLDER = "%sbucket/folder/upload";
+    private static final String BUCKET_DOWNLOAD_OBJECT = "%sbucket/%s/object/%s/download";
+    private static final String BUCKET_DELETE_OBJECT = "%sbucket/objects/delete";
+    private static final String BUCKET = "bucket";
+    private static final String OBJECT = "object";
+    private static final String SIZE = "size";
+    private static final long DATE = LocalDate.now().toEpochDay();
+    private static final String FOLDER = "folder/";
+
+    @Mock
+    private EndpointService endpointService;
+    @Mock
+    private RESTService provisioningService;
+    @InjectMocks
+    private BucketServiceImpl bucketService;
+
+    @Test
+    public void getObjects() {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        List<BucketDTO> objects = getBucketList();
+        when(endpointService.get(anyString())).thenReturn(endpointDTO);
+        when(provisioningService.get(anyString(), anyString(), any(GenericType.class))).thenReturn(objects);
+
+        List<BucketDTO> actualObjects = bucketService.getObjects(getUserInfo(), BUCKET, ENDPOINT_NAME);
+
+        assertEquals("lists should be equal", objects, actualObjects);
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).get(String.format(BUCKET_GET_OBJECTS, ENDPOINT_URL, BUCKET), TOKEN, new GenericType<List<BucketDTO>>() {
+        });
+        verifyNoMoreInteractions(endpointService, provisioningService);
+    }
+
+    @Test(expected = DatalabException.class)
+    public void getObjectsWithException() {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        when(endpointService.get(anyString())).thenReturn(endpointDTO);
+        when(provisioningService.get(anyString(), anyString(), any(GenericType.class))).thenThrow(new DatalabException("Exception message"));
+
+        bucketService.getObjects(getUserInfo(), BUCKET, ENDPOINT_NAME);
+
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).get(String.format(BUCKET_GET_OBJECTS, ENDPOINT_URL, BUCKET), TOKEN, new GenericType<List<BucketDTO>>() {
+        });
+
+        verifyNoMoreInteractions(endpointService, provisioningService);
+    }
+
+    @Test
+    public void uploadObject() {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        Response response = Response.ok().build();
+        when(endpointService.get(anyString())).thenReturn(endpointDTO);
+        when(provisioningService.postForm(anyString(), anyString(), any(FormDataMultiPart.class), any())).thenReturn(response);
+
+        bucketService.uploadObject(getUserInfo(), BUCKET, OBJECT, ENDPOINT_NAME, getInputStream(), APPLICATION_JSON, 0, null);
+
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).postForm(eq(String.format(BUCKET_UPLOAD_OBJECT, ENDPOINT_URL)), eq(TOKEN), any(FormDataMultiPart.class), eq(Response.class));
+        verifyNoMoreInteractions(endpointService, provisioningService);
+    }
+
+    @Test(expected = DatalabException.class)
+    public void uploadObjectWithException1() {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        Response response = Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
+        when(endpointService.get(anyString())).thenReturn(endpointDTO);
+        when(provisioningService.postForm(anyString(), anyString(), any(FormDataMultiPart.class), any())).thenReturn(response);
+
+        bucketService.uploadObject(getUserInfo(), BUCKET, OBJECT, ENDPOINT_NAME, getInputStream(), APPLICATION_JSON, 0, null);
+
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).postForm(eq(String.format(BUCKET_UPLOAD_OBJECT, ENDPOINT_URL)), eq(TOKEN), any(FormDataMultiPart.class), eq(Response.class));
+        verifyNoMoreInteractions(endpointService, provisioningService);
+    }
+
+    @Test(expected = DatalabException.class)
+    public void uploadObjectWithException2() {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        when(endpointService.get(anyString())).thenReturn(endpointDTO);
+
+        bucketService.uploadObject(getUserInfo(), BUCKET, OBJECT, ENDPOINT_NAME, null, APPLICATION_JSON, 0, null);
+
+        verify(endpointService).get(ENDPOINT_NAME);
+        verifyNoMoreInteractions(endpointService, provisioningService);
+    }
+
+    @Test
+    public void uploadFolder() {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        Response response = Response.ok().build();
+        when(endpointService.get(anyString())).thenReturn(endpointDTO);
+        when(provisioningService.post(anyString(), anyString(), any(FolderUploadDTO.class), any())).thenReturn(response);
+
+        bucketService.uploadFolder(getUserInfo(), BUCKET, FOLDER, ENDPOINT_NAME, null);
+
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).post(eq(String.format(BUCKET_UPLOAD_FOLDER, ENDPOINT_URL)), eq(TOKEN), eq(getFolderUploadDTO()), eq(Response.class));
+        verifyNoMoreInteractions(endpointService, provisioningService);
+    }
+
+    @Test(expected = DatalabException.class)
+    public void uploadFolderWithException1() {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        Response response = Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
+        when(endpointService.get(anyString())).thenReturn(endpointDTO);
+        when(provisioningService.post(anyString(), anyString(), any(FolderUploadDTO.class), any())).thenReturn(response);
+
+        bucketService.uploadFolder(getUserInfo(), BUCKET, FOLDER, ENDPOINT_NAME, null);
+
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).post(eq(String.format(BUCKET_UPLOAD_FOLDER, ENDPOINT_URL)), eq(TOKEN), eq(getFolderUploadDTO()), eq(Response.class));
+        verifyNoMoreInteractions(endpointService, provisioningService);
+    }
+
+    @Test(expected = DatalabException.class)
+    public void uploadFolderWithException2() {
+        bucketService.uploadFolder(getUserInfo(), BUCKET, "folder_name_without_slash", ENDPOINT_NAME, null);
+    }
+
+    @Test
+    public void downloadObject() throws IOException {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        HttpServletResponse response = mock(HttpServletResponse.class);
+        ServletOutputStream outputStream = mock(ServletOutputStream.class);
+        when(endpointService.get(anyString())).thenReturn(endpointDTO);
+        when(provisioningService.getWithMediaTypes(anyString(), anyString(), any(), anyString(), anyString())).thenReturn(getInputStream());
+        when(response.getOutputStream()).thenReturn(outputStream);
+
+        bucketService.downloadObject(getUserInfo(), BUCKET, OBJECT, ENDPOINT_NAME, response, null);
+
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).getWithMediaTypes(eq(String.format(BUCKET_DOWNLOAD_OBJECT, ENDPOINT_URL, BUCKET, OBJECT)), eq(TOKEN), eq(InputStream.class),
+                eq(APPLICATION_JSON), eq(APPLICATION_OCTET_STREAM));
+        verifyNoMoreInteractions(endpointService, provisioningService);
+    }
+
+    @Test(expected = DatalabException.class)
+    public void downloadObjectWithException() {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        HttpServletResponse response = mock(HttpServletResponse.class);
+        when(endpointService.get(anyString())).thenReturn(endpointDTO);
+        when(provisioningService.getWithMediaTypes(anyString(), anyString(), any(), anyString(), anyString())).thenThrow(new DatalabException("Exception message"));
+
+        bucketService.downloadObject(getUserInfo(), BUCKET, OBJECT, ENDPOINT_NAME, response, null);
+
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).getWithMediaTypes(eq(String.format(BUCKET_DOWNLOAD_OBJECT, ENDPOINT_URL, BUCKET, OBJECT)), eq(TOKEN), eq(InputStream.class),
+                eq(APPLICATION_JSON), eq(APPLICATION_OCTET_STREAM));
+        verifyNoMoreInteractions(endpointService, provisioningService);
+    }
+
+    @Test
+    public void deleteObjects() {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        Response response = Response.ok().build();
+        when(endpointService.get(anyString())).thenReturn(endpointDTO);
+        when(provisioningService.post(anyString(), anyString(), any(BucketDeleteDTO.class), any())).thenReturn(response);
+
+        bucketService.deleteObjects(getUserInfo(), BUCKET, Collections.singletonList(OBJECT), ENDPOINT_NAME, null);
+
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).post(eq(String.format(BUCKET_DELETE_OBJECT, ENDPOINT_URL)), eq(TOKEN), eq(getBucketDeleteDTO()), eq(Response.class));
+        verifyNoMoreInteractions(endpointService, provisioningService);
+    }
+
+    @Test(expected = DatalabException.class)
+    public void deleteObjectsWithException() {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        Response response = Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
+        when(endpointService.get(anyString())).thenReturn(endpointDTO);
+        when(provisioningService.post(anyString(), anyString(), any(BucketDeleteDTO.class), any())).thenReturn(response);
+
+        bucketService.deleteObjects(getUserInfo(), BUCKET, Collections.singletonList(OBJECT), ENDPOINT_NAME, null);
+
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(provisioningService).post(eq(String.format(BUCKET_DELETE_OBJECT, ENDPOINT_URL)), eq(TOKEN), eq(getBucketDeleteDTO()), eq(Response.class));
+        verifyNoMoreInteractions(endpointService, provisioningService);
+    }
+
+    private List<BucketDTO> getBucketList() {
+        return Collections.singletonList(BucketDTO.builder()
+                .bucket(BUCKET)
+                .object(OBJECT)
+                .size(SIZE)
+                .lastModifiedDate(DATE)
+                .build());
+    }
+
+    private FolderUploadDTO getFolderUploadDTO() {
+        return new FolderUploadDTO(BUCKET, FOLDER);
+    }
+
+    private BucketDeleteDTO getBucketDeleteDTO() {
+        return new BucketDeleteDTO(BUCKET, Collections.singletonList(OBJECT));
+    }
+
+    private ByteArrayInputStream getInputStream() {
+        return new ByteArrayInputStream("input stream".getBytes());
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImplTest.java
new file mode 100644
index 0000000..fe74a7a
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ComputationalServiceImplTest.java
@@ -0,0 +1,788 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.resources.dto.ComputationalCreateFormDTO;
+import com.epam.datalab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.service.TagService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.base.computational.ComputationalBase;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.epam.datalab.dto.computational.ComputationalClusterConfigDTO;
+import com.epam.datalab.dto.computational.ComputationalStartDTO;
+import com.epam.datalab.dto.computational.ComputationalStatusDTO;
+import com.epam.datalab.dto.computational.ComputationalStopDTO;
+import com.epam.datalab.dto.computational.ComputationalTerminateDTO;
+import com.epam.datalab.dto.computational.SparkStandaloneClusterResource;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.rest.client.RESTService;
+import com.epam.datalab.rest.contracts.ComputationalAPI;
+import com.mongodb.client.result.UpdateResult;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import static com.epam.datalab.dto.UserInstanceStatus.CREATING;
+import static com.epam.datalab.dto.UserInstanceStatus.RUNNING;
+import static com.epam.datalab.dto.UserInstanceStatus.STOPPED;
+import static com.epam.datalab.rest.contracts.ComputationalAPI.AUDIT_COMPUTATIONAL_RECONFIGURE_MESSAGE;
+import static com.epam.datalab.rest.contracts.ComputationalAPI.AUDIT_MESSAGE;
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyListOf;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+
+@RunWith(MockitoJUnitRunner.class)
+public class ComputationalServiceImplTest {
+
+    private static final long MAX_INACTIVITY = 10L;
+    private static final String DOCKER_DATALAB_DATAENGINE = "docker.datalab-dataengine";
+    private static final String DOCKER_DATALAB_DATAENGINE_SERVICE = "docker.datalab-dataengine-service";
+    private static final String COMP_ID = "compId";
+    private final String USER = "test";
+    private final String TOKEN = "token";
+    private final String EXPLORATORY_NAME = "expName";
+    private final String PROJECT = "project";
+    private final String COMP_NAME = "compName";
+    private final String NOTE_BOOK_NAME = "notebookName";
+    private final String UUID = "1234-56789765-4321";
+    private final LocalDateTime LAST_ACTIVITY = LocalDateTime.now().minusMinutes(MAX_INACTIVITY);
+
+    private UserInfo userInfo;
+    private List<ComputationalCreateFormDTO> formList;
+    private UserInstanceDTO userInstance;
+    private ComputationalStatusDTO computationalStatusDTOWithStatusTerminating;
+    private ComputationalStatusDTO computationalStatusDTOWithStatusFailed;
+    private ComputationalStatusDTO computationalStatusDTOWithStatusStopping;
+    private ComputationalStatusDTO computationalStatusDTOWithStatusStarting;
+    private SparkStandaloneClusterResource sparkClusterResource;
+    private UserComputationalResource ucResource;
+
+    @Mock
+    private ProjectService projectService;
+    @Mock
+    private ExploratoryDAO exploratoryDAO;
+    @Mock
+    private ComputationalDAO computationalDAO;
+    @Mock
+    private RESTService provisioningService;
+    @Mock
+    private SelfServiceApplicationConfiguration configuration;
+    @Mock
+    private RequestBuilder requestBuilder;
+    @Mock
+    private RequestId requestId;
+    @Mock
+    private TagService tagService;
+    @Mock
+    private EndpointService endpointService;
+
+    @InjectMocks
+    private ComputationalServiceImpl computationalService;
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Before
+    public void setUp() {
+        userInfo = getUserInfo();
+        userInstance = getUserInstanceDto();
+        formList = getFormList();
+        computationalStatusDTOWithStatusTerminating = getComputationalStatusDTOWithStatus("terminating");
+        computationalStatusDTOWithStatusFailed = getComputationalStatusDTOWithStatus("failed");
+        computationalStatusDTOWithStatusStopping = getComputationalStatusDTOWithStatus("stopping");
+        computationalStatusDTOWithStatusStarting = getComputationalStatusDTOWithStatus("starting");
+        sparkClusterResource = getSparkClusterResource();
+        ucResource = getUserComputationalResource(STOPPED, DOCKER_DATALAB_DATAENGINE);
+    }
+
+    @Test
+    public void createSparkCluster() {
+        ProjectDTO projectDTO = getProjectDTO();
+        when(projectService.get(anyString())).thenReturn(projectDTO);
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(computationalDAO.addComputational(anyString(), anyString(), anyString(),
+                any(SparkStandaloneClusterResource.class))).thenReturn(true);
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+
+        ComputationalBase compBaseMocked = mock(ComputationalBase.class);
+        when(requestBuilder.newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
+                any(UserInstanceDTO.class), any(SparkStandaloneClusterCreateForm.class), any(EndpointDTO.class)))
+                .thenReturn(compBaseMocked);
+        when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any())).thenReturn(UUID);
+        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
+
+        SparkStandaloneClusterCreateForm form = (SparkStandaloneClusterCreateForm) formList.get(0);
+        boolean creationResult = computationalService.createSparkCluster(userInfo, form.getName(), form, PROJECT,
+                String.format(AUDIT_MESSAGE, form.getNotebookName()));
+        assertTrue(creationResult);
+
+        verify(projectService).get(PROJECT);
+        verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(sparkClusterResource));
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(requestBuilder).newComputationalCreate(
+                refEq(userInfo), refEq(projectDTO), refEq(userInstance), refEq(form), refEq(endpointDTO()));
+
+        verify(provisioningService)
+                .post(endpointDTO().getUrl() + ComputationalAPI.COMPUTATIONAL_CREATE_SPARK, TOKEN, compBaseMocked,
+                        String.class);
+
+        verify(requestId).put(USER, UUID);
+        verifyNoMoreInteractions(projectService, configuration, computationalDAO, requestBuilder, provisioningService, requestId);
+    }
+
+    @Test
+    public void createSparkClusterWhenResourceAlreadyExists() {
+        when(computationalDAO.addComputational(anyString(), anyString(), anyString(),
+                any(SparkStandaloneClusterResource.class))).thenReturn(false);
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+
+        SparkStandaloneClusterCreateForm form = (SparkStandaloneClusterCreateForm) formList.get(0);
+        boolean creationResult = computationalService.createSparkCluster(userInfo, form.getName(), form, PROJECT,
+                String.format(AUDIT_MESSAGE, form.getNotebookName()));
+        assertFalse(creationResult);
+        verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(sparkClusterResource));
+        verifyNoMoreInteractions(configuration, computationalDAO);
+    }
+
+    @Test
+    public void createSparkClusterWhenMethodFetchExploratoryFieldsThrowsException() {
+        when(computationalDAO.addComputational(anyString(), anyString(), anyString(),
+                any(SparkStandaloneClusterResource.class))).thenReturn(true);
+        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
+                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
+
+        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+
+        SparkStandaloneClusterCreateForm form = (SparkStandaloneClusterCreateForm) formList.get(0);
+        try {
+            computationalService.createSparkCluster(userInfo, form.getName(), form, PROJECT, String.format(AUDIT_MESSAGE, form.getNotebookName()));
+        } catch (ResourceNotFoundException e) {
+            assertEquals("Exploratory for user with name not found", e.getMessage());
+        }
+
+        verify(computationalDAO, never()).addComputational(USER, EXPLORATORY_NAME, PROJECT, sparkClusterResource);
+        verify(computationalDAO, never()).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed,
+                "self"));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(configuration, computationalDAO, exploratoryDAO);
+    }
+
+    @Test
+    public void createSparkClusterWhenMethodNewComputationalCreateThrowsException() {
+        ProjectDTO projectDTO = getProjectDTO();
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(projectService.get(anyString())).thenReturn(projectDTO);
+        when(computationalDAO.addComputational(anyString(), anyString(), anyString(),
+                any(SparkStandaloneClusterResource.class))).thenReturn(true);
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+
+        doThrow(new DatalabException("Cannot create instance of resource class "))
+                .when(requestBuilder).newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
+                any(UserInstanceDTO.class), any(SparkStandaloneClusterCreateForm.class), any(EndpointDTO.class));
+
+        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+
+        SparkStandaloneClusterCreateForm form = (SparkStandaloneClusterCreateForm) formList.get(0);
+        try {
+            computationalService.createSparkCluster(userInfo, form.getName(),
+                    form, PROJECT, String.format(AUDIT_MESSAGE, form.getNotebookName()));
+        } catch (DatalabException e) {
+            assertEquals("Cannot create instance of resource class ", e.getMessage());
+        }
+        verify(projectService).get(PROJECT);
+        verify(computationalDAO).addComputational(USER, EXPLORATORY_NAME, PROJECT, sparkClusterResource);
+        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(requestBuilder).newComputationalCreate(userInfo, projectDTO, userInstance, form, endpointDTO());
+        verifyNoMoreInteractions(projectService, configuration, computationalDAO, exploratoryDAO, requestBuilder);
+    }
+
+    @Test
+    public void terminateComputationalEnvironment() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+        String explId = "explId";
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+
+        String compId = "compId";
+        UserComputationalResource ucResource = new UserComputationalResource();
+        ucResource.setComputationalName(COMP_NAME);
+        ucResource.setImageName("dataengine-service");
+        ucResource.setComputationalId(compId);
+        when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString())).thenReturn(ucResource);
+
+        ComputationalTerminateDTO ctDto = new ComputationalTerminateDTO();
+        ctDto.setComputationalName(COMP_NAME);
+        ctDto.setExploratoryName(EXPLORATORY_NAME);
+        when(requestBuilder.newComputationalTerminate(anyString(), any(UserInstanceDTO.class),
+                any(UserComputationalResource.class), any(EndpointDTO.class))).thenReturn(ctDto);
+
+        when(provisioningService.post(anyString(), anyString(), any(ComputationalTerminateDTO.class), any()))
+                .thenReturn(UUID);
+        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
+
+        computationalService.terminateComputational(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, COMP_NAME, AUDIT_MESSAGE);
+
+        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusTerminating, "self"));
+        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
+
+        verify(requestBuilder).newComputationalTerminate(userInfo.getName(), userInstance, ucResource, endpointDTO());
+
+        verify(provisioningService).post(endpointDTO().getUrl() + ComputationalAPI.COMPUTATIONAL_TERMINATE_CLOUD_SPECIFIC, TOKEN, ctDto,
+                String.class);
+
+        verify(requestId).put(USER, UUID);
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(computationalDAO, exploratoryDAO, requestBuilder, provisioningService, requestId);
+    }
+
+    @Test
+    public void terminateComputationalEnvironmentWhenMethodUpdateComputationalStatusThrowsException() {
+        doThrow(new DatalabException("Could not update computational resource status"))
+                .when(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusTerminating,
+                "self"));
+
+        when(computationalDAO.updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self")))
+                .thenReturn(mock(UpdateResult.class));
+
+        try {
+            computationalService.terminateComputational(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, COMP_NAME, AUDIT_MESSAGE);
+        } catch (DatalabException e) {
+            assertEquals("Could not update computational resource status", e.getMessage());
+        }
+
+        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusTerminating, "self"));
+        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
+        verifyNoMoreInteractions(computationalDAO);
+    }
+
+    @Test
+    public void terminateComputationalEnvironmentWhenMethodFetchComputationalFieldsThrowsException() {
+        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+
+        doThrow(new DatalabException("Computational resource for user with exploratory name not found."))
+                .when(computationalDAO).fetchComputationalFields(anyString(), anyString(), anyString(), anyString());
+        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+
+        try {
+            computationalService.terminateComputational(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, COMP_NAME, AUDIT_MESSAGE);
+        } catch (DatalabException e) {
+            assertEquals("Computational resource for user with exploratory name not found.", e.getMessage());
+        }
+
+        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusTerminating, "self"));
+        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
+        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(computationalDAO, exploratoryDAO);
+    }
+
+    @Test
+    public void terminateComputationalEnvironmentWhenMethodNewComputationalTerminateThrowsException() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+
+        String compId = "compId";
+        UserComputationalResource ucResource = new UserComputationalResource();
+        ucResource.setComputationalName(COMP_NAME);
+        ucResource.setImageName("dataengine-service");
+        ucResource.setComputationalId(compId);
+        when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString())).thenReturn(ucResource);
+
+        doThrow(new DatalabException("Cannot create instance of resource class "))
+                .when(requestBuilder).newComputationalTerminate(anyString(), any(UserInstanceDTO.class),
+                any(UserComputationalResource.class), any(EndpointDTO.class));
+
+        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+
+        try {
+            computationalService.terminateComputational(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, COMP_NAME, AUDIT_MESSAGE);
+        } catch (DatalabException e) {
+            assertEquals("Cannot create instance of resource class ", e.getMessage());
+        }
+
+        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusTerminating, "self"));
+        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+
+        verify(requestBuilder).newComputationalTerminate(userInfo.getName(), userInstance, ucResource, endpointDTO());
+        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
+        verifyNoMoreInteractions(computationalDAO, exploratoryDAO, requestBuilder);
+    }
+
+    @Test
+    public void createDataEngineService() {
+        ProjectDTO projectDTO = getProjectDTO();
+        when(projectService.get(anyString())).thenReturn(projectDTO);
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(computationalDAO.addComputational(anyString(), anyString(), anyString(), any(UserComputationalResource.class)))
+                .thenReturn(true);
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+
+        ComputationalBase compBaseMocked = mock(ComputationalBase.class);
+        when(requestBuilder.newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
+                any(UserInstanceDTO.class), any(ComputationalCreateFormDTO.class), any(EndpointDTO.class)))
+                .thenReturn(compBaseMocked);
+
+        when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any())).thenReturn(UUID);
+        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
+
+        ComputationalCreateFormDTO form = formList.get(1);
+        boolean creationResult = computationalService.createDataEngineService(userInfo, form.getName(), form, ucResource, PROJECT,
+                String.format(AUDIT_MESSAGE, form.getNotebookName()));
+        assertTrue(creationResult);
+
+        verify(projectService).get(PROJECT);
+
+        verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(ucResource));
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+
+        verify(requestBuilder).newComputationalCreate(
+                refEq(userInfo), refEq(projectDTO), refEq(userInstance), any(ComputationalCreateFormDTO.class), refEq(endpointDTO()));
+
+        verify(provisioningService)
+                .post(endpointDTO().getUrl() + ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC, TOKEN,
+                        compBaseMocked, String.class);
+
+        verify(requestId).put(USER, UUID);
+        verifyNoMoreInteractions(projectService, computationalDAO, exploratoryDAO, requestBuilder, provisioningService, requestId);
+    }
+
+    @Test
+    public void createDataEngineServiceWhenComputationalResourceNotAdded() {
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(computationalDAO.addComputational(anyString(), anyString(), any(), any(UserComputationalResource.class)))
+                .thenReturn(false);
+
+        ComputationalCreateFormDTO form = formList.get(1);
+        boolean creationResult = computationalService.createDataEngineService(userInfo, form.getName(), form, ucResource, PROJECT,
+                String.format(AUDIT_MESSAGE, form.getNotebookName()));
+        assertFalse(creationResult);
+
+        verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(ucResource));
+        verifyNoMoreInteractions(computationalDAO);
+    }
+
+    @Test
+    public void createDataEngineServiceWhenMethodFetchExploratoryFieldsThrowsException() {
+        when(computationalDAO.addComputational(anyString(), anyString(), anyString(), any(UserComputationalResource.class)))
+                .thenReturn(true);
+        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
+                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
+
+        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+
+        ComputationalCreateFormDTO form = formList.get(1);
+        try {
+            computationalService.createDataEngineService(userInfo, form.getName(), form, ucResource, PROJECT,
+                    String.format(AUDIT_MESSAGE, form.getNotebookName()));
+        } catch (DatalabException e) {
+            assertEquals("Exploratory for user with name not found", e.getMessage());
+        }
+
+        verify(computationalDAO, never())
+                .addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(ucResource));
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+
+        verify(computationalDAO, never()).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed,
+                "self"));
+        verifyNoMoreInteractions(computationalDAO, exploratoryDAO);
+    }
+
+    @Test
+    public void createDataEngineServiceWhenMethodNewComputationalCreateThrowsException() {
+        ProjectDTO projectDTO = getProjectDTO();
+        when(projectService.get(anyString())).thenReturn(projectDTO);
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(computationalDAO.addComputational(anyString(), anyString(), any(), any(UserComputationalResource.class)))
+                .thenReturn(true);
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+
+        doThrow(new DatalabException("Cannot create instance of resource class "))
+                .when(requestBuilder).newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
+                any(UserInstanceDTO.class), any(ComputationalCreateFormDTO.class), any(EndpointDTO.class));
+
+        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+
+        ComputationalCreateFormDTO form = formList.get(1);
+        try {
+            computationalService.createDataEngineService(userInfo, form.getName(), form, ucResource, PROJECT,
+                    String.format(AUDIT_MESSAGE, form.getNotebookName()));
+        } catch (DatalabException e) {
+            assertEquals("Could not send request for creation the computational resource compName: " +
+                    "Cannot create instance of resource class ", e.getMessage());
+        }
+
+        verify(projectService).get(PROJECT);
+        verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(ucResource));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(requestBuilder).newComputationalCreate(
+                refEq(userInfo), refEq(projectDTO), refEq(userInstance), refEq(form), refEq(endpointDTO()));
+        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
+
+        verifyNoMoreInteractions(projectService, computationalDAO, exploratoryDAO, requestBuilder);
+    }
+
+    @Test
+    public void stopSparkCluster() {
+        final UserInstanceDTO exploratory = getUserInstanceDto();
+        exploratory.setResources(singletonList(getUserComputationalResource(RUNNING, DOCKER_DATALAB_DATAENGINE)));
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(exploratory);
+        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+
+        ComputationalStopDTO computationalStopDTO = new ComputationalStopDTO();
+        when(requestBuilder.newComputationalStop(anyString(), any(UserInstanceDTO.class), anyString(),
+                any(EndpointDTO.class))).thenReturn(computationalStopDTO);
+        when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any()))
+                .thenReturn("someUuid");
+        when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
+
+        computationalService.stopSparkCluster(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, COMP_NAME, String.format(AUDIT_MESSAGE, EXPLORATORY_NAME));
+
+        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusStopping, "self"));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, true);
+        verify(requestBuilder).newComputationalStop(eq(userInfo.getName()), refEq(exploratory), eq(COMP_NAME), refEq(endpointDTO()));
+        verify(provisioningService)
+                .post(eq(endpointDTO().getUrl() + "computational/stop/spark"), eq(TOKEN), refEq(computationalStopDTO),
+                        eq(String.class));
+        verify(requestId).put(USER, "someUuid");
+        verifyNoMoreInteractions(computationalDAO, exploratoryDAO, requestBuilder,
+                provisioningService, requestId);
+    }
+
+    @Test
+    public void stopSparkClusterWhenDataengineTypeIsAnother() {
+        final UserInstanceDTO exploratory = getUserInstanceDto();
+        exploratory.setResources(singletonList(getUserComputationalResource(RUNNING, DOCKER_DATALAB_DATAENGINE_SERVICE)));
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(exploratory);
+        expectedException.expect(IllegalStateException.class);
+        expectedException.expectMessage("There is no running dataengine compName for exploratory expName");
+
+        computationalService.stopSparkCluster(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, COMP_NAME, String.format(AUDIT_MESSAGE, EXPLORATORY_NAME));
+    }
+
+    @Test
+    public void startSparkCluster() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        final UserInstanceDTO exploratory = getUserInstanceDto();
+        exploratory.setResources(singletonList(getUserComputationalResource(STOPPED, DOCKER_DATALAB_DATAENGINE)));
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(exploratory);
+        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+
+        ComputationalStartDTO computationalStartDTO = new ComputationalStartDTO();
+        when(requestBuilder.newComputationalStart(any(UserInfo.class), any(UserInstanceDTO.class), anyString(),
+                any(EndpointDTO.class))).thenReturn(computationalStartDTO);
+        when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any()))
+                .thenReturn("someUuid");
+        when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
+
+        computationalService.startSparkCluster(userInfo, EXPLORATORY_NAME, COMP_NAME, PROJECT, String.format(AUDIT_MESSAGE, EXPLORATORY_NAME));
+
+        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusStarting, "self"));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, true);
+        verify(requestBuilder).newComputationalStart(refEq(userInfo), refEq(exploratory), eq(COMP_NAME), refEq(endpointDTO()));
+        verify(provisioningService)
+                .post(eq(endpointDTO().getUrl() + "computational/start/spark"), eq(TOKEN),
+                        refEq(computationalStartDTO),
+                        eq(String.class));
+        verify(requestId).put(USER, "someUuid");
+        verifyNoMoreInteractions(computationalDAO, exploratoryDAO, requestBuilder,
+                provisioningService, requestId);
+    }
+
+    @Test
+    public void startSparkClusterWhenDataengineStatusIsRunning() {
+        final UserInstanceDTO userInstanceDto = getUserInstanceDto();
+        userInstanceDto.setResources(singletonList(getUserComputationalResource(RUNNING,
+                DOCKER_DATALAB_DATAENGINE_SERVICE)));
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(userInstanceDto);
+
+        expectedException.expect(IllegalStateException.class);
+        expectedException.expectMessage("There is no stopped dataengine compName for exploratory expName");
+
+        computationalService.startSparkCluster(userInfo, EXPLORATORY_NAME, COMP_NAME, PROJECT, String.format(AUDIT_MESSAGE, EXPLORATORY_NAME));
+    }
+
+    @Test
+    public void getComputationalResource() {
+        when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString())).thenReturn(ucResource);
+
+        Optional<UserComputationalResource> expectedResource = Optional.of(ucResource);
+        Optional<UserComputationalResource> actualResource =
+                computationalService.getComputationalResource(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
+        assertEquals(expectedResource, actualResource);
+
+        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
+        verifyNoMoreInteractions(computationalDAO);
+    }
+
+    @Test
+    public void getComputationalResourceWithException() {
+        doThrow(new DatalabException("Computational resource not found"))
+                .when(computationalDAO).fetchComputationalFields(anyString(), anyString(), anyString(), anyString());
+
+        Optional<UserComputationalResource> expectedResource = Optional.empty();
+        Optional<UserComputationalResource> actualResource =
+                computationalService.getComputationalResource(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
+        assertEquals(expectedResource, actualResource);
+
+        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
+        verifyNoMoreInteractions(computationalDAO);
+    }
+
+    @Test
+    public void testUpdateSparkClusterConfig() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        final ComputationalClusterConfigDTO clusterConfigDTO = new ComputationalClusterConfigDTO();
+        final UserInstanceDTO userInstanceDto = getUserInstanceDto();
+        final List<ClusterConfig> config = Collections.singletonList(new ClusterConfig());
+        userInstanceDto.setResources(Collections.singletonList(getUserComputationalResource(RUNNING, COMP_NAME)));
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(userInstanceDto);
+        when(requestBuilder.newClusterConfigUpdate(any(UserInfo.class), any(UserInstanceDTO.class),
+                any(UserComputationalResource.class), anyListOf(ClusterConfig.class), any(EndpointDTO.class)))
+                .thenReturn(clusterConfigDTO);
+        when(provisioningService.post(anyString(), anyString(), any(ComputationalClusterConfigDTO.class), any()))
+                .thenReturn("someUuid");
+        computationalService.updateSparkClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME,
+                COMP_NAME, config, String.format(AUDIT_COMPUTATIONAL_RECONFIGURE_MESSAGE, COMP_NAME, NOTE_BOOK_NAME));
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, true);
+        verify(requestBuilder).newClusterConfigUpdate(refEq(getUserInfo()), refEq(userInstanceDto),
+                refEq(getUserComputationalResource(RUNNING, COMP_NAME)),
+                eq(Collections.singletonList(new ClusterConfig())), eq(endpointDTO()));
+        verify(requestId).put(USER, "someUuid");
+        verify(computationalDAO).updateComputationalFields(refEq(new ComputationalStatusDTO()
+                .withProject(PROJECT)
+                .withConfig(config)
+                .withUser(USER)
+                .withExploratoryName(EXPLORATORY_NAME)
+                .withComputationalName(COMP_NAME)
+                .withStatus(UserInstanceStatus.RECONFIGURING.toString()), "self"));
+        verify(provisioningService).post(eq(endpointDTO().getUrl() + "computational/spark/reconfigure"),
+                eq(getUserInfo().getAccessToken()),
+                refEq(new ComputationalClusterConfigDTO()), eq(String.class));
+
+    }
+
+    @Test
+    public void testUpdateSparkClusterConfigWhenClusterIsNotRunning() {
+        final UserInstanceDTO userInstanceDto = getUserInstanceDto();
+        final List<ClusterConfig> config = Collections.singletonList(new ClusterConfig());
+        userInstanceDto.setResources(Collections.singletonList(getUserComputationalResource(STOPPED, COMP_NAME)));
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(userInstanceDto);
+        try {
+            computationalService.updateSparkClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME,
+                    COMP_NAME, config, String.format(AUDIT_COMPUTATIONAL_RECONFIGURE_MESSAGE, COMP_NAME, NOTE_BOOK_NAME));
+        } catch (ResourceNotFoundException e) {
+            assertEquals("Running computational resource with name compName for exploratory expName not found", e.getMessage());
+        }
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, true);
+        verifyNoMoreInteractions(exploratoryDAO);
+        verifyZeroInteractions(provisioningService, requestBuilder, requestId);
+
+    }
+
+    @Test
+    public void testUpdateSparkClusterConfigWhenClusterIsNotFound() {
+        final UserInstanceDTO userInstanceDto = getUserInstanceDto();
+        final List<ClusterConfig> config = Collections.singletonList(new ClusterConfig());
+        userInstanceDto.setResources(Collections.singletonList(getUserComputationalResource(STOPPED, COMP_NAME)));
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(userInstanceDto);
+        try {
+            computationalService.updateSparkClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME,
+                    COMP_NAME + "X", config, String.format(AUDIT_COMPUTATIONAL_RECONFIGURE_MESSAGE, COMP_NAME, NOTE_BOOK_NAME));
+        } catch (ResourceNotFoundException e) {
+            assertEquals("Running computational resource with name compNameX for exploratory expName not found",
+                    e.getMessage());
+        }
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, true);
+        verifyNoMoreInteractions(exploratoryDAO);
+        verifyZeroInteractions(provisioningService, requestBuilder, requestId);
+
+    }
+
+    @Test
+    public void testGetClusterConfig() {
+        when(computationalDAO.getClusterConfig(anyString(), anyString(), anyString(), anyString())).thenReturn(Collections.singletonList(getClusterConfig()));
+
+        final List<ClusterConfig> clusterConfig = computationalService.getClusterConfig(getUserInfo(), PROJECT,
+                EXPLORATORY_NAME, COMP_NAME);
+        final ClusterConfig config = clusterConfig.get(0);
+
+        assertEquals(1, clusterConfig.size());
+        assertEquals("test", config.getClassification());
+        assertNull(config.getConfigurations());
+        assertNull(config.getProperties());
+    }
+
+
+    @Test
+    public void testGetClusterConfigWithException() {
+        when(computationalDAO.getClusterConfig(anyString(), anyString(), anyString(), anyString())).thenThrow(new RuntimeException(
+                "Exception"));
+
+        expectedException.expectMessage("Exception");
+        expectedException.expect(RuntimeException.class);
+        computationalService.getClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME, COMP_NAME);
+    }
+
+    private ClusterConfig getClusterConfig() {
+        final ClusterConfig config = new ClusterConfig();
+        config.setClassification("test");
+        return config;
+    }
+
+    private UserInfo getUserInfo() {
+        return new UserInfo(USER, TOKEN);
+    }
+
+    private UserInstanceDTO getUserInstanceDto() {
+        return new UserInstanceDTO().withUser(USER).withExploratoryName(EXPLORATORY_NAME)
+                .withExploratoryId("explId")
+                .withProject(PROJECT)
+                .withTags(Collections.emptyMap());
+    }
+
+    private List<ComputationalCreateFormDTO> getFormList() {
+        SparkStandaloneClusterCreateForm sparkClusterForm = new SparkStandaloneClusterCreateForm();
+        sparkClusterForm.setNotebookName(EXPLORATORY_NAME);
+        sparkClusterForm.setName(COMP_NAME);
+        sparkClusterForm.setProject(PROJECT);
+        sparkClusterForm.setDataEngineInstanceCount(String.valueOf(2));
+        sparkClusterForm.setImage("dataengine");
+        sparkClusterForm.setEnabledGPU(Boolean.FALSE);
+        ComputationalCreateFormDTO desClusterForm = new ComputationalCreateFormDTO();
+        desClusterForm.setNotebookName(EXPLORATORY_NAME);
+        desClusterForm.setName(COMP_NAME);
+
+        return Arrays.asList(sparkClusterForm, desClusterForm);
+    }
+
+    private ComputationalStatusDTO getComputationalStatusDTOWithStatus(String status) {
+        return new ComputationalStatusDTO()
+                .withUser(USER)
+                .withProject(PROJECT)
+                .withExploratoryName(EXPLORATORY_NAME)
+                .withComputationalName(COMP_NAME)
+                .withStatus(UserInstanceStatus.of(status));
+    }
+
+    private SparkStandaloneClusterResource getSparkClusterResource() {
+        return SparkStandaloneClusterResource.builder()
+                .computationalName(COMP_NAME)
+                .imageName("dataengine")
+                .status(CREATING.toString())
+                .dataEngineInstanceCount(String.valueOf(2))
+                .totalInstanceCount(2)
+                .tags(Collections.emptyMap())
+                .enabledGPU(Boolean.FALSE)
+                .build();
+    }
+
+    private EndpointDTO endpointDTO() {
+        return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
+    }
+
+
+    private UserComputationalResource getUserComputationalResource(UserInstanceStatus status, String imageName) {
+        UserComputationalResource ucResource = new UserComputationalResource();
+        ucResource.setComputationalName(COMP_NAME);
+        ucResource.setImageName("dataengine");
+        ucResource.setImageName(imageName);
+        ucResource.setStatus(status.toString());
+        ucResource.setLastActivity(LAST_ACTIVITY);
+        ucResource.setComputationalId(COMP_ID);
+        ucResource.setTags(Collections.emptyMap());
+        final SchedulerJobDTO schedulerData = new SchedulerJobDTO();
+        schedulerData.setCheckInactivityRequired(true);
+        schedulerData.setMaxInactivity(MAX_INACTIVITY);
+        ucResource.setSchedulerData(schedulerData);
+        return ucResource;
+    }
+
+    private ProjectDTO getProjectDTO() {
+        return new ProjectDTO(PROJECT, Collections.emptySet(), "", "", null,
+                singletonList(new ProjectEndpointDTO("endpoint", UserInstanceStatus.RUNNING,
+                        new EdgeInfo())), true);
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImplTest.java
new file mode 100644
index 0000000..d3bf3a9
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EndpointServiceImplTest.java
@@ -0,0 +1,354 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.dao.EndpointDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.UserRoleDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.EndpointResourcesDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
+import com.epam.datalab.backendapi.resources.TestBase;
+import com.epam.datalab.backendapi.service.OdahuService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceConflictException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.rest.client.RESTService;
+import org.apache.http.HttpStatus;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import javax.ws.rs.core.Response;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import static com.epam.datalab.dto.UserInstanceStatus.TERMINATED;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyListOf;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+import static org.mockito.internal.verification.VerificationModeFactory.times;
+
+@RunWith(MockitoJUnitRunner.class)
+public class EndpointServiceImplTest extends TestBase {
+    private static final String HEALTH_CHECK = "healthcheck";
+    private static final String EXPLORATORY_NAME_1 = "expName1";
+    private static final String EXPLORATORY_NAME_2 = "expName2";
+    private static final String PROJECT_NAME_1 = "projectName";
+    private static final String PROJECT_NAME_2 = "projectName_2";
+
+	@Mock
+	private EndpointDAO endpointDAO;
+	@Mock
+	private ProjectService projectService;
+	@Mock
+	private ExploratoryDAO exploratoryDAO;
+	@Mock
+	private RESTService provisioningService;
+	@Mock
+	private UserRoleDAO userRoleDAO;
+	@Mock
+	private OdahuService odahuService;
+
+
+	@InjectMocks
+	private EndpointServiceImpl endpointService;
+
+	@Test
+	public void getEndpoints() {
+		List<EndpointDTO> endpoints = getEndpointDTOs();
+		when(endpointDAO.getEndpoints()).thenReturn(endpoints);
+
+        List<EndpointDTO> actualEndpoints = endpointService.getEndpoints();
+
+        assertEquals("lists should be equal", endpoints, actualEndpoints);
+        verify(endpointDAO).getEndpoints();
+        verifyNoMoreInteractions(endpointDAO);
+    }
+
+    @Test
+    public void getEndpointsWithStatus() {
+        List<EndpointDTO> endpoints = Collections.singletonList(getEndpointDTO());
+        when(endpointDAO.getEndpointsWithStatus(anyString())).thenReturn(endpoints);
+
+        List<EndpointDTO> actualEndpoints = endpointService.getEndpointsWithStatus(EndpointDTO.EndpointStatus.ACTIVE);
+
+        assertEquals("lists should be equal", endpoints, actualEndpoints);
+        verify(endpointDAO).getEndpointsWithStatus(EndpointDTO.EndpointStatus.ACTIVE.toString());
+        verifyNoMoreInteractions(endpointDAO);
+    }
+
+    @Test
+    public void getEndpointResources() {
+	    List<UserInstanceDTO> userInstances = getUserInstances();
+	    List<ProjectDTO> projectDTOs = getProjectDTOs();
+	    when(exploratoryDAO.fetchExploratoriesByEndpointWhereStatusNotIn(anyString(), anyListOf(UserInstanceStatus.class), anyBoolean()))
+			    .thenReturn(userInstances);
+	    when(projectService.getProjectsByEndpoint(anyString())).thenReturn(projectDTOs);
+
+	    EndpointResourcesDTO actualEndpointResources = endpointService.getEndpointResources(ENDPOINT_NAME);
+
+	    assertEquals("objects should be equal", new EndpointResourcesDTO(userInstances, projectDTOs), actualEndpointResources);
+	    verify(exploratoryDAO).fetchExploratoriesByEndpointWhereStatusNotIn(ENDPOINT_NAME, Arrays.asList(UserInstanceStatus.TERMINATED,
+			    UserInstanceStatus.FAILED), Boolean.FALSE);
+	    verify(projectService).getProjectsByEndpoint(ENDPOINT_NAME);
+	    verifyNoMoreInteractions(exploratoryDAO, projectService);
+    }
+
+    @Test
+    public void get() {
+        EndpointDTO endpointDTO = getEndpointDTO();
+        when(endpointDAO.get(anyString())).thenReturn(Optional.of(endpointDTO));
+
+        EndpointDTO actualEndpointDTO = endpointService.get(ENDPOINT_NAME);
+
+        assertEquals("objects should be equal", endpointDTO, actualEndpointDTO);
+        verify(endpointDAO).get(ENDPOINT_NAME);
+        verifyNoMoreInteractions(endpointDAO);
+    }
+
+    @Test(expected = ResourceNotFoundException.class)
+    public void getWithException() {
+        when(endpointDAO.get(anyString())).thenReturn(Optional.empty());
+
+        endpointService.get(ENDPOINT_NAME);
+    }
+
+    @Test
+    public void create() {
+        Response response = mock(Response.class);
+        when(endpointDAO.get(anyString())).thenReturn(Optional.empty());
+        when(endpointDAO.getEndpointWithUrl(anyString())).thenReturn(Optional.empty());
+	    when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenReturn(response);
+	    when(response.readEntity(any(Class.class))).thenReturn(CloudProvider.AWS);
+	    when(response.getStatus()).thenReturn(HttpStatus.SC_OK);
+
+	    endpointService.create(getUserInfo(), ENDPOINT_NAME, getEndpointDTO());
+
+	    verify(endpointDAO).get(ENDPOINT_NAME);
+	    verify(endpointDAO).getEndpointWithUrl(ENDPOINT_URL);
+	    verify(provisioningService).get(ENDPOINT_URL + HEALTH_CHECK, TOKEN, Response.class);
+	    verify(endpointDAO).create(getEndpointDTO());
+	    verify(userRoleDAO).updateMissingRoles(CloudProvider.AWS);
+	    verifyNoMoreInteractions(endpointDAO, provisioningService, userRoleDAO);
+    }
+
+    @Test(expected = ResourceConflictException.class)
+    public void createWithException1() {
+        when(endpointDAO.get(anyString())).thenReturn(Optional.of(getEndpointDTO()));
+
+        endpointService.create(getUserInfo(), ENDPOINT_NAME, getEndpointDTO());
+    }
+
+    @Test(expected = ResourceConflictException.class)
+    public void createWithException2() {
+        when(endpointDAO.get(anyString())).thenReturn(Optional.empty());
+        when(endpointDAO.getEndpointWithUrl(anyString())).thenReturn(Optional.of(getEndpointDTO()));
+
+        endpointService.create(getUserInfo(), ENDPOINT_NAME, getEndpointDTO());
+    }
+
+    @Test(expected = DatalabException.class)
+    public void createWithException3() {
+        when(endpointDAO.get(anyString())).thenReturn(Optional.empty());
+        when(endpointDAO.getEndpointWithUrl(anyString())).thenReturn(Optional.empty());
+        when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenThrow(new DatalabException("Exception message"));
+
+        endpointService.create(getUserInfo(), ENDPOINT_NAME, getEndpointDTO());
+    }
+
+    @Test(expected = DatalabException.class)
+    public void createWithException4() {
+        Response response = mock(Response.class);
+        when(endpointDAO.get(anyString())).thenReturn(Optional.empty());
+        when(endpointDAO.getEndpointWithUrl(anyString())).thenReturn(Optional.empty());
+        when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenReturn(response);
+        when(response.readEntity(any(Class.class))).thenReturn(new Object());
+
+        endpointService.create(getUserInfo(), ENDPOINT_NAME, getEndpointDTO());
+    }
+
+    @Test(expected = ResourceNotFoundException.class)
+    public void createWithException5() {
+        Response response = mock(Response.class);
+        when(endpointDAO.get(anyString())).thenReturn(Optional.empty());
+        when(endpointDAO.getEndpointWithUrl(anyString())).thenReturn(Optional.empty());
+        when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenReturn(response);
+        when(response.readEntity(any(Class.class))).thenReturn(CloudProvider.AWS);
+        when(response.getStatus()).thenReturn(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+
+        endpointService.create(getUserInfo(), ENDPOINT_NAME, getEndpointDTO());
+    }
+
+    @Test(expected = DatalabException.class)
+    public void createWithException6() {
+        Response response = mock(Response.class);
+        when(endpointDAO.get(anyString())).thenReturn(Optional.empty());
+        when(endpointDAO.getEndpointWithUrl(anyString())).thenReturn(Optional.empty());
+        when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenReturn(response);
+        when(response.readEntity(any(Class.class))).thenReturn(null);
+        when(response.getStatus()).thenReturn(HttpStatus.SC_OK);
+
+        endpointService.create(getUserInfo(), ENDPOINT_NAME, getEndpointDTO());
+    }
+
+    @Test
+    public void updateEndpointStatus() {
+        endpointService.updateEndpointStatus(ENDPOINT_NAME, EndpointDTO.EndpointStatus.ACTIVE);
+
+        verify(endpointDAO).updateEndpointStatus(ENDPOINT_NAME, EndpointDTO.EndpointStatus.ACTIVE.toString());
+        verifyNoMoreInteractions(endpointDAO);
+    }
+
+    @Test
+    public void remove() {
+        List<ProjectDTO> projectDTOs = getProjectDTOs();
+        List<EndpointDTO> endpointDTOs = getEndpointDTOs();
+	    when(endpointDAO.get(anyString())).thenReturn(Optional.of(getEndpointDTO()));
+	    when(projectService.getProjectsByEndpoint(anyString())).thenReturn(projectDTOs);
+	    when(odahuService.inProgress(anyString(), anyString())).thenReturn(Boolean.FALSE);
+	    when(projectService.checkExploratoriesAndComputationalProgress(anyString(), anyListOf(String.class))).thenReturn(Boolean.TRUE);
+	    when(endpointDAO.getEndpoints()).thenReturn(endpointDTOs);
+
+	    endpointService.remove(getUserInfo(), ENDPOINT_NAME);
+
+	    verify(endpointDAO).get(ENDPOINT_NAME);
+	    verify(projectService).getProjectsByEndpoint(ENDPOINT_NAME);
+	    verify(odahuService).inProgress(PROJECT_NAME_1, ENDPOINT_NAME);
+	    verify(odahuService).inProgress(PROJECT_NAME_2, ENDPOINT_NAME);
+	    verify(projectService).checkExploratoriesAndComputationalProgress(PROJECT_NAME_1, Collections.singletonList(ENDPOINT_NAME));
+	    verify(projectService).checkExploratoriesAndComputationalProgress(PROJECT_NAME_2, Collections.singletonList(ENDPOINT_NAME));
+	    verify(projectService).terminateEndpoint(getUserInfo(), ENDPOINT_NAME, PROJECT_NAME_1);
+	    verify(projectService).terminateEndpoint(getUserInfo(), ENDPOINT_NAME, PROJECT_NAME_2);
+	    verify(endpointDAO).remove(ENDPOINT_NAME);
+	    verify(endpointDAO).getEndpoints();
+	    verify(userRoleDAO).removeUnnecessaryRoles(CloudProvider.AWS, Arrays.asList(CloudProvider.AWS, CloudProvider.GCP));
+	    verifyNoMoreInteractions(endpointDAO, projectService, userRoleDAO, odahuService);
+    }
+
+    @Test(expected = ResourceNotFoundException.class)
+    public void removeWithException1() {
+        when(endpointDAO.get(anyString())).thenReturn(Optional.empty());
+
+        endpointService.remove(getUserInfo(), ENDPOINT_NAME);
+    }
+
+    @Test(expected = ResourceConflictException.class)
+    public void removeWithException2() {
+        when(endpointDAO.get(anyString())).thenReturn(Optional.of(getEndpointDTO()));
+        when(projectService.getProjectsByEndpoint(anyString())).thenReturn(getProjectDTOs());
+        when(projectService.checkExploratoriesAndComputationalProgress(anyString(), anyListOf(String.class))).thenReturn(Boolean.FALSE);
+
+        endpointService.remove(getUserInfo(), ENDPOINT_NAME);
+    }
+
+    @Test(expected = ResourceConflictException.class)
+    public void removeWithException3() {
+        when(endpointDAO.get(anyString())).thenReturn(Optional.of(getEndpointDTO()));
+        when(projectService.getProjectsByEndpoint(anyString())).thenReturn(getCreatingProjectDTO());
+        when(projectService.checkExploratoriesAndComputationalProgress(anyString(), anyListOf(String.class))).thenReturn(Boolean.TRUE);
+
+        endpointService.remove(getUserInfo(), ENDPOINT_NAME);
+    }
+
+    @Test
+    public void removeEndpointInAllProjectsTest() {
+        List<ProjectDTO> projectDTOs = getProjectDTOsWithDiffStatuses();
+
+        endpointService.removeEndpointInAllProjects(getUserInfo(), ENDPOINT_NAME, projectDTOs);
+        long notTerminatedProjects = projectDTOs.stream()
+                .filter(p -> p.getEndpoints().stream()
+                        .noneMatch(e -> e.getStatus() == TERMINATED))
+                .count();
+
+        verify(projectService, times((int) notTerminatedProjects)).terminateEndpoint(any(), anyString(), any());
+    }
+
+    private List<UserInstanceDTO> getUserInstances() {
+        return Arrays.asList(
+                new UserInstanceDTO().withExploratoryName(EXPLORATORY_NAME_1).withUser(USER).withProject(PROJECT_NAME_1).withEndpoint(ENDPOINT_NAME),
+                new UserInstanceDTO().withExploratoryName(EXPLORATORY_NAME_2).withUser(USER).withProject(PROJECT_NAME_1).withEndpoint(ENDPOINT_NAME)
+        );
+    }
+
+    private List<EndpointDTO> getEndpointDTOs() {
+        return Arrays.asList(getEndpointDTO(), getInactiveEndpointDTO());
+    }
+
+    private EndpointDTO getInactiveEndpointDTO() {
+        return new EndpointDTO("local2", "endpoint_url2", "endpoint_account2", "endpoint_tag2",
+                EndpointDTO.EndpointStatus.INACTIVE, CloudProvider.GCP);
+    }
+
+    private List<ProjectDTO> getProjectDTOs() {
+        ProjectDTO project1 = ProjectDTO.builder()
+                .name(PROJECT_NAME_1)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, null)))
+                .build();
+        ProjectDTO project2 = ProjectDTO.builder()
+                .name(PROJECT_NAME_2)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, null)))
+                .build();
+        return Arrays.asList(project1, project2);
+    }
+
+    private List<ProjectDTO> getProjectDTOsWithDiffStatuses() {
+        ProjectDTO project1 = ProjectDTO.builder()
+                .name(PROJECT_NAME_1)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, null)))
+                .build();
+        ProjectDTO project2 = ProjectDTO.builder()
+                .name(PROJECT_NAME_2)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, TERMINATED, null)))
+                .build();
+        ProjectDTO project3 = ProjectDTO.builder()
+                .name(PROJECT_NAME_1)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.CREATED, null)))
+                .build();
+        ProjectDTO project4 = ProjectDTO.builder()
+                .name(PROJECT_NAME_2)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, TERMINATED, null)))
+                .build();
+        return Arrays.asList(project1, project2, project3, project4);
+    }
+
+    private List<ProjectDTO> getCreatingProjectDTO() {
+        ProjectDTO project = ProjectDTO.builder()
+                .name(PROJECT_NAME_1)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.CREATING, null)))
+                .build();
+        return Collections.singletonList(project);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImplTest.java
new file mode 100644
index 0000000..c7d0795
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/EnvironmentServiceImplTest.java
@@ -0,0 +1,428 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.EnvDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.UserSettingsDAO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
+import com.epam.datalab.backendapi.resources.dto.UserDTO;
+import com.epam.datalab.backendapi.resources.dto.UserResourceInfo;
+import com.epam.datalab.backendapi.service.ComputationalService;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.service.SecurityService;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.epam.datalab.dto.status.EnvResource;
+import com.epam.datalab.dto.status.EnvResourceList;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceConflictException;
+import com.epam.datalab.model.ResourceEnum;
+import com.epam.datalab.model.ResourceType;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import static com.epam.datalab.dto.UserInstanceStatus.CREATING;
+import static com.epam.datalab.dto.UserInstanceStatus.CREATING_IMAGE;
+import static com.epam.datalab.dto.UserInstanceStatus.STARTING;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.anyListOf;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anySet;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class EnvironmentServiceImplTest {
+
+    private static final String AUDIT_QUOTA_MESSAGE = "Billing quota reached";
+    private static final String AUDIT_UPDATE_STATUS = "Sync up with console status";
+    private static final String AUDIT_MESSAGE = "Notebook name %s";
+    private static final String DATALAB_SYSTEM_USER = "DataLab system user";
+    private static final String DATALAB_SYSTEM_USER_TOKEN = "token";
+    private static final String USER = "test";
+    private static final String EXPLORATORY_NAME_1 = "expName1";
+    private static final String EXPLORATORY_NAME_2 = "expName2";
+    private static final String TOKEN = "token";
+    private static final String UUID = "213-12312-321";
+    private static final String PROJECT_NAME = "projectName";
+    private static final String ENDPOINT_NAME = "endpointName";
+    private static final String SHAPE = "shape";
+
+    private static final String INSTANCE_ID = "instance_id";
+    private static final String NAME = "name";
+    private static final String PROJECT = "project";
+    private static final String ENDPOINT = "endpoint";
+    private static final String STATUS = "running";
+
+    @Mock
+    private EnvDAO envDAO;
+    @Mock
+    private ExploratoryDAO exploratoryDAO;
+    @Mock
+    private SecurityService securityService;
+    @Mock
+    private ExploratoryService exploratoryService;
+    @Mock
+    private ComputationalService computationalService;
+    @Mock
+    private UserSettingsDAO userSettingsDAO;
+    @Mock
+    private ProjectService projectService;
+
+    @InjectMocks
+    private EnvironmentServiceImpl environmentService;
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Test
+    public void getActiveUsers() {
+        doReturn(Collections.singleton(USER)).when(envDAO).fetchActiveEnvUsers();
+        doReturn(Collections.singleton(USER + "2")).when(envDAO).fetchUsersNotIn(anySet());
+        when(userSettingsDAO.getAllowedBudget(anyString())).thenReturn(Optional.empty());
+        final List<UserDTO> activeUsers = environmentService.getUsers();
+
+        assertEquals(2, activeUsers.size());
+        assertEquals(USER, activeUsers.get(0).getName());
+        assertEquals(USER + "2", activeUsers.get(1).getName());
+
+        verify(userSettingsDAO).getAllowedBudget(USER);
+        verify(userSettingsDAO).getAllowedBudget(USER + "2");
+        verify(envDAO).fetchActiveEnvUsers();
+        verify(envDAO).fetchUsersNotIn(Collections.singleton(USER));
+        verifyNoMoreInteractions(envDAO);
+    }
+
+    @Test
+    public void getAllEnv() {
+        when(exploratoryDAO.getInstances()).thenReturn(getUserInstances());
+        when(projectService.getProjects(any(UserInfo.class))).thenReturn(Collections.singletonList(getProjectDTO()));
+
+        List<UserResourceInfo> actualAllEnv = environmentService.getAllEnv(getUserInfo());
+
+        List<UserResourceInfo> userResources = Arrays.asList(getUserResourceInfoEdge(), getUserResourceInfo(EXPLORATORY_NAME_1), getUserResourceInfo(EXPLORATORY_NAME_2));
+        assertEquals("lists are not equal", userResources, actualAllEnv);
+        verify(exploratoryDAO).getInstances();
+        verify(projectService).getProjects(getUserInfo());
+        verifyNoMoreInteractions(exploratoryDAO, projectService);
+    }
+
+    @Test
+    public void getAllEnvWithoutEdge() {
+        when(exploratoryDAO.getInstances()).thenReturn(getUserInstances());
+        when(projectService.getProjects(any(UserInfo.class))).thenReturn(Collections.singletonList(getProjectDTOWithoutEndpoint()));
+
+        List<UserResourceInfo> actualAllEnv = environmentService.getAllEnv(getUserInfo());
+
+        List<UserResourceInfo> userResources = Arrays.asList(getUserResourceInfo(EXPLORATORY_NAME_1), getUserResourceInfo(EXPLORATORY_NAME_2));
+        assertEquals("lists are not equal", userResources, actualAllEnv);
+        verify(exploratoryDAO).getInstances();
+        verify(projectService).getProjects(getUserInfo());
+        verifyNoMoreInteractions(exploratoryDAO, projectService);
+    }
+
+    @Test
+    public void stopAll() {
+        when(projectService.getProjects()).thenReturn(Collections.singletonList(getProjectDTO()));
+        when(exploratoryDAO.fetchProjectExploratoriesWhereStatusIn(anyString(), anyListOf(UserInstanceStatus.class))).thenReturn(Collections.emptyList());
+        when(exploratoryDAO.fetchRunningExploratoryFieldsForProject(anyString())).thenReturn(getUserInstances());
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(getDataLabSystemUser());
+        when(projectService.get(anyString())).thenReturn(getProjectDTO());
+
+        environmentService.stopAll();
+
+        verify(projectService).getProjects();
+        verify(exploratoryDAO).fetchProjectExploratoriesWhereStatusIn(PROJECT_NAME, Arrays.asList(CREATING, STARTING, CREATING_IMAGE), CREATING, STARTING, CREATING_IMAGE);
+        verify(exploratoryDAO).fetchRunningExploratoryFieldsForProject(PROJECT_NAME);
+        verify(securityService, times(3)).getServiceAccountInfo(DATALAB_SYSTEM_USER);
+        verify(exploratoryService).stop(getDataLabSystemUser(), USER, PROJECT_NAME, EXPLORATORY_NAME_1, AUDIT_QUOTA_MESSAGE);
+        verify(exploratoryService).stop(getDataLabSystemUser(), USER, PROJECT_NAME, EXPLORATORY_NAME_2, AUDIT_QUOTA_MESSAGE);
+        verify(projectService).get(PROJECT_NAME);
+        verify(projectService).stop(getDataLabSystemUser(), ENDPOINT_NAME, PROJECT_NAME, AUDIT_QUOTA_MESSAGE);
+        verifyNoMoreInteractions(projectService, exploratoryDAO, securityService, exploratoryService);
+    }
+
+    @Test(expected = ResourceConflictException.class)
+    public void stopAllWithException() {
+        when(projectService.getProjects()).thenReturn(Collections.singletonList(getProjectDTO()));
+        when(exploratoryDAO.fetchProjectExploratoriesWhereStatusIn(PROJECT_NAME, Arrays.asList(CREATING, STARTING, CREATING_IMAGE), CREATING, STARTING, CREATING_IMAGE)).thenReturn(getUserInstances());
+
+        environmentService.stopAll();
+
+        verify(projectService).getProjects();
+        verify(exploratoryDAO).fetchProjectExploratoriesWhereStatusIn(PROJECT_NAME, Arrays.asList(CREATING, STARTING, CREATING_IMAGE), CREATING, STARTING, CREATING_IMAGE);
+        verifyNoMoreInteractions(projectService, exploratoryDAO, securityService, exploratoryService);
+    }
+
+    @Test
+    public void stopAllWithStoppedProject() {
+        when(projectService.getProjects()).thenReturn(Collections.singletonList(getProjectDTOWithStoppedEdge()));
+        when(exploratoryDAO.fetchProjectExploratoriesWhereStatusIn(anyString(), anyListOf(UserInstanceStatus.class))).thenReturn(Collections.emptyList());
+        when(exploratoryDAO.fetchRunningExploratoryFieldsForProject(anyString())).thenReturn(getUserInstances());
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(getDataLabSystemUser());
+        when(projectService.get(anyString())).thenReturn(getProjectDTOWithStoppedEdge());
+
+        environmentService.stopAll();
+
+        verify(projectService).getProjects();
+        verify(exploratoryDAO).fetchProjectExploratoriesWhereStatusIn(PROJECT_NAME, Arrays.asList(CREATING, STARTING, CREATING_IMAGE), CREATING, STARTING, CREATING_IMAGE);
+        verify(exploratoryDAO).fetchRunningExploratoryFieldsForProject(PROJECT_NAME);
+        verify(securityService, times(2)).getServiceAccountInfo(DATALAB_SYSTEM_USER);
+        verify(exploratoryService).stop(getDataLabSystemUser(), USER, PROJECT_NAME, EXPLORATORY_NAME_1, AUDIT_QUOTA_MESSAGE);
+        verify(exploratoryService).stop(getDataLabSystemUser(), USER, PROJECT_NAME, EXPLORATORY_NAME_2, AUDIT_QUOTA_MESSAGE);
+        verify(projectService).get(PROJECT_NAME);
+        verifyNoMoreInteractions(projectService, exploratoryDAO, securityService, exploratoryService);
+    }
+
+    @Test
+    public void stopEnvironmentWithServiceAccount() {
+        when(exploratoryDAO.fetchUserExploratoriesWhereStatusIn(anyString(), anyListOf(UserInstanceStatus.class))).thenReturn(Collections.emptyList());
+        when(exploratoryDAO.fetchRunningExploratoryFields(anyString())).thenReturn(getUserInstances());
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(getDataLabSystemUser());
+
+        environmentService.stopEnvironmentWithServiceAccount(USER);
+
+        verify(exploratoryDAO).fetchUserExploratoriesWhereStatusIn(USER, Arrays.asList(CREATING, STARTING, CREATING_IMAGE), CREATING, STARTING, CREATING_IMAGE);
+        verify(exploratoryDAO).fetchRunningExploratoryFields(USER);
+        verify(securityService, times(2)).getServiceAccountInfo(DATALAB_SYSTEM_USER);
+        verify(exploratoryService).stop(getDataLabSystemUser(), USER, PROJECT_NAME, EXPLORATORY_NAME_1, AUDIT_QUOTA_MESSAGE);
+        verify(exploratoryService).stop(getDataLabSystemUser(), USER, PROJECT_NAME, EXPLORATORY_NAME_2, AUDIT_QUOTA_MESSAGE);
+        verifyNoMoreInteractions(exploratoryDAO, securityService, exploratoryService);
+    }
+
+    @Test(expected = ResourceConflictException.class)
+    public void stopEnvironmentWithServiceAccountWithException() {
+        when(exploratoryDAO.fetchUserExploratoriesWhereStatusIn(USER, Arrays.asList(CREATING, STARTING, CREATING_IMAGE), CREATING, STARTING, CREATING_IMAGE))
+                .thenReturn(getUserInstances());
+
+        environmentService.stopEnvironmentWithServiceAccount(USER);
+
+        verify(exploratoryDAO).fetchUserExploratoriesWhereStatusIn(USER, Arrays.asList(CREATING, STARTING, CREATING_IMAGE), CREATING, STARTING, CREATING_IMAGE);
+        verifyNoMoreInteractions(exploratoryDAO, securityService, exploratoryService);
+    }
+
+    @Test
+    public void getActiveUsersWithException() {
+        doThrow(new DatalabException("Users not found")).when(envDAO).fetchActiveEnvUsers();
+
+        expectedException.expect(DatalabException.class);
+        expectedException.expectMessage("Users not found");
+
+        environmentService.getUsers();
+    }
+
+    @Test
+    public void stopProjectEnvironment() {
+        final UserInfo userInfo = getUserInfo();
+        final ProjectDTO projectDTO = getProjectDTO();
+        when(exploratoryDAO.fetchRunningExploratoryFieldsForProject(anyString())).thenReturn(getUserInstances());
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(userInfo);
+        when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString(), anyString(), anyString())).thenReturn(UUID);
+        when(projectService.get(anyString())).thenReturn(projectDTO);
+        doNothing().when(projectService).stop(any(UserInfo.class), anyString(), anyString(), anyString());
+
+        environmentService.stopProjectEnvironment(PROJECT_NAME);
+
+        verify(exploratoryDAO).fetchRunningExploratoryFieldsForProject(PROJECT_NAME);
+        verify(exploratoryService).stop(refEq(userInfo), eq(USER), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1), eq(AUDIT_QUOTA_MESSAGE));
+        verify(exploratoryService).stop(refEq(userInfo), eq(USER), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_2), eq(AUDIT_QUOTA_MESSAGE));
+        verify(securityService, times(3)).getServiceAccountInfo(DATALAB_SYSTEM_USER);
+        verify(projectService).get(eq(PROJECT_NAME));
+        verify(projectService).stop(refEq(userInfo), eq(ENDPOINT_NAME), eq(PROJECT_NAME), eq(AUDIT_QUOTA_MESSAGE));
+        verify(exploratoryDAO).fetchProjectExploratoriesWhereStatusIn(PROJECT_NAME, Arrays.asList(UserInstanceStatus.CREATING,
+                UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE),
+                UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE);
+        verifyNoMoreInteractions(exploratoryDAO, exploratoryService, projectService);
+    }
+
+    @Test
+    public void stopExploratory() {
+        final UserInfo userInfo = getUserInfo();
+        when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString(), anyString(), anyString())).thenReturn(UUID);
+
+        environmentService.stopExploratory(userInfo, USER, PROJECT_NAME, EXPLORATORY_NAME_1);
+
+        verify(exploratoryService).stop(refEq(userInfo), eq(USER), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1), eq(null));
+        verifyNoMoreInteractions(securityService, exploratoryService);
+    }
+
+    @Test
+    public void stopComputational() {
+        final UserInfo userInfo = getUserInfo();
+        doNothing().when(computationalService).stopSparkCluster(any(UserInfo.class), anyString(), anyString(), anyString(), anyString(), anyString());
+
+        environmentService.stopComputational(userInfo, USER, PROJECT_NAME, EXPLORATORY_NAME_1, "compName");
+
+        verify(computationalService).stopSparkCluster(refEq(userInfo), eq(userInfo.getName()), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1), eq("compName"),
+                eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME_1)));
+        verifyNoMoreInteractions(securityService, computationalService);
+    }
+
+    @Test
+    public void terminateExploratory() {
+        final UserInfo userInfo = getUserInfo();
+        when(exploratoryService.terminate(any(UserInfo.class), anyString(), anyString(), anyString(), anyString())).thenReturn(UUID);
+
+        environmentService.terminateExploratory(userInfo, USER, PROJECT_NAME, EXPLORATORY_NAME_1);
+
+        verify(exploratoryService).terminate(refEq(userInfo), eq(USER), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1), eq(null));
+        verifyNoMoreInteractions(securityService, exploratoryService);
+    }
+
+    @Test
+    public void terminateComputational() {
+        final UserInfo userInfo = getUserInfo();
+        doNothing().when(computationalService)
+                .terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString(), anyString());
+
+        environmentService.terminateComputational(userInfo, USER, PROJECT_NAME, EXPLORATORY_NAME_1, "compName");
+
+        verify(computationalService).terminateComputational(refEq(userInfo), eq(userInfo.getName()), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1), eq("compName"),
+                eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME_1)));
+        verifyNoMoreInteractions(securityService, computationalService);
+    }
+
+    @Test
+    public void updateEnvironmentStatuses() {
+        environmentService.updateEnvironmentStatuses(getEnvResourceList());
+
+        verify(projectService,times(2)).updateAfterStatusCheck(getSystemUser(), PROJECT, ENDPOINT, INSTANCE_ID, UserInstanceStatus.of(STATUS), AUDIT_UPDATE_STATUS);
+        verify(exploratoryService,times(2)).updateAfterStatusCheck(getSystemUser(), PROJECT, ENDPOINT, NAME, INSTANCE_ID, UserInstanceStatus.of(STATUS), AUDIT_UPDATE_STATUS);
+        verify(computationalService,times(2)).updateAfterStatusCheck(getSystemUser(), PROJECT, ENDPOINT, NAME, INSTANCE_ID, UserInstanceStatus.of(STATUS), AUDIT_UPDATE_STATUS);
+        verifyNoMoreInteractions(projectService, exploratoryService, computationalService);
+    }
+
+    @Test
+    public void updateEnvironmentStatusesWithUnknownStatus() {
+        EnvResourceList envResourceList = EnvResourceList.builder()
+                .hostList(Collections.singletonList(new EnvResource().withStatus("unknown status")))
+                .clusterList(Collections.singletonList(new EnvResource().withStatus("unknown status")))
+                .build();
+
+        environmentService.updateEnvironmentStatuses(envResourceList);
+
+        verifyZeroInteractions(projectService, exploratoryService, computationalService);
+    }
+
+    private UserInfo getSystemUser() {
+        return new UserInfo(DATALAB_SYSTEM_USER, null);
+    }
+
+    private EnvResourceList getEnvResourceList() {
+        List<EnvResource> hostList = Arrays.asList(getEnvResource(ResourceType.EDGE), getEnvResource(ResourceType.EXPLORATORY),
+                getEnvResource(ResourceType.COMPUTATIONAL));
+        List<EnvResource> clusterList = Arrays.asList(getEnvResource(ResourceType.EDGE), getEnvResource(ResourceType.EXPLORATORY),
+                getEnvResource(ResourceType.COMPUTATIONAL));
+        return  EnvResourceList.builder()
+                .hostList(hostList)
+                .clusterList(clusterList)
+                .build();
+    }
+
+    private EnvResource getEnvResource(ResourceType resourceType) {
+        return new EnvResource()
+                .withId(INSTANCE_ID)
+                .withName(NAME)
+                .withProject(PROJECT)
+                .withEndpoint(ENDPOINT)
+                .withStatus(STATUS)
+                .withResourceType(resourceType);
+    }
+
+    private UserResourceInfo getUserResourceInfoEdge() {
+        return UserResourceInfo.builder()
+                .resourceType(ResourceEnum.EDGE_NODE)
+                .resourceStatus("running")
+                .project(PROJECT_NAME)
+                .endpoint(ENDPOINT_NAME)
+                .ip(null)
+                .build();
+    }
+
+    private UserResourceInfo getUserResourceInfo(String exploratoryName) {
+        return UserResourceInfo.builder()
+                .resourceType(ResourceEnum.NOTEBOOK)
+                .resourceName(exploratoryName)
+                .resourceShape(SHAPE)
+                .resourceStatus("running")
+                .computationalResources(Collections.emptyList())
+                .user(USER)
+                .project(PROJECT_NAME)
+                .endpoint(ENDPOINT_NAME)
+                .cloudProvider("aws")
+                .exploratoryUrls(null)
+                .gpuEnabled(Boolean.FALSE)
+                .build();
+    }
+
+    private UserInfo getUserInfo() {
+        return new UserInfo(USER, TOKEN);
+    }
+
+    private UserInfo getDataLabSystemUser() {
+        return new UserInfo(DATALAB_SYSTEM_USER, DATALAB_SYSTEM_USER_TOKEN);
+    }
+
+    private List<UserInstanceDTO> getUserInstances() {
+        return Arrays.asList(
+                new UserInstanceDTO().withExploratoryName(EXPLORATORY_NAME_1).withUser(USER).withProject(PROJECT_NAME).withEndpoint(ENDPOINT_NAME)
+                        .withShape(SHAPE).withStatus("running").withResources(Collections.emptyList()).withCloudProvider("aws"),
+                new UserInstanceDTO().withExploratoryName(EXPLORATORY_NAME_2).withUser(USER).withProject(PROJECT_NAME).withEndpoint(ENDPOINT_NAME)
+                        .withShape(SHAPE).withStatus("running").withResources(Collections.emptyList()).withCloudProvider("aws"));
+    }
+
+    private ProjectDTO getProjectDTO() {
+        return new ProjectDTO(PROJECT_NAME, Collections.emptySet(), "", "", null,
+                Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, new EdgeInfo())), true);
+    }
+
+    private ProjectDTO getProjectDTOWithStoppedEdge() {
+        return new ProjectDTO(PROJECT_NAME, Collections.emptySet(), "", "", null,
+                Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.STOPPED, new EdgeInfo())), true);
+    }
+
+    private ProjectDTO getProjectDTOWithoutEndpoint() {
+        return new ProjectDTO(PROJECT_NAME, Collections.emptySet(), "", "", null, null, true);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImplTest.java
new file mode 100644
index 0000000..e18d576
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ExploratoryServiceImplTest.java
@@ -0,0 +1,572 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.GitCredsDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.service.TagService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.StatusEnvBaseDTO;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.aws.computational.ClusterConfig;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.dto.exploratory.ExploratoryActionDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryCreateDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryReconfigureSparkClusterActionDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryStatusDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.model.exploratory.Exploratory;
+import com.epam.datalab.rest.client.RESTService;
+import com.mongodb.client.result.UpdateResult;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyListOf;
+import static org.mockito.Mockito.anyMapOf;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.anyVararg;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ExploratoryServiceImplTest {
+
+    private final String USER = "test";
+    private final String TOKEN = "token";
+    private final String PROJECT = "project";
+    private final String EXPLORATORY_NAME = "expName";
+    private final String UUID = "1234-56789765-4321";
+    private static final String ENDPOINT_NAME = "endpointName";
+
+
+    private UserInfo userInfo;
+    private UserInstanceDTO userInstance;
+    private StatusEnvBaseDTO statusEnvBaseDTO;
+
+    @Mock
+    private ProjectService projectService;
+    @Mock
+    private ExploratoryDAO exploratoryDAO;
+    @Mock
+    private ComputationalDAO computationalDAO;
+    @Mock
+    private GitCredsDAO gitCredsDAO;
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+    @Mock
+    private RESTService provisioningService;
+    @Mock
+    private RequestBuilder requestBuilder;
+    @Mock
+    private RequestId requestId;
+    @Mock
+    private TagService tagService;
+    @Mock
+    private EndpointService endpointService;
+    @Mock
+    private SelfServiceApplicationConfiguration configuration;
+    @InjectMocks
+    private ExploratoryServiceImpl exploratoryService;
+
+    @Before
+    public void setUp() {
+        when(configuration.isAuditEnabled()).thenReturn(false);
+        userInfo = getUserInfo();
+        userInstance = getUserInstanceDto();
+    }
+
+    @Test
+    public void start() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+
+        ExploratoryGitCredsDTO egcDtoMock = mock(ExploratoryGitCredsDTO.class);
+        when(gitCredsDAO.findGitCreds(anyString())).thenReturn(egcDtoMock);
+
+        ExploratoryActionDTO egcuDto = new ExploratoryGitCredsUpdateDTO();
+        egcuDto.withExploratoryName(EXPLORATORY_NAME);
+        when(requestBuilder.newExploratoryStart(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class),
+                any(ExploratoryGitCredsDTO.class))).thenReturn(egcuDto);
+
+        String exploratoryStart = "exploratory/start";
+        when(provisioningService.post(anyString(), anyString(), any(ExploratoryActionDTO.class), any()))
+                .thenReturn(UUID);
+        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
+
+        String uuid = exploratoryService.start(userInfo, EXPLORATORY_NAME, "project", null);
+        assertNotNull(uuid);
+        assertEquals(UUID, uuid);
+
+        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("starting");
+
+        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(provisioningService).post(endpointDTO().getUrl() + exploratoryStart, TOKEN, egcuDto, String.class);
+        verify(requestId).put(USER, UUID);
+        verifyNoMoreInteractions(exploratoryDAO, provisioningService, requestId);
+    }
+
+    @Test
+    public void startWhenMethodFetchExploratoryFieldsThrowsException() {
+        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
+        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
+                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
+        try {
+            exploratoryService.start(userInfo, EXPLORATORY_NAME, PROJECT, null);
+        } catch (DatalabException e) {
+            assertEquals("Could not start exploratory environment expName: Exploratory for user with " +
+                    "name not found", e.getMessage());
+        }
+        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("starting");
+        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+
+        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("failed");
+        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void stop() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
+        when(computationalDAO.updateComputationalStatusesForExploratory(any(StatusEnvBaseDTO.class))).thenReturn(1);
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+
+        ExploratoryActionDTO eaDto = new ExploratoryActionDTO();
+        eaDto.withExploratoryName(EXPLORATORY_NAME);
+        when(requestBuilder.newExploratoryStop(anyString(), any(UserInstanceDTO.class), any(EndpointDTO.class)))
+                .thenReturn(eaDto);
+
+        String exploratoryStop = "exploratory/stop";
+        when(provisioningService.post(anyString(), anyString(), any(ExploratoryActionDTO.class), any())).thenReturn
+                (UUID);
+        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
+
+        String uuid = exploratoryService.stop(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, null);
+        assertNotNull(uuid);
+        assertEquals(UUID, uuid);
+
+        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("stopping");
+
+        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(provisioningService).post(endpointDTO().getUrl() + exploratoryStop, TOKEN, eaDto, String.class);
+        verify(computationalDAO).updateComputationalStatusesForExploratory(userInfo.getName(), PROJECT,
+                EXPLORATORY_NAME, UserInstanceStatus.STOPPING, UserInstanceStatus.TERMINATING,
+                UserInstanceStatus.FAILED, UserInstanceStatus.TERMINATED, UserInstanceStatus.STOPPED);
+        verify(requestId).put(USER, UUID);
+        verifyNoMoreInteractions(exploratoryDAO, provisioningService, requestId);
+    }
+
+    @Test
+    public void stopWhenMethodFetchExploratoryFieldsThrowsException() {
+        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
+        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
+                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
+        try {
+            exploratoryService.stop(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, null);
+        } catch (DatalabException e) {
+            assertEquals("Could not stop exploratory environment expName: Exploratory for user with " +
+                    "name not found", e.getMessage());
+        }
+        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("stopping");
+        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+
+        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("failed");
+        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void terminate() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
+        when(computationalDAO.updateComputationalStatusesForExploratory(any(StatusEnvBaseDTO.class))).thenReturn(1);
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+
+        ExploratoryActionDTO eaDto = new ExploratoryActionDTO();
+        eaDto.withExploratoryName(EXPLORATORY_NAME);
+        when(requestBuilder.newExploratoryStop(anyString(), any(UserInstanceDTO.class), any(EndpointDTO.class)))
+                .thenReturn(eaDto);
+
+        String exploratoryTerminate = "exploratory/terminate";
+        when(provisioningService.post(anyString(), anyString(), any(ExploratoryActionDTO.class), any())).thenReturn
+                (UUID);
+        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
+
+        String uuid = exploratoryService.terminate(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, null);
+        assertNotNull(uuid);
+        assertEquals(UUID, uuid);
+
+        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("terminating");
+
+        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(computationalDAO).updateComputationalStatusesForExploratory(USER, PROJECT, EXPLORATORY_NAME,
+                UserInstanceStatus.TERMINATING, UserInstanceStatus.TERMINATING, UserInstanceStatus.TERMINATED,
+                UserInstanceStatus.FAILED);
+        verify(requestBuilder).newExploratoryStop(userInfo.getName(), userInstance, endpointDTO());
+        verify(provisioningService).post(endpointDTO().getUrl() + exploratoryTerminate, TOKEN, eaDto, String.class);
+        verify(requestId).put(USER, UUID);
+        verifyNoMoreInteractions(exploratoryDAO, computationalDAO, requestBuilder, provisioningService, requestId);
+    }
+
+    @Test
+    public void terminateWhenMethodFetchExploratoryFieldsThrowsException() {
+        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
+        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
+                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
+        try {
+            exploratoryService.terminate(userInfo, userInfo.getName(), PROJECT, EXPLORATORY_NAME, null);
+        } catch (DatalabException e) {
+            assertEquals("Could not terminate exploratory environment expName: Exploratory for user " +
+                    "with name not found", e.getMessage());
+        }
+        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("terminating");
+        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+
+        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("failed");
+        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void create() {
+        ProjectDTO projectDTO = getProjectDTO();
+        when(projectService.get(anyString())).thenReturn(projectDTO);
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        doNothing().when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class));
+        ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
+        when(gitCredsDAO.findGitCreds(anyString())).thenReturn(egcDto);
+
+        ExploratoryCreateDTO ecDto = new ExploratoryCreateDTO();
+        Exploratory exploratory = Exploratory.builder()
+                .name(EXPLORATORY_NAME)
+                .endpoint("test")
+                .enabledGPU(false)
+                .version("someVersion")
+                .build();
+        when(requestBuilder.newExploratoryCreate(any(ProjectDTO.class), any(EndpointDTO.class),
+                any(Exploratory.class), any(UserInfo.class), any(ExploratoryGitCredsDTO.class), anyMapOf(String.class, String.class))).thenReturn(ecDto);
+        String exploratoryCreate = "exploratory/create";
+        when(provisioningService.post(anyString(), anyString(), any(ExploratoryCreateDTO.class), any()))
+                .thenReturn(UUID);
+        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
+
+        String uuid = exploratoryService.create(userInfo, exploratory, "project", "exploratory");
+        assertNotNull(uuid);
+        assertEquals(UUID, uuid);
+
+        userInstance.withStatus("creating");
+        userInstance.withResources(Collections.emptyList());
+        userInstance.withImageVersion("someVersion");
+        verify(projectService).get("project");
+        verify(exploratoryDAO).insertExploratory(userInstance);
+        verify(gitCredsDAO).findGitCreds(USER);
+        verify(requestBuilder).newExploratoryCreate(projectDTO, endpointDTO(), exploratory, userInfo, egcDto, Collections.emptyMap());
+        verify(provisioningService).post(endpointDTO().getUrl() + exploratoryCreate, TOKEN, ecDto, String.class);
+        verify(requestId).put(USER, UUID);
+        verifyNoMoreInteractions(projectService, exploratoryDAO, gitCredsDAO, requestBuilder, provisioningService, requestId);
+    }
+
+    @Test
+    public void createWhenMethodInsertExploratoryThrowsException() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        doThrow(new RuntimeException("Exploratory for user with name not found"))
+                .when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class));
+        expectedException.expect(DatalabException.class);
+        expectedException.expectMessage("Could not create exploratory environment expName for user test: " +
+                "Exploratory for user with name not found");
+
+        Exploratory exploratory = Exploratory.builder()
+                .name(EXPLORATORY_NAME)
+                .enabledGPU(false)
+                .version("someVersion")
+                .build();
+        exploratoryService.create(userInfo, exploratory, "project", "exploratory");
+        verify(endpointService).get(anyString());
+    }
+
+    @Test
+    public void createWhenMethodInsertExploratoryThrowsExceptionWithItsCatching() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        doThrow(new RuntimeException()).when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class));
+        Exploratory exploratory = Exploratory
+                .builder()
+                .name(EXPLORATORY_NAME)
+                .endpoint("test")
+                .enabledGPU(false)
+                .version("someVersion")
+                .build();
+        try {
+            exploratoryService.create(userInfo, exploratory, "project", "exploratory");
+        } catch (DatalabException e) {
+            assertEquals("Could not create exploratory environment expName for user test: null",
+                    e.getMessage());
+        }
+        userInstance.withStatus("creating");
+        userInstance.withResources(Collections.emptyList());
+        userInstance.withImageVersion("someVersion");
+        verify(exploratoryDAO).insertExploratory(userInstance);
+        verify(exploratoryDAO, never()).updateExploratoryStatus(any(StatusEnvBaseDTO.class));
+        verify(endpointService).get("test");
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void createWhenMethodNewExploratoryCreateThrowsException() {
+        ProjectDTO projectDTO = getProjectDTO();
+        when(projectService.get(anyString())).thenReturn(projectDTO);
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        doNothing().when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class));
+        ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
+        when(gitCredsDAO.findGitCreds(anyString())).thenReturn(egcDto);
+
+        Exploratory exploratory = Exploratory.builder()
+                .name(EXPLORATORY_NAME)
+                .endpoint("test")
+                .version("someVersion")
+                .enabledGPU(false)
+                .build();
+
+        doThrow(new DatalabException("Cannot create instance of resource class ")).when(requestBuilder)
+                .newExploratoryCreate(any(ProjectDTO.class), any(EndpointDTO.class), any(Exploratory.class),
+                        any(UserInfo.class), any(ExploratoryGitCredsDTO.class), anyMapOf(String.class, String.class));
+
+        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
+        try {
+            exploratoryService.create(userInfo, exploratory, "project", "exploratory");
+        } catch (DatalabException e) {
+            assertEquals("Could not create exploratory environment expName for user test: Cannot create instance " +
+                    "of resource class ", e.getMessage());
+        }
+
+        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("failed");
+
+        userInstance.withStatus("creating");
+        userInstance.withResources(Collections.emptyList());
+        userInstance.withImageVersion("someVersion");
+        verify(projectService).get("project");
+        verify(exploratoryDAO).insertExploratory(userInstance);
+        verify(exploratoryDAO).insertExploratory(userInstance);
+        verify(gitCredsDAO).findGitCreds(USER);
+        verify(requestBuilder).newExploratoryCreate(projectDTO, endpointDTO(), exploratory, userInfo, egcDto, Collections.emptyMap());
+        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+        verifyNoMoreInteractions(projectService, exploratoryDAO, gitCredsDAO, requestBuilder);
+    }
+
+    @Test
+    public void updateProjectExploratoryStatuses() {
+        when(exploratoryDAO.fetchProjectExploratoriesWhereStatusNotIn(anyString(), anyString(), anyVararg()))
+                .thenReturn(singletonList(userInstance));
+        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
+        doNothing().when(computationalDAO).updateComputationalStatusesForExploratory(anyString(), anyString(),
+                anyString(), any(UserInstanceStatus.class), any(UserInstanceStatus.class), anyVararg());
+
+        exploratoryService.updateProjectExploratoryStatuses(userInfo, "project",
+                "endpoint", UserInstanceStatus.TERMINATING);
+        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("terminating");
+
+        verify(exploratoryDAO).fetchProjectExploratoriesWhereStatusNotIn("project", "endpoint",
+                UserInstanceStatus.TERMINATED, UserInstanceStatus.FAILED);
+        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
+        verify(computationalDAO).updateComputationalStatusesForExploratory(USER, PROJECT,
+                EXPLORATORY_NAME, UserInstanceStatus.TERMINATING, UserInstanceStatus.TERMINATING,
+                UserInstanceStatus.TERMINATED, UserInstanceStatus.FAILED);
+
+        verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
+    }
+
+    @Test
+    public void getUserInstance() {
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+
+        Optional<UserInstanceDTO> expectedInstance = Optional.of(userInstance);
+        Optional<UserInstanceDTO> actualInstance = exploratoryService.getUserInstance(USER, PROJECT, EXPLORATORY_NAME);
+        assertEquals(expectedInstance, actualInstance);
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void getUserInstanceWithException() {
+        doThrow(new ResourceNotFoundException("Exploratory for user not found"))
+                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
+
+        Optional<UserInstanceDTO> expectedInstance = Optional.empty();
+        Optional<UserInstanceDTO> actualInstance = exploratoryService.getUserInstance(USER, PROJECT, EXPLORATORY_NAME);
+        assertEquals(expectedInstance, actualInstance);
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void testUpdateExploratoryClusterConfig() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
+        when(requestBuilder.newClusterConfigUpdate(any(UserInfo.class), any(UserInstanceDTO.class),
+                anyListOf(ClusterConfig.class), any(EndpointDTO.class))).thenReturn(new ExploratoryReconfigureSparkClusterActionDTO());
+        when(provisioningService.post(anyString(), anyString(), any(ExploratoryReconfigureSparkClusterActionDTO.class)
+                , any())).thenReturn(UUID);
+
+        exploratoryService.updateClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME, singletonList(new ClusterConfig()));
+
+        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(requestBuilder).newClusterConfigUpdate(refEq(getUserInfo()), refEq(getUserInstanceDto()),
+                refEq(singletonList(new ClusterConfig())), refEq(endpointDTO()));
+        verify(requestId).put(USER, UUID);
+        verify(provisioningService).post(eq(endpointDTO().getUrl() + "exploratory/reconfigure_spark"), eq(TOKEN),
+                refEq(new ExploratoryReconfigureSparkClusterActionDTO(), "self"), eq(String.class));
+        verify(exploratoryDAO).updateExploratoryFields(refEq(new ExploratoryStatusDTO()
+                .withUser(USER)
+                .withProject(PROJECT)
+                .withConfig(singletonList(new ClusterConfig()))
+                .withStatus(UserInstanceStatus.RECONFIGURING.toString())
+                .withExploratoryName(EXPLORATORY_NAME), "self"));
+        verifyNoMoreInteractions(requestBuilder, requestId, exploratoryDAO, provisioningService);
+    }
+
+    @Test
+    public void testUpdateExploratoryClusterConfigWhenNotRunning() {
+
+        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenThrow(new ResourceNotFoundException("EXCEPTION"));
+
+        try {
+
+            exploratoryService.updateClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME,
+                    singletonList(new ClusterConfig()));
+        } catch (ResourceNotFoundException e) {
+            assertEquals("EXCEPTION", e.getMessage());
+        }
+
+        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(exploratoryDAO);
+        verifyZeroInteractions(requestBuilder, requestId, provisioningService);
+    }
+
+    @Test
+    public void testGetClusterConfig() {
+        when(exploratoryDAO.getClusterConfig(anyString(), anyString(), anyString())).thenReturn(Collections.singletonList(getClusterConfig()));
+        final List<ClusterConfig> clusterConfig = exploratoryService.getClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME);
+
+        assertEquals(1, clusterConfig.size());
+        assertEquals("classification", clusterConfig.get(0).getClassification());
+
+        verify(exploratoryDAO).getClusterConfig(getUserInfo().getName(), PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void testGetClusterConfigWithException() {
+        when(exploratoryDAO.getClusterConfig(anyString(), anyString(), anyString())).thenThrow(new RuntimeException("Exception"));
+
+        expectedException.expect(RuntimeException.class);
+        expectedException.expectMessage("Exception");
+        exploratoryService.getClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME);
+    }
+
+    private ClusterConfig getClusterConfig() {
+        final ClusterConfig config = new ClusterConfig();
+        config.setClassification("classification");
+        return config;
+    }
+
+    private UserInfo getUserInfo() {
+        return new UserInfo(USER, TOKEN);
+    }
+
+    private UserInstanceDTO getUserInstanceDto() {
+        UserComputationalResource compResource = new UserComputationalResource();
+        compResource.setImageName("YYYY.dataengine");
+        compResource.setComputationalName("compName");
+        compResource.setStatus("stopped");
+        compResource.setComputationalId("compId");
+        return new UserInstanceDTO()
+                .withUser(USER)
+                .withExploratoryName(EXPLORATORY_NAME)
+                .withStatus("running")
+                .withResources(singletonList(compResource))
+                .withTags(Collections.emptyMap())
+                .withProject(PROJECT)
+                .withEndpoint("test")
+                .withCloudProvider(CloudProvider.AWS.toString());
+    }
+
+    private StatusEnvBaseDTO getStatusEnvBaseDTOWithStatus(String status) {
+        return new ExploratoryStatusDTO()
+                .withProject(PROJECT)
+                .withUser(USER)
+                .withExploratoryName(EXPLORATORY_NAME)
+                .withStatus(status);
+    }
+
+    private EndpointDTO endpointDTO() {
+        return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
+    }
+
+    private ProjectDTO getProjectDTO() {
+        return new ProjectDTO("project", Collections.emptySet(), "", "", null,
+                singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING,
+                        new EdgeInfo())), true);
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/GitCredentialServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/GitCredentialServiceImplTest.java
new file mode 100644
index 0000000..d7a17d2
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/GitCredentialServiceImplTest.java
@@ -0,0 +1,182 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.GitCredsDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class GitCredentialServiceImplTest {
+
+    private final String USER = "test";
+
+    @Mock
+    private GitCredsDAO gitCredsDAO;
+    @Mock
+    private ExploratoryDAO exploratoryDAO;
+    @Mock
+    private RESTService provisioningService;
+    @Mock
+    private RequestBuilder requestBuilder;
+    @Mock
+    private RequestId requestId;
+    @Mock
+    private EndpointService endpointService;
+
+    @InjectMocks
+    private GitCredentialServiceImpl gitCredentialService;
+
+    @Test
+    public void updateGitCredentials() {
+        String token = "token";
+        UserInfo userInfo = new UserInfo(USER, token);
+        doNothing().when(gitCredsDAO).updateGitCreds(anyString(), any(ExploratoryGitCredsDTO.class));
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+
+        String exploratoryName = "explName";
+        UserInstanceDTO uiDto = new UserInstanceDTO().withExploratoryName(exploratoryName).withUser(USER);
+        when(exploratoryDAO.fetchRunningExploratoryFields(anyString())).thenReturn(Collections.singletonList(uiDto));
+
+        ExploratoryGitCredsUpdateDTO egcuDto = new ExploratoryGitCredsUpdateDTO().withExploratoryName(exploratoryName);
+        when(requestBuilder.newGitCredentialsUpdate(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class),
+                any(ExploratoryGitCredsDTO.class))).thenReturn(egcuDto);
+
+        String uuid = "someUuid";
+        when(provisioningService.post(anyString(), anyString(), any(ExploratoryGitCredsUpdateDTO.class), any()))
+                .thenReturn(uuid);
+        when(requestId.put(anyString(), anyString())).thenReturn(uuid);
+
+        ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
+        gitCredentialService.updateGitCredentials(userInfo, egcDto);
+
+        verify(gitCredsDAO).updateGitCreds(USER, egcDto);
+        verify(exploratoryDAO).fetchRunningExploratoryFields(USER);
+        verify(requestBuilder).newGitCredentialsUpdate(userInfo, uiDto, endpointDTO(), egcDto);
+        verify(provisioningService).post(endpointDTO().getUrl() + "exploratory/git_creds", token, egcuDto,
+                String.class);
+        verify(requestId).put(USER, uuid);
+        verifyNoMoreInteractions(gitCredsDAO, exploratoryDAO, requestBuilder, provisioningService, requestId);
+    }
+
+    @Test
+    public void updateGitCredentialsWhenMethodUpdateGitCredsThrowsException() {
+        String token = "token";
+        UserInfo userInfo = new UserInfo(USER, token);
+        doThrow(new NullPointerException())
+                .when(gitCredsDAO).updateGitCreds(anyString(), any(ExploratoryGitCredsDTO.class));
+
+        ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
+        try {
+            gitCredentialService.updateGitCredentials(userInfo, egcDto);
+        } catch (DatalabException e) {
+            assertEquals("Cannot update the GIT credentials: null", e.getMessage());
+        }
+
+        verify(gitCredsDAO).updateGitCreds(USER, egcDto);
+        verifyNoMoreInteractions(gitCredsDAO);
+    }
+
+    @Test
+    public void updateGitCredentialsWithFailedNotebooks() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        String token = "token";
+        UserInfo userInfo = new UserInfo(USER, token);
+        doNothing().when(gitCredsDAO).updateGitCreds(anyString(), any(ExploratoryGitCredsDTO.class));
+
+        String exploratoryName = "explName";
+        UserInstanceDTO uiDto = new UserInstanceDTO().withExploratoryName(exploratoryName).withUser(USER);
+        when(exploratoryDAO.fetchRunningExploratoryFields(anyString())).thenReturn(Collections.singletonList(uiDto));
+
+        doThrow(new DatalabException("Cannot create instance of resource class "))
+                .when(requestBuilder).newGitCredentialsUpdate(any(UserInfo.class), any(UserInstanceDTO.class),
+                any(EndpointDTO.class), any(ExploratoryGitCredsDTO.class));
+
+        ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
+        try {
+            gitCredentialService.updateGitCredentials(userInfo, egcDto);
+        } catch (DatalabException e) {
+            assertEquals("Cannot update the GIT credentials: Requests for notebooks failed: explName",
+                    e.getMessage());
+        }
+
+        verify(gitCredsDAO).updateGitCreds(USER, egcDto);
+        verify(exploratoryDAO).fetchRunningExploratoryFields(USER);
+        verify(requestBuilder).newGitCredentialsUpdate(userInfo, uiDto, endpointDTO(), egcDto);
+        verifyNoMoreInteractions(gitCredsDAO, exploratoryDAO, requestBuilder);
+    }
+
+    @Test
+    public void getGitCredentials() {
+        ExploratoryGitCredsDTO expectedEgcDto = new ExploratoryGitCredsDTO();
+        when(gitCredsDAO.findGitCreds(anyString(), anyBoolean())).thenReturn(expectedEgcDto);
+
+        ExploratoryGitCredsDTO actualEgcDto = gitCredentialService.getGitCredentials(USER);
+        assertNotNull(actualEgcDto);
+        assertEquals(expectedEgcDto, actualEgcDto);
+
+        verify(gitCredsDAO).findGitCreds(USER, true);
+        verifyNoMoreInteractions(gitCredsDAO);
+    }
+
+    @Test
+    public void getGitCredentialsWhenMethodFindGitCredsThrowsException() {
+        doThrow(new NullPointerException()).when(gitCredsDAO).findGitCreds(anyString(), anyBoolean());
+        try {
+            gitCredentialService.getGitCredentials(USER);
+        } catch (DatalabException e) {
+            assertEquals("Cannot load GIT credentials for user test: null", e.getMessage());
+        }
+        verify(gitCredsDAO).findGitCreds(USER, true);
+        verifyNoMoreInteractions(gitCredsDAO);
+    }
+
+    private EndpointDTO endpointDTO() {
+        return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImplTest.java
new file mode 100644
index 0000000..78eb81f
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ImageExploratoryServiceImplTest.java
@@ -0,0 +1,352 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryLibDAO;
+import com.epam.datalab.backendapi.dao.ImageExploratoryDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.resources.dto.ImageInfoRecord;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryImageDTO;
+import com.epam.datalab.dto.exploratory.ExploratoryStatusDTO;
+import com.epam.datalab.dto.exploratory.ImageStatus;
+import com.epam.datalab.dto.exploratory.LibStatus;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceAlreadyExistException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.model.ResourceType;
+import com.epam.datalab.model.exploratory.Image;
+import com.epam.datalab.model.library.Library;
+import com.epam.datalab.rest.client.RESTService;
+import com.mongodb.client.result.UpdateResult;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.anyVararg;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ImageExploratoryServiceImplTest {
+    private final static String AUDIT_MESSAGE = "Image name: %s";
+    private final String USER = "test";
+    private final String TOKEN = "token";
+    private final String EXPLORATORY_NAME = "expName";
+    private final String PROJECT = "project";
+
+    private UserInfo userInfo;
+    private UserInstanceDTO userInstance;
+    private Image image;
+
+    @Mock
+    private ExploratoryDAO exploratoryDAO;
+    @Mock
+    private ImageExploratoryDAO imageExploratoryDao;
+    @Mock
+    private ExploratoryLibDAO libDAO;
+    @Mock
+    private RESTService provisioningService;
+    @Mock
+    private RequestBuilder requestBuilder;
+    @Mock
+    private EndpointService endpointService;
+    @Mock
+    private ProjectService projectService;
+
+    @InjectMocks
+    private ImageExploratoryServiceImpl imageExploratoryService;
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Before
+    public void setUp() {
+        userInfo = getUserInfo();
+        userInstance = getUserInstanceDto();
+        image = fetchImage();
+    }
+
+    @Test
+    public void createImage() {
+        when(projectService.get(anyString())).thenReturn(getProjectDTO());
+        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(imageExploratoryDao.exist(anyString(), anyString())).thenReturn(false);
+
+        when(libDAO.getLibraries(anyString(), anyString(), anyString())).thenReturn(Collections.singletonList(getLibrary()));
+        doNothing().when(imageExploratoryDao).save(any(Image.class));
+        when(exploratoryDAO.updateExploratoryStatus(any(ExploratoryStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+        ExploratoryImageDTO eiDto = new ExploratoryImageDTO();
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(requestBuilder.newExploratoryImageCreate(any(UserInfo.class), any(UserInstanceDTO.class), anyString(),
+                any(EndpointDTO.class), any(ProjectDTO.class))).thenReturn(eiDto);
+
+        String expectedUuid = "someUuid";
+        when(provisioningService.post(anyString(), anyString(), any(ExploratoryImageDTO.class), any()))
+                .thenReturn(expectedUuid);
+
+        String imageName = "someImageName", imageDescription = "someDescription";
+        String actualUuid = imageExploratoryService.createImage(userInfo, PROJECT, EXPLORATORY_NAME,
+                imageName, imageDescription, String.format(AUDIT_MESSAGE, imageName));
+        assertNotNull(actualUuid);
+        assertEquals(expectedUuid, actualUuid);
+
+        verify(projectService).get(PROJECT);
+        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
+        verify(imageExploratoryDao).exist(imageName, PROJECT);
+        verify(imageExploratoryDao).save(any(Image.class));
+        verify(libDAO).getLibraries(USER, PROJECT, EXPLORATORY_NAME);
+        verify(requestBuilder).newExploratoryImageCreate(userInfo, userInstance, imageName, endpointDTO(), getProjectDTO());
+        verify(endpointService).get(anyString());
+        verify(provisioningService).post(endpointDTO().getUrl() + "exploratory/image", TOKEN, eiDto, String.class);
+        verifyNoMoreInteractions(projectService, exploratoryDAO, imageExploratoryDao, libDAO, requestBuilder, endpointService, provisioningService);
+    }
+
+    @Test
+    public void createImageWhenMethodFetchRunningExploratoryFieldsThrowsException() {
+        doThrow(new DatalabException("Running exploratory instance for user with name not found."))
+                .when(exploratoryDAO).fetchRunningExploratoryFields(anyString(), anyString(), anyString());
+
+        String imageName = "someImageName", imageDescription = "someDescription";
+
+        try {
+            imageExploratoryService.createImage(userInfo, PROJECT, EXPLORATORY_NAME, imageName, imageDescription, String.format(AUDIT_MESSAGE, imageName));
+        } catch (DatalabException e) {
+            assertEquals("Running exploratory instance for user with name not found.", e.getMessage());
+        }
+        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void createImageWhenResourceAlreadyExists() {
+        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(imageExploratoryDao.exist(anyString(), anyString())).thenReturn(true);
+
+        expectedException.expect(ResourceAlreadyExistException.class);
+        expectedException.expectMessage("Image with name someImageName is already exist");
+
+        String imageName = "someImageName", imageDescription = "someDescription";
+        imageExploratoryService.createImage(userInfo, PROJECT, EXPLORATORY_NAME, imageName, imageDescription, String.format(AUDIT_MESSAGE, imageName));
+    }
+
+    @Test
+    public void createImageWhenMethodNewExploratoryImageCreateThrowsException() {
+        when(projectService.get(anyString())).thenReturn(getProjectDTO());
+        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(imageExploratoryDao.exist(anyString(), anyString())).thenReturn(false);
+
+        when(libDAO.getLibraries(anyString(), anyString(), anyString())).thenReturn(Collections.singletonList(getLibrary()));
+        doNothing().when(imageExploratoryDao).save(any(Image.class));
+        when(exploratoryDAO.updateExploratoryStatus(any(ExploratoryStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+        doThrow(new DatalabException("Cannot create instance of resource class")).when(requestBuilder)
+                .newExploratoryImageCreate(any(UserInfo.class), any(UserInstanceDTO.class), anyString(), any(EndpointDTO.class), any(ProjectDTO.class));
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+
+        String imageName = "someImageName", imageDescription = "someDescription";
+        try {
+            imageExploratoryService.createImage(userInfo, PROJECT, EXPLORATORY_NAME, imageName, imageDescription, String.format(AUDIT_MESSAGE, imageName));
+        } catch (DatalabException e) {
+            assertEquals("Cannot create instance of resource class", e.getMessage());
+        }
+
+        verify(projectService).get(PROJECT);
+        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
+        verify(imageExploratoryDao).exist(imageName, PROJECT);
+        verify(imageExploratoryDao).save(any(Image.class));
+        verify(libDAO).getLibraries(USER, PROJECT, EXPLORATORY_NAME);
+        verify(requestBuilder).newExploratoryImageCreate(userInfo, userInstance, imageName, endpointDTO(), getProjectDTO());
+        verify(endpointService).get(anyString());
+        verifyNoMoreInteractions(projectService, exploratoryDAO, imageExploratoryDao, libDAO, requestBuilder, endpointService);
+    }
+
+    @Test
+    public void finishImageCreate() {
+        when(exploratoryDAO.updateExploratoryStatus(any(ExploratoryStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+        doNothing().when(imageExploratoryDao).updateImageFields(any(Image.class));
+        doNothing().when(exploratoryDAO).updateExploratoryIp(anyString(), anyString(), anyString(), anyString());
+
+        String notebookIp = "someIp";
+        imageExploratoryService.finishImageCreate(image, EXPLORATORY_NAME, notebookIp);
+
+        verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
+        verify(exploratoryDAO).updateExploratoryIp(USER, PROJECT, notebookIp, EXPLORATORY_NAME);
+        verify(imageExploratoryDao).updateImageFields(image);
+        verifyNoMoreInteractions(exploratoryDAO, imageExploratoryDao);
+    }
+
+    @Test
+    public void finishImageCreateWhenMethodUpdateExploratoryIpThrowsException() {
+        when(exploratoryDAO.updateExploratoryStatus(any(ExploratoryStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+        doNothing().when(imageExploratoryDao).updateImageFields(any(Image.class));
+        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
+                .when(exploratoryDAO).updateExploratoryIp(anyString(), anyString(), anyString(), anyString());
+
+        String notebookIp = "someIp";
+        try {
+            imageExploratoryService.finishImageCreate(image, EXPLORATORY_NAME, notebookIp);
+        } catch (ResourceNotFoundException e) {
+            assertEquals("Exploratory for user with name not found", e.getMessage());
+        }
+
+        verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
+        verify(exploratoryDAO).updateExploratoryIp(USER, PROJECT, notebookIp, EXPLORATORY_NAME);
+        verify(imageExploratoryDao).updateImageFields(image);
+        verifyNoMoreInteractions(exploratoryDAO, imageExploratoryDao);
+    }
+
+    @Test
+    public void finishImageCreateWhenNotebookIpIsNull() {
+        when(exploratoryDAO.updateExploratoryStatus(any(ExploratoryStatusDTO.class)))
+                .thenReturn(mock(UpdateResult.class));
+        doNothing().when(imageExploratoryDao).updateImageFields(any(Image.class));
+
+        imageExploratoryService.finishImageCreate(image, EXPLORATORY_NAME, null);
+
+        verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
+        verify(exploratoryDAO, never()).updateExploratoryIp(USER, PROJECT, null, EXPLORATORY_NAME);
+        verify(imageExploratoryDao).updateImageFields(image);
+        verifyNoMoreInteractions(exploratoryDAO, imageExploratoryDao);
+    }
+
+    @Test
+    public void getCreatedImages() {
+        ImageInfoRecord imageInfoRecord = getImageInfoRecord();
+        List<ImageInfoRecord> expectedRecordList = Collections.singletonList(imageInfoRecord);
+        when(imageExploratoryDao.getImages(anyString(), anyString(), anyString(), anyString(), anyVararg()))
+                .thenReturn(expectedRecordList);
+
+        List<ImageInfoRecord> actualRecordList = imageExploratoryService.getNotFailedImages(USER,
+                "someImage", "someProject", "someEndpoint");
+        assertNotNull(actualRecordList);
+        assertEquals(1, actualRecordList.size());
+        assertEquals(expectedRecordList, actualRecordList);
+
+        verify(imageExploratoryDao).getImages(USER, "someImage", "someProject", "someEndpoint", ImageStatus.CREATED, ImageStatus.CREATING);
+        verifyNoMoreInteractions(imageExploratoryDao);
+    }
+
+    @Test
+    public void getImage() {
+        ImageInfoRecord expectedImageInfoRecord = getImageInfoRecord();
+        when(imageExploratoryDao.getImage(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(Optional.of(expectedImageInfoRecord));
+
+        ImageInfoRecord actualImageInfoRecord = imageExploratoryService.getImage(USER, "someName", "someProject", "someEndpoint");
+        assertNotNull(actualImageInfoRecord);
+        assertEquals(expectedImageInfoRecord, actualImageInfoRecord);
+
+        verify(imageExploratoryDao).getImage(USER, "someName", "someProject", "someEndpoint");
+        verifyNoMoreInteractions(imageExploratoryDao);
+    }
+
+    @Test
+    public void getImageWhenMethodGetImageReturnsOptionalEmpty() {
+        when(imageExploratoryDao.getImage(anyString(), anyString(), anyString(), anyString())).thenReturn(Optional.empty());
+        expectedException.expect(ResourceNotFoundException.class);
+        expectedException.expectMessage(String.format("Image with name %s was not found for user %s",
+                "someImageName", USER));
+        imageExploratoryService.getImage(USER, "someImageName", "someProject", "someEndpoint");
+    }
+
+    @Test
+    public void getImagesForProject() {
+        when(imageExploratoryDao.getImagesForProject(anyString())).thenReturn(Collections.singletonList(getImageInfoRecord()));
+
+        imageExploratoryService.getImagesForProject(PROJECT);
+
+        verify(imageExploratoryDao).getImagesForProject(PROJECT);
+        verifyNoMoreInteractions(imageExploratoryDao);
+    }
+
+    private ImageInfoRecord getImageInfoRecord() {
+        return new ImageInfoRecord("someName", "someDescription", "someProject", "someEndpoint", "someUser", "someApp",
+                "someFullName", ImageStatus.CREATED);
+    }
+
+    private Image fetchImage() {
+        return Image.builder()
+                .name("someImageName")
+                .description("someDescription")
+                .status(ImageStatus.CREATING)
+                .user(USER)
+                .project(PROJECT)
+                .libraries(Collections.singletonList(getLibrary()))
+                .computationalLibraries(Collections.emptyMap())
+                .dockerImage("someImageName")
+                .exploratoryId("explId").build();
+    }
+
+    private Library getLibrary() {
+        return new Library("someGroup", "someName", "someVersion", LibStatus.INSTALLED,
+                "someErrorMessage").withType(ResourceType.EXPLORATORY);
+    }
+
+    private UserInstanceDTO getUserInstanceDto() {
+        return new UserInstanceDTO()
+                .withUser(USER)
+                .withExploratoryName(EXPLORATORY_NAME)
+                .withExploratoryId("explId")
+                .withProject(PROJECT);
+    }
+
+    private UserInfo getUserInfo() {
+        return new UserInfo(USER, TOKEN);
+    }
+
+    private EndpointDTO endpointDTO() {
+        return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
+    }
+
+    private ProjectDTO getProjectDTO() {
+        return ProjectDTO.builder().name(PROJECT).build();
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImplTest.java
new file mode 100644
index 0000000..683617a
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureInfoServiceImplTest.java
@@ -0,0 +1,426 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.domain.BillingReport;
+import com.epam.datalab.backendapi.domain.BillingReportLine;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.resources.TestBase;
+import com.epam.datalab.backendapi.resources.dto.HealthStatusPageDTO;
+import com.epam.datalab.backendapi.resources.dto.ProjectInfrastructureInfo;
+import com.epam.datalab.backendapi.service.BillingService;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.InfrastructureMetaInfoDTO;
+import com.epam.datalab.dto.UserEnvironmentResources;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.aws.edge.EdgeInfoAws;
+import com.epam.datalab.dto.azure.edge.EdgeInfoAzure;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.billing.BillingResourceType;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.dto.gcp.edge.EdgeInfoGcp;
+import com.epam.datalab.dto.status.EnvResource;
+import com.epam.datalab.dto.status.EnvResourceList;
+import com.epam.datalab.rest.client.RESTService;
+import com.jcabi.manifests.Manifests;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyListOf;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class InfrastructureInfoServiceImplTest extends TestBase {
+
+    private static final String PROJECT = "project";
+    private static final String EXPLORATORY_NAME = "exploratoryName";
+    private static final String COMPUTE_NAME = "computeName";
+    private static final String CURRENCY = "currency";
+    private static final String UUID = "uuid";
+    private static final String INFRASTRUCTURE_STATUS = "infrastructure/status";
+
+    @Mock
+    private ExploratoryDAO expDAO;
+    @Mock
+    private SelfServiceApplicationConfiguration configuration;
+    @Mock
+    private ProjectService projectService;
+    @Mock
+    private EndpointService endpointService;
+    @Mock
+    private BillingService billingService;
+    @Mock
+    private RESTService provisioningService;
+    @Mock
+    private RequestBuilder requestBuilder;
+    @Mock
+    private RequestId requestId;
+
+    @InjectMocks
+    private InfrastructureInfoServiceImpl infoService;
+
+    @Test
+    public void getUserResources() {
+        when(endpointService.getEndpoints()).thenReturn(Collections.singletonList(getEndpointDTO()));
+        when(projectService.getUserProjects(any(UserInfo.class), anyBoolean())).thenReturn(Collections.singletonList(getProjectDTO()));
+        when(expDAO.findExploratories(anyString(), anyString())).thenReturn(getUserInstanceDTOs());
+        when(billingService.getBillingProjectQuoteUsed(anyString())).thenReturn(10);
+        when(projectService.get(anyString())).thenReturn(getProjectDTO());
+        when(billingService.getExploratoryBillingData(anyString(), anyString(), anyString(), anyListOf(String.class))).thenReturn(getReport());
+
+        List<ProjectInfrastructureInfo> actualUserResources = infoService.getUserResources(getUserInfo());
+
+        assertEquals("resources should be equal", getProjectInfrastructureInfo(), actualUserResources);
+        verify(endpointService).getEndpoints();
+        verify(projectService).getUserProjects(getUserInfo(), Boolean.FALSE);
+        verify(expDAO).findExploratories(USER.toLowerCase(), PROJECT);
+        verify(billingService).getBillingProjectQuoteUsed(PROJECT);
+        verify(projectService).get(PROJECT);
+        verify(billingService).getExploratoryBillingData(PROJECT, ENDPOINT_NAME, EXPLORATORY_NAME, Collections.singletonList(COMPUTE_NAME));
+        verifyNoMoreInteractions(endpointService, projectService, expDAO, billingService);
+    }
+
+    @Test
+    public void getAwsUserResources() {
+        when(endpointService.getEndpoints()).thenReturn(Collections.singletonList(getEndpointDTO()));
+        when(projectService.getUserProjects(any(UserInfo.class), anyBoolean())).thenReturn(Collections.singletonList(getAwsProjectDTO()));
+        when(expDAO.findExploratories(anyString(), anyString())).thenReturn(getUserInstanceDTOs());
+        when(billingService.getBillingProjectQuoteUsed(anyString())).thenReturn(10);
+        when(projectService.get(anyString())).thenReturn(getAwsProjectDTO());
+        when(billingService.getExploratoryBillingData(anyString(), anyString(), anyString(), anyListOf(String.class))).thenReturn(getReport());
+
+        List<ProjectInfrastructureInfo> actualUserResources = infoService.getUserResources(getUserInfo());
+
+        assertEquals("resources should be equal", getAwsProjectInfrastructureInfo(), actualUserResources);
+        verify(endpointService).getEndpoints();
+        verify(projectService).getUserProjects(getUserInfo(), Boolean.FALSE);
+        verify(expDAO).findExploratories(USER.toLowerCase(), PROJECT);
+        verify(billingService).getBillingProjectQuoteUsed(PROJECT);
+        verify(projectService).get(PROJECT);
+        verify(billingService).getExploratoryBillingData(PROJECT, ENDPOINT_NAME, EXPLORATORY_NAME, Collections.singletonList(COMPUTE_NAME));
+        verifyNoMoreInteractions(endpointService, projectService, expDAO, billingService);
+    }
+
+    @Test
+    public void getAzureUserResources() {
+        when(endpointService.getEndpoints()).thenReturn(Collections.singletonList(getEndpointDTO()));
+        when(projectService.getUserProjects(any(UserInfo.class), anyBoolean())).thenReturn(Collections.singletonList(getAzureProjectDTO()));
+        when(expDAO.findExploratories(anyString(), anyString())).thenReturn(getUserInstanceDTOs());
+        when(billingService.getBillingProjectQuoteUsed(anyString())).thenReturn(10);
+        when(projectService.get(anyString())).thenReturn(getAzureProjectDTO());
+        when(billingService.getExploratoryBillingData(anyString(), anyString(), anyString(), anyListOf(String.class))).thenReturn(getReport());
+
+        List<ProjectInfrastructureInfo> actualUserResources = infoService.getUserResources(getUserInfo());
+
+        assertEquals("resources should be equal", getAzureProjectInfrastructureInfo(), actualUserResources);
+        verify(endpointService).getEndpoints();
+        verify(projectService).getUserProjects(getUserInfo(), Boolean.FALSE);
+        verify(expDAO).findExploratories(USER.toLowerCase(), PROJECT);
+        verify(billingService).getBillingProjectQuoteUsed(PROJECT);
+        verify(projectService).get(PROJECT);
+        verify(billingService).getExploratoryBillingData(PROJECT, ENDPOINT_NAME, EXPLORATORY_NAME, Collections.singletonList(COMPUTE_NAME));
+        verifyNoMoreInteractions(endpointService, projectService, expDAO, billingService);
+    }
+
+    @Test
+    public void getGcpUserResources() {
+        when(endpointService.getEndpoints()).thenReturn(Collections.singletonList(getEndpointDTO()));
+        when(projectService.getUserProjects(any(UserInfo.class), anyBoolean())).thenReturn(Collections.singletonList(getGcpProjectDTO()));
+        when(expDAO.findExploratories(anyString(), anyString())).thenReturn(getUserInstanceDTOs());
+        when(billingService.getBillingProjectQuoteUsed(anyString())).thenReturn(10);
+        when(projectService.get(anyString())).thenReturn(getGcpProjectDTO());
+        when(billingService.getExploratoryBillingData(anyString(), anyString(), anyString(), anyListOf(String.class))).thenReturn(getReport());
+
+        List<ProjectInfrastructureInfo> actualUserResources = infoService.getUserResources(getUserInfo());
+
+        assertEquals("resources should be equal", getGcpProjectInfrastructureInfo(), actualUserResources);
+        verify(endpointService).getEndpoints();
+        verify(projectService).getUserProjects(getUserInfo(), Boolean.FALSE);
+        verify(expDAO).findExploratories(USER.toLowerCase(), PROJECT);
+        verify(billingService).getBillingProjectQuoteUsed(PROJECT);
+        verify(projectService).get(PROJECT);
+        verify(billingService).getExploratoryBillingData(PROJECT, ENDPOINT_NAME, EXPLORATORY_NAME, Collections.singletonList(COMPUTE_NAME));
+        verifyNoMoreInteractions(endpointService, projectService, expDAO, billingService);
+    }
+
+    @Test
+    public void getHeathStatus() {
+        when(configuration.isBillingSchedulerEnabled()).thenReturn(Boolean.TRUE);
+        when(configuration.isAuditEnabled()).thenReturn(Boolean.TRUE);
+        when(projectService.isAnyProjectAssigned(any(UserInfo.class))).thenReturn(Boolean.TRUE);
+
+        HealthStatusPageDTO actualHeathStatus = infoService.getHeathStatus(getUserInfo());
+
+        assertEquals("HealthStatusPageDTO should be equal", getHealthStatusPageDTO(), actualHeathStatus);
+        verify(projectService).isAnyProjectAssigned(getUserInfo());
+        verify(configuration).isBillingSchedulerEnabled();
+        verify(configuration).isAuditEnabled();
+        verifyNoMoreInteractions(configuration, projectService);
+    }
+
+    @Test
+    public void getInfrastructureMetaInfo() {
+        Manifests.DEFAULT.put("GIT-Branch", "branch");
+        Manifests.DEFAULT.put("GIT-Commit", "commit");
+        Manifests.DEFAULT.put("DataLab-Version", "version");
+
+        InfrastructureMetaInfoDTO actualInfrastructureMetaInfo = infoService.getInfrastructureMetaInfo();
+
+        assertEquals("InfrastructureMetaInfoDTO should be equal", getInfrastructureMetaInfoDTO(), actualInfrastructureMetaInfo);
+    }
+
+    @Test
+    public void updateInfrastructureStatuses() {
+        List<EnvResource> envResources = Collections.singletonList(new EnvResource().withId("id"));
+        when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+        when(provisioningService.post(anyString(), anyString(), any(UserEnvironmentResources.class), any())).thenReturn(UUID);
+        when(requestBuilder.newInfrastructureStatus(anyString(), any(CloudProvider.class), any(EnvResourceList.class))).thenReturn(
+                new UserEnvironmentResources());
+
+        infoService.updateInfrastructureStatuses(getUserInfo(), ENDPOINT_NAME, envResources, envResources);
+
+        verify(endpointService).get(ENDPOINT_NAME);
+        verify(requestBuilder).newInfrastructureStatus(USER.toLowerCase(), CloudProvider.AWS, EnvResourceList.builder()
+                .hostList(envResources)
+                .clusterList(envResources)
+                .build());
+        verify(provisioningService).post(ENDPOINT_URL + INFRASTRUCTURE_STATUS, TOKEN, new UserEnvironmentResources(), String.class);
+        verify(requestId).put(USER.toLowerCase(), UUID);
+        verifyNoMoreInteractions(endpointService, provisioningService, requestBuilder, requestId);
+    }
+
+    private InfrastructureMetaInfoDTO getInfrastructureMetaInfoDTO() {
+        return InfrastructureMetaInfoDTO.builder()
+                .branch("branch")
+                .commit("commit")
+                .version("version")
+                .releaseNotes("https://github.com/apache/incubator-datalab/blob/branch/RELEASE_NOTES.md")
+                .build();
+    }
+
+    private HealthStatusPageDTO getHealthStatusPageDTO() {
+        return HealthStatusPageDTO.builder()
+                .status("ok")
+                .listResources(Collections.emptyList())
+                .billingEnabled(Boolean.TRUE)
+                .auditEnabled(Boolean.TRUE)
+                .projectAdmin(Boolean.FALSE)
+                .admin(Boolean.FALSE)
+                .projectAssigned(Boolean.TRUE)
+                .bucketBrowser(HealthStatusPageDTO.BucketBrowser.builder()
+                        .view(Boolean.TRUE)
+                        .upload(Boolean.TRUE)
+                        .download(Boolean.TRUE)
+                        .delete(Boolean.TRUE)
+                        .build())
+                .build();
+    }
+
+    private List<ProjectInfrastructureInfo> getProjectInfrastructureInfo() {
+        List<ProjectInfrastructureInfo> objects = new ArrayList<>();
+        objects.add(ProjectInfrastructureInfo.builder()
+                .project(PROJECT)
+                .billingQuoteUsed(10)
+                .shared(Collections.singletonMap(ENDPOINT_NAME, Collections.emptyMap()))
+                .exploratory(getUserInstanceDTOs())
+                .exploratoryBilling(Collections.singletonList(getReport()))
+                .endpoints(Collections.singletonList(getEndpointDTO()))
+                .odahu(Collections.emptyList())
+                .build());
+        return objects;
+    }
+
+    private List<ProjectInfrastructureInfo> getAwsProjectInfrastructureInfo() {
+        List<ProjectInfrastructureInfo> objects = new ArrayList<>();
+        objects.add(ProjectInfrastructureInfo.builder()
+                .project(PROJECT)
+                .billingQuoteUsed(10)
+                .shared(Collections.singletonMap(ENDPOINT_NAME, getAwsEdgeInfo()))
+                .exploratory(getUserInstanceDTOs())
+                .exploratoryBilling(Collections.singletonList(getReport()))
+                .endpoints(Collections.singletonList(getEndpointDTO()))
+                .odahu(Collections.emptyList())
+                .build());
+        return objects;
+    }
+
+    private List<ProjectInfrastructureInfo> getAzureProjectInfrastructureInfo() {
+        List<ProjectInfrastructureInfo> objects = new ArrayList<>();
+        objects.add(ProjectInfrastructureInfo.builder()
+                .project(PROJECT)
+                .billingQuoteUsed(10)
+                .shared(Collections.singletonMap(ENDPOINT_NAME, getAzureEdgeInfo()))
+                .exploratory(getUserInstanceDTOs())
+                .exploratoryBilling(Collections.singletonList(getReport()))
+                .endpoints(Collections.singletonList(getEndpointDTO()))
+                .odahu(Collections.emptyList())
+                .build());
+        return objects;
+    }
+
+    private List<ProjectInfrastructureInfo> getGcpProjectInfrastructureInfo() {
+        List<ProjectInfrastructureInfo> objects = new ArrayList<>();
+        objects.add(ProjectInfrastructureInfo.builder()
+                .project(PROJECT)
+                .billingQuoteUsed(10)
+                .shared(Collections.singletonMap(ENDPOINT_NAME, getGcpEdgeInfo()))
+                .exploratory(getUserInstanceDTOs())
+                .exploratoryBilling(Collections.singletonList(getReport()))
+                .endpoints(Collections.singletonList(getEndpointDTO()))
+                .odahu(Collections.emptyList())
+                .build());
+        return objects;
+    }
+
+    private Map<String, String> getAwsEdgeInfo() {
+        HashMap<String, String> edge = new HashMap<>();
+        edge.put("status", "running");
+        edge.put("edge_node_ip", "publicIp");
+        edge.put("user_own_bicket_name", "ownBucketName");
+        edge.put("shared_bucket_name", "sharedBucketName");
+        return edge;
+    }
+
+    private Map<String, String> getAzureEdgeInfo() {
+        HashMap<String, String> edge = new HashMap<>();
+        edge.put("status", "running");
+        edge.put("edge_node_ip", "publicIp");
+        edge.put("user_container_name", "userContainerName");
+        edge.put("shared_container_name", "sharedContainerName");
+        edge.put("user_storage_account_name", "userStorageAccountName");
+        edge.put("shared_storage_account_name", "sharedStorageAccountName");
+        edge.put("datalake_name", "dataLakeName");
+        edge.put("datalake_user_directory_name", "dataLakeDirectoryName");
+        edge.put("datalake_shared_directory_name", "dataLakeSharedDirectoryName");
+        return edge;
+    }
+
+    private Map<String, String> getGcpEdgeInfo() {
+        HashMap<String, String> edge = new HashMap<>();
+        edge.put("status", "running");
+        edge.put("edge_node_ip", "publicIp");
+        edge.put("user_own_bucket_name", "ownBucketName");
+        edge.put("shared_bucket_name", "sharedBucketName");
+        return edge;
+    }
+
+    private ProjectDTO getProjectDTO() {
+        return ProjectDTO.builder()
+                .name(PROJECT)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, null)))
+                .build();
+    }
+
+    private ProjectDTO getAwsProjectDTO() {
+        EdgeInfoAws edgeInfoAws = new EdgeInfoAws();
+        edgeInfoAws.setPublicIp("publicIp");
+        edgeInfoAws.setUserOwnBucketName("ownBucketName");
+        edgeInfoAws.setSharedBucketName("sharedBucketName");
+
+        return ProjectDTO.builder()
+                .name(PROJECT)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, edgeInfoAws)))
+                .build();
+    }
+
+    private ProjectDTO getAzureProjectDTO() {
+        EdgeInfoAzure edgeInfoAzure = new EdgeInfoAzure();
+        edgeInfoAzure.setPublicIp("publicIp");
+        edgeInfoAzure.setUserContainerName("userContainerName");
+        edgeInfoAzure.setSharedContainerName("sharedContainerName");
+        edgeInfoAzure.setUserStorageAccountName("userStorageAccountName");
+        edgeInfoAzure.setSharedStorageAccountName("sharedStorageAccountName");
+        edgeInfoAzure.setDataLakeName("dataLakeName");
+        edgeInfoAzure.setDataLakeDirectoryName("dataLakeDirectoryName");
+        edgeInfoAzure.setDataLakeSharedDirectoryName("dataLakeSharedDirectoryName");
+
+        return ProjectDTO.builder()
+                .name(PROJECT)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, edgeInfoAzure)))
+                .build();
+    }
+
+    private ProjectDTO getGcpProjectDTO() {
+        EdgeInfoGcp edgeInfoGcp = new EdgeInfoGcp();
+        edgeInfoGcp.setPublicIp("publicIp");
+        edgeInfoGcp.setUserOwnBucketName("ownBucketName");
+        edgeInfoGcp.setSharedBucketName("sharedBucketName");
+
+        return ProjectDTO.builder()
+                .name(PROJECT)
+                .endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, edgeInfoGcp)))
+                .build();
+    }
+
+    private List<UserInstanceDTO> getUserInstanceDTOs() {
+        return Collections.singletonList(
+                new UserInstanceDTO().withUser(USER).withProject(PROJECT).withExploratoryName(EXPLORATORY_NAME).withEndpoint(ENDPOINT_NAME)
+                        .withResources(Collections.singletonList(getCompute()))
+        );
+    }
+
+    private UserComputationalResource getCompute() {
+        UserComputationalResource resource = new UserComputationalResource();
+        resource.setComputationalName(COMPUTE_NAME);
+        resource.setImageName(DataEngineType.SPARK_STANDALONE.getName());
+
+        return resource;
+    }
+
+    private BillingReport getReport() {
+        BillingReportLine line1 = BillingReportLine.builder().cost(1.0).user(USER).resourceType(BillingResourceType.EXPLORATORY).project(PROJECT).endpoint(ENDPOINT_NAME)
+                .resourceName(EXPLORATORY_NAME).currency(CURRENCY).build();
+        BillingReportLine line2 = BillingReportLine.builder().cost(1.0).user(USER).resourceType(BillingResourceType.COMPUTATIONAL).project(PROJECT).endpoint(ENDPOINT_NAME)
+                .resourceName(COMPUTE_NAME).exploratoryName(EXPLORATORY_NAME).currency(CURRENCY).build();
+        List<BillingReportLine> billingReportLines = Arrays.asList(line1, line2);
+
+        return BillingReport.builder()
+                .name(EXPLORATORY_NAME)
+                .reportLines(billingReportLines)
+                .totalCost(2.0)
+                .currency(CURRENCY)
+                .build();
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
new file mode 100644
index 0000000..888b0bb
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
@@ -0,0 +1,211 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
+import com.epam.datalab.backendapi.dao.GpuDAO;
+import com.epam.datalab.backendapi.dao.ProjectDAO;
+import com.epam.datalab.backendapi.dao.SettingsDAO;
+import com.epam.datalab.backendapi.dao.UserGroupDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.InfrastructureTemplateService;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.base.computational.FullComputationalTemplate;
+import com.epam.datalab.dto.imagemetadata.ComputationalMetadataDTO;
+import com.epam.datalab.dto.imagemetadata.ComputationalResourceShapeDto;
+import com.epam.datalab.dto.imagemetadata.ExploratoryMetadataDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+@RunWith(MockitoJUnitRunner.class)
+public class InfrastructureTemplateServiceBaseTest {
+
+    @Mock
+    private SettingsDAO settingsDAO;
+    @Mock
+    private RESTService provisioningService;
+    @Mock
+    private ProjectDAO projectDAO;
+    @Mock
+    private EndpointService endpointService;
+    @Mock
+    private UserGroupDAO userGroupDao;
+    @Mock
+    private SelfServiceApplicationConfiguration configuration;
+    @Mock
+    private GpuDAO gpuDAO;
+
+    @InjectMocks
+    private InfrastructureTemplateServiceImpl infrastructureTemplateServiceBaseChild;
+
+
+    @Test
+    public void getExploratoryTemplates() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        ExploratoryMetadataDTO emDto1 = new ExploratoryMetadataDTO("someImage1");
+        HashMap<String, List<ComputationalResourceShapeDto>> shapes1 = new HashMap<>();
+        shapes1.put("Memory optimized", Arrays.asList(
+                new ComputationalResourceShapeDto("Standard_E4s_v3", "someSize", "someDescription",
+                        "someRam", 2),
+                new ComputationalResourceShapeDto("Standard_E32s_v3", "someSize2", "someDescription2",
+                        "someRam2", 5)));
+        emDto1.setExploratoryEnvironmentShapes(shapes1);
+
+        ExploratoryMetadataDTO emDto2 = new ExploratoryMetadataDTO("someImage2");
+        HashMap<String, List<ComputationalResourceShapeDto>> shapes2 = new HashMap<>();
+        shapes2.put("Compute optimized", Arrays.asList(
+                new ComputationalResourceShapeDto("Standard_F2s", "someSize", "someDescription",
+                        "someRam", 3),
+                new ComputationalResourceShapeDto("Standard_F16s", "someSize2", "someDescription2",
+                        "someRam2", 6)));
+        emDto2.setExploratoryEnvironmentShapes(shapes2);
+        List<ExploratoryMetadataDTO> expectedEmdDtoList = Arrays.asList(emDto1, emDto2);
+        when(userGroupDao.getUserGroups(anyString())).thenReturn(Collections.emptySet());
+        when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenReturn(expectedEmdDtoList.toArray());
+        when(settingsDAO.getConfOsFamily()).thenReturn("someConfOsFamily");
+
+        UserInfo userInfo = new UserInfo("test", "token");
+        List<ExploratoryMetadataDTO> actualEmdDtoList =
+                infrastructureTemplateServiceBaseChild.getExploratoryTemplates(userInfo, "project", "endpoint");
+        assertNotNull(actualEmdDtoList);
+        assertEquals(expectedEmdDtoList, actualEmdDtoList);
+
+        verify(provisioningService).get(endpointDTO().getUrl() + "docker/exploratory", "token", ExploratoryMetadataDTO[].class);
+        verify(settingsDAO, times(2)).getConfOsFamily();
+        verify(userGroupDao).getUserGroups("test");
+        verifyNoMoreInteractions(provisioningService, settingsDAO, userGroupDao);
+    }
+
+    @Test
+    public void getExploratoryTemplatesWithException() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        doThrow(new DatalabException("Could not load list of exploratory templates for user"))
+                .when(provisioningService).get(anyString(), anyString(), any(Class.class));
+
+        UserInfo userInfo = new UserInfo("test", "token");
+        try {
+            infrastructureTemplateServiceBaseChild.getExploratoryTemplates(userInfo, "project", "endpoint");
+        } catch (DatalabException e) {
+            assertEquals("Could not load list of exploratory templates for user", e.getMessage());
+        }
+        verify(provisioningService).get(endpointDTO().getUrl() + "docker/exploratory", "token", ExploratoryMetadataDTO[].class);
+        verifyNoMoreInteractions(provisioningService);
+    }
+
+    @Test
+    public void getComputationalTemplates() throws NoSuchFieldException, IllegalAccessException {
+
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        final ComputationalMetadataDTO computationalMetadataDTO = new ComputationalMetadataDTO("dataengine-service");
+        computationalMetadataDTO.setComputationResourceShapes(Collections.emptyMap());
+        List<ComputationalMetadataDTO> expectedCmdDtoList = Collections.singletonList(
+                computationalMetadataDTO
+        );
+        when(projectDAO.get(anyString())).thenReturn(Optional.of(new ProjectDTO("project", Collections.emptySet(),
+                null, null, null, null, true)));
+        when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenReturn(expectedCmdDtoList.toArray(new ComputationalMetadataDTO[]{}));
+
+        List<FullComputationalTemplate> expectedFullCmdDtoList = expectedCmdDtoList.stream()
+                .map(e -> infrastructureTemplateServiceBaseChild.getCloudFullComputationalTemplate(e,CloudProvider.AWS))
+                .collect(Collectors.toList());
+
+        UserInfo userInfo = new UserInfo("test", "token");
+        List<FullComputationalTemplate> actualFullCmdDtoList =
+                infrastructureTemplateServiceBaseChild.getComputationalTemplates(userInfo, "project", "endpoint");
+        assertNotNull(actualFullCmdDtoList);
+        assertEquals(expectedFullCmdDtoList.size(), actualFullCmdDtoList.size());
+
+        verify(provisioningService).get(endpointDTO().getUrl() + "docker/computational", "token", ComputationalMetadataDTO[].class);
+        verifyNoMoreInteractions(provisioningService);
+    }
+
+    @Test
+    public void getComputationalTemplatesWhenMethodThrowsException() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        doThrow(new DatalabException("Could not load list of computational templates for user"))
+                .when(provisioningService).get(anyString(), anyString(), any(Class.class));
+
+        UserInfo userInfo = new UserInfo("test", "token");
+        try {
+            infrastructureTemplateServiceBaseChild.getComputationalTemplates(userInfo, "project", "endpoint");
+        } catch (DatalabException e) {
+            assertEquals("Could not load list of computational templates for user", e.getMessage());
+        }
+        verify(provisioningService).get(endpointDTO().getUrl() + "docker/computational", "token",
+                ComputationalMetadataDTO[].class);
+        verifyNoMoreInteractions(provisioningService);
+    }
+
+    @Test
+    public void getComputationalTemplatesWithInapproprietaryImageName() {
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        final ComputationalMetadataDTO computationalMetadataDTO = new ComputationalMetadataDTO("dataengine-service");
+        computationalMetadataDTO.setComputationResourceShapes(Collections.emptyMap());
+        List<ComputationalMetadataDTO> expectedCmdDtoList = Collections.singletonList(computationalMetadataDTO);
+        when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenReturn(expectedCmdDtoList.toArray(new ComputationalMetadataDTO[]{}));
+        when(projectDAO.get(anyString())).thenReturn(Optional.of(new ProjectDTO("project", Collections.emptySet(),
+                null, null, null, null, true)));
+        when(configuration.getMinEmrInstanceCount()).thenReturn(1);
+        when(configuration.getMaxEmrInstanceCount()).thenReturn(2);
+        when(configuration.getMaxEmrSpotInstanceBidPct()).thenReturn(3);
+        when(configuration.getMinEmrSpotInstanceBidPct()).thenReturn(4);
+
+        UserInfo userInfo = new UserInfo("test", "token");
+        try {
+            infrastructureTemplateServiceBaseChild.getComputationalTemplates(userInfo, "project", "endpoint");
+        } catch (IllegalArgumentException e) {
+            assertEquals("Unknown data engine null", e.getMessage());
+        }
+        verify(provisioningService).get(endpointDTO().getUrl() + "docker/computational", "token", ComputationalMetadataDTO[].class);
+        verifyNoMoreInteractions(provisioningService);
+    }
+
+    private EndpointDTO endpointDTO() {
+        return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
+    }
+
+    private class InfrastructureTemplateServiceBaseChild extends InfrastructureTemplateServiceImpl {
+
+        private InfrastructureTemplateServiceBaseChild() {
+            super(configuration, settingsDAO, projectDAO, endpointService, userGroupDao, gpuDAO, provisioningService);
+        }
+
+        protected FullComputationalTemplate getCloudFullComputationalTemplate(ComputationalMetadataDTO metadataDTO) {
+            return new FullComputationalTemplate(metadataDTO);
+        }
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/LibraryServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/LibraryServiceImplTest.java
new file mode 100644
index 0000000..af5dc5a
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/LibraryServiceImplTest.java
@@ -0,0 +1,489 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryLibDAO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.NotebookTemplate;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.resources.dto.LibInfoRecord;
+import com.epam.datalab.backendapi.resources.dto.LibInstallFormDTO;
+import com.epam.datalab.backendapi.resources.dto.LibKey;
+import com.epam.datalab.backendapi.resources.dto.LibraryStatus;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.dto.exploratory.LibInstallDTO;
+import com.epam.datalab.dto.exploratory.LibStatus;
+import com.epam.datalab.dto.exploratory.LibraryInstallDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.model.library.Library;
+import com.epam.datalab.rest.client.RESTService;
+import org.bson.Document;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyListOf;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class LibraryServiceImplTest {
+
+    private static final String LIB_NAME = "name";
+    private static final String LIB_GROUP = "group";
+    private static final String LIB_VERSION = "version";
+    private static final String UUID = "id";
+    private final String USER = "test";
+    private final String EXPLORATORY_NAME = "explName";
+    private final String PROJECT = "projectName";
+    private final String COMPUTATIONAL_NAME = "compName";
+
+    private static final String GROUP_JAVA = "java";
+    private static final String GROUP_PIP3 = "pip3";
+    private static final String GROUP_R_PKG = "r_pkg";
+    private static final String GROUP_OS_PKG = "os_pkg";
+    private static final String GROUP_OTHERS = "others";
+
+    private LibInstallDTO liDto;
+    private List<LibInstallDTO> libs;
+    private LibInstallFormDTO libInstallFormDTO;
+    private LibraryInstallDTO libraryInstallDto;
+
+    @Mock
+    private ExploratoryDAO exploratoryDAO;
+    @Mock
+    private ExploratoryLibDAO libraryDAO;
+    @Mock
+    private RequestBuilder requestBuilder;
+    @Mock
+    private RequestId requestId;
+    @Mock
+    private RESTService provisioningService;
+    @Mock
+    private EndpointService endpointService;
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @InjectMocks
+    private LibraryServiceImpl libraryService;
+
+    @Before
+    public void setUp() {
+        prepareForTesting();
+    }
+
+    @Test
+    public void testGetLibs() {
+        Document document = new Document();
+        when(libraryDAO.findExploratoryLibraries(anyString(), anyString(), anyString())).thenReturn(document);
+
+        List<Document> expectedList = new ArrayList<>();
+        List<Document> actualList = libraryService.getLibs(USER, PROJECT, EXPLORATORY_NAME, "");
+        assertNotNull(actualList);
+        assertEquals(expectedList, actualList);
+
+        verify(libraryDAO).findExploratoryLibraries(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(libraryDAO);
+    }
+
+    @Test
+    public void getLibInfo() {
+        Document document = new Document();
+        when(libraryDAO.findAllLibraries(anyString(), anyString(), anyString())).thenReturn(document);
+
+        List<LibInfoRecord> expectedList = new ArrayList<>();
+        List<LibInfoRecord> actualList = libraryService.getLibInfo(USER, PROJECT, EXPLORATORY_NAME);
+        assertNotNull(actualList);
+        assertEquals(expectedList, actualList);
+
+        verify(libraryDAO).findAllLibraries(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(libraryDAO);
+    }
+
+    @Test
+    public void getLibInfoWhenListsOfExploratoryAndComputationalLibsAreNotEmpty() {
+        when(libraryDAO.findAllLibraries(anyString(), anyString(), anyString()))
+                .thenReturn(getDocumentWithExploratoryAndComputationalLibs());
+
+        List<LibInfoRecord> expectedList = getLibInfoRecordList();
+        List<LibInfoRecord> actualList = libraryService.getLibInfo(USER, PROJECT, EXPLORATORY_NAME);
+        assertNotNull(actualList);
+        assertEquals(expectedList, actualList);
+
+        verify(libraryDAO).findAllLibraries(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(libraryDAO);
+    }
+
+    @Test
+    public void installComputationalLibsWithoutOverride() {
+        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
+        final List<LibInstallDTO> libsToInstall = getLibs("installing");
+        libraryInstallDTO.setLibs(libsToInstall);
+        final UserInfo user = getUser();
+
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
+        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
+        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class),
+                any(UserComputationalResource.class), anyListOf(LibInstallDTO.class), any(EndpointDTO.class))).thenReturn(libraryInstallDTO);
+
+
+        final String uuid = libraryService.installComputationalLibs(user, PROJECT, EXPLORATORY_NAME,
+                COMPUTATIONAL_NAME, getLibs(null), null);
+
+        assertEquals(UUID, uuid);
+
+        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME, LIB_GROUP, LIB_NAME);
+        verify(requestBuilder).newLibInstall(refEq(user), refEq(getUserInstanceDto()),
+                refEq(getUserComputationalResourceWithName(COMPUTATIONAL_NAME)), eq(libsToInstall), refEq(endpointDTO()));
+        verify(provisioningService).post(eq(endpointDTO().getUrl() + "library/computational/lib_install"), eq(user.getAccessToken()),
+                refEq(libraryInstallDTO), eq(String.class));
+        verify(libraryDAO).addLibrary(eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME),
+                eq(COMPUTATIONAL_NAME), refEq(libsToInstall.get(0)), eq(false));
+        verify(requestId).put(user.getName(), UUID);
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
+    }
+
+    @Test
+    public void installComputationalLibsWhenComputationalNotFound() {
+        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
+        final List<LibInstallDTO> libsToInstall = getLibs("installing");
+        libraryInstallDTO.setLibs(libsToInstall);
+        libraryInstallDTO.setProject(PROJECT);
+        final UserInfo user = getUser();
+
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
+        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
+        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class),
+                any(UserComputationalResource.class), anyListOf(LibInstallDTO.class), any(EndpointDTO.class)))
+                .thenReturn(libraryInstallDTO);
+
+
+        expectedException.expect(DatalabException.class);
+        expectedException.expectMessage("Computational with name " + COMPUTATIONAL_NAME + "X was not found");
+
+        libraryService.installComputationalLibs(user, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME + "X", getLibs(null), null);
+    }
+
+    @Test
+    public void installComputationalLibsWithOverride() {
+        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
+        final List<LibInstallDTO> libsToInstall = getLibs("installing");
+        libraryInstallDTO.setProject(PROJECT);
+        libraryInstallDTO.setLibs(libsToInstall);
+        final UserInfo user = getUser();
+
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
+        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
+        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class),
+                any(UserComputationalResource.class), anyListOf(LibInstallDTO.class), any(EndpointDTO.class)))
+                .thenReturn(libraryInstallDTO);
+        when(libraryDAO.getLibrary(anyString(), anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(getLibrary(LibStatus.INSTALLED));
+
+        final String uuid = libraryService.installComputationalLibs(user, PROJECT, EXPLORATORY_NAME,
+                COMPUTATIONAL_NAME, getLibs(null), null);
+
+        assertEquals(UUID, uuid);
+
+        libsToInstall.get(0).setOverride(true);
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME, LIB_GROUP, LIB_NAME);
+        verify(libraryDAO).addLibrary(eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME),
+                eq(COMPUTATIONAL_NAME), refEq(libsToInstall.get(0)), eq(true));
+        verify(requestBuilder).newLibInstall(refEq(user), refEq(getUserInstanceDto()),
+                refEq(getUserComputationalResourceWithName(COMPUTATIONAL_NAME)), eq(libsToInstall), refEq(endpointDTO()));
+        verify(provisioningService).post(eq(endpointDTO().getUrl() + "library/computational/lib_install"),
+                eq(user.getAccessToken()),
+                refEq(libraryInstallDTO), eq(String.class));
+        verify(requestId).put(user.getName(), UUID);
+        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
+
+    }
+
+
+    @Test
+    public void installComputationalLibsWhenLibraryIsAlreadyInstalling() {
+        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
+        final List<LibInstallDTO> libsToInstall = getLibs("installing");
+        libraryInstallDTO.setLibs(libsToInstall);
+        final UserInfo user = getUser();
+
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
+        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
+        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class),
+                any(UserComputationalResource.class), anyListOf(LibInstallDTO.class), any(EndpointDTO.class)))
+                .thenReturn(libraryInstallDTO);
+        when(libraryDAO.getLibrary(anyString(), anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(getLibrary(LibStatus.INSTALLING));
+
+        try {
+            libraryService.installComputationalLibs(user, PROJECT, EXPLORATORY_NAME,
+                    COMPUTATIONAL_NAME, getLibs(null), null);
+        } catch (DatalabException e) {
+            assertEquals("Library name is already installing", e.getMessage());
+        }
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME, LIB_GROUP, LIB_NAME);
+        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
+    }
+
+    @Test
+    public void installExploratoryLibsWithoutOverride() {
+        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
+        final List<LibInstallDTO> libsToInstall = getLibs("installing");
+        libraryInstallDTO.setLibs(libsToInstall);
+        final UserInfo user = getUser();
+
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
+        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
+        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class),
+                anyListOf(LibInstallDTO.class))).thenReturn(libraryInstallDTO);
+
+
+        final String uuid = libraryService.installExploratoryLibs(user, PROJECT, EXPLORATORY_NAME, getLibs(null), null);
+
+        assertEquals(UUID, uuid);
+
+        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, LIB_GROUP, LIB_NAME);
+        verify(requestBuilder).newLibInstall(refEq(user), refEq(getUserInstanceDto()), eq(endpointDTO()), eq(libsToInstall));
+        verify(provisioningService).post(eq(endpointDTO().getUrl() + "library/exploratory/lib_install"), eq(user.getAccessToken()),
+                refEq(libraryInstallDTO), eq(String.class));
+        verify(libraryDAO).addLibrary(eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME), refEq(libsToInstall.get(0)), eq(false));
+        verify(requestId).put(user.getName(), UUID);
+        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
+    }
+
+    @Test
+    public void installExploratoryLibsWithOverride() {
+        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
+        final List<LibInstallDTO> libsToInstall = getLibs("installing");
+        libraryInstallDTO.setLibs(libsToInstall);
+        final UserInfo user = getUser();
+
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
+        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
+        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class),
+                anyListOf(LibInstallDTO.class))).thenReturn(libraryInstallDTO);
+        when(libraryDAO.getLibrary(anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(getLibrary(LibStatus.INSTALLED));
+
+        final String uuid = libraryService.installExploratoryLibs(user, PROJECT, EXPLORATORY_NAME, getLibs(null), null);
+
+        assertEquals(UUID, uuid);
+
+        libsToInstall.get(0).setOverride(true);
+        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, LIB_GROUP, LIB_NAME);
+        verify(libraryDAO).addLibrary(eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME), refEq(libsToInstall.get(0)), eq(true));
+        verify(requestBuilder).newLibInstall(refEq(user), refEq(getUserInstanceDto()), eq(endpointDTO()), eq(libsToInstall));
+        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(provisioningService).post(eq(endpointDTO().getUrl() + "library/exploratory/lib_install"), eq(user.getAccessToken()),
+                refEq(libraryInstallDTO), eq(String.class));
+        verify(requestId).put(USER, uuid);
+        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
+    }
+
+    @Test
+    public void installExploratoryLibsWhenLibIsAlreadyInstalling() {
+        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
+        final List<LibInstallDTO> libsToInstall = getLibs("installing");
+        libraryInstallDTO.setLibs(libsToInstall);
+        final UserInfo user = getUser();
+
+        when(endpointService.get(anyString())).thenReturn(endpointDTO());
+        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
+        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
+        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class),
+                anyListOf(LibInstallDTO.class))).thenReturn(libraryInstallDTO);
+        when(libraryDAO.getLibrary(anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(getLibrary(LibStatus.INSTALLING));
+
+        try {
+            libraryService.installExploratoryLibs(user, PROJECT, EXPLORATORY_NAME, getLibs(null), null);
+        } catch (DatalabException e) {
+            assertEquals("Library name is already installing", e.getMessage());
+        }
+
+        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, LIB_GROUP, LIB_NAME);
+        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
+
+    }
+
+    @Test
+    public void getComputeLibGroups() {
+        List<Object> computeGroups = Arrays.asList(GROUP_PIP3, GROUP_OTHERS, GROUP_R_PKG, GROUP_OS_PKG, GROUP_JAVA);
+
+        List<String> computeGroupsResult = libraryService.getComputeLibGroups();
+
+        assertEquals("lists are not equal", computeGroups, computeGroupsResult);
+    }
+
+    @Test
+    public void getExploratoryJupyterLibGroups() {
+        List<Object> exploratoryGroups = Arrays.asList(GROUP_PIP3, GROUP_OTHERS, GROUP_OS_PKG, GROUP_R_PKG, GROUP_JAVA);
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getJupyterUserInstanceDtoForLibGroups());
+
+        List<String> exploratoryGroupsResult = libraryService.getExploratoryLibGroups(getUser(), PROJECT, EXPLORATORY_NAME);
+
+        assertEquals("lists are not equal", exploratoryGroups, exploratoryGroupsResult);
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+    }
+
+    @Test
+    public void getExploratoryRstudioLibGroups() {
+        List<Object> exploratoryGroups = Arrays.asList(GROUP_PIP3, GROUP_OTHERS, GROUP_OS_PKG, GROUP_R_PKG);
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getRstudioUserInstanceDtoForLibGroups());
+
+        List<String> exploratoryGroupsResult = libraryService.getExploratoryLibGroups(getUser(), PROJECT, EXPLORATORY_NAME);
+
+        assertEquals("lists are not equal", exploratoryGroups, exploratoryGroupsResult);
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+    }
+
+    private Library getLibrary(LibStatus status) {
+        return new Library(LIB_GROUP, LIB_NAME, "1", status, "");
+    }
+
+    private List<LibInstallDTO> getLibs(String status) {
+        final LibInstallDTO libInstallDTO = new LibInstallDTO(LIB_GROUP, LIB_NAME, LIB_VERSION);
+        libInstallDTO.setStatus(status);
+        return Collections.singletonList(libInstallDTO);
+    }
+
+    private UserInfo getUser() {
+        return new UserInfo(USER, "token123");
+    }
+
+    private void prepareForTesting() {
+        liDto = new LibInstallDTO("someGroup", "someName", "someVersion");
+        libs = Collections.singletonList(liDto);
+        libInstallFormDTO = new LibInstallFormDTO();
+        libInstallFormDTO.setNotebookName(EXPLORATORY_NAME);
+        libInstallFormDTO.setComputationalName(COMPUTATIONAL_NAME);
+        libInstallFormDTO.setLibs(libs);
+        libraryInstallDto = new LibraryInstallDTO().withExploratoryName(EXPLORATORY_NAME)
+                .withComputationalName(COMPUTATIONAL_NAME).withApplicationName("");
+        libraryInstallDto.setLibs(new ArrayList<>());
+    }
+
+    private UserComputationalResource getUserComputationalResourceWithName(String name) {
+        UserComputationalResource resource = new UserComputationalResource();
+        resource.setComputationalName(name);
+        resource.setComputationalId("someId");
+        resource.setImageName("someImageName");
+        return resource;
+    }
+
+    private UserInstanceDTO getUserInstanceDto() {
+        final UserInstanceDTO userInstanceDTO = new UserInstanceDTO().withUser(USER).withExploratoryName(EXPLORATORY_NAME);
+        userInstanceDTO.getResources().add(getUserComputationalResourceWithName(COMPUTATIONAL_NAME));
+        return userInstanceDTO;
+    }
+
+    private UserInstanceDTO getJupyterUserInstanceDtoForLibGroups() {
+        return new UserInstanceDTO()
+                .withUser(USER)
+                .withExploratoryName(EXPLORATORY_NAME)
+                .withTemplateName(NotebookTemplate.JUPYTER.getName());
+    }
+
+    private UserInstanceDTO getRstudioUserInstanceDtoForLibGroups() {
+        return new UserInstanceDTO()
+                .withUser(USER)
+                .withExploratoryName(EXPLORATORY_NAME)
+                .withTemplateName(NotebookTemplate.RSTUDIO.getName());
+    }
+
+    private List<Document> getExpLibsList() {
+        Document explLibsDoc = new Document();
+        explLibsDoc.append(ExploratoryLibDAO.LIB_NAME, "expLibName");
+        explLibsDoc.append(ExploratoryLibDAO.LIB_VERSION, "expLibVersion");
+        explLibsDoc.append(ExploratoryLibDAO.LIB_GROUP, "expLibGroup");
+        explLibsDoc.append(ExploratoryLibDAO.STATUS, "expLibStatus");
+        explLibsDoc.append(ExploratoryLibDAO.ERROR_MESSAGE, "expLibErrorMessage");
+        return Collections.singletonList(explLibsDoc);
+    }
+
+    private Document getCompLibs() {
+        Document compLibs = new Document();
+        compLibs.append(ExploratoryLibDAO.LIB_NAME, "compLibName");
+        compLibs.append(ExploratoryLibDAO.LIB_VERSION, "compLibVersion");
+        compLibs.append(ExploratoryLibDAO.LIB_GROUP, "compLibGroup");
+        compLibs.append(ExploratoryLibDAO.STATUS, "compLibStatus");
+        compLibs.append(ExploratoryLibDAO.ERROR_MESSAGE, "compLibErrorMessage");
+
+        Document compResourcesAndLibs = new Document();
+        compResourcesAndLibs.append("compName", Collections.singletonList(compLibs));
+        return compResourcesAndLibs;
+    }
+
+    private Document getDocumentWithExploratoryAndComputationalLibs() {
+        return new Document().append(ExploratoryLibDAO.EXPLORATORY_LIBS, getExpLibsList())
+                .append(ExploratoryLibDAO.COMPUTATIONAL_LIBS, getCompLibs());
+    }
+
+    private List<LibInfoRecord> getLibInfoRecordList() {
+        LibKey explLibKey = new LibKey("expLibName", "expLibVersion", "expLibGroup");
+        List<LibraryStatus> explLibStatuses = Collections.singletonList(
+                new LibraryStatus(EXPLORATORY_NAME, "notebook", "expLibStatus", "expLibErrorMessage", null, null));
+
+        LibKey compLibKey = new LibKey("compLibName", "compLibVersion", "compLibGroup");
+        List<LibraryStatus> compLibStatuses = Collections.singletonList(
+                new LibraryStatus("compName", "cluster", "compLibStatus", "compLibErrorMessage", null, null));
+
+        return Arrays.asList(
+                new LibInfoRecord(compLibKey, compLibStatuses),
+                new LibInfoRecord(explLibKey, explLibStatuses)
+        );
+    }
+
+    private EndpointDTO endpointDTO() {
+        return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
+    }
+
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/MavenCentralLibraryServiceTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/MavenCentralLibraryServiceTest.java
new file mode 100644
index 0000000..0141dcc
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/MavenCentralLibraryServiceTest.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.domain.MavenSearchArtifactResponse;
+import com.epam.datalab.backendapi.resources.dto.LibraryDTO;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.rest.client.RESTService;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.net.URI;
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.refEq;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class MavenCentralLibraryServiceTest {
+
+    @Mock
+    private RESTService client;
+    @InjectMocks
+    private MavenCentralLibraryService mavenCentralLibraryService;
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Test
+    public void getLibraryId() {
+        when(client.get(any(URI.class), any())).thenReturn(getMavenResponse());
+
+        final LibraryDTO libDTO = mavenCentralLibraryService.getLibrary("groupId", "artifactId", "version");
+
+        assertNotNull(libDTO);
+        assertEquals("groupId:artifactId", libDTO.getName());
+        assertEquals("version", libDTO.getVersion());
+
+        verify(client).get(refEq(URI.create("/solrsearch/select?q=a:%22artifactId%22+AND+g" +
+                        ":%22groupId%22+AND+v:%22version%22+AND+(p:%22jar%22%20OR%20p:%22bundle%22)" +
+                        "&rows=20&wt=json&core=gav&p=jar")),
+                eq(MavenSearchArtifactResponse.class));
+    }
+
+    @Test
+    public void getLibraryIdWithException() {
+        when(client.get(any(URI.class), any())).thenThrow(new DatalabException("Can not get artifact info from maven " +
+                "central due to: Exception"));
+
+        expectedException.expect(DatalabException.class);
+        expectedException.expectMessage("Can not get artifact info from maven central due to: Exception");
+
+        mavenCentralLibraryService.getLibrary("groupId", "artifactId", "version");
+    }
+
+    private MavenSearchArtifactResponse getMavenResponse() {
+        final MavenSearchArtifactResponse response = new MavenSearchArtifactResponse();
+        MavenSearchArtifactResponse.Response.Artifact artifact = new MavenSearchArtifactResponse.Response.Artifact();
+        artifact.setId("test.group:artifact:1.0");
+        artifact.setVersion("1.0");
+        final MavenSearchArtifactResponse.Response rsp = new MavenSearchArtifactResponse.Response();
+        rsp.setArtifacts(Collections.singletonList(artifact));
+        response.setResponse(rsp);
+        return response;
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImplTest.java
new file mode 100644
index 0000000..c5dff3b
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/OdahuServiceImplTest.java
@@ -0,0 +1,250 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.OdahuDAO;
+import com.epam.datalab.backendapi.domain.BudgetDTO;
+import com.epam.datalab.backendapi.domain.EndpointDTO;
+import com.epam.datalab.backendapi.domain.OdahuCreateDTO;
+import com.epam.datalab.backendapi.domain.OdahuDTO;
+import com.epam.datalab.backendapi.domain.OdahuFieldsDTO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.EndpointService;
+import com.epam.datalab.backendapi.service.ProjectService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.cloud.CloudProvider;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.base.edge.EdgeInfo;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceConflictException;
+import com.epam.datalab.rest.client.RESTService;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class OdahuServiceImplTest {
+
+	private static final String USER = "testUser";
+	private static final String TOKEN = "testToken";
+	private static final String PROJECT = "testProject";
+	private static final String ENDPOINT_URL = "https://localhsot:8080/";
+	private static final String ENDPOINT_NAME = "testEndpoint";
+	private static final String tag = "testTag";
+	private static final String uuid = "34dsr324";
+	private static final String ODAHU_NAME = "odahuTest";
+	private static UserInfo userInfo;
+
+	@Mock
+	private OdahuDAO odahuDAO;
+	@Mock
+	private ProjectService projectService;
+	@Mock
+	private EndpointService endpointService;
+	@Mock
+	private RequestId requestId;
+	@Mock
+	private RESTService provisioningService;
+	@Mock
+	private RequestBuilder requestBuilder;
+	@InjectMocks
+	private OdahuServiceImpl odahuService;
+
+	@BeforeClass
+	public static void setUp() {
+		userInfo = new UserInfo(USER, TOKEN);
+	}
+
+	@Test
+	public void findOdahuTest() {
+		List<OdahuDTO> odahuDTOList = odahuService.findOdahu();
+		assertNotNull(odahuDTOList);
+
+		verify(odahuDAO).findOdahuClusters();
+	}
+
+	@Test
+	public void createTest() {
+		EndpointDTO endpointDTO = getEndpointDTO();
+		ProjectDTO projectDTO = getProjectDTO(UserInstanceStatus.RUNNING);
+		OdahuCreateDTO odahuCreateDTO = getOdahuCreateDTO();
+
+		when(projectService.get(anyString())).thenReturn(projectDTO);
+		when(odahuDAO.create(new OdahuDTO(odahuCreateDTO.getName(), odahuCreateDTO.getProject(),
+				odahuCreateDTO.getEndpoint(), UserInstanceStatus.CREATING, getTags()))).thenReturn(true);
+		when(endpointService.get(odahuCreateDTO.getEndpoint())).thenReturn(endpointDTO);
+		when(requestId.put(userInfo.getName(), uuid)).thenReturn(uuid);
+
+		odahuService.create(PROJECT, odahuCreateDTO, userInfo);
+
+		verify(odahuDAO).findOdahuClusters(odahuCreateDTO.getProject(), odahuCreateDTO.getEndpoint());
+		verify(odahuDAO).create(new OdahuDTO(odahuCreateDTO.getName(), odahuCreateDTO.getProject(),
+				odahuCreateDTO.getEndpoint(), UserInstanceStatus.CREATING, getTags()));
+		verify(endpointService).get(odahuCreateDTO.getEndpoint());
+		verify(projectService).get(PROJECT);
+		verify(provisioningService).post(ENDPOINT_URL + "infrastructure/odahu", userInfo.getAccessToken(),
+				requestBuilder.newOdahuCreate(userInfo.getName(), odahuCreateDTO, projectDTO, endpointDTO), String.class);
+		verifyNoMoreInteractions(odahuDAO, provisioningService, endpointService, projectService);
+	}
+
+	@Test(expected = ResourceConflictException.class)
+	public void createIfClusterActive() {
+		OdahuCreateDTO odahuCreateDTO = getOdahuCreateDTO();
+		OdahuDTO failedOdahu = getOdahuDTO(UserInstanceStatus.RUNNING);
+		List<OdahuDTO> runningOdahuList = singletonList(failedOdahu);
+		when(odahuDAO.findOdahuClusters(anyString(), anyString())).thenReturn(runningOdahuList);
+
+		odahuService.create(PROJECT, odahuCreateDTO, userInfo);
+		verify(odahuDAO).findOdahuClusters(odahuCreateDTO.getProject(), odahuCreateDTO.getEndpoint());
+		verifyNoMoreInteractions(odahuDAO);
+	}
+
+	@Test(expected = DatalabException.class)
+	public void createIfDBissue() {
+		EndpointDTO endpointDTO = getEndpointDTO();
+		ProjectDTO projectDTO = getProjectDTO(UserInstanceStatus.RUNNING);
+		OdahuCreateDTO odahuCreateDTO = getOdahuCreateDTO();
+
+		when(projectService.get(anyString())).thenReturn(projectDTO);
+		when(odahuDAO.create(new OdahuDTO(odahuCreateDTO.getName(), odahuCreateDTO.getProject(),
+				odahuCreateDTO.getEndpoint(), UserInstanceStatus.CREATING, getTags()))).thenReturn(false);
+		when(endpointService.get(anyString())).thenReturn(endpointDTO);
+		when(requestId.put(userInfo.getName(), uuid)).thenReturn(uuid);
+
+		odahuService.create(PROJECT, odahuCreateDTO, userInfo);
+
+		verify(odahuDAO).findOdahuClusters(odahuCreateDTO.getProject(), odahuCreateDTO.getEndpoint());
+		verify(odahuDAO).create(new OdahuDTO(odahuCreateDTO.getName(), odahuCreateDTO.getProject(),
+				odahuCreateDTO.getEndpoint(), UserInstanceStatus.CREATING, getTags()));
+		verify(endpointService).get(odahuCreateDTO.getEndpoint());
+		verify(projectService).get(PROJECT);
+		verify(provisioningService).post(ENDPOINT_URL + "infrastructure/odahu", userInfo.getAccessToken(),
+				requestBuilder.newOdahuCreate(userInfo.getName(), odahuCreateDTO, projectDTO, endpointDTO), String.class);
+		verifyNoMoreInteractions(odahuDAO, provisioningService, endpointService, projectService);
+	}
+
+	@Test
+	public void startTest() {
+		when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+
+		odahuService.start(ODAHU_NAME, PROJECT, ENDPOINT_URL, userInfo);
+
+		verify(endpointService).get(ENDPOINT_URL);
+		verify(odahuDAO).updateStatus(ODAHU_NAME, PROJECT, ENDPOINT_URL, UserInstanceStatus.STARTING);
+		verify(odahuDAO).getFields(ODAHU_NAME, PROJECT, ENDPOINT_URL);
+		verify(provisioningService).post(ENDPOINT_URL + "infrastructure/odahu/start", userInfo.getAccessToken(),
+				requestBuilder.newOdahuAction(userInfo.getName(), ODAHU_NAME, getProjectDTO(UserInstanceStatus.STARTING), getEndpointDTO(), new OdahuFieldsDTO()), String.class);
+		verifyNoMoreInteractions(endpointService, odahuDAO);
+	}
+
+	@Test
+	public void stopTest() {
+		when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+
+		odahuService.stop(ODAHU_NAME, PROJECT, ENDPOINT_URL, userInfo);
+
+		verify(endpointService).get(ENDPOINT_URL);
+		verify(odahuDAO).updateStatus(ODAHU_NAME, PROJECT, ENDPOINT_URL, UserInstanceStatus.STOPPING);
+		verify(odahuDAO).getFields(ODAHU_NAME, PROJECT, ENDPOINT_URL);
+		verify(provisioningService).post(ENDPOINT_URL + "infrastructure/odahu/stop", userInfo.getAccessToken(),
+				requestBuilder.newOdahuAction(userInfo.getName(), ODAHU_NAME, getProjectDTO(UserInstanceStatus.STOPPING), getEndpointDTO(), new OdahuFieldsDTO()), String.class);
+		verifyNoMoreInteractions(endpointService, odahuDAO, provisioningService);
+	}
+
+	@Test
+	public void terminateTest() {
+		List<OdahuDTO> odahuDTOS = Arrays.asList(
+				getOdahuDTO(UserInstanceStatus.RUNNING),
+				getOdahuDTO(UserInstanceStatus.FAILED));
+		when(odahuDAO.findOdahuClusters(anyString(), anyString())).thenReturn(odahuDTOS);
+		when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
+		when(odahuDAO.getFields(anyString(), anyString(), anyString())).thenReturn(new OdahuFieldsDTO());
+
+		odahuService.terminate(ODAHU_NAME, PROJECT, ENDPOINT_URL, userInfo);
+
+		verify(odahuDAO).findOdahuClusters(PROJECT, ENDPOINT_URL);
+		verify(endpointService).get(ENDPOINT_URL);
+		verify(odahuDAO).updateStatus(ODAHU_NAME, PROJECT, ENDPOINT_URL, UserInstanceStatus.TERMINATING);
+		verify(odahuDAO).getFields(ODAHU_NAME, PROJECT, ENDPOINT_URL);
+		verify(provisioningService).post(ENDPOINT_URL + "infrastructure/odahu/terminate", userInfo.getAccessToken(),
+				requestBuilder.newOdahuAction(userInfo.getName(), PROJECT, getProjectDTO(UserInstanceStatus.TERMINATING), getEndpointDTO(), new OdahuFieldsDTO()), String.class);
+		verifyNoMoreInteractions(odahuDAO, endpointService, provisioningService);
+	}
+
+	@Test(expected = DatalabException.class)
+	public void terminateIfIncorrectStatusTest() {
+		List<OdahuDTO> odahuDTOS = Arrays.asList(
+				getOdahuDTO(UserInstanceStatus.TERMINATING),
+				getOdahuDTO(UserInstanceStatus.FAILED));
+		when(odahuDAO.findOdahuClusters(anyString(), anyString())).thenReturn(odahuDTOS);
+
+		odahuService.terminate(ODAHU_NAME, PROJECT, ENDPOINT_URL, userInfo);
+
+		verify(odahuDAO).findOdahuClusters(PROJECT, ENDPOINT_URL);
+		verifyNoMoreInteractions(odahuDAO, endpointService, provisioningService);
+	}
+
+	private Map<String, String> getTags() {
+		Map<String, String> tags = new HashMap<>();
+		tags.put("custom_tag", getOdahuCreateDTO().getCustomTag());
+		tags.put("project_tag", getOdahuCreateDTO().getProject());
+		tags.put("endpoint_tag", getOdahuCreateDTO().getEndpoint());
+		return tags;
+	}
+
+	private EndpointDTO getEndpointDTO() {
+		return new EndpointDTO(ENDPOINT_NAME, ENDPOINT_URL, "testAccount", tag, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.GCP);
+	}
+
+	private ProjectDTO getProjectDTO(UserInstanceStatus instanceStatus) {
+		return new ProjectDTO(PROJECT,
+				Collections.emptySet(),
+				"ssh-testKey\n", tag, new BudgetDTO(200, Boolean.FALSE),
+				singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, instanceStatus, new EdgeInfo())),
+				true);
+	}
+
+	private OdahuDTO getOdahuDTO(UserInstanceStatus instanceStatus) {
+		return new OdahuDTO(ODAHU_NAME, PROJECT, ENDPOINT_NAME, instanceStatus, getTags());
+	}
+
+	private OdahuCreateDTO getOdahuCreateDTO() {
+		return new OdahuCreateDTO(ODAHU_NAME, PROJECT, ENDPOINT_URL, tag);
+	}
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ReuploadKeyServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ReuploadKeyServiceImplTest.java
new file mode 100644
index 0000000..2044c9a
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/ReuploadKeyServiceImplTest.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.epam.datalab.backendapi.service.impl;
+
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.domain.RequestId;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.backendapi.util.RequestBuilder;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyCallbackDTO;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyStatus;
+import com.epam.datalab.dto.reuploadkey.ReuploadKeyStatusDTO;
+import com.epam.datalab.model.ResourceData;
+import com.epam.datalab.model.ResourceType;
+import com.epam.datalab.rest.client.RESTService;
+import com.mongodb.client.result.UpdateResult;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import static com.epam.datalab.dto.UserInstanceStatus.RUNNING;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ReuploadKeyServiceImplTest {
+
+    private final String USER = "test";
+    private final String TOKEN = "token";
+    private final String EXPLORATORY_NAME = "explName";
+
+    private UserInfo userInfo;
+
+    @Mock
+    private RESTService provisioningService;
+    @Mock
+    private RequestBuilder requestBuilder;
+    @Mock
+    private RequestId requestId;
+    @Mock
+    private ExploratoryService exploratoryService;
+    @Mock
+    private ComputationalDAO computationalDAO;
+    @Mock
+    private ExploratoryDAO exploratoryDAO;
+
+    @InjectMocks
+    private ReuploadKeyServiceImpl reuploadKeyService;
+
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Before
+    public void setUp() {
+        userInfo = getUserInfo();
+    }
+
+    @Test
+    public void updateResourceDataForEdgeWhenStatusCompleted() {
+        ResourceData resource = new ResourceData(ResourceType.EDGE, "someId", null, null);
+        ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.COMPLETED);
+
+        reuploadKeyService.updateResourceData(dto);
+
+        verifyZeroInteractions(exploratoryDAO, computationalDAO);
+    }
+
+    @Test
+    public void updateResourceDataForEdgeWhenStatusFailed() {
+        ResourceData resource = new ResourceData(ResourceType.EDGE, "someId", null, null);
+
+        ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.FAILED);
+        reuploadKeyService.updateResourceData(dto);
+
+        verifyZeroInteractions(exploratoryDAO, computationalDAO);
+    }
+
+    @Test
+    public void updateResourceDataForExploratoryWhenStatusCompleted() {
+        ResourceData resource = new ResourceData(ResourceType.EXPLORATORY, "someId", EXPLORATORY_NAME, null);
+        when(exploratoryDAO.updateStatusForExploratory(anyString(), anyString(), anyString(),
+                any(UserInstanceStatus.class))).thenReturn(mock(UpdateResult.class));
+        doNothing().when(exploratoryDAO).updateReuploadKeyForExploratory(anyString(), anyString(), anyString(), anyBoolean());
+
+        ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.COMPLETED);
+
+        reuploadKeyService.updateResourceData(dto);
+
+        verify(exploratoryDAO).updateStatusForExploratory(USER, null, EXPLORATORY_NAME, RUNNING);
+        verify(exploratoryDAO).updateReuploadKeyForExploratory(USER, null, EXPLORATORY_NAME, false);
+        verifyNoMoreInteractions(exploratoryDAO);
+        verifyZeroInteractions(computationalDAO);
+    }
+
+    @Test
+    public void updateResourceDataForExploratoryWhenStatusFailed() {
+        ResourceData resource = new ResourceData(ResourceType.EXPLORATORY, "someId", EXPLORATORY_NAME, null);
+        when(exploratoryDAO.updateStatusForExploratory(anyString(), anyString(), anyString(),
+                any(UserInstanceStatus.class))).thenReturn(mock(UpdateResult.class));
+
+        ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.FAILED);
+
+        reuploadKeyService.updateResourceData(dto);
+
+        verify(exploratoryDAO).updateStatusForExploratory(USER, null, EXPLORATORY_NAME, RUNNING);
+        verifyNoMoreInteractions(exploratoryDAO);
+        verifyZeroInteractions(computationalDAO);
+    }
+
+    @Test
+    public void updateResourceDataForClusterWhenStatusCompleted() {
+        ResourceData resource = new ResourceData(ResourceType.COMPUTATIONAL, "someId", EXPLORATORY_NAME, "compName");
+        doNothing().when(computationalDAO).updateStatusForComputationalResource(anyString(), anyString(), anyString(),
+                anyString(), any(UserInstanceStatus.class));
+        doNothing().when(computationalDAO).updateReuploadKeyFlagForComputationalResource(anyString(), anyString(),
+                anyString(), anyString(), anyBoolean());
+        ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.COMPLETED);
+
+        reuploadKeyService.updateResourceData(dto);
+
+        verify(computationalDAO).updateStatusForComputationalResource(USER, null, EXPLORATORY_NAME, "compName", RUNNING);
+        verify(computationalDAO).updateReuploadKeyFlagForComputationalResource(USER, null, EXPLORATORY_NAME,
+                "compName", false);
+        verifyNoMoreInteractions(computationalDAO);
+        verifyZeroInteractions(exploratoryDAO);
+    }
+
+    @Test
+    public void updateResourceDataForClusterWhenStatusFailed() {
+        ResourceData resource = new ResourceData(ResourceType.COMPUTATIONAL, "someId", EXPLORATORY_NAME, "compName");
+        doNothing().when(computationalDAO).updateStatusForComputationalResource(anyString(), anyString(), anyString(),
+                anyString(), any(UserInstanceStatus.class));
+        ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.FAILED);
+
+        reuploadKeyService.updateResourceData(dto);
+
+        verify(computationalDAO).updateStatusForComputationalResource(USER, null, EXPLORATORY_NAME, "compName", RUNNING);
+        verifyNoMoreInteractions(computationalDAO);
+        verifyZeroInteractions(exploratoryDAO);
+    }
+
+    private UserInfo getUserInfo() {
+        return new UserInfo(USER, TOKEN);
+    }
+
+    private ReuploadKeyStatusDTO getReuploadKeyStatusDTO(ResourceData resource, ReuploadKeyStatus status) {
+        return new ReuploadKeyStatusDTO().withReuploadKeyCallbackDto(
+                new ReuploadKeyCallbackDTO().withResource(resource)).withReuploadKeyStatus(status).withUser(USER);
+    }
+
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/SchedulerJobServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/SchedulerJobServiceImplTest.java
new file mode 100644
index 0000000..98fa750
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/SchedulerJobServiceImplTest.java
@@ -0,0 +1,1125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.auth.UserInfo;
+import com.epam.datalab.backendapi.dao.ComputationalDAO;
+import com.epam.datalab.backendapi.dao.ExploratoryDAO;
+import com.epam.datalab.backendapi.dao.SchedulerJobDAO;
+import com.epam.datalab.backendapi.service.ComputationalService;
+import com.epam.datalab.backendapi.service.ExploratoryService;
+import com.epam.datalab.backendapi.service.SecurityService;
+import com.epam.datalab.dto.SchedulerJobDTO;
+import com.epam.datalab.dto.UserInstanceDTO;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.dto.aws.computational.AwsComputationalResource;
+import com.epam.datalab.dto.base.DataEngineType;
+import com.epam.datalab.dto.computational.UserComputationalResource;
+import com.epam.datalab.exceptions.ResourceInappropriateStateException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import com.epam.datalab.model.scheduler.SchedulerJobData;
+import com.mongodb.client.result.UpdateResult;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static com.epam.datalab.dto.UserInstanceStatus.RUNNING;
+import static com.epam.datalab.dto.UserInstanceStatus.STARTING;
+import static com.epam.datalab.dto.UserInstanceStatus.STOPPED;
+import static com.epam.datalab.dto.UserInstanceStatus.STOPPING;
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Matchers.anyVararg;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.refEq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class SchedulerJobServiceImplTest {
+    private static final String AUDIT_MESSAGE = "Scheduled action, requested for notebook %s";
+    private final String USER = "test";
+    private final String EXPLORATORY_NAME = "explName";
+    private final String COMPUTATIONAL_NAME = "compName";
+    private final String PROJECT = "project";
+    private SchedulerJobDTO schedulerJobDTO;
+    private UserInstanceDTO userInstance;
+
+    @Mock
+    private SchedulerJobDAO schedulerJobDAO;
+    @Mock
+    private ExploratoryDAO exploratoryDAO;
+    @Mock
+    private ComputationalDAO computationalDAO;
+    @Mock
+    private SecurityService securityService;
+    @Mock
+    private ExploratoryService exploratoryService;
+    @Mock
+    private ComputationalService computationalService;
+
+    @InjectMocks
+    private SchedulerJobServiceImpl schedulerJobService;
+
+
+    @Before
+    public void setUp() {
+        schedulerJobDTO = getSchedulerJobDTO(LocalDate.now(), LocalDate.now().plusDays(1),
+                Arrays.asList(DayOfWeek.values()), Arrays.asList(DayOfWeek.values()), false,
+                LocalDateTime.of(LocalDate.now(), LocalTime.now().truncatedTo(ChronoUnit.MINUTES)),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        userInstance = getUserInstanceDTO();
+    }
+
+    @Test
+    public void fetchSchedulerJobForUserAndExploratory() {
+        when(schedulerJobDAO.fetchSingleSchedulerJobByUserAndExploratory(anyString(), anyString(), anyString()))
+                .thenReturn(Optional.of(schedulerJobDTO));
+
+        SchedulerJobDTO actualSchedulerJobDto =
+                schedulerJobService.fetchSchedulerJobForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
+        assertNotNull(actualSchedulerJobDto);
+        assertEquals(schedulerJobDTO, actualSchedulerJobDto);
+
+        verify(schedulerJobDAO).fetchSingleSchedulerJobByUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(exploratoryDAO, schedulerJobDAO);
+    }
+
+    @Test
+    public void fetchSchedulerJobForUserAndExploratoryWhenNotebookNotExist() {
+        when(schedulerJobDAO.fetchSingleSchedulerJobByUserAndExploratory(anyString(), anyString(), anyString())).thenReturn(Optional.empty());
+        try {
+            schedulerJobService.fetchSchedulerJobForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
+        } catch (ResourceNotFoundException e) {
+            assertEquals("Scheduler job data not found for user test with exploratory explName", e.getMessage());
+        }
+        verify(schedulerJobDAO).fetchSingleSchedulerJobByUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(schedulerJobDAO);
+    }
+
+    @Test
+    public void fetchEmptySchedulerJobForUserAndExploratory() {
+        when(schedulerJobDAO.fetchSingleSchedulerJobByUserAndExploratory(anyString(), anyString(), anyString()))
+                .thenReturn(Optional.empty());
+        try {
+            schedulerJobService.fetchSchedulerJobForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
+        } catch (ResourceNotFoundException e) {
+            assertEquals("Scheduler job data not found for user test with exploratory explName", e.getMessage());
+        }
+        verify(schedulerJobDAO).fetchSingleSchedulerJobByUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(schedulerJobDAO);
+    }
+
+    @Test
+    public void fetchSchedulerJobForComputationalResource() {
+        when(schedulerJobDAO.fetchSingleSchedulerJobForCluster(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(Optional.of(schedulerJobDTO));
+
+        SchedulerJobDTO actualSchedulerJobDto = schedulerJobService
+                .fetchSchedulerJobForComputationalResource(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        assertNotNull(actualSchedulerJobDto);
+        assertEquals(schedulerJobDTO, actualSchedulerJobDto);
+
+        verify(schedulerJobDAO).fetchSingleSchedulerJobForCluster(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        verifyNoMoreInteractions(computationalDAO, schedulerJobDAO);
+    }
+
+    @Test
+    public void fetchEmptySchedulerJobForComputationalResource() {
+        when(schedulerJobDAO.fetchSingleSchedulerJobForCluster(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(Optional.empty());
+        try {
+            schedulerJobService.fetchSchedulerJobForComputationalResource(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        } catch (ResourceNotFoundException e) {
+            assertEquals("Scheduler job data not found for user test with exploratory explName with " +
+                    "computational resource compName", e.getMessage());
+        }
+        verify(schedulerJobDAO).fetchSingleSchedulerJobForCluster(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        verifyNoMoreInteractions(computationalDAO, schedulerJobDAO);
+    }
+
+    @Test
+    public void updateSchedulerDataForUserAndExploratory() {
+        userInstance.withStatus("running");
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(exploratoryDAO.updateSchedulerDataForUserAndExploratory(anyString(), anyString(), anyString(),
+                any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
+
+        schedulerJobService.updateExploratorySchedulerData(getUserInfo(), PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(exploratoryDAO).updateSchedulerDataForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
+        verify(computationalDAO).updateSchedulerSyncFlag(USER, PROJECT, EXPLORATORY_NAME, false);
+        verifyNoMoreInteractions(exploratoryDAO);
+        verifyZeroInteractions(computationalDAO);
+    }
+
+    @Test
+    public void updateSchedulerDataForUserAndExploratoryWhenMethodFetchExploratoryFieldsThrowsException() {
+        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
+                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
+        try {
+            schedulerJobService.updateExploratorySchedulerData(getUserInfo(), PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
+        } catch (ResourceNotFoundException e) {
+            assertEquals("Exploratory for user with name not found", e.getMessage());
+        }
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(exploratoryDAO);
+        verifyZeroInteractions(computationalDAO);
+    }
+
+    @Test
+    public void updateSchedulerDataForUserAndExploratoryWithInapproprietaryStatus() {
+        userInstance.withStatus("terminated");
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        try {
+            schedulerJobService.updateExploratorySchedulerData(getUserInfo(), PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
+        } catch (ResourceInappropriateStateException e) {
+            assertEquals("Can not create/update scheduler for user instance with status: terminated",
+                    e.getMessage());
+        }
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verifyNoMoreInteractions(exploratoryDAO);
+        verifyZeroInteractions(computationalDAO);
+    }
+
+    @Test
+    public void updateSchedulerDataForUserAndExploratoryWithEnrichingSchedulerJob() {
+        schedulerJobDTO.setBeginDate(null);
+        schedulerJobDTO.setTimeZoneOffset(null);
+        userInstance.withStatus("running");
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(exploratoryDAO.updateSchedulerDataForUserAndExploratory(anyString(), anyString(), anyString(),
+                any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
+
+        assertNull(schedulerJobDTO.getBeginDate());
+        assertNull(schedulerJobDTO.getTimeZoneOffset());
+
+        schedulerJobService.updateExploratorySchedulerData(getUserInfo(), PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
+
+        assertEquals(LocalDate.now(), schedulerJobDTO.getBeginDate());
+        assertEquals(OffsetDateTime.now(ZoneId.systemDefault()).getOffset(), schedulerJobDTO.getTimeZoneOffset());
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(exploratoryDAO).updateSchedulerDataForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
+        verify(computationalDAO).updateSchedulerSyncFlag(USER, PROJECT, EXPLORATORY_NAME, false);
+        verifyNoMoreInteractions(exploratoryDAO);
+        verifyZeroInteractions(computationalDAO);
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    public void updateSchedulerDataForUserAndExploratoryWithSyncStartRequiredParam() {
+        userInstance.withStatus("running");
+        schedulerJobDTO.setSyncStartRequired(true);
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(exploratoryDAO.updateSchedulerDataForUserAndExploratory(anyString(), anyString(), anyString(),
+                any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
+        when(computationalDAO.getComputationalResourcesWhereStatusIn(anyString(), anyString(),
+                any(List.class), anyString(), anyVararg())).thenReturn(singletonList(COMPUTATIONAL_NAME));
+        when(computationalDAO.updateSchedulerDataForComputationalResource(anyString(), anyString(), anyString(),
+                anyString(), any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
+
+        schedulerJobService.updateExploratorySchedulerData(getUserInfo(), PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(exploratoryDAO).updateSchedulerDataForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
+        verify(computationalDAO).getComputationalResourcesWhereStatusIn(USER, PROJECT,
+                singletonList(DataEngineType.SPARK_STANDALONE), EXPLORATORY_NAME, STARTING, RUNNING, STOPPING, STOPPED);
+        schedulerJobDTO.setEndTime(null);
+        schedulerJobDTO.setStopDaysRepeat(Collections.emptyList());
+        verify(computationalDAO).updateSchedulerDataForComputationalResource(USER, PROJECT,
+                EXPLORATORY_NAME, COMPUTATIONAL_NAME, schedulerJobDTO);
+        verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    public void updateSchedulerDataForUserAndExploratoryWithSyncStartRequiredParamButAbsenceClusters() {
+        userInstance.withStatus("running");
+        schedulerJobDTO.setSyncStartRequired(true);
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(exploratoryDAO.updateSchedulerDataForUserAndExploratory(anyString(), anyString(), anyString(),
+                any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
+        when(computationalDAO.getComputationalResourcesWhereStatusIn(anyString(), anyString(),
+                any(List.class), anyString(), anyVararg())).thenReturn(Collections.emptyList());
+
+        schedulerJobService.updateExploratorySchedulerData(getUserInfo(), PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(exploratoryDAO).updateSchedulerDataForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
+        verify(computationalDAO).getComputationalResourcesWhereStatusIn(USER, PROJECT,
+                singletonList(DataEngineType.SPARK_STANDALONE), EXPLORATORY_NAME, STARTING, RUNNING, STOPPING, STOPPED);
+        verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
+    }
+
+    @Test
+    public void updateSchedulerDataForComputationalResource() {
+        userInstance.withStatus("running");
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(userInstance.getResources().get(0));
+        when(computationalDAO.updateSchedulerDataForComputationalResource(anyString(), anyString(), anyString(),
+                anyString(), any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
+
+        schedulerJobService.updateComputationalSchedulerData(getUserInfo(), PROJECT, EXPLORATORY_NAME,
+                COMPUTATIONAL_NAME, schedulerJobDTO);
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        verify(computationalDAO).updateSchedulerDataForComputationalResource(USER, PROJECT,
+                EXPLORATORY_NAME, COMPUTATIONAL_NAME, schedulerJobDTO);
+        verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
+    }
+
+    @Test
+    public void updateSchedulerDataForComputationalResourceWhenSchedulerIsNull() {
+        userInstance.withStatus("running");
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(userInstance.getResources().get(0));
+        when(computationalDAO.updateSchedulerDataForComputationalResource(anyString(), anyString(), anyString(),
+                anyString(), any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
+
+        final SchedulerJobDTO schedulerJobDTO = getSchedulerJobDTO(LocalDate.now(), LocalDate.now().plusDays(1),
+                Arrays.asList(DayOfWeek.values()), Arrays.asList(DayOfWeek.values()), false,
+                LocalDateTime.of(LocalDate.now(), LocalTime.now().truncatedTo(ChronoUnit.MINUTES)),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        schedulerJobDTO.setStartDaysRepeat(null);
+        schedulerJobDTO.setStopDaysRepeat(null);
+        schedulerJobService.updateComputationalSchedulerData(getUserInfo(), PROJECT, EXPLORATORY_NAME,
+                COMPUTATIONAL_NAME, schedulerJobDTO);
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        verify(computationalDAO).updateSchedulerDataForComputationalResource(eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME),
+                eq(COMPUTATIONAL_NAME), refEq(schedulerJobDTO));
+        verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
+    }
+
+    @Test
+    public void updateSchedulerDataForComputationalResourceWhenMethodFetchComputationalFieldsThrowsException() {
+        userInstance.withStatus("running");
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        doThrow(new ResourceNotFoundException("Computational resource for user with name not found"))
+                .when(computationalDAO).fetchComputationalFields(anyString(), anyString(), anyString(), anyString());
+        try {
+            schedulerJobService.updateComputationalSchedulerData(getUserInfo(), PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME, schedulerJobDTO);
+        } catch (ResourceNotFoundException e) {
+            assertEquals("Computational resource for user with name not found", e.getMessage());
+        }
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
+    }
+
+    @Test
+    public void updateSchedulerDataForComputationalResourceWithInapproprietaryClusterStatus() {
+        userInstance.setStatus("running");
+        userInstance.getResources().get(0).setStatus("terminated");
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(userInstance.getResources().get(0));
+        try {
+            schedulerJobService.updateComputationalSchedulerData(getUserInfo(), PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME, schedulerJobDTO);
+        } catch (ResourceInappropriateStateException e) {
+            assertEquals("Can not create/update scheduler for user instance with status: terminated",
+                    e.getMessage());
+        }
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
+    }
+
+    @Test
+    public void updateSchedulerDataForComputationalResourceWithEnrichingSchedulerJob() {
+        schedulerJobDTO.setBeginDate(null);
+        schedulerJobDTO.setTimeZoneOffset(null);
+        userInstance.withStatus("running");
+        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
+        when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString()))
+                .thenReturn(userInstance.getResources().get(0));
+        when(computationalDAO.updateSchedulerDataForComputationalResource(anyString(), anyString(), anyString(),
+                anyString(), any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
+
+        assertNull(schedulerJobDTO.getBeginDate());
+        assertNull(schedulerJobDTO.getTimeZoneOffset());
+
+        schedulerJobService.updateComputationalSchedulerData(getUserInfo(), PROJECT, EXPLORATORY_NAME,
+                COMPUTATIONAL_NAME, schedulerJobDTO);
+
+        assertEquals(LocalDate.now(), schedulerJobDTO.getBeginDate());
+        assertEquals(OffsetDateTime.now(ZoneId.systemDefault()).getOffset(), schedulerJobDTO.getTimeZoneOffset());
+
+        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
+        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
+        verify(computationalDAO).updateSchedulerDataForComputationalResource(USER, PROJECT,
+                EXPLORATORY_NAME, COMPUTATIONAL_NAME, schedulerJobDTO);
+        verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
+    }
+
+    @Test
+    public void testStartComputationalByScheduler() {
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(getSchedulerJobData(LocalDate.now(),
+                LocalDate.now().plusDays(1), Arrays.asList(DayOfWeek.values()), Arrays.asList(DayOfWeek.values()),
+                LocalDateTime.of(LocalDate.now(),
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES))));
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.startComputationalByScheduler();
+
+        verify(securityService).getServiceAccountInfo(USER);
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, STOPPED);
+        verify(computationalService).startSparkCluster(refEq(getUserInfo()), eq(EXPLORATORY_NAME),
+                eq(COMPUTATIONAL_NAME), eq(PROJECT), eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME)));
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+    @Test
+    public void testStartComputationalBySchedulerWhenSchedulerIsNotConfigured() {
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(Collections.emptyList());
+
+        schedulerJobService.startComputationalByScheduler();
+
+        verify(schedulerJobDAO).getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE,
+                STOPPED);
+        verifyNoMoreInteractions(schedulerJobDAO);
+        verifyZeroInteractions(securityService, computationalService);
+    }
+
+    @Test
+    public void testStartComputationalBySchedulerWhenSchedulerFinishDateBeforeNow() {
+        final LocalDate beginDate = LocalDate.now().plusDays(1);
+        final LocalDate endDate = LocalDate.now();
+        final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(beginDate, endDate, startDays, stopDays,
+                terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.startComputationalByScheduler();
+
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, STOPPED);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+    @Test
+    public void testStartComputationalBySchedulerWhenSchedulerStartDateAfterNow() {
+        final LocalDate beginDate = LocalDate.now().plusDays(1);
+        final LocalDate finishDate = LocalDate.now();
+        final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(
+                beginDate, finishDate, startDays, stopDays, terminateDateTime, false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.startComputationalByScheduler();
+
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, STOPPED);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+    @Test
+    public void testStartComputationalBySchedulerWhenStartDayIsNotCurrentDay() {
+        final List<DayOfWeek> stopDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
+        final List<DayOfWeek> startDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
+        startDays.remove(LocalDate.now().getDayOfWeek());
+        final LocalDate beginDate = LocalDate.now();
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(
+                beginDate, LocalDate.now().minusDays(1), startDays, stopDays,
+                LocalDateTime.of(LocalDate.now(),
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.startComputationalByScheduler();
+
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, STOPPED);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+
+    @Test
+    public void testStopComputationalByScheduler() {
+        UserInfo userInfo = getUserInfo();
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(getSchedulerJobData(LocalDate.now(),
+                LocalDate.now().plusDays(1), Arrays.asList(DayOfWeek.values()), Arrays.asList(DayOfWeek.values()),
+                LocalDateTime.of(LocalDate.now(),
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES))));
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(userInfo);
+
+        schedulerJobService.stopComputationalByScheduler();
+
+        verify(securityService).getServiceAccountInfo(USER);
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING);
+        verify(computationalService).stopSparkCluster(refEq(userInfo), eq(userInfo.getName()), eq(PROJECT),
+                eq(EXPLORATORY_NAME), eq(COMPUTATIONAL_NAME), eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME)));
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+    @Test
+    public void testStopComputationalBySchedulerWhenSchedulerIsNotConfigured() {
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(Collections.emptyList());
+
+        schedulerJobService.stopComputationalByScheduler();
+
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING);
+        verifyNoMoreInteractions(schedulerJobDAO);
+        verifyZeroInteractions(securityService, computationalService);
+    }
+
+    @Test
+    public void testStopComputationalBySchedulerWhenSchedulerFinishDateBeforeNow() {
+        final LocalDate beginDate = LocalDate.now().plusDays(1);
+        final LocalDate endDate = LocalDate.now();
+        final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(beginDate, endDate, startDays, stopDays,
+                terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.stopComputationalByScheduler();
+
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+    @Test
+    public void testStopComputationalBySchedulerWhenSchedulerStartDateAfterNow() {
+        final LocalDate beginDate = LocalDate.now().plusDays(1);
+        final LocalDate finishDate = LocalDate.now();
+        final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(
+                beginDate, finishDate, startDays, stopDays, terminateDateTime, false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.stopComputationalByScheduler();
+
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+    @Test
+    public void testStopComputationalBySchedulerWhenStopDayIsNotCurrentDay() {
+        final List<DayOfWeek> stopDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
+        stopDays.remove(LocalDate.now().getDayOfWeek());
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(
+                LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()), stopDays,
+                LocalDateTime.of(LocalDate.now(),
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.stopComputationalByScheduler();
+
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+
+    @Test
+    public void testStopExploratoryByScheduler() {
+        UserInfo userInfo = getUserInfo();
+        when(schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(any(UserInstanceStatus.class), any(Date.class))).
+                thenReturn(singletonList(getSchedulerJobData(LocalDate.now(), LocalDate.now().plusDays(1),
+                        Arrays.asList(DayOfWeek.values()), Arrays.asList(DayOfWeek.values()),
+                        LocalDateTime.of(LocalDate.now(),
+                                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES))));
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(userInfo);
+
+        schedulerJobService.stopExploratoryByScheduler();
+
+        verify(securityService).getServiceAccountInfo(USER);
+        verify(schedulerJobDAO).getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(eq(RUNNING),
+                any(Date.class));
+        verify(exploratoryService).stop(refEq(userInfo), eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME), eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME)));
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService);
+    }
+
+    @Test
+    public void testStopExploratoryBySchedulerWhenSchedulerIsNotConfigured() {
+        when(schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(any(UserInstanceStatus.class), any(Date.class)))
+                .thenReturn(Collections.emptyList());
+
+        schedulerJobService.stopExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(eq(RUNNING),
+                any(Date.class));
+        verifyNoMoreInteractions(schedulerJobDAO);
+        verifyZeroInteractions(securityService, exploratoryService);
+    }
+
+    @Test
+    public void testStopExploratoryBySchedulerWhenSchedulerFinishDateBeforeNow() {
+        final LocalDate finishDate = LocalDate.now().minusDays(1);
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(LocalDate.now(), finishDate,
+                Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(any(UserInstanceStatus.class), any(Date.class))).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.stopExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(eq(RUNNING),
+                any(Date.class));
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService);
+    }
+
+    @Test
+    public void testStopExploratoryBySchedulerWhenSchedulerStartDateAfterNow() {
+        final LocalDate now = LocalDate.now();
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
+        final LocalDate beginDate = now.plusDays(1);
+        final LocalDateTime terminateDateTime = LocalDateTime.of(now, LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(beginDate, now, startDays, stopDays,
+                terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(any(UserInstanceStatus.class), any(Date.class)))
+                .thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.stopExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(eq(RUNNING),
+                any(Date.class));
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService);
+    }
+
+    @Test
+    public void testStopExploratoryBySchedulerWhenStopDayIsNotCurrentDay() {
+        final List<DayOfWeek> stopDays = Arrays.stream((DayOfWeek.values())).collect(Collectors.toList());
+        stopDays.remove(LocalDate.now().getDayOfWeek());
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(
+                LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()), stopDays,
+                LocalDateTime.of(LocalDate.now(),
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(any(UserInstanceStatus.class), any(Date.class))).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.stopExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(eq(RUNNING),
+                any(Date.class));
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService);
+    }
+
+
+    @Test
+    public void testStartExploratoryByScheduler() {
+        final LocalDate finishDate = LocalDate.now().plusDays(1);
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class)))
+                .thenReturn(singletonList(getSchedulerJobData(LocalDate.now(), finishDate,
+                        Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
+                                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+                )));
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.startExploratoryByScheduler();
+
+        verify(securityService).getServiceAccountInfo(USER);
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
+        verify(exploratoryService).start(refEq(getUserInfo()), eq(EXPLORATORY_NAME), eq(PROJECT), eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME)));
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService);
+        verify(exploratoryService).start(refEq(getUserInfo()), eq(EXPLORATORY_NAME), eq(PROJECT), eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME)));
+        verifyNoMoreInteractions(schedulerJobDAO, exploratoryService);
+        verifyZeroInteractions(computationalService, computationalDAO);
+    }
+
+    @Test
+    public void testStartExploratoryBySchedulerWithSyncComputationalStart() {
+        final LocalDate finishDate = LocalDate.now().plusDays(1);
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class)))
+                .thenReturn(singletonList(getSchedulerJobData(LocalDate.now(), finishDate,
+                        Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
+                                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), true, USER,
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+                )));
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
+        when(computationalDAO.findComputationalResourcesWithStatus(anyString(), anyString(),
+                anyString(), any(UserInstanceStatus.class))).thenReturn(singletonList(getComputationalResource(
+                DataEngineType.SPARK_STANDALONE, true)));
+
+        schedulerJobService.startExploratoryByScheduler();
+
+        verify(securityService, times(2)).getServiceAccountInfo(USER);
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
+        verify(exploratoryService).start(refEq(getUserInfo()), eq(EXPLORATORY_NAME), eq(PROJECT), eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME)));
+        verify(computationalDAO).findComputationalResourcesWithStatus(USER, PROJECT, EXPLORATORY_NAME, STOPPED);
+        verify(computationalService).startSparkCluster(refEq(getUserInfo()), eq(EXPLORATORY_NAME), eq(COMPUTATIONAL_NAME),
+                eq(PROJECT), eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME)));
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService, computationalService,
+                computationalDAO);
+    }
+
+    @Test
+    public void testStartExploratoryBySchedulerWithSyncComputationalStartDataEngine() {
+        final LocalDate finishDate = LocalDate.now().plusDays(1);
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class)))
+                .thenReturn(singletonList(getSchedulerJobData(LocalDate.now(), finishDate,
+                        Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
+                                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), true, USER,
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+                )));
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
+        when(computationalDAO.findComputationalResourcesWithStatus(anyString(), anyString(),
+                anyString(), any(UserInstanceStatus.class))).thenReturn(singletonList(getComputationalResource(
+                DataEngineType.CLOUD_SERVICE, true)));
+
+        schedulerJobService.startExploratoryByScheduler();
+
+        verify(securityService).getServiceAccountInfo(USER);
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
+        verify(exploratoryService).start(refEq(getUserInfo()), eq(EXPLORATORY_NAME), eq(PROJECT), eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME)));
+        verify(computationalDAO).findComputationalResourcesWithStatus(USER, PROJECT, EXPLORATORY_NAME, STOPPED);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService, computationalDAO);
+        verifyZeroInteractions(computationalService);
+    }
+
+    @Test
+    public void testStartExploratoryBySchedulerWithSyncComputationalStartOnExploratoryButNotOnComputational() {
+        final LocalDate finishDate = LocalDate.now().plusDays(1);
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class)))
+                .thenReturn(singletonList(getSchedulerJobData(LocalDate.now(), finishDate,
+                        Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
+                                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), true, USER,
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+                )));
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
+        when(computationalDAO.findComputationalResourcesWithStatus(anyString(), anyString(),
+                anyString(), any(UserInstanceStatus.class))).thenReturn(singletonList(getComputationalResource(
+                DataEngineType.SPARK_STANDALONE, false)));
+
+        schedulerJobService.startExploratoryByScheduler();
+
+        verify(securityService).getServiceAccountInfo(USER);
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
+        verify(exploratoryService).start(refEq(getUserInfo()), eq(EXPLORATORY_NAME), eq(PROJECT), eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME)));
+        verify(computationalDAO).findComputationalResourcesWithStatus(USER, PROJECT, EXPLORATORY_NAME, STOPPED);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService, computationalDAO);
+        verifyZeroInteractions(computationalService);
+    }
+
+    @Test
+    public void testStartExploratoryBySchedulerWhenSchedulerIsNotConfigured() {
+        when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class))).thenReturn(Collections.emptyList());
+
+        schedulerJobService.startExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
+        verifyNoMoreInteractions(schedulerJobDAO);
+        verifyZeroInteractions(securityService, exploratoryService, computationalService, computationalDAO);
+    }
+
+    @Test
+    public void testStartExploratoryBySchedulerWhenSchedulerFinishDateBeforeNow() {
+        final LocalDate finishDate = LocalDate.now().minusDays(1);
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(LocalDate.now(), finishDate,
+                Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class))).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.startExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
+        verifyZeroInteractions(securityService, exploratoryService, computationalService, computationalDAO);
+    }
+
+    @Test
+    public void testStartExploratoryBySchedulerWhenSchedulerStartDateAfterNow() {
+        final LocalDate finishDate = LocalDate.now();
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final LocalDate beginDate = LocalDate.now().plusDays(1);
+        final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(beginDate, finishDate, startDays, stopDays,
+                terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class))).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.startExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
+        verifyZeroInteractions(securityService, exploratoryService, computationalService, computationalDAO);
+    }
+
+    @Test
+    public void testStartExploratoryBySchedulerWhenStartDayIsNotCurrentDay() {
+        final List<DayOfWeek> stopDays = Arrays.stream((DayOfWeek.values())).collect(Collectors.toList());
+        final List<DayOfWeek> startDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
+        startDays.remove(LocalDate.now().getDayOfWeek());
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(
+                LocalDate.now(), LocalDate.now().minusDays(1), startDays, stopDays, LocalDateTime.of(LocalDate.now(),
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class))).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.startExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
+        verifyZeroInteractions(securityService, exploratoryService, computationalService, computationalDAO);
+    }
+
+
+    @Test
+    public void testTerminateComputationalByScheduler() {
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        final LocalDate finishDate = LocalDate.now().plusDays(1);
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(LocalDate.now(), finishDate, startDays, stopDays
+                , terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                anyVararg())).thenReturn(singletonList(schedulerJobData));
+        UserInfo userInfo = getUserInfo();
+        when(securityService.getServiceAccountInfo(anyString())).thenReturn(userInfo);
+
+        schedulerJobService.terminateComputationalByScheduler();
+
+        verify(securityService).getServiceAccountInfo(USER);
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
+        verify(computationalService).terminateComputational(refEq(userInfo), eq(userInfo.getName()), eq(PROJECT), eq(EXPLORATORY_NAME), eq(COMPUTATIONAL_NAME),
+                eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME)));
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+    @Test
+    public void testTerminateComputationalBySchedulerWhenSchedulerIsNotConfigured() {
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(Collections.emptyList());
+
+        schedulerJobService.terminateComputationalByScheduler();
+
+        verify(schedulerJobDAO).getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
+        verifyNoMoreInteractions(schedulerJobDAO);
+        verifyZeroInteractions(securityService, computationalService);
+    }
+
+    @Test
+    public void testTerminateComputationalBySchedulerWhenSchedulerFinishDateBeforeNow() {
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(
+                LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()),
+                Arrays.asList(DayOfWeek.values()), LocalDateTime.of(LocalDate.now(),
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.terminateComputationalByScheduler();
+
+        verify(schedulerJobDAO).getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+    @Test
+    public void testTerminateComputationalBySchedulerWhenSchedulerStartDateAfterNow() {
+        final LocalDate beginDate = LocalDate.now().plusDays(1);
+        final LocalDate finishDate = LocalDate.now();
+        final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(beginDate, finishDate, startDays, stopDays,
+                terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.terminateComputationalByScheduler();
+
+        verify(schedulerJobDAO).getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+    @Test
+    public void testTerminateComputationalBySchedulerWhenTerminateDateNotCurrent() {
+        final List<DayOfWeek> stopDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
+        stopDays.remove(LocalDate.now().getDayOfWeek());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)).plusDays(1);
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(
+                LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()), stopDays,
+                terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.terminateComputationalByScheduler();
+
+        verify(schedulerJobDAO)
+                .getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
+    }
+
+    @Test
+    public void testTerminateExploratoryByScheduler() {
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        final LocalDate finishDate = LocalDate.now().plusDays(1);
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(LocalDate.now(), finishDate, startDays, stopDays
+                , terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getExploratorySchedulerDataWithOneOfStatus(anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.terminateExploratoryByScheduler();
+
+        verify(securityService).getUserInfoOffline(USER);
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED);
+        verify(exploratoryService).terminate(refEq(getUserInfo()), eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME), eq(String.format(AUDIT_MESSAGE, EXPLORATORY_NAME)));
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService, exploratoryService);
+    }
+
+    @Test
+    public void testTerminateExploratoryBySchedulerWhenSchedulerIsNotConfigured() {
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(Collections.emptyList());
+
+        schedulerJobService.terminateExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED);
+        verifyNoMoreInteractions(schedulerJobDAO);
+        verifyZeroInteractions(securityService, exploratoryService, computationalService);
+    }
+
+    @Test
+    public void testTerminateExploratoryBySchedulerWhenSchedulerFinishDateBeforeNow() {
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(
+                LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()),
+                Arrays.asList(DayOfWeek.values()), LocalDateTime.of(LocalDate.now(),
+                        LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getExploratorySchedulerDataWithOneOfStatus(anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.terminateExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService, computationalService);
+    }
+
+    @Test
+    public void testTerminateExploratoryBySchedulerWhenSchedulerStartDateAfterNow() {
+        final LocalDate beginDate = LocalDate.now().plusDays(1);
+        final LocalDate finishDate = LocalDate.now();
+        final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
+        final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(
+                beginDate, finishDate, startDays, stopDays, terminateDateTime, false, USER,
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        when(schedulerJobDAO.getExploratorySchedulerDataWithOneOfStatus(anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.terminateExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService, computationalService);
+    }
+
+    @Test
+    public void testTerminateExploratoryBySchedulerWhenTerminateDateNotCurrent() {
+        final List<DayOfWeek> stopDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
+        stopDays.remove(LocalDate.now().getDayOfWeek());
+        final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
+                LocalTime.now().truncatedTo(ChronoUnit.MINUTES)).plusDays(1);
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(
+                LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()), stopDays,
+                terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
+        );
+        when(schedulerJobDAO.getExploratorySchedulerDataWithOneOfStatus(anyVararg())).thenReturn(singletonList(schedulerJobData));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+
+        schedulerJobService.terminateExploratoryByScheduler();
+
+        verify(schedulerJobDAO).getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED);
+        verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService, exploratoryService);
+    }
+
+    @Test
+    public void testGetActiveSchedulers() {
+        final int minutesOffset = 123;
+        final LocalDate now = LocalDate.now();
+        final DayOfWeek[] weekDays = DayOfWeek.values();
+        final LocalTime currentTime = LocalTime.now();
+        final LocalTime offsetTime = LocalTime.now().plusMinutes(1);
+        final SchedulerJobData schedulerJobData = getSchedulerJobData(now,
+                now.plusDays(1), Arrays.asList(weekDays), Arrays.asList(weekDays),
+                LocalDateTime.of(now, currentTime.plusMinutes(minutesOffset).truncatedTo(ChronoUnit.MINUTES)), false,
+                USER, offsetTime.truncatedTo(ChronoUnit.MINUTES));
+
+        final SchedulerJobData secondScheduler = getSchedulerJobData(now,
+                now.plusDays(1), Arrays.asList(weekDays), Arrays.asList(weekDays),
+                LocalDateTime.of(now, currentTime.plusMinutes(minutesOffset).truncatedTo(ChronoUnit.MINUTES)),
+                false, "user123", offsetTime.truncatedTo(ChronoUnit.MINUTES));
+
+        when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class))).thenReturn(Arrays.asList(schedulerJobData, secondScheduler));
+        when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
+        when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
+                any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
+
+        final List<SchedulerJobData> activeSchedulers = schedulerJobService.getActiveSchedulers(USER, minutesOffset);
+
+        assertEquals(2, activeSchedulers.size());
+    }
+
+    private SchedulerJobData getSchedulerJobData(LocalDate beginDate, LocalDate schedulerFinishDate,
+                                                 List<DayOfWeek> startDays, List<DayOfWeek> stopDays,
+                                                 LocalDateTime terminateDateTime, boolean syncStartRequired,
+                                                 String user, LocalTime endTime) {
+        return new SchedulerJobData(user, EXPLORATORY_NAME, COMPUTATIONAL_NAME, PROJECT, getSchedulerJobDTO(beginDate,
+                schedulerFinishDate, startDays, stopDays, syncStartRequired, terminateDateTime, endTime));
+    }
+
+    private UserInfo getUserInfo() {
+        return new UserInfo(USER, "token");
+    }
+
+    private SchedulerJobDTO getSchedulerJobDTO(LocalDate beginDate, LocalDate finishDate, List<DayOfWeek> startDays,
+                                               List<DayOfWeek> stopDays, boolean syncStartRequired,
+                                               LocalDateTime terminateDateTime, LocalTime endTime) {
+        SchedulerJobDTO schedulerJobDTO = new SchedulerJobDTO();
+        schedulerJobDTO.setTimeZoneOffset(OffsetDateTime.now(ZoneId.systemDefault()).getOffset());
+        schedulerJobDTO.setBeginDate(beginDate);
+        schedulerJobDTO.setFinishDate(finishDate);
+        schedulerJobDTO.setStartTime(LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
+        schedulerJobDTO.setEndTime(endTime);
+        schedulerJobDTO.setTerminateDateTime(terminateDateTime);
+        schedulerJobDTO.setStartDaysRepeat(startDays);
+        schedulerJobDTO.setStopDaysRepeat(stopDays);
+        schedulerJobDTO.setSyncStartRequired(syncStartRequired);
+        return schedulerJobDTO;
+    }
+
+    private UserInstanceDTO getUserInstanceDTO() {
+        UserComputationalResource computationalResource = new UserComputationalResource();
+        computationalResource.setStatus("running");
+        return new UserInstanceDTO()
+                .withUser(USER)
+                .withExploratoryName(EXPLORATORY_NAME)
+                .withResources(singletonList(computationalResource))
+                .withProject(PROJECT);
+    }
+
+    private AwsComputationalResource getComputationalResource(DataEngineType dataEngineType,
+                                                              boolean syncStartRequired) {
+        final SchedulerJobDTO schedulerJobData = new SchedulerJobDTO();
+        schedulerJobData.setSyncStartRequired(syncStartRequired);
+        return AwsComputationalResource.builder()
+                .computationalName("compName")
+                .imageName(DataEngineType.getDockerImageName(dataEngineType))
+                .schedulerJobData(schedulerJobData)
+                .build();
+    }
+}
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/SystemInfoServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/SystemInfoServiceImplTest.java
new file mode 100644
index 0000000..388e01c
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/SystemInfoServiceImplTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.resources.dto.SystemInfoDto;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import oshi.SystemInfo;
+import oshi.hardware.CentralProcessor;
+import oshi.hardware.GlobalMemory;
+import oshi.hardware.HWDiskStore;
+import oshi.hardware.HardwareAbstractionLayer;
+import oshi.software.os.FileSystem;
+import oshi.software.os.OSFileStore;
+import oshi.software.os.OperatingSystem;
+import oshi.software.os.OperatingSystemVersion;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class SystemInfoServiceImplTest {
+
+    private static final String OS_VERSION = "OS version";
+    private static final String OS_FAMILY = "OS FAMILY";
+    private static final String BUILD_NUMBER = "BUILD 1.0";
+    private static final String PROCESSOR_MODEL = "Proc model";
+    private static final long AVAILABLE_MEMORY = 100L;
+    private static final long USABLE_SPACE = 100L;
+    private static final long TOTAL_SPACE = 1000L;
+    @Mock
+    private SystemInfo si;
+
+    @InjectMocks
+    private SystemInfoServiceImpl systemInfoService;
+
+    @Test
+    public void getSystemInfo() {
+        final OperatingSystem os = mock(OperatingSystem.class);
+        final HardwareAbstractionLayer hardwareAbstractionLayer = mock(HardwareAbstractionLayer.class);
+        final OperatingSystemVersion operatingSystemVersion = mock(OperatingSystemVersion.class);
+        final CentralProcessor centralProcessor = mock(CentralProcessor.class);
+        final GlobalMemory globalMemory = mock(GlobalMemory.class);
+        final FileSystem fileSystem = mock(FileSystem.class);
+        final OSFileStore osFileStore = new OSFileStore();
+        osFileStore.setUsableSpace(USABLE_SPACE);
+        osFileStore.setTotalSpace(TOTAL_SPACE);
+        when(fileSystem.getFileStores()).thenReturn(new OSFileStore[]{osFileStore});
+
+        when(operatingSystemVersion.getVersion()).thenReturn(OS_VERSION);
+        when(operatingSystemVersion.getBuildNumber()).thenReturn(BUILD_NUMBER);
+        when(hardwareAbstractionLayer.getDiskStores()).thenReturn(new HWDiskStore[]{});
+        when(os.getFamily()).thenReturn(OS_FAMILY);
+        when(os.getVersion()).thenReturn(operatingSystemVersion);
+        when(si.getOperatingSystem()).thenReturn(os);
+        when(os.getFileSystem()).thenReturn(fileSystem);
+        when(globalMemory.getAvailable()).thenReturn(AVAILABLE_MEMORY);
+        when(hardwareAbstractionLayer.getMemory()).thenReturn(globalMemory);
+        when(centralProcessor.getModel()).thenReturn(PROCESSOR_MODEL);
+        when(hardwareAbstractionLayer.getProcessor()).thenReturn(centralProcessor);
+        when(si.getHardware()).thenReturn(hardwareAbstractionLayer);
+
+        SystemInfoDto systemInfo = systemInfoService.getSystemInfo();
+
+        assertEquals(BUILD_NUMBER, systemInfo.getOsInfo().getBuildNumber());
+        assertEquals(OS_VERSION, systemInfo.getOsInfo().getVersion());
+        assertEquals(OS_FAMILY, systemInfo.getOsInfo().getFamily());
+        assertEquals(PROCESSOR_MODEL, systemInfo.getProcessorInfo().getModel());
+        assertEquals(AVAILABLE_MEMORY, systemInfo.getMemoryInfo().getAvailableMemory());
+        assertEquals(2, systemInfo.getDisksInfo().size());
+
+        verify(si).getOperatingSystem();
+        verify(si).getHardware();
+        verifyNoMoreInteractions(si, fileSystem);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/UserGroupServiceImplTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/UserGroupServiceImplTest.java
new file mode 100644
index 0000000..1ad7bd0
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/service/impl/UserGroupServiceImplTest.java
@@ -0,0 +1,182 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.service.impl;
+
+import com.epam.datalab.backendapi.dao.ProjectDAO;
+import com.epam.datalab.backendapi.dao.UserGroupDAO;
+import com.epam.datalab.backendapi.dao.UserRoleDAO;
+import com.epam.datalab.backendapi.domain.ProjectDTO;
+import com.epam.datalab.backendapi.resources.TestBase;
+import com.epam.datalab.backendapi.resources.dto.UserGroupDto;
+import com.epam.datalab.dto.UserInstanceStatus;
+import com.epam.datalab.exceptions.DatalabException;
+import com.epam.datalab.exceptions.ResourceNotFoundException;
+import io.dropwizard.auth.AuthenticationException;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.anySet;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class UserGroupServiceImplTest extends TestBase {
+
+    private static final String ROLE_ID = "Role id";
+    private static final String USER = "test";
+    private static final String GROUP = "admin";
+    @Mock
+    private UserRoleDAO userRoleDao;
+    @Mock
+    private UserGroupDAO userGroupDao;
+    @Mock
+    private ProjectDAO projectDAO;
+    @InjectMocks
+    private UserGroupServiceImpl userGroupService;
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Before
+    public void setup() throws AuthenticationException {
+        authSetup();
+    }
+
+    @Test
+    public void createGroup() {
+        when(userRoleDao.addGroupToRole(anySet(), anySet())).thenReturn(true);
+
+        userGroupService.createGroup(getUserInfo(), GROUP, Collections.singleton(ROLE_ID), Collections.singleton(USER));
+
+        verify(userRoleDao).addGroupToRole(Collections.singleton(GROUP), Collections.singleton(ROLE_ID));
+        verify(userGroupDao).addUsers(GROUP, Collections.singleton(USER));
+    }
+
+    @Test
+    public void createGroupWithNoUsers() {
+        when(userRoleDao.addGroupToRole(anySet(), anySet())).thenReturn(true);
+
+        userGroupService.createGroup(getUserInfo(), GROUP, Collections.singleton(ROLE_ID), Collections.emptySet());
+
+        verify(userRoleDao).addGroupToRole(Collections.singleton(GROUP), Collections.singleton(ROLE_ID));
+        verify(userGroupDao).addUsers(anyString(), anySet());
+    }
+
+    @Test
+    public void createGroupWhenRoleNotFound() {
+        when(userRoleDao.addGroupToRole(anySet(), anySet())).thenReturn(false);
+
+        expectedException.expect(ResourceNotFoundException.class);
+        userGroupService.createGroup(getUserInfo(), GROUP, Collections.singleton(ROLE_ID), Collections.singleton(USER));
+    }
+
+    @Test
+    public void removeGroup() {
+
+        when(userRoleDao.removeGroup(anyString())).thenReturn(true);
+        final ProjectDTO projectDTO = new ProjectDTO(
+                "name", Collections.emptySet(), "", "", null, Collections.emptyList(), true);
+        when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
+                UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList(projectDTO));
+        doNothing().when(userGroupDao).removeGroup(anyString());
+
+        userGroupService.removeGroup(getUserInfo(), GROUP);
+
+        verify(userRoleDao).removeGroup(GROUP);
+        verify(userGroupDao).removeGroup(GROUP);
+        verifyNoMoreInteractions(userGroupDao, userRoleDao);
+    }
+
+    @Test
+    public void removeGroupWhenItIsUsedInProject() {
+
+        when(userRoleDao.removeGroup(anyString())).thenReturn(true);
+        when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
+                UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList(new ProjectDTO(
+                "name", Collections.singleton(GROUP), "", "", null, Collections.emptyList(), true)));
+        doNothing().when(userGroupDao).removeGroup(anyString());
+
+        try {
+            userGroupService.removeGroup(getUserInfo(), GROUP);
+        } catch (Exception e) {
+            assertEquals("Group can not be removed because it is used in some project", e.getMessage());
+        }
+
+        verify(userRoleDao, never()).removeGroup(GROUP);
+        verify(userGroupDao, never()).removeGroup(GROUP);
+        verifyNoMoreInteractions(userGroupDao, userRoleDao);
+    }
+
+    @Test
+    public void removeGroupWhenGroupNotExist() {
+
+        final ProjectDTO projectDTO = new ProjectDTO(
+                "name", Collections.emptySet(), "", "", null, Collections.emptyList(), true);
+        when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
+                UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList(projectDTO));
+        when(userRoleDao.removeGroup(anyString())).thenReturn(false);
+        doNothing().when(userGroupDao).removeGroup(anyString());
+
+        userGroupService.removeGroup(getUserInfo(), GROUP);
+
+        verify(userRoleDao).removeGroup(GROUP);
+        verify(userGroupDao).removeGroup(GROUP);
+        verifyNoMoreInteractions(userGroupDao, userRoleDao);
+    }
+
+    @Test
+    public void removeGroupWithException() {
+        final ProjectDTO projectDTO = new ProjectDTO(
+                "name", Collections.emptySet(), "", "", null, Collections.emptyList(), true);
+        when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
+                UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList(projectDTO));
+        when(userRoleDao.removeGroup(anyString())).thenThrow(new DatalabException("Exception"));
+
+        expectedException.expectMessage("Exception");
+        expectedException.expect(DatalabException.class);
+
+        userGroupService.removeGroup(getUserInfo(), GROUP);
+    }
+
+    private UserGroupDto getUserGroup() {
+        return new UserGroupDto(GROUP, Collections.emptyList(), Collections.emptySet());
+    }
+
+    private List<ProjectDTO> getProjects() {
+        return Collections.singletonList(ProjectDTO.builder()
+                .groups(new HashSet<>(Collections.singletonList(GROUP)))
+                .build());
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/util/CSVFormatterTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/util/CSVFormatterTest.java
new file mode 100644
index 0000000..f4fe781
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/util/CSVFormatterTest.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.util;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class CSVFormatterTest {
+
+    @Test
+    public void formatLine() {
+        List<String> values = Arrays.asList("aaa", "bbb", "ccc", "aa", "bb", "cc", "a", "b", "c");
+        String expected = "aaa,bbb,ccc,aa,bb,cc,a,b,c\r\n";
+        String actual = CSVFormatter.formatLine(values, ',');
+        assertEquals(expected, actual);
+    }
+
+    @Test
+    public void formatLineWithCustomQuote() {
+        List<String> values = Arrays.asList("aaa", "bbb", "ccc", "aa", "bb", "cc", "a", "b", "c");
+        String expected = "\"aaa\",\"bbb\",\"ccc\",\"aa\",\"bb\",\"cc\",\"a\",\"b\",\"c\"\r\n";
+        String actual = CSVFormatter.formatLine(values, ',', '"');
+        assertEquals(expected, actual);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/datalab/backendapi/util/DateRemoverUtilTest.java b/services/self-service/src/test/java/com/epam/datalab/backendapi/util/DateRemoverUtilTest.java
new file mode 100644
index 0000000..59311e7
--- /dev/null
+++ b/services/self-service/src/test/java/com/epam/datalab/backendapi/util/DateRemoverUtilTest.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.epam.datalab.backendapi.util;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class DateRemoverUtilTest {
+
+    @Test
+    public void removeDateFormErrorMessageWithErrorDateFormat() {
+        String errorMessage = "All dates with format '[Error-2018-04-12 15:30:35]:' are erroneous";
+        String expected = "All dates with format 'yyyy-MM-dd' are erroneous";
+        String actual = DateRemoverUtil.removeDateFormErrorMessage(errorMessage, "\\[Error-\\d{4}-\\d{2}-" +
+                "\\d{2} \\d{2}:\\d{2}:\\d{2}\\]:", "yyyy-MM-dd");
+        assertEquals(expected, actual);
+    }
+
+    @Test
+    public void removeDateFormErrorMessage1() {
+        String errorMessage = "All dates with format '[Error-2018-04-12 15:30:35]:' are erroneous";
+        String expected = "All dates with format '[Error]:' are erroneous";
+        String actual = DateRemoverUtil.removeDateFormErrorMessage(errorMessage);
+        assertEquals(expected, actual);
+    }
+}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/.gitkeep b/services/self-service/src/test/java/com/epam/dlab/backendapi/.gitkeep
deleted file mode 100644
index e69de29..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/.gitkeep
+++ /dev/null
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/domain/ExploratoryLibListTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/domain/ExploratoryLibListTest.java
deleted file mode 100644
index 69d2f50..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/domain/ExploratoryLibListTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.domain;
-
-import static junit.framework.TestCase.assertEquals;
-
-import java.util.List;
-import java.util.Map;
-
-import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
-import org.junit.Test;
-
-public class ExploratoryLibListTest {
-
-	@Test
-    public void getLibs() {
-		String content =
-			"{" +
-			"\"os_pkg\": {\"htop\": \"2.0.1-1ubuntu1\", \"python-mysqldb\": \"1.3.7-1build2\"}," +
-			"\"pip2\": {\"requests\": \"N/A\", \"configparser\": \"N/A\"}," +
-			"\"pip3\": {\"configparser\": \"N/A\"}," +
-			"\"r_pkg\": {\"rmarkdown\": \"1.5\"}" +
-			"}";
-		
-		ExploratoryLibList libs = new ExploratoryLibList("imageName", content);
-		
-		assertEquals("imageName", libs.getImageName());
-		assertEquals(false, libs.isExpired());
-		assertEquals(false, libs.isUpdateNeeded());
-		
-		assertEquals(false, libs.isUpdating());
-
-		List<String> groups = libs.getGroupList();
-		assertEquals(4, groups.size());
-    	assertEquals("os_pkg", groups.get(0));
-    	assertEquals("r_pkg", groups.get(3));
-    	
-		Map<String, String> map = libs.getLibs("os_pkg");
-		assertEquals(2, map.size());
-    	assertEquals("2.0.1-1ubuntu1", map.get("htop"));
-    	assertEquals("1.3.7-1build2", map.get("python-mysqldb"));
-
-		final List<LibraryDTO> dtoList = libs.getLibs("os_pkg", "py");
-		assertEquals(1, dtoList.size());
-    	assertEquals("1.3.7-1build2", dtoList.get(0).getVersion());
-
-    	libs.setUpdating();
-		assertEquals(true, libs.isUpdating());
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ApplicationSettingResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ApplicationSettingResourceTest.java
deleted file mode 100644
index 9dd042e..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ApplicationSettingResourceTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources;
-
-
-import com.epam.dlab.backendapi.service.ApplicationSettingService;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Collections;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.*;
-
-public class ApplicationSettingResourceTest extends TestBase {
-
-	private ApplicationSettingService applicationSettingService = mock(ApplicationSettingService.class);
-
-	@Rule
-	public final ResourceTestRule resources =
-			getResourceTestRuleInstance(new ApplicationSettingResource(applicationSettingService));
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-
-	@Test
-	public void setMaxBudget() {
-		final Response response = resources.getJerseyTest()
-				.target("/settings/budget/12")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.put(Entity.entity("dummy", MediaType.TEXT_PLAIN));
-
-		assertEquals(HttpStatus.SC_NO_CONTENT, response.getStatus());
-
-		verify(applicationSettingService).setMaxBudget(12L);
-		verifyNoMoreInteractions(applicationSettingService);
-	}
-
-	@Test
-	public void removeMaxBudget() {
-		final Response response = resources.getJerseyTest()
-				.target("/settings/budget")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.delete();
-
-		assertEquals(HttpStatus.SC_NO_CONTENT, response.getStatus());
-
-		verify(applicationSettingService).removeMaxBudget();
-		verifyNoMoreInteractions(applicationSettingService);
-	}
-
-	@Test
-	public void getSettings() {
-
-		when(applicationSettingService.getSettings()).thenReturn(Collections.singletonMap("key", "value"));
-		final Response response = resources.getJerseyTest()
-				.target("/settings")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-		final Map map = response.readEntity(Map.class);
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getMediaType());
-		assertEquals(1, map.size());
-		assertEquals("value", map.get("key"));
-
-		verify(applicationSettingService).getSettings();
-		verifyNoMoreInteractions(applicationSettingService);
-
-
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/BackupResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/BackupResourceTest.java
deleted file mode 100644
index a5b6d1d..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/BackupResourceTest.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.resources.dto.BackupFormDTO;
-import com.epam.dlab.backendapi.resources.dto.BackupInfoRecord;
-import com.epam.dlab.backendapi.service.BackupService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.dto.backup.EnvBackupDTO;
-import com.epam.dlab.dto.backup.EnvBackupStatus;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.*;
-
-public class BackupResourceTest extends TestBase {
-
-	private final Date TIMESTAMP = new Date();
-	private BackupService backupService = mock(BackupService.class);
-	private RequestId requestId = mock(RequestId.class);
-	private RequestBuilder requestBuilder = mock(RequestBuilder.class);
-
-	@Rule
-	public final ResourceTestRule resources =
-			getResourceTestRuleInstance(new BackupResource(backupService, requestBuilder, requestId));
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-	@Test
-	public void getBackup() {
-		when(backupService.getBackup(anyString(), anyString())).thenReturn(getBackupInfo());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/backup/1")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(getBackupInfo(), response.readEntity(BackupInfoRecord.class));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(backupService).getBackup(USER.toLowerCase(), "1");
-		verifyNoMoreInteractions(backupService);
-		verifyZeroInteractions(requestId, requestBuilder);
-	}
-
-	@Test
-	public void getBackupWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(backupService.getBackup(anyString(), anyString())).thenReturn(getBackupInfo());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/backup/1")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(backupService, requestId, requestBuilder);
-	}
-
-	@Test
-	public void getBackupWithNotFoundException() {
-		when(backupService.getBackup(anyString(), anyString())).thenThrow(new ResourceNotFoundException("Backup not " +
-				"found"));
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/backup/1")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(backupService).getBackup(USER.toLowerCase(), "1");
-		verifyNoMoreInteractions(backupService);
-		verifyZeroInteractions(requestId, requestBuilder);
-	}
-
-	@Test
-	public void getBackups() {
-		when(backupService.getBackups(anyString())).thenReturn(Collections.singletonList(getBackupInfo()));
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/backup")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(Collections.singletonList(getBackupInfo()),
-				response.readEntity(new GenericType<List<BackupInfoRecord>>() {
-				}));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(backupService).getBackups(USER.toLowerCase());
-		verifyNoMoreInteractions(backupService);
-		verifyZeroInteractions(requestId, requestBuilder);
-	}
-
-	@Test
-	public void getBackupsWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(backupService.getBackups(anyString())).thenReturn(Collections.singletonList(getBackupInfo()));
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/backup")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(backupService, requestId, requestBuilder);
-	}
-
-	@Test
-	public void createBackup() {
-		when(requestBuilder.newBackupCreate(any(BackupFormDTO.class), anyString())).thenReturn(getEnvBackupDto());
-		when(backupService.createBackup(any(EnvBackupDTO.class), any(UserInfo.class))).thenReturn("someUuid");
-		when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
-
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/backup")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(getBackupFormDto()));
-
-		assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
-		assertEquals(MediaType.TEXT_PLAIN, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(requestBuilder).newBackupCreate(eq(getBackupFormDto()), anyString());
-		verify(backupService).createBackup(getEnvBackupDto(), getUserInfo());
-		verify(requestId).put(USER.toLowerCase(), "someUuid");
-		verifyNoMoreInteractions(requestBuilder, backupService, requestId);
-	}
-
-	@Test
-	public void createBackupWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(requestBuilder.newBackupCreate(any(BackupFormDTO.class), anyString())).thenReturn(getEnvBackupDto());
-		when(backupService.createBackup(any(EnvBackupDTO.class), any(UserInfo.class))).thenReturn("someUuid");
-		when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
-
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/backup")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(getBackupFormDto()));
-
-		assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(requestBuilder, backupService, requestId);
-	}
-
-	private BackupInfoRecord getBackupInfo() {
-		final List<String> configFiles = Arrays.asList("ss.yml", "sec.yml");
-		final List<String> keys = Collections.singletonList("key.pub");
-		final List<String> cert = Collections.singletonList("cert");
-		final List<String> jars = Collections.singletonList("ss.jar");
-		return new BackupInfoRecord(configFiles, keys, cert, jars, false, true, "file.backup",
-				EnvBackupStatus.CREATED, null, TIMESTAMP);
-	}
-
-	private BackupFormDTO getBackupFormDto() {
-		return new BackupFormDTO(Arrays.asList("ss.yml", "sec.yml"), Collections.singletonList("key.pub"),
-				Collections.singletonList("cert"), Collections.singletonList("ss.jar"), false, true);
-	}
-
-	private EnvBackupDTO getEnvBackupDto() {
-		return EnvBackupDTO.builder()
-				.configFiles(Arrays.asList("ss.yml", "sec.yml"))
-				.keys(Collections.singletonList("key.pub"))
-				.certificates(Collections.singletonList("cert"))
-				.jars(Collections.singletonList("ss.jar"))
-				.databaseBackup(false)
-				.logsBackup(true)
-				.backupFile("file.backup")
-				.id("someId")
-				.build();
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/EnvironmentResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/EnvironmentResourceTest.java
deleted file mode 100644
index 5ac537b..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/EnvironmentResourceTest.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.service.EnvironmentService;
-import com.epam.dlab.exceptions.ResourceConflictException;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Collections;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-public class EnvironmentResourceTest extends TestBase {
-
-	private EnvironmentService environmentService = mock(EnvironmentService.class);
-
-	@Rule
-	public final ResourceTestRule resources = getResourceTestRuleInstance(new EnvironmentResource(environmentService));
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-	@Test
-	public void getAllEnv() {
-		UserInfo userInfo = getUserInfo();
-		when(environmentService.getAllEnv(userInfo)).thenReturn(Collections.emptyList());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/all")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(environmentService).getAllEnv(eq(userInfo));
-		verifyNoMoreInteractions(environmentService);
-	}
-
-	@Test
-	public void getAllEnvWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(environmentService.getAllEnv(getUserInfo())).thenReturn(Collections.emptyList());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/all")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(environmentService);
-	}
-
-	@Test
-	public void stopNotebook() {
-		doNothing().when(environmentService).stopExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/stop/projectName/explName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(environmentService).stopExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
-		verifyNoMoreInteractions(environmentService);
-	}
-
-	@Test
-	public void stopNotebookWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		doNothing().when(environmentService).stopExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/stop/projectName/explName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(environmentService);
-	}
-
-	@Test
-	public void stopNotebookWithResourceConflictException() {
-		doThrow(new ResourceConflictException("Can not stop notebook because its status is CREATING or STARTING"))
-				.when(environmentService).stopExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/stop/projectName/explName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(environmentService).stopExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
-		verifyNoMoreInteractions(environmentService);
-	}
-
-	@Test
-	public void stopCluster() {
-		doNothing().when(environmentService).stopComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/stop/projectName/explName/compName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(environmentService).stopComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
-		verifyNoMoreInteractions(environmentService);
-	}
-
-	@Test
-	public void stopClusterWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		doNothing().when(environmentService).stopComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/stop/projectName/explName/compName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(environmentService);
-	}
-
-	@Test
-	public void stopClusterWithResourceConflictException() {
-		doThrow(new ResourceConflictException("Can not stop cluster because its status is CREATING or STARTING"))
-				.when(environmentService).stopComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/stop/projectName/explName/compName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(environmentService).stopComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
-		verifyNoMoreInteractions(environmentService);
-	}
-
-	@Test
-	public void terminateNotebook() {
-		doNothing().when(environmentService).terminateExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/terminate/projectName/explName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(environmentService).terminateExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
-		verifyNoMoreInteractions(environmentService);
-	}
-
-	@Test
-	public void terminateNotebookWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		doNothing().when(environmentService).terminateExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/terminate/projectName/explName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(environmentService);
-	}
-
-	@Test
-	public void terminateNotebookWithResourceConflictException() {
-		doThrow(new ResourceConflictException("Can not terminate notebook because its status is CREATING or STARTING"))
-				.when(environmentService).terminateExploratory(any(UserInfo.class), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/terminate/projectName/explName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(environmentService).terminateExploratory(new UserInfo(USER, TOKEN), USER, "projectName", "explName");
-		verifyNoMoreInteractions(environmentService);
-	}
-
-	@Test
-	public void terminateCluster() {
-		doNothing().when(environmentService).terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/terminate/projectName/explName/compName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(environmentService).terminateComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
-		verifyNoMoreInteractions(environmentService);
-	}
-
-	@Test
-	public void terminateClusterWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		doNothing().when(environmentService).terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/terminate/projectName/explName/compName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(environmentService);
-	}
-
-	@Test
-	public void terminateClusterWithResourceConflictException() {
-		doThrow(new ResourceConflictException("Can not terminate cluster because its status is CREATING or STARTING"))
-				.when(environmentService).terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/environment/terminate/projectName/explName/compName")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.text(USER));
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(environmentService).terminateComputational(new UserInfo(USER, TOKEN), USER, "projectName", "explName", "compName");
-		verifyNoMoreInteractions(environmentService);
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java
deleted file mode 100644
index bccfa8b..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ExploratoryResourceTest.java
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.ExploratoryActionFormDTO;
-import com.epam.dlab.backendapi.resources.dto.ExploratoryCreateFormDTO;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.model.exploratory.Exploratory;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.refEq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-public class ExploratoryResourceTest extends TestBase {
-
-	private ExploratoryService exploratoryService = mock(ExploratoryService.class);
-
-	@Rule
-	public final ResourceTestRule resources = getResourceTestRuleInstance(new ExploratoryResource(exploratoryService));
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-	@Test
-	public void create() {
-		when(exploratoryService.create(any(UserInfo.class), any(Exploratory.class), anyString())).thenReturn(
-				"someUuid");
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.put(Entity.json(getExploratoryCreateFormDTO()));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals("someUuid", response.readEntity(String.class));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(exploratoryService).create(refEq(getUserInfo()), refEq(getExploratory(getExploratoryCreateFormDTO())),
-				eq("project"));
-		verifyNoMoreInteractions(exploratoryService);
-	}
-
-	@Test
-	public void createWithException() {
-		doThrow(new DlabException("Could not create exploratory environment"))
-				.when(exploratoryService).create(any(UserInfo.class), any(Exploratory.class), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.put(Entity.json(getExploratoryCreateFormDTO()));
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		String expectedJson = "\"code\":500,\"message\":\"There was an error processing your request. " +
-				"It has been logged";
-		String actualJson = response.readEntity(String.class);
-		assertTrue(actualJson.contains(expectedJson));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(exploratoryService).create(getUserInfo(), getExploratory(getExploratoryCreateFormDTO()), "project");
-		verifyNoMoreInteractions(exploratoryService);
-	}
-
-	@Test
-	public void start() {
-		ExploratoryActionFormDTO exploratoryDTO = getExploratoryActionFormDTO();
-		when(exploratoryService.start(any(UserInfo.class), anyString(), anyString())).thenReturn("someUuid");
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(exploratoryDTO));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals("someUuid", response.readEntity(String.class));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(exploratoryService).start(getUserInfo(), exploratoryDTO.getNotebookInstanceName(),
-				exploratoryDTO.getProjectName());
-
-		verifyZeroInteractions(exploratoryService);
-	}
-
-	@Test
-	public void startUnprocessableEntity() {
-		when(exploratoryService.start(any(UserInfo.class), anyString(), anyString())).thenReturn("someUuid");
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(getEmptyExploratoryActionFormDTO()));
-
-		assertEquals(HttpStatus.SC_UNPROCESSABLE_ENTITY, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(exploratoryService);
-	}
-
-	@Test
-	public void startWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(exploratoryService.start(any(UserInfo.class), anyString(), anyString())).thenReturn("someUuid");
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(getEmptyExploratoryActionFormDTO()));
-
-		assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(exploratoryService);
-	}
-
-	@Test
-	public void stop() {
-		when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString())).thenReturn("someUuid");
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/project/someName/stop")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.delete();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals("someUuid", response.readEntity(String.class));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(exploratoryService).stop(getUserInfo(), "project", "someName");
-		verifyNoMoreInteractions(exploratoryService);
-	}
-
-	@Test
-	public void stopWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString())).thenReturn("someUuid");
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/project/someName/stop")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.delete();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals("someUuid", response.readEntity(String.class));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(exploratoryService).stop(getUserInfo(), "project", "someName");
-		verifyNoMoreInteractions(exploratoryService);
-	}
-
-	@Test
-	public void stopWithException() {
-		doThrow(new DlabException("Could not stop exploratory environment"))
-				.when(exploratoryService).stop(any(UserInfo.class), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/project/someName/stop")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.delete();
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		String expectedJson = "\"code\":500,\"message\":\"There was an error processing your request. " +
-				"It has been logged";
-		String actualJson = response.readEntity(String.class);
-		assertTrue(actualJson.contains(expectedJson));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(exploratoryService).stop(getUserInfo(), "project", "someName");
-		verifyNoMoreInteractions(exploratoryService);
-	}
-
-	@Test
-	public void terminate() {
-		when(exploratoryService.terminate(any(UserInfo.class), anyString(), anyString())).thenReturn("someUuid");
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/project/someName/terminate")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.delete();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals("someUuid", response.readEntity(String.class));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(exploratoryService).terminate(getUserInfo(), "project", "someName");
-		verifyNoMoreInteractions(exploratoryService);
-	}
-
-	@Test
-	public void terminateWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(exploratoryService.terminate(any(UserInfo.class), anyString(), anyString())).thenReturn("someUuid");
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/project/someName/terminate")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.delete();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals("someUuid", response.readEntity(String.class));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(exploratoryService).terminate(getUserInfo(), "project", "someName");
-		verifyNoMoreInteractions(exploratoryService);
-	}
-
-	@Test
-	public void terminateWithException() {
-		doThrow(new DlabException("Could not terminate exploratory environment"))
-				.when(exploratoryService).terminate(any(UserInfo.class), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/project/someName/terminate")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.delete();
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		String expectedJson = "\"code\":500,\"message\":\"There was an error processing your request. " +
-				"It has been logged";
-		String actualJson = response.readEntity(String.class);
-		assertTrue(actualJson.contains(expectedJson));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(exploratoryService).terminate(getUserInfo(), "project", "someName");
-		verifyNoMoreInteractions(exploratoryService);
-	}
-
-	@Test
-	public void updateSparkConfig() {
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/someProject/someName/reconfigure")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.put(Entity.json(Collections.singletonList(new ClusterConfig())));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-
-		verify(exploratoryService).updateClusterConfig(refEq(getUserInfo()), eq("someProject"),
-				eq("someName"), eq(Collections.singletonList(new ClusterConfig())));
-		verifyNoMoreInteractions(exploratoryService);
-	}
-
-	@Test
-	public void getSparkConfig() {
-		final ClusterConfig config = new ClusterConfig();
-		config.setClassification("test");
-		when(exploratoryService.getClusterConfig(any(UserInfo.class), anyString(), anyString())).thenReturn(Collections.singletonList(config));
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/someProject/someName/cluster/config")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		final List<ClusterConfig> clusterConfigs = response.readEntity(new GenericType<List<ClusterConfig>>() {
-		});
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(1, clusterConfigs.size());
-		assertEquals("test", clusterConfigs.get(0).getClassification());
-
-		verify(exploratoryService).getClusterConfig(refEq(getUserInfo()), eq("someProject"), eq("someName"));
-		verifyNoMoreInteractions(exploratoryService);
-	}
-
-	private ExploratoryCreateFormDTO getExploratoryCreateFormDTO() {
-		ExploratoryCreateFormDTO ecfDto = new ExploratoryCreateFormDTO();
-		ecfDto.setImage("someImage");
-		ecfDto.setTemplateName("someTemplateName");
-		ecfDto.setName("someName");
-		ecfDto.setShape("someShape");
-		ecfDto.setVersion("someVersion");
-		ecfDto.setImageName("someImageName");
-		ecfDto.setProject("project");
-		ecfDto.setEndpoint("endpoint");
-		return ecfDto;
-	}
-
-	private ExploratoryActionFormDTO getEmptyExploratoryActionFormDTO() {
-		return new ExploratoryActionFormDTO();
-	}
-
-	private ExploratoryActionFormDTO getExploratoryActionFormDTO() {
-		return new ExploratoryActionFormDTO("notebook_instance_name", "project_name");
-	}
-
-	private Exploratory getExploratory(@Valid @NotNull ExploratoryCreateFormDTO formDTO) {
-		return Exploratory.builder()
-				.name(formDTO.getName())
-				.dockerImage(formDTO.getImage())
-				.imageName(formDTO.getImageName())
-				.templateName(formDTO.getTemplateName())
-				.version(formDTO.getVersion())
-				.shape(formDTO.getShape())
-				.endpoint(formDTO.getEndpoint())
-				.project(formDTO.getProject()).build();
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/GitCredsResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/GitCredsResourceTest.java
deleted file mode 100644
index 8557792..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/GitCredsResourceTest.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.service.GitCredentialService;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCreds;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsDTO;
-import com.epam.dlab.exceptions.DlabException;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Collections;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.*;
-
-public class GitCredsResourceTest extends TestBase {
-
-	private GitCredentialService gitCredentialService = mock(GitCredentialService.class);
-
-	@Rule
-	public final ResourceTestRule resources = getResourceTestRuleInstance(new GitCredsResource(gitCredentialService));
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-	@Test
-	public void updateGitCreds() {
-		doNothing().when(gitCredentialService).updateGitCredentials(any(UserInfo.class),
-				any(ExploratoryGitCredsDTO.class));
-		final Response response = resources.getJerseyTest()
-				.target("/user/git_creds")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.put(Entity.json(getExploratoryGitCredsDTO()));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(gitCredentialService)
-				.updateGitCredentials(refEq(getUserInfo()), refEq(getExploratoryGitCredsDTO(), "self"));
-		verifyNoMoreInteractions(gitCredentialService);
-	}
-
-	@Test
-	public void updateGitCredsWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		doNothing().when(gitCredentialService).updateGitCredentials(any(UserInfo.class),
-				any(ExploratoryGitCredsDTO.class));
-		final Response response = resources.getJerseyTest()
-				.target("/user/git_creds")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.put(Entity.json(getExploratoryGitCredsDTO()));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(gitCredentialService)
-				.updateGitCredentials(refEq(getUserInfo()), refEq(getExploratoryGitCredsDTO(), "self"));
-		verifyNoMoreInteractions(gitCredentialService);
-	}
-
-	@Test
-	public void updateGitCredsWithException() {
-		doThrow(new DlabException("Cannot update the GIT credentials")).when(gitCredentialService)
-				.updateGitCredentials(any(UserInfo.class), any(ExploratoryGitCredsDTO.class));
-		final Response response = resources.getJerseyTest()
-				.target("/user/git_creds")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.put(Entity.json(getExploratoryGitCredsDTO()));
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(gitCredentialService).updateGitCredentials(refEq(getUserInfo()),
-				refEq(getExploratoryGitCredsDTO(), "self"));
-		verifyNoMoreInteractions(gitCredentialService);
-	}
-
-	@Test
-	public void getGitCreds() {
-		ExploratoryGitCredsDTO egcDto = getExploratoryGitCredsDTO();
-		when(gitCredentialService.getGitCredentials(anyString())).thenReturn(egcDto);
-		final Response response = resources.getJerseyTest()
-				.target("/user/git_creds")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(egcDto.getGitCreds(), response.readEntity(ExploratoryGitCredsDTO.class).getGitCreds());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(gitCredentialService).getGitCredentials(USER.toLowerCase());
-		verifyNoMoreInteractions(gitCredentialService);
-	}
-
-	@Test
-	public void getGitCredsWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		ExploratoryGitCredsDTO egcDto = getExploratoryGitCredsDTO();
-		when(gitCredentialService.getGitCredentials(anyString())).thenReturn(egcDto);
-		final Response response = resources.getJerseyTest()
-				.target("/user/git_creds")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(egcDto.getGitCreds(), response.readEntity(ExploratoryGitCredsDTO.class).getGitCreds());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(gitCredentialService).getGitCredentials(USER.toLowerCase());
-		verifyNoMoreInteractions(gitCredentialService);
-	}
-
-	@Test
-	public void getGitCredsWithException() {
-		doThrow(new DlabException("Cannot load GIT credentials for user"))
-				.when(gitCredentialService).getGitCredentials(anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/user/git_creds")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(gitCredentialService).getGitCredentials(USER.toLowerCase());
-		verifyNoMoreInteractions(gitCredentialService);
-	}
-
-	private ExploratoryGitCredsDTO getExploratoryGitCredsDTO() {
-		ExploratoryGitCredsDTO exploratoryGitCredsDTO = new ExploratoryGitCredsDTO();
-		final ExploratoryGitCreds exploratoryGitCreds = new ExploratoryGitCreds();
-		exploratoryGitCreds.setHostname("host");
-		exploratoryGitCredsDTO.setGitCreds(Collections.singletonList(exploratoryGitCreds));
-		return exploratoryGitCredsDTO;
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ImageExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ImageExploratoryResourceTest.java
deleted file mode 100644
index 089b308..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ImageExploratoryResourceTest.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.resources.dto.ExploratoryImageCreateFormDTO;
-import com.epam.dlab.backendapi.resources.dto.ImageInfoRecord;
-import com.epam.dlab.backendapi.service.ImageExploratoryService;
-import com.epam.dlab.dto.exploratory.ImageStatus;
-import com.epam.dlab.exceptions.ResourceAlreadyExistException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-public class ImageExploratoryResourceTest extends TestBase {
-	private static final String PROJECT = "projectName";
-	private ImageExploratoryService imageExploratoryService = mock(ImageExploratoryService.class);
-	private RequestId requestId = mock(RequestId.class);
-
-	@Rule
-	public final ResourceTestRule resources =
-			getResourceTestRuleInstance(new ImageExploratoryResource(imageExploratoryService, requestId));
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-	@Test
-	public void createImage() {
-		when(imageExploratoryService.createImage(any(UserInfo.class), anyString(), anyString(), anyString(), anyString()))
-				.thenReturn("someUuid");
-		when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(getExploratoryImageCreateFormDTO()));
-
-		assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService).createImage(getUserInfo(), PROJECT, "someNotebookName",
-				"someImageName", "someDescription");
-		verify(requestId).put(USER.toLowerCase(), "someUuid");
-		verifyNoMoreInteractions(imageExploratoryService, requestId);
-	}
-
-	@Test
-	public void createImageWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(imageExploratoryService.createImage(any(UserInfo.class), anyString(), anyString(), anyString(), anyString()))
-				.thenReturn("someUuid");
-		when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(getExploratoryImageCreateFormDTO()));
-
-		assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService).createImage(getUserInfo(), PROJECT, "someNotebookName", "someImageName", "someDescription");
-		verify(requestId).put(USER.toLowerCase(), "someUuid");
-		verifyNoMoreInteractions(imageExploratoryService, requestId);
-	}
-
-	@Test
-	public void createImageWithException() {
-		doThrow(new ResourceAlreadyExistException("Image with name is already exist"))
-				.when(imageExploratoryService).createImage(any(UserInfo.class), anyString(), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(getExploratoryImageCreateFormDTO()));
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService).createImage(getUserInfo(), PROJECT, "someNotebookName", "someImageName", "someDescription");
-		verifyNoMoreInteractions(imageExploratoryService);
-		verifyZeroInteractions(requestId);
-	}
-
-	@Test
-	public void getImages() {
-		when(imageExploratoryService.getNotFailedImages(anyString(), anyString(), anyString(), anyString()))
-				.thenReturn(getImageList());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image")
-				.queryParam("docker_image", "someDockerImage")
-				.queryParam("project", "someProject")
-				.queryParam("endpoint", "someEndpoint")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(getImageList(), response.readEntity(new GenericType<List<ImageInfoRecord>>() {
-		}));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService).getNotFailedImages(USER.toLowerCase(), "someDockerImage", "someProject", "someEndpoint");
-		verifyNoMoreInteractions(imageExploratoryService);
-	}
-
-	@Test
-	public void getImagesWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(imageExploratoryService.getNotFailedImages(anyString(), anyString(), anyString(), anyString()))
-				.thenReturn(getImageList());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image")
-				.queryParam("docker_image", "someDockerImage")
-				.queryParam("project", "someProject")
-				.queryParam("endpoint", "someEndpoint")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(getImageList(), response.readEntity(new GenericType<List<ImageInfoRecord>>() {
-		}));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService).getNotFailedImages(USER.toLowerCase(), "someDockerImage", "someProject", "someEndpoint");
-		verifyNoMoreInteractions(imageExploratoryService);
-	}
-
-	@Test
-	public void getImage() {
-		when(imageExploratoryService.getImage(anyString(), anyString(), anyString(), anyString()))
-				.thenReturn(getImageList().get(0));
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image/someName")
-				.queryParam("project", "someProject")
-				.queryParam("endpoint", "someEndpoint")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(getImageList().get(0), response.readEntity(ImageInfoRecord.class));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService).getImage(USER.toLowerCase(), "someName", "someProject", "someEndpoint");
-		verifyNoMoreInteractions(imageExploratoryService);
-	}
-
-	@Test
-	public void getImageWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(imageExploratoryService.getImage(anyString(), anyString(), anyString(), anyString()))
-				.thenReturn(getImageList().get(0));
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image/someName")
-				.queryParam("project", "someProject")
-				.queryParam("endpoint", "someEndpoint")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(getImageList().get(0), response.readEntity(ImageInfoRecord.class));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService).getImage(USER.toLowerCase(), "someName", "someProject", "someEndpoint");
-		verifyNoMoreInteractions(imageExploratoryService);
-	}
-
-	@Test
-	public void getAllImagesForProject() {
-		when(imageExploratoryService.getImagesForProject(anyString())).thenReturn(getImageList());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image/all")
-				.queryParam("project", "someProject")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(getImageList(), response.readEntity(new GenericType<List<ImageInfoRecord>>() {}));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService).getImagesForProject("someProject");
-		verifyNoMoreInteractions(imageExploratoryService);
-	}
-
-	@Test
-	public void getAllImagesForNullProject() {
-		when(imageExploratoryService.getImagesForProject(anyString())).thenReturn(getImageList());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image/all")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_BAD_REQUEST, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService, never()).getImagesForProject(anyString());
-		verifyNoMoreInteractions(imageExploratoryService);
-	}
-
-	@Test
-	public void getAllImagesForProject() {
-		when(imageExploratoryService.getImagesForProject(anyString())).thenReturn(getImageList());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image/all")
-				.queryParam("project", "someProject")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(getImageList(), response.readEntity(new GenericType<List<ImageInfoRecord>>() {}));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService).getImagesForProject("someProject");
-		verifyNoMoreInteractions(imageExploratoryService);
-	}
-
-	@Test
-	public void getAllImagesForNullProject() {
-		when(imageExploratoryService.getImagesForProject(anyString())).thenReturn(getImageList());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image/all")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_BAD_REQUEST, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService, never()).getImagesForProject(anyString());
-		verifyNoMoreInteractions(imageExploratoryService);
-	}
-
-	@Test
-	public void getImageWithException() {
-		doThrow(new ResourceNotFoundException("Image with name was not found for user"))
-				.when(imageExploratoryService).getImage(anyString(), anyString(), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/image/someName")
-				.queryParam("project", "someProject")
-				.queryParam("endpoint", "someEndpoint")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(imageExploratoryService).getImage(USER.toLowerCase(), "someName", "someProject", "someEndpoint");
-		verifyNoMoreInteractions(imageExploratoryService);
-	}
-
-	private ExploratoryImageCreateFormDTO getExploratoryImageCreateFormDTO() {
-		ExploratoryImageCreateFormDTO eicfDto = new ExploratoryImageCreateFormDTO("someImageName", "someDescription");
-		eicfDto.setNotebookName("someNotebookName");
-		eicfDto.setProjectName(PROJECT);
-		return eicfDto;
-	}
-
-	private List<ImageInfoRecord> getImageList() {
-		ImageInfoRecord imageInfoRecord = new ImageInfoRecord("someName", "someDescription", "someProject", "someEndpoint", "someUser", "someApp",
-				"someFullName", ImageStatus.CREATED);
-		return Collections.singletonList(imageInfoRecord);
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java
deleted file mode 100644
index 0f63cb9..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureInfoResourceTest.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
-import com.epam.dlab.backendapi.service.InfrastructureInfoService;
-import com.epam.dlab.dto.InfrastructureMetaInfoDTO;
-import com.epam.dlab.exceptions.DlabException;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyBoolean;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.refEq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-public class InfrastructureInfoResourceTest extends TestBase {
-
-	private InfrastructureInfoService infrastructureInfoService = mock(InfrastructureInfoService.class);
-
-	@Rule
-	public final ResourceTestRule resources =
-			getResourceTestRuleInstance(new InfrastructureInfoResource(infrastructureInfoService));
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-	@Test
-	public void status() {
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(infrastructureInfoService);
-	}
-
-	@Test
-	public void statusWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(infrastructureInfoService);
-	}
-
-	@Test
-	public void healthStatus() {
-		HealthStatusPageDTO hspDto = getHealthStatusPageDTO();
-		when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean())).thenReturn(hspDto);
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/status")
-				.queryParam("full", "1")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(hspDto.getStatus(), response.readEntity(HealthStatusPageDTO.class).getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(true));
-		verifyNoMoreInteractions(infrastructureInfoService);
-	}
-
-	@Test
-	public void healthStatusWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		HealthStatusPageDTO hspDto = getHealthStatusPageDTO();
-		when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean())).thenReturn(hspDto);
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/status")
-				.queryParam("full", "1")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(hspDto.getStatus(), response.readEntity(HealthStatusPageDTO.class).getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(true));
-		verifyNoMoreInteractions(infrastructureInfoService);
-	}
-
-	@Test
-	public void healthStatusWithDefaultQueryParam() {
-		HealthStatusPageDTO hspDto = getHealthStatusPageDTO();
-		when(infrastructureInfoService.getHeathStatus(any(UserInfo.class), anyBoolean())).thenReturn(hspDto);
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/status")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(hspDto.getStatus(), response.readEntity(HealthStatusPageDTO.class).getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(false));
-		verifyNoMoreInteractions(infrastructureInfoService);
-	}
-
-	@Test
-	public void healthStatusWithException() {
-		doThrow(new DlabException("Could not return status of resources for user"))
-				.when(infrastructureInfoService).getHeathStatus(any(UserInfo.class), anyBoolean());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/status")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(infrastructureInfoService).getHeathStatus(refEq(getUserInfo()), eq(false));
-		verifyNoMoreInteractions(infrastructureInfoService);
-	}
-
-
-	@Test
-	public void getUserResourcesWithException() {
-		doThrow(new DlabException("Could not load list of provisioned resources for user"))
-				.when(infrastructureInfoService).getUserResources(any(UserInfo.class));
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/info")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(infrastructureInfoService).getUserResources(any());
-		verifyNoMoreInteractions(infrastructureInfoService);
-	}
-
-	@Test
-	public void getInfrastructureMeta() {
-
-		when(infrastructureInfoService.getInfrastructureMetaInfo()).thenReturn(
-				InfrastructureMetaInfoDTO.builder()
-						.version("1.0").build());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure/meta")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		final InfrastructureMetaInfoDTO infrastructureMetaInfoDTO =
-				response.readEntity(InfrastructureMetaInfoDTO.class);
-		assertEquals("1.0", infrastructureMetaInfoDTO.getVersion());
-	}
-
-	private HealthStatusPageDTO getHealthStatusPageDTO() {
-		return HealthStatusPageDTO.builder()
-				.status("someStatus")
-				.build();
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureTemplateResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureTemplateResourceTest.java
deleted file mode 100644
index eeb6e06..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/InfrastructureTemplateResourceTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.service.InfrastructureTemplateService;
-import com.epam.dlab.dto.base.computational.FullComputationalTemplate;
-import com.epam.dlab.dto.imagemetadata.ComputationalMetadataDTO;
-import com.epam.dlab.dto.imagemetadata.ExploratoryMetadataDTO;
-import com.epam.dlab.exceptions.DlabException;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.*;
-
-public class InfrastructureTemplateResourceTest extends TestBase {
-
-	private InfrastructureTemplateService infrastructureTemplateService = mock(InfrastructureTemplateService.class);
-
-	@Rule
-	public final ResourceTestRule resources =
-			getResourceTestRuleInstance(new InfrastructureTemplateResource(infrastructureTemplateService));
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-	@Test
-	public void getComputationalTemplates() {
-		FullComputationalTemplate fullComputationalTemplate =
-				new FullComputationalTemplate(new ComputationalMetadataDTO());
-		when(infrastructureTemplateService.getComputationalTemplates(any(UserInfo.class), anyString(), anyString()))
-				.thenReturn(Collections.singletonList(fullComputationalTemplate));
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_templates/test/endpoint/computational_templates")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(infrastructureTemplateService).getComputationalTemplates(getUserInfo(), "test", "endpoint");
-		verifyNoMoreInteractions(infrastructureTemplateService);
-	}
-
-	@Test
-	public void getComputationalTemplatesWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		FullComputationalTemplate fullComputationalTemplate =
-				new FullComputationalTemplate(new ComputationalMetadataDTO());
-		when(infrastructureTemplateService.getComputationalTemplates(any(UserInfo.class), anyString(), anyString()))
-				.thenReturn(Collections.singletonList(fullComputationalTemplate));
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_templates/test/endpoint/computational_templates")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(infrastructureTemplateService).getComputationalTemplates(getUserInfo(), "test", "endpoint");
-		verifyNoMoreInteractions(infrastructureTemplateService);
-	}
-
-	@Test
-	public void getComputationalTemplatesWithException() {
-		doThrow(new DlabException("Could not load list of computational templates for user"))
-				.when(infrastructureTemplateService).getComputationalTemplates(any(UserInfo.class), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_templates/test/endpoint/computational_templates")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(infrastructureTemplateService).getComputationalTemplates(getUserInfo(), "test", "endpoint");
-		verifyNoMoreInteractions(infrastructureTemplateService);
-	}
-
-	@Test
-	public void getExploratoryTemplates() {
-		ExploratoryMetadataDTO exploratoryMetadataDTO =
-				new ExploratoryMetadataDTO("someImageName");
-		when(infrastructureTemplateService.getExploratoryTemplates(any(UserInfo.class), anyString(), anyString()))
-				.thenReturn(Collections.singletonList(exploratoryMetadataDTO));
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_templates/test/endpoint/exploratory_templates")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(Collections.singletonList(exploratoryMetadataDTO),
-				response.readEntity(new GenericType<List<ExploratoryMetadataDTO>>() {
-				}));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(infrastructureTemplateService).getExploratoryTemplates(getUserInfo(), "test", "endpoint");
-		verifyNoMoreInteractions(infrastructureTemplateService);
-	}
-
-	@Test
-	public void getExploratoryTemplatesWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		ExploratoryMetadataDTO exploratoryMetadataDTO =
-				new ExploratoryMetadataDTO("someImageName");
-		when(infrastructureTemplateService.getExploratoryTemplates(any(UserInfo.class), anyString(), anyString()))
-				.thenReturn(Collections.singletonList(exploratoryMetadataDTO));
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_templates/test/endpoint/exploratory_templates")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(Collections.singletonList(exploratoryMetadataDTO),
-				response.readEntity(new GenericType<List<ExploratoryMetadataDTO>>() {
-				}));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(infrastructureTemplateService).getExploratoryTemplates(getUserInfo(), "test", "endpoint");
-		verifyNoMoreInteractions(infrastructureTemplateService);
-	}
-
-
-	@Test
-	public void getExploratoryTemplatesWithException() {
-		doThrow(new DlabException("Could not load list of exploratory templates for user"))
-				.when(infrastructureTemplateService).getExploratoryTemplates(any(UserInfo.class), anyString(), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_templates/test/endpoint/exploratory_templates")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(infrastructureTemplateService).getExploratoryTemplates(getUserInfo(), "test", "endpoint");
-		verifyNoMoreInteractions(infrastructureTemplateService);
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/KeycloakResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/KeycloakResourceTest.java
deleted file mode 100644
index c0be4df..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/KeycloakResourceTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.SecurityDAO;
-import com.epam.dlab.backendapi.service.KeycloakService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Rule;
-import org.junit.Test;
-import org.keycloak.representations.AccessTokenResponse;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.*;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-
-public class KeycloakResourceTest extends TestBase {
-    private SecurityService securityService = mock(SecurityService.class);
-    private SelfServiceApplicationConfiguration configuration = mock(SelfServiceApplicationConfiguration.class, RETURNS_DEEP_STUBS);
-    private SecurityDAO securityDAO = mock(SecurityDAO.class);
-    private KeycloakService keycloakService = mock(KeycloakService.class);
-
-    @Rule
-    public final ResourceTestRule resources = getResourceTestRuleInstance(
-            new KeycloakResource(securityService, configuration, securityDAO, keycloakService));
-
-    @Test
-    public void refreshAccessToken() {
-        when(keycloakService.generateAccessToken(anyString())).thenReturn(mock(AccessTokenResponse.class));
-
-        final Response response = resources.getJerseyTest()
-                .target("oauth/refresh/" + "refresh_token")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(""));
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-        verify(keycloakService).generateAccessToken(anyString());
-        verifyNoMoreInteractions(keycloakService);
-    }
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/LibExploratoryResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/LibExploratoryResourceTest.java
deleted file mode 100644
index c7f5ced..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/LibExploratoryResourceTest.java
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.resources.dto.LibInfoRecord;
-import com.epam.dlab.backendapi.resources.dto.LibInstallFormDTO;
-import com.epam.dlab.backendapi.resources.dto.LibKey;
-import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
-import com.epam.dlab.backendapi.resources.dto.LibraryStatus;
-import com.epam.dlab.backendapi.resources.dto.SearchLibsFormDTO;
-import com.epam.dlab.backendapi.service.ExternalLibraryService;
-import com.epam.dlab.backendapi.service.LibraryService;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import com.epam.dlab.dto.exploratory.LibraryInstallDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.bson.Document;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-import static java.util.Collections.singletonList;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.anyListOf;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.refEq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-public class LibExploratoryResourceTest extends TestBase {
-
-    private static final String LIB_GROUP = "group";
-    private static final String LIB_NAME = "name";
-    private static final String LIB_VERSION = "version";
-    private static final String EXPLORATORY_NAME = "explName";
-    private static final String PROJECT = "projectName";
-    private static final String COMPUTATIONAL_NAME = "compName";
-    private static final String UUID = "uid";
-    private ExploratoryDAO exploratoryDAO = mock(ExploratoryDAO.class);
-    private LibraryService libraryService = mock(LibraryService.class);
-    private RESTService provisioningService = mock(RESTService.class);
-    private ExternalLibraryService externalLibraryService = mock(ExternalLibraryService.class);
-    private RequestId requestId = mock(RequestId.class);
-
-    @Rule
-    public final ResourceTestRule resources = getResourceTestRuleInstance(
-            new LibExploratoryResource(exploratoryDAO, libraryService, externalLibraryService));
-
-    @Before
-    public void setup() throws AuthenticationException {
-        authSetup();
-    }
-
-    @Test
-    public void getLibGroupListWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString()))
-                .thenReturn(getUserInstanceDto());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_groups")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("project_name", "projectName")
-                .queryParam("computational_name", "compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName", "compName");
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void getLibGroupListWithException() {
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString())).thenReturn
-                (getUserInstanceDto());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_groups")
-                .queryParam("project_name", "projectName")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("computational_name", "compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName", "compName");
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void getLibGroupListWithoutComputationalWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_groups")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("project_name", "projectName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName");
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void getLibGroupListWithoutComputationalWithException() {
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_groups")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("project_name", "projectName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName");
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void getLibList() {
-        when(libraryService.getLibs(anyString(), anyString(), anyString(), anyString())).thenReturn(getDocuments());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_list")
-                .queryParam("project_name", "projectName")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("computational_name", "compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(getDocuments(), response.readEntity(new GenericType<List<Document>>() {
-        }));
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(libraryService).getLibs(USER.toLowerCase(), "projectName", "explName", "compName");
-        verifyNoMoreInteractions(libraryService);
-    }
-
-	@Test
-	public void getLibListWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        when(libraryService.getLibs(anyString(), anyString(), anyString(), anyString())).thenReturn(getDocuments());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_list")
-                .queryParam("project_name", "projectName")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("computational_name", "compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(getDocuments(), response.readEntity(new GenericType<List<Document>>() {
-        }));
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(libraryService).getLibs(USER.toLowerCase(), "projectName", "explName", "compName");
-        verifyNoMoreInteractions(libraryService);
-    }
-
-	@Test
-	public void getLibListWithException() {
-        doThrow(new DlabException("Cannot load installed libraries"))
-                .when(libraryService).getLibs(anyString(), anyString(), anyString(), anyString());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_list")
-                .queryParam("project_name", "projectName")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("computational_name", "compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(libraryService).getLibs(USER.toLowerCase(), "projectName", "explName", "compName");
-        verifyNoMoreInteractions(libraryService);
-    }
-
-	@Test
-	public void getLibListFormatted() {
-        when(libraryService.getLibInfo(anyString(), anyString(), anyString())).thenReturn(getLibInfoRecords());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_list/formatted")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("project_name", "projectName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(libraryService).getLibInfo(USER.toLowerCase(), "projectName", "explName");
-        verifyNoMoreInteractions(libraryService);
-    }
-
-	@Test
-	public void getLibListFormattedWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        when(libraryService.getLibInfo(anyString(), anyString(), anyString())).thenReturn(getLibInfoRecords());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_list/formatted")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("project_name", "projectName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(libraryService).getLibInfo(USER.toLowerCase(), "projectName", "explName");
-        verifyNoMoreInteractions(libraryService);
-    }
-
-	@Test
-	public void getLibListFormattedWithException() {
-        doThrow(new DlabException("Cannot load  formatted list of installed libraries"))
-                .when(libraryService).getLibInfo(anyString(), anyString(), anyString());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_list/formatted")
-                .queryParam("exploratory_name", "explName")
-                .queryParam("project_name", "projectName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(libraryService).getLibInfo(USER.toLowerCase(), "projectName", "explName");
-        verifyNoMoreInteractions(libraryService);
-    }
-
-	@Test
-	public void libInstall() {
-        when(libraryService.installComputationalLibs(any(UserInfo.class), anyString(), anyString(),
-                anyString(), anyListOf(LibInstallDTO.class))).thenReturn(UUID);
-        LibInstallFormDTO libInstallFormDTO = new LibInstallFormDTO();
-        libInstallFormDTO.setComputationalName(COMPUTATIONAL_NAME);
-        libInstallFormDTO.setNotebookName(EXPLORATORY_NAME);
-        libInstallFormDTO.setProject(PROJECT);
-        libInstallFormDTO.setLibs(singletonList(new LibInstallDTO(LIB_GROUP, LIB_NAME, LIB_VERSION)));
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_install")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(libInstallFormDTO));
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-        assertEquals(UUID, response.readEntity(String.class));
-
-        verify(libraryService).installComputationalLibs(refEq(getUserInfo()), eq(PROJECT),
-                eq(EXPLORATORY_NAME), eq(COMPUTATIONAL_NAME), eq(singletonList(new LibInstallDTO(LIB_GROUP, LIB_NAME, LIB_VERSION))));
-        verifyNoMoreInteractions(libraryService);
-        verifyZeroInteractions(provisioningService, requestId);
-    }
-
-
-	@Test
-	public void libInstallWithoutComputational() {
-        when(libraryService.installExploratoryLibs(any(UserInfo.class), anyString(), anyString(), anyListOf(LibInstallDTO.class))).thenReturn(UUID);
-        LibInstallFormDTO libInstallFormDTO = new LibInstallFormDTO();
-        libInstallFormDTO.setNotebookName(EXPLORATORY_NAME);
-        libInstallFormDTO.setLibs(singletonList(new LibInstallDTO(LIB_GROUP, LIB_NAME, LIB_VERSION)));
-        libInstallFormDTO.setProject(PROJECT);
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/lib_install")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(libInstallFormDTO));
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-        assertEquals(UUID, response.readEntity(String.class));
-
-        verify(libraryService).installExploratoryLibs(refEq(getUserInfo()), eq(PROJECT),
-                eq(EXPLORATORY_NAME), eq(singletonList(new LibInstallDTO(LIB_GROUP, LIB_NAME, LIB_VERSION))));
-        verifyNoMoreInteractions(libraryService);
-        verifyZeroInteractions(provisioningService, requestId);
-    }
-
-	@Test
-	public void getLibraryListWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString()))
-                .thenReturn(getUserInstanceDto());
-        SearchLibsFormDTO searchLibsFormDTO = new SearchLibsFormDTO();
-        searchLibsFormDTO.setComputationalName("compName");
-        searchLibsFormDTO.setNotebookName("explName");
-        searchLibsFormDTO.setGroup("someGroup");
-        searchLibsFormDTO.setStartWith("someText");
-        searchLibsFormDTO.setProjectName("projectName");
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/search/lib_list")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(searchLibsFormDTO));
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName", "compName");
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void getLibraryListWithException() {
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString()))
-                .thenReturn(getUserInstanceDto());
-        SearchLibsFormDTO searchLibsFormDTO = new SearchLibsFormDTO();
-        searchLibsFormDTO.setComputationalName("compName");
-        searchLibsFormDTO.setNotebookName("explName");
-        searchLibsFormDTO.setGroup("someGroup");
-        searchLibsFormDTO.setStartWith("someText");
-        searchLibsFormDTO.setProjectName("projectName");
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/search/lib_list")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(searchLibsFormDTO));
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName", "compName");
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void getLibraryListWithoutComputationalWithException() {
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString()))
-                .thenReturn(getUserInstanceDto());
-        SearchLibsFormDTO searchLibsFormDTO = new SearchLibsFormDTO();
-        searchLibsFormDTO.setComputationalName("");
-        searchLibsFormDTO.setNotebookName("explName");
-        searchLibsFormDTO.setGroup("someGroup");
-        searchLibsFormDTO.setStartWith("someText");
-        searchLibsFormDTO.setProjectName("projectName");
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/search/lib_list")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(searchLibsFormDTO));
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER.toLowerCase(), "projectName", "explName");
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void getMavenArtifact() {
-		when(externalLibraryService.getLibrary(anyString(), anyString(), anyString())).thenReturn(libraryDto());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/search/lib_list/maven")
-				.queryParam("artifact", "group:artifact:version")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-		final LibraryDTO libraryDTO = response.readEntity(LibraryDTO.class);
-		assertEquals("test", libraryDTO.getName());
-		assertEquals("1.0", libraryDTO.getVersion());
-
-		verify(externalLibraryService).getLibrary("group", "artifact", "version");
-		verifyNoMoreInteractions(externalLibraryService);
-	}
-
-	@Test
-	public void getMavenArtifactWithValidationException() {
-		when(externalLibraryService.getLibrary(anyString(), anyString(), anyString())).thenReturn(libraryDto());
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/search/lib_list/maven")
-				.queryParam("artifact", "group:artifact")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_BAD_REQUEST, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		assertEquals("{\"errors\":[\"query param artifact Wrong library name format. Should be " +
-						"<groupId>:<artifactId>:<versionId>. E.g. io.dropwizard:dropwizard-core:1.3.5\"]}",
-				response.readEntity(String.class));
-
-		verifyZeroInteractions(externalLibraryService);
-	}
-
-	private LibraryDTO libraryDto() {
-		return new LibraryDTO(
-				"test", "1.0");
-	}
-
-	private UserInstanceDTO getUserInstanceDto() {
-        UserComputationalResource ucResource = new UserComputationalResource();
-        ucResource.setComputationalName("compName");
-        return new UserInstanceDTO()
-                .withUser(USER)
-                .withExploratoryName("explName")
-                .withProject(PROJECT)
-                .withResources(singletonList(ucResource));
-    }
-
-	private List<Document> getDocuments() {
-		return singletonList(new Document());
-	}
-
-	private List<LibInfoRecord> getLibInfoRecords() {
-		return singletonList(new LibInfoRecord(
-				new LibKey(), singletonList(new LibraryStatus())));
-	}
-
-	private LibraryInstallDTO getLibraryInstallDTO() {
-		return new LibraryInstallDTO().withComputationalName("compName");
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ProjectResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ProjectResourceTest.java
deleted file mode 100644
index 1f6fc46..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/ProjectResourceTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.KeysDTO;
-import com.epam.dlab.backendapi.resources.dto.ProjectActionFormDTO;
-import com.epam.dlab.backendapi.service.AccessKeyService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.exceptions.DlabException;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Collections;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.anyList;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-
-public class ProjectResourceTest extends TestBase {
-    private ProjectService projectService = mock(ProjectService.class);
-    private AccessKeyService keyService = mock(AccessKeyService.class);
-
-    @Rule
-    public final ResourceTestRule resources = getResourceTestRuleInstance(
-            new ProjectResource(projectService, keyService));
-
-    @Before
-    public void setup() throws AuthenticationException {
-        authSetup();
-    }
-
-    @Test
-    public void stopProject() {
-        final Response response = resources.getJerseyTest()
-                .target("project/stop")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(getProjectActionDTO()));
-
-        assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
-        verify(projectService).stopWithResources(any(UserInfo.class), anyList(), anyString());
-        verifyNoMoreInteractions(projectService);
-    }
-
-    @Test
-    public void startProject() {
-        final Response response = resources.getJerseyTest()
-                .target("project/start")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(getProjectActionDTO()));
-
-        assertEquals(HttpStatus.SC_ACCEPTED, response.getStatus());
-        verify(projectService).start(any(UserInfo.class), anyList(), anyString());
-        verifyNoMoreInteractions(projectService);
-    }
-
-    @Test
-    public void generate() {
-        when(keyService.generateKeys(any(UserInfo.class))).thenReturn(new KeysDTO("somePublicKey", "somePrivateKey",
-                "user"));
-
-        final Response response = resources.getJerseyTest()
-                .target("/project/keys")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(""));
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(keyService).generateKeys(getUserInfo());
-        verifyNoMoreInteractions(keyService);
-    }
-
-    @Test
-    public void generateKeysWithException() {
-        doThrow(new DlabException("Can not generate private/public key pair due to"))
-                .when(keyService).generateKeys(any(UserInfo.class));
-
-        final Response response = resources.getJerseyTest()
-                .target("/project/keys")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(""));
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(keyService).generateKeys(getUserInfo());
-        verifyNoMoreInteractions(keyService);
-    }
-
-    private ProjectActionFormDTO getProjectActionDTO() {
-        return new ProjectActionFormDTO("DLAB", Collections.singletonList("https://localhost:8083/"));
-    }
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/SchedulerJobResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/SchedulerJobResourceTest.java
deleted file mode 100644
index c763238..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/SchedulerJobResourceTest.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.backendapi.service.SchedulerJobService;
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.exceptions.ResourceInappropriateStateException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.model.scheduler.SchedulerJobData;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.time.DayOfWeek;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.OffsetDateTime;
-import java.time.ZoneId;
-import java.time.temporal.ChronoUnit;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.anyLong;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-public class SchedulerJobResourceTest extends TestBase {
-
-	private SchedulerJobService schedulerJobService = mock(SchedulerJobService.class);
-
-	@Rule
-	public final ResourceTestRule resources =
-			getResourceTestRuleInstance(new SchedulerJobResource(schedulerJobService));
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-	@Test
-	public void updateExploratoryScheduler() {
-        doNothing().when(schedulerJobService)
-                .updateExploratorySchedulerData(anyString(), anyString(), anyString(), any(SchedulerJobDTO.class));
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(getSchedulerJobDTO()));
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).updateExploratorySchedulerData(USER.toLowerCase(), "projectName",
-                "explName", getSchedulerJobDTO());
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-	@Test
-	public void updateExploratorySchedulerWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        doNothing().when(schedulerJobService)
-                .updateExploratorySchedulerData(anyString(), anyString(), anyString(), any(SchedulerJobDTO.class));
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
-                .request()
-                .header("Authorization", String.join(" ", "Bearer", TOKEN))
-                .post(Entity.json(getSchedulerJobDTO()));
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).updateExploratorySchedulerData(USER.toLowerCase(), "projectName",
-                "explName", getSchedulerJobDTO());
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-	@Test
-	public void updateExploratorySchedulerWithException() {
-        doThrow(new ResourceInappropriateStateException("Can't create/update scheduler for user instance with status"))
-                .when(schedulerJobService).updateExploratorySchedulerData(anyString(), anyString(), anyString(),
-                any(SchedulerJobDTO.class));
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(getSchedulerJobDTO()));
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).updateExploratorySchedulerData(USER.toLowerCase(), "projectName",
-                "explName", getSchedulerJobDTO());
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-	@Test
-	public void upsertComputationalScheduler() {
-        doNothing().when(schedulerJobService)
-                .updateComputationalSchedulerData(anyString(), anyString(), anyString(), anyString(), any(SchedulerJobDTO.class));
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(getSchedulerJobDTO()));
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).updateComputationalSchedulerData(USER.toLowerCase(), "projectName",
-                "explName", "compName", getSchedulerJobDTO());
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-	@Test
-	public void upsertComputationalSchedulerWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        doNothing().when(schedulerJobService)
-                .updateComputationalSchedulerData(anyString(), anyString(), anyString(), anyString(), any(SchedulerJobDTO.class));
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(getSchedulerJobDTO()));
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).updateComputationalSchedulerData(USER.toLowerCase(), "projectName",
-                "explName", "compName", getSchedulerJobDTO());
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-	@Test
-	public void upsertComputationalSchedulerWithException() {
-        doThrow(new ResourceInappropriateStateException("Can't create/update scheduler for user instance with status"))
-                .when(schedulerJobService).updateComputationalSchedulerData(anyString(), anyString(), anyString(),
-                anyString(), any(SchedulerJobDTO.class));
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .post(Entity.json(getSchedulerJobDTO()));
-
-        assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).updateComputationalSchedulerData(USER.toLowerCase(), "projectName",
-                "explName", "compName", getSchedulerJobDTO());
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-	@Test
-	public void fetchSchedulerJobForUserAndExploratory() {
-        when(schedulerJobService.fetchSchedulerJobForUserAndExploratory(anyString(), anyString(), anyString()))
-                .thenReturn(getSchedulerJobDTO());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(getSchedulerJobDTO(), response.readEntity(SchedulerJobDTO.class));
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).fetchSchedulerJobForUserAndExploratory(USER.toLowerCase(), "projectName", "explName");
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-	@Test
-	public void fetchSchedulerJobForUserAndExploratoryWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        when(schedulerJobService.fetchSchedulerJobForUserAndExploratory(anyString(), anyString(), anyString()))
-                .thenReturn(getSchedulerJobDTO());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(getSchedulerJobDTO(), response.readEntity(SchedulerJobDTO.class));
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).fetchSchedulerJobForUserAndExploratory(USER.toLowerCase(), "projectName", "explName");
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-
-	@Test
-	public void fetchSchedulerJobForUserAndExploratoryWithException() {
-        doThrow(new ResourceNotFoundException("Scheduler job data not found for user with exploratory"))
-                .when(schedulerJobService).fetchSchedulerJobForUserAndExploratory(anyString(), anyString(), anyString());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).fetchSchedulerJobForUserAndExploratory(USER.toLowerCase(), "projectName", "explName");
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-	@Test
-	public void fetchSchedulerJobForComputationalResource() {
-        when(schedulerJobService.fetchSchedulerJobForComputationalResource(anyString(), anyString(), anyString(), anyString()))
-                .thenReturn(getSchedulerJobDTO());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(getSchedulerJobDTO(), response.readEntity(SchedulerJobDTO.class));
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).fetchSchedulerJobForComputationalResource(USER.toLowerCase(), "projectName",
-                "explName", "compName");
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-	@Test
-	public void fetchSchedulerJobForComputationalResourceWithFailedAuth() throws AuthenticationException {
-        authFailSetup();
-        when(schedulerJobService.fetchSchedulerJobForComputationalResource(anyString(), anyString(), anyString(), anyString()))
-                .thenReturn(getSchedulerJobDTO());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(getSchedulerJobDTO(), response.readEntity(SchedulerJobDTO.class));
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).fetchSchedulerJobForComputationalResource(USER.toLowerCase(), "projectName",
-                "explName", "compName");
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-	@Test
-	public void fetchSchedulerJobForComputationalResourceWithException() {
-        doThrow(new ResourceNotFoundException("Scheduler job data not found for user with exploratory with " +
-                "computational resource")).when(schedulerJobService)
-                .fetchSchedulerJobForComputationalResource(anyString(), anyString(), anyString(), anyString());
-        final Response response = resources.getJerseyTest()
-                .target("/infrastructure_provision/exploratory_environment/scheduler/projectName/explName/compName")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatus());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(schedulerJobService).fetchSchedulerJobForComputationalResource(USER.toLowerCase(), "projectName",
-                "explName", "compName");
-        verifyNoMoreInteractions(schedulerJobService);
-    }
-
-	@Test
-	public void testGetActiveSchedulers() {
-		when(schedulerJobService.getActiveSchedulers(anyString(), anyLong()))
-				.thenReturn(Collections.singletonList(new SchedulerJobData(USER, "exploratoryName", null,
-						"project", getSchedulerJobDTO())));
-		final long minuteOffset = 10L;
-		final Response response = resources.getJerseyTest()
-				.target("/infrastructure_provision/exploratory_environment/scheduler/active")
-				.queryParam("minuteOffset", minuteOffset)
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-		final List<SchedulerJobData> activeSchedulers = response.readEntity(new GenericType<List<SchedulerJobData>>() {
-		});
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(1, activeSchedulers.size());
-		assertEquals(Collections.singletonList(new SchedulerJobData(USER, "exploratoryName", null,
-				"project", getSchedulerJobDTO())), activeSchedulers);
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(schedulerJobService).getActiveSchedulers(USER.toLowerCase(), minuteOffset);
-		verifyNoMoreInteractions(schedulerJobService);
-
-	}
-
-	private SchedulerJobDTO getSchedulerJobDTO() {
-		SchedulerJobDTO schedulerJobDTO = new SchedulerJobDTO();
-		schedulerJobDTO.setTimeZoneOffset(OffsetDateTime.now(ZoneId.systemDefault()).getOffset());
-		schedulerJobDTO.setBeginDate(LocalDate.now());
-		schedulerJobDTO.setFinishDate(LocalDate.now().plusDays(1));
-		schedulerJobDTO.setStartTime(LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		schedulerJobDTO.setEndTime(LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		schedulerJobDTO.setTerminateDateTime(
-				LocalDateTime.of(LocalDate.now(), LocalTime.now().truncatedTo(ChronoUnit.MINUTES)));
-		schedulerJobDTO.setStartDaysRepeat(Arrays.asList(DayOfWeek.values()));
-		schedulerJobDTO.setStopDaysRepeat(Arrays.asList(DayOfWeek.values()));
-		schedulerJobDTO.setSyncStartRequired(false);
-		return schedulerJobDTO;
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/SystemInfoResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/SystemInfoResourceTest.java
deleted file mode 100644
index 1d7eea1..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/SystemInfoResourceTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.backendapi.resources.dto.SystemInfoDto;
-import com.epam.dlab.backendapi.service.SystemInfoService;
-import com.epam.dlab.model.systeminfo.DiskInfo;
-import com.epam.dlab.model.systeminfo.MemoryInfo;
-import com.epam.dlab.model.systeminfo.OsInfo;
-import com.epam.dlab.model.systeminfo.ProcessorInfo;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Collections;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.*;
-
-public class SystemInfoResourceTest extends TestBase {
-
-	private SystemInfoService systemInfoService = mock(SystemInfoService.class);
-
-	@Rule
-	public final ResourceTestRule resources = getResourceTestRuleInstance(new SystemInfoResource(systemInfoService));
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-	@Test
-	public void getSystemInfo() {
-		when(systemInfoService.getSystemInfo()).thenReturn(getSystemInfoDto());
-		final Response response = resources.getJerseyTest()
-				.target("/sysinfo")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(systemInfoService).getSystemInfo();
-		verifyNoMoreInteractions(systemInfoService);
-	}
-
-	@Test
-	public void getSystemInfoWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(systemInfoService.getSystemInfo()).thenReturn(getSystemInfoDto());
-		final Response response = resources.getJerseyTest()
-				.target("/sysinfo")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verifyZeroInteractions(systemInfoService);
-	}
-
-	private SystemInfoDto getSystemInfoDto() {
-		OsInfo osInfo = OsInfo.builder()
-				.family(System.getProperty("os.name"))
-				.buildNumber(System.getProperty("os.version"))
-				.build();
-		ProcessorInfo processorInfo = ProcessorInfo.builder().build();
-		MemoryInfo memoryInfo = MemoryInfo.builder().build();
-		DiskInfo diskInfo = DiskInfo.builder().build();
-		return new SystemInfoDto(osInfo, processorInfo, memoryInfo, Collections.singletonList(diskInfo));
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/TestBase.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/TestBase.java
deleted file mode 100644
index ea6b9cc..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/TestBase.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.rest.mappers.ResourceNotFoundExceptionMapper;
-import io.dropwizard.auth.*;
-import io.dropwizard.auth.oauth.OAuthCredentialAuthFilter;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.glassfish.jersey.media.multipart.MultiPartFeature;
-import org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature;
-import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory;
-
-import java.util.Optional;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class TestBase {
-
-	protected final String TOKEN = "TOKEN";
-	protected final String USER = "testUser";
-	@SuppressWarnings("unchecked")
-	private static Authenticator<String, UserInfo> authenticator = mock(Authenticator.class);
-	@SuppressWarnings("unchecked")
-	private static Authorizer<UserInfo> authorizer = mock(Authorizer.class);
-
-	protected <T> ResourceTestRule getResourceTestRuleInstance(T resourceInstance) {
-		return ResourceTestRule.builder()
-				.bootstrapLogging(false)
-				.setTestContainerFactory(new GrizzlyWebTestContainerFactory())
-				.addProvider(new AuthDynamicFeature(new OAuthCredentialAuthFilter.Builder<UserInfo>()
-						.setAuthenticator(authenticator)
-						.setAuthorizer(authorizer)
-						.setRealm("SUPER SECRET STUFF")
-						.setPrefix("Bearer")
-						.buildAuthFilter()))
-				.addProvider(RolesAllowedDynamicFeature.class)
-				.addProvider(new ResourceNotFoundExceptionMapper())
-				.addProvider(new AuthValueFactoryProvider.Binder<>(UserInfo.class))
-				.addProvider(MultiPartFeature.class)
-				.addResource(resourceInstance)
-				.build();
-	}
-
-	protected void authSetup() throws AuthenticationException {
-		when(authenticator.authenticate(TOKEN)).thenReturn(Optional.of(getUserInfo()));
-		when(authorizer.authorize(any(), any())).thenReturn(true);
-	}
-
-	protected void authFailSetup() throws AuthenticationException {
-		when(authenticator.authenticate(TOKEN)).thenReturn(Optional.of(getUserInfo()));
-		when(authorizer.authorize(any(), any())).thenReturn(false);
-	}
-
-	protected UserInfo getUserInfo() {
-		return new UserInfo(USER, TOKEN);
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserGroupResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserGroupResourceTest.java
deleted file mode 100644
index 713eda9..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserGroupResourceTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ProjectDAO;
-import com.epam.dlab.backendapi.resources.dto.GroupDTO;
-import com.epam.dlab.backendapi.resources.dto.UserGroupDto;
-import com.epam.dlab.backendapi.service.UserGroupService;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-public class UserGroupResourceTest extends TestBase {
-
-    private static final String USER = "user";
-    private static final String ROLE_ID = "id";
-    private static final String GROUP = "group";
-    private UserGroupService userGroupService = mock(UserGroupService.class);
-    private ProjectDAO projectDAO = mock(ProjectDAO.class);
-
-    @Before
-    public void setup() throws AuthenticationException {
-        authSetup();
-    }
-
-    @Rule
-    public final ResourceTestRule resources =
-            getResourceTestRuleInstance(new UserGroupResource(userGroupService));
-
-	@Test
-	public void createGroup() {
-
-		final Response response = resources.getJerseyTest()
-				.target("/group")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(getCreateGroupDto(GROUP, Collections.singleton(ROLE_ID))));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-
-		verify(userGroupService).createGroup(GROUP, Collections.singleton(ROLE_ID), Collections.singleton(USER));
-		verifyNoMoreInteractions(userGroupService);
-	}
-
-	@Test
-	public void createGroupWhenGroupNameIsEmpty() {
-
-		final Response response = resources.getJerseyTest()
-				.target("/group")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(getCreateGroupDto("", Collections.singleton(ROLE_ID))));
-
-		assertEquals(HttpStatus.SC_UNPROCESSABLE_ENTITY, response.getStatus());
-
-		verifyZeroInteractions(userGroupService);
-	}
-
-	@Test
-	public void createGroupWhenRoleIdIsEmpty() {
-
-		final Response response = resources.getJerseyTest()
-				.target("/group")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(getCreateGroupDto(GROUP, Collections.emptySet())));
-
-		assertEquals(HttpStatus.SC_UNPROCESSABLE_ENTITY, response.getStatus());
-
-		verifyZeroInteractions(userGroupService);
-	}
-
-	@Test
-	public void updateGroup() {
-
-		final Response response = resources.getJerseyTest()
-				.target("/group")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.put(Entity.json(getCreateGroupDto(GROUP, Collections.singleton(ROLE_ID))));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-
-		verify(userGroupService).updateGroup(getUserInfo(), GROUP, Collections.singleton(ROLE_ID), Collections.singleton(USER));
-		verifyNoMoreInteractions(userGroupService);
-	}
-
-	@Test
-	public void getGroups() {
-        when(userGroupService.getAggregatedRolesByGroup(any(UserInfo.class))).thenReturn(Collections.singletonList(getUserGroup()));
-
-        final Response response = resources.getJerseyTest()
-                .target("/group")
-                .request()
-                .header("Authorization", "Bearer " + TOKEN)
-                .get();
-
-        final List<UserGroupDto> actualRoles = response.readEntity(new GenericType<List<UserGroupDto>>() {
-        });
-
-        assertEquals(HttpStatus.SC_OK, response.getStatus());
-        assertEquals(GROUP, actualRoles.get(0).getGroup());
-        assertTrue(actualRoles.get(0).getRoles().isEmpty());
-        assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-        verify(userGroupService).getAggregatedRolesByGroup(getUserInfo());
-        verifyNoMoreInteractions(userGroupService);
-    }
-
-	@Test
-	public void deleteGroup() {
-		final Response response = resources.getJerseyTest()
-				.target("/group/" + GROUP)
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.delete();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-
-
-		verify(userGroupService).removeGroup(GROUP);
-		verifyNoMoreInteractions(userGroupService);
-	}
-
-	private UserGroupDto getUserGroup() {
-		return new UserGroupDto(GROUP, Collections.emptyList(), Collections.emptySet());
-    }
-
-    private GroupDTO getCreateGroupDto(String group, Set<String> roleIds) {
-        final GroupDTO dto = new GroupDTO();
-        dto.setName(group);
-        dto.setRoleIds(roleIds);
-        dto.setUsers(Collections.singleton(USER));
-        return dto;
-    }
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserRoleResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserRoleResourceTest.java
deleted file mode 100644
index c4e2bd6..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserRoleResourceTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.backendapi.resources.dto.UserRoleDto;
-import com.epam.dlab.backendapi.service.UserRoleService;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.refEq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-public class UserRoleResourceTest extends TestBase {
-
-
-	private static final String USER = "user";
-	private static final String ROLE_ID = "id";
-
-	private UserRoleService rolesService = mock(UserRoleService.class);
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-	@Rule
-	public final ResourceTestRule resources =
-			getResourceTestRuleInstance(new UserRoleResource(rolesService));
-
-
-	@Test
-	public void getRoles() {
-		when(rolesService.getUserRoles()).thenReturn(Collections.singletonList(getUserRole()));
-
-		final Response response = resources.getJerseyTest()
-				.target("/role")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		final List<UserRoleDto> actualRoles = response.readEntity(new GenericType<List<UserRoleDto>>() {
-		});
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals(ROLE_ID, actualRoles.get(0).getId());
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(rolesService).getUserRoles();
-		verifyNoMoreInteractions(rolesService);
-	}
-
-	@Test
-	public void createRole() {
-
-		final Response response = resources.getJerseyTest()
-				.target("/role")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json(getUserRole()));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-
-		verify(rolesService).createRole(refEq(getUserRole()));
-		verifyNoMoreInteractions(rolesService);
-	}
-
-	private UserRoleDto getUserRole() {
-		final UserRoleDto userRoleDto = new UserRoleDto();
-		userRoleDto.setId(ROLE_ID);
-		return userRoleDto;
-	}
-
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserSettingsResourceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserSettingsResourceTest.java
deleted file mode 100644
index be2569c..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/resources/UserSettingsResourceTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.resources;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.UserDTO;
-import com.epam.dlab.backendapi.service.UserSettingService;
-import io.dropwizard.auth.AuthenticationException;
-import io.dropwizard.testing.junit.ResourceTestRule;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import static java.util.Collections.singletonList;
-import static org.junit.Assert.*;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.refEq;
-import static org.mockito.Mockito.*;
-
-public class UserSettingsResourceTest extends TestBase {
-
-	private UserSettingService userSettingService = mock(UserSettingService.class);
-
-	@Rule
-	public final ResourceTestRule resources =
-			getResourceTestRuleInstance(new UserSettingsResource(userSettingService));
-
-	@Before
-	public void setup() throws AuthenticationException {
-		authSetup();
-	}
-
-	@Test
-	public void getSettings() {
-		when(userSettingService.getUISettings(any(UserInfo.class))).thenReturn("someSettings");
-		final Response response = resources.getJerseyTest()
-				.target("/user/settings")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals("someSettings", response.readEntity(String.class));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(userSettingService).getUISettings(refEq(getUserInfo()));
-		verifyNoMoreInteractions(userSettingService);
-	}
-
-	@Test
-	public void getSettingsWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		when(userSettingService.getUISettings(any(UserInfo.class))).thenReturn("someSettings");
-		final Response response = resources.getJerseyTest()
-				.target("/user/settings")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.get();
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertEquals("someSettings", response.readEntity(String.class));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(userSettingService).getUISettings(refEq(getUserInfo()));
-		verifyNoMoreInteractions(userSettingService);
-	}
-
-	@Test
-	public void saveSettings() {
-		doNothing().when(userSettingService).saveUISettings(any(UserInfo.class), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/user/settings")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json("someSettings"));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(userSettingService).saveUISettings(refEq(getUserInfo()), eq("someSettings"));
-		verifyNoMoreInteractions(userSettingService);
-	}
-
-	@Test
-	public void saveSettingsWithFailedAuth() throws AuthenticationException {
-		authFailSetup();
-		doNothing().when(userSettingService).saveUISettings(any(UserInfo.class), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/user/settings")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json("someSettings"));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(userSettingService).saveUISettings(refEq(getUserInfo()), eq("someSettings"));
-		verifyNoMoreInteractions(userSettingService);
-	}
-
-	@Test
-	public void saveSettingsWithException() {
-		doThrow(new RuntimeException()).when(userSettingService).saveUISettings(any(UserInfo.class), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/user/settings")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.post(Entity.json("someSettings"));
-
-		assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, response.getStatus());
-		assertTrue(response.readEntity(String.class).contains("{\"code\":500,\"message\":\"There was an error " +
-				"processing your request. It has been logged"));
-		assertEquals(MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(userSettingService).saveUISettings(refEq(getUserInfo()), eq("someSettings"));
-		verifyNoMoreInteractions(userSettingService);
-	}
-
-	@Test
-	public void saveAllowedBudget() {
-		doNothing().when(userSettingService).saveUISettings(any(UserInfo.class), anyString());
-		final Response response = resources.getJerseyTest()
-				.target("/user/settings/budget")
-				.request()
-				.header("Authorization", "Bearer " + TOKEN)
-				.put(Entity.json(singletonList(new UserDTO(USER, 10, UserDTO.Status.ACTIVE))));
-
-		assertEquals(HttpStatus.SC_OK, response.getStatus());
-		assertNull(response.getHeaderString(HttpHeaders.CONTENT_TYPE));
-
-		verify(userSettingService).updateUsersBudget(singletonList(new UserDTO(USER, 10, UserDTO.Status.ACTIVE)));
-		verifyNoMoreInteractions(userSettingService);
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/roles/UserRolesTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/roles/UserRolesTest.java
deleted file mode 100644
index 0fa4c94..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/roles/UserRolesTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.roles;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.SecurityDAO;
-import com.mongodb.client.FindIterable;
-import com.mongodb.client.MongoCursor;
-import org.bson.Document;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class UserRolesTest {
-
-	@Mock
-	private SecurityDAO dao;
-
-	@Test
-	@SuppressWarnings("unchecked")
-	public void checkAccess() {
-		UserInfo userInfoDev = new UserInfo("developer", "token123");
-		userInfoDev.addRole("dev");
-		List<String> shapes1 = new ArrayList<>();
-		shapes1.add("shape_1");
-		shapes1.add("shape_2");
-		shapes1.add("shape_3");
-		ArrayList<String> devGroup = new ArrayList<>();
-		devGroup.add("dev");
-		Document doc1 = new Document().append("exploratory_shapes", shapes1).append("groups", devGroup);
-
-		UserInfo userInfoTest = new UserInfo("tester", "token321");
-		userInfoTest.addRole("test");
-		List<String> shapes2 = new ArrayList<>();
-		shapes2.add("shape_2");
-		shapes2.add("shape_3");
-		ArrayList<String> testGroup = new ArrayList<>();
-		testGroup.add("test");
-		Document doc2 = new Document().append("exploratory_shapes", shapes2).append("groups", testGroup);
-
-		MongoCursor cursor = mock(MongoCursor.class);
-
-		FindIterable mockIterable = mock(FindIterable.class);
-
-		when(dao.getRoles()).thenReturn(mockIterable);
-		when(mockIterable.iterator()).thenReturn(cursor);
-		when(cursor.hasNext()).thenReturn(true).thenReturn(true).thenReturn(false);
-		when(cursor.next()).thenReturn(doc1).thenReturn(doc2);
-		UserRoles.initialize(dao, true);
-
-		assertTrue(UserRoles.checkAccess(userInfoDev, RoleType.EXPLORATORY_SHAPES, "shape_1", userInfoDev.getRoles()));
-		assertTrue(UserRoles.checkAccess(userInfoDev, RoleType.EXPLORATORY_SHAPES, "shape_2", userInfoDev.getRoles()));
-		assertTrue(UserRoles.checkAccess(userInfoDev, RoleType.EXPLORATORY_SHAPES, "shape_3", userInfoDev.getRoles()));
-		assertTrue(UserRoles.checkAccess(userInfoDev, RoleType.EXPLORATORY_SHAPES, "someShape", userInfoDev.getRoles()));
-
-		assertFalse(UserRoles.checkAccess(userInfoTest, RoleType.EXPLORATORY_SHAPES, "shape_1", userInfoTest.getRoles()));
-		assertFalse(UserRoles.checkAccess(userInfoTest, RoleType.EXPLORATORY_SHAPES, "shape_2", userInfoTest.getRoles()));
-		assertFalse(UserRoles.checkAccess(userInfoTest, RoleType.EXPLORATORY_SHAPES, "shape_3", userInfoTest.getRoles()));
-		assertTrue(UserRoles.checkAccess(userInfoTest, RoleType.EXPLORATORY_SHAPES, "someShape", userInfoTest.getRoles()));
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/schedulers/CheckApplicationQuoteSchedulerTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/schedulers/CheckApplicationQuoteSchedulerTest.java
deleted file mode 100644
index 99fd932..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/schedulers/CheckApplicationQuoteSchedulerTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers;
-
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.service.EnvironmentService;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.quartz.JobExecutionContext;
-
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class CheckApplicationQuoteSchedulerTest {
-
-	@Mock
-	private BillingDAO billingDAO;
-	@Mock
-	private EnvironmentService environmentService;
-	@Mock
-	private JobExecutionContext jobExecutionContext;
-	@InjectMocks
-	private CheckApplicationQuoteScheduler checkApplicationQuoteScheduler;
-
-	@Test
-	public void testWhenQuoteNotReached() {
-		when(billingDAO.isBillingQuoteReached()).thenReturn(false);
-
-		checkApplicationQuoteScheduler.execute(jobExecutionContext);
-
-		verify(billingDAO).isBillingQuoteReached();
-		verifyNoMoreInteractions(billingDAO);
-		verifyZeroInteractions(environmentService);
-	}
-
-	@Test
-	public void testWhenQuoteReached() {
-		when(billingDAO.isBillingQuoteReached()).thenReturn(true);
-
-		checkApplicationQuoteScheduler.execute(jobExecutionContext);
-
-		verify(billingDAO).isBillingQuoteReached();
-		verify(environmentService).stopAll();
-		verifyNoMoreInteractions(billingDAO, environmentService);
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/schedulers/CheckUserQuoteSchedulerTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/schedulers/CheckUserQuoteSchedulerTest.java
deleted file mode 100644
index 1c6937c..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/schedulers/CheckUserQuoteSchedulerTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.schedulers;
-
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.resources.dto.UserDTO;
-import com.epam.dlab.backendapi.service.EnvironmentService;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.quartz.JobExecutionContext;
-
-import java.util.Collections;
-
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class CheckUserQuoteSchedulerTest {
-
-	private static final String USER = "test";
-	@Mock
-	private BillingDAO billingDAO;
-	@Mock
-	private EnvironmentService environmentService;
-	@Mock
-	private JobExecutionContext jobExecutionContext;
-	@InjectMocks
-	private CheckUserQuoteScheduler checkUserQuoteScheduler;
-
-	@Test
-	public void testWhenUserQuoteReached() {
-		when(billingDAO.isUserQuoteReached(anyString())).thenReturn(true);
-		when(environmentService.getUsers()).thenReturn(Collections.singletonList(new UserDTO(USER, 1, UserDTO.Status.ACTIVE)));
-
-		checkUserQuoteScheduler.execute(jobExecutionContext);
-
-		verify(environmentService).getUsers();
-		verify(billingDAO).isUserQuoteReached(USER);
-		verify(environmentService).stopEnvironmentWithServiceAccount(USER);
-		verifyNoMoreInteractions(environmentService, billingDAO);
-		verifyZeroInteractions(jobExecutionContext);
-	}
-
-	@Test
-	public void testWhenUserQuoteNotReached() {
-		when(billingDAO.isUserQuoteReached(anyString())).thenReturn(false);
-		when(environmentService.getUsers()).thenReturn(Collections.singletonList(new UserDTO(USER, 1, UserDTO.Status.ACTIVE)));
-
-		checkUserQuoteScheduler.execute(jobExecutionContext);
-
-		verify(environmentService).getUsers();
-		verify(billingDAO).isUserQuoteReached(USER);
-		verify(environmentService, never()).stopEnvironmentWithServiceAccount(anyString());
-		verifyNoMoreInteractions(environmentService, billingDAO);
-		verifyZeroInteractions(jobExecutionContext);
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/ApplicationSettingServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/ApplicationSettingServiceImplTest.java
deleted file mode 100644
index 317a076..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/ApplicationSettingServiceImplTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.backendapi.dao.MongoSetting;
-import com.epam.dlab.backendapi.dao.SettingsDAO;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.Collections;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class ApplicationSettingServiceImplTest {
-
-	private static final long MAX_BUDGET = 10L;
-	@Mock
-	private SettingsDAO settingsDAO;
-	@InjectMocks
-	private ApplicationSettingServiceImpl applicationSettingService;
-
-	@Test
-	public void setMaxBudget() {
-
-		applicationSettingService.setMaxBudget(MAX_BUDGET);
-
-		verify(settingsDAO).setMaxBudget(MAX_BUDGET);
-		verifyNoMoreInteractions(settingsDAO);
-	}
-
-	@Test
-	public void getSettings() {
-		when(settingsDAO.getSettings()).thenReturn(Collections.singletonMap("key", "value"));
-		final Map<String, Object> settings = applicationSettingService.getSettings();
-		assertEquals(1, settings.size());
-		assertEquals("value", settings.get("key"));
-
-		verify(settingsDAO).getSettings();
-		verifyNoMoreInteractions(settingsDAO);
-	}
-
-	@Test
-	public void removeMaxBudget() {
-
-		applicationSettingService.removeMaxBudget();
-
-		verify(settingsDAO).removeSetting(MongoSetting.CONF_MAX_BUDGET);
-		verifyNoMoreInteractions(settingsDAO);
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/KeycloakServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/KeycloakServiceImplTest.java
deleted file mode 100644
index 5050391..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/KeycloakServiceImplTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.SecurityDAO;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.keycloak.representations.AccessTokenResponse;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.Invocation;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Response;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class KeycloakServiceImplTest {
-    private static final String ACCESS_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJNUC15QVpENFdJRzloa" +
-            "np3R0RqQjdCeW9aNGpaV05QTjJ3X25uS1BkTnQ4In0.eyJqdGkiOiJlYTgzZTQ2OS0xNjFhLTQ1ZDUtYWI4YS1mZDUxYThmMzMwMzYiL" +
-            "CJleHAiOjE1NzA0NDQ1NTQsIm5iZiI6MCwiaWF0IjoxNTcwNDQzMzU0LCJpc3MiOiJodHRwOi8vNTIuMTEuNDUuMTE6ODA4MC9hdXRoL" +
-            "3JlYWxtcy9ETEFCX2JobGl2YSIsImF1ZCI6WyJwcm92aXNpb25pbmciLCJhY2NvdW50Il0sInN1YiI6ImRjNzczMThkLWYzN2UtNGNmO" +
-            "S1iMDgwLTU2ZTRjMWUwNDVhNSIsInR5cCI6IkJlYXJlciIsImF6cCI6InNzcyIsImF1dGhfdGltZSI6MTU3MDQ0MzMyOSwic2Vzc2lvb" +
-            "l9zdGF0ZSI6ImVkYTE3ODJjLTliZmItNDQ5Yy1hYWY1LWNhNzM5MDViMmI1NyIsImFjciI6IjEiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZ" +
-            "XMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7InNzcyI6eyJyb2xlcyI6W" +
-            "yJ0ZXN0Il19LCJwcm92aXNpb25pbmciOnsicm9sZXMiOlsidGVzdCJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3Vud" +
-            "CIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSIsImVtY" +
-            "WlsX3ZlcmlmaWVkIjpmYWxzZSwicHJlZmVycmVkX3VzZXJuYW1lIjoidGVzdCJ9.jXjqFP1xmG32NahYnw1spO7fhEyGiqeu0QdBYuo9" +
-            "y6TI8xlAy5EFQ_5SrW6UuzpZUhgCjStH3Qkk_xgLlbZ9IqnxwOmx1i8arlurKf1mY_rm2_C5JBxHdHio8in8yEMls8t-wQOT46kMJNC7" +
-            "4GUzuWWQxS1h6F1V6238rnT8_W27oFcG449ShOGOQ5Du4F9B4ur3Ns6j5oSduwUFlbY_rNpGurUmtFWXBaXM61CiezJPxXu5pHzWK6Xq" +
-            "Z1IkuEUaDDJdBf1OGi13toq88V7C-Pr7YlnyWlbZ7bw2VXAs3NAgtn_30KlgYwR9YUJ_AB5TP3u8kK0jY0vLPosuBZgKeA";
-    private static final String REFRESH_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImUyZjk0YjFmLTBhMjMtNGJi" +
-            "OS05NDUwLTdjNDQ4MTdjY2RkMCJ9.eyJqdGkiOiI0NmNiMzczMy1mM2IzLTRiYjItYmQyZC02N2FjNzg5N2VmNTUiLCJleHAiOjE1NzA" +
-            "0NDMzNTQsIm5iZiI6MCwiaWF0IjoxNTcwNDQzMzU0LCJpc3MiOiJodHRwOi8vNTIuMTEuNDUuMTE6ODA4MC9hdXRoL3JlYWxtcy9ETEF" +
-            "CX2JobGl2YSIsImF1ZCI6Imh0dHA6Ly81Mi4xMS40NS4xMTo4MDgwL2F1dGgvcmVhbG1zL0RMQUJfYmhsaXZhIiwic3ViIjoiZGM3NzM" +
-            "xOGQtZjM3ZS00Y2Y5LWIwODAtNTZlNGMxZTA0NWE1IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InNzcyIsImF1dGhfdGltZSI6MCwic2V" +
-            "zc2lvbl9zdGF0ZSI6ImVkYTE3ODJjLTliZmItNDQ5Yy1hYWY1LWNhNzM5MDViMmI1NyIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJ" +
-            "vZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsic3NzIjp7InJvbGVzIjpbInRlc3Q" +
-            "iXX0sInByb3Zpc2lvbmluZyI6eyJyb2xlcyI6WyJ0ZXN0Il19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWF" +
-            "uYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIn0.rzkrAprIt0-" +
-            "jD0h9ex3krzfu8UDcgnrRdocNFJmYa30";
-    @Mock
-    private Client httpClient;
-    @Mock
-    private SecurityDAO securityDAO;
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private SelfServiceApplicationConfiguration conf;
-
-    private KeycloakServiceImpl keycloakService;
-
-    @Before
-    public void setUp() {
-        keycloakService = new KeycloakServiceImpl(httpClient, conf, securityDAO);
-    }
-
-    @Test
-    public void generateAccessToken() {
-        WebTarget webTarget = mock(WebTarget.class);
-        Invocation.Builder builder = mock(Invocation.Builder.class);
-        Response response = mock(Response.class);
-        Response.StatusType statusType = mock(Response.StatusType.class);
-        AccessTokenResponse tokenResponse = mock(AccessTokenResponse.class);
-
-        when(httpClient.target(anyString())).thenReturn(webTarget);
-        when(webTarget.request()).thenReturn(builder);
-        when(builder.header(any(), anyString())).thenReturn(builder);
-        when(builder.post(any())).thenReturn(response);
-        when(response.getStatusInfo()).thenReturn(statusType);
-        when(response.readEntity(AccessTokenResponse.class)).thenReturn(tokenResponse);
-        when(statusType.getFamily()).thenReturn(Response.Status.Family.SUCCESSFUL);
-        when(tokenResponse.getToken()).thenReturn(ACCESS_TOKEN);
-        doNothing().when(securityDAO).updateUser(anyString(), any(AccessTokenResponse.class));
-
-        keycloakService.generateAccessToken(REFRESH_TOKEN);
-
-        verify(httpClient).target(anyString());
-        verify(securityDAO).updateUser("test", tokenResponse);
-        verifyNoMoreInteractions(securityDAO, httpClient);
-    }
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/UserRoleServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/UserRoleServiceImplTest.java
deleted file mode 100644
index 883630c..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/UserRoleServiceImplTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.backendapi.dao.UserRoleDao;
-import com.epam.dlab.backendapi.resources.TestBase;
-import com.epam.dlab.backendapi.resources.dto.UserRoleDto;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.refEq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class UserRoleServiceImplTest extends TestBase {
-
-    private static final String ROLE_ID = "roleId";
-    @Mock
-    private UserRoleDao dao;
-    @InjectMocks
-    private UserRoleServiceImpl userRoleService;
-    @Rule
-    public ExpectedException expectedException = ExpectedException.none();
-
-    @Test
-	public void createRole() {
-
-		userRoleService.createRole(getUserRole());
-
-		verify(dao).insert(refEq(getUserRole()));
-		verifyNoMoreInteractions(dao);
-	}
-
-	@Test
-	public void updateRole() {
-		when(dao.update(any())).thenReturn(true);
-		userRoleService.updateRole(getUserRole());
-
-		verify(dao).update(refEq(getUserRole()));
-		verifyNoMoreInteractions(dao);
-	}
-
-	@Test
-	public void updateRoleWithException() {
-
-		expectedException.expectMessage("Any of role : [" + ROLE_ID + "] were not found");
-		expectedException.expect(ResourceNotFoundException.class);
-		when(dao.update(any())).thenReturn(false);
-		userRoleService.updateRole(getUserRole());
-	}
-
-	@Test
-	public void removeRole() {
-
-		userRoleService.removeRole(ROLE_ID);
-
-		verify(dao).remove(ROLE_ID);
-		verifyNoMoreInteractions(dao);
-	}
-
-	private UserRoleDto getUserRole() {
-		final UserRoleDto userRoleDto = new UserRoleDto();
-		userRoleDto.setId(ROLE_ID);
-		return userRoleDto;
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/UserSettingServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/UserSettingServiceImplTest.java
deleted file mode 100644
index e44d8eb..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/UserSettingServiceImplTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.UserSettingsDAO;
-import com.epam.dlab.backendapi.resources.dto.UserDTO;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.Collections;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.refEq;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class UserSettingServiceImplTest {
-
-	private static final String SETTINGS = "settings";
-	private static final String TOKEN = "Token";
-	private static final String USER = "user";
-	private static final Integer BUDGET = 10;
-	@Mock
-	private UserSettingsDAO settingsDAO;
-	@InjectMocks
-	private UserSettingServiceImpl userSettingService;
-
-	@Test
-	public void saveUISettings() {
-		userSettingService.saveUISettings(getUserInfo(), SETTINGS);
-
-		verify(settingsDAO).setUISettings(refEq(getUserInfo()), eq(SETTINGS));
-		verifyNoMoreInteractions(settingsDAO);
-	}
-
-	@Test
-	public void getUISettings() {
-		when(settingsDAO.getUISettings(any(UserInfo.class))).thenReturn(SETTINGS);
-
-		final String uiSettings = userSettingService.getUISettings(getUserInfo());
-
-		assertEquals(SETTINGS, uiSettings);
-		verify(settingsDAO).getUISettings(refEq(getUserInfo()));
-	}
-
-	@Test
-	public void updateUsersBudget() {
-
-		userSettingService.updateUsersBudget(Collections.singletonList(getBudgetDTO()));
-
-		verify(settingsDAO).updateBudget(refEq(getBudgetDTO()));
-		verifyNoMoreInteractions(settingsDAO);
-	}
-
-	private UserDTO getBudgetDTO() {
-		return new UserDTO(USER, BUDGET, UserDTO.Status.ACTIVE);
-	}
-
-
-	private UserInfo getUserInfo() {
-		return new UserInfo(USER, TOKEN);
-	}
-
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/BackupServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/BackupServiceImplTest.java
deleted file mode 100644
index 4a27bb5..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/BackupServiceImplTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.BackupDao;
-import com.epam.dlab.backendapi.resources.dto.BackupInfoRecord;
-import com.epam.dlab.dto.backup.EnvBackupDTO;
-import com.epam.dlab.dto.backup.EnvBackupStatus;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.BackupAPI;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class BackupServiceImplTest {
-
-	private final String USER = "test";
-
-	@Mock
-	private RESTService provisioningService;
-	@Mock
-	private BackupDao backupDao;
-
-	@InjectMocks
-	private BackupServiceImpl backupService;
-
-	@Rule
-	public ExpectedException expectedException = ExpectedException.none();
-
-
-	@Test
-	public void createBackup() {
-		doNothing().when(backupDao).createOrUpdate(any(EnvBackupDTO.class), anyString(), any(EnvBackupStatus.class));
-		String expectedUuid = "1234-56789765-4321";
-		String token = "token";
-		when(provisioningService.post(refEq(BackupAPI.BACKUP), eq(token), any(EnvBackupDTO.class), any()))
-				.thenReturn(expectedUuid);
-
-		EnvBackupDTO ebDto = EnvBackupDTO.builder().build();
-		UserInfo userInfo = new UserInfo(USER, token);
-		String uuid = backupService.createBackup(ebDto, userInfo);
-		assertNotNull(uuid);
-		assertEquals(expectedUuid, uuid);
-
-		verify(backupDao).createOrUpdate(ebDto, USER, EnvBackupStatus.CREATING);
-		verify(provisioningService).post(BackupAPI.BACKUP, token, ebDto, String.class);
-		verifyNoMoreInteractions(backupDao, provisioningService);
-	}
-
-	@Test
-	public void updateStatus() {
-		doNothing().when(backupDao).createOrUpdate(any(EnvBackupDTO.class), anyString(), any(EnvBackupStatus.class));
-
-		EnvBackupDTO ebDto = EnvBackupDTO.builder().build();
-		backupService.updateStatus(ebDto, USER, EnvBackupStatus.CREATING);
-
-		verify(backupDao).createOrUpdate(ebDto, USER, EnvBackupStatus.CREATING);
-		verifyNoMoreInteractions(backupDao);
-	}
-
-	@Test
-	public void getBackups() {
-		BackupInfoRecord biRecord = mock(BackupInfoRecord.class);
-		when(backupDao.getBackups(anyString())).thenReturn(Collections.singletonList(biRecord));
-
-		List<BackupInfoRecord> biRecords = backupService.getBackups(USER);
-		assertNotNull(biRecords);
-		assertEquals(1, biRecords.size());
-		assertEquals(Collections.singletonList(biRecord), biRecords);
-
-		verify(backupDao).getBackups(USER);
-		verifyNoMoreInteractions(backupDao);
-	}
-
-	@Test
-	public void getBackup() {
-		BackupInfoRecord biRecord = mock(BackupInfoRecord.class);
-		when(backupDao.getBackup(anyString(), anyString())).thenReturn(Optional.of(biRecord));
-
-		String id = "someId";
-		BackupInfoRecord actualBiRecord = backupService.getBackup(USER, id);
-		assertNotNull(actualBiRecord);
-		assertEquals(biRecord, actualBiRecord);
-
-		verify(backupDao).getBackup(USER, id);
-		verifyNoMoreInteractions(backupDao);
-	}
-
-	@Test
-	public void getBackupWithException() {
-		String id = "someId";
-		doThrow(new ResourceNotFoundException(String.format("Backup with id %s was not found for user %s", id, USER)))
-				.when(backupDao).getBackup(USER, id);
-		expectedException.expect(ResourceNotFoundException.class);
-		expectedException.expectMessage("Backup with id " + id + " was not found for user " + USER);
-
-		backupService.getBackup(USER, id);
-	}
-
-	@Test
-	public void getBackupWhenBackupIsAbsent() {
-		String id = "someId";
-		when(backupDao.getBackup(USER, id)).thenReturn(Optional.empty());
-		expectedException.expect(ResourceNotFoundException.class);
-		expectedException.expectMessage("Backup with id " + id + " was not found for user " + USER);
-
-		backupService.getBackup(USER, id);
-	}
-
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java
deleted file mode 100644
index 74fc7f0..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ComputationalServiceImplTest.java
+++ /dev/null
@@ -1,778 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.ComputationalDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.resources.dto.ComputationalCreateFormDTO;
-import com.epam.dlab.backendapi.resources.dto.SparkStandaloneClusterCreateForm;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.TagService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.base.computational.ComputationalBase;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.epam.dlab.dto.computational.ComputationalClusterConfigDTO;
-import com.epam.dlab.dto.computational.ComputationalStartDTO;
-import com.epam.dlab.dto.computational.ComputationalStatusDTO;
-import com.epam.dlab.dto.computational.ComputationalStopDTO;
-import com.epam.dlab.dto.computational.ComputationalTerminateDTO;
-import com.epam.dlab.dto.computational.SparkStandaloneClusterResource;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.rest.client.RESTService;
-import com.epam.dlab.rest.contracts.ComputationalAPI;
-import com.mongodb.client.result.UpdateResult;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.time.LocalDateTime;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-
-import static com.epam.dlab.dto.UserInstanceStatus.CREATING;
-import static com.epam.dlab.dto.UserInstanceStatus.RUNNING;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPED;
-import static java.util.Collections.singletonList;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyBoolean;
-import static org.mockito.Mockito.anyListOf;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.refEq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-
-@RunWith(MockitoJUnitRunner.class)
-public class ComputationalServiceImplTest {
-
-    private static final long MAX_INACTIVITY = 10L;
-    private static final String DOCKER_DLAB_DATAENGINE = "docker.dlab-dataengine";
-    private static final String DOCKER_DLAB_DATAENGINE_SERVICE = "docker.dlab-dataengine-service";
-    private static final String COMP_ID = "compId";
-    private final String USER = "test";
-    private final String TOKEN = "token";
-    private final String EXPLORATORY_NAME = "expName";
-    private final String PROJECT = "project";
-    private final String COMP_NAME = "compName";
-    private final String UUID = "1234-56789765-4321";
-    private final LocalDateTime LAST_ACTIVITY = LocalDateTime.now().minusMinutes(MAX_INACTIVITY);
-
-    private UserInfo userInfo;
-    private List<ComputationalCreateFormDTO> formList;
-    private UserInstanceDTO userInstance;
-    private ComputationalStatusDTO computationalStatusDTOWithStatusTerminating;
-    private ComputationalStatusDTO computationalStatusDTOWithStatusFailed;
-    private ComputationalStatusDTO computationalStatusDTOWithStatusStopping;
-    private ComputationalStatusDTO computationalStatusDTOWithStatusStarting;
-    private SparkStandaloneClusterResource sparkClusterResource;
-    private UserComputationalResource ucResource;
-
-    @Mock
-    private ProjectService projectService;
-    @Mock
-    private ExploratoryDAO exploratoryDAO;
-    @Mock
-    private ComputationalDAO computationalDAO;
-	@Mock
-	private RESTService provisioningService;
-	@Mock
-	private SelfServiceApplicationConfiguration configuration;
-	@Mock
-	private RequestBuilder requestBuilder;
-	@Mock
-	private RequestId requestId;
-	@Mock
-	private TagService tagService;
-	@Mock
-	private EndpointService endpointService;
-
-	@InjectMocks
-	private ComputationalServiceImpl computationalService;
-
-	@Rule
-	public ExpectedException expectedException = ExpectedException.none();
-
-	@Before
-	public void setUp() {
-		userInfo = getUserInfo();
-		userInstance = getUserInstanceDto();
-		formList = getFormList();
-		computationalStatusDTOWithStatusTerminating = getComputationalStatusDTOWithStatus("terminating");
-		computationalStatusDTOWithStatusFailed = getComputationalStatusDTOWithStatus("failed");
-		computationalStatusDTOWithStatusStopping = getComputationalStatusDTOWithStatus("stopping");
-		computationalStatusDTOWithStatusStarting = getComputationalStatusDTOWithStatus("starting");
-		sparkClusterResource = getSparkClusterResource();
-		ucResource = getUserComputationalResource(STOPPED, DOCKER_DLAB_DATAENGINE);
-	}
-
-	@Test
-	public void createSparkCluster() {
-        ProjectDTO projectDTO = getProjectDTO();
-        when(projectService.get(anyString())).thenReturn(projectDTO);
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(computationalDAO.addComputational(anyString(), anyString(), anyString(),
-                any(SparkStandaloneClusterResource.class))).thenReturn(true);
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-
-        ComputationalBase compBaseMocked = mock(ComputationalBase.class);
-        when(requestBuilder.newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
-                any(UserInstanceDTO.class), any(SparkStandaloneClusterCreateForm.class), any(EndpointDTO.class)))
-                .thenReturn(compBaseMocked);
-        when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any())).thenReturn(UUID);
-        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
-
-        SparkStandaloneClusterCreateForm sparkClusterCreateForm = (SparkStandaloneClusterCreateForm) formList.get(0);
-        boolean creationResult =
-                computationalService.createSparkCluster(userInfo, sparkClusterCreateForm, PROJECT);
-        assertTrue(creationResult);
-
-        verify(projectService).get(PROJECT);
-        verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(sparkClusterResource));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verify(requestBuilder).newComputationalCreate(
-                refEq(userInfo), refEq(projectDTO), refEq(userInstance), refEq(sparkClusterCreateForm), refEq(endpointDTO()));
-
-        verify(provisioningService)
-                .post(endpointDTO().getUrl() + ComputationalAPI.COMPUTATIONAL_CREATE_SPARK, TOKEN, compBaseMocked,
-                        String.class);
-
-        verify(requestId).put(USER, UUID);
-        verifyNoMoreInteractions(projectService, configuration, computationalDAO, requestBuilder, provisioningService, requestId);
-    }
-
-    @Test
-    public void createSparkClusterWhenResourceAlreadyExists() {
-        when(computationalDAO.addComputational(anyString(), anyString(), anyString(),
-                any(SparkStandaloneClusterResource.class))).thenReturn(false);
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-
-
-        boolean creationResult = computationalService.createSparkCluster(userInfo, (SparkStandaloneClusterCreateForm) formList.get(0),
-                PROJECT);
-        assertFalse(creationResult);
-
-        verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(sparkClusterResource));
-        verifyNoMoreInteractions(configuration, computationalDAO);
-    }
-
-	@Test
-	public void createSparkClusterWhenMethodFetchExploratoryFieldsThrowsException() {
-        when(computationalDAO.addComputational(anyString(), anyString(), anyString(),
-                any(SparkStandaloneClusterResource.class))).thenReturn(true);
-        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
-                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
-
-        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
-                .thenReturn(mock(UpdateResult.class));
-
-        SparkStandaloneClusterCreateForm sparkClusterCreateForm = (SparkStandaloneClusterCreateForm) formList.get(0);
-        try {
-            computationalService.createSparkCluster(userInfo, sparkClusterCreateForm, PROJECT);
-        } catch (ResourceNotFoundException e) {
-            assertEquals("Exploratory for user with name not found", e.getMessage());
-        }
-
-        verify(computationalDAO, never()).addComputational(USER, EXPLORATORY_NAME, PROJECT, sparkClusterResource);
-        verify(computationalDAO, never()).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed,
-                "self"));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(configuration, computationalDAO, exploratoryDAO);
-    }
-
-	@Test
-	public void createSparkClusterWhenMethodNewComputationalCreateThrowsException() {
-        ProjectDTO projectDTO = getProjectDTO();
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(projectService.get(anyString())).thenReturn(projectDTO);
-        when(computationalDAO.addComputational(anyString(), anyString(), anyString(),
-                any(SparkStandaloneClusterResource.class))).thenReturn(true);
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-
-        doThrow(new DlabException("Cannot create instance of resource class "))
-                .when(requestBuilder).newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
-                any(UserInstanceDTO.class), any(SparkStandaloneClusterCreateForm.class), any(EndpointDTO.class));
-
-        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
-                .thenReturn(mock(UpdateResult.class));
-
-        SparkStandaloneClusterCreateForm sparkClusterCreateForm = (SparkStandaloneClusterCreateForm) formList.get(0);
-        try {
-            computationalService.createSparkCluster(userInfo, sparkClusterCreateForm, PROJECT);
-        } catch (DlabException e) {
-            assertEquals("Cannot create instance of resource class ", e.getMessage());
-        }
-        verify(projectService).get(PROJECT);
-        verify(computationalDAO).addComputational(USER, EXPLORATORY_NAME, PROJECT, sparkClusterResource);
-        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verify(requestBuilder).newComputationalCreate(userInfo, projectDTO, userInstance, sparkClusterCreateForm, endpointDTO());
-        verifyNoMoreInteractions(projectService, configuration, computationalDAO, exploratoryDAO, requestBuilder);
-    }
-
-	@Test
-	public void terminateComputationalEnvironment() {
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
-                .thenReturn(mock(UpdateResult.class));
-        String explId = "explId";
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-
-        String compId = "compId";
-        UserComputationalResource ucResource = new UserComputationalResource();
-        ucResource.setComputationalName(COMP_NAME);
-        ucResource.setImageName("dataengine-service");
-        ucResource.setComputationalId(compId);
-        when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString())).thenReturn(ucResource);
-
-        ComputationalTerminateDTO ctDto = new ComputationalTerminateDTO();
-        ctDto.setComputationalName(COMP_NAME);
-        ctDto.setExploratoryName(EXPLORATORY_NAME);
-        when(requestBuilder.newComputationalTerminate(any(UserInfo.class), any(UserInstanceDTO.class),
-                any(UserComputationalResource.class), any(EndpointDTO.class))).thenReturn(ctDto);
-
-        when(provisioningService.post(anyString(), anyString(), any(ComputationalTerminateDTO.class), any()))
-                .thenReturn(UUID);
-        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
-
-        computationalService.terminateComputational(userInfo, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-
-        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusTerminating, "self"));
-        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-
-        verify(requestBuilder).newComputationalTerminate(userInfo, userInstance, ucResource, endpointDTO());
-
-        verify(provisioningService).post(endpointDTO().getUrl() + ComputationalAPI.COMPUTATIONAL_TERMINATE_CLOUD_SPECIFIC, TOKEN, ctDto,
-                String.class);
-
-        verify(requestId).put(USER, UUID);
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(computationalDAO, exploratoryDAO, requestBuilder, provisioningService, requestId);
-    }
-
-	@Test
-	public void terminateComputationalEnvironmentWhenMethodUpdateComputationalStatusThrowsException() {
-		doThrow(new DlabException("Could not update computational resource status"))
-				.when(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusTerminating,
-				"self"));
-
-		when(computationalDAO.updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self")))
-				.thenReturn(mock(UpdateResult.class));
-
-        try {
-            computationalService.terminateComputational(userInfo, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-        } catch (DlabException e) {
-            assertEquals("Could not update computational resource status", e.getMessage());
-        }
-
-		verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusTerminating, "self"));
-		verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
-		verifyNoMoreInteractions(computationalDAO);
-	}
-
-	@Test
-	public void terminateComputationalEnvironmentWhenMethodFetchComputationalFieldsThrowsException() {
-        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
-                .thenReturn(mock(UpdateResult.class));
-
-        doThrow(new DlabException("Computational resource for user with exploratory name not found."))
-                .when(computationalDAO).fetchComputationalFields(anyString(), anyString(), anyString(), anyString());
-        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
-                .thenReturn(mock(UpdateResult.class));
-
-        try {
-            computationalService.terminateComputational(userInfo, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-        } catch (DlabException e) {
-            assertEquals("Computational resource for user with exploratory name not found.", e.getMessage());
-        }
-
-        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusTerminating, "self"));
-        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(computationalDAO, exploratoryDAO);
-    }
-
-	@Test
-	public void terminateComputationalEnvironmentWhenMethodNewComputationalTerminateThrowsException() {
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
-                .thenReturn(mock(UpdateResult.class));
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-
-        String compId = "compId";
-        UserComputationalResource ucResource = new UserComputationalResource();
-        ucResource.setComputationalName(COMP_NAME);
-        ucResource.setImageName("dataengine-service");
-        ucResource.setComputationalId(compId);
-        when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString())).thenReturn(ucResource);
-
-        doThrow(new DlabException("Cannot create instance of resource class "))
-                .when(requestBuilder).newComputationalTerminate(any(UserInfo.class), any(UserInstanceDTO.class),
-                any(UserComputationalResource.class), any(EndpointDTO.class));
-
-        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
-                .thenReturn(mock(UpdateResult.class));
-
-        try {
-            computationalService.terminateComputational(userInfo, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-        } catch (DlabException e) {
-            assertEquals("Cannot create instance of resource class ", e.getMessage());
-        }
-
-        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusTerminating, "self"));
-        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-
-        verify(requestBuilder).newComputationalTerminate(userInfo, userInstance, ucResource, endpointDTO());
-        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
-        verifyNoMoreInteractions(computationalDAO, exploratoryDAO, requestBuilder);
-    }
-
-	@Test
-	public void createDataEngineService() {
-        ProjectDTO projectDTO = getProjectDTO();
-        when(projectService.get(anyString())).thenReturn(projectDTO);
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(computationalDAO.addComputational(anyString(), anyString(), anyString(), any(UserComputationalResource.class)))
-                .thenReturn(true);
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-
-        ComputationalBase compBaseMocked = mock(ComputationalBase.class);
-        when(requestBuilder.newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
-                any(UserInstanceDTO.class), any(ComputationalCreateFormDTO.class), any(EndpointDTO.class)))
-                .thenReturn(compBaseMocked);
-
-        when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any())).thenReturn(UUID);
-        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
-
-        boolean creationResult =
-                computationalService.createDataEngineService(userInfo, formList.get(1), ucResource, PROJECT);
-        assertTrue(creationResult);
-
-        verify(projectService).get(PROJECT);
-
-        verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(ucResource));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-
-        verify(requestBuilder).newComputationalCreate(
-                refEq(userInfo), refEq(projectDTO), refEq(userInstance), any(ComputationalCreateFormDTO.class), refEq(endpointDTO()));
-
-        verify(provisioningService)
-                .post(endpointDTO().getUrl() + ComputationalAPI.COMPUTATIONAL_CREATE_CLOUD_SPECIFIC, TOKEN,
-                        compBaseMocked, String.class);
-
-        verify(requestId).put(USER, UUID);
-        verifyNoMoreInteractions(projectService, computationalDAO, exploratoryDAO, requestBuilder, provisioningService, requestId);
-    }
-
-	@Test
-	public void createDataEngineServiceWhenComputationalResourceNotAdded() {
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-        when(computationalDAO.addComputational(anyString(), anyString(), any(), any(UserComputationalResource.class)))
-                .thenReturn(false);
-
-        boolean creationResult = computationalService.createDataEngineService(userInfo, formList.get(1), ucResource,
-                PROJECT);
-        assertFalse(creationResult);
-
-        verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(ucResource));
-        verifyNoMoreInteractions(computationalDAO);
-    }
-
-	@Test
-	public void createDataEngineServiceWhenMethodFetchExploratoryFieldsThrowsException() {
-        when(computationalDAO.addComputational(anyString(), anyString(), anyString(), any(UserComputationalResource.class)))
-                .thenReturn(true);
-        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
-                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
-
-        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
-                .thenReturn(mock(UpdateResult.class));
-
-        try {
-            computationalService.createDataEngineService(userInfo, formList.get(1), ucResource, PROJECT);
-        } catch (DlabException e) {
-            assertEquals("Exploratory for user with name not found", e.getMessage());
-        }
-
-        verify(computationalDAO, never())
-                .addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(ucResource));
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-
-        verify(computationalDAO, never()).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed,
-                "self"));
-        verifyNoMoreInteractions(computationalDAO, exploratoryDAO);
-    }
-
-	@Test
-	public void createDataEngineServiceWhenMethodNewComputationalCreateThrowsException() {
-        ProjectDTO projectDTO = getProjectDTO();
-        when(projectService.get(anyString())).thenReturn(projectDTO);
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(computationalDAO.addComputational(anyString(), anyString(), any(), any(UserComputationalResource.class)))
-                .thenReturn(true);
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-
-        doThrow(new DlabException("Cannot create instance of resource class "))
-                .when(requestBuilder).newComputationalCreate(any(UserInfo.class), any(ProjectDTO.class),
-                any(UserInstanceDTO.class), any(ComputationalCreateFormDTO.class), any(EndpointDTO.class));
-
-        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
-                .thenReturn(mock(UpdateResult.class));
-
-        ComputationalCreateFormDTO computationalCreateFormDTO = formList.get(1);
-        try {
-            computationalService.createDataEngineService(userInfo, computationalCreateFormDTO, ucResource, PROJECT);
-        } catch (DlabException e) {
-            assertEquals("Could not send request for creation the computational resource compName: " +
-                    "Cannot create instance of resource class ", e.getMessage());
-        }
-
-        verify(projectService).get(PROJECT);
-        verify(computationalDAO).addComputational(eq(USER), eq(EXPLORATORY_NAME), eq(PROJECT), refEq(ucResource));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verify(requestBuilder).newComputationalCreate(
-                refEq(userInfo), refEq(projectDTO), refEq(userInstance), refEq(computationalCreateFormDTO), refEq(endpointDTO()));
-        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusFailed, "self"));
-
-        verifyNoMoreInteractions(projectService, computationalDAO, exploratoryDAO, requestBuilder);
-    }
-
-	@Test
-	public void stopSparkCluster() {
-        final UserInstanceDTO exploratory = getUserInstanceDto();
-        exploratory.setResources(singletonList(getUserComputationalResource(RUNNING, DOCKER_DLAB_DATAENGINE)));
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(exploratory);
-        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
-                .thenReturn(mock(UpdateResult.class));
-
-        ComputationalStopDTO computationalStopDTO = new ComputationalStopDTO();
-        when(requestBuilder.newComputationalStop(any(UserInfo.class), any(UserInstanceDTO.class), anyString(),
-                any(EndpointDTO.class))).thenReturn(computationalStopDTO);
-        when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any()))
-                .thenReturn("someUuid");
-        when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
-
-        computationalService.stopSparkCluster(userInfo, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-
-        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusStopping, "self"));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, true);
-        verify(requestBuilder).newComputationalStop(refEq(userInfo), refEq(exploratory), eq(COMP_NAME), refEq(endpointDTO()));
-        verify(provisioningService)
-                .post(eq(endpointDTO().getUrl() + "computational/stop/spark"), eq(TOKEN), refEq(computationalStopDTO),
-                        eq(String.class));
-        verify(requestId).put(USER, "someUuid");
-        verifyNoMoreInteractions(computationalDAO, exploratoryDAO, requestBuilder,
-                provisioningService, requestId);
-    }
-
-	@Test
-	public void stopSparkClusterWhenDataengineTypeIsAnother() {
-        final UserInstanceDTO exploratory = getUserInstanceDto();
-        exploratory.setResources(singletonList(getUserComputationalResource(RUNNING, DOCKER_DLAB_DATAENGINE_SERVICE)));
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(exploratory);
-        expectedException.expect(IllegalStateException.class);
-        expectedException.expectMessage("There is no running dataengine compName for exploratory expName");
-
-        computationalService.stopSparkCluster(userInfo, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-    }
-
-	@Test
-	public void startSparkCluster() {
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        final UserInstanceDTO exploratory = getUserInstanceDto();
-        exploratory.setResources(singletonList(getUserComputationalResource(STOPPED, DOCKER_DLAB_DATAENGINE)));
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(exploratory);
-        when(computationalDAO.updateComputationalStatus(any(ComputationalStatusDTO.class)))
-                .thenReturn(mock(UpdateResult.class));
-
-        ComputationalStartDTO computationalStartDTO = new ComputationalStartDTO();
-        when(requestBuilder.newComputationalStart(any(UserInfo.class), any(UserInstanceDTO.class), anyString(),
-                any(EndpointDTO.class))).thenReturn(computationalStartDTO);
-        when(provisioningService.post(anyString(), anyString(), any(ComputationalBase.class), any()))
-                .thenReturn("someUuid");
-        when(requestId.put(anyString(), anyString())).thenReturn("someUuid");
-
-        computationalService.startSparkCluster(userInfo, EXPLORATORY_NAME, COMP_NAME, PROJECT);
-
-        verify(computationalDAO).updateComputationalStatus(refEq(computationalStatusDTOWithStatusStarting, "self"));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, true);
-        verify(requestBuilder).newComputationalStart(refEq(userInfo), refEq(exploratory), eq(COMP_NAME), refEq(endpointDTO()));
-        verify(provisioningService)
-                .post(eq(endpointDTO().getUrl() + "computational/start/spark"), eq(TOKEN),
-                        refEq(computationalStartDTO),
-                        eq(String.class));
-        verify(requestId).put(USER, "someUuid");
-        verifyNoMoreInteractions(computationalDAO, exploratoryDAO, requestBuilder,
-                provisioningService, requestId);
-    }
-
-	@Test
-	public void startSparkClusterWhenDataengineStatusIsRunning() {
-        final UserInstanceDTO userInstanceDto = getUserInstanceDto();
-        userInstanceDto.setResources(singletonList(getUserComputationalResource(RUNNING,
-                DOCKER_DLAB_DATAENGINE_SERVICE)));
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(userInstanceDto);
-
-        expectedException.expect(IllegalStateException.class);
-        expectedException.expectMessage("There is no stopped dataengine compName for exploratory expName");
-
-        computationalService.startSparkCluster(userInfo, EXPLORATORY_NAME, COMP_NAME, PROJECT);
-    }
-
-	@Test
-	public void getComputationalResource() {
-        when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString())).thenReturn(ucResource);
-
-        Optional<UserComputationalResource> expectedResource = Optional.of(ucResource);
-        Optional<UserComputationalResource> actualResource =
-                computationalService.getComputationalResource(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-        assertEquals(expectedResource, actualResource);
-
-        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-        verifyNoMoreInteractions(computationalDAO);
-    }
-
-	@Test
-	public void getComputationalResourceWithException() {
-        doThrow(new DlabException("Computational resource not found"))
-                .when(computationalDAO).fetchComputationalFields(anyString(), anyString(), anyString(), anyString());
-
-        Optional<UserComputationalResource> expectedResource = Optional.empty();
-        Optional<UserComputationalResource> actualResource =
-                computationalService.getComputationalResource(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-        assertEquals(expectedResource, actualResource);
-
-        verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMP_NAME);
-        verifyNoMoreInteractions(computationalDAO);
-    }
-
-	@Test
-	public void testUpdateSparkClusterConfig() {
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        final ComputationalClusterConfigDTO clusterConfigDTO = new ComputationalClusterConfigDTO();
-        final UserInstanceDTO userInstanceDto = getUserInstanceDto();
-        final List<ClusterConfig> config = Collections.singletonList(new ClusterConfig());
-        userInstanceDto.setResources(Collections.singletonList(getUserComputationalResource(RUNNING, COMP_NAME)));
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(userInstanceDto);
-        when(requestBuilder.newClusterConfigUpdate(any(UserInfo.class), any(UserInstanceDTO.class),
-                any(UserComputationalResource.class), anyListOf(ClusterConfig.class), any(EndpointDTO.class)))
-                .thenReturn(clusterConfigDTO);
-        when(provisioningService.post(anyString(), anyString(), any(ComputationalClusterConfigDTO.class), any()))
-                .thenReturn("someUuid");
-        computationalService.updateSparkClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME,
-                COMP_NAME, config);
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, true);
-        verify(requestBuilder).newClusterConfigUpdate(refEq(getUserInfo()), refEq(userInstanceDto),
-                refEq(getUserComputationalResource(RUNNING, COMP_NAME)),
-                eq(Collections.singletonList(new ClusterConfig())), eq(endpointDTO()));
-        verify(requestId).put(USER, "someUuid");
-        verify(computationalDAO).updateComputationalFields(refEq(new ComputationalStatusDTO()
-                .withProject(PROJECT)
-                .withConfig(config)
-                .withUser(USER)
-                .withExploratoryName(EXPLORATORY_NAME)
-                .withComputationalName(COMP_NAME)
-                .withStatus(UserInstanceStatus.RECONFIGURING.toString()), "self"));
-        verify(provisioningService).post(eq(endpointDTO().getUrl() + "computational/spark/reconfigure"),
-                eq(getUserInfo().getAccessToken()),
-                refEq(new ComputationalClusterConfigDTO()), eq(String.class));
-
-    }
-
-	@Test
-	public void testUpdateSparkClusterConfigWhenClusterIsNotRunning() {
-        final UserInstanceDTO userInstanceDto = getUserInstanceDto();
-        final List<ClusterConfig> config = Collections.singletonList(new ClusterConfig());
-        userInstanceDto.setResources(Collections.singletonList(getUserComputationalResource(STOPPED, COMP_NAME)));
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(userInstanceDto);
-        try {
-            computationalService.updateSparkClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME,
-                    COMP_NAME, config);
-        } catch (ResourceNotFoundException e) {
-            assertEquals("Running computational resource with name compName for exploratory expName not found",
-                    e.getMessage());
-        }
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, true);
-        verifyNoMoreInteractions(exploratoryDAO);
-        verifyZeroInteractions(provisioningService, requestBuilder, requestId);
-
-    }
-
-	@Test
-	public void testUpdateSparkClusterConfigWhenClusterIsNotFound() {
-        final UserInstanceDTO userInstanceDto = getUserInstanceDto();
-        final List<ClusterConfig> config = Collections.singletonList(new ClusterConfig());
-        userInstanceDto.setResources(Collections.singletonList(getUserComputationalResource(STOPPED, COMP_NAME)));
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyBoolean())).thenReturn(userInstanceDto);
-        try {
-            computationalService.updateSparkClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME,
-                    COMP_NAME + "X", config);
-        } catch (ResourceNotFoundException e) {
-            assertEquals("Running computational resource with name compNameX for exploratory expName not found",
-                    e.getMessage());
-        }
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, true);
-        verifyNoMoreInteractions(exploratoryDAO);
-        verifyZeroInteractions(provisioningService, requestBuilder, requestId);
-
-    }
-
-	@Test
-	public void testGetClusterConfig() {
-        when(computationalDAO.getClusterConfig(anyString(), anyString(), anyString(), anyString())).thenReturn(Collections.singletonList(getClusterConfig()));
-
-        final List<ClusterConfig> clusterConfig = computationalService.getClusterConfig(getUserInfo(), PROJECT,
-                EXPLORATORY_NAME, COMP_NAME);
-        final ClusterConfig config = clusterConfig.get(0);
-
-        assertEquals(1, clusterConfig.size());
-        assertEquals("test", config.getClassification());
-        assertNull(config.getConfigurations());
-        assertNull(config.getProperties());
-    }
-
-
-	@Test
-	public void testGetClusterConfigWithException() {
-        when(computationalDAO.getClusterConfig(anyString(), anyString(), anyString(), anyString())).thenThrow(new RuntimeException(
-                "Exception"));
-
-        expectedException.expectMessage("Exception");
-        expectedException.expect(RuntimeException.class);
-        computationalService.getClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME, COMP_NAME);
-    }
-
-	private ClusterConfig getClusterConfig() {
-		final ClusterConfig config = new ClusterConfig();
-		config.setClassification("test");
-		return config;
-	}
-
-	private UserInfo getUserInfo() {
-		return new UserInfo(USER, TOKEN);
-	}
-
-	private UserInstanceDTO getUserInstanceDto() {
-		return new UserInstanceDTO().withUser(USER).withExploratoryName(EXPLORATORY_NAME)
-                .withExploratoryId("explId")
-                .withProject(PROJECT)
-				.withTags(Collections.emptyMap());
-	}
-
-	private List<ComputationalCreateFormDTO> getFormList() {
-        SparkStandaloneClusterCreateForm sparkClusterForm = new SparkStandaloneClusterCreateForm();
-        sparkClusterForm.setNotebookName(EXPLORATORY_NAME);
-        sparkClusterForm.setName(COMP_NAME);
-        sparkClusterForm.setProject(PROJECT);
-        sparkClusterForm.setDataEngineInstanceCount(String.valueOf(2));
-        sparkClusterForm.setImage("dataengine");
-        ComputationalCreateFormDTO desClusterForm = new ComputationalCreateFormDTO();
-        desClusterForm.setNotebookName(EXPLORATORY_NAME);
-        desClusterForm.setName(COMP_NAME);
-
-        return Arrays.asList(sparkClusterForm, desClusterForm);
-    }
-
-	private ComputationalStatusDTO getComputationalStatusDTOWithStatus(String status) {
-		return new ComputationalStatusDTO()
-                .withUser(USER)
-                .withProject(PROJECT)
-				.withExploratoryName(EXPLORATORY_NAME)
-				.withComputationalName(COMP_NAME)
-				.withStatus(UserInstanceStatus.of(status));
-	}
-
-	private SparkStandaloneClusterResource getSparkClusterResource() {
-		return SparkStandaloneClusterResource.builder()
-				.computationalName(COMP_NAME)
-				.imageName("dataengine")
-				.status(CREATING.toString())
-				.dataEngineInstanceCount(String.valueOf(2))
-				.tags(Collections.emptyMap())
-				.build();
-	}
-
-	private EndpointDTO endpointDTO() {
-		return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
-	}
-
-
-	private UserComputationalResource getUserComputationalResource(UserInstanceStatus status, String imageName) {
-		UserComputationalResource ucResource = new UserComputationalResource();
-		ucResource.setComputationalName(COMP_NAME);
-		ucResource.setImageName("dataengine");
-		ucResource.setImageName(imageName);
-		ucResource.setStatus(status.toString());
-		ucResource.setLastActivity(LAST_ACTIVITY);
-		ucResource.setComputationalId(COMP_ID);
-		ucResource.setTags(Collections.emptyMap());
-		final SchedulerJobDTO schedulerData = new SchedulerJobDTO();
-		schedulerData.setCheckInactivityRequired(true);
-		schedulerData.setMaxInactivity(MAX_INACTIVITY);
-		ucResource.setSchedulerData(schedulerData);
-		return ucResource;
-	}
-
-	private ProjectDTO getProjectDTO() {
-        return new ProjectDTO(PROJECT, Collections.emptySet(), "", "", null,
-                singletonList(new ProjectEndpointDTO("endpoint", UserInstanceStatus.RUNNING,
-                        new EdgeInfo())), true);
-    }
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java
deleted file mode 100644
index 460c2f9..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/EnvironmentServiceImplTest.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.EnvDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.UserSettingsDAO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
-import com.epam.dlab.backendapi.resources.dto.UserDTO;
-import com.epam.dlab.backendapi.service.ComputationalService;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.epam.dlab.exceptions.DlabException;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anySet;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.refEq;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class EnvironmentServiceImplTest {
-
-	private static final String USER = "test";
-	private static final String EXPLORATORY_NAME_1 = "expName1";
-	private static final String EXPLORATORY_NAME_2 = "expName2";
-	private static final String TOKEN = "token";
-	private static final String UUID = "213-12312-321";
-	private static final String PROJECT_NAME = "projectName";
-	private static final String ENDPOINT_NAME = "endpointName";
-	private static final String ADMIN = "admin";
-
-	@Mock
-	private EnvDAO envDAO;
-	@Mock
-	private ExploratoryDAO exploratoryDAO;
-	@Mock
-	private SecurityService securityService;
-	@Mock
-	private ExploratoryService exploratoryService;
-	@Mock
-	private ComputationalService computationalService;
-	@Mock
-	private UserSettingsDAO userSettingsDAO;
-	@Mock
-	private ProjectService projectService;
-
-	@InjectMocks
-	private EnvironmentServiceImpl environmentService;
-
-	@Rule
-	public ExpectedException expectedException = ExpectedException.none();
-
-	@Test
-	public void getActiveUsers() {
-		doReturn(Collections.singleton(USER)).when(envDAO).fetchActiveEnvUsers();
-		doReturn(Collections.singleton(USER + "2")).when(envDAO).fetchUsersNotIn(anySet());
-		when(userSettingsDAO.getAllowedBudget(anyString())).thenReturn(Optional.empty());
-		final List<UserDTO> activeUsers = environmentService.getUsers();
-
-		assertEquals(2, activeUsers.size());
-		assertEquals(USER, activeUsers.get(0).getName());
-		assertEquals(USER + "2", activeUsers.get(1).getName());
-
-		verify(userSettingsDAO).getAllowedBudget(USER);
-		verify(userSettingsDAO).getAllowedBudget(USER + "2");
-		verify(envDAO).fetchActiveEnvUsers();
-		verify(envDAO).fetchUsersNotIn(Collections.singleton(USER));
-		verifyNoMoreInteractions(envDAO);
-	}
-
-	@Test
-	public void getActiveUsersWithException() {
-		doThrow(new DlabException("Users not found")).when(envDAO).fetchActiveEnvUsers();
-
-		expectedException.expect(DlabException.class);
-		expectedException.expectMessage("Users not found");
-
-		environmentService.getUsers();
-	}
-
-
-	@Test
-	public void stopProjectEnvironment() {
-		final UserInfo userInfo = getUserInfo();
-		final ProjectDTO projectDTO = getProjectDTO();
-		when(exploratoryDAO.fetchRunningExploratoryFieldsForProject(anyString())).thenReturn(getUserInstances());
-		when(securityService.getServiceAccountInfo(anyString())).thenReturn(userInfo);
-		when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString())).thenReturn(UUID);
-		when(projectService.get(anyString())).thenReturn(projectDTO);
-		doNothing().when(projectService).stop(any(UserInfo.class), anyString(), anyString());
-
-		environmentService.stopProjectEnvironment(PROJECT_NAME);
-
-		verify(exploratoryDAO).fetchRunningExploratoryFieldsForProject(PROJECT_NAME);
-		verify(exploratoryService).stop(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1));
-		verify(exploratoryService).stop(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_2));
-		verify(securityService, times(2)).getServiceAccountInfo(USER);
-		verify(securityService).getServiceAccountInfo(ADMIN);
-		verify(projectService).get(eq(PROJECT_NAME));
-		verify(projectService).stop(refEq(userInfo), eq(ENDPOINT_NAME), eq(PROJECT_NAME));
-		verify(exploratoryDAO).fetchProjectExploratoriesWhereStatusIn(PROJECT_NAME, Arrays.asList(UserInstanceStatus.CREATING,
-				UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE),
-				UserInstanceStatus.CREATING, UserInstanceStatus.STARTING, UserInstanceStatus.CREATING_IMAGE);
-		verifyNoMoreInteractions(exploratoryDAO, exploratoryService, securityService, projectService);
-	}
-
-	@Test
-	public void stopExploratory() {
-		final UserInfo userInfo = getUserInfo();
-		when(exploratoryService.stop(any(UserInfo.class), anyString(), anyString())).thenReturn(UUID);
-
-		environmentService.stopExploratory(new UserInfo(USER, TOKEN), USER, PROJECT_NAME, EXPLORATORY_NAME_1);
-
-		verify(exploratoryService).stop(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1));
-		verifyNoMoreInteractions(securityService, exploratoryService);
-	}
-
-	@Test
-	public void stopComputational() {
-		final UserInfo userInfo = getUserInfo();
-		doNothing().when(computationalService).stopSparkCluster(any(UserInfo.class), anyString(), anyString(), anyString());
-
-		environmentService.stopComputational(userInfo, USER, PROJECT_NAME, EXPLORATORY_NAME_1, "compName");
-
-		verify(computationalService).stopSparkCluster(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1), eq("compName"));
-		verifyNoMoreInteractions(securityService, computationalService);
-	}
-
-	@Test
-	public void terminateExploratory() {
-		final UserInfo userInfo = getUserInfo();
-		when(exploratoryService.terminate(any(UserInfo.class), anyString(), anyString())).thenReturn(UUID);
-
-		environmentService.terminateExploratory(userInfo, USER, PROJECT_NAME, EXPLORATORY_NAME_1);
-
-		verify(exploratoryService).terminate(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1));
-		verifyNoMoreInteractions(securityService, exploratoryService);
-	}
-
-	@Test
-	public void terminateComputational() {
-		final UserInfo userInfo = getUserInfo();
-		doNothing().when(computationalService)
-				.terminateComputational(any(UserInfo.class), anyString(), anyString(), anyString());
-
-		environmentService.terminateComputational(userInfo, USER, PROJECT_NAME, EXPLORATORY_NAME_1, "compName");
-
-		verify(computationalService)
-				.terminateComputational(refEq(userInfo), eq(PROJECT_NAME), eq(EXPLORATORY_NAME_1), eq("compName"));
-		verifyNoMoreInteractions(securityService, computationalService);
-	}
-
-	private UserInfo getUserInfo() {
-		return new UserInfo(USER, TOKEN);
-	}
-
-	private List<UserInstanceDTO> getUserInstances() {
-		return Arrays.asList(
-				new UserInstanceDTO().withExploratoryName(EXPLORATORY_NAME_1).withUser(USER).withProject(PROJECT_NAME),
-				new UserInstanceDTO().withExploratoryName(EXPLORATORY_NAME_2).withUser(USER).withProject(PROJECT_NAME));
-	}
-
-	private ProjectDTO getProjectDTO() {
-		return new ProjectDTO(PROJECT_NAME, Collections.emptySet(), "", "", null,
-				Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING,
-						new EdgeInfo())), true);
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java
deleted file mode 100644
index 5d21167..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ExploratoryServiceImplTest.java
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ComputationalDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.GitCredsDAO;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.service.TagService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.StatusEnvBaseDTO;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.aws.computational.ClusterConfig;
-import com.epam.dlab.dto.base.edge.EdgeInfo;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.dto.exploratory.ExploratoryActionDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryCreateDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryReconfigureSparkClusterActionDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryStatusDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.model.exploratory.Exploratory;
-import com.epam.dlab.rest.client.RESTService;
-import com.mongodb.client.result.UpdateResult;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-
-import static java.util.Collections.singletonList;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyListOf;
-import static org.mockito.Mockito.anyMapOf;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.anyVararg;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.refEq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class ExploratoryServiceImplTest {
-
-    private final String USER = "test";
-    private final String TOKEN = "token";
-    private final String PROJECT = "project";
-    private final String EXPLORATORY_NAME = "expName";
-    private final String UUID = "1234-56789765-4321";
-    private static final String ENDPOINT_NAME = "endpointName";
-
-
-    private UserInfo userInfo;
-    private UserInstanceDTO userInstance;
-    private StatusEnvBaseDTO statusEnvBaseDTO;
-
-    @Mock
-    private ProjectService projectService;
-    @Mock
-    private ExploratoryDAO exploratoryDAO;
-    @Mock
-    private ComputationalDAO computationalDAO;
-    @Mock
-    private GitCredsDAO gitCredsDAO;
-    @Mock
-	private RESTService provisioningService;
-	@Mock
-	private RequestBuilder requestBuilder;
-	@Mock
-	private RequestId requestId;
-	@Mock
-	private TagService tagService;
-	@Mock
-	private EndpointService endpointService;
-
-	@InjectMocks
-	private ExploratoryServiceImpl exploratoryService;
-
-	@Rule
-	public ExpectedException expectedException = ExpectedException.none();
-
-	@Before
-	public void setUp() {
-		userInfo = getUserInfo();
-		userInstance = getUserInstanceDto();
-	}
-
-	@Test
-	public void start() {
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-
-        ExploratoryGitCredsDTO egcDtoMock = mock(ExploratoryGitCredsDTO.class);
-        when(gitCredsDAO.findGitCreds(anyString())).thenReturn(egcDtoMock);
-
-        ExploratoryActionDTO egcuDto = new ExploratoryGitCredsUpdateDTO();
-        egcuDto.withExploratoryName(EXPLORATORY_NAME);
-        when(requestBuilder.newExploratoryStart(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class),
-                any(ExploratoryGitCredsDTO.class))).thenReturn(egcuDto);
-
-        String exploratoryStart = "exploratory/start";
-        when(provisioningService.post(anyString(), anyString(), any(ExploratoryActionDTO.class), any()))
-                .thenReturn(UUID);
-        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
-
-        String uuid = exploratoryService.start(userInfo, EXPLORATORY_NAME, "project");
-        assertNotNull(uuid);
-        assertEquals(UUID, uuid);
-
-        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("starting");
-
-        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verify(provisioningService).post(endpointDTO().getUrl() + exploratoryStart, TOKEN, egcuDto, String.class);
-        verify(requestId).put(USER, UUID);
-        verifyNoMoreInteractions(exploratoryDAO, provisioningService, requestId);
-    }
-
-	@Test
-	public void startWhenMethodFetchExploratoryFieldsThrowsException() {
-        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
-        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
-                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
-        try {
-            exploratoryService.start(userInfo, EXPLORATORY_NAME, PROJECT);
-        } catch (DlabException e) {
-            assertEquals("Could not start exploratory environment expName: Exploratory for user with " +
-                    "name not found", e.getMessage());
-        }
-        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("starting");
-        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-
-        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("failed");
-        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void stop() {
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
-        when(computationalDAO.updateComputationalStatusesForExploratory(any(StatusEnvBaseDTO.class))).thenReturn(1);
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-
-        ExploratoryActionDTO eaDto = new ExploratoryActionDTO();
-        eaDto.withExploratoryName(EXPLORATORY_NAME);
-        when(requestBuilder.newExploratoryStop(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class)))
-                .thenReturn(eaDto);
-
-        String exploratoryStop = "exploratory/stop";
-        when(provisioningService.post(anyString(), anyString(), any(ExploratoryActionDTO.class), any())).thenReturn
-                (UUID);
-        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
-
-        String uuid = exploratoryService.stop(userInfo, PROJECT, EXPLORATORY_NAME);
-        assertNotNull(uuid);
-        assertEquals(UUID, uuid);
-
-        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("stopping");
-
-        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verify(provisioningService).post(endpointDTO().getUrl() + exploratoryStop, TOKEN, eaDto, String.class);
-        verify(computationalDAO).updateComputationalStatusesForExploratory(userInfo.getName(), PROJECT,
-                EXPLORATORY_NAME, UserInstanceStatus.STOPPING, UserInstanceStatus.TERMINATING,
-                UserInstanceStatus.FAILED, UserInstanceStatus.TERMINATED, UserInstanceStatus.STOPPED);
-        verify(requestId).put(USER, UUID);
-        verifyNoMoreInteractions(exploratoryDAO, provisioningService, requestId);
-    }
-
-	@Test
-	public void stopWhenMethodFetchExploratoryFieldsThrowsException() {
-        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
-        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
-                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
-        try {
-            exploratoryService.stop(userInfo, PROJECT, EXPLORATORY_NAME);
-        } catch (DlabException e) {
-            assertEquals("Could not stop exploratory environment expName: Exploratory for user with " +
-                    "name not found", e.getMessage());
-        }
-        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("stopping");
-        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-
-        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("failed");
-        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void terminate() {
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
-        when(computationalDAO.updateComputationalStatusesForExploratory(any(StatusEnvBaseDTO.class))).thenReturn(1);
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-
-        ExploratoryActionDTO eaDto = new ExploratoryActionDTO();
-        eaDto.withExploratoryName(EXPLORATORY_NAME);
-        when(requestBuilder.newExploratoryStop(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class)))
-                .thenReturn(eaDto);
-
-        String exploratoryTerminate = "exploratory/terminate";
-        when(provisioningService.post(anyString(), anyString(), any(ExploratoryActionDTO.class), any())).thenReturn
-                (UUID);
-        when(requestId.put(anyString(), anyString())).thenReturn(UUID);
-
-        String uuid = exploratoryService.terminate(userInfo, PROJECT, EXPLORATORY_NAME);
-        assertNotNull(uuid);
-        assertEquals(UUID, uuid);
-
-        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("terminating");
-
-        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verify(computationalDAO).updateComputationalStatusesForExploratory(USER, PROJECT, EXPLORATORY_NAME,
-                UserInstanceStatus.TERMINATING, UserInstanceStatus.TERMINATING, UserInstanceStatus.TERMINATED,
-                UserInstanceStatus.FAILED);
-        verify(requestBuilder).newExploratoryStop(userInfo, userInstance, endpointDTO());
-        verify(provisioningService).post(endpointDTO().getUrl() + exploratoryTerminate, TOKEN, eaDto, String.class);
-        verify(requestId).put(USER, UUID);
-        verifyNoMoreInteractions(exploratoryDAO, computationalDAO, requestBuilder, provisioningService, requestId);
-    }
-
-	@Test
-	public void terminateWhenMethodFetchExploratoryFieldsThrowsException() {
-        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
-        doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
-                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
-        try {
-            exploratoryService.terminate(userInfo, PROJECT, EXPLORATORY_NAME);
-        } catch (DlabException e) {
-            assertEquals("Could not terminate exploratory environment expName: Exploratory for user " +
-                    "with name not found", e.getMessage());
-        }
-        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("terminating");
-        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-
-        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("failed");
-        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void create() {
-		ProjectDTO projectDTO = getProjectDTO();
-		when(projectService.get(anyString())).thenReturn(projectDTO);
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-		doNothing().when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class));
-		ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
-		when(gitCredsDAO.findGitCreds(anyString())).thenReturn(egcDto);
-
-		ExploratoryCreateDTO ecDto = new ExploratoryCreateDTO();
-		Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).endpoint("test").build();
-		when(requestBuilder.newExploratoryCreate(any(ProjectDTO.class), any(EndpointDTO.class),
-				any(Exploratory.class), any(UserInfo.class), any(ExploratoryGitCredsDTO.class), anyMapOf(String.class, String.class))).thenReturn(ecDto);
-		String exploratoryCreate = "exploratory/create";
-		when(provisioningService.post(anyString(), anyString(), any(ExploratoryCreateDTO.class), any()))
-				.thenReturn(UUID);
-		when(requestId.put(anyString(), anyString())).thenReturn(UUID);
-
-		String uuid = exploratoryService.create(userInfo, exploratory, "project");
-		assertNotNull(uuid);
-		assertEquals(UUID, uuid);
-
-		userInstance.withStatus("creating");
-		userInstance.withResources(Collections.emptyList());
-		verify(projectService).get("project");
-		verify(exploratoryDAO).insertExploratory(userInstance);
-		verify(gitCredsDAO).findGitCreds(USER);
-		verify(requestBuilder).newExploratoryCreate(projectDTO, endpointDTO(), exploratory, userInfo, egcDto, Collections.emptyMap());
-		verify(provisioningService).post(endpointDTO().getUrl() + exploratoryCreate, TOKEN, ecDto, String.class);
-		verify(requestId).put(USER, UUID);
-		verifyNoMoreInteractions(projectService, exploratoryDAO, gitCredsDAO, requestBuilder, provisioningService, requestId);
-	}
-
-	@Test
-	public void createWhenMethodInsertExploratoryThrowsException() {
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-		doThrow(new RuntimeException("Exploratory for user with name not found"))
-				.when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class));
-		expectedException.expect(DlabException.class);
-		expectedException.expectMessage("Could not create exploratory environment expName for user test: " +
-				"Exploratory for user with name not found");
-
-		Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).build();
-		exploratoryService.create(userInfo, exploratory, "project");
-		verify(endpointService).get(anyString());
-	}
-
-	@Test
-	public void createWhenMethodInsertExploratoryThrowsExceptionWithItsCatching() {
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-		doThrow(new RuntimeException()).when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class));
-		Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).endpoint("test").build();
-		try {
-			exploratoryService.create(userInfo, exploratory, "project");
-		} catch (DlabException e) {
-			assertEquals("Could not create exploratory environment expName for user test: null",
-					e.getMessage());
-		}
-		userInstance.withStatus("creating");
-		userInstance.withResources(Collections.emptyList());
-		verify(exploratoryDAO).insertExploratory(userInstance);
-		verify(exploratoryDAO, never()).updateExploratoryStatus(any(StatusEnvBaseDTO.class));
-		verify(endpointService).get("test");
-		verifyNoMoreInteractions(exploratoryDAO);
-	}
-
-	@Test
-	public void createWhenMethodNewExploratoryCreateThrowsException() {
-		ProjectDTO projectDTO = getProjectDTO();
-		when(projectService.get(anyString())).thenReturn(projectDTO);
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-		doNothing().when(exploratoryDAO).insertExploratory(any(UserInstanceDTO.class));
-		ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
-		when(gitCredsDAO.findGitCreds(anyString())).thenReturn(egcDto);
-
-		Exploratory exploratory = Exploratory.builder().name(EXPLORATORY_NAME).endpoint("test").build();
-
-		doThrow(new DlabException("Cannot create instance of resource class ")).when(requestBuilder)
-				.newExploratoryCreate(any(ProjectDTO.class), any(EndpointDTO.class), any(Exploratory.class),
-						any(UserInfo.class), any(ExploratoryGitCredsDTO.class), anyMapOf(String.class, String.class));
-
-		when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
-		try {
-			exploratoryService.create(userInfo, exploratory, "project");
-		} catch (DlabException e) {
-			assertEquals("Could not create exploratory environment expName for user test: Cannot create instance " +
-					"of resource class ", e.getMessage());
-		}
-
-		statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("failed");
-
-		userInstance.withStatus("creating");
-		userInstance.withResources(Collections.emptyList());
-		verify(projectService).get("project");
-		verify(exploratoryDAO).insertExploratory(userInstance);
-		verify(exploratoryDAO).insertExploratory(userInstance);
-		verify(gitCredsDAO).findGitCreds(USER);
-		verify(requestBuilder).newExploratoryCreate(projectDTO, endpointDTO(), exploratory, userInfo, egcDto, Collections.emptyMap());
-		verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-		verifyNoMoreInteractions(projectService, exploratoryDAO, gitCredsDAO, requestBuilder);
-	}
-
-	@Test
-	public void updateProjectExploratoryStatuses() {
-        when(exploratoryDAO.fetchProjectExploratoriesWhereStatusNotIn(anyString(), anyString(), anyVararg()))
-                .thenReturn(singletonList(userInstance));
-        when(exploratoryDAO.updateExploratoryStatus(any(StatusEnvBaseDTO.class))).thenReturn(mock(UpdateResult.class));
-        doNothing().when(computationalDAO).updateComputationalStatusesForExploratory(anyString(), anyString(),
-                anyString(), any(UserInstanceStatus.class), any(UserInstanceStatus.class), anyVararg());
-
-        exploratoryService.updateProjectExploratoryStatuses("project", "endpoint",
-                UserInstanceStatus.TERMINATED);
-        statusEnvBaseDTO = getStatusEnvBaseDTOWithStatus("terminated");
-
-        verify(exploratoryDAO).fetchProjectExploratoriesWhereStatusNotIn("project", "endpoint",
-                UserInstanceStatus.TERMINATED, UserInstanceStatus.FAILED);
-        verify(exploratoryDAO).updateExploratoryStatus(refEq(statusEnvBaseDTO, "self"));
-        verify(computationalDAO).updateComputationalStatusesForExploratory(USER, PROJECT,
-                EXPLORATORY_NAME, UserInstanceStatus.TERMINATED, UserInstanceStatus.TERMINATED,
-                UserInstanceStatus.TERMINATED, UserInstanceStatus.FAILED);
-
-        verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
-    }
-
-	@Test
-	public void getUserInstance() {
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-
-        Optional<UserInstanceDTO> expectedInstance = Optional.of(userInstance);
-        Optional<UserInstanceDTO> actualInstance = exploratoryService.getUserInstance(USER, PROJECT, EXPLORATORY_NAME);
-        assertEquals(expectedInstance, actualInstance);
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void getUserInstanceWithException() {
-        doThrow(new ResourceNotFoundException("Exploratory for user not found"))
-                .when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
-
-        Optional<UserInstanceDTO> expectedInstance = Optional.empty();
-        Optional<UserInstanceDTO> actualInstance = exploratoryService.getUserInstance(USER, PROJECT, EXPLORATORY_NAME);
-        assertEquals(expectedInstance, actualInstance);
-
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void testUpdateExploratoryClusterConfig() {
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        when(requestBuilder.newClusterConfigUpdate(any(UserInfo.class), any(UserInstanceDTO.class),
-                anyListOf(ClusterConfig.class), any(EndpointDTO.class))).thenReturn(new ExploratoryReconfigureSparkClusterActionDTO());
-        when(provisioningService.post(anyString(), anyString(), any(ExploratoryReconfigureSparkClusterActionDTO.class)
-                , any())).thenReturn(UUID);
-
-        exploratoryService.updateClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME, singletonList(new ClusterConfig()));
-
-        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verify(requestBuilder).newClusterConfigUpdate(refEq(getUserInfo()), refEq(getUserInstanceDto()),
-                refEq(singletonList(new ClusterConfig())), refEq(endpointDTO()));
-        verify(requestId).put(USER, UUID);
-        verify(provisioningService).post(eq(endpointDTO().getUrl() + "exploratory/reconfigure_spark"), eq(TOKEN),
-                refEq(new ExploratoryReconfigureSparkClusterActionDTO(), "self"), eq(String.class));
-        verify(exploratoryDAO).updateExploratoryFields(refEq(new ExploratoryStatusDTO()
-                .withUser(USER)
-                .withProject(PROJECT)
-                .withConfig(singletonList(new ClusterConfig()))
-                .withStatus(UserInstanceStatus.RECONFIGURING.toString())
-                .withExploratoryName(EXPLORATORY_NAME), "self"));
-        verifyNoMoreInteractions(requestBuilder, requestId, exploratoryDAO, provisioningService);
-    }
-
-	@Test
-	public void testUpdateExploratoryClusterConfigWhenNotRunning() {
-
-        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenThrow(new ResourceNotFoundException("EXCEPTION"));
-
-        try {
-
-            exploratoryService.updateClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME,
-                    singletonList(new ClusterConfig()));
-        } catch (ResourceNotFoundException e) {
-            assertEquals("EXCEPTION", e.getMessage());
-        }
-
-        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(exploratoryDAO);
-        verifyZeroInteractions(requestBuilder, requestId, provisioningService);
-    }
-
-	@Test
-	public void testGetClusterConfig() {
-        when(exploratoryDAO.getClusterConfig(anyString(), anyString(), anyString())).thenReturn(Collections.singletonList(getClusterConfig()));
-        final List<ClusterConfig> clusterConfig = exploratoryService.getClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME);
-
-        assertEquals(1, clusterConfig.size());
-        assertEquals("classification", clusterConfig.get(0).getClassification());
-
-        verify(exploratoryDAO).getClusterConfig(getUserInfo().getName(), PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(exploratoryDAO);
-    }
-
-	@Test
-	public void testGetClusterConfigWithException() {
-        when(exploratoryDAO.getClusterConfig(anyString(), anyString(), anyString())).thenThrow(new RuntimeException("Exception"));
-
-        expectedException.expect(RuntimeException.class);
-        expectedException.expectMessage("Exception");
-        exploratoryService.getClusterConfig(getUserInfo(), PROJECT, EXPLORATORY_NAME);
-    }
-
-	private ClusterConfig getClusterConfig() {
-		final ClusterConfig config = new ClusterConfig();
-		config.setClassification("classification");
-		return config;
-	}
-
-	private UserInfo getUserInfo() {
-		return new UserInfo(USER, TOKEN);
-	}
-
-	private UserInstanceDTO getUserInstanceDto() {
-        UserComputationalResource compResource = new UserComputationalResource();
-        compResource.setImageName("YYYY.dataengine");
-        compResource.setComputationalName("compName");
-        compResource.setStatus("stopped");
-        compResource.setComputationalId("compId");
-        return new UserInstanceDTO()
-                .withUser(USER)
-                .withExploratoryName(EXPLORATORY_NAME)
-                .withStatus("running")
-                .withResources(singletonList(compResource))
-                .withTags(Collections.emptyMap())
-                .withProject(PROJECT)
-                .withEndpoint("test")
-                .withCloudProvider(CloudProvider.AWS.toString());
-    }
-
-	private StatusEnvBaseDTO getStatusEnvBaseDTOWithStatus(String status) {
-		return new ExploratoryStatusDTO()
-                .withProject(PROJECT)
-				.withUser(USER)
-				.withExploratoryName(EXPLORATORY_NAME)
-				.withStatus(status);
-	}
-
-	private EndpointDTO endpointDTO() {
-		return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
-	}
-
-	private ProjectDTO getProjectDTO() {
-		return new ProjectDTO("project", Collections.emptySet(), "", "", null,
-				singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING,
-						new EdgeInfo())), true);
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/GitCredentialServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/GitCredentialServiceImplTest.java
deleted file mode 100644
index 8b8acaa..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/GitCredentialServiceImplTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.GitCredsDAO;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryGitCredsUpdateDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.Collections;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class GitCredentialServiceImplTest {
-
-	private final String USER = "test";
-
-	@Mock
-	private GitCredsDAO gitCredsDAO;
-	@Mock
-	private ExploratoryDAO exploratoryDAO;
-	@Mock
-	private RESTService provisioningService;
-	@Mock
-	private RequestBuilder requestBuilder;
-	@Mock
-	private RequestId requestId;
-	@Mock
-	private EndpointService endpointService;
-
-	@InjectMocks
-	private GitCredentialServiceImpl gitCredentialService;
-
-	@Test
-	public void updateGitCredentials() {
-		String token = "token";
-		UserInfo userInfo = new UserInfo(USER, token);
-		doNothing().when(gitCredsDAO).updateGitCreds(anyString(), any(ExploratoryGitCredsDTO.class));
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-
-		String exploratoryName = "explName";
-		UserInstanceDTO uiDto = new UserInstanceDTO().withExploratoryName(exploratoryName).withUser(USER);
-		when(exploratoryDAO.fetchRunningExploratoryFields(anyString())).thenReturn(Collections.singletonList(uiDto));
-
-		ExploratoryGitCredsUpdateDTO egcuDto = new ExploratoryGitCredsUpdateDTO().withExploratoryName(exploratoryName);
-		when(requestBuilder.newGitCredentialsUpdate(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class),
-				any(ExploratoryGitCredsDTO.class))).thenReturn(egcuDto);
-
-		String uuid = "someUuid";
-		when(provisioningService.post(anyString(), anyString(), any(ExploratoryGitCredsUpdateDTO.class), any()))
-				.thenReturn(uuid);
-		when(requestId.put(anyString(), anyString())).thenReturn(uuid);
-
-		ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
-		gitCredentialService.updateGitCredentials(userInfo, egcDto);
-
-		verify(gitCredsDAO).updateGitCreds(USER, egcDto);
-		verify(exploratoryDAO).fetchRunningExploratoryFields(USER);
-		verify(requestBuilder).newGitCredentialsUpdate(userInfo, uiDto, endpointDTO(), egcDto);
-		verify(provisioningService).post(endpointDTO().getUrl() + "exploratory/git_creds", token, egcuDto,
-				String.class);
-		verify(requestId).put(USER, uuid);
-		verifyNoMoreInteractions(gitCredsDAO, exploratoryDAO, requestBuilder, provisioningService, requestId);
-	}
-
-	@Test
-	public void updateGitCredentialsWhenMethodUpdateGitCredsThrowsException() {
-		String token = "token";
-		UserInfo userInfo = new UserInfo(USER, token);
-		doThrow(new NullPointerException())
-				.when(gitCredsDAO).updateGitCreds(anyString(), any(ExploratoryGitCredsDTO.class));
-
-		ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
-		try {
-			gitCredentialService.updateGitCredentials(userInfo, egcDto);
-		} catch (DlabException e) {
-			assertEquals("Cannot update the GIT credentials: null", e.getMessage());
-		}
-
-		verify(gitCredsDAO).updateGitCreds(USER, egcDto);
-		verifyNoMoreInteractions(gitCredsDAO);
-	}
-
-	@Test
-	public void updateGitCredentialsWithFailedNotebooks() {
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-		String token = "token";
-		UserInfo userInfo = new UserInfo(USER, token);
-		doNothing().when(gitCredsDAO).updateGitCreds(anyString(), any(ExploratoryGitCredsDTO.class));
-
-		String exploratoryName = "explName";
-		UserInstanceDTO uiDto = new UserInstanceDTO().withExploratoryName(exploratoryName).withUser(USER);
-		when(exploratoryDAO.fetchRunningExploratoryFields(anyString())).thenReturn(Collections.singletonList(uiDto));
-
-		doThrow(new DlabException("Cannot create instance of resource class "))
-				.when(requestBuilder).newGitCredentialsUpdate(any(UserInfo.class), any(UserInstanceDTO.class),
-				any(EndpointDTO.class), any(ExploratoryGitCredsDTO.class));
-
-		ExploratoryGitCredsDTO egcDto = new ExploratoryGitCredsDTO();
-		try {
-			gitCredentialService.updateGitCredentials(userInfo, egcDto);
-		} catch (DlabException e) {
-			assertEquals("Cannot update the GIT credentials: Requests for notebooks failed: explName",
-					e.getMessage());
-		}
-
-		verify(gitCredsDAO).updateGitCreds(USER, egcDto);
-		verify(exploratoryDAO).fetchRunningExploratoryFields(USER);
-		verify(requestBuilder).newGitCredentialsUpdate(userInfo, uiDto, endpointDTO(), egcDto);
-		verifyNoMoreInteractions(gitCredsDAO, exploratoryDAO, requestBuilder);
-	}
-
-	@Test
-	public void getGitCredentials() {
-		ExploratoryGitCredsDTO expectedEgcDto = new ExploratoryGitCredsDTO();
-		when(gitCredsDAO.findGitCreds(anyString(), anyBoolean())).thenReturn(expectedEgcDto);
-
-		ExploratoryGitCredsDTO actualEgcDto = gitCredentialService.getGitCredentials(USER);
-		assertNotNull(actualEgcDto);
-		assertEquals(expectedEgcDto, actualEgcDto);
-
-		verify(gitCredsDAO).findGitCreds(USER, true);
-		verifyNoMoreInteractions(gitCredsDAO);
-	}
-
-	@Test
-	public void getGitCredentialsWhenMethodFindGitCredsThrowsException() {
-		doThrow(new NullPointerException()).when(gitCredsDAO).findGitCreds(anyString(), anyBoolean());
-		try {
-			gitCredentialService.getGitCredentials(USER);
-		} catch (DlabException e) {
-			assertEquals("Cannot load GIT credentials for user test: null", e.getMessage());
-		}
-		verify(gitCredsDAO).findGitCreds(USER, true);
-		verifyNoMoreInteractions(gitCredsDAO);
-	}
-
-	private EndpointDTO endpointDTO() {
-		return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImplTest.java
deleted file mode 100644
index e15044b..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ImageExploratoryServiceImplTest.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryLibDAO;
-import com.epam.dlab.backendapi.dao.ImageExploratoryDao;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.resources.dto.ImageInfoRecord;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.service.ProjectService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryImageDTO;
-import com.epam.dlab.dto.exploratory.ExploratoryStatusDTO;
-import com.epam.dlab.dto.exploratory.ImageStatus;
-import com.epam.dlab.dto.exploratory.LibStatus;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.exceptions.ResourceAlreadyExistException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.model.ResourceType;
-import com.epam.dlab.model.exploratory.Image;
-import com.epam.dlab.model.library.Library;
-import com.epam.dlab.rest.client.RESTService;
-import com.mongodb.client.result.UpdateResult;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.anyVararg;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class ImageExploratoryServiceImplTest {
-
-	private final String USER = "test";
-	private final String TOKEN = "token";
-	private final String EXPLORATORY_NAME = "expName";
-	private final String PROJECT = "project";
-
-	private UserInfo userInfo;
-	private UserInstanceDTO userInstance;
-	private Image image;
-
-	@Mock
-	private ExploratoryDAO exploratoryDAO;
-	@Mock
-	private ImageExploratoryDao imageExploratoryDao;
-	@Mock
-	private ExploratoryLibDAO libDAO;
-	@Mock
-	private RESTService provisioningService;
-	@Mock
-	private RequestBuilder requestBuilder;
-	@Mock
-	private EndpointService endpointService;
-	@Mock
-	private ProjectService projectService;
-
-	@InjectMocks
-	private ImageExploratoryServiceImpl imageExploratoryService;
-
-	@Rule
-	public ExpectedException expectedException = ExpectedException.none();
-
-	@Before
-	public void setUp() {
-		userInfo = getUserInfo();
-		userInstance = getUserInstanceDto();
-		image = fetchImage();
-	}
-
-	@Test
-	public void createImage() {
-		when(projectService.get(anyString())).thenReturn(getProjectDTO());
-		when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		when(imageExploratoryDao.exist(anyString(), anyString())).thenReturn(false);
-
-		when(libDAO.getLibraries(anyString(), anyString(), anyString())).thenReturn(Collections.singletonList(getLibrary()));
-		doNothing().when(imageExploratoryDao).save(any(Image.class));
-		when(exploratoryDAO.updateExploratoryStatus(any(ExploratoryStatusDTO.class)))
-				.thenReturn(mock(UpdateResult.class));
-		ExploratoryImageDTO eiDto = new ExploratoryImageDTO();
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-		when(requestBuilder.newExploratoryImageCreate(any(UserInfo.class), any(UserInstanceDTO.class), anyString(),
-				any(EndpointDTO.class), any(ProjectDTO.class))).thenReturn(eiDto);
-
-		String expectedUuid = "someUuid";
-		when(provisioningService.post(anyString(), anyString(), any(ExploratoryImageDTO.class), any()))
-				.thenReturn(expectedUuid);
-
-		String imageName = "someImageName", imageDescription = "someDescription";
-		String actualUuid = imageExploratoryService.createImage(userInfo, PROJECT, EXPLORATORY_NAME,
-				imageName, imageDescription);
-		assertNotNull(actualUuid);
-		assertEquals(expectedUuid, actualUuid);
-
-		verify(projectService).get(PROJECT);
-		verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
-		verify(imageExploratoryDao).exist(imageName, PROJECT);
-		verify(imageExploratoryDao).save(any(Image.class));
-		verify(libDAO).getLibraries(USER, PROJECT, EXPLORATORY_NAME);
-		verify(requestBuilder).newExploratoryImageCreate(userInfo, userInstance, imageName, endpointDTO(), getProjectDTO());
-		verify(endpointService).get(anyString());
-		verify(provisioningService).post(endpointDTO().getUrl() + "exploratory/image", TOKEN, eiDto, String.class);
-		verifyNoMoreInteractions(projectService, exploratoryDAO, imageExploratoryDao, libDAO, requestBuilder, endpointService, provisioningService);
-	}
-
-	@Test
-	public void createImageWhenMethodFetchRunningExploratoryFieldsThrowsException() {
-		doThrow(new DlabException("Running exploratory instance for user with name not found."))
-				.when(exploratoryDAO).fetchRunningExploratoryFields(anyString(), anyString(), anyString());
-
-		String imageName = "someImageName", imageDescription = "someDescription";
-
-		try {
-			imageExploratoryService.createImage(userInfo, PROJECT, EXPLORATORY_NAME, imageName, imageDescription);
-		} catch (DlabException e) {
-			assertEquals("Running exploratory instance for user with name not found.", e.getMessage());
-		}
-		verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verifyNoMoreInteractions(exploratoryDAO);
-	}
-
-	@Test
-	public void createImageWhenResourceAlreadyExists() {
-		when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		when(imageExploratoryDao.exist(anyString(), anyString())).thenReturn(true);
-
-		expectedException.expect(ResourceAlreadyExistException.class);
-		expectedException.expectMessage("Image with name someImageName is already exist");
-
-		String imageName = "someImageName", imageDescription = "someDescription";
-		imageExploratoryService.createImage(userInfo, PROJECT, EXPLORATORY_NAME, imageName, imageDescription);
-	}
-
-	@Test
-	public void createImageWhenMethodNewExploratoryImageCreateThrowsException() {
-		when(projectService.get(anyString())).thenReturn(getProjectDTO());
-		when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		when(imageExploratoryDao.exist(anyString(), anyString())).thenReturn(false);
-
-		when(libDAO.getLibraries(anyString(), anyString(), anyString())).thenReturn(Collections.singletonList(getLibrary()));
-		doNothing().when(imageExploratoryDao).save(any(Image.class));
-		when(exploratoryDAO.updateExploratoryStatus(any(ExploratoryStatusDTO.class)))
-				.thenReturn(mock(UpdateResult.class));
-		doThrow(new DlabException("Cannot create instance of resource class")).when(requestBuilder)
-				.newExploratoryImageCreate(any(UserInfo.class), any(UserInstanceDTO.class), anyString(), any(EndpointDTO.class), any(ProjectDTO.class));
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-
-		String imageName = "someImageName", imageDescription = "someDescription";
-		try {
-			imageExploratoryService.createImage(userInfo, PROJECT, EXPLORATORY_NAME, imageName, imageDescription);
-		} catch (DlabException e) {
-			assertEquals("Cannot create instance of resource class", e.getMessage());
-		}
-
-		verify(projectService).get(PROJECT);
-		verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
-		verify(imageExploratoryDao).exist(imageName, PROJECT);
-		verify(imageExploratoryDao).save(any(Image.class));
-		verify(libDAO).getLibraries(USER, PROJECT, EXPLORATORY_NAME);
-		verify(requestBuilder).newExploratoryImageCreate(userInfo, userInstance, imageName, endpointDTO(), getProjectDTO());
-		verify(endpointService).get(anyString());
-		verifyNoMoreInteractions(projectService, exploratoryDAO, imageExploratoryDao, libDAO, requestBuilder, endpointService);
-	}
-
-	@Test
-	public void finishImageCreate() {
-		when(exploratoryDAO.updateExploratoryStatus(any(ExploratoryStatusDTO.class)))
-				.thenReturn(mock(UpdateResult.class));
-		doNothing().when(imageExploratoryDao).updateImageFields(any(Image.class));
-		doNothing().when(exploratoryDAO).updateExploratoryIp(anyString(), anyString(), anyString(), anyString());
-
-		String notebookIp = "someIp";
-		imageExploratoryService.finishImageCreate(image, EXPLORATORY_NAME, notebookIp);
-
-		verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
-		verify(exploratoryDAO).updateExploratoryIp(USER, PROJECT, notebookIp, EXPLORATORY_NAME);
-		verify(imageExploratoryDao).updateImageFields(image);
-		verifyNoMoreInteractions(exploratoryDAO, imageExploratoryDao);
-	}
-
-	@Test
-	public void finishImageCreateWhenMethodUpdateExploratoryIpThrowsException() {
-		when(exploratoryDAO.updateExploratoryStatus(any(ExploratoryStatusDTO.class)))
-				.thenReturn(mock(UpdateResult.class));
-		doNothing().when(imageExploratoryDao).updateImageFields(any(Image.class));
-		doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
-				.when(exploratoryDAO).updateExploratoryIp(anyString(), anyString(), anyString(), anyString());
-
-		String notebookIp = "someIp";
-		try {
-			imageExploratoryService.finishImageCreate(image, EXPLORATORY_NAME, notebookIp);
-		} catch (ResourceNotFoundException e) {
-			assertEquals("Exploratory for user with name not found", e.getMessage());
-		}
-
-		verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
-		verify(exploratoryDAO).updateExploratoryIp(USER, PROJECT, notebookIp, EXPLORATORY_NAME);
-		verify(imageExploratoryDao).updateImageFields(image);
-		verifyNoMoreInteractions(exploratoryDAO, imageExploratoryDao);
-	}
-
-	@Test
-	public void finishImageCreateWhenNotebookIpIsNull() {
-		when(exploratoryDAO.updateExploratoryStatus(any(ExploratoryStatusDTO.class)))
-				.thenReturn(mock(UpdateResult.class));
-		doNothing().when(imageExploratoryDao).updateImageFields(any(Image.class));
-
-		imageExploratoryService.finishImageCreate(image, EXPLORATORY_NAME, null);
-
-		verify(exploratoryDAO).updateExploratoryStatus(any(ExploratoryStatusDTO.class));
-		verify(exploratoryDAO, never()).updateExploratoryIp(USER, PROJECT, null, EXPLORATORY_NAME);
-		verify(imageExploratoryDao).updateImageFields(image);
-		verifyNoMoreInteractions(exploratoryDAO, imageExploratoryDao);
-	}
-
-	@Test
-	public void getCreatedImages() {
-		ImageInfoRecord imageInfoRecord = getImageInfoRecord();
-		List<ImageInfoRecord> expectedRecordList = Collections.singletonList(imageInfoRecord);
-		when(imageExploratoryDao.getImages(anyString(), anyString(), anyString(), anyString(), anyVararg()))
-				.thenReturn(expectedRecordList);
-
-		List<ImageInfoRecord> actualRecordList = imageExploratoryService.getNotFailedImages(USER,
-				"someImage", "someProject", "someEndpoint");
-		assertNotNull(actualRecordList);
-		assertEquals(1, actualRecordList.size());
-		assertEquals(expectedRecordList, actualRecordList);
-
-		verify(imageExploratoryDao).getImages(USER, "someImage", "someProject", "someEndpoint", ImageStatus.CREATED, ImageStatus.CREATING);
-		verifyNoMoreInteractions(imageExploratoryDao);
-	}
-
-	@Test
-	public void getImage() {
-		ImageInfoRecord expectedImageInfoRecord = getImageInfoRecord();
-		when(imageExploratoryDao.getImage(anyString(), anyString(), anyString(), anyString()))
-				.thenReturn(Optional.of(expectedImageInfoRecord));
-
-		ImageInfoRecord actualImageInfoRecord = imageExploratoryService.getImage(USER, "someName", "someProject", "someEndpoint");
-		assertNotNull(actualImageInfoRecord);
-		assertEquals(expectedImageInfoRecord, actualImageInfoRecord);
-
-		verify(imageExploratoryDao).getImage(USER, "someName", "someProject", "someEndpoint");
-		verifyNoMoreInteractions(imageExploratoryDao);
-	}
-
-	@Test
-	public void getImageWhenMethodGetImageReturnsOptionalEmpty() {
-		when(imageExploratoryDao.getImage(anyString(), anyString(), anyString(), anyString())).thenReturn(Optional.empty());
-		expectedException.expect(ResourceNotFoundException.class);
-		expectedException.expectMessage(String.format("Image with name %s was not found for user %s",
-				"someImageName", USER));
-		imageExploratoryService.getImage(USER, "someImageName", "someProject", "someEndpoint");
-	}
-
-	@Test
-	public void getImagesForProject() {
-		when(imageExploratoryDao.getImagesForProject(anyString())).thenReturn(Collections.singletonList(getImageInfoRecord()));
-
-		imageExploratoryService.getImagesForProject(PROJECT);
-
-		verify(imageExploratoryDao).getImagesForProject(PROJECT);
-		verifyNoMoreInteractions(imageExploratoryDao);
-	}
-
-	private ImageInfoRecord getImageInfoRecord() {
-		return new ImageInfoRecord("someName", "someDescription", "someProject", "someEndpoint", "someUser", "someApp",
-				"someFullName", ImageStatus.CREATED);
-	}
-
-	private Image fetchImage() {
-		return Image.builder()
-				.name("someImageName")
-				.description("someDescription")
-				.status(ImageStatus.CREATING)
-				.user(USER)
-				.project(PROJECT)
-				.libraries(Collections.singletonList(getLibrary()))
-				.computationalLibraries(Collections.emptyMap())
-				.dockerImage("someImageName")
-				.exploratoryId("explId").build();
-	}
-
-	private Library getLibrary() {
-		return new Library("someGroup", "someName", "someVersion", LibStatus.INSTALLED,
-				"someErrorMessage").withType(ResourceType.EXPLORATORY);
-	}
-
-	private UserInstanceDTO getUserInstanceDto() {
-		return new UserInstanceDTO()
-				.withUser(USER)
-				.withExploratoryName(EXPLORATORY_NAME)
-				.withExploratoryId("explId")
-				.withProject(PROJECT);
-	}
-
-	private UserInfo getUserInfo() {
-		return new UserInfo(USER, TOKEN);
-	}
-
-	private EndpointDTO endpointDTO() {
-		return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
-	}
-
-	private ProjectDTO getProjectDTO() {
-		return ProjectDTO.builder().name(PROJECT).build();
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
deleted file mode 100644
index 56c838a..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/InfrastructureTemplateServiceBaseTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.ProjectDAO;
-import com.epam.dlab.backendapi.dao.SettingsDAO;
-import com.epam.dlab.backendapi.dao.UserGroupDao;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.base.computational.FullComputationalTemplate;
-import com.epam.dlab.dto.imagemetadata.ComputationalMetadataDTO;
-import com.epam.dlab.dto.imagemetadata.ComputationalResourceShapeDto;
-import com.epam.dlab.dto.imagemetadata.ExploratoryMetadataDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.lang.reflect.Field;
-import java.util.*;
-import java.util.stream.Collectors;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class InfrastructureTemplateServiceBaseTest {
-
-	@Mock
-	private SettingsDAO settingsDAO;
-	@Mock
-	private RESTService provisioningService;
-	@Mock
-	private ProjectDAO projectDAO;
-	@Mock
-	private EndpointService endpointService;
-	@Mock
-	private UserGroupDao userGroupDao;
-	@Mock
-	private SelfServiceApplicationConfiguration configuration;
-
-	@InjectMocks
-	private InfrastructureTemplateServiceBaseChild infrastructureTemplateServiceBaseChild =
-			new InfrastructureTemplateServiceBaseChild();
-
-	@Test
-	public void getExploratoryTemplates() {
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-		ExploratoryMetadataDTO emDto1 = new ExploratoryMetadataDTO("someImage1");
-		HashMap<String, List<ComputationalResourceShapeDto>> shapes1 = new HashMap<>();
-		shapes1.put("Memory optimized", Arrays.asList(
-				new ComputationalResourceShapeDto("Standard_E4s_v3", "someSize", "someDescription",
-						"someRam", 2),
-				new ComputationalResourceShapeDto("Standard_E32s_v3", "someSize2", "someDescription2",
-						"someRam2", 5)));
-		emDto1.setExploratoryEnvironmentShapes(shapes1);
-
-		ExploratoryMetadataDTO emDto2 = new ExploratoryMetadataDTO("someImage2");
-		HashMap<String, List<ComputationalResourceShapeDto>> shapes2 = new HashMap<>();
-		shapes2.put("Compute optimized", Arrays.asList(
-				new ComputationalResourceShapeDto("Standard_F2s", "someSize", "someDescription",
-						"someRam", 3),
-				new ComputationalResourceShapeDto("Standard_F16s", "someSize2", "someDescription2",
-						"someRam2", 6)));
-		emDto2.setExploratoryEnvironmentShapes(shapes2);
-		List<ExploratoryMetadataDTO> expectedEmdDtoList = Arrays.asList(emDto1, emDto2);
-		when(userGroupDao.getUserGroups(anyString())).thenReturn(Collections.emptySet());
-		when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenReturn(expectedEmdDtoList.toArray());
-		when(settingsDAO.getConfOsFamily()).thenReturn("someConfOsFamily");
-
-		UserInfo userInfo = new UserInfo("test", "token");
-		List<ExploratoryMetadataDTO> actualEmdDtoList =
-				infrastructureTemplateServiceBaseChild.getExploratoryTemplates(userInfo, "project", "endpoint");
-		assertNotNull(actualEmdDtoList);
-		assertEquals(expectedEmdDtoList, actualEmdDtoList);
-
-		verify(provisioningService).get(endpointDTO().getUrl() + "docker/exploratory", "token", ExploratoryMetadataDTO[].class);
-		verify(settingsDAO, times(2)).getConfOsFamily();
-		verify(userGroupDao).getUserGroups("test");
-		verifyNoMoreInteractions(provisioningService, settingsDAO, userGroupDao);
-	}
-
-	@Test
-	public void getExploratoryTemplatesWithException() {
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-		doThrow(new DlabException("Could not load list of exploratory templates for user"))
-				.when(provisioningService).get(anyString(), anyString(), any(Class.class));
-
-		UserInfo userInfo = new UserInfo("test", "token");
-		try {
-			infrastructureTemplateServiceBaseChild.getExploratoryTemplates(userInfo, "project", "endpoint");
-		} catch (DlabException e) {
-			assertEquals("Could not load list of exploratory templates for user", e.getMessage());
-		}
-		verify(provisioningService).get(endpointDTO().getUrl() + "docker/exploratory", "token", ExploratoryMetadataDTO[].class);
-		verifyNoMoreInteractions(provisioningService);
-	}
-
-	@Test
-	public void getComputationalTemplates() throws NoSuchFieldException, IllegalAccessException {
-
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-		final ComputationalMetadataDTO computationalMetadataDTO = new ComputationalMetadataDTO("dataengine-service");
-		computationalMetadataDTO.setComputationResourceShapes(Collections.emptyMap());
-		List<ComputationalMetadataDTO> expectedCmdDtoList = Collections.singletonList(
-				computationalMetadataDTO
-		);
-		when(projectDAO.get(anyString())).thenReturn(Optional.of(new ProjectDTO("project", Collections.emptySet(),
-				null, null, null, null, true)));
-		when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenReturn(expectedCmdDtoList.toArray(new ComputationalMetadataDTO[]{}));
-
-		List<FullComputationalTemplate> expectedFullCmdDtoList = expectedCmdDtoList.stream()
-				.map(e -> infrastructureTemplateServiceBaseChild.getCloudFullComputationalTemplate(e))
-				.collect(Collectors.toList());
-
-		UserInfo userInfo = new UserInfo("test", "token");
-		List<FullComputationalTemplate> actualFullCmdDtoList =
-				infrastructureTemplateServiceBaseChild.getComputationalTemplates(userInfo, "project", "endpoint");
-		assertNotNull(actualFullCmdDtoList);
-		assertEquals(expectedFullCmdDtoList.size(), actualFullCmdDtoList.size());
-		for (int i = 0; i < expectedFullCmdDtoList.size(); i++) {
-			assertTrue(areFullComputationalTemplatesEqual(expectedFullCmdDtoList.get(i), actualFullCmdDtoList.get(i)));
-		}
-
-		verify(provisioningService).get(endpointDTO().getUrl() + "docker/computational", "token", ComputationalMetadataDTO[].class);
-		verifyNoMoreInteractions(provisioningService);
-	}
-
-	@Test
-	public void getComputationalTemplatesWhenMethodThrowsException() {
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-		doThrow(new DlabException("Could not load list of computational templates for user"))
-				.when(provisioningService).get(anyString(), anyString(), any(Class.class));
-
-		UserInfo userInfo = new UserInfo("test", "token");
-		try {
-			infrastructureTemplateServiceBaseChild.getComputationalTemplates(userInfo, "project", "endpoint");
-		} catch (DlabException e) {
-			assertEquals("Could not load list of computational templates for user", e.getMessage());
-		}
-		verify(provisioningService).get(endpointDTO().getUrl() + "docker/computational", "token",
-				ComputationalMetadataDTO[].class);
-		verifyNoMoreInteractions(provisioningService);
-	}
-
-	@Test
-	public void getComputationalTemplatesWithInapproprietaryImageName() {
-		when(endpointService.get(anyString())).thenReturn(endpointDTO());
-		final ComputationalMetadataDTO computationalMetadataDTO = new ComputationalMetadataDTO("dataengine-service");
-		computationalMetadataDTO.setComputationResourceShapes(Collections.emptyMap());
-		List<ComputationalMetadataDTO> expectedCmdDtoList = Collections.singletonList(computationalMetadataDTO);
-		when(provisioningService.get(anyString(), anyString(), any(Class.class))).thenReturn(expectedCmdDtoList.toArray(new ComputationalMetadataDTO[]{}));
-		when(projectDAO.get(anyString())).thenReturn(Optional.of(new ProjectDTO("project", Collections.emptySet(),
-				null, null, null, null, true)));
-		when(configuration.getMinEmrInstanceCount()).thenReturn(1);
-		when(configuration.getMaxEmrInstanceCount()).thenReturn(2);
-		when(configuration.getMaxEmrSpotInstanceBidPct()).thenReturn(3);
-		when(configuration.getMinEmrSpotInstanceBidPct()).thenReturn(4);
-
-		UserInfo userInfo = new UserInfo("test", "token");
-		try {
-			infrastructureTemplateServiceBaseChild.getComputationalTemplates(userInfo, "project", "endpoint");
-		} catch (IllegalArgumentException e) {
-			assertEquals("Unknown data engine null", e.getMessage());
-		}
-		verify(provisioningService).get(endpointDTO().getUrl() + "docker/computational", "token", ComputationalMetadataDTO[].class);
-		verifyNoMoreInteractions(provisioningService);
-	}
-
-	private boolean areFullComputationalTemplatesEqual(FullComputationalTemplate object1,
-													   FullComputationalTemplate object2) throws NoSuchFieldException,
-			IllegalAccessException {
-		Field computationalMetadataDTO1 = object1.getClass().getDeclaredField("computationalMetadataDTO");
-		computationalMetadataDTO1.setAccessible(true);
-		Field computationalMetadataDTO2 = object2.getClass().getSuperclass().getDeclaredField("computationalMetadataDTO");
-		computationalMetadataDTO2.setAccessible(true);
-		return computationalMetadataDTO1.get(object1).equals(computationalMetadataDTO2.get(object2));
-	}
-
-	private EndpointDTO endpointDTO() {
-		return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
-	}
-
-	private class InfrastructureTemplateServiceBaseChild extends InfrastructureTemplateServiceImpl {
-
-		protected FullComputationalTemplate getCloudFullComputationalTemplate(ComputationalMetadataDTO metadataDTO) {
-			return new FullComputationalTemplate(metadataDTO);
-		}
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImplTest.java
deleted file mode 100644
index 3677929..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/LibraryServiceImplTest.java
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryLibDAO;
-import com.epam.dlab.backendapi.domain.EndpointDTO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.resources.dto.LibInfoRecord;
-import com.epam.dlab.backendapi.resources.dto.LibInstallFormDTO;
-import com.epam.dlab.backendapi.resources.dto.LibKey;
-import com.epam.dlab.backendapi.resources.dto.LibraryStatus;
-import com.epam.dlab.backendapi.service.EndpointService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.cloud.CloudProvider;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.dto.exploratory.LibInstallDTO;
-import com.epam.dlab.dto.exploratory.LibStatus;
-import com.epam.dlab.dto.exploratory.LibraryInstallDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.model.library.Library;
-import com.epam.dlab.rest.client.RESTService;
-import org.bson.Document;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyListOf;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.refEq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class LibraryServiceImplTest {
-
-    private static final String LIB_NAME = "name";
-    private static final String LIB_GROUP = "group";
-    private static final String LIB_VERSION = "version";
-    private static final String UUID = "id";
-    private final String USER = "test";
-    private final String EXPLORATORY_NAME = "explName";
-    private final String PROJECT = "projectName";
-    private final String COMPUTATIONAL_NAME = "compName";
-
-    private LibInstallDTO liDto;
-    private List<LibInstallDTO> libs;
-    private LibInstallFormDTO libInstallFormDTO;
-    private LibraryInstallDTO libraryInstallDto;
-
-    @Mock
-    private ExploratoryDAO exploratoryDAO;
-    @Mock
-    private ExploratoryLibDAO libraryDAO;
-    @Mock
-    private RequestBuilder requestBuilder;
-    @Mock
-    private RequestId requestId;
-    @Mock
-    private RESTService provisioningService;
-    @Mock
-    private EndpointService endpointService;
-
-    @Rule
-	public ExpectedException expectedException = ExpectedException.none();
-
-	@InjectMocks
-	private LibraryServiceImpl libraryService;
-
-	@Before
-	public void setUp() {
-		prepareForTesting();
-	}
-
-	@Test
-	public void testGetLibs() {
-        Document document = new Document();
-        when(libraryDAO.findExploratoryLibraries(anyString(), anyString(), anyString())).thenReturn(document);
-
-        List<Document> expectedList = new ArrayList<>();
-        List<Document> actualList = libraryService.getLibs(USER, PROJECT, EXPLORATORY_NAME, "");
-        assertNotNull(actualList);
-        assertEquals(expectedList, actualList);
-
-        verify(libraryDAO).findExploratoryLibraries(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(libraryDAO);
-    }
-
-	@Test
-	public void getLibInfo() {
-        Document document = new Document();
-        when(libraryDAO.findAllLibraries(anyString(), anyString(), anyString())).thenReturn(document);
-
-        List<LibInfoRecord> expectedList = new ArrayList<>();
-        List<LibInfoRecord> actualList = libraryService.getLibInfo(USER, PROJECT, EXPLORATORY_NAME);
-        assertNotNull(actualList);
-        assertEquals(expectedList, actualList);
-
-        verify(libraryDAO).findAllLibraries(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(libraryDAO);
-    }
-
-	@Test
-	public void getLibInfoWhenListsOfExploratoryAndComputationalLibsAreNotEmpty() {
-        when(libraryDAO.findAllLibraries(anyString(), anyString(), anyString()))
-                .thenReturn(getDocumentWithExploratoryAndComputationalLibs());
-
-        List<LibInfoRecord> expectedList = getLibInfoRecordList();
-        List<LibInfoRecord> actualList = libraryService.getLibInfo(USER, PROJECT, EXPLORATORY_NAME);
-        assertNotNull(actualList);
-        assertEquals(expectedList, actualList);
-
-        verify(libraryDAO).findAllLibraries(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(libraryDAO);
-    }
-
-	@Test
-	public void installComputationalLibsWithoutOverride() {
-        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
-        final List<LibInstallDTO> libsToInstall = getLibs("installing");
-        libraryInstallDTO.setLibs(libsToInstall);
-        final UserInfo user = getUser();
-
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
-        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class),
-                any(UserComputationalResource.class), anyListOf(LibInstallDTO.class), any(EndpointDTO.class))).thenReturn(libraryInstallDTO);
-
-
-        final String uuid = libraryService.installComputationalLibs(user, PROJECT, EXPLORATORY_NAME,
-                COMPUTATIONAL_NAME, getLibs(null));
-
-        assertEquals(UUID, uuid);
-
-        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME, LIB_GROUP, LIB_NAME);
-        verify(requestBuilder).newLibInstall(refEq(user), refEq(getUserInstanceDto()),
-                refEq(getUserComputationalResourceWithName(COMPUTATIONAL_NAME)), eq(libsToInstall), refEq(endpointDTO()));
-        verify(provisioningService).post(eq(endpointDTO().getUrl() + "library/computational/lib_install"), eq(user.getAccessToken()),
-                refEq(libraryInstallDTO), eq(String.class));
-        verify(libraryDAO).addLibrary(eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME),
-                eq(COMPUTATIONAL_NAME), refEq(libsToInstall.get(0)), eq(false));
-        verify(requestId).put(user.getName(), UUID);
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
-    }
-
-	@Test
-	public void installComputationalLibsWhenComputationalNotFound() {
-        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
-        final List<LibInstallDTO> libsToInstall = getLibs("installing");
-        libraryInstallDTO.setLibs(libsToInstall);
-        libraryInstallDTO.setProject(PROJECT);
-        final UserInfo user = getUser();
-
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
-        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class),
-                any(UserComputationalResource.class), anyListOf(LibInstallDTO.class), any(EndpointDTO.class)))
-                .thenReturn(libraryInstallDTO);
-
-
-        expectedException.expect(DlabException.class);
-        expectedException.expectMessage("Computational with name " + COMPUTATIONAL_NAME + "X was not found");
-
-        libraryService.installComputationalLibs(user, PROJECT, EXPLORATORY_NAME,
-                COMPUTATIONAL_NAME + "X", getLibs(null));
-    }
-
-	@Test
-	public void installComputationalLibsWithOverride() {
-        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
-        final List<LibInstallDTO> libsToInstall = getLibs("installing");
-        libraryInstallDTO.setProject(PROJECT);
-        libraryInstallDTO.setLibs(libsToInstall);
-        final UserInfo user = getUser();
-
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
-        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class),
-                any(UserComputationalResource.class), anyListOf(LibInstallDTO.class), any(EndpointDTO.class)))
-                .thenReturn(libraryInstallDTO);
-        when(libraryDAO.getLibrary(anyString(), anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(getLibrary(LibStatus.INSTALLED));
-
-        final String uuid = libraryService.installComputationalLibs(user, PROJECT, EXPLORATORY_NAME,
-                COMPUTATIONAL_NAME, getLibs(null));
-
-        assertEquals(UUID, uuid);
-
-        libsToInstall.get(0).setOverride(true);
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME, LIB_GROUP, LIB_NAME);
-        verify(libraryDAO).addLibrary(eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME),
-                eq(COMPUTATIONAL_NAME), refEq(libsToInstall.get(0)), eq(true));
-        verify(requestBuilder).newLibInstall(refEq(user), refEq(getUserInstanceDto()),
-                refEq(getUserComputationalResourceWithName(COMPUTATIONAL_NAME)), eq(libsToInstall), refEq(endpointDTO()));
-        verify(provisioningService).post(eq(endpointDTO().getUrl() + "library/computational/lib_install"),
-                eq(user.getAccessToken()),
-                refEq(libraryInstallDTO), eq(String.class));
-        verify(requestId).put(user.getName(), UUID);
-        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
-
-    }
-
-
-	@Test
-	public void installComputationalLibsWhenLibraryIsAlreadyInstalling() {
-        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
-        final List<LibInstallDTO> libsToInstall = getLibs("installing");
-        libraryInstallDTO.setLibs(libsToInstall);
-        final UserInfo user = getUser();
-
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
-        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class),
-                any(UserComputationalResource.class), anyListOf(LibInstallDTO.class), any(EndpointDTO.class)))
-                .thenReturn(libraryInstallDTO);
-        when(libraryDAO.getLibrary(anyString(), anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(getLibrary(LibStatus.INSTALLING));
-
-        try {
-            libraryService.installComputationalLibs(user, PROJECT, EXPLORATORY_NAME,
-                    COMPUTATIONAL_NAME, getLibs(null));
-        } catch (DlabException e) {
-            assertEquals("Library name is already installing", e.getMessage());
-        }
-        verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME, LIB_GROUP, LIB_NAME);
-        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
-    }
-
-	@Test
-	public void installExploratoryLibsWithoutOverride() {
-        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
-        final List<LibInstallDTO> libsToInstall = getLibs("installing");
-        libraryInstallDTO.setLibs(libsToInstall);
-        final UserInfo user = getUser();
-
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
-        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class),
-                anyListOf(LibInstallDTO.class))).thenReturn(libraryInstallDTO);
-
-
-        final String uuid = libraryService.installExploratoryLibs(user, PROJECT, EXPLORATORY_NAME, getLibs(null));
-
-        assertEquals(UUID, uuid);
-
-        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, LIB_GROUP, LIB_NAME);
-        verify(requestBuilder).newLibInstall(refEq(user), refEq(getUserInstanceDto()), eq(endpointDTO()), eq(libsToInstall));
-        verify(provisioningService).post(eq(endpointDTO().getUrl() + "library/exploratory/lib_install"), eq(user.getAccessToken()),
-                refEq(libraryInstallDTO), eq(String.class));
-        verify(libraryDAO).addLibrary(eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME), refEq(libsToInstall.get(0)), eq(false));
-        verify(requestId).put(user.getName(), UUID);
-        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
-    }
-
-	@Test
-	public void installExploratoryLibsWithOverride() {
-        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
-        final List<LibInstallDTO> libsToInstall = getLibs("installing");
-        libraryInstallDTO.setLibs(libsToInstall);
-        final UserInfo user = getUser();
-
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
-        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class),
-                anyListOf(LibInstallDTO.class))).thenReturn(libraryInstallDTO);
-        when(libraryDAO.getLibrary(anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(getLibrary(LibStatus.INSTALLED));
-
-        final String uuid = libraryService.installExploratoryLibs(user, PROJECT, EXPLORATORY_NAME, getLibs(null));
-
-        assertEquals(UUID, uuid);
-
-        libsToInstall.get(0).setOverride(true);
-        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, LIB_GROUP, LIB_NAME);
-        verify(libraryDAO).addLibrary(eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME), refEq(libsToInstall.get(0)), eq(true));
-        verify(requestBuilder).newLibInstall(refEq(user), refEq(getUserInstanceDto()), eq(endpointDTO()), eq(libsToInstall));
-        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verify(provisioningService).post(eq(endpointDTO().getUrl() + "library/exploratory/lib_install"), eq(user.getAccessToken()),
-                refEq(libraryInstallDTO), eq(String.class));
-        verify(requestId).put(USER, uuid);
-        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
-    }
-
-	@Test
-	public void installExploratoryLibsWhenLibIsAlreadyInstalling() {
-        final LibraryInstallDTO libraryInstallDTO = new LibraryInstallDTO();
-        final List<LibInstallDTO> libsToInstall = getLibs("installing");
-        libraryInstallDTO.setLibs(libsToInstall);
-        final UserInfo user = getUser();
-
-        when(endpointService.get(anyString())).thenReturn(endpointDTO());
-        when(exploratoryDAO.fetchRunningExploratoryFields(anyString(), anyString(), anyString())).thenReturn(getUserInstanceDto());
-        when(provisioningService.post(anyString(), anyString(), any(LibraryInstallDTO.class), any())).thenReturn(UUID);
-        when(requestBuilder.newLibInstall(any(UserInfo.class), any(UserInstanceDTO.class), any(EndpointDTO.class),
-                anyListOf(LibInstallDTO.class))).thenReturn(libraryInstallDTO);
-        when(libraryDAO.getLibrary(anyString(), anyString(), anyString(), anyString(), anyString())).thenReturn(getLibrary(LibStatus.INSTALLING));
-
-        try {
-            libraryService.installExploratoryLibs(user, PROJECT, EXPLORATORY_NAME, getLibs(null));
-        } catch (DlabException e) {
-            assertEquals("Library name is already installing", e.getMessage());
-        }
-
-        verify(libraryDAO).getLibrary(USER, PROJECT, EXPLORATORY_NAME, LIB_GROUP, LIB_NAME);
-        verify(exploratoryDAO).fetchRunningExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-        verifyNoMoreInteractions(libraryDAO, requestBuilder, provisioningService, requestId, exploratoryDAO);
-
-    }
-
-	private Library getLibrary(LibStatus status) {
-		return new Library(LIB_GROUP, LIB_NAME, "1", status, "");
-	}
-
-	private List<LibInstallDTO> getLibs(String status) {
-		final LibInstallDTO libInstallDTO = new LibInstallDTO(LIB_GROUP, LIB_NAME, LIB_VERSION);
-		libInstallDTO.setStatus(status);
-		return Collections.singletonList(libInstallDTO);
-	}
-
-	private UserInfo getUser() {
-		return new UserInfo(USER, "token123");
-	}
-
-	private void prepareForTesting() {
-		liDto = new LibInstallDTO("someGroup", "someName", "someVersion");
-		libs = Collections.singletonList(liDto);
-		libInstallFormDTO = new LibInstallFormDTO();
-		libInstallFormDTO.setNotebookName(EXPLORATORY_NAME);
-		libInstallFormDTO.setComputationalName(COMPUTATIONAL_NAME);
-		libInstallFormDTO.setLibs(libs);
-		libraryInstallDto = new LibraryInstallDTO().withExploratoryName(EXPLORATORY_NAME)
-				.withComputationalName(COMPUTATIONAL_NAME).withApplicationName("");
-		libraryInstallDto.setLibs(new ArrayList<>());
-	}
-
-	private UserComputationalResource getUserComputationalResourceWithName(String name) {
-		UserComputationalResource resource = new UserComputationalResource();
-		resource.setComputationalName(name);
-		resource.setComputationalId("someId");
-		resource.setImageName("someImageName");
-		return resource;
-	}
-
-	private UserInstanceDTO getUserInstanceDto() {
-		final UserInstanceDTO userInstanceDTO =
-				new UserInstanceDTO().withUser(USER).withExploratoryName(EXPLORATORY_NAME);
-		userInstanceDTO.getResources().add(getUserComputationalResourceWithName(COMPUTATIONAL_NAME));
-		return userInstanceDTO;
-	}
-
-	private List<Document> getExpLibsList() {
-		Document explLibsDoc = new Document();
-		explLibsDoc.append(ExploratoryLibDAO.LIB_NAME, "expLibName");
-		explLibsDoc.append(ExploratoryLibDAO.LIB_VERSION, "expLibVersion");
-		explLibsDoc.append(ExploratoryLibDAO.LIB_GROUP, "expLibGroup");
-		explLibsDoc.append(ExploratoryLibDAO.STATUS, "expLibStatus");
-		explLibsDoc.append(ExploratoryLibDAO.ERROR_MESSAGE, "expLibErrorMessage");
-		return Collections.singletonList(explLibsDoc);
-	}
-
-	private Document getCompLibs() {
-		Document compLibs = new Document();
-		compLibs.append(ExploratoryLibDAO.LIB_NAME, "compLibName");
-		compLibs.append(ExploratoryLibDAO.LIB_VERSION, "compLibVersion");
-		compLibs.append(ExploratoryLibDAO.LIB_GROUP, "compLibGroup");
-		compLibs.append(ExploratoryLibDAO.STATUS, "compLibStatus");
-		compLibs.append(ExploratoryLibDAO.ERROR_MESSAGE, "compLibErrorMessage");
-
-		Document compResourcesAndLibs = new Document();
-		compResourcesAndLibs.append("compName", Collections.singletonList(compLibs));
-		return compResourcesAndLibs;
-	}
-
-	private Document getDocumentWithExploratoryAndComputationalLibs() {
-		return new Document().append(ExploratoryLibDAO.EXPLORATORY_LIBS, getExpLibsList())
-				.append(ExploratoryLibDAO.COMPUTATIONAL_LIBS, getCompLibs());
-	}
-
-	private List<LibInfoRecord> getLibInfoRecordList() {
-		LibKey explLibKey = new LibKey("expLibName", "expLibVersion", "expLibGroup");
-		List<LibraryStatus> explLibStatuses = Collections.singletonList(
-				new LibraryStatus(EXPLORATORY_NAME, "notebook", "expLibStatus", "expLibErrorMessage"));
-
-		LibKey compLibKey = new LibKey("compLibName", "compLibVersion", "compLibGroup");
-		List<LibraryStatus> compLibStatuses = Collections.singletonList(
-				new LibraryStatus("compName", "cluster", "compLibStatus", "compLibErrorMessage"));
-
-		return Arrays.asList(
-				new LibInfoRecord(compLibKey, compLibStatuses),
-				new LibInfoRecord(explLibKey, explLibStatuses)
-		);
-	}
-
-	private EndpointDTO endpointDTO() {
-		return new EndpointDTO("test", "url", "", null, EndpointDTO.EndpointStatus.ACTIVE, CloudProvider.AWS);
-	}
-
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/MavenCentralLibraryServiceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/MavenCentralLibraryServiceTest.java
deleted file mode 100644
index c42076d..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/MavenCentralLibraryServiceTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.backendapi.domain.MavenSearchArtifactResponse;
-import com.epam.dlab.backendapi.resources.dto.LibraryDTO;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.rest.client.RESTService;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.net.URI;
-import java.util.Collections;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.refEq;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class MavenCentralLibraryServiceTest {
-
-	@Mock
-	private RESTService client;
-	@InjectMocks
-	private MavenCentralLibraryService mavenCentralLibraryService;
-	@Rule
-	public ExpectedException expectedException = ExpectedException.none();
-
-	@Test
-	public void getLibraryId() {
-		when(client.get(any(URI.class), any())).thenReturn(getMavenResponse());
-
-		final LibraryDTO libDTO = mavenCentralLibraryService.getLibrary("groupId", "artifactId", "version");
-
-		assertNotNull(libDTO);
-		assertEquals("groupId:artifactId", libDTO.getName());
-		assertEquals("version", libDTO.getVersion());
-
-		verify(client).get(refEq(URI.create("/solrsearch/select?q=a:%22artifactId%22+AND+g" +
-						":%22groupId%22+AND+v:%22version%22+AND+(p:%22jar%22%20OR%20p:%22bundle%22)" +
-						"&rows=20&wt=json&core=gav&p=jar")),
-				eq(MavenSearchArtifactResponse.class));
-	}
-
-	@Test
-	public void getLibraryIdWithException() {
-		when(client.get(any(URI.class), any())).thenThrow(new DlabException("Can not get artifact info from maven " +
-				"central due to: Exception"));
-
-		expectedException.expect(DlabException.class);
-		expectedException.expectMessage("Can not get artifact info from maven central due to: Exception");
-
-		mavenCentralLibraryService.getLibrary("groupId", "artifactId", "version");
-	}
-
-	private MavenSearchArtifactResponse getMavenResponse() {
-		final MavenSearchArtifactResponse response = new MavenSearchArtifactResponse();
-		MavenSearchArtifactResponse.Response.Artifact artifact = new MavenSearchArtifactResponse.Response.Artifact();
-		artifact.setId("test.group:artifact:1.0");
-		artifact.setVersion("1.0");
-		final MavenSearchArtifactResponse.Response rsp = new MavenSearchArtifactResponse.Response();
-		rsp.setArtifacts(Collections.singletonList(artifact));
-		response.setResponse(rsp);
-		return response;
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ReuploadKeyServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ReuploadKeyServiceImplTest.java
deleted file mode 100644
index 1aefbbb..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/ReuploadKeyServiceImplTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.epam.dlab.backendapi.service.impl;
-
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ComputationalDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.domain.RequestId;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.util.RequestBuilder;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyCallbackDTO;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyStatus;
-import com.epam.dlab.dto.reuploadkey.ReuploadKeyStatusDTO;
-import com.epam.dlab.model.ResourceData;
-import com.epam.dlab.model.ResourceType;
-import com.epam.dlab.rest.client.RESTService;
-import com.mongodb.client.result.UpdateResult;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import static com.epam.dlab.dto.UserInstanceStatus.RUNNING;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyBoolean;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class ReuploadKeyServiceImplTest {
-
-	private final String USER = "test";
-	private final String TOKEN = "token";
-	private final String EXPLORATORY_NAME = "explName";
-
-	private UserInfo userInfo;
-
-	@Mock
-	private RESTService provisioningService;
-	@Mock
-	private RequestBuilder requestBuilder;
-	@Mock
-	private RequestId requestId;
-	@Mock
-	private ExploratoryService exploratoryService;
-	@Mock
-	private ComputationalDAO computationalDAO;
-	@Mock
-	private ExploratoryDAO exploratoryDAO;
-
-	@InjectMocks
-	private ReuploadKeyServiceImpl reuploadKeyService;
-
-
-	@Rule
-	public ExpectedException expectedException = ExpectedException.none();
-
-	@Before
-	public void setUp() {
-		userInfo = getUserInfo();
-	}
-
-	@Test
-	public void updateResourceDataForEdgeWhenStatusCompleted() {
-		ResourceData resource = new ResourceData(ResourceType.EDGE, "someId", null, null);
-		ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.COMPLETED);
-
-		reuploadKeyService.updateResourceData(dto);
-
-		verifyZeroInteractions(exploratoryDAO, computationalDAO);
-	}
-
-	@Test
-	public void updateResourceDataForEdgeWhenStatusFailed() {
-		ResourceData resource = new ResourceData(ResourceType.EDGE, "someId", null, null);
-
-		ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.FAILED);
-		reuploadKeyService.updateResourceData(dto);
-
-		verifyZeroInteractions(exploratoryDAO, computationalDAO);
-	}
-
-	@Test
-	public void updateResourceDataForExploratoryWhenStatusCompleted() {
-		ResourceData resource = new ResourceData(ResourceType.EXPLORATORY, "someId", EXPLORATORY_NAME, null);
-		when(exploratoryDAO.updateStatusForExploratory(anyString(), anyString(), anyString(),
-				any(UserInstanceStatus.class))).thenReturn(mock(UpdateResult.class));
-		doNothing().when(exploratoryDAO).updateReuploadKeyForExploratory(anyString(), anyString(), anyString(), anyBoolean());
-
-		ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.COMPLETED);
-
-		reuploadKeyService.updateResourceData(dto);
-
-		verify(exploratoryDAO).updateStatusForExploratory(USER, null, EXPLORATORY_NAME, RUNNING);
-		verify(exploratoryDAO).updateReuploadKeyForExploratory(USER, null, EXPLORATORY_NAME, false);
-		verifyNoMoreInteractions(exploratoryDAO);
-		verifyZeroInteractions(computationalDAO);
-	}
-
-	@Test
-	public void updateResourceDataForExploratoryWhenStatusFailed() {
-		ResourceData resource = new ResourceData(ResourceType.EXPLORATORY, "someId", EXPLORATORY_NAME, null);
-		when(exploratoryDAO.updateStatusForExploratory(anyString(), anyString(), anyString(),
-				any(UserInstanceStatus.class))).thenReturn(mock(UpdateResult.class));
-
-		ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.FAILED);
-
-		reuploadKeyService.updateResourceData(dto);
-
-		verify(exploratoryDAO).updateStatusForExploratory(USER, null, EXPLORATORY_NAME, RUNNING);
-		verifyNoMoreInteractions(exploratoryDAO);
-		verifyZeroInteractions(computationalDAO);
-	}
-
-	@Test
-	public void updateResourceDataForClusterWhenStatusCompleted() {
-		ResourceData resource = new ResourceData(ResourceType.COMPUTATIONAL, "someId", EXPLORATORY_NAME, "compName");
-		doNothing().when(computationalDAO).updateStatusForComputationalResource(anyString(), anyString(), anyString(),
-				anyString(), any(UserInstanceStatus.class));
-		doNothing().when(computationalDAO).updateReuploadKeyFlagForComputationalResource(anyString(), anyString(),
-				anyString(), anyString(), anyBoolean());
-		ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.COMPLETED);
-
-		reuploadKeyService.updateResourceData(dto);
-
-		verify(computationalDAO).updateStatusForComputationalResource(USER, null, EXPLORATORY_NAME, "compName", RUNNING);
-		verify(computationalDAO).updateReuploadKeyFlagForComputationalResource(USER, null, EXPLORATORY_NAME,
-				"compName", false);
-		verifyNoMoreInteractions(computationalDAO);
-		verifyZeroInteractions(exploratoryDAO);
-	}
-
-	@Test
-	public void updateResourceDataForClusterWhenStatusFailed() {
-		ResourceData resource = new ResourceData(ResourceType.COMPUTATIONAL, "someId", EXPLORATORY_NAME, "compName");
-		doNothing().when(computationalDAO).updateStatusForComputationalResource(anyString(), anyString(), anyString(),
-				anyString(), any(UserInstanceStatus.class));
-		ReuploadKeyStatusDTO dto = getReuploadKeyStatusDTO(resource, ReuploadKeyStatus.FAILED);
-
-		reuploadKeyService.updateResourceData(dto);
-
-		verify(computationalDAO).updateStatusForComputationalResource(USER, null, EXPLORATORY_NAME, "compName", RUNNING);
-		verifyNoMoreInteractions(computationalDAO);
-		verifyZeroInteractions(exploratoryDAO);
-	}
-
-	private UserInfo getUserInfo() {
-		return new UserInfo(USER, TOKEN);
-	}
-
-	private ReuploadKeyStatusDTO getReuploadKeyStatusDTO(ResourceData resource, ReuploadKeyStatus status) {
-		return new ReuploadKeyStatusDTO().withReuploadKeyCallbackDto(
-				new ReuploadKeyCallbackDTO().withResource(resource)).withReuploadKeyStatus(status).withUser(USER);
-	}
-
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImplTest.java
deleted file mode 100644
index c025651..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/SchedulerJobServiceImplTest.java
+++ /dev/null
@@ -1,1124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.ComputationalDAO;
-import com.epam.dlab.backendapi.dao.ExploratoryDAO;
-import com.epam.dlab.backendapi.dao.SchedulerJobDAO;
-import com.epam.dlab.backendapi.service.ComputationalService;
-import com.epam.dlab.backendapi.service.ExploratoryService;
-import com.epam.dlab.backendapi.service.SecurityService;
-import com.epam.dlab.dto.SchedulerJobDTO;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.aws.computational.AwsComputationalResource;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.dto.computational.UserComputationalResource;
-import com.epam.dlab.exceptions.ResourceInappropriateStateException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import com.epam.dlab.model.scheduler.SchedulerJobData;
-import com.mongodb.client.result.UpdateResult;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.time.DayOfWeek;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.OffsetDateTime;
-import java.time.ZoneId;
-import java.time.temporal.ChronoUnit;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import static com.epam.dlab.dto.UserInstanceStatus.RUNNING;
-import static com.epam.dlab.dto.UserInstanceStatus.STARTING;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPED;
-import static com.epam.dlab.dto.UserInstanceStatus.STOPPING;
-import static java.util.Collections.singletonList;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Matchers.anyVararg;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.refEq;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class SchedulerJobServiceImplTest {
-
-	private final String USER = "test";
-	private final String EXPLORATORY_NAME = "explName";
-	private final String COMPUTATIONAL_NAME = "compName";
-	private final String PROJECT = "project";
-	private SchedulerJobDTO schedulerJobDTO;
-	private UserInstanceDTO userInstance;
-
-	@Mock
-	private SchedulerJobDAO schedulerJobDAO;
-	@Mock
-	private ExploratoryDAO exploratoryDAO;
-	@Mock
-	private ComputationalDAO computationalDAO;
-	@Mock
-	private SecurityService securityService;
-	@Mock
-	private ExploratoryService exploratoryService;
-	@Mock
-	private ComputationalService computationalService;
-
-	@InjectMocks
-	private SchedulerJobServiceImpl schedulerJobService;
-
-
-	@Before
-	public void setUp() {
-		schedulerJobDTO = getSchedulerJobDTO(LocalDate.now(), LocalDate.now().plusDays(1),
-				Arrays.asList(DayOfWeek.values()), Arrays.asList(DayOfWeek.values()), false,
-				LocalDateTime.of(LocalDate.now(), LocalTime.now().truncatedTo(ChronoUnit.MINUTES)),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		userInstance = getUserInstanceDTO();
-	}
-
-	@Test
-	public void fetchSchedulerJobForUserAndExploratory() {
-		when(schedulerJobDAO.fetchSingleSchedulerJobByUserAndExploratory(anyString(), anyString(), anyString()))
-				.thenReturn(Optional.of(schedulerJobDTO));
-
-		SchedulerJobDTO actualSchedulerJobDto =
-				schedulerJobService.fetchSchedulerJobForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
-		assertNotNull(actualSchedulerJobDto);
-		assertEquals(schedulerJobDTO, actualSchedulerJobDto);
-
-		verify(schedulerJobDAO).fetchSingleSchedulerJobByUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
-		verifyNoMoreInteractions(exploratoryDAO, schedulerJobDAO);
-	}
-
-	@Test
-	public void fetchSchedulerJobForUserAndExploratoryWhenNotebookNotExist() {
-		when(schedulerJobDAO.fetchSingleSchedulerJobByUserAndExploratory(anyString(), anyString(), anyString())).thenReturn(Optional.empty());
-		try {
-			schedulerJobService.fetchSchedulerJobForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
-		} catch (ResourceNotFoundException e) {
-			assertEquals("Scheduler job data not found for user test with exploratory explName", e.getMessage());
-		}
-		verify(schedulerJobDAO).fetchSingleSchedulerJobByUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
-		verifyNoMoreInteractions(schedulerJobDAO);
-	}
-
-	@Test
-	public void fetchEmptySchedulerJobForUserAndExploratory() {
-		when(schedulerJobDAO.fetchSingleSchedulerJobByUserAndExploratory(anyString(), anyString(), anyString()))
-				.thenReturn(Optional.empty());
-		try {
-			schedulerJobService.fetchSchedulerJobForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
-		} catch (ResourceNotFoundException e) {
-			assertEquals("Scheduler job data not found for user test with exploratory explName", e.getMessage());
-		}
-		verify(schedulerJobDAO).fetchSingleSchedulerJobByUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME);
-		verifyNoMoreInteractions(schedulerJobDAO);
-	}
-
-	@Test
-	public void fetchSchedulerJobForComputationalResource() {
-		when(schedulerJobDAO.fetchSingleSchedulerJobForCluster(anyString(), anyString(), anyString(), anyString()))
-				.thenReturn(Optional.of(schedulerJobDTO));
-
-		SchedulerJobDTO actualSchedulerJobDto = schedulerJobService
-				.fetchSchedulerJobForComputationalResource(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-		assertNotNull(actualSchedulerJobDto);
-		assertEquals(schedulerJobDTO, actualSchedulerJobDto);
-
-		verify(schedulerJobDAO).fetchSingleSchedulerJobForCluster(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-		verifyNoMoreInteractions(computationalDAO, schedulerJobDAO);
-	}
-
-	@Test
-	public void fetchEmptySchedulerJobForComputationalResource() {
-		when(schedulerJobDAO.fetchSingleSchedulerJobForCluster(anyString(), anyString(), anyString(), anyString()))
-				.thenReturn(Optional.empty());
-		try {
-			schedulerJobService.fetchSchedulerJobForComputationalResource(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-		} catch (ResourceNotFoundException e) {
-			assertEquals("Scheduler job data not found for user test with exploratory explName with " +
-					"computational resource compName", e.getMessage());
-		}
-		verify(schedulerJobDAO).fetchSingleSchedulerJobForCluster(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-		verifyNoMoreInteractions(computationalDAO, schedulerJobDAO);
-	}
-
-	@Test
-	public void updateSchedulerDataForUserAndExploratory() {
-		userInstance.withStatus("running");
-		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		when(exploratoryDAO.updateSchedulerDataForUserAndExploratory(anyString(), anyString(), anyString(),
-				any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
-
-		schedulerJobService.updateExploratorySchedulerData(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
-
-		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verify(exploratoryDAO).updateSchedulerDataForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
-		verify(computationalDAO).updateSchedulerSyncFlag(USER, PROJECT, EXPLORATORY_NAME, false);
-		verifyNoMoreInteractions(exploratoryDAO);
-		verifyZeroInteractions(computationalDAO);
-	}
-
-	@Test
-	public void updateSchedulerDataForUserAndExploratoryWhenMethodFetchExploratoryFieldsThrowsException() {
-		doThrow(new ResourceNotFoundException("Exploratory for user with name not found"))
-				.when(exploratoryDAO).fetchExploratoryFields(anyString(), anyString(), anyString());
-		try {
-			schedulerJobService.updateExploratorySchedulerData(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
-		} catch (ResourceNotFoundException e) {
-			assertEquals("Exploratory for user with name not found", e.getMessage());
-		}
-		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verifyNoMoreInteractions(exploratoryDAO);
-		verifyZeroInteractions(computationalDAO);
-	}
-
-	@Test
-	public void updateSchedulerDataForUserAndExploratoryWithInapproprietaryStatus() {
-		userInstance.withStatus("terminated");
-		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		try {
-			schedulerJobService.updateExploratorySchedulerData(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
-		} catch (ResourceInappropriateStateException e) {
-			assertEquals("Can not create/update scheduler for user instance with status: terminated",
-					e.getMessage());
-		}
-		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verifyNoMoreInteractions(exploratoryDAO);
-		verifyZeroInteractions(computationalDAO);
-	}
-
-	@Test
-	public void updateSchedulerDataForUserAndExploratoryWithEnrichingSchedulerJob() {
-		schedulerJobDTO.setBeginDate(null);
-		schedulerJobDTO.setTimeZoneOffset(null);
-		userInstance.withStatus("running");
-		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		when(exploratoryDAO.updateSchedulerDataForUserAndExploratory(anyString(), anyString(), anyString(),
-				any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
-
-		assertNull(schedulerJobDTO.getBeginDate());
-		assertNull(schedulerJobDTO.getTimeZoneOffset());
-
-		schedulerJobService.updateExploratorySchedulerData(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
-
-		assertEquals(LocalDate.now(), schedulerJobDTO.getBeginDate());
-		assertEquals(OffsetDateTime.now(ZoneId.systemDefault()).getOffset(), schedulerJobDTO.getTimeZoneOffset());
-
-		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verify(exploratoryDAO).updateSchedulerDataForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
-		verify(computationalDAO).updateSchedulerSyncFlag(USER, PROJECT, EXPLORATORY_NAME, false);
-		verifyNoMoreInteractions(exploratoryDAO);
-		verifyZeroInteractions(computationalDAO);
-	}
-
-	@Test
-	@SuppressWarnings("unchecked")
-	public void updateSchedulerDataForUserAndExploratoryWithSyncStartRequiredParam() {
-		userInstance.withStatus("running");
-		schedulerJobDTO.setSyncStartRequired(true);
-		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		when(exploratoryDAO.updateSchedulerDataForUserAndExploratory(anyString(), anyString(), anyString(),
-				any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
-		when(computationalDAO.getComputationalResourcesWhereStatusIn(anyString(), anyString(),
-				any(List.class), anyString(), anyVararg())).thenReturn(singletonList(COMPUTATIONAL_NAME));
-		when(computationalDAO.updateSchedulerDataForComputationalResource(anyString(), anyString(), anyString(),
-				anyString(), any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
-
-		schedulerJobService.updateExploratorySchedulerData(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
-
-		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verify(exploratoryDAO).updateSchedulerDataForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
-		verify(computationalDAO).getComputationalResourcesWhereStatusIn(USER, PROJECT,
-				singletonList(DataEngineType.SPARK_STANDALONE), EXPLORATORY_NAME, STARTING, RUNNING, STOPPING, STOPPED);
-		schedulerJobDTO.setEndTime(null);
-		schedulerJobDTO.setStopDaysRepeat(Collections.emptyList());
-		verify(computationalDAO).updateSchedulerDataForComputationalResource(USER, PROJECT,
-				EXPLORATORY_NAME, COMPUTATIONAL_NAME, schedulerJobDTO);
-		verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
-	}
-
-	@Test
-	@SuppressWarnings("unchecked")
-	public void updateSchedulerDataForUserAndExploratoryWithSyncStartRequiredParamButAbsenceClusters() {
-		userInstance.withStatus("running");
-		schedulerJobDTO.setSyncStartRequired(true);
-		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		when(exploratoryDAO.updateSchedulerDataForUserAndExploratory(anyString(), anyString(), anyString(),
-				any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
-		when(computationalDAO.getComputationalResourcesWhereStatusIn(anyString(), anyString(),
-				any(List.class), anyString(), anyVararg())).thenReturn(Collections.emptyList());
-
-		schedulerJobService.updateExploratorySchedulerData(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
-
-		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verify(exploratoryDAO).updateSchedulerDataForUserAndExploratory(USER, PROJECT, EXPLORATORY_NAME, schedulerJobDTO);
-		verify(computationalDAO).getComputationalResourcesWhereStatusIn(USER, PROJECT,
-				singletonList(DataEngineType.SPARK_STANDALONE), EXPLORATORY_NAME, STARTING, RUNNING, STOPPING, STOPPED);
-		verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
-	}
-
-
-	@Test
-	public void updateSchedulerDataForComputationalResource() {
-		userInstance.withStatus("running");
-		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString()))
-				.thenReturn(userInstance.getResources().get(0));
-		when(computationalDAO.updateSchedulerDataForComputationalResource(anyString(), anyString(), anyString(),
-				anyString(), any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
-
-		schedulerJobService.updateComputationalSchedulerData(USER, PROJECT, EXPLORATORY_NAME,
-				COMPUTATIONAL_NAME, schedulerJobDTO);
-
-		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-		verify(computationalDAO).updateSchedulerDataForComputationalResource(USER, PROJECT,
-				EXPLORATORY_NAME, COMPUTATIONAL_NAME, schedulerJobDTO);
-		verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
-	}
-
-	@Test
-	public void updateSchedulerDataForComputationalResourceWhenSchedulerIsNull() {
-		userInstance.withStatus("running");
-		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString()))
-				.thenReturn(userInstance.getResources().get(0));
-		when(computationalDAO.updateSchedulerDataForComputationalResource(anyString(), anyString(), anyString(),
-				anyString(), any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
-
-		final SchedulerJobDTO schedulerJobDTO = getSchedulerJobDTO(LocalDate.now(), LocalDate.now().plusDays(1),
-				Arrays.asList(DayOfWeek.values()), Arrays.asList(DayOfWeek.values()), false,
-				LocalDateTime.of(LocalDate.now(), LocalTime.now().truncatedTo(ChronoUnit.MINUTES)),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		schedulerJobDTO.setStartDaysRepeat(null);
-		schedulerJobDTO.setStopDaysRepeat(null);
-		schedulerJobService.updateComputationalSchedulerData(USER, PROJECT, EXPLORATORY_NAME,
-				COMPUTATIONAL_NAME, schedulerJobDTO);
-
-		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-		verify(computationalDAO).updateSchedulerDataForComputationalResource(eq(USER), eq(PROJECT), eq(EXPLORATORY_NAME),
-				eq(COMPUTATIONAL_NAME), refEq(schedulerJobDTO));
-		verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
-	}
-
-	@Test
-	public void updateSchedulerDataForComputationalResourceWhenMethodFetchComputationalFieldsThrowsException() {
-		userInstance.withStatus("running");
-		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		doThrow(new ResourceNotFoundException("Computational resource for user with name not found"))
-				.when(computationalDAO).fetchComputationalFields(anyString(), anyString(), anyString(), anyString());
-		try {
-			schedulerJobService.updateComputationalSchedulerData(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME, schedulerJobDTO);
-		} catch (ResourceNotFoundException e) {
-			assertEquals("Computational resource for user with name not found", e.getMessage());
-		}
-
-		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-		verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
-	}
-
-	@Test
-	public void updateSchedulerDataForComputationalResourceWithInapproprietaryClusterStatus() {
-		userInstance.setStatus("running");
-		userInstance.getResources().get(0).setStatus("terminated");
-		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString()))
-				.thenReturn(userInstance.getResources().get(0));
-		try {
-			schedulerJobService.updateComputationalSchedulerData(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME, schedulerJobDTO);
-		} catch (ResourceInappropriateStateException e) {
-			assertEquals("Can not create/update scheduler for user instance with status: terminated",
-					e.getMessage());
-		}
-		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-		verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
-	}
-
-	@Test
-	public void updateSchedulerDataForComputationalResourceWithEnrichingSchedulerJob() {
-		schedulerJobDTO.setBeginDate(null);
-		schedulerJobDTO.setTimeZoneOffset(null);
-		userInstance.withStatus("running");
-		when(exploratoryDAO.fetchExploratoryFields(anyString(), anyString(), anyString())).thenReturn(userInstance);
-		when(computationalDAO.fetchComputationalFields(anyString(), anyString(), anyString(), anyString()))
-				.thenReturn(userInstance.getResources().get(0));
-		when(computationalDAO.updateSchedulerDataForComputationalResource(anyString(), anyString(), anyString(),
-				anyString(), any(SchedulerJobDTO.class))).thenReturn(mock(UpdateResult.class));
-
-		assertNull(schedulerJobDTO.getBeginDate());
-		assertNull(schedulerJobDTO.getTimeZoneOffset());
-
-		schedulerJobService.updateComputationalSchedulerData(USER, PROJECT, EXPLORATORY_NAME,
-				COMPUTATIONAL_NAME, schedulerJobDTO);
-
-		assertEquals(LocalDate.now(), schedulerJobDTO.getBeginDate());
-		assertEquals(OffsetDateTime.now(ZoneId.systemDefault()).getOffset(), schedulerJobDTO.getTimeZoneOffset());
-
-		verify(exploratoryDAO).fetchExploratoryFields(USER, PROJECT, EXPLORATORY_NAME);
-		verify(computationalDAO).fetchComputationalFields(USER, PROJECT, EXPLORATORY_NAME, COMPUTATIONAL_NAME);
-		verify(computationalDAO).updateSchedulerDataForComputationalResource(USER, PROJECT,
-				EXPLORATORY_NAME, COMPUTATIONAL_NAME, schedulerJobDTO);
-		verifyNoMoreInteractions(exploratoryDAO, computationalDAO);
-	}
-
-	@Test
-	public void testStartComputationalByScheduler() {
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(getSchedulerJobData(LocalDate.now(),
-				LocalDate.now().plusDays(1), Arrays.asList(DayOfWeek.values()), Arrays.asList(DayOfWeek.values()),
-				LocalDateTime.of(LocalDate.now(),
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES))));
-		when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.startComputationalByScheduler();
-
-		verify(securityService).getServiceAccountInfo(USER);
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, STOPPED);
-		verify(computationalService).startSparkCluster(refEq(getUserInfo()), eq(EXPLORATORY_NAME),
-				eq(COMPUTATIONAL_NAME), eq(PROJECT));
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-	@Test
-	public void testStartComputationalBySchedulerWhenSchedulerIsNotConfigured() {
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(Collections.emptyList());
-
-		schedulerJobService.startComputationalByScheduler();
-
-		verify(schedulerJobDAO).getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE,
-				STOPPED);
-		verifyNoMoreInteractions(schedulerJobDAO);
-		verifyZeroInteractions(securityService, computationalService);
-	}
-
-	@Test
-	public void testStartComputationalBySchedulerWhenSchedulerFinishDateBeforeNow() {
-		final LocalDate beginDate = LocalDate.now().plusDays(1);
-		final LocalDate endDate = LocalDate.now();
-		final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(beginDate, endDate, startDays, stopDays,
-				terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.startComputationalByScheduler();
-
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, STOPPED);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-	@Test
-	public void testStartComputationalBySchedulerWhenSchedulerStartDateAfterNow() {
-		final LocalDate beginDate = LocalDate.now().plusDays(1);
-		final LocalDate finishDate = LocalDate.now();
-		final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(
-				beginDate, finishDate, startDays, stopDays, terminateDateTime, false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.startComputationalByScheduler();
-
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, STOPPED);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-	@Test
-	public void testStartComputationalBySchedulerWhenStartDayIsNotCurrentDay() {
-		final List<DayOfWeek> stopDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
-		final List<DayOfWeek> startDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
-		startDays.remove(LocalDate.now().getDayOfWeek());
-		final LocalDate beginDate = LocalDate.now();
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(
-				beginDate, LocalDate.now().minusDays(1), startDays, stopDays,
-				LocalDateTime.of(LocalDate.now(),
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.startComputationalByScheduler();
-
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, STOPPED);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-
-	@Test
-	public void testStopComputationalByScheduler() {
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(getSchedulerJobData(LocalDate.now(),
-				LocalDate.now().plusDays(1), Arrays.asList(DayOfWeek.values()), Arrays.asList(DayOfWeek.values()),
-				LocalDateTime.of(LocalDate.now(),
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES))));
-		when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.stopComputationalByScheduler();
-
-		verify(securityService).getServiceAccountInfo(USER);
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING);
-		verify(computationalService).stopSparkCluster(refEq(getUserInfo()), eq(PROJECT), eq(EXPLORATORY_NAME),
-				eq(COMPUTATIONAL_NAME));
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-	@Test
-	public void testStopComputationalBySchedulerWhenSchedulerIsNotConfigured() {
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(Collections.emptyList());
-
-		schedulerJobService.stopComputationalByScheduler();
-
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING);
-		verifyNoMoreInteractions(schedulerJobDAO);
-		verifyZeroInteractions(securityService, computationalService);
-	}
-
-	@Test
-	public void testStopComputationalBySchedulerWhenSchedulerFinishDateBeforeNow() {
-		final LocalDate beginDate = LocalDate.now().plusDays(1);
-		final LocalDate endDate = LocalDate.now();
-		final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(beginDate, endDate, startDays, stopDays,
-				terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.stopComputationalByScheduler();
-
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-	@Test
-	public void testStopComputationalBySchedulerWhenSchedulerStartDateAfterNow() {
-		final LocalDate beginDate = LocalDate.now().plusDays(1);
-		final LocalDate finishDate = LocalDate.now();
-		final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(
-				beginDate, finishDate, startDays, stopDays, terminateDateTime, false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.stopComputationalByScheduler();
-
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-	@Test
-	public void testStopComputationalBySchedulerWhenStopDayIsNotCurrentDay() {
-		final List<DayOfWeek> stopDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
-		stopDays.remove(LocalDate.now().getDayOfWeek());
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(
-				LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()), stopDays,
-				LocalDateTime.of(LocalDate.now(),
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.stopComputationalByScheduler();
-
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, DataEngineType.SPARK_STANDALONE, RUNNING);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-
-	@Test
-	public void testStopExploratoryByScheduler() {
-		when(schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(any(UserInstanceStatus.class), any(Date.class))).
-				thenReturn(singletonList(getSchedulerJobData(LocalDate.now(), LocalDate.now().plusDays(1),
-						Arrays.asList(DayOfWeek.values()), Arrays.asList(DayOfWeek.values()),
-						LocalDateTime.of(LocalDate.now(),
-								LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES))));
-		when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.stopExploratoryByScheduler();
-
-		verify(securityService).getServiceAccountInfo(USER);
-		verify(schedulerJobDAO).getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(eq(RUNNING),
-				any(Date.class));
-		verify(exploratoryService).stop(refEq(getUserInfo()), eq(PROJECT), eq(EXPLORATORY_NAME));
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService);
-	}
-
-	@Test
-	public void testStopExploratoryBySchedulerWhenSchedulerIsNotConfigured() {
-		when(schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(any(UserInstanceStatus.class), any(Date.class)))
-				.thenReturn(Collections.emptyList());
-
-		schedulerJobService.stopExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(eq(RUNNING),
-				any(Date.class));
-		verifyNoMoreInteractions(schedulerJobDAO);
-		verifyZeroInteractions(securityService, exploratoryService);
-	}
-
-	@Test
-	public void testStopExploratoryBySchedulerWhenSchedulerFinishDateBeforeNow() {
-		final LocalDate finishDate = LocalDate.now().minusDays(1);
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(LocalDate.now(), finishDate,
-				Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(any(UserInstanceStatus.class), any(Date.class))).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.stopExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(eq(RUNNING),
-				any(Date.class));
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService);
-	}
-
-	@Test
-	public void testStopExploratoryBySchedulerWhenSchedulerStartDateAfterNow() {
-		final LocalDate now = LocalDate.now();
-		final LocalDate finishDate = now;
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
-		final LocalDate beginDate = now.plusDays(1);
-		final LocalDateTime terminateDateTime = LocalDateTime.of(now, LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(beginDate, finishDate, startDays, stopDays,
-				terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(any(UserInstanceStatus.class), any(Date.class)))
-				.thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.stopExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(eq(RUNNING),
-				any(Date.class));
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService);
-	}
-
-	@Test
-	public void testStopExploratoryBySchedulerWhenStopDayIsNotCurrentDay() {
-		final List<DayOfWeek> stopDays = Arrays.stream((DayOfWeek.values())).collect(Collectors.toList());
-		stopDays.remove(LocalDate.now().getDayOfWeek());
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(
-				LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()), stopDays,
-				LocalDateTime.of(LocalDate.now(),
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(any(UserInstanceStatus.class), any(Date.class))).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.stopExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(eq(RUNNING),
-				any(Date.class));
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService);
-	}
-
-
-	@Test
-	public void testStartExploratoryByScheduler() {
-		final LocalDate finishDate = LocalDate.now().plusDays(1);
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class)))
-				.thenReturn(singletonList(getSchedulerJobData(LocalDate.now(), finishDate,
-						Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
-								LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-				)));
-		when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.startExploratoryByScheduler();
-
-		verify(securityService).getServiceAccountInfo(USER);
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
-		verify(exploratoryService).start(refEq(getUserInfo()), eq(EXPLORATORY_NAME), eq(PROJECT));
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService);
-		verify(exploratoryService).start(refEq(getUserInfo()), eq(EXPLORATORY_NAME), eq(PROJECT));
-		verifyNoMoreInteractions(schedulerJobDAO, exploratoryService);
-		verifyZeroInteractions(computationalService, computationalDAO);
-	}
-
-	@Test
-	public void testStartExploratoryBySchedulerWithSyncComputationalStart() {
-		final LocalDate finishDate = LocalDate.now().plusDays(1);
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class)))
-				.thenReturn(singletonList(getSchedulerJobData(LocalDate.now(), finishDate,
-						Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
-								LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), true, USER,
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-				)));
-		when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
-		when(computationalDAO.findComputationalResourcesWithStatus(anyString(), anyString(),
-				anyString(), any(UserInstanceStatus.class))).thenReturn(singletonList(getComputationalResource(
-				DataEngineType.SPARK_STANDALONE, true)));
-
-		schedulerJobService.startExploratoryByScheduler();
-
-		verify(securityService, times(2)).getServiceAccountInfo(USER);
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
-		verify(exploratoryService).start(refEq(getUserInfo()), eq(EXPLORATORY_NAME), eq(PROJECT));
-		verify(computationalDAO).findComputationalResourcesWithStatus(USER, PROJECT, EXPLORATORY_NAME, STOPPED);
-		verify(computationalService).startSparkCluster(refEq(getUserInfo()), eq(EXPLORATORY_NAME),
-				eq(COMPUTATIONAL_NAME), eq(PROJECT));
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService, computationalService,
-				computationalDAO);
-	}
-
-	@Test
-	public void testStartExploratoryBySchedulerWithSyncComputationalStartDataEngine() {
-		final LocalDate finishDate = LocalDate.now().plusDays(1);
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class)))
-				.thenReturn(singletonList(getSchedulerJobData(LocalDate.now(), finishDate,
-						Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
-								LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), true, USER,
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-				)));
-		when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
-		when(computationalDAO.findComputationalResourcesWithStatus(anyString(), anyString(),
-				anyString(), any(UserInstanceStatus.class))).thenReturn(singletonList(getComputationalResource(
-				DataEngineType.CLOUD_SERVICE, true)));
-
-		schedulerJobService.startExploratoryByScheduler();
-
-		verify(securityService).getServiceAccountInfo(USER);
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
-		verify(exploratoryService).start(refEq(getUserInfo()), eq(EXPLORATORY_NAME), eq(PROJECT));
-		verify(computationalDAO).findComputationalResourcesWithStatus(USER, PROJECT, EXPLORATORY_NAME, STOPPED);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService, computationalDAO);
-		verifyZeroInteractions(computationalService);
-	}
-
-	@Test
-	public void testStartExploratoryBySchedulerWithSyncComputationalStartOnExploratoryButNotOnComputational() {
-		final LocalDate finishDate = LocalDate.now().plusDays(1);
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class)))
-				.thenReturn(singletonList(getSchedulerJobData(LocalDate.now(), finishDate,
-						Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
-								LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), true, USER,
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-				)));
-		when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
-		when(computationalDAO.findComputationalResourcesWithStatus(anyString(), anyString(),
-				anyString(), any(UserInstanceStatus.class))).thenReturn(singletonList(getComputationalResource(
-				DataEngineType.SPARK_STANDALONE, false)));
-
-		schedulerJobService.startExploratoryByScheduler();
-
-		verify(securityService).getServiceAccountInfo(USER);
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
-		verify(exploratoryService).start(refEq(getUserInfo()), eq(EXPLORATORY_NAME), eq(PROJECT));
-		verify(computationalDAO).findComputationalResourcesWithStatus(USER, PROJECT, EXPLORATORY_NAME, STOPPED);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService, computationalDAO);
-		verifyZeroInteractions(computationalService);
-	}
-
-	@Test
-	public void testStartExploratoryBySchedulerWhenSchedulerIsNotConfigured() {
-		when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class))).thenReturn(Collections.emptyList());
-
-		schedulerJobService.startExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
-		verifyNoMoreInteractions(schedulerJobDAO);
-		verifyZeroInteractions(securityService, exploratoryService, computationalService, computationalDAO);
-	}
-
-	@Test
-	public void testStartExploratoryBySchedulerWhenSchedulerFinishDateBeforeNow() {
-		final LocalDate finishDate = LocalDate.now().minusDays(1);
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(LocalDate.now(), finishDate,
-				Arrays.asList(DayOfWeek.values()), stopDays, LocalDateTime.of(LocalDate.now(),
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class))).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.startExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
-		verifyZeroInteractions(securityService, exploratoryService, computationalService, computationalDAO);
-	}
-
-	@Test
-	public void testStartExploratoryBySchedulerWhenSchedulerStartDateAfterNow() {
-		final LocalDate finishDate = LocalDate.now();
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final LocalDate beginDate = LocalDate.now().plusDays(1);
-		final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(beginDate, finishDate, startDays, stopDays,
-				terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class))).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.startExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
-		verifyZeroInteractions(securityService, exploratoryService, computationalService, computationalDAO);
-	}
-
-	@Test
-	public void testStartExploratoryBySchedulerWhenStartDayIsNotCurrentDay() {
-		final List<DayOfWeek> stopDays = Arrays.stream((DayOfWeek.values())).collect(Collectors.toList());
-		final List<DayOfWeek> startDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
-		startDays.remove(LocalDate.now().getDayOfWeek());
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(
-				LocalDate.now(), LocalDate.now().minusDays(1), startDays, stopDays, LocalDateTime.of(LocalDate.now(),
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		when(schedulerJobDAO.getExploratorySchedulerDataWithStatus(any(UserInstanceStatus.class))).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.startExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithStatus(STOPPED);
-		verifyZeroInteractions(securityService, exploratoryService, computationalService, computationalDAO);
-	}
-
-
-	@Test
-	public void testTerminateComputationalByScheduler() {
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		final LocalDate finishDate = LocalDate.now().plusDays(1);
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(LocalDate.now(), finishDate, startDays, stopDays
-				, terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getServiceAccountInfo(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.terminateComputationalByScheduler();
-
-		verify(securityService).getServiceAccountInfo(USER);
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
-		verify(computationalService).terminateComputational(refEq(getUserInfo()), eq(PROJECT),
-				eq(EXPLORATORY_NAME), eq(COMPUTATIONAL_NAME));
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-	@Test
-	public void testTerminateComputationalBySchedulerWhenSchedulerIsNotConfigured() {
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(Collections.emptyList());
-
-		schedulerJobService.terminateComputationalByScheduler();
-
-		verify(schedulerJobDAO).getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
-		verifyNoMoreInteractions(schedulerJobDAO);
-		verifyZeroInteractions(securityService, computationalService);
-	}
-
-	@Test
-	public void testTerminateComputationalBySchedulerWhenSchedulerFinishDateBeforeNow() {
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(
-				LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()),
-				Arrays.asList(DayOfWeek.values()), LocalDateTime.of(LocalDate.now(),
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.terminateComputationalByScheduler();
-
-		verify(schedulerJobDAO).getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-	@Test
-	public void testTerminateComputationalBySchedulerWhenSchedulerStartDateAfterNow() {
-		final LocalDate beginDate = LocalDate.now().plusDays(1);
-		final LocalDate finishDate = LocalDate.now();
-		final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(beginDate, finishDate, startDays, stopDays,
-				terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.terminateComputationalByScheduler();
-
-		verify(schedulerJobDAO).getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-	@Test
-	public void testTerminateComputationalBySchedulerWhenTerminateDateNotCurrent() {
-		final List<DayOfWeek> stopDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
-		stopDays.remove(LocalDate.now().getDayOfWeek());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES)).plusDays(1);
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(
-				LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()), stopDays,
-				terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.terminateComputationalByScheduler();
-
-		verify(schedulerJobDAO)
-				.getComputationalSchedulerDataWithOneOfStatus(RUNNING, STOPPED, RUNNING);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService);
-	}
-
-	@Test
-	public void testTerminateExploratoryByScheduler() {
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		final LocalDate finishDate = LocalDate.now().plusDays(1);
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(LocalDate.now(), finishDate, startDays, stopDays
-				, terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getExploratorySchedulerDataWithOneOfStatus(anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.terminateExploratoryByScheduler();
-
-		verify(securityService).getUserInfoOffline(USER);
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED);
-		verify(exploratoryService).terminate(refEq(getUserInfo()), eq(PROJECT), eq(EXPLORATORY_NAME));
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService, exploratoryService);
-	}
-
-	@Test
-	public void testTerminateExploratoryBySchedulerWhenSchedulerIsNotConfigured() {
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(Collections.emptyList());
-
-		schedulerJobService.terminateExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED);
-		verifyNoMoreInteractions(schedulerJobDAO);
-		verifyZeroInteractions(securityService, exploratoryService, computationalService);
-	}
-
-	@Test
-	public void testTerminateExploratoryBySchedulerWhenSchedulerFinishDateBeforeNow() {
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(
-				LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()),
-				Arrays.asList(DayOfWeek.values()), LocalDateTime.of(LocalDate.now(),
-						LocalTime.now().truncatedTo(ChronoUnit.MINUTES)), false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getExploratorySchedulerDataWithOneOfStatus(anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.terminateExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService, computationalService);
-	}
-
-	@Test
-	public void testTerminateExploratoryBySchedulerWhenSchedulerStartDateAfterNow() {
-		final LocalDate beginDate = LocalDate.now().plusDays(1);
-		final LocalDate finishDate = LocalDate.now();
-		final List<DayOfWeek> startDays = Arrays.asList(DayOfWeek.values());
-		final List<DayOfWeek> stopDays = Arrays.asList(DayOfWeek.values());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(
-				beginDate, finishDate, startDays, stopDays, terminateDateTime, false, USER,
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		when(schedulerJobDAO.getExploratorySchedulerDataWithOneOfStatus(anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.terminateExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, exploratoryService, computationalService);
-	}
-
-	@Test
-	public void testTerminateExploratoryBySchedulerWhenTerminateDateNotCurrent() {
-		final List<DayOfWeek> stopDays = Arrays.stream(DayOfWeek.values()).collect(Collectors.toList());
-		stopDays.remove(LocalDate.now().getDayOfWeek());
-		final LocalDateTime terminateDateTime = LocalDateTime.of(LocalDate.now(),
-				LocalTime.now().truncatedTo(ChronoUnit.MINUTES)).plusDays(1);
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(
-				LocalDate.now(), LocalDate.now().minusDays(1), Arrays.asList(DayOfWeek.values()), stopDays,
-				terminateDateTime, false, USER, LocalTime.now().truncatedTo(ChronoUnit.MINUTES)
-		);
-		when(schedulerJobDAO.getExploratorySchedulerDataWithOneOfStatus(anyVararg())).thenReturn(singletonList(schedulerJobData));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-
-		schedulerJobService.terminateExploratoryByScheduler();
-
-		verify(schedulerJobDAO).getExploratorySchedulerDataWithOneOfStatus(RUNNING, STOPPED);
-		verifyNoMoreInteractions(securityService, schedulerJobDAO, computationalService, exploratoryService);
-	}
-
-	@Test
-	public void testGetActiveSchedulers() {
-		final int minutesOffset = 123;
-		final LocalDate now = LocalDate.now();
-		final DayOfWeek[] weekDays = DayOfWeek.values();
-		final LocalTime currentTime = LocalTime.now();
-		final LocalTime offsetTime = LocalTime.now().plusMinutes(minutesOffset);
-		final SchedulerJobData schedulerJobData = getSchedulerJobData(now,
-				now.plusDays(1), Arrays.asList(weekDays), Arrays.asList(weekDays),
-				LocalDateTime.of(now, currentTime.plusMinutes(minutesOffset).truncatedTo(ChronoUnit.MINUTES)), false,
-				USER, offsetTime.truncatedTo(ChronoUnit.MINUTES));
-
-		final SchedulerJobData secondScheduler = getSchedulerJobData(now,
-				now.plusDays(1), Arrays.asList(weekDays), Arrays.asList(weekDays),
-				LocalDateTime.of(now, currentTime.plusMinutes(minutesOffset).truncatedTo(ChronoUnit.MINUTES)),
-				false, "user123", offsetTime.truncatedTo(ChronoUnit.MINUTES));
-
-		when(schedulerJobDAO.getExploratorySchedulerWithStatusAndClusterLastActivityLessThan(any(UserInstanceStatus.class), any(Date.class))).thenReturn(Arrays.asList(schedulerJobData, secondScheduler));
-		when(securityService.getUserInfoOffline(anyString())).thenReturn(getUserInfo());
-		when(schedulerJobDAO.getComputationalSchedulerDataWithOneOfStatus(any(UserInstanceStatus.class),
-				any(DataEngineType.class), anyVararg())).thenReturn(singletonList(schedulerJobData));
-
-		final List<SchedulerJobData> activeSchedulers = schedulerJobService.getActiveSchedulers(USER, minutesOffset);
-
-		assertEquals(2, activeSchedulers.size());
-	}
-
-	private SchedulerJobData getSchedulerJobData(LocalDate beginDate, LocalDate schedulerFinishDate,
-												 List<DayOfWeek> startDays, List<DayOfWeek> stopDays,
-												 LocalDateTime terminateDateTime, boolean syncStartRequired,
-												 String user, LocalTime endTime) {
-		return new SchedulerJobData(user, EXPLORATORY_NAME, COMPUTATIONAL_NAME, PROJECT, getSchedulerJobDTO(beginDate,
-				schedulerFinishDate, startDays, stopDays, syncStartRequired, terminateDateTime, endTime));
-	}
-
-	private UserInfo getUserInfo() {
-		return new UserInfo(USER, "token");
-	}
-
-	private SchedulerJobDTO getSchedulerJobDTO(LocalDate beginDate, LocalDate finishDate, List<DayOfWeek> startDays,
-											   List<DayOfWeek> stopDays, boolean syncStartRequired,
-											   LocalDateTime terminateDateTime, LocalTime endTime) {
-		SchedulerJobDTO schedulerJobDTO = new SchedulerJobDTO();
-		schedulerJobDTO.setTimeZoneOffset(OffsetDateTime.now(ZoneId.systemDefault()).getOffset());
-		schedulerJobDTO.setBeginDate(beginDate);
-		schedulerJobDTO.setFinishDate(finishDate);
-		schedulerJobDTO.setStartTime(LocalTime.now().truncatedTo(ChronoUnit.MINUTES));
-		schedulerJobDTO.setEndTime(endTime);
-		schedulerJobDTO.setTerminateDateTime(terminateDateTime);
-		schedulerJobDTO.setStartDaysRepeat(startDays);
-		schedulerJobDTO.setStopDaysRepeat(stopDays);
-		schedulerJobDTO.setSyncStartRequired(syncStartRequired);
-		return schedulerJobDTO;
-	}
-
-	private UserInstanceDTO getUserInstanceDTO() {
-		UserComputationalResource computationalResource = new UserComputationalResource();
-		computationalResource.setStatus("running");
-		return new UserInstanceDTO()
-				.withUser(USER)
-				.withExploratoryName(EXPLORATORY_NAME)
-				.withResources(singletonList(computationalResource))
-				.withProject(PROJECT);
-	}
-
-	private AwsComputationalResource getComputationalResource(DataEngineType dataEngineType,
-															  boolean syncStartRequired) {
-		final SchedulerJobDTO schedulerJobData = new SchedulerJobDTO();
-		schedulerJobData.setSyncStartRequired(syncStartRequired);
-		return AwsComputationalResource.builder()
-				.computationalName("compName")
-				.imageName(DataEngineType.getDockerImageName(dataEngineType))
-				.schedulerJobData(schedulerJobData)
-				.build();
-	}
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/SystemInfoServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/SystemInfoServiceImplTest.java
deleted file mode 100644
index ca3835c..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/SystemInfoServiceImplTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.backendapi.resources.dto.SystemInfoDto;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-import oshi.SystemInfo;
-import oshi.hardware.CentralProcessor;
-import oshi.hardware.GlobalMemory;
-import oshi.hardware.HWDiskStore;
-import oshi.hardware.HardwareAbstractionLayer;
-import oshi.software.os.FileSystem;
-import oshi.software.os.OSFileStore;
-import oshi.software.os.OperatingSystem;
-import oshi.software.os.OperatingSystemVersion;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class SystemInfoServiceImplTest {
-
-	private static final String OS_VERSION = "OS version";
-	private static final String OS_FAMILY = "OS FAMILY";
-	private static final String BUILD_NUMBER = "BUILD 1.0";
-	private static final String PROCESSOR_MODEL = "Proc model";
-	private static final long AVAILABLE_MEMORY = 100L;
-	private static final long USABLE_SPACE = 100L;
-	private static final long TOTAL_SPACE = 1000L;
-	@Mock
-	private SystemInfo si;
-
-	@InjectMocks
-	private SystemInfoServiceImpl systemInfoService;
-
-	@Test
-	public void getSystemInfo() {
-		final OperatingSystem os = mock(OperatingSystem.class);
-		final HardwareAbstractionLayer hardwareAbstractionLayer = mock(HardwareAbstractionLayer.class);
-		final OperatingSystemVersion operatingSystemVersion = mock(OperatingSystemVersion.class);
-		final CentralProcessor centralProcessor = mock(CentralProcessor.class);
-		final GlobalMemory globalMemory = mock(GlobalMemory.class);
-		final FileSystem fileSystem = mock(FileSystem.class);
-		final OSFileStore osFileStore = new OSFileStore();
-		osFileStore.setUsableSpace(USABLE_SPACE);
-		osFileStore.setTotalSpace(TOTAL_SPACE);
-		when(fileSystem.getFileStores()).thenReturn(new OSFileStore[]{osFileStore});
-
-		when(operatingSystemVersion.getVersion()).thenReturn(OS_VERSION);
-		when(operatingSystemVersion.getBuildNumber()).thenReturn(BUILD_NUMBER);
-		when(hardwareAbstractionLayer.getDiskStores()).thenReturn(new HWDiskStore[]{});
-		when(os.getFamily()).thenReturn(OS_FAMILY);
-		when(os.getVersion()).thenReturn(operatingSystemVersion);
-		when(si.getOperatingSystem()).thenReturn(os);
-		when(os.getFileSystem()).thenReturn(fileSystem);
-		when(globalMemory.getAvailable()).thenReturn(AVAILABLE_MEMORY);
-		when(hardwareAbstractionLayer.getMemory()).thenReturn(globalMemory);
-		when(centralProcessor.getModel()).thenReturn(PROCESSOR_MODEL);
-		when(hardwareAbstractionLayer.getProcessor()).thenReturn(centralProcessor);
-		when(si.getHardware()).thenReturn(hardwareAbstractionLayer);
-
-		SystemInfoDto systemInfo = systemInfoService.getSystemInfo();
-
-		assertEquals(BUILD_NUMBER, systemInfo.getOsInfo().getBuildNumber());
-		assertEquals(OS_VERSION, systemInfo.getOsInfo().getVersion());
-		assertEquals(OS_FAMILY, systemInfo.getOsInfo().getFamily());
-		assertEquals(PROCESSOR_MODEL, systemInfo.getProcessorInfo().getModel());
-		assertEquals(AVAILABLE_MEMORY, systemInfo.getMemoryInfo().getAvailableMemory());
-		assertEquals(1, systemInfo.getDisksInfo().size());
-
-		verify(si).getOperatingSystem();
-		verify(si).getHardware();
-		verifyNoMoreInteractions(si, fileSystem);
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImplTest.java
deleted file mode 100644
index 4fec7c6..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/UserGroupServiceImplTest.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.service.impl;
-
-import com.epam.dlab.backendapi.dao.ProjectDAO;
-import com.epam.dlab.backendapi.dao.UserGroupDao;
-import com.epam.dlab.backendapi.dao.UserRoleDao;
-import com.epam.dlab.backendapi.domain.ProjectDTO;
-import com.epam.dlab.backendapi.resources.TestBase;
-import com.epam.dlab.backendapi.resources.dto.UserGroupDto;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.exceptions.DlabException;
-import com.epam.dlab.exceptions.ResourceNotFoundException;
-import io.dropwizard.auth.AuthenticationException;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.anySet;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class UserGroupServiceImplTest extends TestBase {
-
-    private static final String ROLE_ID = "Role id";
-    private static final String USER = "test";
-    private static final String GROUP = "admin";
-    @Mock
-    private UserRoleDao userRoleDao;
-    @Mock
-    private UserGroupDao userGroupDao;
-    @Mock
-    private ProjectDAO projectDAO;
-    @InjectMocks
-    private UserGroupServiceImpl userGroupService;
-
-    @Rule
-    public ExpectedException expectedException = ExpectedException.none();
-
-    @Before
-    public void setup() throws AuthenticationException {
-        authSetup();
-    }
-
-    @Test
-    public void createGroup() {
-        when(userRoleDao.addGroupToRole(anySet(), anySet())).thenReturn(true);
-
-        userGroupService.createGroup(GROUP, Collections.singleton(ROLE_ID), Collections.singleton(USER));
-
-        verify(userRoleDao).addGroupToRole(Collections.singleton(GROUP), Collections.singleton(ROLE_ID));
-        verify(userGroupDao).addUsers(GROUP, Collections.singleton(USER));
-    }
-
-	@Test
-	public void createGroupWithNoUsers() {
-		when(userRoleDao.addGroupToRole(anySet(), anySet())).thenReturn(true);
-
-		userGroupService.createGroup(GROUP, Collections.singleton(ROLE_ID), Collections.emptySet());
-
-		verify(userRoleDao).addGroupToRole(Collections.singleton(GROUP), Collections.singleton(ROLE_ID));
-		verify(userGroupDao).addUsers(anyString(), anySet());
-	}
-
-	@Test
-	public void createGroupWhenRoleNotFound() {
-		when(userRoleDao.addGroupToRole(anySet(), anySet())).thenReturn(false);
-
-		expectedException.expect(ResourceNotFoundException.class);
-		userGroupService.createGroup(GROUP, Collections.singleton(ROLE_ID), Collections.singleton(USER));
-	}
-
-	@Test
-	public void removeGroup() {
-
-		when(userRoleDao.removeGroup(anyString())).thenReturn(true);
-		final ProjectDTO projectDTO = new ProjectDTO(
-				"name", Collections.emptySet(), "", "", null, Collections.emptyList(), true);
-		when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
-				UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList(projectDTO));
-		doNothing().when(userGroupDao).removeGroup(anyString());
-
-		userGroupService.removeGroup(GROUP);
-
-		verify(userRoleDao).removeGroup(GROUP);
-		verify(userGroupDao).removeGroup(GROUP);
-		verifyNoMoreInteractions(userGroupDao, userRoleDao);
-	}
-
-	@Test
-	public void removeGroupWhenItIsUsedInProject() {
-
-		when(userRoleDao.removeGroup(anyString())).thenReturn(true);
-		when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
-				UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList( new ProjectDTO(
-				"name", Collections.singleton(GROUP), "", "", null, Collections.emptyList(), true)));
-		doNothing().when(userGroupDao).removeGroup(anyString());
-
-		try {
-			userGroupService.removeGroup(GROUP);
-		} catch (Exception e){
-			assertEquals("Group can not be removed because it is used in some project", e.getMessage());
-		}
-
-		verify(userRoleDao, never()).removeGroup(GROUP);
-		verify(userGroupDao, never()).removeGroup(GROUP);
-		verifyNoMoreInteractions(userGroupDao, userRoleDao);
-	}
-
-	@Test
-	public void removeGroupWhenGroupNotExist() {
-
-		final ProjectDTO projectDTO = new ProjectDTO(
-				"name", Collections.emptySet(), "", "", null, Collections.emptyList(), true);
-		when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
-				UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList(projectDTO));
-		when(userRoleDao.removeGroup(anyString())).thenReturn(false);
-		doNothing().when(userGroupDao).removeGroup(anyString());
-
-		userGroupService.removeGroup(GROUP);
-
-		verify(userRoleDao).removeGroup(GROUP);
-		verify(userGroupDao).removeGroup(GROUP);
-		verifyNoMoreInteractions(userGroupDao, userRoleDao);
-	}
-
-	@Test
-	public void removeGroupWithException() {
-		final ProjectDTO projectDTO = new ProjectDTO(
-				"name", Collections.emptySet(), "", "", null, Collections.emptyList(), true);
-		when(projectDAO.getProjectsWithEndpointStatusNotIn(UserInstanceStatus.TERMINATED,
-				UserInstanceStatus.TERMINATING)).thenReturn(Collections.singletonList(projectDTO));
-		when(userRoleDao.removeGroup(anyString())).thenThrow(new DlabException("Exception"));
-
-		expectedException.expectMessage("Exception");
-		expectedException.expect(DlabException.class);
-
-		userGroupService.removeGroup(GROUP);
-	}
-
-    private UserGroupDto getUserGroup() {
-        return new UserGroupDto(GROUP, Collections.emptyList(), Collections.emptySet());
-    }
-
-    private List<ProjectDTO> getProjects() {
-        return Collections.singletonList(ProjectDTO.builder()
-                .groups(new HashSet<>(Collections.singletonList(GROUP)))
-                .build());
-    }
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/util/CSVFormatterTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/util/CSVFormatterTest.java
deleted file mode 100644
index cdbe93f..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/util/CSVFormatterTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.util;
-
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-public class CSVFormatterTest {
-
-	@Test
-	public void formatLine() {
-		List<String> values = Arrays.asList("aaa", "bbb", "ccc", "aa", "bb", "cc", "a", "b", "c");
-		String expected = "aaa,bbb,ccc,aa,bb,cc,a,b,c\n";
-		String actual = CSVFormatter.formatLine(values, ',');
-		assertEquals(expected, actual);
-	}
-
-	@Test
-	public void formatLineWithCustomQuote() {
-		List<String> values = Arrays.asList("aaa", "bbb", "ccc", "aa", "bb", "cc", "a", "b", "c");
-		String expected = "\"aaa\",\"bbb\",\"ccc\",\"aa\",\"bb\",\"cc\",\"a\",\"b\",\"c\"\n";
-		String actual = CSVFormatter.formatLine(values, ',', '"');
-		assertEquals(expected, actual);
-	}
-}
\ No newline at end of file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/util/DateRemoverUtilTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/util/DateRemoverUtilTest.java
deleted file mode 100644
index 5677e77..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/util/DateRemoverUtilTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package com.epam.dlab.backendapi.util;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class DateRemoverUtilTest {
-
-	@Test
-	public void removeDateFormErrorMessageWithErrorDateFormat() {
-		String errorMessage = "All dates with format '[Error-2018-04-12 15:30:35]:' are erroneous";
-		String expected = "All dates with format 'yyyy-MM-dd' are erroneous";
-		String actual = DateRemoverUtil.removeDateFormErrorMessage(errorMessage, "\\[Error-\\d{4}-\\d{2}-" +
-				"\\d{2} \\d{2}:\\d{2}:\\d{2}\\]:", "yyyy-MM-dd");
-		assertEquals(expected, actual);
-	}
-
-	@Test
-	public void removeDateFormErrorMessage1() {
-		String errorMessage = "All dates with format '[Error-2018-04-12 15:30:35]:' are erroneous";
-		String expected = "All dates with format '[Error]:' are erroneous";
-		String actual = DateRemoverUtil.removeDateFormErrorMessage(errorMessage);
-		assertEquals(expected, actual);
-	}
-}
\ No newline at end of file
